[ Index ]

PHP Cross Reference of WordPress Trunk (Updated Daily)

Search

title

Body

[close]

/wp-includes/js/dist/script-modules/latex-to-mathml/ -> index.js.map (source)

   1  {
   2    "version": 3,
   3    "sources": ["../../../node_modules/temml/dist/temml.mjs", "../../../packages/latex-to-mathml/src/index.ts"],
   4    "sourcesContent": ["/**\n * This is the ParseError class, which is the main error thrown by Temml\n * functions when something has gone wrong. This is used to distinguish internal\n * errors from errors in the expression that the user provided.\n *\n * If possible, a caller should provide a Token or ParseNode with information\n * about where in the source string the problem occurred.\n */\nclass ParseError {\n  constructor(\n    message, // The error message\n    token // An object providing position information\n  ) {\n    let error = \" \" + message;\n    let start;\n\n    const loc = token && token.loc;\n    if (loc && loc.start <= loc.end) {\n      // If we have the input and a position, make the error a bit fancier\n\n      // Get the input\n      const input = loc.lexer.input;\n\n      // Prepend some information\n      start = loc.start;\n      const end = loc.end;\n      if (start === input.length) {\n        error += \" at end of input: \";\n      } else {\n        error += \" at position \" + (start + 1) + \": \";\n      }\n\n      // Underline token in question using combining underscores\n      const underlined = input.slice(start, end).replace(/[^]/g, \"$&\\u0332\");\n\n      // Extract some context from the input and add it to the error\n      let left;\n      if (start > 15) {\n        left = \"\u2026\" + input.slice(start - 15, start);\n      } else {\n        left = input.slice(0, start);\n      }\n      let right;\n      if (end + 15 < input.length) {\n        right = input.slice(end, end + 15) + \"\u2026\";\n      } else {\n        right = input.slice(end);\n      }\n      error += left + underlined + right;\n    }\n\n    // Some hackery to make ParseError a prototype of Error\n    // See http://stackoverflow.com/a/8460753\n    const self = new Error(error);\n    self.name = \"ParseError\";\n    self.__proto__ = ParseError.prototype;\n    self.position = start;\n    return self;\n  }\n}\n\nParseError.prototype.__proto__ = Error.prototype;\n\n//\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n\n/**\n * Provide a default value if a setting is undefined\n */\nconst deflt = function(setting, defaultIfUndefined) {\n  return setting === undefined ? defaultIfUndefined : setting;\n};\n\n// hyphenate and escape adapted from Facebook's React under Apache 2 license\n\nconst uppercase = /([A-Z])/g;\nconst hyphenate = function(str) {\n  return str.replace(uppercase, \"-$1\").toLowerCase();\n};\n\nconst ESCAPE_LOOKUP = {\n  \"&\": \"&amp;\",\n  \">\": \"&gt;\",\n  \"<\": \"&lt;\",\n  '\"': \"&quot;\",\n  \"'\": \"&#x27;\"\n};\n\nconst ESCAPE_REGEX = /[&><\"']/g;\n\n/**\n * Escapes text to prevent scripting attacks.\n */\nfunction escape(text) {\n  return String(text).replace(ESCAPE_REGEX, (match) => ESCAPE_LOOKUP[match]);\n}\n\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\nconst getBaseElem = function(group) {\n  if (group.type === \"ordgroup\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"color\") {\n    if (group.body.length === 1) {\n      return getBaseElem(group.body[0]);\n    } else {\n      return group;\n    }\n  } else if (group.type === \"font\") {\n    return getBaseElem(group.body);\n  } else {\n    return group;\n  }\n};\n\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\nconst isCharacterBox = function(group) {\n  const baseElem = getBaseElem(group);\n\n  // These are all the types of groups which hold single characters\n  return baseElem.type === \"mathord\" || baseElem.type === \"textord\" || baseElem.type === \"atom\"\n};\n\nconst assert = function(value) {\n  if (!value) {\n    throw new Error(\"Expected non-null, but got \" + String(value));\n  }\n  return value;\n};\n\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\nconst protocolFromUrl = function(url) {\n  // Check for possible leading protocol.\n  // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n  // (\\x00) or C0 control (\\x00-\\x1F) characters.\n  // eslint-disable-next-line no-control-regex\n  const protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|&#0*58|&#x0*3a|&colon)/i.exec(url);\n  if (!protocol) {\n    return \"_relative\";\n  }\n  // Reject weird colons\n  if (protocol[2] !== \":\") {\n    return null;\n  }\n  // Reject invalid characters in scheme according to\n  // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n  if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n    return null;\n  }\n  // Lowercase the protocol\n  return protocol[1].toLowerCase();\n};\n\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. The TeXbook\n * gives an acceptable rounding error of 100sp (which would be the nearest\n * 1/6551.6em with our ptPerEm = 10):\n * http://www.ctex.org/documents/shredder/src/texbook.pdf#page=69\n */\nconst round = function(n) {\n  return +n.toFixed(4);\n};\n\nvar utils = {\n  deflt,\n  escape,\n  hyphenate,\n  getBaseElem,\n  isCharacterBox,\n  protocolFromUrl,\n  round\n};\n\n/**\n * This is a module for storing settings passed into Temml. It correctly handles\n * default settings.\n */\n\n\n/**\n * The main Settings object\n */\nclass Settings {\n  constructor(options) {\n    // allow null options\n    options = options || {};\n    this.displayMode = utils.deflt(options.displayMode, false);    // boolean\n    this.annotate = utils.deflt(options.annotate, false);           // boolean\n    this.leqno = utils.deflt(options.leqno, false);                // boolean\n    this.throwOnError = utils.deflt(options.throwOnError, false);  // boolean\n    this.errorColor = utils.deflt(options.errorColor, \"#b22222\");  // string\n    this.macros = options.macros || {};\n    this.wrap = utils.deflt(options.wrap, \"tex\");                    // \"tex\" | \"=\"\n    this.xml = utils.deflt(options.xml, false);                     // boolean\n    this.colorIsTextColor = utils.deflt(options.colorIsTextColor, false);  // booelean\n    this.strict = utils.deflt(options.strict, false);    // boolean\n    this.trust = utils.deflt(options.trust, false);  // trust context. See html.js.\n    this.maxSize = (options.maxSize === undefined\n      ? [Infinity, Infinity]\n      : Array.isArray(options.maxSize)\n      ? options.maxSize\n      : [Infinity, Infinity]\n    );\n    this.maxExpand = Math.max(0, utils.deflt(options.maxExpand, 1000)); // number\n  }\n\n  /**\n   * Check whether to test potentially dangerous input, and return\n   * `true` (trusted) or `false` (untrusted).  The sole argument `context`\n   * should be an object with `command` field specifying the relevant LaTeX\n   * command (as a string starting with `\\`), and any other arguments, etc.\n   * If `context` has a `url` field, a `protocol` field will automatically\n   * get added by this function (changing the specified object).\n   */\n  isTrusted(context) {\n    if (context.url && !context.protocol) {\n      const protocol = utils.protocolFromUrl(context.url);\n      if (protocol == null) {\n        return false\n      }\n      context.protocol = protocol;\n    }\n    const trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n    return Boolean(trust);\n  }\n}\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nconst _functions = {};\n\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\nconst _mathmlGroupBuilders = {};\n\nfunction defineFunction({\n  type,\n  names,\n  props,\n  handler,\n  mathmlBuilder\n}) {\n  // Set default values of functions\n  const data = {\n    type,\n    numArgs: props.numArgs,\n    argTypes: props.argTypes,\n    allowedInArgument: !!props.allowedInArgument,\n    allowedInText: !!props.allowedInText,\n    allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n    numOptionalArgs: props.numOptionalArgs || 0,\n    infix: !!props.infix,\n    primitive: !!props.primitive,\n    handler: handler\n  };\n  for (let i = 0; i < names.length; ++i) {\n    _functions[names[i]] = data;\n  }\n  if (type) {\n    if (mathmlBuilder) {\n      _mathmlGroupBuilders[type] = mathmlBuilder;\n    }\n  }\n}\n\n/**\n * Use this to register only the MathML builder for a function(e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\nfunction defineFunctionBuilders({ type, mathmlBuilder }) {\n  defineFunction({\n    type,\n    names: [],\n    props: { numArgs: 0 },\n    handler() {\n      throw new Error(\"Should never be called.\")\n    },\n    mathmlBuilder\n  });\n}\n\nconst normalizeArgument = function(arg) {\n  return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg\n};\n\n// Since the corresponding buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\nconst ordargument = function(arg) {\n  return arg.type === \"ordgroup\" ? arg.body : [arg]\n};\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n  constructor(children) {\n    this.children = children;\n    this.classes = [];\n    this.style = {};\n  }\n\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n\n  /** Convert the fragment into a node. */\n  toNode() {\n    const frag = document.createDocumentFragment();\n\n    for (let i = 0; i < this.children.length; i++) {\n      frag.appendChild(this.children[i].toNode());\n    }\n\n    return frag;\n  }\n\n  /** Convert the fragment into HTML markup. */\n  toMarkup() {\n    let markup = \"\";\n\n    // Simply concatenate the markup for the children together.\n    for (let i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n\n    return markup;\n  }\n\n  /**\n   * Converts the math node into a string, similar to innerText. Applies to\n   * MathDomNode's only.\n   */\n  toText() {\n    // To avoid this, we would subclass documentFragment separately for\n    // MathML, but polyfills for subclassing is expensive per PR 1469.\n    const toText = (child) => child.toText();\n    return this.children.map(toText).join(\"\");\n  }\n}\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n */\n\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nconst createClass = function(classes) {\n  return classes.filter((cls) => cls).join(\" \");\n};\n\nconst initNode = function(classes, style) {\n  this.classes = classes || [];\n  this.attributes = {};\n  this.style = style || {};\n};\n\n/**\n * Convert into an HTML node\n */\nconst toNode = function(tagName) {\n  const node = document.createElement(tagName);\n\n  // Apply the class\n  node.className = createClass(this.classes);\n\n  // Apply inline styles\n  for (const style in this.style) {\n    if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n      node.style[style] = this.style[style];\n    }\n  }\n\n  // Apply attributes\n  for (const attr in this.attributes) {\n    if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n      node.setAttribute(attr, this.attributes[attr]);\n    }\n  }\n\n  // Append the children, also as HTML nodes\n  for (let i = 0; i < this.children.length; i++) {\n    node.appendChild(this.children[i].toNode());\n  }\n\n  return node;\n};\n\n/**\n * Convert into an HTML markup string\n */\nconst toMarkup = function(tagName) {\n  let markup = `<$tagName}`;\n\n  // Add the class\n  if (this.classes.length) {\n    markup += ` class=\"$utils.escape(createClass(this.classes))}\"`;\n  }\n\n  let styles = \"\";\n\n  // Add the styles, after hyphenation\n  for (const style in this.style) {\n    if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n      styles += `$utils.hyphenate(style)}:$this.style[style]};`;\n    }\n  }\n\n  if (styles) {\n    markup += ` style=\"$styles}\"`;\n  }\n\n  // Add the attributes\n  for (const attr in this.attributes) {\n    if (Object.prototype.hasOwnProperty.call(this.attributes, attr )) {\n      markup += ` $attr}=\"$utils.escape(this.attributes[attr])}\"`;\n    }\n  }\n\n  markup += \">\";\n\n  // Add the markup of the children, also as markup\n  for (let i = 0; i < this.children.length; i++) {\n    markup += this.children[i].toMarkup();\n  }\n\n  markup += `</$tagName}>`;\n\n  return markup;\n};\n\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style.\n *\n */\nclass Span {\n  constructor(classes, children, style) {\n    initNode.call(this, classes, style);\n    this.children = children || [];\n  }\n\n  setAttribute(attribute, value) {\n    this.attributes[attribute] = value;\n  }\n\n  toNode() {\n    return toNode.call(this, \"span\");\n  }\n\n  toMarkup() {\n    return toMarkup.call(this, \"span\");\n  }\n}\n\nlet TextNode$1 = class TextNode {\n  constructor(text) {\n    this.text = text;\n  }\n  toNode() {\n    return document.createTextNode(this.text);\n  }\n  toMarkup() {\n    return utils.escape(this.text);\n  }\n};\n\n// Create an <a href=\"\u2026\"> node.\nclass AnchorNode {\n  constructor(href, classes, children) {\n    this.href = href;\n    this.classes = classes;\n    this.children = children || [];\n  }\n\n  toNode() {\n    const node = document.createElement(\"a\");\n    node.setAttribute(\"href\", this.href);\n    if (this.classes.length > 0) {\n      node.className = createClass(this.classes);\n    }\n    for (let i = 0; i < this.children.length; i++) {\n      node.appendChild(this.children[i].toNode());\n    }\n    return node\n  }\n\n  toMarkup() {\n    let markup = `<a href='$utils.escape(this.href)}'`;\n    if (this.classes.length > 0) {\n      markup += ` class=\"$utils.escape(createClass(this.classes))}\"`;\n    }\n    markup += \">\";\n    for (let i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n    markup += \"</a>\";\n    return markup\n  }\n}\n\n/*\n * This node represents an image embed (<img>) element.\n */\nclass Img {\n  constructor(src, alt, style) {\n    this.alt = alt;\n    this.src = src;\n    this.classes = [\"mord\"];\n    this.style = style;\n  }\n\n  hasClass(className) {\n    return this.classes.includes(className);\n  }\n\n  toNode() {\n    const node = document.createElement(\"img\");\n    node.src = this.src;\n    node.alt = this.alt;\n    node.className = \"mord\";\n\n    // Apply inline styles\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        node.style[style] = this.style[style];\n      }\n    }\n\n    return node;\n  }\n\n  toMarkup() {\n    let markup = `<img src='$this.src}' alt='$this.alt}'`;\n\n    // Add the styles, after hyphenation\n    let styles = \"\";\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        styles += `$utils.hyphenate(style)}:$this.style[style]};`;\n      }\n    }\n    if (styles) {\n      markup += ` style=\"$utils.escape(styles)}\"`;\n    }\n\n    markup += \">\";\n    return markup;\n  }\n}\n\n//\n/**\n * These objects store data about MathML nodes.\n * The `toNode` and `toMarkup` functions  create namespaced DOM nodes and\n * HTML text markup respectively.\n */\n\n\nfunction newDocumentFragment(children) {\n  return new DocumentFragment(children);\n}\n\n/**\n * This node represents a general purpose MathML node of any type,\n * for example, `\"mo\"` or `\"mspace\"`, corresponding to `<mo>` and\n * `<mspace>` tags).\n */\nclass MathNode {\n  constructor(type, children, classes, style) {\n    this.type = type;\n    this.attributes = {};\n    this.children = children || [];\n    this.classes = classes || [];\n    this.style = style || {};   // Used for <mstyle> elements\n    this.label = \"\";\n  }\n\n  /**\n   * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n   * semantic content, so this is used heavily.\n   */\n  setAttribute(name, value) {\n    this.attributes[name] = value;\n  }\n\n  /**\n   * Gets an attribute on a MathML node.\n   */\n  getAttribute(name) {\n    return this.attributes[name];\n  }\n\n  setLabel(value) {\n    this.label = value;\n  }\n\n  /**\n   * Converts the math node into a MathML-namespaced DOM element.\n   */\n  toNode() {\n    const node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n\n    for (const attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        node.setAttribute(attr, this.attributes[attr]);\n      }\n    }\n\n    if (this.classes.length > 0) {\n      node.className = createClass(this.classes);\n    }\n\n    // Apply inline styles\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        node.style[style] = this.style[style];\n      }\n    }\n\n    for (let i = 0; i < this.children.length; i++) {\n      node.appendChild(this.children[i].toNode());\n    }\n\n    return node;\n  }\n\n  /**\n   * Converts the math node into an HTML markup string.\n   */\n  toMarkup() {\n    let markup = \"<\" + this.type;\n\n    // Add the attributes\n    for (const attr in this.attributes) {\n      if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n        markup += \" \" + attr + '=\"';\n        markup += utils.escape(this.attributes[attr]);\n        markup += '\"';\n      }\n    }\n\n    if (this.classes.length > 0) {\n      markup += ` class=\"$utils.escape(createClass(this.classes))}\"`;\n    }\n\n    let styles = \"\";\n\n    // Add the styles, after hyphenation\n    for (const style in this.style) {\n      if (Object.prototype.hasOwnProperty.call(this.style, style )) {\n        styles += `$utils.hyphenate(style)}:$this.style[style]};`;\n      }\n    }\n\n    if (styles) {\n      markup += ` style=\"$styles}\"`;\n    }\n\n    markup += \">\";\n\n    for (let i = 0; i < this.children.length; i++) {\n      markup += this.children[i].toMarkup();\n    }\n\n    markup += \"</\" + this.type + \">\";\n\n    return markup;\n  }\n\n  /**\n   * Converts the math node into a string, similar to innerText, but escaped.\n   */\n  toText() {\n    return this.children.map((child) => child.toText()).join(\"\");\n  }\n}\n\n/**\n * This node represents a piece of text.\n */\nclass TextNode {\n  constructor(text) {\n    this.text = text;\n  }\n\n  /**\n   * Converts the text node into a DOM text node.\n   */\n  toNode() {\n    return document.createTextNode(this.text);\n  }\n\n  /**\n   * Converts the text node into escaped HTML markup\n   * (representing the text itself).\n   */\n  toMarkup() {\n    return utils.escape(this.toText());\n  }\n\n  /**\n   * Converts the text node into a string\n   * (representing the text itself).\n   */\n  toText() {\n    return this.text;\n  }\n}\n\n// Do not make an <mrow> the only child of a <mstyle>.\n// An <mstyle> acts as its own implicit <mrow>.\nconst wrapWithMstyle = expression => {\n  let node;\n  if (expression.length === 1 && expression[0].type === \"mrow\") {\n    node = expression.pop();\n    node.type = \"mstyle\";\n  } else {\n    node = new MathNode(\"mstyle\", expression);\n  }\n  return node\n};\n\nvar mathMLTree = {\n  MathNode,\n  TextNode,\n  newDocumentFragment\n};\n\n/**\n * This file provides support for building horizontal stretchy elements.\n */\n\n\n// TODO: Remove when Chromium stretches \\widetilde & \\widehat\nconst estimatedWidth = node => {\n  let width = 0;\n  if (node.body) {\n    for (const item of node.body) {\n      width += estimatedWidth(item);\n    }\n  } else if (node.type === \"supsub\") {\n    width += estimatedWidth(node.base);\n    if (node.sub) { width += 0.7 * estimatedWidth(node.sub); }\n    if (node.sup) { width += 0.7 * estimatedWidth(node.sup); }\n  } else if (node.type === \"mathord\" || node.type === \"textord\") {\n    for (const ch of node.text.split('')) {\n      const codePoint = ch.codePointAt(0);\n      if ((0x60 < codePoint && codePoint < 0x7B) || (0x03B0 < codePoint && codePoint < 0x3CA)) {\n        width += 0.56; // lower case latin or greek. Use advance width of letter n\n      } else if (0x2F < codePoint && codePoint < 0x3A) {\n        width += 0.50; // numerals.\n      } else {\n        width += 0.92; // advance width of letter M\n      }\n    }\n  } else {\n    width += 1.0;\n  }\n  return width\n};\n\nconst stretchyCodePoint = {\n  widehat: \"^\",\n  widecheck: \"\u02C7\",\n  widetilde: \"~\",\n  wideparen: \"\u23DC\", // \\u23dc\n  utilde: \"~\",\n  overleftarrow: \"\\u2190\",\n  underleftarrow: \"\\u2190\",\n  xleftarrow: \"\\u2190\",\n  overrightarrow: \"\\u2192\",\n  underrightarrow: \"\\u2192\",\n  xrightarrow: \"\\u2192\",\n  underbrace: \"\\u23df\",\n  overbrace: \"\\u23de\",\n  overgroup: \"\\u23e0\",\n  overparen: \"\u23DC\",\n  undergroup: \"\\u23e1\",\n  underparen: \"\\u23dd\",\n  overleftrightarrow: \"\\u2194\",\n  underleftrightarrow: \"\\u2194\",\n  xleftrightarrow: \"\\u2194\",\n  Overrightarrow: \"\\u21d2\",\n  xRightarrow: \"\\u21d2\",\n  overleftharpoon: \"\\u21bc\",\n  xleftharpoonup: \"\\u21bc\",\n  overrightharpoon: \"\\u21c0\",\n  xrightharpoonup: \"\\u21c0\",\n  xLeftarrow: \"\\u21d0\",\n  xLeftrightarrow: \"\\u21d4\",\n  xhookleftarrow: \"\\u21a9\",\n  xhookrightarrow: \"\\u21aa\",\n  xmapsto: \"\\u21a6\",\n  xrightharpoondown: \"\\u21c1\",\n  xleftharpoondown: \"\\u21bd\",\n  xtwoheadleftarrow: \"\\u219e\",\n  xtwoheadrightarrow: \"\\u21a0\",\n  xlongequal: \"=\",\n  xrightleftarrows: \"\\u21c4\",\n  yields: \"\\u2192\",\n  yieldsLeft: \"\\u2190\",\n  mesomerism: \"\\u2194\",\n  longrightharpoonup: \"\\u21c0\",\n  longleftharpoondown: \"\\u21bd\",\n  eqrightharpoonup: \"\\u21c0\",\n  eqleftharpoondown: \"\\u21bd\",\n  \"\\\\cdrightarrow\": \"\\u2192\",\n  \"\\\\cdleftarrow\": \"\\u2190\",\n  \"\\\\cdlongequal\": \"=\"\n};\n\nconst mathMLnode = function(label) {\n  const child = new mathMLTree.TextNode(stretchyCodePoint[label.slice(1)]);\n  const node = new mathMLTree.MathNode(\"mo\", [child]);\n  node.setAttribute(\"stretchy\", \"true\");\n  return node\n};\n\nconst crookedWides = [\"\\\\widetilde\", \"\\\\widehat\", \"\\\\widecheck\", \"\\\\utilde\"];\n\n// TODO: Remove when Chromium stretches \\widetilde & \\widehat\nconst accentNode = (group) => {\n  const mo = mathMLnode(group.label);\n  if (crookedWides.includes(group.label)) {\n    const width = estimatedWidth(group.base);\n    if (1 < width && width < 1.6) {\n      mo.classes.push(\"tml-crooked-2\");\n    } else if (1.6 <= width && width < 2.5) {\n      mo.classes.push(\"tml-crooked-3\");\n    } else if (2.5 <= width) {\n      mo.classes.push(\"tml-crooked-4\");\n    }\n  }\n  return mo\n};\n\nvar stretchy = {\n  mathMLnode,\n  accentNode\n};\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are two properties they can have:\n * - group (required): the ParseNode group type the symbol should have (i.e.\n     \"textord\", \"mathord\", etc).\n * - replace: the character that this symbol or function should be\n *   replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n *   character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nconst ATOMS = {\n  bin: 1,\n  close: 1,\n  inner: 1,\n  open: 1,\n  punct: 1,\n  rel: 1\n};\nconst NON_ATOMS = {\n  \"accent-token\": 1,\n  mathord: 1,\n  \"op-token\": 1,\n  spacing: 1,\n  textord: 1\n};\n\nconst symbols = {\n  math: {},\n  text: {}\n};\n\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\nfunction defineSymbol(mode, group, replace, name, acceptUnicodeChar) {\n  symbols[mode][name] = { group, replace };\n\n  if (acceptUnicodeChar && replace) {\n    symbols[mode][replace] = symbols[mode][name];\n  }\n}\n\n// Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n\n// modes:\nconst math = \"math\";\nconst text = \"text\";\n\n// groups:\nconst accent = \"accent-token\";\nconst bin = \"bin\";\nconst close = \"close\";\nconst inner = \"inner\";\nconst mathord = \"mathord\";\nconst op = \"op-token\";\nconst open = \"open\";\nconst punct = \"punct\";\nconst rel = \"rel\";\nconst spacing = \"spacing\";\nconst textord = \"textord\";\n\n// Now comes the symbol table\n\n// Relation Symbols\ndefineSymbol(math, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, rel, \"\\u27c2\", \"\\\\perp\", true);\ndefineSymbol(math, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, rel, \"\\u224c\", \"\\\\backcong\", true);\ndefineSymbol(math, rel, \"|\", \"\\\\mid\", true);\ndefineSymbol(math, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, rel, \"\\u220c\", \"\\\\notni\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, rel, \"\\u220b\", \"\\\\owns\");\ndefineSymbol(math, rel, \"\\u2258\", \"\\\\arceq\", true);\ndefineSymbol(math, rel, \"\\u2259\", \"\\\\wedgeq\", true);\ndefineSymbol(math, rel, \"\\u225a\", \"\\\\veeeq\", true);\ndefineSymbol(math, rel, \"\\u225b\", \"\\\\stareq\", true);\ndefineSymbol(math, rel, \"\\u225d\", \"\\\\eqdef\", true);\ndefineSymbol(math, rel, \"\\u225e\", \"\\\\measeq\", true);\ndefineSymbol(math, rel, \"\\u225f\", \"\\\\questeq\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\ne\", true);\ndefineSymbol(math, rel, \"\\u2260\", \"\\\\neq\");\n// unicodemath\ndefineSymbol(math, rel, \"\\u2a75\", \"\\\\eqeq\", true);\ndefineSymbol(math, rel, \"\\u2a76\", \"\\\\eqeqeq\", true);\n// mathtools.sty\ndefineSymbol(math, rel, \"\\u2237\", \"\\\\dblcolon\", true);\ndefineSymbol(math, rel, \"\\u2254\", \"\\\\coloneqq\", true);\ndefineSymbol(math, rel, \"\\u2255\", \"\\\\eqqcolon\", true);\ndefineSymbol(math, rel, \"\\u2239\", \"\\\\eqcolon\", true);\ndefineSymbol(math, rel, \"\\u2A74\", \"\\\\Coloneqq\", true);\n\n// Punctuation\ndefineSymbol(math, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, punct, \"\\u00b7\", \"\\\\cdotp\");\n\n// Misc Symbols\ndefineSymbol(math, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, textord, \"\\u2203\", \"\\\\exists\", true);\n// \u2207 is actually a unary operator, not binary. But this works.\ndefineSymbol(math, bin, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, textord, \"\u212B\", \"\\\\Angstrom\", true);\ndefineSymbol(text, textord, \"\u212B\", \"\\\\Angstrom\", true);\ndefineSymbol(math, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, textord, \"\\u2667\", \"\\\\varclubsuit\", true);\ndefineSymbol(math, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, textord, \"\\u2666\", \"\\\\vardiamondsuit\", true);\ndefineSymbol(math, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, textord, \"\\u2665\", \"\\\\varheartsuit\", true);\ndefineSymbol(math, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, textord, \"\\u2664\", \"\\\\varspadesuit\", true);\ndefineSymbol(math, textord, \"\\u2640\", \"\\\\female\", true);\ndefineSymbol(math, textord, \"\\u2642\", \"\\\\male\", true);\ndefineSymbol(math, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, textord, \"\\u00b6\", \"\\\\P\");\ndefineSymbol(text, textord, \"\\u263a\", \"\\\\smiley\", true);\ndefineSymbol(math, textord, \"\\u263a\", \"\\\\smiley\", true);\n\n// Math and Text\ndefineSymbol(math, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, textord, \"\\u2021\", \"\\\\textdaggerdbl\");\n\n// Large Delimiters\ndefineSymbol(math, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, open, \"\\u27ee\", \"\\\\lgroup\", true);\n\n// Binary Operators\ndefineSymbol(math, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\ndefineSymbol(math, bin, \"\\u2AFD\", \"\\\\sslash\", true); // from stmaryrd\n\n// Arrow Symbols\ndefineSymbol(math, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a4\", \"\\\\mapsfrom\", true);\ndefineSymbol(math, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true);\ndefineSymbol(math, mathord, \"\\u21af\", \"\\\\lightning\", true);\ndefineSymbol(math, mathord, \"\\u220E\", \"\\\\QED\", true);\ndefineSymbol(math, mathord, \"\\u2030\", \"\\\\permil\", true);\ndefineSymbol(text, textord, \"\\u2030\", \"\\\\permil\");\ndefineSymbol(math, mathord, \"\\u2609\", \"\\\\astrosun\", true);\ndefineSymbol(math, mathord, \"\\u263c\", \"\\\\sun\", true);\ndefineSymbol(math, mathord, \"\\u263e\", \"\\\\leftmoon\", true);\ndefineSymbol(math, mathord, \"\\u263d\", \"\\\\rightmoon\", true);\ndefineSymbol(math, mathord, \"\\u2295\", \"\\\\Earth\");\n\n// AMS Negated Binary Relations\ndefineSymbol(math, rel, \"\\u226e\", \"\\\\nless\", true);\n// Symbol names preceeded by \"@\" each have a corresponding macro.\ndefineSymbol(math, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, rel, \"\\u2268\\ufe00\", \"\\\\lvertneqq\");\ndefineSymbol(math, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, rel, \"\\u2280\", \"\\\\nprec\", true);\n// unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, rel, \"\\u2224\", \"\\\\nshortmid\");\ndefineSymbol(math, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, rel, \"\\u2284\", \"\\\\nsubset\", true);\ndefineSymbol(math, rel, \"\\u2285\", \"\\\\nsupset\", true);\ndefineSymbol(math, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, rel, \"\\u228a\\ufe00\", \"\\\\varsubsetneq\");\ndefineSymbol(math, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acb\\ufe00\", \"\\\\varsubsetneqq\");\ndefineSymbol(math, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, rel, \"\\u2269\\ufe00\", \"\\\\gvertneqq\");\ndefineSymbol(math, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, rel, \"\\u2281\", \"\\\\nsucc\", true);\n// unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, rel, \"\\u2aba\", \"\\\\succnapprox\", true);\n// unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, rel, \"\\u2226\", \"\\\\nshortparallel\");\ndefineSymbol(math, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, rel, \"\\u228b\", \"\\\\varsupsetneq\");\ndefineSymbol(math, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, rel, \"\\u2acc\\ufe00\", \"\\\\varsupsetneqq\");\ndefineSymbol(math, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, bin, \"\\u22b5\", \"\\\\unrhd\");\n\n// AMS Negated Arrows\ndefineSymbol(math, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true);\n\n// AMS Misc\ndefineSymbol(math, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, textord, \"\\u00ae\", \"\\\\circledR\", true);\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, textord, \"\\u00ae\", \"\\\\textregistered\");\ndefineSymbol(math, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, textord, \"\\u2036\", \"\\\\backdprime\");\ndefineSymbol(math, textord, \"\\u2037\", \"\\\\backtrprime\");\ndefineSymbol(math, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, textord, \"\\u2201\", \"\\\\complement\", true);\n// unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\ndefineSymbol(math, textord, \"\\u00f0\", \"\\\\eth\", true);\ndefineSymbol(text, textord, \"\\u00f0\", \"\\u00f0\");\ndefineSymbol(math, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, textord, \"\\u25ca\", \"\\\\Diamond\");\n// unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\ndefineSymbol(math, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, textord, \"\\u2713\", \"\\\\checkmark\");\ndefineSymbol(math, textord, \"\\u2717\", \"\\\\ballotx\", true);\ndefineSymbol(text, textord, \"\\u2717\", \"\\\\ballotx\");\ndefineSymbol(text, textord, \"\\u2022\", \"\\\\textbullet\");\n\n// AMS Hebrew\ndefineSymbol(math, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, textord, \"\\u2137\", \"\\\\gimel\", true);\n\n// AMS Greek\ndefineSymbol(math, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, textord, \"\\u03f0\", \"\\\\varkappa\");\n\n// AMS Delimiters\ndefineSymbol(math, open, \"\\u231C\", \"\\\\ulcorner\", true);\ndefineSymbol(math, close, \"\\u231D\", \"\\\\urcorner\", true);\ndefineSymbol(math, open, \"\\u231E\", \"\\\\llcorner\", true);\ndefineSymbol(math, close, \"\\u231F\", \"\\\\lrcorner\", true);\n\n// AMS Binary Relations\ndefineSymbol(math, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, rel, \"\\u22ab\", \"\\\\VDash\", true);\ndefineSymbol(math, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, rel, \"\\u25c0\", \"\\\\blacktriangleleft\");\n// unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, rel, \"\\u25b6\", \"\\\\blacktriangleright\");\n// unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\ndefineSymbol(math, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, rel, \"\\u2251\", \"\\\\Doteq\", true);\ndefineSymbol(math, rel, \"\\u297d\", \"\\\\strictif\", true);\ndefineSymbol(math, rel, \"\\u297c\", \"\\\\strictfi\", true);\n\n// AMS Binary Operators\ndefineSymbol(math, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, bin, \"\\u29C4\", \"\\\\boxslash\", true);\ndefineSymbol(math, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, bin, \"\\u22a0\", \"\\\\boxtimes\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, bin, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, bin, \"\\u27d5\", \"\\\\leftouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d6\", \"\\\\rightouterjoin\", true);\ndefineSymbol(math, bin, \"\\u27d7\", \"\\\\fullouterjoin\", true);\n\n// stix Binary Operators\ndefineSymbol(math, bin, \"\\u2238\", \"\\\\dotminus\", true);\ndefineSymbol(math, bin, \"\\u27D1\", \"\\\\wedgedot\", true);\ndefineSymbol(math, bin, \"\\u27C7\", \"\\\\veedot\", true);\ndefineSymbol(math, bin, \"\\u2A62\", \"\\\\doublebarvee\", true);\ndefineSymbol(math, bin, \"\\u2A63\", \"\\\\veedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A5F\", \"\\\\wedgebar\", true);\ndefineSymbol(math, bin, \"\\u2A60\", \"\\\\wedgedoublebar\", true);\ndefineSymbol(math, bin, \"\\u2A54\", \"\\\\Vee\", true);\ndefineSymbol(math, bin, \"\\u2A53\", \"\\\\Wedge\", true);\ndefineSymbol(math, bin, \"\\u2A43\", \"\\\\barcap\", true);\ndefineSymbol(math, bin, \"\\u2A42\", \"\\\\barcup\", true);\ndefineSymbol(math, bin, \"\\u2A48\", \"\\\\capbarcup\", true);\ndefineSymbol(math, bin, \"\\u2A40\", \"\\\\capdot\", true);\ndefineSymbol(math, bin, \"\\u2A47\", \"\\\\capovercup\", true);\ndefineSymbol(math, bin, \"\\u2A46\", \"\\\\cupovercap\", true);\ndefineSymbol(math, bin, \"\\u2A4D\", \"\\\\closedvarcap\", true);\ndefineSymbol(math, bin, \"\\u2A4C\", \"\\\\closedvarcup\", true);\ndefineSymbol(math, bin, \"\\u2A2A\", \"\\\\minusdot\", true);\ndefineSymbol(math, bin, \"\\u2A2B\", \"\\\\minusfdots\", true);\ndefineSymbol(math, bin, \"\\u2A2C\", \"\\\\minusrdots\", true);\ndefineSymbol(math, bin, \"\\u22BB\", \"\\\\Xor\", true);\ndefineSymbol(math, bin, \"\\u22BC\", \"\\\\Nand\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\Nor\", true);\ndefineSymbol(math, bin, \"\\u22BD\", \"\\\\barvee\");\ndefineSymbol(math, bin, \"\\u2AF4\", \"\\\\interleave\", true);\ndefineSymbol(math, bin, \"\\u29E2\", \"\\\\shuffle\", true);\ndefineSymbol(math, bin, \"\\u2AF6\", \"\\\\threedotcolon\", true);\ndefineSymbol(math, bin, \"\\u2982\", \"\\\\typecolon\", true);\ndefineSymbol(math, bin, \"\\u223E\", \"\\\\invlazys\", true);\ndefineSymbol(math, bin, \"\\u2A4B\", \"\\\\twocaps\", true);\ndefineSymbol(math, bin, \"\\u2A4A\", \"\\\\twocups\", true);\ndefineSymbol(math, bin, \"\\u2A4E\", \"\\\\Sqcap\", true);\ndefineSymbol(math, bin, \"\\u2A4F\", \"\\\\Sqcup\", true);\ndefineSymbol(math, bin, \"\\u2A56\", \"\\\\veeonvee\", true);\ndefineSymbol(math, bin, \"\\u2A55\", \"\\\\wedgeonwedge\", true);\ndefineSymbol(math, bin, \"\\u29D7\", \"\\\\blackhourglass\", true);\ndefineSymbol(math, bin, \"\\u29C6\", \"\\\\boxast\", true);\ndefineSymbol(math, bin, \"\\u29C8\", \"\\\\boxbox\", true);\ndefineSymbol(math, bin, \"\\u29C7\", \"\\\\boxcircle\", true);\ndefineSymbol(math, bin, \"\\u229C\", \"\\\\circledequal\", true);\ndefineSymbol(math, bin, \"\\u29B7\", \"\\\\circledparallel\", true);\ndefineSymbol(math, bin, \"\\u29B6\", \"\\\\circledvert\", true);\ndefineSymbol(math, bin, \"\\u29B5\", \"\\\\circlehbar\", true);\ndefineSymbol(math, bin, \"\\u27E1\", \"\\\\concavediamond\", true);\ndefineSymbol(math, bin, \"\\u27E2\", \"\\\\concavediamondtickleft\", true);\ndefineSymbol(math, bin, \"\\u27E3\", \"\\\\concavediamondtickright\", true);\ndefineSymbol(math, bin, \"\\u22C4\", \"\\\\diamond\", true);\ndefineSymbol(math, bin, \"\\u29D6\", \"\\\\hourglass\", true);\ndefineSymbol(math, bin, \"\\u27E0\", \"\\\\lozengeminus\", true);\ndefineSymbol(math, bin, \"\\u233D\", \"\\\\obar\", true);\ndefineSymbol(math, bin, \"\\u29B8\", \"\\\\obslash\", true);\ndefineSymbol(math, bin, \"\\u2A38\", \"\\\\odiv\", true);\ndefineSymbol(math, bin, \"\\u29C1\", \"\\\\ogreaterthan\", true);\ndefineSymbol(math, bin, \"\\u29C0\", \"\\\\olessthan\", true);\ndefineSymbol(math, bin, \"\\u29B9\", \"\\\\operp\", true);\ndefineSymbol(math, bin, \"\\u2A37\", \"\\\\Otimes\", true);\ndefineSymbol(math, bin, \"\\u2A36\", \"\\\\otimeshat\", true);\ndefineSymbol(math, bin, \"\\u22C6\", \"\\\\star\", true);\ndefineSymbol(math, bin, \"\\u25B3\", \"\\\\triangle\", true);\ndefineSymbol(math, bin, \"\\u2A3A\", \"\\\\triangleminus\", true);\ndefineSymbol(math, bin, \"\\u2A39\", \"\\\\triangleplus\", true);\ndefineSymbol(math, bin, \"\\u2A3B\", \"\\\\triangletimes\", true);\ndefineSymbol(math, bin, \"\\u27E4\", \"\\\\whitesquaretickleft\", true);\ndefineSymbol(math, bin, \"\\u27E5\", \"\\\\whitesquaretickright\", true);\ndefineSymbol(math, bin, \"\\u2A33\", \"\\\\smashtimes\", true);\n\n// AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\ndefineSymbol(math, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true);\n// unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true);\n// unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, rel, \"\\u22b6\", \"\\\\origof\", true);\ndefineSymbol(math, rel, \"\\u22b7\", \"\\\\imageof\", true);\ndefineSymbol(math, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, rel, \"\\u21b7\", \"\\\\curvearrowright\", true);\n// unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\ndefineSymbol(math, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, rel, \"\\u21be\", \"\\\\restriction\");\n\ndefineSymbol(math, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, textord, \"\u00A2\", \"\\\\cent\");\ndefineSymbol(text, textord, \"\u00A2\", \"\\\\cent\");\ndefineSymbol(math, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(text, textord, \"\\u2423\", \"\\\\textvisiblespace\", true);\ndefineSymbol(math, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, textord, \"\\u2033\", \"\\\\dprime\");\ndefineSymbol(math, textord, \"\\u2034\", \"\\\\trprime\");\ndefineSymbol(math, textord, \"\\u2057\", \"\\\\qprime\");\ndefineSymbol(math, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(text, textord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(text, textord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(text, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(text, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(text, textord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(text, textord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(text, textord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(text, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(text, textord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(text, textord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(text, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(text, textord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(text, textord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(text, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(text, textord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(text, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(text, textord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(text, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(text, textord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(text, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(text, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(text, textord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(text, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(text, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, mathord, \"\\u0391\", \"\\\\Alpha\", true);\ndefineSymbol(math, mathord, \"\\u0392\", \"\\\\Beta\", true);\ndefineSymbol(math, mathord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, mathord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, mathord, \"\\u0395\", \"\\\\Epsilon\", true);\ndefineSymbol(math, mathord, \"\\u0396\", \"\\\\Zeta\", true);\ndefineSymbol(math, mathord, \"\\u0397\", \"\\\\Eta\", true);\ndefineSymbol(math, mathord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, mathord, \"\\u0399\", \"\\\\Iota\", true);\ndefineSymbol(math, mathord, \"\\u039a\", \"\\\\Kappa\", true);\ndefineSymbol(math, mathord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, mathord, \"\\u039c\", \"\\\\Mu\", true);\ndefineSymbol(math, mathord, \"\\u039d\", \"\\\\Nu\", true);\ndefineSymbol(math, mathord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, mathord, \"\\u039f\", \"\\\\Omicron\", true);\ndefineSymbol(math, mathord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, mathord, \"\\u03a1\", \"\\\\Rho\", true);\ndefineSymbol(math, mathord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, mathord, \"\\u03a4\", \"\\\\Tau\", true);\ndefineSymbol(math, mathord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, mathord, \"\\u03a7\", \"\\\\Chi\", true);\ndefineSymbol(math, mathord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, mathord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, open, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\varnothing\");\ndefineSymbol(math, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, mathord, \"\\u03d8\", \"\\\\Coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\coppa\", true);\ndefineSymbol(math, mathord, \"\\u03d9\", \"\\\\varcoppa\", true);\ndefineSymbol(math, mathord, \"\\u03de\", \"\\\\Koppa\", true);\ndefineSymbol(math, mathord, \"\\u03df\", \"\\\\koppa\", true);\ndefineSymbol(math, mathord, \"\\u03e0\", \"\\\\Sampi\", true);\ndefineSymbol(math, mathord, \"\\u03e1\", \"\\\\sampi\", true);\ndefineSymbol(math, mathord, \"\\u03da\", \"\\\\Stigma\", true);\ndefineSymbol(math, mathord, \"\\u03db\", \"\\\\stigma\", true);\ndefineSymbol(math, mathord, \"\\u2aeb\", \"\\\\Bot\");\ndefineSymbol(math, bin, \"\\u2217\", \"\\u2217\", true);\ndefineSymbol(math, bin, \"+\", \"+\");\ndefineSymbol(math, bin, \"\\u2217\", \"*\");\ndefineSymbol(math, bin, \"\\u2044\", \"/\", true);\ndefineSymbol(math, bin, \"\\u2044\", \"\\u2044\");\ndefineSymbol(math, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, open, \"\\u27e6\", \"\\\\llbracket\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u27e7\", \"\\\\rrbracket\", true);\ndefineSymbol(math, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, open, \"\\u27ea\", \"\\\\lAngle\", true);\ndefineSymbol(math, open, \"\\u2989\", \"\\\\llangle\", true);\ndefineSymbol(math, open, \"|\", \"\\\\lvert\");\ndefineSymbol(math, open, \"\\u2016\", \"\\\\lVert\", true);\ndefineSymbol(math, textord, \"!\", \"\\\\oc\"); // cmll package\ndefineSymbol(math, textord, \"?\", \"\\\\wn\");\ndefineSymbol(math, textord, \"\\u2193\", \"\\\\shpos\");\ndefineSymbol(math, textord, \"\\u2195\", \"\\\\shift\");\ndefineSymbol(math, textord, \"\\u2191\", \"\\\\shneg\");\ndefineSymbol(math, close, \"?\", \"?\");\ndefineSymbol(math, close, \"!\", \"!\");\ndefineSymbol(math, close, \"\u203C\", \"\u203C\");\ndefineSymbol(math, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, close, \"\\u27eb\", \"\\\\rAngle\", true);\ndefineSymbol(math, close, \"\\u298a\", \"\\\\rrangle\", true);\ndefineSymbol(math, close, \"|\", \"\\\\rvert\");\ndefineSymbol(math, close, \"\\u2016\", \"\\\\rVert\");\ndefineSymbol(math, open, \"\\u2983\", \"\\\\lBrace\", true); // stmaryrd/semantic packages\ndefineSymbol(math, close, \"\\u2984\", \"\\\\rBrace\", true);\ndefineSymbol(math, rel, \"=\", \"\\\\equal\", true);\ndefineSymbol(math, rel, \":\", \":\");\ndefineSymbol(math, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, rel, \"\\u2209\", \"\\\\notin\", true);\ndefineSymbol(math, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, rel, \"\\u2288\", \"\\\\nsubseteqq\");\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, rel, \"\\u2289\", \"\\\\nsupseteqq\");\ndefineSymbol(math, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqq\");\ndefineSymbol(math, rel, \"\\u2271\", \"\\\\ngeqslant\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqq\");\ndefineSymbol(math, rel, \"\\u2270\", \"\\\\nleqslant\");\ndefineSymbol(math, rel, \"\\u2aeb\", \"\\\\Perp\", true); //cmll package\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\space\");\n// Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\ndefineSymbol(math, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, punct, \",\", \",\");\ndefineSymbol(text, punct, \":\", \":\");\ndefineSymbol(math, punct, \";\", \";\");\ndefineSymbol(math, bin, \"\\u22bc\", \"\\\\barwedge\");\ndefineSymbol(math, bin, \"\\u22bb\", \"\\\\veebar\");\ndefineSymbol(math, bin, \"\\u2299\", \"\\\\odot\", true);\n// Firefox turns \u2295 into an emoji. So append \\uFE0E. Define Unicode character in macros, not here.\ndefineSymbol(math, bin, \"\\u2295\\uFE0E\", \"\\\\oplus\");\ndefineSymbol(math, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, open, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, close, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(math, open, \"\u2987\", \"\\\\llparenthesis\", true);\ndefineSymbol(math, close, \"\u2988\", \"\\\\rrparenthesis\", true);\ndefineSymbol(text, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\ndefineSymbol(text, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\ndefineSymbol(math, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, textord, \"|\", \"|\");\ndefineSymbol(math, textord, \"|\", \"\\\\vert\");\ndefineSymbol(text, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\|\");\ndefineSymbol(math, textord, \"\\u2016\", \"\\\\Vert\");\ndefineSymbol(text, textord, \"\\u2016\", \"\\\\textbardbl\");\ndefineSymbol(text, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, op, \"\\u2a04\", \"\\\\bigcupplus\");\ndefineSymbol(math, op, \"\\u2a03\", \"\\\\bigcupdot\");\ndefineSymbol(math, op, \"\\u2a07\", \"\\\\bigdoublevee\");\ndefineSymbol(math, op, \"\\u2a08\", \"\\\\bigdoublewedge\");\ndefineSymbol(math, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, op, \"\\u2a09\", \"\\\\bigtimes\");\ndefineSymbol(math, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, op, \"\\u2231\", \"\\\\intclockwise\");\ndefineSymbol(math, op, \"\\u2232\", \"\\\\varointclockwise\");\ndefineSymbol(math, op, \"\\u2a0c\", \"\\\\iiiint\");\ndefineSymbol(math, op, \"\\u2a0d\", \"\\\\intbar\");\ndefineSymbol(math, op, \"\\u2a0e\", \"\\\\intBar\");\ndefineSymbol(math, op, \"\\u2a0f\", \"\\\\fint\");\ndefineSymbol(math, op, \"\\u2a12\", \"\\\\rppolint\");\ndefineSymbol(math, op, \"\\u2a13\", \"\\\\scpolint\");\ndefineSymbol(math, op, \"\\u2a15\", \"\\\\pointint\");\ndefineSymbol(math, op, \"\\u2a16\", \"\\\\sqint\");\ndefineSymbol(math, op, \"\\u2a17\", \"\\\\intlarhk\");\ndefineSymbol(math, op, \"\\u2a18\", \"\\\\intx\");\ndefineSymbol(math, op, \"\\u2a19\", \"\\\\intcap\");\ndefineSymbol(math, op, \"\\u2a1a\", \"\\\\intcup\");\ndefineSymbol(math, op, \"\\u2a05\", \"\\\\bigsqcap\");\ndefineSymbol(math, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, inner, \"\\u22f0\", \"\\\\iddots\", true);\ndefineSymbol(math, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, inner, \"\\u22f1\", \"\\\\ddots\", true);\ndefineSymbol(math, textord, \"\\u22ee\", \"\\\\varvdots\"); // \\vdots is a macro\ndefineSymbol(text, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, accent, \"\\u02ca\", \"\\\\acute\");\ndefineSymbol(math, accent, \"\\u0060\", \"\\\\grave\");\ndefineSymbol(math, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, accent, \"\\u2026\", \"\\\\dddot\");\ndefineSymbol(math, accent, \"\\u2026\\u002e\", \"\\\\ddddot\");\ndefineSymbol(math, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, accent, \"\\u203e\", \"\\\\bar\");\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, accent, \"\\u005e\", \"\\\\hat\");\ndefineSymbol(math, accent, \"\\u2192\", \"\\\\vec\");\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\mathring\");\ndefineSymbol(math, mathord, \"\\u0131\", \"\\\\imath\", true);\ndefineSymbol(math, mathord, \"\\u0237\", \"\\\\jmath\", true);\ndefineSymbol(math, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, textord, \"\\u00df\", \"\\\\ss\", true);\ndefineSymbol(text, textord, \"\\u00e6\", \"\\\\ae\", true);\ndefineSymbol(text, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(text, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(math, mathord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, textord, \"\\u00c6\", \"\\\\AE\", true);\ndefineSymbol(text, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(text, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(math, mathord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(text, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(text, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(text, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(text, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(text, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(text, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(text, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(text, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(text, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(text, accent, \"\\u00a8\", '\\\\\"'); // diaresis\ndefineSymbol(text, accent, \"\\u02dd\", \"\\\\H\"); // double acute\ndefineSymbol(math, accent, \"\\u02ca\", \"\\\\'\"); // acute\ndefineSymbol(math, accent, \"\\u02cb\", \"\\\\`\"); // grave\ndefineSymbol(math, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\ndefineSymbol(math, accent, \"\\u02dc\", \"\\\\~\"); // tilde\ndefineSymbol(math, accent, \"\\u02c9\", \"\\\\=\"); // macron\ndefineSymbol(math, accent, \"\\u02d8\", \"\\\\u\"); // breve\ndefineSymbol(math, accent, \"\\u02d9\", \"\\\\.\"); // dot above\ndefineSymbol(math, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\ndefineSymbol(math, accent, \"\\u02da\", \"\\\\r\"); // ring above\ndefineSymbol(math, accent, \"\\u02c7\", \"\\\\v\"); // caron\ndefineSymbol(math, accent, \"\\u00a8\", '\\\\\"'); // diaresis\ndefineSymbol(math, accent, \"\\u02dd\", \"\\\\H\"); // double acute\n\n// These ligatures are detected and created in Parser.js's `formLigatures`.\nconst ligatures = {\n  \"--\": true,\n  \"---\": true,\n  \"``\": true,\n  \"''\": true\n};\n\ndefineSymbol(text, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, textord, \"\\u201d\", \"\\\\textquotedblright\");\n//  \\degree from gensymb package\ndefineSymbol(math, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\degree\");\n// \\textdegree from inputenc package\ndefineSymbol(text, textord, \"\\u00b0\", \"\\\\textdegree\", true);\n// TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(math, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\euro\", true);\ndefineSymbol(text, textord, \"\\u20ac\", \"\\\\texteuro\");\ndefineSymbol(math, textord, \"\\u00a9\", \"\\\\copyright\", true);\ndefineSymbol(text, textord, \"\\u00a9\", \"\\\\textcopyright\");\ndefineSymbol(math, textord, \"\\u2300\", \"\\\\diameter\", true);\ndefineSymbol(text, textord, \"\\u2300\", \"\\\\diameter\");\n\n// Italic Greek\ndefineSymbol(math, textord, \"\uD835\uDEE4\", \"\\\\varGamma\");\ndefineSymbol(math, textord, \"\uD835\uDEE5\", \"\\\\varDelta\");\ndefineSymbol(math, textord, \"\uD835\uDEE9\", \"\\\\varTheta\");\ndefineSymbol(math, textord, \"\uD835\uDEEC\", \"\\\\varLambda\");\ndefineSymbol(math, textord, \"\uD835\uDEEF\", \"\\\\varXi\");\ndefineSymbol(math, textord, \"\uD835\uDEF1\", \"\\\\varPi\");\ndefineSymbol(math, textord, \"\uD835\uDEF4\", \"\\\\varSigma\");\ndefineSymbol(math, textord, \"\uD835\uDEF6\", \"\\\\varUpsilon\");\ndefineSymbol(math, textord, \"\uD835\uDEF7\", \"\\\\varPhi\");\ndefineSymbol(math, textord, \"\uD835\uDEF9\", \"\\\\varPsi\");\ndefineSymbol(math, textord, \"\uD835\uDEFA\", \"\\\\varOmega\");\ndefineSymbol(text, textord, \"\uD835\uDEE4\", \"\\\\varGamma\");\ndefineSymbol(text, textord, \"\uD835\uDEE5\", \"\\\\varDelta\");\ndefineSymbol(text, textord, \"\uD835\uDEE9\", \"\\\\varTheta\");\ndefineSymbol(text, textord, \"\uD835\uDEEC\", \"\\\\varLambda\");\ndefineSymbol(text, textord, \"\uD835\uDEEF\", \"\\\\varXi\");\ndefineSymbol(text, textord, \"\uD835\uDEF1\", \"\\\\varPi\");\ndefineSymbol(text, textord, \"\uD835\uDEF4\", \"\\\\varSigma\");\ndefineSymbol(text, textord, \"\uD835\uDEF6\", \"\\\\varUpsilon\");\ndefineSymbol(text, textord, \"\uD835\uDEF7\", \"\\\\varPhi\");\ndefineSymbol(text, textord, \"\uD835\uDEF9\", \"\\\\varPsi\");\ndefineSymbol(text, textord, \"\uD835\uDEFA\", \"\\\\varOmega\");\n\n\n// There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\nconst mathTextSymbols = '0123456789/@.\"';\nfor (let i = 0; i < mathTextSymbols.length; i++) {\n  const ch = mathTextSymbols.charAt(i);\n  defineSymbol(math, textord, ch, ch);\n}\n\n// All of these are textords in text mode\nconst textSymbols = '0123456789!@*()-=+\";:?/.,';\nfor (let i = 0; i < textSymbols.length; i++) {\n  const ch = textSymbols.charAt(i);\n  defineSymbol(text, textord, ch, ch);\n}\n\n// All of these are textords in text mode, and mathords in math mode\nconst letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\nfor (let i = 0; i < letters.length; i++) {\n  const ch = letters.charAt(i);\n  defineSymbol(math, mathord, ch, ch);\n  defineSymbol(text, textord, ch, ch);\n}\n\n// Some more letters in Unicode Basic Multilingual Plane.\nconst narrow = \"\u00C7\u00D0\u00DE\u00E7\u00FE\u2102\u210D\u2115\u2119\u211A\u211D\u2124\u210E\u210F\u210A\u210B\u210C\u2110\u2111\u2112\u2113\u2118\u211B\u211C\u212C\u2130\u2131\u2133\u212D\u2128\";\nfor (let i = 0; i < narrow.length; i++) {\n  const ch = narrow.charAt(i);\n  defineSymbol(math, mathord, ch, ch);\n  defineSymbol(text, textord, ch, ch);\n}\n\n// The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\nlet wideChar = \"\";\nfor (let i = 0; i < letters.length; i++) {\n  // The hex numbers in the next line are a surrogate pair.\n  // 0xD835 is the high surrogate for all letters in the range we support.\n  // 0xDC00 is the low surrogate for bold A.\n  wideChar = String.fromCharCode(0xd835, 0xdc00 + i); // A-Z a-z bold\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdc34 + i); // A-Z a-z italic\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdc68 + i); // A-Z a-z bold italic\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdd04 + i); // A-Z a-z Fractur\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdda0 + i); // A-Z a-z sans-serif\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xddd4 + i); // A-Z a-z sans bold\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xde08 + i); // A-Z a-z sans italic\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xde70 + i); // A-Z a-z monospace\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdd38 + i); // A-Z a-z double struck\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  const ch = letters.charAt(i);\n  wideChar = String.fromCharCode(0xd835, 0xdc9c + i); // A-Z a-z calligraphic\n  defineSymbol(math, mathord, ch, wideChar);\n  defineSymbol(text, textord, ch, wideChar);\n}\n\n// Next, some wide character numerals\nfor (let i = 0; i < 10; i++) {\n  wideChar = String.fromCharCode(0xd835, 0xdfce + i); // 0-9 bold\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdfe2 + i); // 0-9 sans serif\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdfec + i); // 0-9 bold sans\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n\n  wideChar = String.fromCharCode(0xd835, 0xdff6 + i); // 0-9 monospace\n  defineSymbol(math, mathord, wideChar, wideChar);\n  defineSymbol(text, textord, wideChar, wideChar);\n}\n\n/*\n * Neither Firefox nor Chrome support hard line breaks or soft line breaks.\n * (Despite https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs)\n * So Temml has work-arounds for both hard and soft breaks.\n * The work-arounds sadly do not work simultaneously. Any top-level hard\n * break makes soft line breaks impossible.\n *\n * Hard breaks are simulated by creating a <mtable> and putting each line in its own <mtr>.\n *\n * To create soft line breaks, Temml avoids using the <semantics> and <annotation> tags.\n * Then the top level of a <math> element can be occupied by <mrow> elements, and the browser\n * will break after a <mrow> if the expression extends beyond the container limit.\n *\n * The default is for soft line breaks after each top-level binary or\n * relational operator, per TeXbook p. 173. So we gather the expression into <mrow>s so that\n * each <mrow> ends in a binary or relational operator.\n *\n * An option is for soft line breaks before an \"=\" sign. That changes the <mrow>s.\n *\n * Soft line breaks will not work in Chromium and Safari, only Firefox.\n *\n * Hopefully browsers will someday do their own linebreaking and we will be able to delete\n * much of this module.\n */\n\nconst openDelims = \"([{\u230A\u2308\u27E8\u27EE\u23B0\u27E6\u2983\";\nconst closeDelims = \")]}\u230B\u2309\u27E9\u27EF\u23B1\u27E6\u2984\";\n\nfunction setLineBreaks(expression, wrapMode, isDisplayMode) {\n  const mtrs = [];\n  let mrows = [];\n  let block = [];\n  let numTopLevelEquals = 0;\n  let i = 0;\n  let level = 0;\n  while (i < expression.length) {\n    while (expression[i] instanceof DocumentFragment) {\n      expression.splice(i, 1, ...expression[i].children); // Expand the fragment.\n    }\n    const node = expression[i];\n    if (node.attributes && node.attributes.linebreak &&\n      node.attributes.linebreak === \"newline\") {\n      // A hard line break. Create a <mtr> for the current block.\n      if (block.length > 0) {\n        mrows.push(new mathMLTree.MathNode(\"mrow\", block));\n      }\n      mrows.push(node);\n      block = [];\n      const mtd = new mathMLTree.MathNode(\"mtd\", mrows);\n      mtd.style.textAlign = \"left\";\n      mtrs.push(new mathMLTree.MathNode(\"mtr\", [mtd]));\n      mrows = [];\n      i += 1;\n      continue\n    }\n    block.push(node);\n    if (node.type && node.type === \"mo\" && node.children.length === 1 &&\n        !Object.hasOwn(node.attributes, \"movablelimits\")) {\n      const ch = node.children[0].text;\n      if (openDelims.indexOf(ch) > -1) {\n        level += 1;\n      } else if (closeDelims.indexOf(ch) > -1) {\n        level -= 1;\n      } else if (level === 0 && wrapMode === \"=\" && ch === \"=\") {\n        numTopLevelEquals += 1;\n        if (numTopLevelEquals > 1) {\n          block.pop();\n          // Start a new block. (Insert a soft linebreak.)\n          const element = new mathMLTree.MathNode(\"mrow\", block);\n          mrows.push(element);\n          block = [node];\n        }\n      } else if (level === 0 && wrapMode === \"tex\" && ch !== \"\u2207\") {\n        // Check if the following node is a \\nobreak text node, e.g. \"~\"\"\n        const next = i < expression.length - 1 ? expression[i + 1] : null;\n        let glueIsFreeOfNobreak = true;\n        if (\n          !(\n            next &&\n            next.type === \"mtext\" &&\n            next.attributes.linebreak &&\n            next.attributes.linebreak === \"nobreak\"\n          )\n        ) {\n          // We may need to start a new block.\n          // First, put any post-operator glue on same line as operator.\n          for (let j = i + 1; j < expression.length; j++) {\n            const nd = expression[j];\n            if (\n              nd.type &&\n              nd.type === \"mspace\" &&\n              !(nd.attributes.linebreak && nd.attributes.linebreak === \"newline\")\n            ) {\n              block.push(nd);\n              i += 1;\n              if (\n                nd.attributes &&\n                nd.attributes.linebreak &&\n                nd.attributes.linebreak === \"nobreak\"\n              ) {\n                glueIsFreeOfNobreak = false;\n              }\n            } else {\n              break;\n            }\n          }\n        }\n        if (glueIsFreeOfNobreak) {\n          // Start a new block. (Insert a soft linebreak.)\n          const element = new mathMLTree.MathNode(\"mrow\", block);\n          mrows.push(element);\n          block = [];\n        }\n      }\n    }\n    i += 1;\n  }\n  if (block.length > 0) {\n    const element = new mathMLTree.MathNode(\"mrow\", block);\n    mrows.push(element);\n  }\n  if (mtrs.length > 0) {\n    const mtd = new mathMLTree.MathNode(\"mtd\", mrows);\n    mtd.style.textAlign = \"left\";\n    const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n    mtrs.push(mtr);\n    const mtable = new mathMLTree.MathNode(\"mtable\", mtrs);\n    if (!isDisplayMode) {\n      mtable.setAttribute(\"columnalign\", \"left\");\n      mtable.setAttribute(\"rowspacing\", \"0em\");\n    }\n    return mtable\n  }\n  return mathMLTree.newDocumentFragment(mrows);\n}\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\n\n\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nconst makeText = function(text, mode, style) {\n  if (\n    symbols[mode][text] &&\n    symbols[mode][text].replace &&\n    text.charCodeAt(0) !== 0xd835 &&\n    !(\n      Object.prototype.hasOwnProperty.call(ligatures, text) &&\n      style &&\n      ((style.fontFamily && style.fontFamily.slice(4, 6) === \"tt\") ||\n        (style.font && style.font.slice(4, 6) === \"tt\"))\n    )\n  ) {\n    text = symbols[mode][text].replace;\n  }\n\n  return new mathMLTree.TextNode(text);\n};\n\nconst copyChar = (newRow, child) => {\n  if (newRow.children.length === 0 ||\n      newRow.children[newRow.children.length - 1].type !== \"mtext\") {\n    const mtext = new mathMLTree.MathNode(\n      \"mtext\",\n      [new mathMLTree.TextNode(child.children[0].text)]\n    );\n    newRow.children.push(mtext);\n  } else {\n    newRow.children[newRow.children.length - 1].children[0].text += child.children[0].text;\n  }\n};\n\nconst consolidateText = mrow => {\n  // If possible, consolidate adjacent <mtext> elements into a single element.\n  if (mrow.type !== \"mrow\" && mrow.type !== \"mstyle\") { return mrow }\n  if (mrow.children.length === 0) { return mrow } // empty group, e.g., \\text{}\n  const newRow = new mathMLTree.MathNode(\"mrow\");\n  for (let i = 0; i < mrow.children.length; i++) {\n    const child = mrow.children[i];\n    if (child.type === \"mtext\" && Object.keys(child.attributes).length === 0) {\n      copyChar(newRow, child);\n    } else if (child.type === \"mrow\") {\n      // We'll also check the children of an mrow. One level only. No recursion.\n      let canConsolidate = true;\n      for (let j = 0; j < child.children.length; j++) {\n        const grandChild = child.children[j];\n        if (grandChild.type !== \"mtext\" || Object.keys(child.attributes).length !== 0) {\n          canConsolidate = false;\n          break\n        }\n      }\n      if (canConsolidate) {\n        for (let j = 0; j < child.children.length; j++) {\n          const grandChild = child.children[j];\n          copyChar(newRow, grandChild);\n        }\n      } else {\n        newRow.children.push(child);\n      }\n    } else {\n      newRow.children.push(child);\n    }\n  }\n  for (let i = 0; i < newRow.children.length; i++) {\n    if (newRow.children[i].type === \"mtext\") {\n      const mtext = newRow.children[i];\n      // Firefox does not render a space at either end of an <mtext> string.\n      // To get proper rendering, we replace leading or trailing spaces with no-break spaces.\n      if (mtext.children[0].text.charAt(0) === \" \") {\n        mtext.children[0].text = \"\\u00a0\" + mtext.children[0].text.slice(1);\n      }\n      const L = mtext.children[0].text.length;\n      if (L > 0 && mtext.children[0].text.charAt(L - 1) === \" \") {\n        mtext.children[0].text = mtext.children[0].text.slice(0, -1) + \"\\u00a0\";\n      }\n      for (const [key, value] of Object.entries(mrow.attributes)) {\n        mtext.attributes[key] = value;\n      }\n    }\n  }\n  if (newRow.children.length === 1 && newRow.children[0].type === \"mtext\") {\n    return newRow.children[0]; // A consolidated <mtext>\n  } else {\n    return newRow\n  }\n};\n\n/**\n * Wrap the given array of nodes in an <mrow> node if needed, i.e.,\n * unless the array has length 1.  Always returns a single node.\n */\nconst makeRow = function(body, semisimple = false) {\n  if (body.length === 1 && !(body[0] instanceof DocumentFragment)) {\n    return body[0];\n  } else if (!semisimple) {\n    // Suppress spacing on <mo> nodes at both ends of the row.\n    if (body[0] instanceof MathNode && body[0].type === \"mo\" && !body[0].attributes.fence) {\n      body[0].attributes.lspace = \"0em\";\n      body[0].attributes.rspace = \"0em\";\n    }\n    const end = body.length - 1;\n    if (body[end] instanceof MathNode && body[end].type === \"mo\" && !body[end].attributes.fence) {\n      body[end].attributes.lspace = \"0em\";\n      body[end].attributes.rspace = \"0em\";\n    }\n  }\n  return new mathMLTree.MathNode(\"mrow\", body);\n};\n\n/**\n * Check for <mi>.</mi> which is how a dot renders in MathML,\n * or <mo separator=\"true\" lspace=\"0em\" rspace=\"0em\">,</mo>\n * which is how a braced comma {,} renders in MathML\n */\nfunction isNumberPunctuation(group) {\n  if (!group) {\n    return false\n  }\n  if (group.type === 'mi' && group.children.length === 1) {\n    const child = group.children[0];\n    return child instanceof TextNode && child.text === '.'\n  } else if (group.type === \"mtext\" && group.children.length === 1) {\n    const child = group.children[0];\n    return child instanceof TextNode && child.text === '\\u2008' // punctuation space\n  } else if (group.type === 'mo' && group.children.length === 1 &&\n    group.getAttribute('separator') === 'true' &&\n    group.getAttribute('lspace') === '0em' &&\n    group.getAttribute('rspace') === '0em') {\n    const child = group.children[0];\n    return child instanceof TextNode && child.text === ','\n  } else {\n    return false\n  }\n}\nconst isComma = (expression, i) => {\n  const node = expression[i];\n  const followingNode = expression[i + 1];\n  return (node.type === \"atom\" && node.text === \",\") &&\n    // Don't consolidate if there is a space after the comma.\n    node.loc && followingNode.loc && node.loc.end === followingNode.loc.start\n};\n\nconst isRel = item => {\n  return (item.type === \"atom\" && item.family === \"rel\") ||\n      (item.type === \"mclass\" && item.mclass === \"mrel\")\n};\n\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes.  Also do a couple chores along the way:\n * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}.\n * (2) Suppress spacing between two adjacent relations.\n */\nconst buildExpression = function(expression, style, semisimple = false) {\n  if (!semisimple && expression.length === 1) {\n    const group = buildGroup$1(expression[0], style);\n    if (group instanceof MathNode && group.type === \"mo\") {\n      // When TeX writers want to suppress spacing on an operator,\n      // they often put the operator by itself inside braces.\n      group.setAttribute(\"lspace\", \"0em\");\n      group.setAttribute(\"rspace\", \"0em\");\n    }\n    return [group];\n  }\n\n  const groups = [];\n  const groupArray = [];\n  let lastGroup;\n  for (let i = 0; i < expression.length; i++) {\n    groupArray.push(buildGroup$1(expression[i], style));\n  }\n\n  for (let i = 0; i < groupArray.length; i++) {\n    const group = groupArray[i];\n\n    // Suppress spacing between adjacent relations\n    if (i < expression.length - 1 && isRel(expression[i]) && isRel(expression[i + 1])) {\n      group.setAttribute(\"rspace\", \"0em\");\n    }\n    if (i > 0 && isRel(expression[i]) && isRel(expression[i - 1])) {\n      group.setAttribute(\"lspace\", \"0em\");\n    }\n\n    // Concatenate numbers\n    if (group.type === 'mn' && lastGroup && lastGroup.type === 'mn') {\n      // Concatenate <mn>...</mn> followed by <mi>.</mi>\n      lastGroup.children.push(...group.children);\n      continue\n    } else if (isNumberPunctuation(group) && lastGroup && lastGroup.type === 'mn') {\n      // Concatenate <mn>...</mn> followed by <mi>.</mi>\n      lastGroup.children.push(...group.children);\n      continue\n    } else if (lastGroup && lastGroup.type === \"mn\" && i < groupArray.length - 1 &&\n      groupArray[i + 1].type === \"mn\" && isComma(expression, i)) {\n      lastGroup.children.push(...group.children);\n      continue\n    } else if (group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n      // Concatenate <mi>.</mi> followed by <mn>...</mn>\n      group.children = [...lastGroup.children, ...group.children];\n      groups.pop();\n    } else if ((group.type === 'msup' || group.type === 'msub') &&\n        group.children.length >= 1 && lastGroup &&\n        (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n      // Put preceding <mn>...</mn> or <mi>.</mi> inside base of\n      // <msup><mn>...base...</mn>...exponent...</msup> (or <msub>)\n      const base = group.children[0];\n      if (base instanceof MathNode && base.type === 'mn' && lastGroup) {\n        base.children = [...lastGroup.children, ...base.children];\n        groups.pop();\n      }\n    }\n    groups.push(group);\n    lastGroup = group;\n  }\n  return groups\n};\n\n/**\n * Equivalent to buildExpression, but wraps the elements in an <mrow>\n * if there's more than one.  Returns a single node instead of an array.\n */\nconst buildExpressionRow = function(expression, style, semisimple = false) {\n  return makeRow(buildExpression(expression, style, semisimple), semisimple);\n};\n\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\nconst buildGroup$1 = function(group, style) {\n  if (!group) {\n    return new mathMLTree.MathNode(\"mrow\");\n  }\n\n  if (_mathmlGroupBuilders[group.type]) {\n    // Call the groupBuilders function\n    const result = _mathmlGroupBuilders[group.type](group, style);\n    return result;\n  } else {\n    throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n  }\n};\n\nconst glue$1 = _ => {\n  return new mathMLTree.MathNode(\"mtd\", [], [], { padding: \"0\", width: \"50%\" })\n};\n\nconst labelContainers = [\"mrow\", \"mtd\", \"mtable\", \"mtr\"];\nconst getLabel = parent => {\n  for (const node of parent.children) {\n    if (node.type && labelContainers.includes(node.type)) {\n      if (node.classes && node.classes[0] === \"tml-label\") {\n        const label = node.label;\n        return label\n      } else {\n        const label = getLabel(node);\n        if (label) { return label }\n      }\n    } else if (!node.type) {\n      const label = getLabel(node);\n      if (label) { return label }\n    }\n  }\n};\n\nconst taggedExpression = (expression, tag, style, leqno) => {\n  tag = buildExpressionRow(tag[0].body, style);\n  tag = consolidateText(tag);\n  tag.classes.push(\"tml-tag\");\n\n  const label = getLabel(expression); // from a \\label{} function.\n  expression = new mathMLTree.MathNode(\"mtd\", [expression]);\n  const rowArray = [glue$1(), expression, glue$1()];\n  rowArray[leqno ? 0 : 2].classes.push(leqno ? \"tml-left\" : \"tml-right\");\n  rowArray[leqno ? 0 : 2].children.push(tag);\n  const mtr = new mathMLTree.MathNode(\"mtr\", rowArray, [\"tml-tageqn\"]);\n  if (label) { mtr.setAttribute(\"id\", label); }\n  const table = new mathMLTree.MathNode(\"mtable\", [mtr]);\n  table.style.width = \"100%\";\n  table.setAttribute(\"displaystyle\", \"true\");\n  return table\n};\n\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it.\n */\nfunction buildMathML(tree, texExpression, style, settings) {\n  // Strip off outer tag wrapper for processing below.\n  let tag = null;\n  if (tree.length === 1 && tree[0].type === \"tag\") {\n    tag = tree[0].tag;\n    tree = tree[0].body;\n  }\n\n  const expression = buildExpression(tree, style);\n\n  if (expression.length === 1 && expression[0] instanceof AnchorNode) {\n    return expression[0]\n  }\n\n  const wrap = (settings.displayMode || settings.annotate) ? \"none\" : settings.wrap;\n\n  const n1 = expression.length === 0 ? null : expression[0];\n  let wrapper = expression.length === 1 && tag === null && (n1 instanceof MathNode)\n      ? expression[0]\n      : setLineBreaks(expression, wrap, settings.displayMode);\n\n  if (tag) {\n    wrapper = taggedExpression(wrapper, tag, style, settings.leqno);\n  }\n\n  if (settings.annotate) {\n    // Build a TeX annotation of the source\n    const annotation = new mathMLTree.MathNode(\n      \"annotation\", [new mathMLTree.TextNode(texExpression)]);\n    annotation.setAttribute(\"encoding\", \"application/x-tex\");\n    wrapper = new mathMLTree.MathNode(\"semantics\", [wrapper, annotation]);\n  }\n\n  const math = new mathMLTree.MathNode(\"math\", [wrapper]);\n\n  if (settings.xml) {\n    math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n  }\n  if (wrapper.style.width) {\n    math.style.width = \"100%\";\n  }\n  if (settings.displayMode) {\n    math.setAttribute(\"display\", \"block\");\n    math.style.display = \"block math\"; // necessary in Chromium.\n    // Firefox and Safari do not recognize display: \"block math\".\n    // Set a class so that the CSS file can set display: block.\n    math.classes = [\"tml-display\"];\n  }\n  return math;\n}\n\nconst smalls = \"aceg\u0131\u0237mnopqrsuvwxyz\u03B1\u03B3\u03B5\u03B7\u03B9\u03BA\u03BC\u03BD\u03BF\u03C0\u03C1\u03C2\u03C3\u03C4\u03C5\u03C7\u03C9\u03D5\uD835\uDC1A\uD835\uDC1C\uD835\uDC1E\uD835\uDC20\uD835\uDC26\uD835\uDC27\uD835\uDC28\uD835\uDC29\uD835\uDC2A\uD835\uDC2B\uD835\uDC2C\uD835\uDC2E\uD835\uDC2F\uD835\uDC30\uD835\uDC31\uD835\uDC32\uD835\uDC33\";\nconst talls = \"ABCDEFGHIJKLMNOPQRSTUVWXYZbdfhklt\u0391\u0392\u0393\u0394\u0395\u0396\u0397\u0398\u0399\u039A\u039B\u039C\u039D\u039E\u039F\u03A0\u03A1\u03A3\u03A4\u03A5\u03A6\u03A7\u03A8\u03A9\u03B2\u03B4\u03BB\u03B6\u03C6\u03B8\u03C8\"\n             + \"\uD835\uDC00\uD835\uDC01\uD835\uDC02\uD835\uDC03\uD835\uDC04\uD835\uDC05\uD835\uDC06\uD835\uDC07\uD835\uDC08\uD835\uDC09\uD835\uDC0A\uD835\uDC0B\uD835\uDC0C\uD835\uDC0D\uD835\uDC0E\uD835\uDC0F\uD835\uDC10\uD835\uDC11\uD835\uDC12\uD835\uDC13\uD835\uDC14\uD835\uDC15\uD835\uDC16\uD835\uDC17\uD835\uDC18\uD835\uDC19\uD835\uDC1B\uD835\uDC1D\uD835\uDC1F\uD835\uDC21\uD835\uDC24\uD835\uDC25\uD835\uDC2D\";\nconst longSmalls = new Set([\"\\\\alpha\", \"\\\\gamma\", \"\\\\delta\", \"\\\\epsilon\", \"\\\\eta\", \"\\\\iota\",\n  \"\\\\kappa\", \"\\\\mu\", \"\\\\nu\", \"\\\\pi\", \"\\\\rho\", \"\\\\sigma\", \"\\\\tau\", \"\\\\upsilon\", \"\\\\chi\", \"\\\\psi\",\n  \"\\\\omega\", \"\\\\imath\", \"\\\\jmath\"]);\nconst longTalls = new Set([\"\\\\Gamma\", \"\\\\Delta\", \"\\\\Sigma\", \"\\\\Omega\", \"\\\\beta\", \"\\\\delta\",\n  \"\\\\lambda\", \"\\\\theta\", \"\\\\psi\"]);\n\nconst mathmlBuilder$a = (group, style) => {\n  const accentNode = group.isStretchy\n    ? stretchy.accentNode(group)\n    : new mathMLTree.MathNode(\"mo\", [makeText(group.label, group.mode)]);\n\n  if (group.label === \"\\\\vec\") {\n    accentNode.style.transform = \"scale(0.75) translate(10%, 30%)\";\n  } else {\n    accentNode.style.mathStyle = \"normal\";\n    accentNode.style.mathDepth = \"0\";\n    if (needWebkitShift.has(group.label) &&  utils.isCharacterBox(group.base)) {\n      let shift = \"\";\n      const ch = group.base.text;\n      if (smalls.indexOf(ch) > -1 || longSmalls.has(ch)) { shift = \"tml-xshift\"; }\n      if (talls.indexOf(ch) > -1  || longTalls.has(ch))  { shift = \"tml-capshift\"; }\n      if (shift) { accentNode.classes.push(shift); }\n    }\n  }\n  if (!group.isStretchy) {\n    accentNode.setAttribute(\"stretchy\", \"false\");\n  }\n\n  const node = new mathMLTree.MathNode((group.label === \"\\\\c\" ? \"munder\" : \"mover\"),\n    [buildGroup$1(group.base, style), accentNode]\n  );\n\n  return node;\n};\n\nconst nonStretchyAccents = new Set([\n  \"\\\\acute\",\n  \"\\\\grave\",\n  \"\\\\ddot\",\n  \"\\\\dddot\",\n  \"\\\\ddddot\",\n  \"\\\\tilde\",\n  \"\\\\bar\",\n  \"\\\\breve\",\n  \"\\\\check\",\n  \"\\\\hat\",\n  \"\\\\vec\",\n  \"\\\\dot\",\n  \"\\\\mathring\"\n]);\n\nconst needWebkitShift = new Set([\n  \"\\\\acute\",\n  \"\\\\bar\",\n  \"\\\\breve\",\n  \"\\\\check\",\n  \"\\\\dot\",\n  \"\\\\ddot\",\n  \"\\\\grave\",\n  \"\\\\hat\",\n  \"\\\\mathring\",\n  \"\\\\'\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"\n]);\n\nconst combiningChar = {\n  \"\\\\`\": \"\\u0300\",\n  \"\\\\'\": \"\\u0301\",\n  \"\\\\^\": \"\\u0302\",\n  \"\\\\~\": \"\\u0303\",\n  \"\\\\=\": \"\\u0304\",\n  \"\\\\u\": \"\\u0306\",\n  \"\\\\.\": \"\\u0307\",\n  '\\\\\"': \"\\u0308\",\n  \"\\\\r\": \"\\u030A\",\n  \"\\\\H\": \"\\u030B\",\n  \"\\\\v\": \"\\u030C\"\n};\n\n// Accents\ndefineFunction({\n  type: \"accent\",\n  names: [\n    \"\\\\acute\",\n    \"\\\\grave\",\n    \"\\\\ddot\",\n    \"\\\\dddot\",\n    \"\\\\ddddot\",\n    \"\\\\tilde\",\n    \"\\\\bar\",\n    \"\\\\breve\",\n    \"\\\\check\",\n    \"\\\\hat\",\n    \"\\\\vec\",\n    \"\\\\dot\",\n    \"\\\\mathring\",\n    \"\\\\overparen\",\n    \"\\\\widecheck\",\n    \"\\\\widehat\",\n    \"\\\\wideparen\",\n    \"\\\\widetilde\",\n    \"\\\\overrightarrow\",\n    \"\\\\overleftarrow\",\n    \"\\\\Overrightarrow\",\n    \"\\\\overleftrightarrow\",\n    \"\\\\overgroup\",\n    \"\\\\overleftharpoon\",\n    \"\\\\overrightharpoon\"\n  ],\n  props: {\n    numArgs: 1\n  },\n  handler: (context, args) => {\n    const base = normalizeArgument(args[0]);\n\n    const isStretchy = !nonStretchyAccents.has(context.funcName);\n\n    return {\n      type: \"accent\",\n      mode: context.parser.mode,\n      label: context.funcName,\n      isStretchy: isStretchy,\n      base: base\n    };\n  },\n  mathmlBuilder: mathmlBuilder$a\n});\n\n// Text-mode accents\ndefineFunction({\n  type: \"accent\",\n  names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\c\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\r\", \"\\\\H\", \"\\\\v\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const base = normalizeArgument(args[0]);\n    const mode = context.parser.mode;\n\n    if (mode === \"math\" && context.parser.settings.strict) {\n      // LaTeX only writes a warning. It doesn't stop. We'll issue the same warning.\n      // eslint-disable-next-line no-console\n      console.log(`Temml parse error: Command $context.funcName} is invalid in math mode.`);\n    }\n\n    if (mode === \"text\" && base.text && base.text.length === 1\n        && context.funcName in combiningChar  && smalls.indexOf(base.text) > -1) {\n      // Return a combining accent character\n      return {\n        type: \"textord\",\n        mode: \"text\",\n        text: base.text + combiningChar[context.funcName]\n      }\n    } else {\n      // Build up the accent\n      return {\n        type: \"accent\",\n        mode: mode,\n        label: context.funcName,\n        isStretchy: false,\n        base: base\n      }\n    }\n  },\n  mathmlBuilder: mathmlBuilder$a\n});\n\ndefineFunction({\n  type: \"accentUnder\",\n  names: [\n    \"\\\\underleftarrow\",\n    \"\\\\underrightarrow\",\n    \"\\\\underleftrightarrow\",\n    \"\\\\undergroup\",\n    \"\\\\underparen\",\n    \"\\\\utilde\"\n  ],\n  props: {\n    numArgs: 1\n  },\n  handler: ({ parser, funcName }, args) => {\n    const base = args[0];\n    return {\n      type: \"accentUnder\",\n      mode: parser.mode,\n      label: funcName,\n      base: base\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const accentNode = stretchy.accentNode(group);\n    accentNode.style[\"math-depth\"] = 0;\n    const node = new mathMLTree.MathNode(\"munder\", [\n      buildGroup$1(group.base, style),\n      accentNode\n    ]);\n    return node;\n  }\n});\n\n/**\n * This file does conversion between units.  In particular, it provides\n * calculateSize to convert other units into CSS units.\n */\n\n\nconst ptPerUnit = {\n  // Convert to CSS (Postscipt) points, not TeX points\n  // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n  // https://tex.stackexchange.com/a/8263\n  pt: 800 / 803, // convert TeX point to CSS (Postscript) point\n  pc: (12 * 800) / 803, // pica\n  dd: ((1238 / 1157) * 800) / 803, // didot\n  cc: ((14856 / 1157) * 800) / 803, // cicero (12 didot)\n  nd: ((685 / 642) * 800) / 803, // new didot\n  nc: ((1370 / 107) * 800) / 803, // new cicero (12 new didot)\n  sp: ((1 / 65536) * 800) / 803, // scaled point (TeX's internal smallest unit)\n  mm: (25.4 / 72),\n  cm: (2.54 / 72),\n  in: (1 / 72),\n  px: (96 / 72)\n};\n\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nconst validUnits = [\n  \"em\",\n  \"ex\",\n  \"mu\",\n  \"pt\",\n  \"mm\",\n  \"cm\",\n  \"in\",\n  \"px\",\n  \"bp\",\n  \"pc\",\n  \"dd\",\n  \"cc\",\n  \"nd\",\n  \"nc\",\n  \"sp\"\n];\n\nconst validUnit = function(unit) {\n  if (typeof unit !== \"string\") {\n    unit = unit.unit;\n  }\n  return validUnits.indexOf(unit) > -1\n};\n\nconst emScale = styleLevel => {\n  const scriptLevel = Math.max(styleLevel - 1, 0);\n  return [1, 0.7, 0.5][scriptLevel]\n};\n\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS value.\n */\nconst calculateSize = function(sizeValue, style) {\n  let number = sizeValue.number;\n  if (style.maxSize[0] < 0 && number > 0) {\n    return { number: 0, unit: \"em\" }\n  }\n  const unit = sizeValue.unit;\n  switch (unit) {\n    case \"mm\":\n    case \"cm\":\n    case \"in\":\n    case \"px\": {\n      const numInCssPts = number * ptPerUnit[unit];\n      if (numInCssPts > style.maxSize[1]) {\n        return { number: style.maxSize[1], unit: \"pt\" }\n      }\n      return { number, unit }; // absolute CSS units.\n    }\n    case \"em\":\n    case \"ex\": {\n      // In TeX, em and ex do not change size in \\scriptstyle.\n      if (unit === \"ex\") { number *= 0.431; }\n      number = Math.min(number / emScale(style.level), style.maxSize[0]);\n      return { number: utils.round(number), unit: \"em\" };\n    }\n    case \"bp\": {\n      if (number > style.maxSize[1]) { number = style.maxSize[1]; }\n      return { number, unit: \"pt\" }; // TeX bp is a CSS pt. (1/72 inch).\n    }\n    case \"pt\":\n    case \"pc\":\n    case \"dd\":\n    case \"cc\":\n    case \"nd\":\n    case \"nc\":\n    case \"sp\": {\n      number = Math.min(number * ptPerUnit[unit], style.maxSize[1]);\n      return { number: utils.round(number), unit: \"pt\" }\n    }\n    case \"mu\": {\n      number = Math.min(number / 18, style.maxSize[0]);\n      return { number: utils.round(number), unit: \"em\" }\n    }\n    default:\n      throw new ParseError(\"Invalid unit: '\" + unit + \"'\")\n  }\n};\n\n// Helper functions\n\nconst padding$2 = width => {\n  const node = new mathMLTree.MathNode(\"mspace\");\n  node.setAttribute(\"width\", width + \"em\");\n  return node\n};\n\nconst paddedNode = (group, lspace = 0.3, rspace = 0, mustSmash = false) => {\n  if (group == null && rspace === 0) { return padding$2(lspace) }\n  const row = group ? [group] : [];\n  if (lspace !== 0)   { row.unshift(padding$2(lspace)); }\n  if (rspace > 0) { row.push(padding$2(rspace)); }\n  if (mustSmash) {\n    // Used for the bottom arrow in a {CD} environment\n    const mpadded = new mathMLTree.MathNode(\"mpadded\", row);\n    mpadded.setAttribute(\"height\", \"0\");\n    return mpadded\n  } else {\n    return new mathMLTree.MathNode(\"mrow\", row)\n  }\n};\n\nconst labelSize = (size, scriptLevel) =>  Number(size) / emScale(scriptLevel);\n\nconst munderoverNode = (fName, body, below, style) => {\n  const arrowNode = stretchy.mathMLnode(fName);\n  // Is this the short part of a mhchem equilibrium arrow?\n  const isEq = fName.slice(1, 3) === \"eq\";\n  const minWidth = fName.charAt(1) === \"x\"\n    ? \"1.75\"  // mathtools extensible arrows are \u2265 1.75em long\n    : fName.slice(2, 4) === \"cd\"\n    ? \"3.0\"  // cd package arrows\n    : isEq\n    ? \"1.0\"  // The shorter harpoon of a mhchem equilibrium arrow\n    : \"2.0\"; // other mhchem arrows\n  // TODO: When Firefox supports minsize, use the next line.\n  //arrowNode.setAttribute(\"minsize\", String(minWidth) + \"em\")\n  arrowNode.setAttribute(\"lspace\", \"0\");\n  arrowNode.setAttribute(\"rspace\", (isEq ? \"0.5em\" : \"0\"));\n\n  // <munderover> upper and lower labels are set to scriptlevel by MathML\n  // So we have to adjust our label dimensions accordingly.\n  const labelStyle = style.withLevel(style.level < 2 ? 2 : 3);\n  const minArrowWidth = labelSize(minWidth, labelStyle.level);\n  // The dummyNode will be inside a <mover> inside a <mover>\n  // So it will be at scriptlevel 3\n  const dummyWidth = labelSize(minWidth, 3);\n  const emptyLabel = paddedNode(null, minArrowWidth.toFixed(4), 0);\n  const dummyNode = paddedNode(null, dummyWidth.toFixed(4), 0);\n  // The arrow is a little longer than the label. Set a spacer length.\n  const space = labelSize((isEq ? 0 : 0.3), labelStyle.level).toFixed(4);\n  let upperNode;\n  let lowerNode;\n\n  const gotUpper = (body && body.body &&\n    // \\hphantom        visible content\n    (body.body.body || body.body.length > 0));\n  if (gotUpper) {\n    let label =  buildGroup$1(body, labelStyle);\n    const mustSmash = (fName === \"\\\\\\\\cdrightarrow\" || fName === \"\\\\\\\\cdleftarrow\");\n    label = paddedNode(label, space, space, mustSmash);\n    // Since Firefox does not support minsize, stack a invisible node\n    // on top of the label. Its width will serve as a min-width.\n    // TODO: Refactor this after Firefox supports minsize.\n    upperNode = new mathMLTree.MathNode(\"mover\", [label, dummyNode]);\n  }\n  const gotLower = (below && below.body &&\n    (below.body.body || below.body.length > 0));\n  if (gotLower) {\n    let label =  buildGroup$1(below, labelStyle);\n    label = paddedNode(label, space, space);\n    lowerNode = new mathMLTree.MathNode(\"munder\", [label, dummyNode]);\n  }\n\n  let node;\n  if (!gotUpper && !gotLower) {\n    node = new mathMLTree.MathNode(\"mover\", [arrowNode, emptyLabel]);\n  } else if (gotUpper && gotLower) {\n    node = new mathMLTree.MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n  } else if (gotUpper) {\n    node = new mathMLTree.MathNode(\"mover\", [arrowNode, upperNode]);\n  } else {\n    node = new mathMLTree.MathNode(\"munder\", [arrowNode, lowerNode]);\n  }\n  if (minWidth === \"3.0\") { node.style.height = \"1em\"; } // CD environment\n  node.setAttribute(\"accent\", \"false\"); // Necessary for MS Word\n  return node\n};\n\n// Stretchy arrows with an optional argument\ndefineFunction({\n  type: \"xArrow\",\n  names: [\n    \"\\\\xleftarrow\",\n    \"\\\\xrightarrow\",\n    \"\\\\xLeftarrow\",\n    \"\\\\xRightarrow\",\n    \"\\\\xleftrightarrow\",\n    \"\\\\xLeftrightarrow\",\n    \"\\\\xhookleftarrow\",\n    \"\\\\xhookrightarrow\",\n    \"\\\\xmapsto\",\n    \"\\\\xrightharpoondown\",\n    \"\\\\xrightharpoonup\",\n    \"\\\\xleftharpoondown\",\n    \"\\\\xleftharpoonup\",\n    \"\\\\xlongequal\",\n    \"\\\\xtwoheadrightarrow\",\n    \"\\\\xtwoheadleftarrow\",\n    // The next 5 functions are here only to support mhchem\n    \"\\\\yields\",\n    \"\\\\yieldsLeft\",\n    \"\\\\mesomerism\",\n    \"\\\\longrightharpoonup\",\n    \"\\\\longleftharpoondown\",\n    // The next 3 functions are here only to support the {CD} environment.\n    \"\\\\\\\\cdrightarrow\",\n    \"\\\\\\\\cdleftarrow\",\n    \"\\\\\\\\cdlongequal\"\n  ],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    return {\n      type: \"xArrow\",\n      mode: parser.mode,\n      name: funcName,\n      body: args[0],\n      below: optArgs[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Build the arrow and its labels.\n    const node = munderoverNode(group.name, group.body, group.below, style);\n    // Create operator spacing for a relation.\n    const row = [node];\n    row.unshift(padding$2(0.2778));\n    row.push(padding$2(0.2778));\n    return new mathMLTree.MathNode(\"mrow\", row)\n  }\n});\n\nconst arrowComponent = {\n  \"\\\\xtofrom\": [\"\\\\xrightarrow\", \"\\\\xleftarrow\"],\n  \"\\\\xleftrightharpoons\": [\"\\\\xleftharpoonup\", \"\\\\xrightharpoondown\"],\n  \"\\\\xrightleftharpoons\": [\"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\"],\n  \"\\\\yieldsLeftRight\": [\"\\\\yields\", \"\\\\yieldsLeft\"],\n  // The next three all get the same harpoon glyphs. Only the lengths and paddings differ.\n  \"\\\\equilibrium\": [\"\\\\longrightharpoonup\", \"\\\\longleftharpoondown\"],\n  \"\\\\equilibriumRight\": [\"\\\\longrightharpoonup\", \"\\\\eqleftharpoondown\"],\n  \"\\\\equilibriumLeft\": [\"\\\\eqrightharpoonup\", \"\\\\longleftharpoondown\"]\n};\n\n// Browsers are not good at stretching a glyph that contains a pair of stacked arrows such as \u21C4.\n// So we stack a pair of single arrows.\ndefineFunction({\n  type: \"stackedArrow\",\n  names: [\n    \"\\\\xtofrom\",              // expfeil\n    \"\\\\xleftrightharpoons\",   // mathtools\n    \"\\\\xrightleftharpoons\",   // mathtools\n    \"\\\\yieldsLeftRight\",      // mhchem\n    \"\\\\equilibrium\",          // mhchem\n    \"\\\\equilibriumRight\",\n    \"\\\\equilibriumLeft\"\n  ],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    const lowerArrowBody = args[0]\n      ? {\n        type: \"hphantom\",\n        mode: parser.mode,\n        body: args[0]\n      }\n      : null;\n    const upperArrowBelow = optArgs[0]\n      ? {\n        type: \"hphantom\",\n        mode: parser.mode,\n        body: optArgs[0]\n      }\n      : null;\n    return {\n      type: \"stackedArrow\",\n      mode: parser.mode,\n      name: funcName,\n      body: args[0],\n      upperArrowBelow,\n      lowerArrowBody,\n      below: optArgs[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    const topLabel = arrowComponent[group.name][0];\n    const botLabel = arrowComponent[group.name][1];\n    const topArrow = munderoverNode(topLabel, group.body, group.upperArrowBelow, style);\n    const botArrow = munderoverNode(botLabel, group.lowerArrowBody, group.below, style);\n    let wrapper;\n\n    const raiseNode = new mathMLTree.MathNode(\"mpadded\", [topArrow]);\n    raiseNode.setAttribute(\"voffset\", \"0.3em\");\n    raiseNode.setAttribute(\"height\", \"+0.3em\");\n    raiseNode.setAttribute(\"depth\", \"-0.3em\");\n    // One of the arrows is given ~zero width. so the other has the same horzontal alignment.\n    if (group.name === \"\\\\equilibriumLeft\") {\n      const botNode =  new mathMLTree.MathNode(\"mpadded\", [botArrow]);\n      botNode.setAttribute(\"width\", \"0.5em\");\n      wrapper = new mathMLTree.MathNode(\n        \"mpadded\",\n        [padding$2(0.2778), botNode, raiseNode, padding$2(0.2778)]\n      );\n    } else {\n      raiseNode.setAttribute(\"width\", (group.name === \"\\\\equilibriumRight\" ? \"0.5em\" : \"0\"));\n      wrapper = new mathMLTree.MathNode(\n        \"mpadded\",\n        [padding$2(0.2778), raiseNode, botArrow, padding$2(0.2778)]\n      );\n    }\n\n    wrapper.setAttribute(\"voffset\", \"-0.18em\");\n    wrapper.setAttribute(\"height\", \"-0.18em\");\n    wrapper.setAttribute(\"depth\", \"+0.18em\");\n    return wrapper\n  }\n});\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n  if (!node || node.type !== type) {\n    throw new Error(\n      `Expected node of type $type}, but got ` +\n        (node ? `node of type $node.type}` : String(node))\n    );\n  }\n  return node;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction assertSymbolNodeType(node) {\n  const typedNode = checkSymbolNodeType(node);\n  if (!typedNode) {\n    throw new Error(\n      `Expected node of symbol group type, but got ` +\n        (node ? `node of type $node.type}` : String(node))\n    );\n  }\n  return typedNode;\n}\n\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\nfunction checkSymbolNodeType(node) {\n  if (node && (node.type === \"atom\" ||\n      Object.prototype.hasOwnProperty.call(NON_ATOMS, node.type))) {\n    return node;\n  }\n  return null;\n}\n\nconst cdArrowFunctionName = {\n  \">\": \"\\\\\\\\cdrightarrow\",\n  \"<\": \"\\\\\\\\cdleftarrow\",\n  \"=\": \"\\\\\\\\cdlongequal\",\n  A: \"\\\\uparrow\",\n  V: \"\\\\downarrow\",\n  \"|\": \"\\\\Vert\",\n  \".\": \"no arrow\"\n};\n\nconst newCell = () => {\n  // Create an empty cell, to be filled below with parse nodes.\n  return { type: \"styling\", body: [], mode: \"math\", scriptLevel: \"display\" };\n};\n\nconst isStartOfArrow = (node) => {\n  return node.type === \"textord\" && node.text === \"@\";\n};\n\nconst isLabelEnd = (node, endChar) => {\n  return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\n\nfunction cdArrow(arrowChar, labels, parser) {\n  // Return a parse tree of an arrow and its labels.\n  // This acts in a way similar to a macro expansion.\n  const funcName = cdArrowFunctionName[arrowChar];\n  switch (funcName) {\n    case \"\\\\\\\\cdrightarrow\":\n    case \"\\\\\\\\cdleftarrow\":\n      return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n    case \"\\\\uparrow\":\n    case \"\\\\downarrow\": {\n      const leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n      const bareArrow = {\n        type: \"atom\",\n        text: funcName,\n        mode: \"math\",\n        family: \"rel\"\n      };\n      const sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n      const rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n      const arrowGroup = {\n        type: \"ordgroup\",\n        mode: \"math\",\n        body: [leftLabel, sizedArrow, rightLabel],\n        semisimple: true\n      };\n      return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n    }\n    case \"\\\\\\\\cdlongequal\":\n      return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n    case \"\\\\Vert\": {\n      const arrow = { type: \"textord\", text: \"\\\\Vert\", mode: \"math\" };\n      return parser.callFunction(\"\\\\Big\", [arrow], []);\n    }\n    default:\n      return { type: \"textord\", text: \" \", mode: \"math\" };\n  }\n}\n\nfunction parseCD(parser) {\n  // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n  const parsedRows = [];\n  parser.gullet.beginGroup();\n  parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  parser.gullet.beginGroup();\n  while (true) {\n    // Get the parse nodes for the next row.\n    parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n    const next = parser.fetch().text;\n    if (next === \"&\" || next === \"\\\\\\\\\") {\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      if (parsedRows[parsedRows.length - 1].length === 0) {\n        parsedRows.pop(); // final row ended in \\\\\n      }\n      break;\n    } else {\n      throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n\n  let row = [];\n  const body = [row];\n\n  // Loop thru the parse nodes. Collect them into cells and arrows.\n  for (let i = 0; i < parsedRows.length; i++) {\n    // Start a new row.\n    const rowNodes = parsedRows[i];\n    // Create the first cell.\n    let cell = newCell();\n\n    for (let j = 0; j < rowNodes.length; j++) {\n      if (!isStartOfArrow(rowNodes[j])) {\n        // If a parseNode is not an arrow, it goes into a cell.\n        cell.body.push(rowNodes[j]);\n      } else {\n        // Parse node j is an \"@\", the start of an arrow.\n        // Before starting on the arrow, push the cell into `row`.\n        row.push(cell);\n\n        // Now collect parseNodes into an arrow.\n        // The character after \"@\" defines the arrow type.\n        j += 1;\n        const arrowChar = assertSymbolNodeType(rowNodes[j]).text;\n\n        // Create two empty label nodes. We may or may not use them.\n        const labels = new Array(2);\n        labels[0] = { type: \"ordgroup\", mode: \"math\", body: [] };\n        labels[1] = { type: \"ordgroup\", mode: \"math\", body: [] };\n\n        // Process the arrow.\n        if (\"=|.\".indexOf(arrowChar) > -1) ; else if (\"<>AV\".indexOf(arrowChar) > -1) {\n          // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n          // two optional labels. E.g. the right-point arrow syntax is\n          // really:  @>{optional label}>{optional label}>\n          // Collect parseNodes into labels.\n          for (let labelNum = 0; labelNum < 2; labelNum++) {\n            let inLabel = true;\n            for (let k = j + 1; k < rowNodes.length; k++) {\n              if (isLabelEnd(rowNodes[k], arrowChar)) {\n                inLabel = false;\n                j = k;\n                break;\n              }\n              if (isStartOfArrow(rowNodes[k])) {\n                throw new ParseError(\n                  \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n                  rowNodes[k]\n                );\n              }\n\n              labels[labelNum].body.push(rowNodes[k]);\n            }\n            if (inLabel) {\n              // isLabelEnd never returned a true.\n              throw new ParseError(\n                \"Missing a \" + arrowChar + \" character to complete a CD arrow.\",\n                rowNodes[j]\n              );\n            }\n          }\n        } else {\n          throw new ParseError(`Expected one of \"<>AV=|.\" after @.`);\n        }\n\n        // Now join the arrow to its labels.\n        const arrow = cdArrow(arrowChar, labels, parser);\n\n        // Wrap the arrow in a styling node\n        row.push(arrow);\n        // In CD's syntax, cells are implicit. That is, everything that\n        // is not an arrow gets collected into a cell. So create an empty\n        // cell now. It will collect upcoming parseNodes.\n        cell = newCell();\n      }\n    }\n    if (i % 2 === 0) {\n      // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n      // The last cell is not yet pushed into `row`, so:\n      row.push(cell);\n    } else {\n      // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n      // Remove the empty cell that was placed at the beginning of `row`.\n      row.shift();\n    }\n    row = [];\n    body.push(row);\n  }\n  body.pop();\n\n  // End row group\n  parser.gullet.endGroup();\n  // End array group defining \\\\\n  parser.gullet.endGroup();\n\n  return {\n    type: \"array\",\n    mode: \"math\",\n    body,\n    tags: null,\n    labels: new Array(body.length + 1).fill(\"\"),\n    envClasses: [\"jot\", \"cd\"],\n    cols: [],\n    hLinesBeforeRow: new Array(body.length + 1).fill([])\n  };\n}\n\n// The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\n\ndefineFunction({\n  type: \"cdlabel\",\n  names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser, funcName }, args) {\n    return {\n      type: \"cdlabel\",\n      mode: parser.mode,\n      side: funcName.slice(4),\n      label: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    if (group.label.body.length === 0) {\n      return new mathMLTree.MathNode(\"mrow\", style)  // empty label\n    }\n    // Abuse an <mtable> to create vertically centered content.\n    const mtd = new mathMLTree.MathNode(\"mtd\", [buildGroup$1(group.label, style)]);\n    mtd.style.padding = \"0\";\n    const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n    const mtable = new mathMLTree.MathNode(\"mtable\", [mtr]);\n    const label = new mathMLTree.MathNode(\"mpadded\", [mtable]);\n    // Set the label width to zero so that the arrow will be centered under the corner cell.\n    label.setAttribute(\"width\", \"0\");\n    label.setAttribute(\"displaystyle\", \"false\");\n    label.setAttribute(\"scriptlevel\", \"1\");\n    if (group.side === \"left\") {\n      label.style.display = \"flex\";\n      label.style.justifyContent = \"flex-end\";\n    }\n    return label;\n  }\n});\n\ndefineFunction({\n  type: \"cdlabelparent\",\n  names: [\"\\\\\\\\cdparent\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"cdlabelparent\",\n      mode: parser.mode,\n      fragment: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    return new mathMLTree.MathNode(\"mrow\", [buildGroup$1(group.fragment, style)]);\n  }\n});\n\n// \\@char is an internal function that takes a grouped decimal argument like\n// {123} and converts into symbol with code 123.  It is used by the *macro*\n// \\char defined in macros.js.\ndefineFunction({\n  type: \"textord\",\n  names: [\"\\\\@char\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler({ parser, token }, args) {\n    const arg = assertNodeType(args[0], \"ordgroup\");\n    const group = arg.body;\n    let number = \"\";\n    for (let i = 0; i < group.length; i++) {\n      const node = assertNodeType(group[i], \"textord\");\n      number += node.text;\n    }\n    const code = parseInt(number);\n    if (isNaN(code)) {\n      throw new ParseError(`\\\\@char has non-numeric argument $number}`, token)\n    }\n    return {\n      type: \"textord\",\n      mode: parser.mode,\n      text: String.fromCodePoint(code)\n    }\n  }\n});\n\n// Helpers\nconst htmlRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6})$/i;\nconst htmlOrNameRegEx = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i;\nconst RGBregEx = /^ *\\d{1,3} *(?:, *\\d{1,3} *){2}$/;\nconst rgbRegEx = /^ *[10](?:\\.\\d*)? *(?:, *[10](?:\\.\\d*)? *){2}$/;\nconst xcolorHtmlRegEx = /^[a-f0-9]{6}$/i;\nconst toHex = num => {\n  let str = num.toString(16);\n  if (str.length === 1) { str = \"0\" + str; }\n  return str\n};\n\n// Colors from Tables 4.1 and 4.2 of the xcolor package.\n// Table 4.1 (lower case) RGB values are taken from chroma and xcolor.dtx.\n// Table 4.2 (Capitalizzed) values were sampled, because Chroma contains a unreliable\n// conversion from cmyk to RGB. See https://tex.stackexchange.com/a/537274.\nconst xcolors = JSON.parse(`{\n  \"Apricot\": \"#ffb484\",\n  \"Aquamarine\": \"#08b4bc\",\n  \"Bittersweet\": \"#c84c14\",\n  \"blue\": \"#0000FF\",\n  \"Blue\": \"#303494\",\n  \"BlueGreen\": \"#08b4bc\",\n  \"BlueViolet\": \"#503c94\",\n  \"BrickRed\": \"#b8341c\",\n  \"brown\": \"#BF8040\",\n  \"Brown\": \"#802404\",\n  \"BurntOrange\": \"#f8941c\",\n  \"CadetBlue\": \"#78749c\",\n  \"CarnationPink\": \"#f884b4\",\n  \"Cerulean\": \"#08a4e4\",\n  \"CornflowerBlue\": \"#40ace4\",\n  \"cyan\": \"#00FFFF\",\n  \"Cyan\": \"#08acec\",\n  \"Dandelion\": \"#ffbc44\",\n  \"darkgray\": \"#404040\",\n  \"DarkOrchid\": \"#a8548c\",\n  \"Emerald\": \"#08ac9c\",\n  \"ForestGreen\": \"#089c54\",\n  \"Fuchsia\": \"#90348c\",\n  \"Goldenrod\": \"#ffdc44\",\n  \"gray\": \"#808080\",\n  \"Gray\": \"#98949c\",\n  \"green\": \"#00FF00\",\n  \"Green\": \"#08a44c\",\n  \"GreenYellow\": \"#e0e474\",\n  \"JungleGreen\": \"#08ac9c\",\n  \"Lavender\": \"#f89cc4\",\n  \"lightgray\": \"#c0c0c0\",\n  \"lime\": \"#BFFF00\",\n  \"LimeGreen\": \"#90c43c\",\n  \"magenta\": \"#FF00FF\",\n  \"Magenta\": \"#f0048c\",\n  \"Mahogany\": \"#b0341c\",\n  \"Maroon\": \"#b03434\",\n  \"Melon\": \"#f89c7c\",\n  \"MidnightBlue\": \"#086494\",\n  \"Mulberry\": \"#b03c94\",\n  \"NavyBlue\": \"#086cbc\",\n  \"olive\": \"#7F7F00\",\n  \"OliveGreen\": \"#407c34\",\n  \"orange\": \"#FF8000\",\n  \"Orange\": \"#f8843c\",\n  \"OrangeRed\": \"#f0145c\",\n  \"Orchid\": \"#b074ac\",\n  \"Peach\": \"#f8945c\",\n  \"Periwinkle\": \"#8074bc\",\n  \"PineGreen\": \"#088c74\",\n  \"pink\": \"#ff7f7f\",\n  \"Plum\": \"#98248c\",\n  \"ProcessBlue\": \"#08b4ec\",\n  \"purple\": \"#BF0040\",\n  \"Purple\": \"#a0449c\",\n  \"RawSienna\": \"#983c04\",\n  \"red\": \"#ff0000\",\n  \"Red\": \"#f01c24\",\n  \"RedOrange\": \"#f86434\",\n  \"RedViolet\": \"#a0246c\",\n  \"Rhodamine\": \"#f0549c\",\n  \"Royallue\": \"#0874bc\",\n  \"RoyalPurple\": \"#683c9c\",\n  \"RubineRed\": \"#f0047c\",\n  \"Salmon\": \"#f8948c\",\n  \"SeaGreen\": \"#30bc9c\",\n  \"Sepia\": \"#701404\",\n  \"SkyBlue\": \"#48c4dc\",\n  \"SpringGreen\": \"#c8dc64\",\n  \"Tan\": \"#e09c74\",\n  \"teal\": \"#007F7F\",\n  \"TealBlue\": \"#08acb4\",\n  \"Thistle\": \"#d884b4\",\n  \"Turquoise\": \"#08b4cc\",\n  \"violet\": \"#800080\",\n  \"Violet\": \"#60449c\",\n  \"VioletRed\": \"#f054a4\",\n  \"WildStrawberry\": \"#f0246c\",\n  \"yellow\": \"#FFFF00\",\n  \"Yellow\": \"#fff404\",\n  \"YellowGreen\": \"#98cc6c\",\n  \"YellowOrange\": \"#ffa41c\"\n}`);\n\nconst colorFromSpec = (model, spec) => {\n  let color = \"\";\n  if (model === \"HTML\") {\n    if (!htmlRegEx.test(spec)) {\n      throw new ParseError(\"Invalid HTML input.\")\n    }\n    color = spec;\n  } else if (model === \"RGB\") {\n    if (!RGBregEx.test(spec)) {\n      throw new ParseError(\"Invalid RGB input.\")\n    }\n    spec.split(\",\").map(e => { color += toHex(Number(e.trim())); });\n  } else {\n    if (!rgbRegEx.test(spec)) {\n      throw new ParseError(\"Invalid rbg input.\")\n    }\n    spec.split(\",\").map(e => {\n      const num = Number(e.trim());\n      if (num > 1) { throw new ParseError(\"Color rgb input must be < 1.\") }\n      color += toHex(Number((num * 255).toFixed(0)));\n    });\n  }\n  if (color.charAt(0) !== \"#\") { color = \"#\" + color; }\n  return color\n};\n\nconst validateColor = (color, macros, token) => {\n  const macroName = `\\\\\\\\color@$color}`; // from \\defineColor.\n  const match = htmlOrNameRegEx.exec(color);\n  if (!match) { throw new ParseError(\"Invalid color: '\" + color + \"'\", token) }\n  // We allow a 6-digit HTML color spec without a leading \"#\".\n  // This follows the xcolor package's HTML color model.\n  // Predefined color names are all missed by this RegEx pattern.\n  if (xcolorHtmlRegEx.test(color)) {\n    return \"#\" + color\n  } else if (color.charAt(0) === \"#\") {\n    return color\n  } else if (macros.has(macroName)) {\n    color = macros.get(macroName).tokens[0].text;\n  } else if (xcolors[color]) {\n    color = xcolors[color];\n  }\n  return color\n};\n\nconst mathmlBuilder$9 = (group, style) => {\n  // In LaTeX, color is not supposed to change the spacing of any node.\n  // So instead of wrapping the group in an <mstyle>, we apply\n  // the color individually to each node and return a document fragment.\n  let expr = buildExpression(group.body, style.withColor(group.color));\n  expr = expr.map(e => {\n    e.style.color = group.color;\n    return e\n  });\n  return mathMLTree.newDocumentFragment(expr)\n};\n\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\textcolor\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"original\"]\n  },\n  handler({ parser, token }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let color = \"\";\n    if (model) {\n      const spec = assertNodeType(args[0], \"raw\").string;\n      color = colorFromSpec(model, spec);\n    } else {\n      color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n    }\n    const body = args[1];\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      isTextColor: true,\n      body: ordargument(body)\n    }\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\color\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\"]\n  },\n  handler({ parser, breakOnTokenText, token }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let color = \"\";\n    if (model) {\n      const spec = assertNodeType(args[0], \"raw\").string;\n      color = colorFromSpec(model, spec);\n    } else {\n      color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros, token);\n    }\n\n    // Parse out the implicit body that should be colored.\n    const body = parser.parseExpression(true, breakOnTokenText, true);\n\n    return {\n      type: \"color\",\n      mode: parser.mode,\n      color,\n      isTextColor: false,\n      body\n    }\n  },\n  mathmlBuilder: mathmlBuilder$9\n});\n\ndefineFunction({\n  type: \"color\",\n  names: [\"\\\\definecolor\"],\n  props: {\n    numArgs: 3,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"raw\"]\n  },\n  handler({ parser, funcName, token }, args) {\n    const name = assertNodeType(args[0], \"raw\").string;\n    if (!/^[A-Za-z]+$/.test(name)) {\n      throw new ParseError(\"Color name must be latin letters.\", token)\n    }\n    const model = assertNodeType(args[1], \"raw\").string;\n    if (![\"HTML\", \"RGB\", \"rgb\"].includes(model)) {\n      throw new ParseError(\"Color model must be HTML, RGB, or rgb.\", token)\n    }\n    const spec = assertNodeType(args[2], \"raw\").string;\n    const color = colorFromSpec(model, spec);\n    parser.gullet.macros.set(`\\\\\\\\color@$name}`, { tokens: [{ text: color }], numArgs: 0 });\n    return { type: \"internal\", mode: parser.mode }\n  }\n  // No mathmlBuilder. The point of \\definecolor is to set a macro.\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n\n\n// \\DeclareRobustCommand\\\\{...\\@xnewline}\ndefineFunction({\n  type: \"cr\",\n  names: [\"\\\\\\\\\"],\n  props: {\n    numArgs: 0,\n    numOptionalArgs: 0,\n    allowedInText: true\n  },\n\n  handler({ parser }, args, optArgs) {\n    const size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n    const newLine = !parser.settings.displayMode;\n    return {\n      type: \"cr\",\n      mode: parser.mode,\n      newLine,\n      size: size && assertNodeType(size, \"size\").value\n    }\n  },\n\n  // The following builder is called only at the top level,\n  // not within tabular/array environments.\n\n  mathmlBuilder(group, style) {\n    // MathML 3.0 calls for newline to occur in an <mo> or an <mspace>.\n    // Ref: https://www.w3.org/TR/MathML3/chapter3.html#presm.linebreaking\n    const node = new mathMLTree.MathNode(\"mo\");\n    if (group.newLine) {\n      node.setAttribute(\"linebreak\", \"newline\");\n      if (group.size) {\n        const size = calculateSize(group.size, style);\n        node.setAttribute(\"height\", size.number + size.unit);\n      }\n    }\n    return node\n  }\n});\n\nconst globalMap = {\n  \"\\\\global\": \"\\\\global\",\n  \"\\\\long\": \"\\\\\\\\globallong\",\n  \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n  \"\\\\def\": \"\\\\gdef\",\n  \"\\\\gdef\": \"\\\\gdef\",\n  \"\\\\edef\": \"\\\\xdef\",\n  \"\\\\xdef\": \"\\\\xdef\",\n  \"\\\\let\": \"\\\\\\\\globallet\",\n  \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\n\nconst checkControlSequence = (tok) => {\n  const name = tok.text;\n  if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n    throw new ParseError(\"Expected a control sequence\", tok);\n  }\n  return name;\n};\n\nconst getRHS = (parser) => {\n  let tok = parser.gullet.popToken();\n  if (tok.text === \"=\") {\n    // consume optional equals\n    tok = parser.gullet.popToken();\n    if (tok.text === \" \") {\n      // consume one optional space\n      tok = parser.gullet.popToken();\n    }\n  }\n  return tok;\n};\n\nconst letCommand = (parser, name, tok, global) => {\n  let macro = parser.gullet.macros.get(tok.text);\n  if (macro == null) {\n    // don't expand it later even if a macro with the same name is defined\n    // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n    tok.noexpand = true;\n    macro = {\n      tokens: [tok],\n      numArgs: 0,\n      // reproduce the same behavior in expansion\n      unexpandable: !parser.gullet.isExpandable(tok.text)\n    };\n  }\n  parser.gullet.macros.set(name, macro, global);\n};\n\n// <assignment> -> <non-macro assignment>|<macro assignment>\n// <non-macro assignment> -> <simple assignment>|\\global<non-macro assignment>\n// <macro assignment> -> <definition>|<prefix><macro assignment>\n// <prefix> -> \\global|\\long|\\outer\ndefineFunction({\n  type: \"internal\",\n  names: [\n    \"\\\\global\",\n    \"\\\\long\",\n    \"\\\\\\\\globallong\" // can\u2019t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler({ parser, funcName }) {\n    parser.consumeSpaces();\n    const token = parser.fetch();\n    if (globalMap[token.text]) {\n      // Temml doesn't have \\par, so ignore \\long\n      if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n        token.text = globalMap[token.text];\n      }\n      return assertNodeType(parser.parseFunction(), \"internal\");\n    }\n    throw new ParseError(`Invalid token after macro prefix`, token);\n  }\n});\n\n// Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// <definition> -> <def><control sequence><definition text>\n// <def> -> \\def|\\gdef|\\edef|\\xdef\n// <definition text> -> <parameter text><left brace><balanced text><right brace>\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    let tok = parser.gullet.popToken();\n    const name = tok.text;\n    if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n      throw new ParseError(\"Expected a control sequence\", tok);\n    }\n\n    let numArgs = 0;\n    let insert;\n    const delimiters = [[]];\n    // <parameter text> contains no braces\n    while (parser.gullet.future().text !== \"{\") {\n      tok = parser.gullet.popToken();\n      if (tok.text === \"#\") {\n        // If the very last character of the <parameter text> is #, so that\n        // this # is immediately followed by {, TeX will behave as if the {\n        // had been inserted at the right end of both the parameter text\n        // and the replacement text.\n        if (parser.gullet.future().text === \"{\") {\n          insert = parser.gullet.future();\n          delimiters[numArgs].push(\"{\");\n          break;\n        }\n\n        // A parameter, the first appearance of # must be followed by 1,\n        // the next by 2, and so on; up to nine #\u2019s are allowed\n        tok = parser.gullet.popToken();\n        if (!/^[1-9]$/.test(tok.text)) {\n          throw new ParseError(`Invalid argument number \"$tok.text}\"`);\n        }\n        if (parseInt(tok.text) !== numArgs + 1) {\n          throw new ParseError(`Argument number \"$tok.text}\" out of order`);\n        }\n        numArgs++;\n        delimiters.push([]);\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\"Expected a macro definition\");\n      } else {\n        delimiters[numArgs].push(tok.text);\n      }\n    }\n    // replacement text, enclosed in '{' and '}' and properly nested\n    let { tokens } = parser.gullet.consumeArg();\n    if (insert) {\n      tokens.unshift(insert);\n    }\n\n    if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n      tokens = parser.gullet.expandTokens(tokens);\n      if (tokens.length > parser.gullet.settings.maxExpand) {\n        throw new ParseError(\"Too many expansions in an \" + funcName);\n      }\n      tokens.reverse(); // to fit in with stack order\n    }\n    // Final arg is the expansion of the macro\n    parser.gullet.macros.set(\n      name,\n      { tokens, numArgs, delimiters },\n      funcName === globalMap[funcName]\n    );\n    return { type: \"internal\", mode: parser.mode };\n  }\n});\n\n// <simple assignment> -> <let assignment>\n// <let assignment> -> \\futurelet<control sequence><token><token>\n//     | \\let<control sequence><equals><one optional space><token>\n// <equals> -> <optional spaces>|<optional spaces>=\ndefineFunction({\n  type: \"internal\",\n  names: [\n    \"\\\\let\",\n    \"\\\\\\\\globallet\" // can\u2019t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    const name = checkControlSequence(parser.gullet.popToken());\n    parser.gullet.consumeSpaces();\n    const tok = getRHS(parser);\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n    return { type: \"internal\", mode: parser.mode };\n  }\n});\n\n// ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\ndefineFunction({\n  type: \"internal\",\n  names: [\n    \"\\\\futurelet\",\n    \"\\\\\\\\globalfuture\" // can\u2019t be entered directly\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    const name = checkControlSequence(parser.gullet.popToken());\n    const middle = parser.gullet.popToken();\n    const tok = parser.gullet.popToken();\n    letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n    parser.gullet.pushToken(tok);\n    parser.gullet.pushToken(middle);\n    return { type: \"internal\", mode: parser.mode };\n  }\n});\n\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\newcommand\", \"\\\\renewcommand\", \"\\\\providecommand\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ parser, funcName }) {\n    let name = \"\";\n    const tok = parser.gullet.popToken();\n    if (tok.text === \"{\") {\n      name = checkControlSequence(parser.gullet.popToken());\n      parser.gullet.popToken();\n    } else {\n      name = checkControlSequence(tok);\n    }\n\n    const exists = parser.gullet.isDefined(name);\n    if (exists && funcName === \"\\\\newcommand\") {\n      throw new ParseError(\n        `\\\\newcommand{$name}} attempting to redefine $name}; use \\\\renewcommand`\n      );\n    }\n    if (!exists && funcName === \"\\\\renewcommand\") {\n      throw new ParseError(\n        `\\\\renewcommand{$name}} when command $name} does not yet exist; use \\\\newcommand`\n      );\n    }\n\n    let numArgs = 0;\n    if (parser.gullet.future().text === \"[\") {\n      let tok = parser.gullet.popToken();\n      tok = parser.gullet.popToken();\n      if (!/^[0-9]$/.test(tok.text)) {\n        throw new ParseError(`Invalid number of arguments: \"$tok.text}\"`);\n      }\n      numArgs = parseInt(tok.text);\n      tok = parser.gullet.popToken();\n      if (tok.text !== \"]\") {\n        throw new ParseError(`Invalid argument \"$tok.text}\"`);\n      }\n    }\n\n    // replacement text, enclosed in '{' and '}' and properly nested\n    const { tokens } = parser.gullet.consumeArg();\n\n    if (!(funcName === \"\\\\providecommand\" && parser.gullet.macros.has(name))) {\n      // Ignore \\providecommand\n      parser.gullet.macros.set(\n        name,\n        { tokens, numArgs }\n      );\n    }\n\n    return { type: \"internal\", mode: parser.mode };\n\n  }\n});\n\n// Extra data needed for the delimiter handler down below\nconst delimiterSizes = {\n  \"\\\\bigl\": { mclass: \"mopen\", size: 1 },\n  \"\\\\Bigl\": { mclass: \"mopen\", size: 2 },\n  \"\\\\biggl\": { mclass: \"mopen\", size: 3 },\n  \"\\\\Biggl\": { mclass: \"mopen\", size: 4 },\n  \"\\\\bigr\": { mclass: \"mclose\", size: 1 },\n  \"\\\\Bigr\": { mclass: \"mclose\", size: 2 },\n  \"\\\\biggr\": { mclass: \"mclose\", size: 3 },\n  \"\\\\Biggr\": { mclass: \"mclose\", size: 4 },\n  \"\\\\bigm\": { mclass: \"mrel\", size: 1 },\n  \"\\\\Bigm\": { mclass: \"mrel\", size: 2 },\n  \"\\\\biggm\": { mclass: \"mrel\", size: 3 },\n  \"\\\\Biggm\": { mclass: \"mrel\", size: 4 },\n  \"\\\\big\": { mclass: \"mord\", size: 1 },\n  \"\\\\Big\": { mclass: \"mord\", size: 2 },\n  \"\\\\bigg\": { mclass: \"mord\", size: 3 },\n  \"\\\\Bigg\": { mclass: \"mord\", size: 4 }\n};\n\nconst delimiters = [\n  \"(\",\n  \"\\\\lparen\",\n  \")\",\n  \"\\\\rparen\",\n  \"[\",\n  \"\\\\lbrack\",\n  \"]\",\n  \"\\\\rbrack\",\n  \"\\\\{\",\n  \"\\\\lbrace\",\n  \"\\\\}\",\n  \"\\\\rbrace\",\n  \"\u2987\",\n  \"\\\\llparenthesis\",\n  \"\u2988\",\n  \"\\\\rrparenthesis\",\n  \"\\\\lfloor\",\n  \"\\\\rfloor\",\n  \"\\u230a\",\n  \"\\u230b\",\n  \"\\\\lceil\",\n  \"\\\\rceil\",\n  \"\\u2308\",\n  \"\\u2309\",\n  \"<\",\n  \">\",\n  \"\\\\langle\",\n  \"\\u27e8\",\n  \"\\\\rangle\",\n  \"\\u27e9\",\n  \"\\\\lAngle\",\n  \"\\u27ea\",\n  \"\\\\rAngle\",\n  \"\\u27eb\",\n  \"\\\\llangle\",\n  \"\u2989\",\n  \"\\\\rrangle\",\n  \"\u298A\",\n  \"\\\\lt\",\n  \"\\\\gt\",\n  \"\\\\lvert\",\n  \"\\\\rvert\",\n  \"\\\\lVert\",\n  \"\\\\rVert\",\n  \"\\\\lgroup\",\n  \"\\\\rgroup\",\n  \"\\u27ee\",\n  \"\\u27ef\",\n  \"\\\\lmoustache\",\n  \"\\\\rmoustache\",\n  \"\\u23b0\",\n  \"\\u23b1\",\n  \"\\\\llbracket\",\n  \"\\\\rrbracket\",\n  \"\\u27e6\",\n  \"\\u27e6\",\n  \"\\\\lBrace\",\n  \"\\\\rBrace\",\n  \"\\u2983\",\n  \"\\u2984\",\n  \"/\",\n  \"\\\\backslash\",\n  \"|\",\n  \"\\\\vert\",\n  \"\\\\|\",\n  \"\\\\Vert\",\n  \"\\u2016\",\n  \"\\\\uparrow\",\n  \"\\\\Uparrow\",\n  \"\\\\downarrow\",\n  \"\\\\Downarrow\",\n  \"\\\\updownarrow\",\n  \"\\\\Updownarrow\",\n  \".\"\n];\n\n// Export isDelimiter for benefit of parser.\nconst dels = [\"}\", \"\\\\left\", \"\\\\middle\", \"\\\\right\"];\nconst isDelimiter = str => str.length > 0 &&\n  (delimiters.includes(str) || delimiterSizes[str] || dels.includes(str));\n\n// Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\nconst sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n  const symDelim = checkSymbolNodeType(delim);\n  if (symDelim && delimiters.includes(symDelim.text)) {\n    // If a character is not in the MathML operator dictionary, it will not stretch.\n    // Replace such characters w/characters that will stretch.\n    if ([\"<\", \"\\\\lt\"].includes(symDelim.text)) { symDelim.text = \"\u27E8\"; }\n    if ([\">\", \"\\\\gt\"].includes(symDelim.text)) { symDelim.text = \"\u27E9\"; }\n    return symDelim;\n  } else if (symDelim) {\n    throw new ParseError(`Invalid delimiter '$symDelim.text}' after '$context.funcName}'`, delim);\n  } else {\n    throw new ParseError(`Invalid delimiter type '$delim.type}'`, delim);\n  }\n}\n\n//                               /         \\\nconst needExplicitStretch = [\"\\u002F\", \"\\u005C\", \"\\\\backslash\", \"\\\\vert\", \"|\"];\n\ndefineFunction({\n  type: \"delimsizing\",\n  names: [\n    \"\\\\bigl\",\n    \"\\\\Bigl\",\n    \"\\\\biggl\",\n    \"\\\\Biggl\",\n    \"\\\\bigr\",\n    \"\\\\Bigr\",\n    \"\\\\biggr\",\n    \"\\\\Biggr\",\n    \"\\\\bigm\",\n    \"\\\\Bigm\",\n    \"\\\\biggm\",\n    \"\\\\Biggm\",\n    \"\\\\big\",\n    \"\\\\Big\",\n    \"\\\\bigg\",\n    \"\\\\Bigg\"\n  ],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const delim = checkDelimiter(args[0], context);\n\n    return {\n      type: \"delimsizing\",\n      mode: context.parser.mode,\n      size: delimiterSizes[context.funcName].size,\n      mclass: delimiterSizes[context.funcName].mclass,\n      delim: delim.text\n    };\n  },\n  mathmlBuilder: (group) => {\n    const children = [];\n\n    if (group.delim === \".\") { group.delim = \"\"; }\n    children.push(makeText(group.delim, group.mode));\n\n    const node = new mathMLTree.MathNode(\"mo\", children);\n\n    if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n      // Only some of the delimsizing functions act as fences, and they\n      // return \"mopen\" or \"mclose\" mclass.\n      node.setAttribute(\"fence\", \"true\");\n    } else {\n      // Explicitly disable fencing if it's not a fence, to override the\n      // defaults.\n      node.setAttribute(\"fence\", \"false\");\n    }\n    if (needExplicitStretch.includes(group.delim) || group.delim.indexOf(\"arrow\") > -1) {\n      // We have to explicitly set stretchy to true.\n      node.setAttribute(\"stretchy\", \"true\");\n    }\n    node.setAttribute(\"symmetric\", \"true\"); // Needed for tall arrows in Firefox.\n    node.setAttribute(\"minsize\", sizeToMaxHeight[group.size] + \"em\");\n    node.setAttribute(\"maxsize\", sizeToMaxHeight[group.size] + \"em\");\n    return node;\n  }\n});\n\nfunction assertParsed(group) {\n  if (!group.body) {\n    throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n  }\n}\n\ndefineFunction({\n  type: \"leftright-right\",\n  names: [\"\\\\right\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    return {\n      type: \"leftright-right\",\n      mode: context.parser.mode,\n      delim: checkDelimiter(args[0], context).text\n    };\n  }\n});\n\ndefineFunction({\n  type: \"leftright\",\n  names: [\"\\\\left\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const delim = checkDelimiter(args[0], context);\n\n    const parser = context.parser;\n    // Parse out the implicit body\n    ++parser.leftrightDepth;\n    // parseExpression stops before '\\\\right' or `\\\\middle`\n    let body = parser.parseExpression(false, null, true);\n    let nextToken = parser.fetch();\n    while (nextToken.text === \"\\\\middle\") {\n      // `\\middle`, from the \u03B5-TeX package, ends one group and starts another group.\n      // We had to parse this expression with `breakOnMiddle` enabled in order\n      // to get TeX-compliant parsing of \\over.\n      // But we do not want, at this point, to end on \\middle, so continue\n      // to parse until we fetch a `\\right`.\n      parser.consume();\n      const middle = parser.fetch().text;\n      if (!symbols.math[middle]) {\n        throw new ParseError(`Invalid delimiter '$middle}' after '\\\\middle'`);\n      }\n      checkDelimiter({ type: \"atom\", mode: \"math\", text: middle }, { funcName: \"\\\\middle\" });\n      body.push({ type: \"middle\", mode: \"math\", delim: middle });\n      parser.consume();\n      body = body.concat(parser.parseExpression(false, null, true));\n      nextToken = parser.fetch();\n    }\n    --parser.leftrightDepth;\n    // Check the next token\n    parser.expect(\"\\\\right\", false);\n    const right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n    return {\n      type: \"leftright\",\n      mode: parser.mode,\n      body,\n      left: delim.text,\n      right: right.delim\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    assertParsed(group);\n    const inner = buildExpression(group.body, style);\n\n    if (group.left === \".\") { group.left = \"\"; }\n    const leftNode = new mathMLTree.MathNode(\"mo\", [makeText(group.left, group.mode)]);\n    leftNode.setAttribute(\"fence\", \"true\");\n    leftNode.setAttribute(\"form\", \"prefix\");\n    if (group.left === \"/\" || group.left === \"\\u005C\" || group.left.indexOf(\"arrow\") > -1) {\n      leftNode.setAttribute(\"stretchy\", \"true\");\n    }\n    inner.unshift(leftNode);\n\n    if (group.right === \".\") { group.right = \"\"; }\n    const rightNode = new mathMLTree.MathNode(\"mo\", [makeText(group.right, group.mode)]);\n    rightNode.setAttribute(\"fence\", \"true\");\n    rightNode.setAttribute(\"form\", \"postfix\");\n    if (group.right === \"\\u2216\" || group.right.indexOf(\"arrow\") > -1) {\n      rightNode.setAttribute(\"stretchy\", \"true\");\n    }\n    if (group.body.length > 0) {\n      const lastElement = group.body[group.body.length - 1];\n      if (lastElement.type === \"color\" && !lastElement.isTextColor) {\n        // \\color is a switch. If the last element is of type \"color\" then\n        // the user set the \\color switch and left it on.\n        // A \\right delimiter turns the switch off, but the delimiter itself gets the color.\n        rightNode.setAttribute(\"mathcolor\", lastElement.color);\n      }\n    }\n    inner.push(rightNode);\n\n    return makeRow(inner);\n  }\n});\n\ndefineFunction({\n  type: \"middle\",\n  names: [\"\\\\middle\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"primitive\"]\n  },\n  handler: (context, args) => {\n    const delim = checkDelimiter(args[0], context);\n    if (!context.parser.leftrightDepth) {\n      throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n    }\n\n    return {\n      type: \"middle\",\n      mode: context.parser.mode,\n      delim: delim.text\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const textNode = makeText(group.delim, group.mode);\n    const middleNode = new mathMLTree.MathNode(\"mo\", [textNode]);\n    middleNode.setAttribute(\"fence\", \"true\");\n    if (group.delim.indexOf(\"arrow\") > -1) {\n      middleNode.setAttribute(\"stretchy\", \"true\");\n    }\n    // The next line is not semantically correct, but\n    // Chromium fails to stretch if it is not there.\n    middleNode.setAttribute(\"form\", \"prefix\");\n    // MathML gives 5/18em spacing to each <mo> element.\n    // \\middle should get delimiter spacing instead.\n    middleNode.setAttribute(\"lspace\", \"0.05em\");\n    middleNode.setAttribute(\"rspace\", \"0.05em\");\n    return middleNode;\n  }\n});\n\nconst padding$1 = _ => {\n  const node = new mathMLTree.MathNode(\"mspace\");\n  node.setAttribute(\"width\", \"3pt\");\n  return node\n};\n\nconst mathmlBuilder$8 = (group, style) => {\n  let node;\n  if (group.label.indexOf(\"colorbox\") > -1 || group.label === \"\\\\boxed\") {\n    // MathML core does not support +width attribute in <mpadded>.\n    // Firefox does not reliably add side padding.\n    // Insert <mspace>\n    node = new mathMLTree.MathNode(\"mrow\", [\n      padding$1(),\n      buildGroup$1(group.body, style),\n      padding$1()\n    ]);\n  } else {\n    node = new mathMLTree.MathNode(\"menclose\", [buildGroup$1(group.body, style)]);\n  }\n  switch (group.label) {\n    case \"\\\\overline\":\n      node.setAttribute(\"notation\", \"top\"); // for Firefox & WebKit\n      node.classes.push(\"tml-overline\");    // for Chromium\n      break\n    case \"\\\\underline\":\n      node.setAttribute(\"notation\", \"bottom\");\n      node.classes.push(\"tml-underline\");\n      break\n    case \"\\\\cancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike\");\n      node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"upstrike\"]));\n      break\n    case \"\\\\bcancel\":\n      node.setAttribute(\"notation\", \"downdiagonalstrike\");\n      node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"downstrike\"]));\n      break\n    case \"\\\\sout\":\n      node.setAttribute(\"notation\", \"horizontalstrike\");\n      node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"tml-cancel\", \"sout\"]));\n      break\n    case \"\\\\xcancel\":\n      node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n      node.classes.push(\"tml-xcancel\");\n      break\n    case \"\\\\longdiv\":\n      node.setAttribute(\"notation\", \"longdiv\");\n      node.classes.push(\"longdiv-top\");\n      node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"longdiv-arc\"]));\n      break\n    case \"\\\\phase\":\n      node.setAttribute(\"notation\", \"phasorangle\");\n      node.classes.push(\"phasor-bottom\");\n      node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"phasor-angle\"]));\n      break\n    case \"\\\\textcircled\":\n      node.setAttribute(\"notation\", \"circle\");\n      node.classes.push(\"circle-pad\");\n      node.children.push(new mathMLTree.MathNode(\"mrow\", [], [\"textcircle\"]));\n      break\n    case \"\\\\angl\":\n      node.setAttribute(\"notation\", \"actuarial\");\n      node.classes.push(\"actuarial\");\n      break\n    case \"\\\\boxed\":\n      // \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}} from amsmath.sty\n      node.setAttribute(\"notation\", \"box\");\n      node.classes.push(\"tml-box\");\n      node.setAttribute(\"scriptlevel\", \"0\");\n      node.setAttribute(\"displaystyle\", \"true\");\n      break\n    case \"\\\\fbox\":\n      node.setAttribute(\"notation\", \"box\");\n      node.classes.push(\"tml-fbox\");\n      break\n    case \"\\\\fcolorbox\":\n    case \"\\\\colorbox\": {\n      // <menclose> doesn't have a good notation option for \\colorbox.\n      // So use <mpadded> instead. Set some attributes that come\n      // included with <menclose>.\n      //const fboxsep = 3; // 3 pt from LaTeX source2e\n      //node.setAttribute(\"height\", `+$2 * fboxsep}pt`)\n      //node.setAttribute(\"voffset\", `${fboxsep}pt`)\n      const style = { padding: \"3pt 0 3pt 0\" };\n\n      if (group.label === \"\\\\fcolorbox\") {\n        style.border = \"0.0667em solid \" + String(group.borderColor);\n      }\n      node.style = style;\n      break\n    }\n  }\n  if (group.backgroundColor) {\n    node.setAttribute(\"mathbackground\", group.backgroundColor);\n  }\n  return node;\n};\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\colorbox\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"text\"]\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let color = \"\";\n    if (model) {\n      const spec = assertNodeType(args[0], \"raw\").string;\n      color = colorFromSpec(model, spec);\n    } else {\n      color = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n    }\n    const body = args[1];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor: color,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fcolorbox\"],\n  props: {\n    numArgs: 3,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    argTypes: [\"raw\", \"raw\", \"raw\", \"text\"]\n  },\n  handler({ parser, funcName }, args, optArgs) {\n    const model = optArgs[0] && assertNodeType(optArgs[0], \"raw\").string;\n    let borderColor = \"\";\n    let backgroundColor;\n    if (model) {\n      const borderSpec = assertNodeType(args[0], \"raw\").string;\n      const backgroundSpec = assertNodeType(args[0], \"raw\").string;\n      borderColor = colorFromSpec(model, borderSpec);\n      backgroundColor = colorFromSpec(model, backgroundSpec);\n    } else {\n      borderColor = validateColor(assertNodeType(args[0], \"raw\").string, parser.gullet.macros);\n      backgroundColor = validateColor(assertNodeType(args[1], \"raw\").string, parser.gullet.macros);\n    }\n    const body = args[2];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      backgroundColor,\n      borderColor,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\fbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: true\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: \"\\\\fbox\",\n      body: args[0]\n    };\n  }\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\angl\", \"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\sout\", \"\\\\overline\",\n    \"\\\\boxed\", \"\\\\longdiv\", \"\\\\phase\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$8\n});\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\underline\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$8\n});\n\n\ndefineFunction({\n  type: \"enclose\",\n  names: [\"\\\\textcircled\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"enclose\",\n      mode: parser.mode,\n      label: funcName,\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$8\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nconst _environments = {};\n\nfunction defineEnvironment({ type, names, props, handler, mathmlBuilder }) {\n  // Set default values of environments.\n  const data = {\n    type,\n    numArgs: props.numArgs || 0,\n    allowedInText: false,\n    numOptionalArgs: 0,\n    handler\n  };\n  for (let i = 0; i < names.length; ++i) {\n    _environments[names[i]] = data;\n  }\n  if (mathmlBuilder) {\n    _mathmlGroupBuilders[type] = mathmlBuilder;\n  }\n}\n\n/**\n * Lexing or parsing positional information for error reporting.\n * This object is immutable.\n */\nclass SourceLocation {\n  constructor(lexer, start, end) {\n    this.lexer = lexer; // Lexer holding the input string.\n    this.start = start; // Start offset, zero-based inclusive.\n    this.end = end;     // End offset, zero-based exclusive.\n  }\n\n  /**\n   * Merges two `SourceLocation`s from location providers, given they are\n   * provided in order of appearance.\n   * - Returns the first one's location if only the first is provided.\n   * - Returns a merged range of the first and the last if both are provided\n   *   and their lexers match.\n   * - Otherwise, returns null.\n   */\n  static range(first, second) {\n    if (!second) {\n      return first && first.loc;\n    } else if (!first || !first.loc || !second.loc || first.loc.lexer !== second.loc.lexer) {\n      return null;\n    } else {\n      return new SourceLocation(first.loc.lexer, first.loc.start, second.loc.end);\n    }\n  }\n}\n\n/**\n * Interface required to break circular dependency between Token, Lexer, and\n * ParseError.\n */\n\n/**\n * The resulting token returned from `lex`.\n *\n * It consists of the token text plus some position information.\n * The position information is essentially a range in an input string,\n * but instead of referencing the bare input string, we refer to the lexer.\n * That way it is possible to attach extra metadata to the input string,\n * like for example a file name or similar.\n *\n * The position information is optional, so it is OK to construct synthetic\n * tokens if appropriate. Not providing available position information may\n * lead to degraded error reporting, though.\n */\nclass Token {\n  constructor(\n    text, // the text of this token\n    loc\n  ) {\n    this.text = text;\n    this.loc = loc;\n  }\n\n  /**\n   * Given a pair of tokens (this and endToken), compute a `Token` encompassing\n   * the whole input range enclosed by these two.\n   */\n  range(\n    endToken, // last token of the range, inclusive\n    text // the text of the newly constructed token\n  ) {\n    return new Token(text, SourceLocation.range(this, endToken));\n  }\n}\n\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle, scriptstyle, and scriptscriptstyle.  These are\n// provided in the the arrays below, in that order.\n//\n\n// Math style is not quite the same thing as script level.\nconst StyleLevel = {\n  DISPLAY: 0,\n  TEXT: 1,\n  SCRIPT: 2,\n  SCRIPTSCRIPT: 3\n};\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nconst _macros = {};\n\n// This function might one day accept an additional argument and do more things.\nfunction defineMacro(name, body) {\n  _macros[name] = body;\n}\n\n/**\n * Predefined macros for Temml.\n * This can be used to define some commands in terms of others.\n */\n\nconst macros = _macros;\n\n//////////////////////////////////////////////////////////////////////\n// macro tools\n\ndefineMacro(\"\\\\noexpand\", function(context) {\n  // The expansion is the token itself; but that token is interpreted\n  // as if its meaning were \u2018\\relax\u2019 if it is a control sequence that\n  // would ordinarily be expanded by TeX\u2019s expansion rules.\n  const t = context.popToken();\n  if (context.isExpandable(t.text)) {\n    t.noexpand = true;\n    t.treatAsRelax = true;\n  }\n  return { tokens: [t], numArgs: 0 };\n});\n\ndefineMacro(\"\\\\expandafter\", function(context) {\n  // TeX first reads the token that comes immediately after \\expandafter,\n  // without expanding it; let\u2019s call this token t. Then TeX reads the\n  // token that comes after t (and possibly more tokens, if that token\n  // has an argument), replacing it by its expansion. Finally TeX puts\n  // t back in front of that expansion.\n  const t = context.popToken();\n  context.expandOnce(true); // expand only an expandable token\n  return { tokens: [t], numArgs: 0 };\n});\n\n// LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\ndefineMacro(\"\\\\@firstoftwo\", function(context) {\n  const args = context.consumeArgs(2);\n  return { tokens: args[0], numArgs: 0 };\n});\n\n// LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\ndefineMacro(\"\\\\@secondoftwo\", function(context) {\n  const args = context.consumeArgs(2);\n  return { tokens: args[1], numArgs: 0 };\n});\n\n// LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character.  If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\ndefineMacro(\"\\\\@ifnextchar\", function(context) {\n  const args = context.consumeArgs(3); // symbol, if, else\n  context.consumeSpaces();\n  const nextToken = context.future();\n  if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n    return { tokens: args[1], numArgs: 0 };\n  } else {\n    return { tokens: args[2], numArgs: 0 };\n  }\n});\n\n// LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\");\n\n// LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\ndefineMacro(\"\\\\TextOrMath\", function(context) {\n  const args = context.consumeArgs(2);\n  if (context.mode === \"text\") {\n    return { tokens: args[0], numArgs: 0 };\n  } else {\n    return { tokens: args[1], numArgs: 0 };\n  }\n});\n\nconst stringFromArg = arg => {\n  // Reverse the order of the arg and return a string.\n  let str = \"\";\n  for (let i = arg.length - 1; i > -1; i--) {\n    str += arg[i].text;\n  }\n  return str\n};\n\n// Lookup table for parsing numbers in base 8 through 16\nconst digitToNumber = {\n  0: 0,\n  1: 1,\n  2: 2,\n  3: 3,\n  4: 4,\n  5: 5,\n  6: 6,\n  7: 7,\n  8: 8,\n  9: 9,\n  a: 10,\n  A: 10,\n  b: 11,\n  B: 11,\n  c: 12,\n  C: 12,\n  d: 13,\n  D: 13,\n  e: 14,\n  E: 14,\n  f: 15,\n  F: 15\n};\n\nconst nextCharNumber = context => {\n  const numStr = context.future().text;\n  if (numStr === \"EOF\") { return [null, \"\"] }\n  return [digitToNumber[numStr.charAt(0)], numStr]\n};\n\nconst appendCharNumbers = (number, numStr, base) => {\n  for (let i = 1; i < numStr.length; i++) {\n    const digit = digitToNumber[numStr.charAt(i)];\n    number *= base;\n    number += digit;\n  }\n  return number\n};\n\n// TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n//   \\char123  -- decimal\n//   \\char'123 -- octal\n//   \\char\"123 -- hex\n//   \\char`x   -- character that can be written (i.e. isn't active)\n//   \\char`\\x  -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\ndefineMacro(\"\\\\char\", function(context) {\n  let token = context.popToken();\n  let base;\n  let number = \"\";\n  if (token.text === \"'\") {\n    base = 8;\n    token = context.popToken();\n  } else if (token.text === '\"') {\n    base = 16;\n    token = context.popToken();\n  } else if (token.text === \"`\") {\n    token = context.popToken();\n    if (token.text[0] === \"\\\\\") {\n      number = token.text.charCodeAt(1);\n    } else if (token.text === \"EOF\") {\n      throw new ParseError(\"\\\\char` missing argument\");\n    } else {\n      number = token.text.charCodeAt(0);\n    }\n  } else {\n    base = 10;\n  }\n  if (base) {\n    // Parse a number in the given base, starting with first `token`.\n    let numStr = token.text;\n    number = digitToNumber[numStr.charAt(0)];\n    if (number == null || number >= base) {\n      throw new ParseError(`Invalid base-$base} digit $token.text}`);\n    }\n    number = appendCharNumbers(number, numStr, base);\n    let digit;\n    [digit, numStr] = nextCharNumber(context);\n    while (digit != null && digit < base) {\n      number *= base;\n      number += digit;\n      number = appendCharNumbers(number, numStr, base);\n      context.popToken();\n      [digit, numStr] = nextCharNumber(context);\n    }\n  }\n  return `\\\\@char{$number}}`;\n});\n\nfunction recreateArgStr(context) {\n  // Recreate the macro's original argument string from the array of parse tokens.\n  const tokens = context.consumeArgs(1)[0];\n  let str = \"\";\n  let expectedLoc = tokens[tokens.length - 1].loc.start;\n  for (let i = tokens.length - 1; i >= 0; i--) {\n    const actualLoc = tokens[i].loc.start;\n    if (actualLoc > expectedLoc) {\n      // context.consumeArgs has eaten a space.\n      str += \" \";\n      expectedLoc = actualLoc;\n    }\n    str += tokens[i].text;\n    expectedLoc += tokens[i].text.length;\n  }\n  return str\n}\n\n// The Latin Modern font renders <mi>\u221A</mi> at the wrong vertical alignment.\n// This macro provides a better rendering.\ndefineMacro(\"\\\\surd\", '\\\\sqrt{\\\\vphantom{|}}');\n\n// See comment for \\oplus in symbols.js.\ndefineMacro(\"\\u2295\", \"\\\\oplus\");\n\n// Since Temml has no \\par, ignore \\long.\ndefineMacro(\"\\\\long\", \"\");\n\n//////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\");\n\n// Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\n\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\");\n\n// \\mathstrut from the TeXbook, p 360\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\");\n\n// \\underbar from TeXbook p 353\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\");\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX_2\u03B5\n\n// \\vdots{\\vbox{\\baselineskip4\\p@  \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\");\n\n// {array} environment gaps\ndefineMacro(\"\\\\arraystretch\", \"1\");     // line spacing factor times 12pt\ndefineMacro(\"\\\\arraycolsep\", \"6pt\");    // half the width separating columns\n\n//////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n\n//\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\");\n\n// \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\");\n\n// AMSMath's automatic \\dots, based on \\mdots@@ macro.\nconst dotsByToken = {\n  \",\": \"\\\\dotsc\",\n  \"\\\\not\": \"\\\\dotsb\",\n  // \\keybin@ checks for the following:\n  \"+\": \"\\\\dotsb\",\n  \"=\": \"\\\\dotsb\",\n  \"<\": \"\\\\dotsb\",\n  \">\": \"\\\\dotsb\",\n  \"-\": \"\\\\dotsb\",\n  \"*\": \"\\\\dotsb\",\n  \":\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\DOTSB:\n  \"\\\\DOTSB\": \"\\\\dotsb\",\n  \"\\\\coprod\": \"\\\\dotsb\",\n  \"\\\\bigvee\": \"\\\\dotsb\",\n  \"\\\\bigwedge\": \"\\\\dotsb\",\n  \"\\\\biguplus\": \"\\\\dotsb\",\n  \"\\\\bigcap\": \"\\\\dotsb\",\n  \"\\\\bigcup\": \"\\\\dotsb\",\n  \"\\\\prod\": \"\\\\dotsb\",\n  \"\\\\sum\": \"\\\\dotsb\",\n  \"\\\\bigotimes\": \"\\\\dotsb\",\n  \"\\\\bigoplus\": \"\\\\dotsb\",\n  \"\\\\bigodot\": \"\\\\dotsb\",\n  \"\\\\bigsqcap\": \"\\\\dotsb\",\n  \"\\\\bigsqcup\": \"\\\\dotsb\",\n  \"\\\\bigtimes\": \"\\\\dotsb\",\n  \"\\\\And\": \"\\\\dotsb\",\n  \"\\\\longrightarrow\": \"\\\\dotsb\",\n  \"\\\\Longrightarrow\": \"\\\\dotsb\",\n  \"\\\\longleftarrow\": \"\\\\dotsb\",\n  \"\\\\Longleftarrow\": \"\\\\dotsb\",\n  \"\\\\longleftrightarrow\": \"\\\\dotsb\",\n  \"\\\\Longleftrightarrow\": \"\\\\dotsb\",\n  \"\\\\mapsto\": \"\\\\dotsb\",\n  \"\\\\longmapsto\": \"\\\\dotsb\",\n  \"\\\\hookrightarrow\": \"\\\\dotsb\",\n  \"\\\\doteq\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\mathbin:\n  \"\\\\mathbin\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\mathrel:\n  \"\\\\mathrel\": \"\\\\dotsb\",\n  \"\\\\relbar\": \"\\\\dotsb\",\n  \"\\\\Relbar\": \"\\\\dotsb\",\n  \"\\\\xrightarrow\": \"\\\\dotsb\",\n  \"\\\\xleftarrow\": \"\\\\dotsb\",\n  // Symbols whose definition starts with \\DOTSI:\n  \"\\\\DOTSI\": \"\\\\dotsi\",\n  \"\\\\int\": \"\\\\dotsi\",\n  \"\\\\oint\": \"\\\\dotsi\",\n  \"\\\\iint\": \"\\\\dotsi\",\n  \"\\\\iiint\": \"\\\\dotsi\",\n  \"\\\\iiiint\": \"\\\\dotsi\",\n  \"\\\\idotsint\": \"\\\\dotsi\",\n  // Symbols whose definition starts with \\DOTSX:\n  \"\\\\DOTSX\": \"\\\\dotsx\"\n};\n\ndefineMacro(\"\\\\dots\", function(context) {\n  // TODO: If used in text mode, should expand to \\textellipsis.\n  // However, in Temml, \\textellipsis and \\ldots behave the same\n  // (in text mode), and it's unlikely we'd see any of the math commands\n  // that affect the behavior of \\dots when in text mode.  So fine for now\n  // (until we support \\ifmmode ... \\else ... \\fi).\n  let thedots = \"\\\\dotso\";\n  const next = context.expandAfterFuture().text;\n  if (next in dotsByToken) {\n    thedots = dotsByToken[next];\n  } else if (next.slice(0, 4) === \"\\\\not\") {\n    thedots = \"\\\\dotsb\";\n  } else if (next in symbols.math) {\n    if ([\"bin\", \"rel\"].includes(symbols.math[next].group)) {\n      thedots = \"\\\\dotsb\";\n    }\n  }\n  return thedots;\n});\n\nconst spaceAfterDots = {\n  // \\rightdelim@ checks for the following:\n  \")\": true,\n  \"]\": true,\n  \"\\\\rbrack\": true,\n  \"\\\\}\": true,\n  \"\\\\rbrace\": true,\n  \"\\\\rangle\": true,\n  \"\\\\rceil\": true,\n  \"\\\\rfloor\": true,\n  \"\\\\rgroup\": true,\n  \"\\\\rmoustache\": true,\n  \"\\\\right\": true,\n  \"\\\\bigr\": true,\n  \"\\\\biggr\": true,\n  \"\\\\Bigr\": true,\n  \"\\\\Biggr\": true,\n  // \\extra@ also tests for the following:\n  $: true,\n  // \\extrap@ checks for the following:\n  \";\": true,\n  \".\": true,\n  \",\": true\n};\n\ndefineMacro(\"\\\\dotso\", function(context) {\n  const next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\n\ndefineMacro(\"\\\\dotsc\", function(context) {\n  const next = context.future().text;\n  // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n  // ';' and '.', but doesn't check for ','.\n  if (next in spaceAfterDots && next !== \",\") {\n    return \"\\\\ldots\\\\,\";\n  } else {\n    return \"\\\\ldots\";\n  }\n});\n\ndefineMacro(\"\\\\cdots\", function(context) {\n  const next = context.future().text;\n  if (next in spaceAfterDots) {\n    return \"\\\\@cdots\\\\,\";\n  } else {\n    return \"\\\\@cdots\";\n  }\n});\n\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\");\ndefineMacro(\"\\\\idotsint\", \"\\\\dotsi\");\n// amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\");\n\n// \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\");\n\n// Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n//   \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\");\n// \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\,\", \"{\\\\tmspace+{3mu}{.1667em}}\");\n// \\let\\thinspace\\,\ndefineMacro(\"\\\\thinspace\", \"\\\\,\");\n// \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"{\\\\tmspace+{4mu}{.2222em}}\");\n// \\let\\medspace\\:\ndefineMacro(\"\\\\medspace\", \"\\\\:\");\n// \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\ndefineMacro(\"\\\\;\", \"{\\\\tmspace+{5mu}{.2777em}}\");\n// \\let\\thickspace\\;\ndefineMacro(\"\\\\thickspace\", \"\\\\;\");\n// \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\ndefineMacro(\"\\\\!\", \"{\\\\tmspace-{3mu}{.1667em}}\");\n// \\let\\negthinspace\\!\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\");\n// \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\ndefineMacro(\"\\\\negmedspace\", \"{\\\\tmspace-{4mu}{.2222em}}\");\n// \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\ndefineMacro(\"\\\\negthickspace\", \"{\\\\tmspace-{5mu}{.277em}}\");\n// \\def\\enspace{\\kern.5em }\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \");\n// \\def\\enskip{\\hskip.5em\\relax}\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\");\n// \\def\\quad{\\hskip1em\\relax}\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\");\n// \\def\\qquad{\\hskip2em\\relax}\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\");\n\ndefineMacro(\"\\\\AA\", \"\\\\TextOrMath{\\\\Angstrom}{\\\\mathring{A}}\\\\relax\");\n\n// \\tag@in@display form of \\tag\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", (context) => {\n  if (context.macros.get(\"\\\\df@tag\")) {\n    throw new ParseError(\"Multiple \\\\tag\");\n  }\n  return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n});\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\");\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\n\n// \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n//   {\\operator@font mod}\\penalty900\n//   \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n//   \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n//   \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\ndefineMacro(\"\\\\bmod\", \"\\\\mathbin{\\\\text{mod}}\");\ndefineMacro(\n  \"\\\\pod\",\n  \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\"\n);\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\n  \"\\\\mod\",\n  \"\\\\allowbreak\" +\n    \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" +\n    \"{\\\\rm mod}\\\\,\\\\,#1\"\n);\n\n//////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n\n// \\expandafter\\let\\expandafter\\@normalcr\n//     \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\");\n\n// \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails.\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{T}\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125em\\\\textrm{X}\");\n\ndefineMacro(\n  \"\\\\LaTeX\",\n    \"\\\\textrm{L}\\\\kern-.35em\\\\raisebox{0.2em}{\\\\scriptstyle A}\\\\kern-.15em\\\\TeX\"\n);\n\ndefineMacro(\n  \"\\\\Temml\",\n  // eslint-disable-next-line max-len\n  \"\\\\textrm{T}\\\\kern-0.2em\\\\lower{0.2em}{\\\\textrm{E}}\\\\kern-0.08em{\\\\textrm{M}\\\\kern-0.08em\\\\raise{0.2em}\\\\textrm{M}\\\\kern-0.08em\\\\textrm{L}}\"\n);\n\n// \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip  #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n//                 \\hskip #1\\hskip \\z@skip}\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\");\n\ndefineMacro(\"\\\\colon\", `\\\\mathpunct{\\\\char\"3a}`);\n\n//////////////////////////////////////////////////////////////////////\n// mathtools.sty\n\ndefineMacro(\"\\\\prescript\", \"\\\\pres@cript{_{#1}^{#2}}{}{#3}\");\n\n//\\providecommand\\ordinarycolon{:}\ndefineMacro(\"\\\\ordinarycolon\", `\\\\char\"3a`);\n// Raise to center on the math axis, as closely as possible.\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}}\");\n// \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\coloneq\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2212}');\n// \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\ndefineMacro(\"\\\\Coloneq\", '\\\\mathrel{\\\\char\"2237\\\\char\"2212}');\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqqcolon\", '\\\\mathrel{\\\\char\"3d\\\\char\"2237}');\n// \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\ndefineMacro(\"\\\\Eqcolon\", '\\\\mathrel{\\\\char\"2212\\\\char\"2237}');\n// \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\colonapprox\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"2248}');\n// \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\ndefineMacro(\"\\\\Colonapprox\", '\\\\mathrel{\\\\char\"2237\\\\char\"2248}');\n// \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n// \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\ndefineMacro(\"\\\\Colonsim\", '\\\\mathrel{\\\\raisebox{0.035em}{\\\\ordinarycolon}\\\\char\"223c}');\n\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n\n// Alternate names for mathtools's macros:\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\");\n// \\colonapprox name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\");\n// \\colonsim name is same in mathtools and colonequals.\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\");\n\n// Present in newtxmath, pxfonts and txfonts\ndefineMacro(\"\\\\notni\", \"\\\\mathrel{\\\\char`\\u220C}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\");\n\n//////////////////////////////////////////////////////////////////////\n// From amsopn.sty\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{\\\\text{lim}}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{\\\\text{lim}}}\");\n\ndefineMacro(\"\\\\centerdot\", \"{\\\\medspace\\\\rule{0.167em}{0.189em}\\\\medspace}\");\n\n//////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\n\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\operatorname*{plim}\");\n\n//////////////////////////////////////////////////////////////////////\n// MnSymbol.sty\n\ndefineMacro(\"\\\\leftmodels\", \"\\\\mathop{\\\\reflectbox{$\\\\models$}}\");\n\n//////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\n\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\n// A helper for \\Braket and \\Set\nconst replaceVert = (argStr, match) => {\n  const ch = match[0] === \"|\" ? \"\\\\vert\" : \"\\\\Vert\";\n  const replaceStr = `}\\\\,\\\\middle$ch}\\\\,{`;\n  return argStr.slice(0, match.index) + replaceStr + argStr.slice(match.index + match[0].length)\n};\ndefineMacro(\"\\\\Braket\",  function(context) {\n  let argStr = recreateArgStr(context);\n  const regEx = /\\|\\||\\||\\\\\\|/g;\n  let match;\n  while ((match = regEx.exec(argStr)) !== null) {\n    argStr = replaceVert(argStr, match);\n  }\n  return \"\\\\left\\\\langle{\" + argStr + \"}\\\\right\\\\rangle\"\n});\ndefineMacro(\"\\\\Set\",  function(context) {\n  let argStr = recreateArgStr(context);\n  const match = /\\|\\||\\||\\\\\\|/.exec(argStr);\n  if (match) {\n    argStr = replaceVert(argStr, match);\n  }\n  return \"\\\\left\\\\{\\\\:{\" + argStr + \"}\\\\:\\\\right\\\\}\"\n});\ndefineMacro(\"\\\\set\",  function(context) {\n  const argStr = recreateArgStr(context);\n  return \"\\\\{{\" + argStr.replace(/\\|/, \"}\\\\mid{\") + \"}\\\\}\"\n});\n\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\");\n\n//////////////////////////////////////////////////////////////////////\n// derivative.sty\ndefineMacro(\"\\\\odv\", \"\\\\@ifstar\\\\odv@next\\\\odv@numerator\");\ndefineMacro(\"\\\\odv@numerator\", \"\\\\frac{\\\\mathrm{d}#1}{\\\\mathrm{d}#2}\");\ndefineMacro(\"\\\\odv@next\", \"\\\\frac{\\\\mathrm{d}}{\\\\mathrm{d}#2}#1\");\ndefineMacro(\"\\\\pdv\", \"\\\\@ifstar\\\\pdv@next\\\\pdv@numerator\");\n\nconst pdvHelper = args => {\n  const numerator = args[0][0].text;\n  const denoms = stringFromArg(args[1]).split(\",\");\n  const power = String(denoms.length);\n  const numOp = power === \"1\" ? \"\\\\partial\" : `\\\\partial^$power}`;\n  let denominator = \"\";\n  denoms.map(e => { denominator += \"\\\\partial \" + e.trim() +  \"\\\\,\";});\n  return [numerator, numOp,  denominator.replace(/\\\\,$/, \"\")]\n};\ndefineMacro(\"\\\\pdv@numerator\", function(context) {\n  const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n  return `\\\\frac{$numOp} $numerator}}{$denominator}}`\n});\ndefineMacro(\"\\\\pdv@next\", function(context) {\n  const [numerator, numOp, denominator] = pdvHelper(context.consumeArgs(2));\n  return `\\\\frac{$numOp}}{$denominator}} $numerator}`\n});\n\n//////////////////////////////////////////////////////////////////////\n// upgreek.dtx\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\upbeta\", \"\\\\up@greek{\\\\beta}\");\ndefineMacro(\"\\\\upgamma\", \"\\\\up@greek{\\\\gamma}\");\ndefineMacro(\"\\\\updelta\", \"\\\\up@greek{\\\\delta}\");\ndefineMacro(\"\\\\upepsilon\", \"\\\\up@greek{\\\\epsilon}\");\ndefineMacro(\"\\\\upzeta\", \"\\\\up@greek{\\\\zeta}\");\ndefineMacro(\"\\\\upeta\", \"\\\\up@greek{\\\\eta}\");\ndefineMacro(\"\\\\uptheta\", \"\\\\up@greek{\\\\theta}\");\ndefineMacro(\"\\\\upiota\", \"\\\\up@greek{\\\\iota}\");\ndefineMacro(\"\\\\upkappa\", \"\\\\up@greek{\\\\kappa}\");\ndefineMacro(\"\\\\uplambda\", \"\\\\up@greek{\\\\lambda}\");\ndefineMacro(\"\\\\upmu\", \"\\\\up@greek{\\\\mu}\");\ndefineMacro(\"\\\\upnu\", \"\\\\up@greek{\\\\nu}\");\ndefineMacro(\"\\\\upxi\", \"\\\\up@greek{\\\\xi}\");\ndefineMacro(\"\\\\upomicron\", \"\\\\up@greek{\\\\omicron}\");\ndefineMacro(\"\\\\uppi\", \"\\\\up@greek{\\\\pi}\");\ndefineMacro(\"\\\\upalpha\", \"\\\\up@greek{\\\\alpha}\");\ndefineMacro(\"\\\\uprho\", \"\\\\up@greek{\\\\rho}\");\ndefineMacro(\"\\\\upsigma\", \"\\\\up@greek{\\\\sigma}\");\ndefineMacro(\"\\\\uptau\", \"\\\\up@greek{\\\\tau}\");\ndefineMacro(\"\\\\upupsilon\", \"\\\\up@greek{\\\\upsilon}\");\ndefineMacro(\"\\\\upphi\", \"\\\\up@greek{\\\\phi}\");\ndefineMacro(\"\\\\upchi\", \"\\\\up@greek{\\\\chi}\");\ndefineMacro(\"\\\\uppsi\", \"\\\\up@greek{\\\\psi}\");\ndefineMacro(\"\\\\upomega\", \"\\\\up@greek{\\\\omega}\");\n\n//////////////////////////////////////////////////////////////////////\n// cmll package\ndefineMacro(\"\\\\invamp\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\parr\", '\\\\mathbin{\\\\char\"214b}');\ndefineMacro(\"\\\\with\", '\\\\mathbin{\\\\char\"26}');\ndefineMacro(\"\\\\multimapinv\", '\\\\mathrel{\\\\char\"27dc}');\ndefineMacro(\"\\\\multimapboth\", '\\\\mathrel{\\\\char\"29df}');\ndefineMacro(\"\\\\scoh\", '{\\\\mkern5mu\\\\char\"2322\\\\mkern5mu}');\ndefineMacro(\"\\\\sincoh\", '{\\\\mkern5mu\\\\char\"2323\\\\mkern5mu}');\ndefineMacro(\"\\\\coh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2322}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2323}}}\\\\mkern5mu}`);\ndefineMacro(\"\\\\incoh\", `{\\\\mkern5mu\\\\rule{}{0.7em}\\\\mathrlap{\\\\smash{\\\\raise2mu{\\\\char\"2323}}}\n{\\\\smash{\\\\lower4mu{\\\\char\"2322}}}\\\\mkern5mu}`);\n\n\n//////////////////////////////////////////////////////////////////////\n// chemstyle package\ndefineMacro(\"\\\\standardstate\", \"\\\\text{\\\\tiny\\\\char`\u29B5}\");\n\n\uFEFF/* eslint-disable */\n/* -*- Mode: JavaScript; indent-tabs-mode:nil; js-indent-level: 2 -*- */\n/* vim: set ts=2 et sw=2 tw=80: */\n\n/*************************************************************\n *\n *  Temml mhchem.js\n *\n *  This file implements a Temml version of mhchem version 3.3.0.\n *  It is adapted from MathJax/extensions/TeX/mhchem.js\n *  It differs from the MathJax version as follows:\n *    1. The interface is changed so that it can be called from Temml, not MathJax.\n *    2. \\rlap and \\llap are replaced with \\mathrlap and \\mathllap.\n *    3. The reaction arrow code is simplified. All reaction arrows are rendered\n *       using Temml extensible arrows instead of building non-extensible arrows.\n *    4. The ~bond forms are composed entirely of \\rule elements.\n *    5. Two dashes in _getBond are wrapped in braces to suppress spacing. i.e., {-}\n *    6. The electron dot uses \\textbullet instead of \\bullet.\n *    7. \\smash[T] has been removed. (WebKit hides anything inside \\smash{\u2026})\n *\n *    This code, as other Temml code, is released under the MIT license.\n * \n * /*************************************************************\n *\n *  MathJax/extensions/TeX/mhchem.js\n *\n *  Implements the \\ce command for handling chemical formulas\n *  from the mhchem LaTeX package.\n *\n *  ---------------------------------------------------------------------\n *\n *  Copyright (c) 2011-2015 The MathJax Consortium\n *  Copyright (c) 2015-2018 Martin Hensel\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n */\n\n//\n// Coding Style\n//   - use '' for identifiers that can by minified/uglified\n//   - use \"\" for strings that need to stay untouched\n\n// version: \"3.3.0\" for MathJax and Temml\n\n\n// Add \\ce, \\pu, and \\tripleDash to the Temml macros.\n\ndefineMacro(\"\\\\ce\", function(context) {\n  return chemParse(context.consumeArgs(1)[0], \"ce\")\n});\n\ndefineMacro(\"\\\\pu\", function(context) {\n  return chemParse(context.consumeArgs(1)[0], \"pu\");\n});\n\n// Math fonts do not include glyphs for the ~ form of bonds. So we'll send path geometry\n// So we'll compose characters built from \\rule elements.\ndefineMacro(\"\\\\uniDash\", `{\\\\rule{0.672em}{0.06em}}`)\ndefineMacro(\"\\\\triDash\", `{\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}\\\\kern2mu\\\\rule{0.15em}{0.06em}}`)\ndefineMacro(\"\\\\tripleDash\", `\\\\kern0.075em\\\\raise0.25em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverLine\", `\\\\kern0.075em\\\\mathrlap{\\\\raise0.125em{\\\\uniDash}}\\\\raise0.34em{\\\\triDash}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashOverDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\triDash}}\\\\raise0.27em{\\\\uniDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\ndefineMacro(\"\\\\tripleDashBetweenDoubleLine\", `\\\\kern0.075em\\\\mathrlap{\\\\mathrlap{\\\\raise0.48em{\\\\uniDash}}\\\\raise0.27em{\\\\triDash}}{\\\\raise0.05em{\\\\uniDash}}\\\\kern0.075em`)\n\n  //\n  //  This is the main function for handing the \\ce and \\pu commands.\n  //  It takes the argument to \\ce or \\pu and returns the corresponding TeX string.\n  //\n\n  var chemParse = function (tokens, stateMachine) {\n    // Recreate the argument string from Temml's array of tokens.\n    var str = \"\";\n    var expectedLoc = tokens.length && tokens[tokens.length - 1].loc.start\n    for (var i = tokens.length - 1; i >= 0; i--) {\n      if(tokens[i].loc.start > expectedLoc) {\n        // context.consumeArgs has eaten a space.\n        str += \" \";\n        expectedLoc = tokens[i].loc.start;\n      }\n      str += tokens[i].text;\n      expectedLoc += tokens[i].text.length;\n    }\n    // Call the mhchem core parser.\n    var tex = texify.go(mhchemParser.go(str, stateMachine));\n    return tex;\n  };\n\n  //\n  // Core parser for mhchem syntax  (recursive)\n  //\n  /** @type {MhchemParser} */\n  var mhchemParser = {\n    //\n    // Parses mchem \\ce syntax\n    //\n    // Call like\n    //   go(\"H2O\");\n    //\n    go: function (input, stateMachine) {\n      if (!input) { return []; }\n      if (stateMachine === undefined) { stateMachine = 'ce'; }\n      var state = '0';\n\n      //\n      // String buffers for parsing:\n      //\n      // buffer.a == amount\n      // buffer.o == element\n      // buffer.b == left-side superscript\n      // buffer.p == left-side subscript\n      // buffer.q == right-side subscript\n      // buffer.d == right-side superscript\n      //\n      // buffer.r == arrow\n      // buffer.rdt == arrow, script above, type\n      // buffer.rd == arrow, script above, content\n      // buffer.rqt == arrow, script below, type\n      // buffer.rq == arrow, script below, content\n      //\n      // buffer.text_\n      // buffer.rm\n      // etc.\n      //\n      // buffer.parenthesisLevel == int, starting at 0\n      // buffer.sb == bool, space before\n      // buffer.beginsWithBond == bool\n      //\n      // These letters are also used as state names.\n      //\n      // Other states:\n      // 0 == begin of main part (arrow/operator unlikely)\n      // 1 == next entity\n      // 2 == next entity (arrow/operator unlikely)\n      // 3 == next atom\n      // c == macro\n      //\n      /** @type {Buffer} */\n      var buffer = {};\n      buffer['parenthesisLevel'] = 0;\n\n      input = input.replace(/\\n/g, \" \");\n      input = input.replace(/[\\u2212\\u2013\\u2014\\u2010]/g, \"-\");\n      input = input.replace(/[\\u2026]/g, \"...\");\n\n      //\n      // Looks through mhchemParser.transitions, to execute a matching action\n      // (recursive)\n      //\n      var lastInput;\n      var watchdog = 10;\n      /** @type {ParserOutput[]} */\n      var output = [];\n      while (true) {\n        if (lastInput !== input) {\n          watchdog = 10;\n          lastInput = input;\n        } else {\n          watchdog--;\n        }\n        //\n        // Find actions in transition table\n        //\n        var machine = mhchemParser.stateMachines[stateMachine];\n        var t = machine.transitions[state] || machine.transitions['*'];\n        iterateTransitions:\n        for (var i=0; i<t.length; i++) {\n          var matches = mhchemParser.patterns.match_(t[i].pattern, input);\n          if (matches) {\n            //\n            // Execute actions\n            //\n            var task = t[i].task;\n            for (var iA=0; iA<task.action_.length; iA++) {\n              var o;\n              //\n              // Find and execute action\n              //\n              if (machine.actions[task.action_[iA].type_]) {\n                o = machine.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n              } else if (mhchemParser.actions[task.action_[iA].type_]) {\n                o = mhchemParser.actions[task.action_[iA].type_](buffer, matches.match_, task.action_[iA].option);\n              } else {\n                throw [\"MhchemBugA\", \"mhchem bug A. Please report. (\" + task.action_[iA].type_ + \")\"];  // Trying to use non-existing action\n              }\n              //\n              // Add output\n              //\n              mhchemParser.concatArray(output, o);\n            }\n            //\n            // Set next state,\n            // Shorten input,\n            // Continue with next character\n            //   (= apply only one transition per position)\n            //\n            state = task.nextState || state;\n            if (input.length > 0) {\n              if (!task.revisit) {\n                input = matches.remainder;\n              }\n              if (!task.toContinue) {\n                break iterateTransitions;\n              }\n            } else {\n              return output;\n            }\n          }\n        }\n        //\n        // Prevent infinite loop\n        //\n        if (watchdog <= 0) {\n          throw [\"MhchemBugU\", \"mhchem bug U. Please report.\"];  // Unexpected character\n        }\n      }\n    },\n    concatArray: function (a, b) {\n      if (b) {\n        if (Array.isArray(b)) {\n          for (var iB=0; iB<b.length; iB++) {\n            a.push(b[iB]);\n          }\n        } else {\n          a.push(b);\n        }\n      }\n    },\n\n    patterns: {\n      //\n      // Matching patterns\n      // either regexps or function that return null or {match_:\"a\", remainder:\"bc\"}\n      //\n      patterns: {\n        // property names must not look like integers (\"2\") for correct property traversal order, later on\n        'empty': /^$/,\n        'else': /^./,\n        'else2': /^./,\n        'space': /^\\s/,\n        'space A': /^\\s(?=[A-Z\\\\$])/,\n        'space$': /^\\s$/,\n        'a-z': /^[a-z]/,\n        'x': /^x/,\n        'x$': /^x$/,\n        'i$': /^i$/,\n        'letters': /^(?:[a-zA-Z\\u03B1-\\u03C9\\u0391-\\u03A9?@]|(?:\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))))+/,\n        '\\\\greek': /^\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega|Gamma|Delta|Theta|Lambda|Xi|Pi|Sigma|Upsilon|Phi|Psi|Omega)(?:\\s+|\\{\\}|(?![a-zA-Z]))/,\n        'one lowercase latin letter $': /^(?:([a-z])(?:$|[^a-zA-Z]))$/,\n        '$one lowercase latin letter$ $': /^\\$(?:([a-z])(?:$|[^a-zA-Z]))\\$$/,\n        'one lowercase greek letter $': /^(?:\\$?[\\u03B1-\\u03C9]\\$?|\\$?\\\\(?:alpha|beta|gamma|delta|epsilon|zeta|eta|theta|iota|kappa|lambda|mu|nu|xi|omicron|pi|rho|sigma|tau|upsilon|phi|chi|psi|omega)\\s*\\$?)(?:\\s+|\\{\\}|(?![a-zA-Z]))$/,\n        'digits': /^[0-9]+/,\n        '-9.,9': /^[+\\-]?(?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))/,\n        '-9.,9 no missing 0': /^[+\\-]?[0-9]+(?:[.,][0-9]+)?/,\n        '(-)(9.,9)(e)(99)': function (input) {\n          var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))?(\\((?:[0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+))\\))?(?:([eE]|\\s*(\\*|x|\\\\times|\\u00D7)\\s*10\\^)([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\}))?/);\n          if (m && m[0]) {\n            return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        '(-)(9)^(-9)': function (input) {\n          var m = input.match(/^(\\+\\-|\\+\\/\\-|\\+|\\-|\\\\pm\\s?)?([0-9]+(?:[,.][0-9]+)?|[0-9]*(?:\\.[0-9]+)?)\\^([+\\-]?[0-9]+|\\{[+\\-]?[0-9]+\\})/);\n          if (m && m[0]) {\n            return { match_: m.splice(1), remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        'state of aggregation $': function (input) {  // ... or crystal system\n          var a = mhchemParser.patterns.findObserveGroups(input, \"\", /^\\([a-z]{1,3}(?=[\\),])/, \")\", \"\");  // (aq), (aq,$\\infty$), (aq, sat)\n          if (a  &&  a.remainder.match(/^($|[\\s,;\\)\\]\\}])/)) { return a; }  //  AND end of 'phrase'\n          var m = input.match(/^(?:\\((?:\\\\ca\\s?)?\\$[amothc]\\$\\))/);  // OR crystal system ($o$) (\\ca$c$)\n          if (m) {\n            return { match_: m[0], remainder: input.substr(m[0].length) };\n          }\n          return null;\n        },\n        '_{(state of aggregation)}$': /^_\\{(\\([a-z]{1,3}\\))\\}/,\n        '{[(': /^(?:\\\\\\{|\\[|\\()/,\n        ')]}': /^(?:\\)|\\]|\\\\\\})/,\n        ', ': /^[,;]\\s*/,\n        ',': /^[,;]/,\n        '.': /^[.]/,\n        '. ': /^([.\\u22C5\\u00B7\\u2022])\\s*/,\n        '...': /^\\.\\.\\.(?=$|[^.])/,\n        '* ': /^([*])\\s*/,\n        '^{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^{\", \"\", \"\", \"}\"); },\n        '^($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", \"$\", \"$\", \"\"); },\n        '^a': /^\\^([0-9]+|[^\\\\_])/,\n        '^\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '^\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"^\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '^\\\\x': /^\\^(\\\\[a-zA-Z]+)\\s*/,\n        '^(-1)': /^\\^(-?\\d+)/,\n        '\\'': /^'/,\n        '_{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_{\", \"\", \"\", \"}\"); },\n        '_($...$)': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", \"$\", \"$\", \"\"); },\n        '_9': /^_([+\\-]?[0-9]+|[^\\\\])/,\n        '_\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '_\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"_\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '_\\\\x': /^_(\\\\[a-zA-Z]+)\\s*/,\n        '^_': /^(?:\\^(?=_)|\\_(?=\\^)|[\\^_]$)/,\n        '{}': /^\\{\\}/,\n        '{...}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"{\", \"}\", \"\"); },\n        '{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"{\", \"\", \"\", \"}\"); },\n        '$...$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\"); },\n        '${(...)}$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"${\", \"\", \"\", \"}$\"); },\n        '$(...)$': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"$\", \"\", \"\", \"$\"); },\n        '=<>': /^[=<>]/,\n        '#': /^[#\\u2261]/,\n        '+': /^\\+/,\n        '-$': /^-(?=[\\s_},;\\]/]|$|\\([a-z]+\\))/,  // -space -, -; -] -/ -$ -state-of-aggregation\n        '-9': /^-(?=[0-9])/,\n        '- orbital overlap': /^-(?=(?:[spd]|sp)(?:$|[\\s,;\\)\\]\\}]))/,\n        '-': /^-/,\n        'pm-operator': /^(?:\\\\pm|\\$\\\\pm\\$|\\+-|\\+\\/-)/,\n        'operator': /^(?:\\+|(?:[\\-=<>]|<<|>>|\\\\approx|\\$\\\\approx\\$)(?=\\s|$|-?[0-9]))/,\n        'arrowUpDown': /^(?:v|\\(v\\)|\\^|\\(\\^\\))(?=$|[\\s,;\\)\\]\\}])/,\n        '\\\\bond{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\bond{\", \"\", \"\", \"}\"); },\n        '->': /^(?:<->|<-->|->|<-|<=>>|<<=>|<=>|[\\u2192\\u27F6\\u21CC])/,\n        'CMT': /^[CMT](?=\\[)/,\n        '[(...)]': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"[\", \"\", \"\", \"]\"); },\n        '1st-level escape': /^(&|\\\\\\\\|\\\\hline)\\s*/,\n        '\\\\,': /^(?:\\\\[,\\ ;:])/,  // \\\\x - but output no space before\n        '\\\\x{}{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\", \"\", \"{\", \"}\", \"\", true); },\n        '\\\\x{}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\", /^\\\\[a-zA-Z]+\\{/, \"}\", \"\"); },\n        '\\\\ca': /^\\\\ca(?:\\s+|(?![a-zA-Z]))/,\n        '\\\\x': /^(?:\\\\[a-zA-Z]+\\s*|\\\\[_&{}%])/,\n        'orbital': /^(?:[0-9]{1,2}[spdfgh]|[0-9]{0,2}sp)(?=$|[^a-zA-Z])/,  // only those with numbers in front, because the others will be formatted correctly anyway\n        'others': /^[\\/~|]/,\n        '\\\\frac{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\frac{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\overset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\overset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\underset{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underset{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\underbrace{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\underbrace{\", \"\", \"\", \"}_\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\color{(...)}0': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\"); },\n        '\\\\color{(...)}{(...)}1': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color{\", \"\", \"\", \"}\", \"{\", \"\", \"\", \"}\"); },\n        '\\\\color(...){(...)}2': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\color\", \"\\\\\", \"\", /^(?=\\{)/, \"{\", \"\", \"\", \"}\"); },\n        '\\\\ce{(...)}': function (input) { return mhchemParser.patterns.findObserveGroups(input, \"\\\\ce{\", \"\", \"\", \"}\"); },\n        'oxidation$': /^(?:[+-][IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,\n        'd-oxidation$': /^(?:[+-]?\\s?[IVX]+|\\\\pm\\s*0|\\$\\\\pm\\$\\s*0)$/,  // 0 could be oxidation or charge\n        'roman numeral': /^[IVX]+/,\n        '1/2$': /^[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+(?:\\$[a-z]\\$|[a-z])?$/,\n        'amount': function (input) {\n          var match;\n          // e.g. 2, 0.5, 1/2, -2, n/2, +;  $a$ could be added later in parsing\n          match = input.match(/^(?:(?:(?:\\([+\\-]?[0-9]+\\/[0-9]+\\)|[+\\-]?(?:[0-9]+|\\$[a-z]\\$|[a-z])\\/[0-9]+|[+\\-]?[0-9]+[.,][0-9]+|[+\\-]?\\.[0-9]+|[+\\-]?[0-9]+)(?:[a-z](?=\\s*[A-Z]))?)|[+\\-]?[a-z](?=\\s*[A-Z])|\\+(?!\\s))/);\n          if (match) {\n            return { match_: match[0], remainder: input.substr(match[0].length) };\n          }\n          var a = mhchemParser.patterns.findObserveGroups(input, \"\", \"$\", \"$\", \"\");\n          if (a) {  // e.g. $2n-1$, $-$\n            match = a.match_.match(/^\\$(?:\\(?[+\\-]?(?:[0-9]*[a-z]?[+\\-])?[0-9]*[a-z](?:[+\\-][0-9]*[a-z]?)?\\)?|\\+|-)\\$$/);\n            if (match) {\n              return { match_: match[0], remainder: input.substr(match[0].length) };\n            }\n          }\n          return null;\n        },\n        'amount2': function (input) { return this['amount'](input); },\n        '(KV letters),': /^(?:[A-Z][a-z]{0,2}|i)(?=,)/,\n        'formula$': function (input) {\n          if (input.match(/^\\([a-z]+\\)$/)) { return null; }  // state of aggregation = no formula\n          var match = input.match(/^(?:[a-z]|(?:[0-9\\ \\+\\-\\,\\.\\(\\)]+[a-z])+[0-9\\ \\+\\-\\,\\.\\(\\)]*|(?:[a-z][0-9\\ \\+\\-\\,\\.\\(\\)]+)+[a-z]?)$/);\n          if (match) {\n            return { match_: match[0], remainder: input.substr(match[0].length) };\n          }\n          return null;\n        },\n        'uprightEntities': /^(?:pH|pOH|pC|pK|iPr|iBu)(?=$|[^a-zA-Z])/,\n        '/': /^\\s*(\\/)\\s*/,\n        '//': /^\\s*(\\/\\/)\\s*/,\n        '*': /^\\s*[*.]\\s*/\n      },\n      findObserveGroups: function (input, begExcl, begIncl, endIncl, endExcl, beg2Excl, beg2Incl, end2Incl, end2Excl, combine) {\n        /** @type {{(input: string, pattern: string | RegExp): string | string[] | null;}} */\n        var _match = function (input, pattern) {\n          if (typeof pattern === \"string\") {\n            if (input.indexOf(pattern) !== 0) { return null; }\n            return pattern;\n          } else {\n            var match = input.match(pattern);\n            if (!match) { return null; }\n            return match[0];\n          }\n        };\n        /** @type {{(input: string, i: number, endChars: string | RegExp): {endMatchBegin: number, endMatchEnd: number} | null;}} */\n        var _findObserveGroups = function (input, i, endChars) {\n          var braces = 0;\n          while (i < input.length) {\n            var a = input.charAt(i);\n            var match = _match(input.substr(i), endChars);\n            if (match !== null  &&  braces === 0) {\n              return { endMatchBegin: i, endMatchEnd: i + match.length };\n            } else if (a === \"{\") {\n              braces++;\n            } else if (a === \"}\") {\n              if (braces === 0) {\n                throw [\"ExtraCloseMissingOpen\", \"Extra close brace or missing open brace\"];\n              } else {\n                braces--;\n              }\n            }\n            i++;\n          }\n          if (braces > 0) {\n            return null;\n          }\n          return null;\n        };\n        var match = _match(input, begExcl);\n        if (match === null) { return null; }\n        input = input.substr(match.length);\n        match = _match(input, begIncl);\n        if (match === null) { return null; }\n        var e = _findObserveGroups(input, match.length, endIncl || endExcl);\n        if (e === null) { return null; }\n        var match1 = input.substring(0, (endIncl ? e.endMatchEnd : e.endMatchBegin));\n        if (!(beg2Excl || beg2Incl)) {\n          return {\n            match_: match1,\n            remainder: input.substr(e.endMatchEnd)\n          };\n        } else {\n          var group2 = this.findObserveGroups(input.substr(e.endMatchEnd), beg2Excl, beg2Incl, end2Incl, end2Excl);\n          if (group2 === null) { return null; }\n          /** @type {string[]} */\n          var matchRet = [match1, group2.match_];\n          return {\n            match_: (combine ? matchRet.join(\"\") : matchRet),\n            remainder: group2.remainder\n          };\n        }\n      },\n\n      //\n      // Matching function\n      // e.g. match(\"a\", input) will look for the regexp called \"a\" and see if it matches\n      // returns null or {match_:\"a\", remainder:\"bc\"}\n      //\n      match_: function (m, input) {\n        var pattern = mhchemParser.patterns.patterns[m];\n        if (pattern === undefined) {\n          throw [\"MhchemBugP\", \"mhchem bug P. Please report. (\" + m + \")\"];  // Trying to use non-existing pattern\n        } else if (typeof pattern === \"function\") {\n          return mhchemParser.patterns.patterns[m](input);  // cannot use cached var pattern here, because some pattern functions need this===mhchemParser\n        } else {  // RegExp\n          var match = input.match(pattern);\n          if (match) {\n            var mm;\n            if (match[2]) {\n              mm = [ match[1], match[2] ];\n            } else if (match[1]) {\n              mm = match[1];\n            } else {\n              mm = match[0];\n            }\n            return { match_: mm, remainder: input.substr(match[0].length) };\n          }\n          return null;\n        }\n      }\n    },\n\n    //\n    // Generic state machine actions\n    //\n    actions: {\n      'a=': function (buffer, m) { buffer.a = (buffer.a || \"\") + m; },\n      'b=': function (buffer, m) { buffer.b = (buffer.b || \"\") + m; },\n      'p=': function (buffer, m) { buffer.p = (buffer.p || \"\") + m; },\n      'o=': function (buffer, m) { buffer.o = (buffer.o || \"\") + m; },\n      'q=': function (buffer, m) { buffer.q = (buffer.q || \"\") + m; },\n      'd=': function (buffer, m) { buffer.d = (buffer.d || \"\") + m; },\n      'rm=': function (buffer, m) { buffer.rm = (buffer.rm || \"\") + m; },\n      'text=': function (buffer, m) { buffer.text_ = (buffer.text_ || \"\") + m; },\n      'insert': function (buffer, m, a) { return { type_: a }; },\n      'insert+p1': function (buffer, m, a) { return { type_: a, p1: m }; },\n      'insert+p1+p2': function (buffer, m, a) { return { type_: a, p1: m[0], p2: m[1] }; },\n      'copy': function (buffer, m) { return m; },\n      'rm': function (buffer, m) { return { type_: 'rm', p1: m || \"\"}; },\n      'text': function (buffer, m) { return mhchemParser.go(m, 'text'); },\n      '{text}': function (buffer, m) {\n        var ret = [ \"{\" ];\n        mhchemParser.concatArray(ret, mhchemParser.go(m, 'text'));\n        ret.push(\"}\");\n        return ret;\n      },\n      'tex-math': function (buffer, m) { return mhchemParser.go(m, 'tex-math'); },\n      'tex-math tight': function (buffer, m) { return mhchemParser.go(m, 'tex-math tight'); },\n      'bond': function (buffer, m, k) { return { type_: 'bond', kind_: k || m }; },\n      'color0-output': function (buffer, m) { return { type_: 'color0', color: m[0] }; },\n      'ce': function (buffer, m) { return mhchemParser.go(m); },\n      '1/2': function (buffer, m) {\n        /** @type {ParserOutput[]} */\n        var ret = [];\n        if (m.match(/^[+\\-]/)) {\n          ret.push(m.substr(0, 1));\n          m = m.substr(1);\n        }\n        var n = m.match(/^([0-9]+|\\$[a-z]\\$|[a-z])\\/([0-9]+)(\\$[a-z]\\$|[a-z])?$/);\n        n[1] = n[1].replace(/\\$/g, \"\");\n        ret.push({ type_: 'frac', p1: n[1], p2: n[2] });\n        if (n[3]) {\n          n[3] = n[3].replace(/\\$/g, \"\");\n          ret.push({ type_: 'tex-math', p1: n[3] });\n        }\n        return ret;\n      },\n      '9,9': function (buffer, m) { return mhchemParser.go(m, '9,9'); }\n    },\n    //\n    // createTransitions\n    // convert  { 'letter': { 'state': { action_: 'output' } } }  to  { 'state' => [ { pattern: 'letter', task: { action_: [{type_: 'output'}] } } ] }\n    // with expansion of 'a|b' to 'a' and 'b' (at 2 places)\n    //\n    createTransitions: function (o) {\n      var pattern, state;\n      /** @type {string[]} */\n      var stateArray;\n      var i;\n      //\n      // 1. Collect all states\n      //\n      /** @type {Transitions} */\n      var transitions = {};\n      for (pattern in o) {\n        for (state in o[pattern]) {\n          stateArray = state.split(\"|\");\n          o[pattern][state].stateArray = stateArray;\n          for (i=0; i<stateArray.length; i++) {\n            transitions[stateArray[i]] = [];\n          }\n        }\n      }\n      //\n      // 2. Fill states\n      //\n      for (pattern in o) {\n        for (state in o[pattern]) {\n          stateArray = o[pattern][state].stateArray || [];\n          for (i=0; i<stateArray.length; i++) {\n            //\n            // 2a. Normalize actions into array:  'text=' ==> [{type_:'text='}]\n            // (Note to myself: Resolving the function here would be problematic. It would need .bind (for *this*) and currying (for *option*).)\n            //\n            /** @type {any} */\n            var p = o[pattern][state];\n            if (p.action_) {\n              p.action_ = [].concat(p.action_);\n              for (var k=0; k<p.action_.length; k++) {\n                if (typeof p.action_[k] === \"string\") {\n                  p.action_[k] = { type_: p.action_[k] };\n                }\n              }\n            } else {\n              p.action_ = [];\n            }\n            //\n            // 2.b Multi-insert\n            //\n            var patternArray = pattern.split(\"|\");\n            for (var j=0; j<patternArray.length; j++) {\n              if (stateArray[i] === '*') {  // insert into all\n                for (var t in transitions) {\n                  transitions[t].push({ pattern: patternArray[j], task: p });\n                }\n              } else {\n                transitions[stateArray[i]].push({ pattern: patternArray[j], task: p });\n              }\n            }\n          }\n        }\n      }\n      return transitions;\n    },\n    stateMachines: {}\n  };\n\n  //\n  // Definition of state machines\n  //\n  mhchemParser.stateMachines = {\n    //\n    // \\ce state machines\n    //\n    //#region ce\n    'ce': {  // main parser\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        'else':  {\n          '0|1|2': { action_: 'beginsWithBond=false', revisit: true, toContinue: true } },\n        'oxidation$': {\n          '0': { action_: 'oxidation-output' } },\n        'CMT': {\n          'r': { action_: 'rdt=', nextState: 'rt' },\n          'rd': { action_: 'rqt=', nextState: 'rdt' } },\n        'arrowUpDown': {\n          '0|1|2|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '1' } },\n        'uprightEntities': {\n          '0|1|2': { action_: [ 'o=', 'output' ], nextState: '1' } },\n        'orbital': {\n          '0|1|2|3': { action_: 'o=', nextState: 'o' } },\n        '->': {\n          '0|1|2|3': { action_: 'r=', nextState: 'r' },\n          'a|as': { action_: [ 'output', 'r=' ], nextState: 'r' },\n          '*': { action_: [ 'output', 'r=' ], nextState: 'r' } },\n        '+': {\n          'o': { action_: 'd= kv',  nextState: 'd' },\n          'd|D': { action_: 'd=', nextState: 'd' },\n          'q': { action_: 'd=',  nextState: 'qd' },\n          'qd|qD': { action_: 'd=', nextState: 'qd' },\n          'dq': { action_: [ 'output', 'd=' ], nextState: 'd' },\n          '3': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n        'amount': {\n          '0|2': { action_: 'a=', nextState: 'a' } },\n        'pm-operator': {\n          '0|1|2|a|as': { action_: [ 'sb=false', 'output', { type_: 'operator', option: '\\\\pm' } ], nextState: '0' } },\n        'operator': {\n          '0|1|2|a|as': { action_: [ 'sb=false', 'output', 'operator' ], nextState: '0' } },\n        '-$': {\n          'o|q': { action_: [ 'charge or bond', 'output' ],  nextState: 'qd' },\n          'd': { action_: 'd=', nextState: 'd' },\n          'D': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          'q': { action_: 'd=',  nextState: 'qd' },\n          'qd': { action_: 'd=', nextState: 'qd' },\n          'qD|dq': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n        '-9': {\n          '3|o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '3' } },\n        '- orbital overlap': {\n          'o': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n          'd': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' } },\n        '-': {\n          '0|1|2': { action_: [ { type_: 'output', option: 1 }, 'beginsWithBond=true', { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          '3': { action_: { type_: 'bond', option: \"-\" } },\n          'a': { action_: [ 'output', { type_: 'insert', option: 'hyphen' } ], nextState: '2' },\n          'as': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"-\" } ], nextState: '3' },\n          'b': { action_: 'b=' },\n          'o': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n          'q': { action_: { type_: '- after o/d', option: false }, nextState: '2' },\n          'd|qd|dq': { action_: { type_: '- after o/d', option: true }, nextState: '2' },\n          'D|qD|p': { action_: [ 'output', { type_: 'bond', option: \"-\" } ], nextState: '3' } },\n        'amount2': {\n          '1|3': { action_: 'a=', nextState: 'a' } },\n        'letters': {\n          '0|1|2|3|a|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },\n          'q|dq': { action_: ['output', 'o='], nextState: 'o' },\n          'd|D|qd|qD': { action_: 'o after d', nextState: 'o' } },\n        'digits': {\n          'o': { action_: 'q=', nextState: 'q' },\n          'd|D': { action_: 'q=', nextState: 'dq' },\n          'q': { action_: [ 'output', 'o=' ], nextState: 'o' },\n          'a': { action_: 'o=', nextState: 'o' } },\n        'space A': {\n          'b|p|bp': {} },\n        'space': {\n          'a': { nextState: 'as' },\n          '0': { action_: 'sb=false' },\n          '1|2': { action_: 'sb=true' },\n          'r|rt|rd|rdt|rdq': { action_: 'output', nextState: '0' },\n          '*': { action_: [ 'output', 'sb=true' ], nextState: '1'} },\n        '1st-level escape': {\n          '1|2': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ] },\n          '*': { action_: [ 'output', { type_: 'insert+p1', option: '1st-level escape' } ], nextState: '0' } },\n        '[(...)]': {\n          'r|rt': { action_: 'rd=', nextState: 'rd' },\n          'rd|rdt': { action_: 'rq=', nextState: 'rdq' } },\n        '...': {\n          'o|d|D|dq|qd|qD': { action_: [ 'output', { type_: 'bond', option: \"...\" } ], nextState: '3' },\n          '*': { action_: [ { type_: 'output', option: 1 }, { type_: 'insert', option: 'ellipsis' } ], nextState: '1' } },\n        '. |* ': {\n          '*': { action_: [ 'output', { type_: 'insert', option: 'addition compound' } ], nextState: '1' } },\n        'state of aggregation $': {\n          '*': { action_: [ 'output', 'state of aggregation' ], nextState: '1' } },\n        '{[(': {\n          'a|as|o': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n          '0|1|2|3': { action_: [ 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' },\n          '*': { action_: [ 'output', 'o=', 'output', 'parenthesisLevel++' ], nextState: '2' } },\n        ')]}': {\n          '0|1|2|3|b|p|bp|o': { action_: [ 'o=', 'parenthesisLevel--' ], nextState: 'o' },\n          'a|as|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=', 'parenthesisLevel--' ], nextState: 'o' } },\n        ', ': {\n          '*': { action_: [ 'output', 'comma' ], nextState: '0' } },\n        '^_': {  // ^ and _ without a sensible argument\n          '*': { } },\n        '^{(...)}|^($...$)': {\n          '0|1|2|as': { action_: 'b=', nextState: 'b' },\n          'p': { action_: 'b=', nextState: 'bp' },\n          '3|o': { action_: 'd= kv', nextState: 'D' },\n          'q': { action_: 'd=', nextState: 'qD' },\n          'd|D|qd|qD|dq': { action_: [ 'output', 'd=' ], nextState: 'D' } },\n        '^a|^\\\\x{}{}|^\\\\x{}|^\\\\x|\\'': {\n          '0|1|2|as': { action_: 'b=', nextState: 'b' },\n          'p': { action_: 'b=', nextState: 'bp' },\n          '3|o': { action_: 'd= kv', nextState: 'd' },\n          'q': { action_: 'd=', nextState: 'qd' },\n          'd|qd|D|qD': { action_: 'd=' },\n          'dq': { action_: [ 'output', 'd=' ], nextState: 'd' } },\n        '_{(state of aggregation)}$': {\n          'd|D|q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n        '_{(...)}|_($...$)|_9|_\\\\x{}{}|_\\\\x{}|_\\\\x': {\n          '0|1|2|as': { action_: 'p=', nextState: 'p' },\n          'b': { action_: 'p=', nextState: 'bp' },\n          '3|o': { action_: 'q=', nextState: 'q' },\n          'd|D': { action_: 'q=', nextState: 'dq' },\n          'q|qd|qD|dq': { action_: [ 'output', 'q=' ], nextState: 'q' } },\n        '=<>': {\n          '0|1|2|3|a|as|o|q|d|D|qd|qD|dq': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: '3' } },\n        '#': {\n          '0|1|2|3|a|as|o': { action_: [ { type_: 'output', option: 2 }, { type_: 'bond', option: \"#\" } ], nextState: '3' } },\n        '{}': {\n          '*': { action_: { type_: 'output', option: 1 },  nextState: '1' } },\n        '{...}': {\n          '0|1|2|3|a|as|b|p|bp': { action_: 'o=', nextState: 'o' },\n          'o|d|D|q|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n        '$...$': {\n          'a': { action_: 'a=' },  // 2$n$\n          '0|1|2|3|as|b|p|bp|o': { action_: 'o=', nextState: 'o' },  // not 'amount'\n          'as|o': { action_: 'o=' },\n          'q|d|D|qd|qD|dq': { action_: [ 'output', 'o=' ], nextState: 'o' } },\n        '\\\\bond{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'bond' ], nextState: \"3\" } },\n        '\\\\frac{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'frac-output' ], nextState: '3' } },\n        '\\\\overset{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'overset-output' ], nextState: '3' } },\n        '\\\\underset{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'underset-output' ], nextState: '3' } },\n        '\\\\underbrace{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'underbrace-output' ], nextState: '3' } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'color-output' ], nextState: '3' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'color0-output' ] } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ { type_: 'output', option: 2 }, 'ce' ], nextState: '3' } },\n        '\\\\,': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '1' } },\n        '\\\\x{}{}|\\\\x{}|\\\\x': {\n          '0|1|2|3|a|as|b|p|bp|o|c0': { action_: [ 'o=', 'output' ], nextState: '3' },\n          '*': { action_: ['output', 'o=', 'output' ], nextState: '3' } },\n        'others': {\n          '*': { action_: [ { type_: 'output', option: 1 }, 'copy' ], nextState: '3' } },\n        'else2': {\n          'a': { action_: 'a to o', nextState: 'o', revisit: true },\n          'as': { action_: [ 'output', 'sb=true' ], nextState: '1', revisit: true },\n          'r|rt|rd|rdt|rdq': { action_: [ 'output' ], nextState: '0', revisit: true },\n          '*': { action_: [ 'output', 'copy' ], nextState: '3' } }\n      }),\n      actions: {\n        'o after d': function (buffer, m) {\n          var ret;\n          if ((buffer.d || \"\").match(/^[0-9]+$/)) {\n            var tmp = buffer.d;\n            buffer.d = undefined;\n            ret = this['output'](buffer);\n            buffer.b = tmp;\n          } else {\n            ret = this['output'](buffer);\n          }\n          mhchemParser.actions['o='](buffer, m);\n          return ret;\n        },\n        'd= kv': function (buffer, m) {\n          buffer.d = m;\n          buffer.dType = 'kv';\n        },\n        'charge or bond': function (buffer, m) {\n          if (buffer['beginsWithBond']) {\n            /** @type {ParserOutput[]} */\n            var ret = [];\n            mhchemParser.concatArray(ret, this['output'](buffer));\n            mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n            return ret;\n          } else {\n            buffer.d = m;\n          }\n        },\n        '- after o/d': function (buffer, m, isAfterD) {\n          var c1 = mhchemParser.patterns.match_('orbital', buffer.o || \"\");\n          var c2 = mhchemParser.patterns.match_('one lowercase greek letter $', buffer.o || \"\");\n          var c3 = mhchemParser.patterns.match_('one lowercase latin letter $', buffer.o || \"\");\n          var c4 = mhchemParser.patterns.match_('$one lowercase latin letter$ $', buffer.o || \"\");\n          var hyphenFollows =  m===\"-\" && ( c1 && c1.remainder===\"\"  ||  c2  ||  c3  ||  c4 );\n          if (hyphenFollows && !buffer.a && !buffer.b && !buffer.p && !buffer.d && !buffer.q && !c1 && c3) {\n            buffer.o = '$' + buffer.o + '$';\n          }\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (hyphenFollows) {\n            mhchemParser.concatArray(ret, this['output'](buffer));\n            ret.push({ type_: 'hyphen' });\n          } else {\n            c1 = mhchemParser.patterns.match_('digits', buffer.d || \"\");\n            if (isAfterD && c1 && c1.remainder==='') {\n              mhchemParser.concatArray(ret, mhchemParser.actions['d='](buffer, m));\n              mhchemParser.concatArray(ret, this['output'](buffer));\n            } else {\n              mhchemParser.concatArray(ret, this['output'](buffer));\n              mhchemParser.concatArray(ret, mhchemParser.actions['bond'](buffer, m, \"-\"));\n            }\n          }\n          return ret;\n        },\n        'a to o': function (buffer) {\n          buffer.o = buffer.a;\n          buffer.a = undefined;\n        },\n        'sb=true': function (buffer) { buffer.sb = true; },\n        'sb=false': function (buffer) { buffer.sb = false; },\n        'beginsWithBond=true': function (buffer) { buffer['beginsWithBond'] = true; },\n        'beginsWithBond=false': function (buffer) { buffer['beginsWithBond'] = false; },\n        'parenthesisLevel++': function (buffer) { buffer['parenthesisLevel']++; },\n        'parenthesisLevel--': function (buffer) { buffer['parenthesisLevel']--; },\n        'state of aggregation': function (buffer, m) {\n          return { type_: 'state of aggregation', p1: mhchemParser.go(m, 'o') };\n        },\n        'comma': function (buffer, m) {\n          var a = m.replace(/\\s*$/, '');\n          var withSpace = (a !== m);\n          if (withSpace  &&  buffer['parenthesisLevel'] === 0) {\n            return { type_: 'comma enumeration L', p1: a };\n          } else {\n            return { type_: 'comma enumeration M', p1: a };\n          }\n        },\n        'output': function (buffer, m, entityFollows) {\n          // entityFollows:\n          //   undefined = if we have nothing else to output, also ignore the just read space (buffer.sb)\n          //   1 = an entity follows, never omit the space if there was one just read before (can only apply to state 1)\n          //   2 = 1 + the entity can have an amount, so output a\\, instead of converting it to o (can only apply to states a|as)\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret;\n          if (!buffer.r) {\n            ret = [];\n            if (!buffer.a && !buffer.b && !buffer.p && !buffer.o && !buffer.q && !buffer.d && !entityFollows) {\n              //ret = [];\n            } else {\n              if (buffer.sb) {\n                ret.push({ type_: 'entitySkip' });\n              }\n              if (!buffer.o && !buffer.q && !buffer.d && !buffer.b && !buffer.p && entityFollows!==2) {\n                buffer.o = buffer.a;\n                buffer.a = undefined;\n              } else if (!buffer.o && !buffer.q && !buffer.d && (buffer.b || buffer.p)) {\n                buffer.o = buffer.a;\n                buffer.d = buffer.b;\n                buffer.q = buffer.p;\n                buffer.a = buffer.b = buffer.p = undefined;\n              } else {\n                if (buffer.o && buffer.dType==='kv' && mhchemParser.patterns.match_('d-oxidation$', buffer.d || \"\")) {\n                  buffer.dType = 'oxidation';\n                } else if (buffer.o && buffer.dType==='kv' && !buffer.q) {\n                  buffer.dType = undefined;\n                }\n              }\n              ret.push({\n                type_: 'chemfive',\n                a: mhchemParser.go(buffer.a, 'a'),\n                b: mhchemParser.go(buffer.b, 'bd'),\n                p: mhchemParser.go(buffer.p, 'pq'),\n                o: mhchemParser.go(buffer.o, 'o'),\n                q: mhchemParser.go(buffer.q, 'pq'),\n                d: mhchemParser.go(buffer.d, (buffer.dType === 'oxidation' ? 'oxidation' : 'bd')),\n                dType: buffer.dType\n              });\n            }\n          } else {  // r\n            /** @type {ParserOutput[]} */\n            var rd;\n            if (buffer.rdt === 'M') {\n              rd = mhchemParser.go(buffer.rd, 'tex-math');\n            } else if (buffer.rdt === 'T') {\n              rd = [ { type_: 'text', p1: buffer.rd || \"\" } ];\n            } else {\n              rd = mhchemParser.go(buffer.rd);\n            }\n            /** @type {ParserOutput[]} */\n            var rq;\n            if (buffer.rqt === 'M') {\n              rq = mhchemParser.go(buffer.rq, 'tex-math');\n            } else if (buffer.rqt === 'T') {\n              rq = [ { type_: 'text', p1: buffer.rq || \"\"} ];\n            } else {\n              rq = mhchemParser.go(buffer.rq);\n            }\n            ret = {\n              type_: 'arrow',\n              r: buffer.r,\n              rd: rd,\n              rq: rq\n            };\n          }\n          for (var p in buffer) {\n            if (p !== 'parenthesisLevel'  &&  p !== 'beginsWithBond') {\n              delete buffer[p];\n            }\n          }\n          return ret;\n        },\n        'oxidation-output': function (buffer, m) {\n          var ret = [ \"{\" ];\n          mhchemParser.concatArray(ret, mhchemParser.go(m, 'oxidation'));\n          ret.push(\"}\");\n          return ret;\n        },\n        'frac-output': function (buffer, m) {\n          return { type_: 'frac-ce', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'overset-output': function (buffer, m) {\n          return { type_: 'overset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'underset-output': function (buffer, m) {\n          return { type_: 'underset', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'underbrace-output': function (buffer, m) {\n          return { type_: 'underbrace', p1: mhchemParser.go(m[0]), p2: mhchemParser.go(m[1]) };\n        },\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1]) };\n        },\n        'r=': function (buffer, m) { buffer.r = m; },\n        'rdt=': function (buffer, m) { buffer.rdt = m; },\n        'rd=': function (buffer, m) { buffer.rd = m; },\n        'rqt=': function (buffer, m) { buffer.rqt = m; },\n        'rq=': function (buffer, m) { buffer.rq = m; },\n        'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; }\n      }\n    },\n    'a': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '1', revisit: true } },\n        '$(...)$': {\n          '*': { action_: 'tex-math tight', nextState: '1' } },\n        ',': {\n          '*': { action_: { type_: 'insert', option: 'commaDecimal' } } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {}\n    },\n    'o': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '1', revisit: true } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '\\\\ca': {\n          '*': { action_: { type_: 'insert', option: 'circa' } } },\n        '\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: '{text}' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {}\n    },\n    'text': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '{...}': {\n          '*': { action_: 'text=' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '\\\\greek': {\n          '*': { action_: [ 'output', 'rm' ] } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: [ 'output', 'copy' ] } },\n        'else': {\n          '*': { action_: 'text=' } }\n      }),\n      actions: {\n        'output': function (buffer) {\n          if (buffer.text_) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'text', p1: buffer.text_ };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    'pq': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'state of aggregation $': {\n          '*': { action_: 'state of aggregation' } },\n        'i$': {\n          '0': { nextState: '!f', revisit: true } },\n        '(KV letters),': {\n          '0': { action_: 'rm', nextState: '0' } },\n        'formula$': {\n          '0': { nextState: 'f', revisit: true } },\n        '1/2$': {\n          '0': { action_: '1/2' } },\n        'else': {\n          '0': { nextState: '!f', revisit: true } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: 'text' } },\n        'a-z': {\n          'f': { action_: 'tex-math' } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '-9.,9': {\n          '*': { action_: '9,9'  } },\n        ',': {\n          '*': { action_: { type_: 'insert+p1', option: 'comma enumeration S' } } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: 'color-output' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: 'color0-output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: 'ce' } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'state of aggregation': function (buffer, m) {\n          return { type_: 'state of aggregation subscript', p1: mhchemParser.go(m, 'o') };\n        },\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'pq') };\n        }\n      }\n    },\n    'bd': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'x$': {\n          '0': { nextState: '!f', revisit: true } },\n        'formula$': {\n          '0': { nextState: 'f', revisit: true } },\n        'else': {\n          '0': { nextState: '!f', revisit: true } },\n        '-9.,9 no missing 0': {\n          '*': { action_: '9,9' } },\n        '.': {\n          '*': { action_: { type_: 'insert', option: 'electron dot' } } },\n        'a-z': {\n          'f': { action_: 'tex-math' } },\n        'x': {\n          '*': { action_: { type_: 'insert', option: 'KV x' } } },\n        'letters': {\n          '*': { action_: 'rm' } },\n        '\\'': {\n          '*': { action_: { type_: 'insert', option: 'prime' } } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        '{(...)}': {\n          '*': { action_: 'text' } },\n        '\\\\color{(...)}{(...)}1|\\\\color(...){(...)}2': {\n          '*': { action_: 'color-output' } },\n        '\\\\color{(...)}0': {\n          '*': { action_: 'color0-output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: 'ce' } },\n        '\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'copy' } },\n        'else2': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'color-output': function (buffer, m) {\n          return { type_: 'color', color1: m[0], color2: mhchemParser.go(m[1], 'bd') };\n        }\n      }\n    },\n    'oxidation': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        'roman numeral': {\n          '*': { action_: 'roman-numeral' } },\n        '${(...)}$|$(...)$': {\n          '*': { action_: 'tex-math' } },\n        'else': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'roman-numeral': function (buffer, m) { return { type_: 'roman numeral', p1: m || \"\" }; }\n      }\n    },\n    'tex-math': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ 'output', 'ce' ] } },\n        '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'o=' } },\n        'else': {\n          '*': { action_: 'o=' } }\n      }),\n      actions: {\n        'output': function (buffer) {\n          if (buffer.o) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'tex-math', p1: buffer.o };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    'tex-math tight': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '\\\\ce{(...)}': {\n          '*': { action_: [ 'output', 'ce' ] } },\n        '{...}|\\\\,|\\\\x{}{}|\\\\x{}|\\\\x': {\n          '*': { action_: 'o=' } },\n        '-|+': {\n          '*': { action_: 'tight operator' } },\n        'else': {\n          '*': { action_: 'o=' } }\n      }),\n      actions: {\n        'tight operator': function (buffer, m) { buffer.o = (buffer.o || \"\") + \"{\"+m+\"}\"; },\n        'output': function (buffer) {\n          if (buffer.o) {\n            /** @type {ParserOutput} */\n            var ret = { type_: 'tex-math', p1: buffer.o };\n            for (var p in buffer) { delete buffer[p]; }\n            return ret;\n          }\n        }\n      }\n    },\n    '9,9': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': {} },\n        ',': {\n          '*': { action_: 'comma' } },\n        'else': {\n          '*': { action_: 'copy' } }\n      }),\n      actions: {\n        'comma': function () { return { type_: 'commaDecimal' }; }\n      }\n    },\n    //#endregion\n    //\n    // \\pu state machines\n    //\n    //#region pu\n    'pu': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        'space$': {\n          '*': { action_: [ 'output', 'space' ] } },\n        '{[(|)]}': {\n          '0|a': { action_: 'copy' } },\n        '(-)(9)^(-9)': {\n          '0': { action_: 'number^', nextState: 'a' } },\n        '(-)(9.,9)(e)(99)': {\n          '0': { action_: 'enumber', nextState: 'a' } },\n        'space': {\n          '0|a': {} },\n        'pm-operator': {\n          '0|a': { action_: { type_: 'operator', option: '\\\\pm' }, nextState: '0' } },\n        'operator': {\n          '0|a': { action_: 'copy', nextState: '0' } },\n        '//': {\n          'd': { action_: 'o=', nextState: '/' } },\n        '/': {\n          'd': { action_: 'o=', nextState: '/' } },\n        '{...}|else': {\n          '0|d': { action_: 'd=', nextState: 'd' },\n          'a': { action_: [ 'space', 'd=' ], nextState: 'd' },\n          '/|q': { action_: 'q=', nextState: 'q' } }\n      }),\n      actions: {\n        'enumber': function (buffer, m) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (m[0] === \"+-\"  ||  m[0] === \"+/-\") {\n            ret.push(\"\\\\pm \");\n          } else if (m[0]) {\n            ret.push(m[0]);\n          }\n          if (m[1]) {\n            mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n            if (m[2]) {\n              if (m[2].match(/[,.]/)) {\n                mhchemParser.concatArray(ret, mhchemParser.go(m[2], 'pu-9,9'));\n              } else {\n                ret.push(m[2]);\n              }\n            }\n            m[3] = m[4] || m[3];\n            if (m[3]) {\n              m[3] = m[3].trim();\n              if (m[3] === \"e\"  ||  m[3].substr(0, 1) === \"*\") {\n                ret.push({ type_: 'cdot' });\n              } else {\n                ret.push({ type_: 'times' });\n              }\n            }\n          }\n          if (m[3]) {\n            ret.push(\"10^{\"+m[5]+\"}\");\n          }\n          return ret;\n        },\n        'number^': function (buffer, m) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          if (m[0] === \"+-\"  ||  m[0] === \"+/-\") {\n            ret.push(\"\\\\pm \");\n          } else if (m[0]) {\n            ret.push(m[0]);\n          }\n          mhchemParser.concatArray(ret, mhchemParser.go(m[1], 'pu-9,9'));\n          ret.push(\"^{\"+m[2]+\"}\");\n          return ret;\n        },\n        'operator': function (buffer, m, p1) { return { type_: 'operator', kind_: (p1 || m) }; },\n        'space': function () { return { type_: 'pu-space-1' }; },\n        'output': function (buffer) {\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret;\n          var md = mhchemParser.patterns.match_('{(...)}', buffer.d || \"\");\n          if (md  &&  md.remainder === '') { buffer.d = md.match_; }\n          var mq = mhchemParser.patterns.match_('{(...)}', buffer.q || \"\");\n          if (mq  &&  mq.remainder === '') { buffer.q = mq.match_; }\n          if (buffer.d) {\n            buffer.d = buffer.d.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n            buffer.d = buffer.d.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n          }\n          if (buffer.q) {  // fraction\n            buffer.q = buffer.q.replace(/\\u00B0C|\\^oC|\\^{o}C/g, \"{}^{\\\\circ}C\");\n            buffer.q = buffer.q.replace(/\\u00B0F|\\^oF|\\^{o}F/g, \"{}^{\\\\circ}F\");\n            var b5 = {\n              d: mhchemParser.go(buffer.d, 'pu'),\n              q: mhchemParser.go(buffer.q, 'pu')\n            };\n            if (buffer.o === '//') {\n              ret = { type_: 'pu-frac', p1: b5.d, p2: b5.q };\n            } else {\n              ret = b5.d;\n              if (b5.d.length > 1  ||  b5.q.length > 1) {\n                ret.push({ type_: ' / ' });\n              } else {\n                ret.push({ type_: '/' });\n              }\n              mhchemParser.concatArray(ret, b5.q);\n            }\n          } else {  // no fraction\n            ret = mhchemParser.go(buffer.d, 'pu-2');\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    },\n    'pu-2': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '*': { action_: 'output' } },\n        '*': {\n          '*': { action_: [ 'output', 'cdot' ], nextState: '0' } },\n        '\\\\x': {\n          '*': { action_: 'rm=' } },\n        'space': {\n          '*': { action_: [ 'output', 'space' ], nextState: '0' } },\n        '^{(...)}|^(-1)': {\n          '1': { action_: '^(-1)' } },\n        '-9.,9': {\n          '0': { action_: 'rm=', nextState: '0' },\n          '1': { action_: '^(-1)', nextState: '0' } },\n        '{...}|else': {\n          '*': { action_: 'rm=', nextState: '1' } }\n      }),\n      actions: {\n        'cdot': function () { return { type_: 'tight cdot' }; },\n        '^(-1)': function (buffer, m) { buffer.rm += \"^{\"+m+\"}\"; },\n        'space': function () { return { type_: 'pu-space-2' }; },\n        'output': function (buffer) {\n          /** @type {ParserOutput | ParserOutput[]} */\n          var ret = [];\n          if (buffer.rm) {\n            var mrm = mhchemParser.patterns.match_('{(...)}', buffer.rm || \"\");\n            if (mrm  &&  mrm.remainder === '') {\n              ret = mhchemParser.go(mrm.match_, 'pu');\n            } else {\n              ret = { type_: 'rm', p1: buffer.rm };\n            }\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    },\n    'pu-9,9': {\n      transitions: mhchemParser.createTransitions({\n        'empty': {\n          '0': { action_: 'output-0' },\n          'o': { action_: 'output-o' } },\n        ',': {\n          '0': { action_: [ 'output-0', 'comma' ], nextState: 'o' } },\n        '.': {\n          '0': { action_: [ 'output-0', 'copy' ], nextState: 'o' } },\n        'else': {\n          '*': { action_: 'text=' } }\n      }),\n      actions: {\n        'comma': function () { return { type_: 'commaDecimal' }; },\n        'output-0': function (buffer) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          buffer.text_ = buffer.text_ || \"\";\n          if (buffer.text_.length > 4) {\n            var a = buffer.text_.length % 3;\n            if (a === 0) { a = 3; }\n            for (var i=buffer.text_.length-3; i>0; i-=3) {\n              ret.push(buffer.text_.substr(i, 3));\n              ret.push({ type_: '1000 separator' });\n            }\n            ret.push(buffer.text_.substr(0, a));\n            ret.reverse();\n          } else {\n            ret.push(buffer.text_);\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        },\n        'output-o': function (buffer) {\n          /** @type {ParserOutput[]} */\n          var ret = [];\n          buffer.text_ = buffer.text_ || \"\";\n          if (buffer.text_.length > 4) {\n            var a = buffer.text_.length - 3;\n            for (var i=0; i<a; i+=3) {\n              ret.push(buffer.text_.substr(i, 3));\n              ret.push({ type_: '1000 separator' });\n            }\n            ret.push(buffer.text_.substr(i));\n          } else {\n            ret.push(buffer.text_);\n          }\n          for (var p in buffer) { delete buffer[p]; }\n          return ret;\n        }\n      }\n    }\n    //#endregion\n  };\n\n  //\n  // texify: Take MhchemParser output and convert it to TeX\n  //\n  /** @type {Texify} */\n  var texify = {\n    go: function (input, isInner) {  // (recursive, max 4 levels)\n      if (!input) { return \"\"; }\n      var res = \"\";\n      var cee = false;\n      for (var i=0; i < input.length; i++) {\n        var inputi = input[i];\n        if (typeof inputi === \"string\") {\n          res += inputi;\n        } else {\n          res += texify._go2(inputi);\n          if (inputi.type_ === '1st-level escape') { cee = true; }\n        }\n      }\n      if (!isInner && !cee && res) {\n        res = \"{\" + res + \"}\";\n      }\n      return res;\n    },\n    _goInner: function (input) {\n      if (!input) { return input; }\n      return texify.go(input, true);\n    },\n    _go2: function (buf) {\n      /** @type {undefined | string} */\n      var res;\n      switch (buf.type_) {\n        case 'chemfive':\n          res = \"\";\n          var b5 = {\n            a: texify._goInner(buf.a),\n            b: texify._goInner(buf.b),\n            p: texify._goInner(buf.p),\n            o: texify._goInner(buf.o),\n            q: texify._goInner(buf.q),\n            d: texify._goInner(buf.d)\n          };\n          //\n          // a\n          //\n          if (b5.a) {\n            if (b5.a.match(/^[+\\-]/)) { b5.a = \"{\"+b5.a+\"}\"; }\n            res += b5.a + \"\\\\,\";\n          }\n          //\n          // b and p\n          //\n          if (b5.b || b5.p) {\n            res += \"{\\\\vphantom{X}}\";\n            res += \"^{\\\\hphantom{\"+(b5.b||\"\")+\"}}_{\\\\hphantom{\"+(b5.p||\"\")+\"}}\";\n            res += \"{\\\\vphantom{X}}\";\n            // In the next two lines, I've removed \\smash[t] (ron)\n            // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n            //res += \"^{\\\\smash[t]{\\\\vphantom{2}}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n            res += \"^{\\\\vphantom{2}\\\\mathllap{\"+(b5.b||\"\")+\"}}\";\n            //res += \"_{\\\\vphantom{2}\\\\mathllap{\\\\smash[t]{\"+(b5.p||\"\")+\"}}}\";\n            res += \"_{\\\\vphantom{2}\\\\mathllap{\"+(b5.p||\"\")+\"}}\";\n          }\n          //\n          // o\n          //\n          if (b5.o) {\n            if (b5.o.match(/^[+\\-]/)) { b5.o = \"{\"+b5.o+\"}\"; }\n            res += b5.o;\n          }\n          //\n          // q and d\n          //\n          if (buf.dType === 'kv') {\n            if (b5.d || b5.q) {\n              res += \"{\\\\vphantom{X}}\";\n            }\n            if (b5.d) {\n              res += \"^{\"+b5.d+\"}\";\n            }\n            if (b5.q) {\n              // In the next line, I've removed \\smash[t] (ron)\n              // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n              //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n              res += \"_{\"+b5.q+\"}\";\n            }\n          } else if (buf.dType === 'oxidation') {\n            if (b5.d) {\n              res += \"{\\\\vphantom{X}}\";\n              res += \"^{\"+b5.d+\"}\";\n            }\n            if (b5.q) {\n              // A Firefox bug adds a bogus depth to <mphantom>, so we change \\vphantom{X} to {}\n              // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n//              res += \"{\\\\vphantom{X}}\";\n              res += \"{{}}\";\n              // In the next line, I've removed \\smash[t] (ron)\n              // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n              //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n              res += \"_{\"+b5.q+\"}\";\n            }\n          } else {\n            if (b5.q) {\n              // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n//              res += \"{\\\\vphantom{X}}\";\n              res += \"{{}}\";\n              // In the next line, I've removed \\smash[t] (ron)\n              // TODO: Revert \\smash[t] when WebKit properly renders <mpadded> w/height=\"0\"\n              //res += \"_{\\\\smash[t]{\"+b5.q+\"}}\";\n              res += \"_{\"+b5.q+\"}\";\n            }\n            if (b5.d) {\n              // TODO: Reinstate \\vphantom{X} when the Firefox bug is fixed.\n//              res += \"{\\\\vphantom{X}}\";\n              res += \"{{}}\";\n              res += \"^{\"+b5.d+\"}\";\n            }\n          }\n          break;\n        case 'rm':\n          res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          break;\n        case 'text':\n          if (buf.p1.match(/[\\^_]/)) {\n            buf.p1 = buf.p1.replace(\" \", \"~\").replace(\"-\", \"\\\\text{-}\");\n            res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          } else {\n            res = \"\\\\text{\"+buf.p1+\"}\";\n          }\n          break;\n        case 'roman numeral':\n          res = \"\\\\mathrm{\"+buf.p1+\"}\";\n          break;\n        case 'state of aggregation':\n          res = \"\\\\mskip2mu \"+texify._goInner(buf.p1);\n          break;\n        case 'state of aggregation subscript':\n          res = \"\\\\mskip1mu \"+texify._goInner(buf.p1);\n          break;\n        case 'bond':\n          res = texify._getBond(buf.kind_);\n          if (!res) {\n            throw [\"MhchemErrorBond\", \"mhchem Error. Unknown bond type (\" + buf.kind_ + \")\"];\n          }\n          break;\n        case 'frac':\n          var c = \"\\\\frac{\" + buf.p1 + \"}{\" + buf.p2 + \"}\";\n          res = \"\\\\mathchoice{\\\\textstyle\"+c+\"}{\"+c+\"}{\"+c+\"}{\"+c+\"}\";\n          break;\n        case 'pu-frac':\n          var d = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          res = \"\\\\mathchoice{\\\\textstyle\"+d+\"}{\"+d+\"}{\"+d+\"}{\"+d+\"}\";\n          break;\n        case 'tex-math':\n          res = buf.p1 + \" \";\n          break;\n        case 'frac-ce':\n          res = \"\\\\frac{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'overset':\n          res = \"\\\\overset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'underset':\n          res = \"\\\\underset{\" + texify._goInner(buf.p1) + \"}{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'underbrace':\n          res =  \"\\\\underbrace{\" + texify._goInner(buf.p1) + \"}_{\" + texify._goInner(buf.p2) + \"}\";\n          break;\n        case 'color':\n          res = \"{\\\\color{\" + buf.color1 + \"}{\" + texify._goInner(buf.color2) + \"}}\";\n          break;\n        case 'color0':\n          res = \"\\\\color{\" + buf.color + \"}\";\n          break;\n        case 'arrow':\n          var b6 = {\n            rd: texify._goInner(buf.rd),\n            rq: texify._goInner(buf.rq)\n          };\n          var arrow = texify._getArrow(buf.r);\n          if (b6.rq) { arrow += \"[{\\\\rm \" + b6.rq + \"}]\"; }\n          if (b6.rd) {\n            arrow += \"{\\\\rm \" + b6.rd + \"}\";\n          } else {\n            arrow += \"{}\";\n          }\n          res = arrow;\n          break;\n        case 'operator':\n          res = texify._getOperator(buf.kind_);\n          break;\n        case '1st-level escape':\n          res = buf.p1+\" \";  // &, \\\\\\\\, \\\\hlin\n          break;\n        case 'space':\n          res = \" \";\n          break;\n        case 'entitySkip':\n          res = \"~\";\n          break;\n        case 'pu-space-1':\n          res = \"~\";\n          break;\n        case 'pu-space-2':\n          res = \"\\\\mkern3mu \";\n          break;\n        case '1000 separator':\n          res = \"\\\\mkern2mu \";\n          break;\n        case 'commaDecimal':\n          res = \"{,}\";\n          break;\n          case 'comma enumeration L':\n          res = \"{\"+buf.p1+\"}\\\\mkern6mu \";\n          break;\n        case 'comma enumeration M':\n          res = \"{\"+buf.p1+\"}\\\\mkern3mu \";\n          break;\n        case 'comma enumeration S':\n          res = \"{\"+buf.p1+\"}\\\\mkern1mu \";\n          break;\n        case 'hyphen':\n          res = \"\\\\text{-}\";\n          break;\n        case 'addition compound':\n          res = \"\\\\,{\\\\cdot}\\\\,\";\n          break;\n        case 'electron dot':\n          res = \"\\\\mkern1mu \\\\text{\\\\textbullet}\\\\mkern1mu \";\n          break;\n        case 'KV x':\n          res = \"{\\\\times}\";\n          break;\n        case 'prime':\n          res = \"\\\\prime \";\n          break;\n        case 'cdot':\n          res = \"\\\\cdot \";\n          break;\n        case 'tight cdot':\n          res = \"\\\\mkern1mu{\\\\cdot}\\\\mkern1mu \";\n          break;\n        case 'times':\n          res = \"\\\\times \";\n          break;\n        case 'circa':\n          res = \"{\\\\sim}\";\n          break;\n        case '^':\n          res = \"uparrow\";\n          break;\n        case 'v':\n          res = \"downarrow\";\n          break;\n        case 'ellipsis':\n          res = \"\\\\ldots \";\n          break;\n        case '/':\n          res = \"/\";\n          break;\n        case ' / ':\n          res = \"\\\\,/\\\\,\";\n          break;\n        default:\n          assertNever(buf);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];  // Missing texify rule or unknown MhchemParser output\n      }\n      assertString(res);\n      return res;\n    },\n    _getArrow: function (a) {\n      switch (a) {\n        case \"->\": return \"\\\\yields\";\n        case \"\\u2192\": return \"\\\\yields\";\n        case \"\\u27F6\": return \"\\\\yields\";\n        case \"<-\": return \"\\\\yieldsLeft\";\n        case \"<->\": return \"\\\\mesomerism\";\n        case \"<-->\": return \"\\\\yieldsLeftRight\";\n        case \"<=>\": return \"\\\\equilibrium\";\n        case \"\\u21CC\": return \"\\\\equilibrium\";\n        case \"<=>>\": return \"\\\\equilibriumRight\";\n        case \"<<=>\": return \"\\\\equilibriumLeft\";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    },\n    _getBond: function (a) {\n      switch (a) {\n        case \"-\": return \"{-}\";\n        case \"1\": return \"{-}\";\n        case \"=\": return \"{=}\";\n        case \"2\": return \"{=}\";\n        case \"#\": return \"{\\\\equiv}\";\n        case \"3\": return \"{\\\\equiv}\";\n        case \"~\": return \"{\\\\tripleDash}\";\n        case \"~-\": return \"{\\\\tripleDashOverLine}\";\n        case \"~=\": return \"{\\\\tripleDashOverDoubleLine}\";\n        case \"~--\": return \"{\\\\tripleDashOverDoubleLine}\";\n        case \"-~-\": return \"{\\\\tripleDashBetweenDoubleLine}\";\n        case \"...\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n        case \"....\": return \"{{\\\\cdot}{\\\\cdot}{\\\\cdot}{\\\\cdot}}\";\n        case \"->\": return \"{\\\\rightarrow}\";\n        case \"<-\": return \"{\\\\leftarrow}\";\n        case \"<\": return \"{<}\";\n        case \">\": return \"{>}\";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    },\n    _getOperator: function (a) {\n      switch (a) {\n        case \"+\": return \" {}+{} \";\n        case \"-\": return \" {}-{} \";\n        case \"=\": return \" {}={} \";\n        case \"<\": return \" {}<{} \";\n        case \">\": return \" {}>{} \";\n        case \"<<\": return \" {}\\\\ll{} \";\n        case \">>\": return \" {}\\\\gg{} \";\n        case \"\\\\pm\": return \" {}\\\\pm{} \";\n        case \"\\\\approx\": return \" {}\\\\approx{} \";\n        case \"$\\\\approx$\": return \" {}\\\\approx{} \";\n        case \"v\": return \" \\\\downarrow{} \";\n        case \"(v)\": return \" \\\\downarrow{} \";\n        case \"^\": return \" \\\\uparrow{} \";\n        case \"(^)\": return \" \\\\uparrow{} \";\n        default:\n          assertNever(a);\n          throw [\"MhchemBugT\", \"mhchem bug T. Please report.\"];\n      }\n    }\n  };\n\n  //\n  // Helpers for code analysis\n  // Will show type error at calling position\n  //\n  /** @param {number} a */\n  function assertNever(a) {}\n  /** @param {string} a */\n  function assertString(a) {}\n\n/* eslint-disable no-undef */\n\n//////////////////////////////////////////////////////////////////////\n// texvc.sty\n\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\n\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\");\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\n\n/* eslint-disable no-undef */\n\n/****************************************************\n *\n *  physics.js\n *\n *  Implements the Physics Package for LaTeX input.\n *\n *  ---------------------------------------------------------------------\n *\n *  The original version of this file is licensed as follows:\n *  Copyright (c) 2015-2016 Kolen Cheung <https://github.com/ickc/MathJax-third-party-extensions>.\n *\n *  Licensed under the Apache License, Version 2.0 (the \"License\");\n *  you may not use this file except in compliance with the License.\n *  You may obtain a copy of the License at\n *\n *      http://www.apache.org/licenses/LICENSE-2.0\n *\n *  Unless required by applicable law or agreed to in writing, software\n *  distributed under the License is distributed on an \"AS IS\" BASIS,\n *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *  See the License for the specific language governing permissions and\n *  limitations under the License.\n *\n *  ---------------------------------------------------------------------\n *\n *  This file has been revised from the original in the following ways:\n *  1. The interface is changed so that it can be called from Temml, not MathJax.\n *  2. \\Re and \\Im are not used, to avoid conflict with existing LaTeX letters.\n *\n *  This revision of the file is released under the MIT license.\n *  https://mit-license.org/\n */\ndefineMacro(\"\\\\quantity\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pqty\", \"{\\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\bqty\", \"{\\\\left[ #1 \\\\right]}\");\ndefineMacro(\"\\\\vqty\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\Bqty\", \"{\\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\absolutevalue\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\abs\", \"{\\\\left\\\\vert #1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\norm\", \"{\\\\left\\\\Vert #1 \\\\right\\\\Vert}\");\ndefineMacro(\"\\\\evaluated\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\eval\", \"{\\\\left.#1 \\\\right\\\\vert}\");\ndefineMacro(\"\\\\order\", \"{\\\\mathcal{O} \\\\left( #1 \\\\right)}\");\ndefineMacro(\"\\\\commutator\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\comm\", \"{\\\\left[ #1 , #2 \\\\right]}\");\ndefineMacro(\"\\\\anticommutator\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\acomm\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\poissonbracket\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\pb\", \"{\\\\left\\\\{ #1 , #2 \\\\right\\\\}}\");\ndefineMacro(\"\\\\vectorbold\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vb\", \"{\\\\boldsymbol{ #1 }}\");\ndefineMacro(\"\\\\vectorarrow\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\va\", \"{\\\\vec{\\\\boldsymbol{ #1 }}}\");\ndefineMacro(\"\\\\vectorunit\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\vu\", \"{{\\\\boldsymbol{\\\\hat{ #1 }}}}\");\ndefineMacro(\"\\\\dotproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\vdot\", \"{\\\\boldsymbol\\\\cdot}\");\ndefineMacro(\"\\\\crossproduct\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cross\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\cp\", \"\\\\mathbin{\\\\boldsymbol\\\\times}\");\ndefineMacro(\"\\\\gradient\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\grad\", \"{\\\\boldsymbol\\\\nabla}\");\ndefineMacro(\"\\\\divergence\", \"{\\\\grad\\\\vdot}\");\n//defineMacro(\"\\\\div\", \"{\\\\grad\\\\vdot}\"); Not included in Temml. Conflicts w/LaTeX \\div\ndefineMacro(\"\\\\curl\", \"{\\\\grad\\\\cross}\");\ndefineMacro(\"\\\\laplacian\", \"\\\\nabla^2\");\ndefineMacro(\"\\\\tr\", \"{\\\\operatorname{tr}}\");\ndefineMacro(\"\\\\Tr\", \"{\\\\operatorname{Tr}}\");\ndefineMacro(\"\\\\rank\", \"{\\\\operatorname{rank}}\");\ndefineMacro(\"\\\\erf\", \"{\\\\operatorname{erf}}\");\ndefineMacro(\"\\\\Res\", \"{\\\\operatorname{Res}}\");\ndefineMacro(\"\\\\principalvalue\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\pv\", \"{\\\\mathcal{P}}\");\ndefineMacro(\"\\\\PV\", \"{\\\\operatorname{P.V.}}\");\n// Temml does not use the next two lines. They conflict with LaTeX letters.\n//defineMacro(\"\\\\Re\", \"{\\\\operatorname{Re} \\\\left\\\\{ #1 \\\\right\\\\}}\");\n//defineMacro(\"\\\\Im\", \"{\\\\operatorname{Im} \\\\left\\\\{ #1 \\\\right\\\\}}\");\ndefineMacro(\"\\\\qqtext\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qq\", \"{\\\\quad\\\\text{ #1 }\\\\quad}\");\ndefineMacro(\"\\\\qcomma\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qc\", \"{\\\\text{,}\\\\quad}\");\ndefineMacro(\"\\\\qcc\", \"{\\\\quad\\\\text{c.c.}\\\\quad}\");\ndefineMacro(\"\\\\qif\", \"{\\\\quad\\\\text{if}\\\\quad}\");\ndefineMacro(\"\\\\qthen\", \"{\\\\quad\\\\text{then}\\\\quad}\");\ndefineMacro(\"\\\\qelse\", \"{\\\\quad\\\\text{else}\\\\quad}\");\ndefineMacro(\"\\\\qotherwise\", \"{\\\\quad\\\\text{otherwise}\\\\quad}\");\ndefineMacro(\"\\\\qunless\", \"{\\\\quad\\\\text{unless}\\\\quad}\");\ndefineMacro(\"\\\\qgiven\", \"{\\\\quad\\\\text{given}\\\\quad}\");\ndefineMacro(\"\\\\qusing\", \"{\\\\quad\\\\text{using}\\\\quad}\");\ndefineMacro(\"\\\\qassume\", \"{\\\\quad\\\\text{assume}\\\\quad}\");\ndefineMacro(\"\\\\qsince\", \"{\\\\quad\\\\text{since}\\\\quad}\");\ndefineMacro(\"\\\\qlet\", \"{\\\\quad\\\\text{let}\\\\quad}\");\ndefineMacro(\"\\\\qfor\", \"{\\\\quad\\\\text{for}\\\\quad}\");\ndefineMacro(\"\\\\qall\", \"{\\\\quad\\\\text{all}\\\\quad}\");\ndefineMacro(\"\\\\qeven\", \"{\\\\quad\\\\text{even}\\\\quad}\");\ndefineMacro(\"\\\\qodd\", \"{\\\\quad\\\\text{odd}\\\\quad}\");\ndefineMacro(\"\\\\qinteger\", \"{\\\\quad\\\\text{integer}\\\\quad}\");\ndefineMacro(\"\\\\qand\", \"{\\\\quad\\\\text{and}\\\\quad}\");\ndefineMacro(\"\\\\qor\", \"{\\\\quad\\\\text{or}\\\\quad}\");\ndefineMacro(\"\\\\qas\", \"{\\\\quad\\\\text{as}\\\\quad}\");\ndefineMacro(\"\\\\qin\", \"{\\\\quad\\\\text{in}\\\\quad}\");\ndefineMacro(\"\\\\differential\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\dd\", \"{\\\\text{d}}\");\ndefineMacro(\"\\\\derivative\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\dv\", \"{\\\\frac{\\\\text{d}{ #1 }}{\\\\text{d}{ #2 }}}\");\ndefineMacro(\"\\\\partialderivative\", \"{\\\\frac{\\\\partial{ #1 }}{\\\\partial{ #2 }}}\");\ndefineMacro(\"\\\\variation\", \"{\\\\delta}\");\ndefineMacro(\"\\\\var\", \"{\\\\delta}\");\ndefineMacro(\"\\\\functionalderivative\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\fdv\", \"{\\\\frac{\\\\delta{ #1 }}{\\\\delta{ #2 }}}\");\ndefineMacro(\"\\\\innerproduct\", \"{\\\\left\\\\langle {#1} \\\\mid { #2} \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\outerproduct\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\dyad\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\ketbra\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\op\",\n  \"{\\\\left\\\\vert { #1 } \\\\right\\\\rangle\\\\left\\\\langle { #2} \\\\right\\\\vert}\");\ndefineMacro(\"\\\\expectationvalue\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\expval\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\ev\", \"{\\\\left\\\\langle {#1 } \\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixelement\",\n  \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\matrixel\",\n  \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\mel\",\n  \"{\\\\left\\\\langle{ #1 }\\\\right\\\\vert{ #2 }\\\\left\\\\vert{#3}\\\\right\\\\rangle}\");\n\n// Helper functions\nfunction getHLines(parser) {\n  // Return an array. The array length = number of hlines.\n  // Each element in the array tells if the line is dashed.\n  const hlineInfo = [];\n  parser.consumeSpaces();\n  let nxt = parser.fetch().text;\n  if (nxt === \"\\\\relax\") {\n    parser.consume();\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n    parser.consume();\n    hlineInfo.push(nxt === \"\\\\hdashline\");\n    parser.consumeSpaces();\n    nxt = parser.fetch().text;\n  }\n  return hlineInfo;\n}\n\nconst validateAmsEnvironmentContext = context => {\n  const settings = context.parser.settings;\n  if (!settings.displayMode) {\n    throw new ParseError(`{$context.envName}} can be used only in display mode.`);\n  }\n};\n\nconst sizeRegEx$1 = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\nconst arrayGaps = macros => {\n  let arraystretch = macros.get(\"\\\\arraystretch\");\n  if (typeof arraystretch !== \"string\") {\n    arraystretch = stringFromArg(arraystretch.tokens);\n  }\n  arraystretch = isNaN(arraystretch) ? null : Number(arraystretch);\n  let arraycolsepStr = macros.get(\"\\\\arraycolsep\");\n  if (typeof arraycolsepStr !== \"string\") {\n    arraycolsepStr = stringFromArg(arraycolsepStr.tokens);\n  }\n  const match = sizeRegEx$1.exec(arraycolsepStr);\n  const arraycolsep = match\n    ? { number: +(match[1] + match[2]), unit: match[3] }\n    : null;\n  return [arraystretch, arraycolsep]\n};\n\nconst checkCellForLabels = cell => {\n  // Check if the author wrote a \\tag{} inside this cell.\n  let rowLabel = \"\";\n  for (let i = 0; i < cell.length; i++) {\n    if (cell[i].type === \"label\") {\n      if (rowLabel) { throw new ParseError((\"Multiple \\\\labels in one row\")) }\n      rowLabel = cell[i].string;\n    }\n  }\n  return rowLabel\n};\n\n// autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\nfunction getAutoTag(name) {\n  if (name.indexOf(\"ed\") === -1) {\n    return name.indexOf(\"*\") === -1;\n  }\n  // return undefined;\n}\n\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell.  If given an optional argument scriptLevel\n * (\"text\", \"display\", etc.), then each cell is cast into that scriptLevel.\n */\nfunction parseArray(\n  parser,\n  {\n    cols, // [{ type: string , align: l|c|r|null }]\n    envClasses, // align(ed|at|edat) | array | cases | cd | small | multline\n    autoTag,        // boolean\n    singleRow,      // boolean\n    emptySingleRow, // boolean\n    maxNumCols,     // number\n    leqno,          // boolean\n    arraystretch,   // number  | null\n    arraycolsep     // size value | null\n},\n  scriptLevel\n) {\n  parser.gullet.beginGroup();\n  if (!singleRow) {\n    // \\cr is equivalent to \\\\ without the optional size argument (see below)\n    // TODO: provide helpful error when \\cr is used outside array environment\n    parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n  }\n\n  // Start group for first cell\n  parser.gullet.beginGroup();\n\n  let row = [];\n  const body = [row];\n  const rowGaps = [];\n  const labels = [];\n\n  const hLinesBeforeRow = [];\n\n  const tags = (autoTag != null ? [] : undefined);\n\n  // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n  // whether this row should have an equation number.  Simulate this with\n  // a \\@eqnsw macro set to 1 or 0.\n  function beginRow() {\n    if (autoTag) {\n      parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n    }\n  }\n  function endRow() {\n    if (tags) {\n      if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n        tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n        parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n      } else {\n        tags.push(Boolean(autoTag) &&\n            parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n      }\n    }\n  }\n  beginRow();\n\n  // Test for \\hline at the top of the array.\n  hLinesBeforeRow.push(getHLines(parser));\n\n  while (true) {\n    // Parse each cell in its own group (namespace)\n    let cell = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n    parser.gullet.endGroup();\n    parser.gullet.beginGroup();\n\n    cell = {\n      type: \"ordgroup\",\n      mode: parser.mode,\n      body: cell,\n      semisimple: true\n    };\n    row.push(cell);\n    const next = parser.fetch().text;\n    if (next === \"&\") {\n      if (maxNumCols && row.length === maxNumCols) {\n        if (envClasses.includes(\"array\")) {\n          if (parser.settings.strict) {\n            throw new ParseError(\"Too few columns \" + \"specified in the {array} column argument.\",\n              parser.nextToken)\n          }\n        } else if (maxNumCols === 2) {\n          throw new ParseError(\"The split environment accepts no more than two columns\",\n            parser.nextToken);\n        } else {\n          throw new ParseError(\"The equation environment accepts only one column\",\n            parser.nextToken)\n        }\n      }\n      parser.consume();\n    } else if (next === \"\\\\end\") {\n      endRow();\n      // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n      // the last line is empty.  However, AMS environments keep the\n      // empty row if it's the only one.\n      // NOTE: Currently, `cell` is the last item added into `row`.\n      if (row.length === 1 && cell.body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n        body.pop();\n      }\n      labels.push(checkCellForLabels(cell.body));\n      if (hLinesBeforeRow.length < body.length + 1) {\n        hLinesBeforeRow.push([]);\n      }\n      break;\n    } else if (next === \"\\\\\\\\\") {\n      parser.consume();\n      let size;\n      // \\def\\Let@{\\let\\\\\\math@cr}\n      // \\def\\math@cr{...\\math@cr@}\n      // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n      // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n      // \\def\\math@cr@@@{\\cr}\n      if (parser.gullet.future().text !== \" \") {\n        size = parser.parseSizeGroup(true);\n      }\n      rowGaps.push(size ? size.value : null);\n      endRow();\n\n      labels.push(checkCellForLabels(cell.body));\n\n      // check for \\hline(s) following the row separator\n      hLinesBeforeRow.push(getHLines(parser));\n\n      row = [];\n      body.push(row);\n      beginRow();\n    } else {\n      throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n    }\n  }\n\n  // End cell group\n  parser.gullet.endGroup();\n  // End array group defining \\cr\n  parser.gullet.endGroup();\n\n  return {\n    type: \"array\",\n    mode: parser.mode,\n    body,\n    cols,\n    rowGaps,\n    hLinesBeforeRow,\n    envClasses,\n    autoTag,\n    scriptLevel,\n    tags,\n    labels,\n    leqno,\n    arraystretch,\n    arraycolsep\n  };\n}\n\n// Decides on a scriptLevel for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\nfunction dCellStyle(envName) {\n  return envName.slice(0, 1) === \"d\" ? \"display\" : \"text\"\n}\n\nconst alignMap = {\n  c: \"center \",\n  l: \"left \",\n  r: \"right \"\n};\n\nconst glue = group => {\n  const glueNode = new mathMLTree.MathNode(\"mtd\", []);\n  glueNode.style = { padding: \"0\", width: \"50%\" };\n  if (group.envClasses.includes(\"multline\")) {\n    glueNode.style.width = \"7.5%\";\n  }\n  return glueNode\n};\n\nconst mathmlBuilder$7 = function(group, style) {\n  const tbl = [];\n  const numRows = group.body.length;\n  const hlines = group.hLinesBeforeRow;\n\n  for (let i = 0; i < numRows; i++) {\n    const rw = group.body[i];\n    const row = [];\n    const cellLevel = group.scriptLevel === \"text\"\n      ? StyleLevel.TEXT\n      : group.scriptLevel === \"script\"\n      ? StyleLevel.SCRIPT\n      : StyleLevel.DISPLAY;\n\n    for (let j = 0; j < rw.length; j++) {\n      const mtd = new mathMLTree.MathNode(\n        \"mtd\",\n        [buildGroup$1(rw[j], style.withLevel(cellLevel))]\n      );\n\n      if (group.envClasses.includes(\"multline\")) {\n        const align = i === 0 ? \"left\" : i === numRows - 1 ? \"right\" : \"center\";\n        mtd.setAttribute(\"columnalign\", align);\n        if (align !== \"center\") {\n          mtd.classes.push(\"tml-\" + align);\n        }\n      }\n      row.push(mtd);\n    }\n    const numColumns = group.body[0].length;\n    // Fill out a short row with empty <mtd> elements.\n    for (let k = 0; k < numColumns - rw.length; k++) {\n      row.push(new mathMLTree.MathNode(\"mtd\", [], style));\n    }\n    if (group.autoTag) {\n      const tag = group.tags[i];\n      let tagElement;\n      if (tag === true) {  // automatic numbering\n        tagElement = new mathMLTree.MathNode(\"mtext\", [new Span([\"tml-eqn\"])]);\n      } else if (tag === false) {\n        // \\nonumber/\\notag or starred environment\n        tagElement = new mathMLTree.MathNode(\"mtext\", [], []);\n      } else {  // manual \\tag\n        tagElement = buildExpressionRow(tag[0].body, style.withLevel(cellLevel), true);\n        tagElement = consolidateText(tagElement);\n        tagElement.classes = [\"tml-tag\"];\n      }\n      if (tagElement) {\n        row.unshift(glue(group));\n        row.push(glue(group));\n        if (group.leqno) {\n          row[0].children.push(tagElement);\n          row[0].classes.push(\"tml-left\");\n        } else {\n          row[row.length - 1].children.push(tagElement);\n          row[row.length - 1].classes.push(\"tml-right\");\n        }\n      }\n    }\n    const mtr = new mathMLTree.MathNode(\"mtr\", row, []);\n    const label = group.labels.shift();\n    if (label && group.tags && group.tags[i]) {\n      mtr.setAttribute(\"id\", label);\n      if (Array.isArray(group.tags[i])) { mtr.classes.push(\"tml-tageqn\"); }\n    }\n\n    // Write horizontal rules\n    if (i === 0 && hlines[0].length > 0) {\n      if (hlines[0].length === 2) {\n        mtr.children.forEach(cell => { cell.style.borderTop = \"0.15em double\"; });\n      } else {\n        mtr.children.forEach(cell => {\n          cell.style.borderTop = hlines[0][0] ? \"0.06em dashed\" : \"0.06em solid\";\n        });\n      }\n    }\n    if (hlines[i + 1].length > 0) {\n      if (hlines[i + 1].length === 2) {\n        mtr.children.forEach(cell => { cell.style.borderBottom = \"0.15em double\"; });\n      } else {\n        mtr.children.forEach(cell => {\n          cell.style.borderBottom = hlines[i + 1][0] ? \"0.06em dashed\" : \"0.06em solid\";\n        });\n      }\n    }\n    tbl.push(mtr);\n  }\n\n  if (group.envClasses.length > 0) {\n    if (group.arraystretch && group.arraystretch !== 1) {\n      // In LaTeX, \\arraystretch is a factor applied to a 12pt strut height.\n      // It defines a baseline to baseline distance.\n      // Here, we do an approximation of that approach.\n      const pad = String(1.4 * group.arraystretch - 0.8) + \"ex\";\n      for (let i = 0; i < tbl.length; i++) {\n        for (let j = 0; j < tbl[i].children.length; j++) {\n          tbl[i].children[j].style.paddingTop = pad;\n          tbl[i].children[j].style.paddingBottom = pad;\n        }\n      }\n    }\n    let sidePadding = group.envClasses.includes(\"abut\")\n      ? \"0\"\n      : group.envClasses.includes(\"cases\")\n      ? \"0\"\n      : group.envClasses.includes(\"small\")\n      ? \"0.1389\"\n      : group.envClasses.includes(\"cd\")\n      ? \"0.25\"\n      : \"0.4\"; // default side padding\n    let sidePadUnit = \"em\";\n    if (group.arraycolsep) {\n      const arraySidePad = calculateSize(group.arraycolsep, style);\n      sidePadding = arraySidePad.number.toFixed(4);\n      sidePadUnit = arraySidePad.unit;\n    }\n\n    const numCols = tbl.length === 0 ? 0 : tbl[0].children.length;\n\n    const sidePad = (j, hand) => {\n      if (j === 0 && hand === 0) { return \"0\" }\n      if (j === numCols - 1 && hand === 1) { return \"0\" }\n      if (group.envClasses[0] !== \"align\") { return sidePadding }\n      if (hand === 1) { return \"0\" }\n      if (group.autoTag) {\n        return (j % 2) ? \"1\" : \"0\"\n      } else {\n        return (j % 2) ? \"0\" : \"1\"\n      }\n    };\n\n    // Side padding\n    for (let i = 0; i < tbl.length; i++) {\n      for (let j = 0; j < tbl[i].children.length; j++) {\n        tbl[i].children[j].style.paddingLeft = `$sidePad(j, 0)}$sidePadUnit}`;\n        tbl[i].children[j].style.paddingRight = `$sidePad(j, 1)}$sidePadUnit}`;\n      }\n    }\n\n    // Justification\n    const align = group.envClasses.includes(\"align\") || group.envClasses.includes(\"alignat\");\n    for (let i = 0; i < tbl.length; i++) {\n      const row = tbl[i];\n      if (align) {\n        for (let j = 0; j < row.children.length; j++) {\n          // Chromium does not recognize text-align: left. Use -webkit-\n          // TODO: Remove -webkit- when Chromium no longer needs it.\n          row.children[j].classes = [\"tml-\" + (j % 2 ? \"left\" : \"right\")];\n        }\n        if (group.autoTag) {\n          const k = group.leqno ? 0 : row.children.length - 1;\n          row.children[k].classes = [\"tml-\" + (group.leqno ? \"left\" : \"right\")];\n        }\n      }\n      if (row.children.length > 1 && group.envClasses.includes(\"cases\")) {\n        row.children[1].style.paddingLeft = \"1em\";\n      }\n\n      if (group.envClasses.includes(\"cases\") || group.envClasses.includes(\"subarray\")) {\n        for (const cell of row.children) {\n          cell.classes.push(\"tml-left\");\n        }\n      }\n    }\n  } else {\n    // Set zero padding on side of the matrix\n    for (let i = 0; i < tbl.length; i++) {\n      tbl[i].children[0].style.paddingLeft = \"0em\";\n      if (tbl[i].children.length === tbl[0].children.length) {\n        tbl[i].children[tbl[i].children.length - 1].style.paddingRight = \"0em\";\n      }\n    }\n  }\n\n  let table = new mathMLTree.MathNode(\"mtable\", tbl);\n  if (group.envClasses.length > 0) {\n    // Top & bottom padding\n    if (group.envClasses.includes(\"jot\")) {\n      table.classes.push(\"tml-jot\");\n    } else if (group.envClasses.includes(\"small\")) {\n      table.classes.push(\"tml-small\");\n    }\n  }\n  if (group.scriptLevel === \"display\") { table.setAttribute(\"displaystyle\", \"true\"); }\n\n  if (group.autoTag || group.envClasses.includes(\"multline\")) {\n    table.style.width = \"100%\";\n  }\n\n  // Column separator lines and column alignment\n  let align = \"\";\n\n  if (group.cols && group.cols.length > 0) {\n    const cols = group.cols;\n    let prevTypeWasAlign = false;\n    let iStart = 0;\n    let iEnd = cols.length;\n\n    while (cols[iStart].type === \"separator\") {\n      iStart += 1;\n    }\n    while (cols[iEnd - 1].type === \"separator\") {\n      iEnd -= 1;\n    }\n\n    if (cols[0].type === \"separator\") {\n      const sep = cols[1].type === \"separator\"\n        ? \"0.15em double\"\n        : cols[0].separator === \"|\"\n        ? \"0.06em solid \"\n        : \"0.06em dashed \";\n      for (const row of table.children) {\n        row.children[0].style.borderLeft = sep;\n      }\n    }\n    let iCol = group.autoTag ? 0 : -1;\n    for (let i = iStart; i < iEnd; i++) {\n      if (cols[i].type === \"align\") {\n        const colAlign = alignMap[cols[i].align];\n        align += colAlign;\n        iCol += 1;\n        for (const row of table.children) {\n          if (colAlign.trim() !== \"center\" && iCol < row.children.length) {\n            row.children[iCol].classes = [\"tml-\" + colAlign.trim()];\n          }\n        }\n        prevTypeWasAlign = true;\n      } else if (cols[i].type === \"separator\") {\n        // MathML accepts only single lines between cells.\n        // So we read only the first of consecutive separators.\n        if (prevTypeWasAlign) {\n          const sep = cols[i + 1].type === \"separator\"\n            ? \"0.15em double\"\n            : cols[i].separator === \"|\"\n            ? \"0.06em solid\"\n            : \"0.06em dashed\";\n          for (const row of table.children) {\n            if (iCol < row.children.length) {\n              row.children[iCol].style.borderRight = sep;\n            }\n          }\n        }\n        prevTypeWasAlign = false;\n      }\n    }\n    if (cols[cols.length - 1].type === \"separator\") {\n      const sep = cols[cols.length - 2].type === \"separator\"\n        ? \"0.15em double\"\n        : cols[cols.length - 1].separator === \"|\"\n        ? \"0.06em solid\"\n        : \"0.06em dashed\";\n      for (const row of table.children) {\n        row.children[row.children.length - 1].style.borderRight = sep;\n        row.children[row.children.length - 1].style.paddingRight = \"0.4em\";\n      }\n    }\n  }\n  if (group.autoTag) {\n     // allow for glue cells on each side\n    align = \"left \" + (align.length > 0 ? align : \"center \") + \"right \";\n  }\n  if (align) {\n    // Firefox reads this attribute, not the -webkit-left|right written above.\n    // TODO: When Chrome no longer needs \"-webkit-\", use CSS and delete the next line.\n    table.setAttribute(\"columnalign\", align.trim());\n  }\n\n  if (group.envClasses.includes(\"small\")) {\n    // A small array. Wrap in scriptstyle.\n    table = new mathMLTree.MathNode(\"mstyle\", [table]);\n    table.setAttribute(\"scriptlevel\", \"1\");\n  }\n\n  return table\n};\n\n// Convenience function for align, align*, aligned, alignat, alignat*, alignedat, split.\nconst alignedHandler = function(context, args) {\n  if (context.envName.indexOf(\"ed\") === -1) {\n    validateAmsEnvironmentContext(context);\n  }\n  const isSplit = context.envName === \"split\";\n  const cols = [];\n  const res = parseArray(\n    context.parser,\n    {\n      cols,\n      emptySingleRow: true,\n      autoTag: isSplit ? undefined : getAutoTag(context.envName),\n      envClasses: [\"abut\", \"jot\"], // set row spacing & provisional column spacing\n      maxNumCols: context.envName === \"split\" ? 2 : undefined,\n      leqno: context.parser.settings.leqno\n    },\n    \"display\"\n  );\n\n  // Determining number of columns.\n  // 1. If the first argument is given, we use it as a number of columns,\n  //    and makes sure that each row doesn't exceed that number.\n  // 2. Otherwise, just count number of columns = maximum number\n  //    of cells in each row (\"aligned\" mode -- isAligned will be true).\n  //\n  // At the same time, prepend empty group {} at beginning of every second\n  // cell in each row (starting with second cell) so that operators become\n  // binary.  This behavior is implemented in amsmath's \\start@aligned.\n  let numMaths;\n  let numCols = 0;\n  const isAlignedAt = context.envName.indexOf(\"at\") > -1;\n  if (args[0] && isAlignedAt) {\n    // alignat environment takes an argument w/ number of columns\n    let arg0 = \"\";\n    for (let i = 0; i < args[0].body.length; i++) {\n      const textord = assertNodeType(args[0].body[i], \"textord\");\n      arg0 += textord.text;\n    }\n    if (isNaN(arg0)) {\n      throw new ParseError(\"The alignat enviroment requires a numeric first argument.\")\n    }\n    numMaths = Number(arg0);\n    numCols = numMaths * 2;\n  }\n  res.body.forEach(function(row) {\n    if (isAlignedAt) {\n      // Case 1\n      const curMaths = row.length / 2;\n      if (numMaths < curMaths) {\n        throw new ParseError(\n          \"Too many math in a row: \" + `expected $numMaths}, but got $curMaths}`,\n          row[0]\n        );\n      }\n    } else if (numCols < row.length) {\n      // Case 2\n      numCols = row.length;\n    }\n  });\n\n  // Adjusting alignment.\n  // In aligned mode, we add one \\qquad between columns;\n  // otherwise we add nothing.\n  for (let i = 0; i < numCols; ++i) {\n    let align = \"r\";\n    if (i % 2 === 1) {\n      align = \"l\";\n    }\n    cols[i] = {\n      type: \"align\",\n      align: align\n    };\n  }\n  if (context.envName === \"split\") ; else if (isAlignedAt) {\n    res.envClasses.push(\"alignat\"); // Sets justification\n  } else {\n    res.envClasses[0] = \"align\"; // Sets column spacing & justification\n  }\n  return res;\n};\n\n// Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"array\", \"darray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Since no types are specified above, the two possibilities are\n    // - The argument is wrapped in {} or [], in which case Parser's\n    //   parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n    // - The argument is a bare symbol node.\n    const symNode = checkSymbolNodeType(args[0]);\n    const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    const cols = colalign.map(function(nde) {\n      const node = assertSymbolNodeType(nde);\n      const ca = node.text;\n      if (\"lcr\".indexOf(ca) !== -1) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      } else if (ca === \"|\") {\n        return {\n          type: \"separator\",\n          separator: \"|\"\n        };\n      } else if (ca === \":\") {\n        return {\n          type: \"separator\",\n          separator: \":\"\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n    const res = {\n      cols,\n      envClasses: [\"array\"],\n      maxNumCols: cols.length,\n      arraystretch,\n      arraycolsep\n    };\n    return parseArray(context.parser, res, dCellStyle(context.envName));\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// The matrix environments of amsmath builds on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\ndefineEnvironment({\n  type: \"array\",\n  names: [\n    \"matrix\",\n    \"pmatrix\",\n    \"bmatrix\",\n    \"Bmatrix\",\n    \"vmatrix\",\n    \"Vmatrix\",\n    \"matrix*\",\n    \"pmatrix*\",\n    \"bmatrix*\",\n    \"Bmatrix*\",\n    \"vmatrix*\",\n    \"Vmatrix*\"\n  ],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    const delimiters = {\n      matrix: null,\n      pmatrix: [\"(\", \")\"],\n      bmatrix: [\"[\", \"]\"],\n      Bmatrix: [\"\\\\{\", \"\\\\}\"],\n      vmatrix: [\"|\", \"|\"],\n      Vmatrix: [\"\\\\Vert\", \"\\\\Vert\"]\n    }[context.envName.replace(\"*\", \"\")];\n    // \\hskip -\\arraycolsep in amsmath\n    let colAlign = \"c\";\n    const payload = {\n      envClasses: [],\n      cols: []\n    };\n    if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n      // It's one of the mathtools starred functions.\n      // Parse the optional alignment argument.\n      const parser = context.parser;\n      parser.consumeSpaces();\n      if (parser.fetch().text === \"[\") {\n        parser.consume();\n        parser.consumeSpaces();\n        colAlign = parser.fetch().text;\n        if (\"lcr\".indexOf(colAlign) === -1) {\n          throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n        }\n        parser.consume();\n        parser.consumeSpaces();\n        parser.expect(\"]\");\n        parser.consume();\n        payload.cols = [];\n      }\n    }\n    const res = parseArray(context.parser, payload, \"text\");\n    res.cols = new Array(res.body[0].length).fill({ type: \"align\", align: colAlign });\n    const [arraystretch, arraycolsep] = arrayGaps(context.parser.gullet.macros);\n    return delimiters\n      ? {\n        type: \"leftright\",\n        mode: context.mode,\n        body: [res],\n        left: delimiters[0],\n        right: delimiters[1],\n        rightColor: undefined, // \\right uninfluenced by \\color in array\n        arraystretch,\n        arraycolsep\n      }\n      : res;\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"smallmatrix\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    const payload = { type: \"small\" };\n    const res = parseArray(context.parser, payload, \"script\");\n    res.envClasses = [\"small\"];\n    return res;\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"subarray\"],\n  props: {\n    numArgs: 1\n  },\n  handler(context, args) {\n    // Parsing of {subarray} is similar to {array}\n    const symNode = checkSymbolNodeType(args[0]);\n    const colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n    const cols = colalign.map(function(nde) {\n      const node = assertSymbolNodeType(nde);\n      const ca = node.text;\n      // {subarray} only recognizes \"l\" & \"c\"\n      if (\"lc\".indexOf(ca) !== -1) {\n        return {\n          type: \"align\",\n          align: ca\n        };\n      }\n      throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n    });\n    if (cols.length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    let res = {\n      cols,\n      envClasses: [\"small\"]\n    };\n    res = parseArray(context.parser, res, \"script\");\n    if (res.body.length > 0 && res.body[0].length > 1) {\n      throw new ParseError(\"{subarray} can contain only one column\");\n    }\n    return res;\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} \u2026 \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    const payload = {\n      cols: [],\n      envClasses: [\"cases\"]\n    };\n    const res = parseArray(context.parser, payload, dCellStyle(context.envName));\n    return {\n      type: \"leftright\",\n      mode: context.mode,\n      body: [res],\n      left: context.envName.indexOf(\"r\") > -1 ? \".\" : \"\\\\{\",\n      right: context.envName.indexOf(\"r\") > -1 ? \"\\\\}\" : \".\",\n      rightColor: undefined\n    };\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"align\", \"align*\", \"aligned\", \"split\"],\n  props: {\n    numArgs: 0\n  },\n  handler: alignedHandler,\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust where spacing occurs.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"alignat\", \"alignat*\", \"alignedat\"],\n  props: {\n    numArgs: 1\n  },\n  handler: alignedHandler,\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\ndefineEnvironment({\n  type: \"array\",\n  names: [\"gathered\", \"gather\", \"gather*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    if (context.envName !== \"gathered\") {\n      validateAmsEnvironmentContext(context);\n    }\n    const res = {\n      cols: [],\n      envClasses: [\"abut\", \"jot\"],\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"equation\", \"equation*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    const res = {\n      autoTag: getAutoTag(context.envName),\n      emptySingleRow: true,\n      singleRow: true,\n      maxNumCols: 1,\n      envClasses: [\"align\"],\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"multline\", \"multline*\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    const res = {\n      autoTag: context.envName === \"multline\",\n      maxNumCols: 1,\n      envClasses: [\"jot\", \"multline\"],\n      leqno: context.parser.settings.leqno\n    };\n    return parseArray(context.parser, res, \"display\");\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\ndefineEnvironment({\n  type: \"array\",\n  names: [\"CD\"],\n  props: {\n    numArgs: 0\n  },\n  handler(context) {\n    validateAmsEnvironmentContext(context);\n    return parseCD(context.parser);\n  },\n  mathmlBuilder: mathmlBuilder$7\n});\n\n// Catch \\hline outside array environment\ndefineFunction({\n  type: \"text\", // Doesn't matter what this is.\n  names: [\"\\\\hline\", \"\\\\hdashline\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: true\n  },\n  handler(context, args) {\n    throw new ParseError(`$context.funcName} valid only within array environment`);\n  }\n});\n\nconst environments = _environments;\n\n// Environment delimiters. HTML/MathML rendering is defined in the corresponding\n// defineEnvironment definitions.\ndefineFunction({\n  type: \"environment\",\n  names: [\"\\\\begin\", \"\\\\end\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"]\n  },\n  handler({ parser, funcName }, args) {\n    const nameGroup = args[0];\n    if (nameGroup.type !== \"ordgroup\") {\n      throw new ParseError(\"Invalid environment name\", nameGroup);\n    }\n    let envName = \"\";\n    for (let i = 0; i < nameGroup.body.length; ++i) {\n      envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n    }\n\n    if (funcName === \"\\\\begin\") {\n      // begin...end is similar to left...right\n      if (!Object.prototype.hasOwnProperty.call(environments, envName )) {\n        throw new ParseError(\"No such environment: \" + envName, nameGroup);\n      }\n      // Build the environment object. Arguments and other information will\n      // be made available to the begin and end methods using properties.\n      const env = environments[envName];\n      const { args, optArgs } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n      const context = {\n        mode: parser.mode,\n        envName,\n        parser\n      };\n      const result = env.handler(context, args, optArgs);\n      parser.expect(\"\\\\end\", false);\n      const endNameToken = parser.nextToken;\n      const end = assertNodeType(parser.parseFunction(), \"environment\");\n      if (end.name !== envName) {\n        throw new ParseError(\n          `Mismatch: \\\\begin{$envName}} matched by \\\\end{$end.name}}`,\n          endNameToken\n        );\n      }\n      return result;\n    }\n\n    return {\n      type: \"environment\",\n      mode: parser.mode,\n      name: envName,\n      nameGroup\n    };\n  }\n});\n\ndefineFunction({\n  type: \"envTag\",\n  names: [\"\\\\env@tag\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"math\"]\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"envTag\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    return new mathMLTree.MathNode(\"mrow\");\n  }\n});\n\ndefineFunction({\n  type: \"noTag\",\n  names: [\"\\\\env@notag\"],\n  props: {\n    numArgs: 0\n  },\n  handler({ parser }) {\n    return {\n      type: \"noTag\",\n      mode: parser.mode\n    };\n  },\n  mathmlBuilder(group, style) {\n    return new mathMLTree.MathNode(\"mrow\");\n  }\n});\n\nconst isLongVariableName = (group, font) => {\n  if (font !== \"mathrm\" || group.body.type !== \"ordgroup\" || group.body.body.length === 1) {\n    return false\n  }\n  if (group.body.body[0].type !== \"mathord\") { return false }\n  for (let i = 1; i < group.body.body.length; i++) {\n    const parseNodeType = group.body.body[i].type;\n    if (!(parseNodeType ===  \"mathord\" ||\n    (parseNodeType ===  \"textord\" && !isNaN(group.body.body[i].text)))) {\n      return false\n    }\n  }\n  return true\n};\n\nconst mathmlBuilder$6 = (group, style) => {\n  const font = group.font;\n  const newStyle = style.withFont(font);\n  const mathGroup = buildGroup$1(group.body, newStyle);\n\n  if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \\mathrm{}\n  if (font === \"boldsymbol\" && [\"mo\", \"mpadded\", \"mrow\"].includes(mathGroup.type)) {\n    mathGroup.style.fontWeight = \"bold\";\n    return mathGroup\n  }\n  // Check if it is possible to consolidate elements into a single <mi> element.\n  if (isLongVariableName(group, font)) {\n    // This is a \\mathrm{\u2026} group. It gets special treatment because symbolsOrd.js\n    // wraps <mi> elements with <mrow>s to work around a Firefox bug.\n    const mi = mathGroup.children[0].children[0];\n    delete mi.attributes.mathvariant;\n    for (let i = 1; i < mathGroup.children.length; i++) {\n      mi.children[0].text += mathGroup.children[i].type === \"mn\"\n        ? mathGroup.children[i].children[0].text\n        : mathGroup.children[i].children[0].children[0].text;\n    }\n    // Wrap in a <mrow> to prevent the same Firefox bug.\n    const bogus = new mathMLTree.MathNode(\"mtext\", new mathMLTree.TextNode(\"\\u200b\"));\n    return new mathMLTree.MathNode(\"mrow\", [bogus, mi])\n  }\n  let canConsolidate = mathGroup.children[0].type === \"mo\";\n  for (let i = 1; i < mathGroup.children.length; i++) {\n    if (mathGroup.children[i].type === \"mo\" && font === \"boldsymbol\") {\n      mathGroup.children[i].style.fontWeight = \"bold\";\n    }\n    if (mathGroup.children[i].type !== \"mi\") { canConsolidate = false; }\n    const localVariant = mathGroup.children[i].attributes &&\n      mathGroup.children[i].attributes.mathvariant || \"\";\n    if (localVariant !== \"normal\") { canConsolidate = false; }\n  }\n  if (!canConsolidate) { return mathGroup }\n  // Consolidate the <mi> elements.\n  const mi = mathGroup.children[0];\n  for (let i = 1; i < mathGroup.children.length; i++) {\n    mi.children.push(mathGroup.children[i].children[0]);\n  }\n  if (mi.attributes.mathvariant && mi.attributes.mathvariant === \"normal\") {\n    // Workaround for a Firefox bug that renders spurious space around\n    // a <mi mathvariant=\"normal\">\n    // Ref: https://bugs.webkit.org/show_bug.cgi?id=129097\n    // We insert a text node that contains a zero-width space and wrap in an mrow.\n    // TODO: Get rid of this <mi> workaround when the Firefox bug is fixed.\n    const bogus = new mathMLTree.MathNode(\"mtext\", new mathMLTree.TextNode(\"\\u200b\"));\n    return new mathMLTree.MathNode(\"mrow\", [bogus, mi])\n  }\n  return mi\n};\n\nconst fontAliases = {\n  \"\\\\Bbb\": \"\\\\mathbb\",\n  \"\\\\bold\": \"\\\\mathbf\",\n  \"\\\\frak\": \"\\\\mathfrak\",\n  \"\\\\bm\": \"\\\\boldsymbol\"\n};\n\ndefineFunction({\n  type: \"font\",\n  names: [\n    // styles\n    \"\\\\mathrm\",\n    \"\\\\mathit\",\n    \"\\\\mathbf\",\n    \"\\\\mathnormal\",\n    \"\\\\up@greek\",\n    \"\\\\boldsymbol\",\n\n    // families\n    \"\\\\mathbb\",\n    \"\\\\mathcal\",\n    \"\\\\mathfrak\",\n    \"\\\\mathscr\",\n    \"\\\\mathsf\",\n    \"\\\\mathsfit\",\n    \"\\\\mathtt\",\n\n    // aliases\n    \"\\\\Bbb\",\n    \"\\\\bm\",\n    \"\\\\bold\",\n    \"\\\\frak\"\n  ],\n  props: {\n    numArgs: 1,\n    allowedInArgument: true\n  },\n  handler: ({ parser, funcName }, args) => {\n    const body = normalizeArgument(args[0]);\n    let func = funcName;\n    if (func in fontAliases) {\n      func = fontAliases[func];\n    }\n    return {\n      type: \"font\",\n      mode: parser.mode,\n      font: func.slice(1),\n      body\n    };\n  },\n  mathmlBuilder: mathmlBuilder$6\n});\n\n// Old font changing functions\ndefineFunction({\n  type: \"font\",\n  names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: ({ parser, funcName, breakOnTokenText }, args) => {\n    const { mode } = parser;\n    const body = parser.parseExpression(true, breakOnTokenText, true);\n    const fontStyle = `math$funcName.slice(1)}`;\n\n    return {\n      type: \"font\",\n      mode: mode,\n      font: fontStyle,\n      body: {\n        type: \"ordgroup\",\n        mode: parser.mode,\n        body\n      }\n    };\n  },\n  mathmlBuilder: mathmlBuilder$6\n});\n\nconst stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\nconst scriptLevel = { auto: -1, display: 0, text: 0, script: 1, scriptscript: 2 };\n\nconst mathmlBuilder$5 = (group, style) => {\n  // Track the scriptLevel of the numerator and denominator.\n  // We may need that info for \\mathchoice or for adjusting em dimensions.\n  const childOptions = group.scriptLevel === \"auto\"\n    ? style.incrementLevel()\n    : group.scriptLevel === \"display\"\n    ? style.withLevel(StyleLevel.TEXT)\n    : group.scriptLevel === \"text\"\n    ? style.withLevel(StyleLevel.SCRIPT)\n    : style.withLevel(StyleLevel.SCRIPTSCRIPT);\n\n  // Chromium (wrongly) continues to shrink fractions beyond scriptscriptlevel.\n  // So we check for levels that Chromium shrinks too small.\n  // If necessary, set an explicit fraction depth.\n  const numer = buildGroup$1(group.numer, childOptions);\n  const denom = buildGroup$1(group.denom, childOptions);\n  if (style.level === 3) {\n    numer.style.mathDepth = \"2\";\n    numer.setAttribute(\"scriptlevel\", \"2\");\n    denom.style.mathDepth = \"2\";\n    denom.setAttribute(\"scriptlevel\", \"2\");\n  }\n\n  let node = new mathMLTree.MathNode(\"mfrac\", [numer, denom]);\n\n  if (!group.hasBarLine) {\n    node.setAttribute(\"linethickness\", \"0px\");\n  } else if (group.barSize) {\n    const ruleWidth = calculateSize(group.barSize, style);\n    node.setAttribute(\"linethickness\", ruleWidth.number + ruleWidth.unit);\n  }\n\n  if (group.leftDelim != null || group.rightDelim != null) {\n    const withDelims = [];\n\n    if (group.leftDelim != null) {\n      const leftOp = new mathMLTree.MathNode(\"mo\", [\n        new mathMLTree.TextNode(group.leftDelim.replace(\"\\\\\", \"\"))\n      ]);\n      leftOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(leftOp);\n    }\n\n    withDelims.push(node);\n\n    if (group.rightDelim != null) {\n      const rightOp = new mathMLTree.MathNode(\"mo\", [\n        new mathMLTree.TextNode(group.rightDelim.replace(\"\\\\\", \"\"))\n      ]);\n      rightOp.setAttribute(\"fence\", \"true\");\n      withDelims.push(rightOp);\n    }\n\n    node = makeRow(withDelims);\n  }\n\n  if (group.scriptLevel !== \"auto\") {\n    node = new mathMLTree.MathNode(\"mstyle\", [node]);\n    node.setAttribute(\"displaystyle\", String(group.scriptLevel === \"display\"));\n    node.setAttribute(\"scriptlevel\", scriptLevel[group.scriptLevel]);\n  }\n\n  return node;\n};\n\ndefineFunction({\n  type: \"genfrac\",\n  names: [\n    \"\\\\dfrac\",\n    \"\\\\frac\",\n    \"\\\\tfrac\",\n    \"\\\\dbinom\",\n    \"\\\\binom\",\n    \"\\\\tbinom\",\n    \"\\\\\\\\atopfrac\", // can\u2019t be entered directly\n    \"\\\\\\\\bracefrac\",\n    \"\\\\\\\\brackfrac\" // ditto\n  ],\n  props: {\n    numArgs: 2,\n    allowedInArgument: true\n  },\n  handler: ({ parser, funcName }, args) => {\n    const numer = args[0];\n    const denom = args[1];\n    let hasBarLine = false;\n    let leftDelim = null;\n    let rightDelim = null;\n    let scriptLevel = \"auto\";\n\n    switch (funcName) {\n      case \"\\\\dfrac\":\n      case \"\\\\frac\":\n      case \"\\\\tfrac\":\n        hasBarLine = true;\n        break;\n      case \"\\\\\\\\atopfrac\":\n        hasBarLine = false;\n        break;\n      case \"\\\\dbinom\":\n      case \"\\\\binom\":\n      case \"\\\\tbinom\":\n        leftDelim = \"(\";\n        rightDelim = \")\";\n        break;\n      case \"\\\\\\\\bracefrac\":\n        leftDelim = \"\\\\{\";\n        rightDelim = \"\\\\}\";\n        break;\n      case \"\\\\\\\\brackfrac\":\n        leftDelim = \"[\";\n        rightDelim = \"]\";\n        break;\n      default:\n        throw new Error(\"Unrecognized genfrac command\");\n    }\n\n    switch (funcName) {\n      case \"\\\\dfrac\":\n      case \"\\\\dbinom\":\n        scriptLevel = \"display\";\n        break;\n      case \"\\\\tfrac\":\n      case \"\\\\tbinom\":\n        scriptLevel = \"text\";\n        break;\n    }\n\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      continued: false,\n      numer,\n      denom,\n      hasBarLine,\n      leftDelim,\n      rightDelim,\n      scriptLevel,\n      barSize: null\n    };\n  },\n  mathmlBuilder: mathmlBuilder$5\n});\n\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\cfrac\"],\n  props: {\n    numArgs: 2\n  },\n  handler: ({ parser, funcName }, args) => {\n    const numer = args[0];\n    const denom = args[1];\n\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      continued: true,\n      numer,\n      denom,\n      hasBarLine: true,\n      leftDelim: null,\n      rightDelim: null,\n      scriptLevel: \"display\",\n      barSize: null\n    };\n  }\n});\n\n// Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n  props: {\n    numArgs: 0,\n    infix: true\n  },\n  handler({ parser, funcName, token }) {\n    let replaceWith;\n    switch (funcName) {\n      case \"\\\\over\":\n        replaceWith = \"\\\\frac\";\n        break;\n      case \"\\\\choose\":\n        replaceWith = \"\\\\binom\";\n        break;\n      case \"\\\\atop\":\n        replaceWith = \"\\\\\\\\atopfrac\";\n        break;\n      case \"\\\\brace\":\n        replaceWith = \"\\\\\\\\bracefrac\";\n        break;\n      case \"\\\\brack\":\n        replaceWith = \"\\\\\\\\brackfrac\";\n        break;\n      default:\n        throw new Error(\"Unrecognized infix genfrac command\");\n    }\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith,\n      token\n    };\n  }\n});\n\nconst delimFromValue = function(delimString) {\n  let delim = null;\n  if (delimString.length > 0) {\n    delim = delimString;\n    delim = delim === \".\" ? null : delim;\n  }\n  return delim;\n};\n\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\genfrac\"],\n  props: {\n    numArgs: 6,\n    allowedInArgument: true,\n    argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n  },\n  handler({ parser }, args) {\n    const numer = args[4];\n    const denom = args[5];\n\n    // Look into the parse nodes to get the desired delimiters.\n    const leftNode = normalizeArgument(args[0]);\n    const leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\"\n      ? delimFromValue(leftNode.text)\n      : null;\n    const rightNode = normalizeArgument(args[1]);\n    const rightDelim =\n      rightNode.type === \"atom\" && rightNode.family === \"close\"\n        ? delimFromValue(rightNode.text)\n        : null;\n\n    const barNode = assertNodeType(args[2], \"size\");\n    let hasBarLine;\n    let barSize = null;\n    if (barNode.isBlank) {\n      // \\genfrac acts differently than \\above.\n      // \\genfrac treats an empty size group as a signal to use a\n      // standard bar size. \\above would see size = 0 and omit the bar.\n      hasBarLine = true;\n    } else {\n      barSize = barNode.value;\n      hasBarLine = barSize.number > 0;\n    }\n\n    // Find out if we want displaystyle, textstyle, etc.\n    let scriptLevel = \"auto\";\n    let styl = args[3];\n    if (styl.type === \"ordgroup\") {\n      if (styl.body.length > 0) {\n        const textOrd = assertNodeType(styl.body[0], \"textord\");\n        scriptLevel = stylArray[Number(textOrd.text)];\n      }\n    } else {\n      styl = assertNodeType(styl, \"textord\");\n      scriptLevel = stylArray[Number(styl.text)];\n    }\n\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim,\n      rightDelim,\n      scriptLevel\n    };\n  },\n  mathmlBuilder: mathmlBuilder$5\n});\n\n// \\above is an infix fraction that also defines a fraction bar size.\ndefineFunction({\n  type: \"infix\",\n  names: [\"\\\\above\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    infix: true\n  },\n  handler({ parser, funcName, token }, args) {\n    return {\n      type: \"infix\",\n      mode: parser.mode,\n      replaceWith: \"\\\\\\\\abovefrac\",\n      barSize: assertNodeType(args[0], \"size\").value,\n      token\n    };\n  }\n});\n\ndefineFunction({\n  type: \"genfrac\",\n  names: [\"\\\\\\\\abovefrac\"],\n  props: {\n    numArgs: 3,\n    argTypes: [\"math\", \"size\", \"math\"]\n  },\n  handler: ({ parser, funcName }, args) => {\n    const numer = args[0];\n    const barSize = assert(assertNodeType(args[1], \"infix\").barSize);\n    const denom = args[2];\n\n    const hasBarLine = barSize.number > 0;\n    return {\n      type: \"genfrac\",\n      mode: parser.mode,\n      numer,\n      denom,\n      continued: false,\n      hasBarLine,\n      barSize,\n      leftDelim: null,\n      rightDelim: null,\n      scriptLevel: \"auto\"\n    };\n  },\n\n  mathmlBuilder: mathmlBuilder$5\n});\n\n// \\hbox is provided for compatibility with LaTeX functions that act on a box.\n// This function by itself doesn't do anything but set scriptlevel to \\textstyle\n// and prevent a soft line break.\n\ndefineFunction({\n  type: \"hbox\",\n  names: [\"\\\\hbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInArgument: true,\n    allowedInText: false\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"hbox\",\n      mode: parser.mode,\n      body: ordargument(args[0])\n    };\n  },\n  mathmlBuilder(group, style) {\n    const newStyle = style.withLevel(StyleLevel.TEXT);\n    const mrow = buildExpressionRow(group.body, newStyle);\n    return consolidateText(mrow)\n  }\n});\n\nconst mathmlBuilder$4 = (group, style) => {\n  const accentNode = stretchy.mathMLnode(group.label);\n  accentNode.style[\"math-depth\"] = 0;\n  return new mathMLTree.MathNode(group.isOver ? \"mover\" : \"munder\", [\n    buildGroup$1(group.base, style),\n    accentNode\n  ]);\n};\n\n// Horizontal stretchy braces\ndefineFunction({\n  type: \"horizBrace\",\n  names: [\"\\\\overbrace\", \"\\\\underbrace\"],\n  props: {\n    numArgs: 1\n  },\n  handler({ parser, funcName }, args) {\n    return {\n      type: \"horizBrace\",\n      mode: parser.mode,\n      label: funcName,\n      isOver: /^\\\\over/.test(funcName),\n      base: args[0]\n    };\n  },\n  mathmlBuilder: mathmlBuilder$4\n});\n\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\href\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"url\", \"original\"],\n    allowedInText: true\n  },\n  handler: ({ parser, token }, args) => {\n    const body = args[1];\n    const href = assertNodeType(args[0], \"url\").url;\n\n    if (\n      !parser.settings.isTrusted({\n        command: \"\\\\href\",\n        url: href\n      })\n    ) {\n      throw new ParseError(`Function \"\\\\href\" is not trusted`, token)\n    }\n\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const math = new MathNode(\"math\", [buildExpressionRow(group.body, style)]);\n    const anchorNode = new AnchorNode(group.href, [], [math]);\n    return anchorNode\n  }\n});\n\ndefineFunction({\n  type: \"href\",\n  names: [\"\\\\url\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"url\"],\n    allowedInText: true\n  },\n  handler: ({ parser, token }, args) => {\n    const href = assertNodeType(args[0], \"url\").url;\n\n    if (\n      !parser.settings.isTrusted({\n        command: \"\\\\url\",\n        url: href\n      })\n    ) {\n      throw new ParseError(`Function \"\\\\url\" is not trusted`, token)\n    }\n\n    const chars = [];\n    for (let i = 0; i < href.length; i++) {\n      let c = href[i];\n      if (c === \"~\") {\n        c = \"\\\\textasciitilde\";\n      }\n      chars.push({\n        type: \"textord\",\n        mode: \"text\",\n        text: c\n      });\n    }\n    const body = {\n      type: \"text\",\n      mode: parser.mode,\n      font: \"\\\\texttt\",\n      body: chars\n    };\n    return {\n      type: \"href\",\n      mode: parser.mode,\n      href,\n      body: ordargument(body)\n    };\n  }\n});\n\ndefineFunction({\n  type: \"html\",\n  names: [\"\\\\class\", \"\\\\id\", \"\\\\style\", \"\\\\data\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"raw\", \"original\"],\n    allowedInText: true\n  },\n  handler: ({ parser, funcName, token }, args) => {\n    const value = assertNodeType(args[0], \"raw\").string;\n    const body = args[1];\n\n    if (parser.settings.strict) {\n      throw new ParseError(`Function \"$funcName}\" is disabled in strict mode`, token)\n    }\n\n    let trustContext;\n    const attributes = {};\n\n    switch (funcName) {\n      case \"\\\\class\":\n        attributes.class = value;\n        trustContext = {\n          command: \"\\\\class\",\n          class: value\n        };\n        break;\n      case \"\\\\id\":\n        attributes.id = value;\n        trustContext = {\n          command: \"\\\\id\",\n          id: value\n        };\n        break;\n      case \"\\\\style\":\n        attributes.style = value;\n        trustContext = {\n          command: \"\\\\style\",\n          style: value\n        };\n        break;\n      case \"\\\\data\": {\n        const data = value.split(\",\");\n        for (let i = 0; i < data.length; i++) {\n          const keyVal = data[i].split(\"=\");\n          if (keyVal.length !== 2) {\n            throw new ParseError(\"Error parsing key-value for \\\\data\");\n          }\n          attributes[\"data-\" + keyVal[0].trim()] = keyVal[1].trim();\n        }\n\n        trustContext = {\n          command: \"\\\\data\",\n          attributes\n        };\n        break;\n      }\n      default:\n        throw new Error(\"Unrecognized html command\");\n    }\n\n    if (!parser.settings.isTrusted(trustContext)) {\n      throw new ParseError(`Function \"$funcName}\" is not trusted`, token)\n    }\n    return {\n      type: \"html\",\n      mode: parser.mode,\n      attributes,\n      body: ordargument(body)\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const element =  buildExpressionRow(group.body, style);\n\n    const classes = [];\n    if (group.attributes.class) {\n      classes.push(...group.attributes.class.trim().split(/\\s+/));\n    }\n    element.classes = classes;\n\n    for (const attr in group.attributes) {\n      if (attr !== \"class\" && Object.prototype.hasOwnProperty.call(group.attributes, attr)) {\n        element.setAttribute(attr, group.attributes[attr]);\n      }\n    }\n\n    return element;\n  }\n});\n\nconst sizeData = function(str) {\n  if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n    // str is a number with no unit specified.\n    // default unit is bp, per graphix package.\n    return { number: +str, unit: \"bp\" }\n  } else {\n    const match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n    }\n    const data = {\n      number: +(match[1] + match[2]), // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n    }\n    return data\n  }\n};\n\ndefineFunction({\n  type: \"includegraphics\",\n  names: [\"\\\\includegraphics\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    argTypes: [\"raw\", \"url\"],\n    allowedInText: false\n  },\n  handler: ({ parser, token }, args, optArgs) => {\n    let width = { number: 0, unit: \"em\" };\n    let height = { number: 0.9, unit: \"em\" };  // sorta character sized.\n    let totalheight = { number: 0, unit: \"em\" };\n    let alt = \"\";\n\n    if (optArgs[0]) {\n      const attributeStr = assertNodeType(optArgs[0], \"raw\").string;\n\n      // Parser.js does not parse key/value pairs. We get a string.\n      const attributes = attributeStr.split(\",\");\n      for (let i = 0; i < attributes.length; i++) {\n        const keyVal = attributes[i].split(\"=\");\n        if (keyVal.length === 2) {\n          const str = keyVal[1].trim();\n          switch (keyVal[0].trim()) {\n            case \"alt\":\n              alt = str;\n              break\n            case \"width\":\n              width = sizeData(str);\n              break\n            case \"height\":\n              height = sizeData(str);\n              break\n            case \"totalheight\":\n              totalheight = sizeData(str);\n              break\n            default:\n              throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\")\n          }\n        }\n      }\n    }\n\n    const src = assertNodeType(args[0], \"url\").url;\n\n    if (alt === \"\") {\n      // No alt given. Use the file name. Strip away the path.\n      alt = src;\n      alt = alt.replace(/^.*[\\\\/]/, \"\");\n      alt = alt.substring(0, alt.lastIndexOf(\".\"));\n    }\n\n    if (\n      !parser.settings.isTrusted({\n        command: \"\\\\includegraphics\",\n        url: src\n      })\n    ) {\n      throw new ParseError(`Function \"\\\\includegraphics\" is not trusted`, token)\n    }\n\n    return {\n      type: \"includegraphics\",\n      mode: parser.mode,\n      alt: alt,\n      width: width,\n      height: height,\n      totalheight: totalheight,\n      src: src\n    }\n  },\n  mathmlBuilder: (group, style) => {\n    const height = calculateSize(group.height, style);\n    const depth = { number: 0, unit: \"em\" };\n\n    if (group.totalheight.number > 0) {\n      if (group.totalheight.unit === height.unit &&\n        group.totalheight.number > height.number) {\n        depth.number = group.totalheight.number - height.number;\n        depth.unit = height.unit;\n      }\n    }\n\n    let width = 0;\n    if (group.width.number > 0) {\n      width = calculateSize(group.width, style);\n    }\n\n    const graphicStyle = { height: height.number + depth.number + \"em\" };\n    if (width.number > 0) {\n      graphicStyle.width = width.number + width.unit;\n    }\n    if (depth.number > 0) {\n      graphicStyle.verticalAlign = -depth.number + depth.unit;\n    }\n\n    const node = new Img(group.src, group.alt, graphicStyle);\n    node.height = height;\n    node.depth = depth;\n    return new mathMLTree.MathNode(\"mtext\", [node])\n  }\n});\n\n// Horizontal spacing commands\n\n\n// TODO: \\hskip and \\mskip should support plus and minus in lengths\n\ndefineFunction({\n  type: \"kern\",\n  names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"size\"],\n    primitive: true,\n    allowedInText: true\n  },\n  handler({ parser, funcName, token }, args) {\n    const size = assertNodeType(args[0], \"size\");\n    if (parser.settings.strict) {\n      const mathFunction = funcName[1] === \"m\"; // \\mkern, \\mskip\n      const muUnit = size.value.unit === \"mu\";\n      if (mathFunction) {\n        if (!muUnit) {\n          throw new ParseError(`LaTeX's $funcName} supports only mu units, ` +\n            `not $size.value.unit} units`, token)\n        }\n        if (parser.mode !== \"math\") {\n          throw new ParseError(`LaTeX's $funcName} works only in math mode`, token)\n        }\n      } else {\n        // !mathFunction\n        if (muUnit) {\n          throw new ParseError(`LaTeX's $funcName} doesn't support mu units`, token)\n        }\n      }\n    }\n    return {\n      type: \"kern\",\n      mode: parser.mode,\n      dimension: size.value\n    };\n  },\n  mathmlBuilder(group, style) {\n    const dimension = calculateSize(group.dimension, style);\n    const ch = dimension.unit === \"em\" ? spaceCharacter(dimension.number) : \"\";\n    if (group.mode === \"text\" && ch.length > 0) {\n      const character = new mathMLTree.TextNode(ch);\n      return new mathMLTree.MathNode(\"mtext\", [character]);\n    } else {\n      const node = new mathMLTree.MathNode(\"mspace\");\n      node.setAttribute(\"width\", dimension.number + dimension.unit);\n      if (dimension.number < 0) {\n        node.style.marginLeft = dimension.number + dimension.unit;\n      }\n      return node;\n    }\n  }\n});\n\nconst spaceCharacter = function(width) {\n  if (width >= 0.05555 && width <= 0.05556) {\n    return \"\\u200a\"; // &VeryThinSpace;\n  } else if (width >= 0.1666 && width <= 0.1667) {\n    return \"\\u2009\"; // &ThinSpace;\n  } else if (width >= 0.2222 && width <= 0.2223) {\n    return \"\\u2005\"; // &MediumSpace;\n  } else if (width >= 0.2777 && width <= 0.2778) {\n    return \"\\u2005\\u200a\"; // &ThickSpace;\n  } else {\n    return \"\";\n  }\n};\n\n// Limit valid characters to a small set, for safety.\nconst invalidIdRegEx = /[^A-Za-z_0-9-]/g;\n\ndefineFunction({\n  type: \"label\",\n  names: [\"\\\\label\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"raw\"]\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"label\",\n      mode: parser.mode,\n      string: args[0].string.replace(invalidIdRegEx, \"\")\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Return a no-width, no-ink element with an HTML id.\n    const node = new mathMLTree.MathNode(\"mrow\", [], [\"tml-label\"]);\n    if (group.string.length > 0) {\n      node.setLabel(group.string);\n    }\n    return node\n  }\n});\n\n// Horizontal overlap functions\n\nconst textModeLap = [\"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"];\n\ndefineFunction({\n  type: \"lap\",\n  names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\", \"\\\\clap\", \"\\\\llap\", \"\\\\rlap\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser, funcName, token }, args) => {\n    if (textModeLap.includes(funcName)) {\n      if (parser.settings.strict && parser.mode !== \"text\") {\n        throw new ParseError(`{$funcName}} can be used only in text mode.\n Try \\\\math$funcName.slice(1)}`, token)\n      }\n      funcName = funcName.slice(1);\n    } else {\n      funcName = funcName.slice(5);\n    }\n    const body = args[0];\n    return {\n      type: \"lap\",\n      mode: parser.mode,\n      alignment: funcName,\n      body\n    }\n  },\n  mathmlBuilder: (group, style) => {\n    // mathllap, mathrlap, mathclap\n    let strut;\n    if (group.alignment === \"llap\") {\n      // We need an invisible strut with the same depth as the group.\n      // We can't just read the depth, so we use \\vphantom methods.\n      const phantomInner = buildExpression(ordargument(group.body), style);\n      const phantom = new mathMLTree.MathNode(\"mphantom\", phantomInner);\n      strut = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n      strut.setAttribute(\"width\", \"0px\");\n    }\n\n    const inner = buildGroup$1(group.body, style);\n    let node;\n    if (group.alignment === \"llap\") {\n      inner.style.position = \"absolute\";\n      inner.style.right = \"0\";\n      inner.style.bottom = `0`; // If we could have read the ink depth, it would go here.\n      node = new mathMLTree.MathNode(\"mpadded\", [strut, inner]);\n    } else {\n      node = new mathMLTree.MathNode(\"mpadded\", [inner]);\n    }\n\n    if (group.alignment === \"rlap\") {\n      if (group.body.body.length > 0 && group.body.body[0].type === \"genfrac\") {\n        // In Firefox, a <mpadded> squashes the 3/18em padding of a child \\frac. Put it back.\n        node.setAttribute(\"lspace\", \"0.16667em\");\n      }\n    } else {\n      const offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n      node.setAttribute(\"lspace\", offset + \"width\");\n      if (group.alignment === \"llap\") {\n        node.style.position = \"relative\";\n      } else {\n        node.style.display = \"flex\";\n        node.style.justifyContent = \"center\";\n      }\n    }\n    node.setAttribute(\"width\", \"0px\");\n    return node\n  }\n});\n\n// Switching from text mode back to math mode\ndefineFunction({\n  type: \"ordgroup\",\n  names: [\"\\\\(\", \"$\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler({ funcName, parser }, args) {\n    const outerMode = parser.mode;\n    parser.switchMode(\"math\");\n    const close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n    const body = parser.parseExpression(false, close);\n    parser.expect(close);\n    parser.switchMode(outerMode);\n    return {\n      type: \"ordgroup\",\n      mode: parser.mode,\n      body\n    };\n  }\n});\n\n// Check for extra closing math delimiters\ndefineFunction({\n  type: \"text\", // Doesn't matter what this is.\n  names: [\"\\\\)\", \"\\\\]\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    allowedInMath: false\n  },\n  handler(context, token) {\n    throw new ParseError(`Mismatched $context.funcName}`, token);\n  }\n});\n\nconst chooseStyle = (group, style) => {\n  switch (style.level) {\n    case StyleLevel.DISPLAY:       // 0\n      return group.display;\n    case StyleLevel.TEXT:          // 1\n      return group.text;\n    case StyleLevel.SCRIPT:        // 2\n      return group.script;\n    case StyleLevel.SCRIPTSCRIPT:  // 3\n      return group.scriptscript;\n    default:\n      return group.text;\n  }\n};\n\ndefineFunction({\n  type: \"mathchoice\",\n  names: [\"\\\\mathchoice\"],\n  props: {\n    numArgs: 4,\n    primitive: true\n  },\n  handler: ({ parser }, args) => {\n    return {\n      type: \"mathchoice\",\n      mode: parser.mode,\n      display: ordargument(args[0]),\n      text: ordargument(args[1]),\n      script: ordargument(args[2]),\n      scriptscript: ordargument(args[3])\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const body = chooseStyle(group, style);\n    return buildExpressionRow(body, style);\n  }\n});\n\nconst textAtomTypes = [\"text\", \"textord\", \"mathord\", \"atom\"];\n\nconst padding = width => {\n  const node = new mathMLTree.MathNode(\"mspace\");\n  node.setAttribute(\"width\", width + \"em\");\n  return node\n};\n\nfunction mathmlBuilder$3(group, style) {\n  let node;\n  const inner = buildExpression(group.body, style);\n\n  if (group.mclass === \"minner\") {\n    node = new mathMLTree.MathNode(\"mpadded\", inner);\n  } else if (group.mclass === \"mord\") {\n    if (group.isCharacterBox || inner[0].type === \"mathord\") {\n      node = inner[0];\n      node.type = \"mi\";\n      if (node.children.length === 1 && node.children[0].text && node.children[0].text === \"\u2207\") {\n        node.setAttribute(\"mathvariant\", \"normal\");\n      }\n    } else {\n      node = new mathMLTree.MathNode(\"mi\", inner);\n    }\n  } else {\n    node = new mathMLTree.MathNode(\"mrow\", inner);\n    if (group.mustPromote) {\n      node = inner[0];\n      node.type = \"mo\";\n      if (group.isCharacterBox && group.body[0].text && /[A-Za-z]/.test(group.body[0].text)) {\n        node.setAttribute(\"mathvariant\", \"italic\");\n      }\n    } else {\n      node = new mathMLTree.MathNode(\"mrow\", inner);\n    }\n\n    // Set spacing based on what is the most likely adjacent atom type.\n    // See TeXbook p170.\n    const doSpacing = style.level < 2; // Operator spacing is zero inside a (sub|super)script.\n    if (node.type === \"mrow\") {\n      if (doSpacing ) {\n        if (group.mclass === \"mbin\") {\n          // medium space\n          node.children.unshift(padding(0.2222));\n          node.children.push(padding(0.2222));\n        } else if (group.mclass === \"mrel\") {\n          // thickspace\n          node.children.unshift(padding(0.2778));\n          node.children.push(padding(0.2778));\n        } else if (group.mclass === \"mpunct\") {\n          node.children.push(padding(0.1667));\n        } else if (group.mclass === \"minner\") {\n          node.children.unshift(padding(0.0556));  // 1 mu is the most likely option\n          node.children.push(padding(0.0556));\n        }\n      }\n    } else {\n      if (group.mclass === \"mbin\") {\n        // medium space\n        node.attributes.lspace = (doSpacing ? \"0.2222em\" : \"0\");\n        node.attributes.rspace = (doSpacing ? \"0.2222em\" : \"0\");\n      } else if (group.mclass === \"mrel\") {\n        // thickspace\n        node.attributes.lspace = (doSpacing ? \"0.2778em\" : \"0\");\n        node.attributes.rspace = (doSpacing ? \"0.2778em\" : \"0\");\n      } else if (group.mclass === \"mpunct\") {\n        node.attributes.lspace = \"0em\";\n        node.attributes.rspace = (doSpacing ? \"0.1667em\" : \"0\");\n      } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n        node.attributes.lspace = \"0em\";\n        node.attributes.rspace = \"0em\";\n      } else if (group.mclass === \"minner\" && doSpacing) {\n        node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n        node.attributes.width = \"+0.1111em\";\n      }\n    }\n\n    if (!(group.mclass === \"mopen\" || group.mclass === \"mclose\")) {\n      delete node.attributes.stretchy;\n      delete node.attributes.form;\n    }\n  }\n  return node;\n}\n\n// Math class commands except \\mathop\ndefineFunction({\n  type: \"mclass\",\n  names: [\n    \"\\\\mathord\",\n    \"\\\\mathbin\",\n    \"\\\\mathrel\",\n    \"\\\\mathopen\",\n    \"\\\\mathclose\",\n    \"\\\\mathpunct\",\n    \"\\\\mathinner\"\n  ],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    const isCharacterBox = utils.isCharacterBox(body);\n    // We should not wrap a <mo> around a <mi> or <mord>. That would be invalid MathML.\n    // In that case, we instead promote the text contents of the body to the parent.\n    let mustPromote = true;\n    const mord = { type: \"mathord\", text: \"\", mode: parser.mode };\n    const arr = (body.body) ? body.body : [body];\n    for (const arg of arr) {\n      if (textAtomTypes.includes(arg.type)) {\n        if (symbols[parser.mode][arg.text]) {\n          mord.text += symbols[parser.mode][arg.text].replace;\n        } else if (arg.text) {\n          mord.text += arg.text;\n        } else if (arg.body) {\n          arg.body.map(e => { mord.text += e.text; });\n        }\n      } else {\n        mustPromote = false;\n        break\n      }\n    }\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: \"m\" + funcName.slice(5),\n      body: ordargument(mustPromote ? mord : body),\n      isCharacterBox,\n      mustPromote\n    };\n  },\n  mathmlBuilder: mathmlBuilder$3\n});\n\nconst binrelClass = (arg) => {\n  // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n  // (by rendering separately and with {}s before and after, and measuring\n  // the change in spacing).  We'll do roughly the same by detecting the\n  // atom type directly.\n  const atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n  if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n    return \"m\" + atom.family;\n  } else {\n    return \"mord\";\n  }\n};\n\n// \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\@binrel\"],\n  props: {\n    numArgs: 2\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"mclass\",\n      mode: parser.mode,\n      mclass: binrelClass(args[0]),\n      body: ordargument(args[1]),\n      isCharacterBox: utils.isCharacterBox(args[1])\n    };\n  }\n});\n\n// Build a relation or stacked op by placing one symbol on top of another\ndefineFunction({\n  type: \"mclass\",\n  names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n  props: {\n    numArgs: 2\n  },\n  handler({ parser, funcName }, args) {\n    const baseArg = args[1];\n    const shiftedArg = args[0];\n\n    const baseOp = {\n      type: \"op\",\n      mode: baseArg.mode,\n      limits: true,\n      alwaysHandleSupSub: true,\n      parentIsSupSub: false,\n      symbol: false,\n      stack: true,\n      suppressBaseShift: funcName !== \"\\\\stackrel\",\n      body: ordargument(baseArg)\n    };\n\n    return {\n      type: \"supsub\",\n      mode: shiftedArg.mode,\n      base: baseOp,\n      sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n      sub: funcName === \"\\\\underset\" ? shiftedArg : null\n    };\n  },\n  mathmlBuilder: mathmlBuilder$3\n});\n\n// Helper function\nconst buildGroup = (el, style, noneNode) => {\n  if (!el) { return noneNode }\n  const node = buildGroup$1(el, style);\n  if (node.type === \"mrow\" && node.children.length === 0) { return noneNode }\n  return node\n};\n\ndefineFunction({\n  type: \"multiscript\",\n  names: [\"\\\\sideset\", \"\\\\pres@cript\"], // See macros.js for \\prescript\n  props: {\n    numArgs: 3\n  },\n  handler({ parser, funcName, token }, args) {\n    if (args[2].body.length === 0) {\n      throw new ParseError(funcName + `cannot parse an empty base.`)\n    }\n    const base = args[2].body[0];\n    if (parser.settings.strict && funcName === \"\\\\sideset\" && !base.symbol) {\n      throw new ParseError(`The base of \\\\sideset must be a big operator. Try \\\\prescript.`)\n    }\n\n    if ((args[0].body.length > 0 && args[0].body[0].type !== \"supsub\") ||\n        (args[1].body.length > 0 && args[1].body[0].type !== \"supsub\")) {\n      throw new ParseError(\"\\\\sideset can parse only subscripts and \" +\n                            \"superscripts in its first two arguments\", token)\n    }\n\n    // The prescripts and postscripts come wrapped in a supsub.\n    const prescripts = args[0].body.length > 0 ? args[0].body[0] : null;\n    const postscripts = args[1].body.length > 0 ? args[1].body[0] : null;\n\n    if (!prescripts && !postscripts) {\n      return base\n    } else if (!prescripts) {\n      // It's not a multi-script. Get a \\textstyle supsub.\n      return {\n        type: \"styling\",\n        mode: parser.mode,\n        scriptLevel: \"text\",\n        body: [{\n          type: \"supsub\",\n          mode: parser.mode,\n          base,\n          sup: postscripts.sup,\n          sub: postscripts.sub\n        }]\n      }\n    } else {\n      return {\n        type: \"multiscript\",\n        mode: parser.mode,\n        isSideset: funcName === \"\\\\sideset\",\n        prescripts,\n        postscripts,\n        base\n      }\n    }\n  },\n  mathmlBuilder(group, style) {\n    const base =  buildGroup$1(group.base, style);\n\n    const prescriptsNode = new mathMLTree.MathNode(\"mprescripts\");\n    const noneNode = new mathMLTree.MathNode(\"none\");\n    let children = [];\n\n    const preSub = buildGroup(group.prescripts.sub, style, noneNode);\n    const preSup = buildGroup(group.prescripts.sup, style, noneNode);\n    if (group.isSideset) {\n      // This seems silly, but LaTeX does this. Firefox ignores it, which does not make me sad.\n      preSub.setAttribute(\"style\", \"text-align: left;\");\n      preSup.setAttribute(\"style\", \"text-align: left;\");\n    }\n\n    if (group.postscripts) {\n      const postSub = buildGroup(group.postscripts.sub, style, noneNode);\n      const postSup = buildGroup(group.postscripts.sup, style, noneNode);\n      children = [base, postSub, postSup, prescriptsNode, preSub, preSup];\n    } else {\n      children = [base, prescriptsNode, preSub, preSup];\n    }\n\n    return new mathMLTree.MathNode(\"mmultiscripts\", children);\n  }\n});\n\ndefineFunction({\n  type: \"not\",\n  names: [\"\\\\not\"],\n  props: {\n    numArgs: 1,\n    primitive: true,\n    allowedInText: false\n  },\n  handler({ parser }, args) {\n    const isCharacterBox = utils.isCharacterBox(args[0]);\n    let body;\n    if (isCharacterBox) {\n      body = ordargument(args[0]);\n      if (body[0].text.charAt(0) === \"\\\\\") {\n        body[0].text = symbols.math[body[0].text].replace;\n      }\n      // \\u0338 is the Unicode Combining Long Solidus Overlay\n      body[0].text = body[0].text.slice(0, 1) + \"\\u0338\" + body[0].text.slice(1);\n    } else {\n      // When the argument is not a character box, TeX does an awkward, poorly placed overlay.\n      // We'll do the same.\n      const notNode = { type: \"textord\", mode: \"math\", text: \"\\u0338\" };\n      const kernNode = { type: \"kern\", mode: \"math\", dimension: { number: -0.6, unit: \"em\" } };\n      body = [notNode, kernNode, args[0]];\n    }\n    return {\n      type: \"not\",\n      mode: parser.mode,\n      body,\n      isCharacterBox\n    };\n  },\n  mathmlBuilder(group, style) {\n    if (group.isCharacterBox) {\n      const inner = buildExpression(group.body, style, true);\n      return inner[0]\n    } else {\n      return buildExpressionRow(group.body, style)\n    }\n  }\n});\n\n// Limits, symbols\n\n// Some helpers\n\nconst ordAtomTypes = [\"textord\", \"mathord\", \"atom\"];\n\n// Most operators have a large successor symbol, but these don't.\nconst noSuccessor = [\"\\\\smallint\"];\n\n// Math operators (e.g. \\sin) need a space between these types and themselves:\nconst ordTypes = [\"textord\", \"mathord\", \"ordgroup\", \"close\", \"leftright\", \"font\"];\n\n// NOTE: Unlike most `builders`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\n\nconst setSpacing = node => {\n  // The user wrote a \\mathop{\u2026} function. Change spacing from default to OP spacing.\n  // The most likely spacing for an OP is a thin space per TeXbook p170.\n  node.attributes.lspace = \"0.1667em\";\n  node.attributes.rspace = \"0.1667em\";\n};\n\nconst mathmlBuilder$2 = (group, style) => {\n  let node;\n\n  if (group.symbol) {\n    // This is a symbol. Just add the symbol.\n    node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n    if (noSuccessor.includes(group.name)) {\n      node.setAttribute(\"largeop\", \"false\");\n    } else {\n      node.setAttribute(\"movablelimits\", \"false\");\n    }\n    if (group.fromMathOp) { setSpacing(node); }\n  } else if (group.body) {\n    // This is an operator with children. Add them.\n    node = new MathNode(\"mo\", buildExpression(group.body, style));\n    if (group.fromMathOp) { setSpacing(node); }\n  } else {\n    // This is a text operator. Add all of the characters from the operator's name.\n    node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]);\n\n    if (!group.parentIsSupSub) {\n      // Append an invisible <mo>&ApplyFunction;</mo>.\n      // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n      const operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n      const row = [node, operator];\n      // Set spacing\n      if (group.needsLeadingSpace) {\n        const lead = new MathNode(\"mspace\");\n        lead.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        row.unshift(lead);\n      }\n      if (!group.isFollowedByDelimiter) {\n        const trail = new MathNode(\"mspace\");\n        trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        row.push(trail);\n      }\n      node = new MathNode(\"mrow\", row);\n    }\n  }\n\n  return node;\n};\n\nconst singleCharBigOps = {\n  \"\\u220F\": \"\\\\prod\",\n  \"\\u2210\": \"\\\\coprod\",\n  \"\\u2211\": \"\\\\sum\",\n  \"\\u22c0\": \"\\\\bigwedge\",\n  \"\\u22c1\": \"\\\\bigvee\",\n  \"\\u22c2\": \"\\\\bigcap\",\n  \"\\u22c3\": \"\\\\bigcup\",\n  \"\\u2a00\": \"\\\\bigodot\",\n  \"\\u2a01\": \"\\\\bigoplus\",\n  \"\\u2a02\": \"\\\\bigotimes\",\n  \"\\u2a04\": \"\\\\biguplus\",\n  \"\\u2a05\": \"\\\\bigsqcap\",\n  \"\\u2a06\": \"\\\\bigsqcup\",\n  \"\\u2a03\": \"\\\\bigcupdot\",\n  \"\\u2a07\": \"\\\\bigdoublevee\",\n  \"\\u2a08\": \"\\\\bigdoublewedge\",\n  \"\\u2a09\": \"\\\\bigtimes\"\n};\n\ndefineFunction({\n  type: \"op\",\n  names: [\n    \"\\\\coprod\",\n    \"\\\\bigvee\",\n    \"\\\\bigwedge\",\n    \"\\\\biguplus\",\n    \"\\\\bigcupplus\",\n    \"\\\\bigcupdot\",\n    \"\\\\bigcap\",\n    \"\\\\bigcup\",\n    \"\\\\bigdoublevee\",\n    \"\\\\bigdoublewedge\",\n    \"\\\\intop\",\n    \"\\\\prod\",\n    \"\\\\sum\",\n    \"\\\\bigotimes\",\n    \"\\\\bigoplus\",\n    \"\\\\bigodot\",\n    \"\\\\bigsqcap\",\n    \"\\\\bigsqcup\",\n    \"\\\\bigtimes\",\n    \"\\\\smallint\",\n    \"\\u220F\",\n    \"\\u2210\",\n    \"\\u2211\",\n    \"\\u22c0\",\n    \"\\u22c1\",\n    \"\\u22c2\",\n    \"\\u22c3\",\n    \"\\u2a00\",\n    \"\\u2a01\",\n    \"\\u2a02\",\n    \"\\u2a04\",\n    \"\\u2a06\"\n  ],\n  props: {\n    numArgs: 0\n  },\n  handler: ({ parser, funcName }, args) => {\n    let fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharBigOps[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: true,\n      stack: false, // This is true for \\stackrel{}, not here.\n      name: fName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// Note: calling defineFunction with a type that's already been defined only\n// works because the same mathmlBuilder is being used.\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\mathop\"],\n  props: {\n    numArgs: 1,\n    primitive: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    // It would be convienient to just wrap a <mo> around the argument.\n    // But if the argument is a <mi> or <mord>, that would be invalid MathML.\n    // In that case, we instead promote the text contents of the body to the parent.\n    const arr = (body.body) ? body.body : [body];\n    const isSymbol = arr.length === 1 && ordAtomTypes.includes(arr[0].type);\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: isSymbol,\n      fromMathOp: true,\n      stack: false,\n      name: isSymbol ? arr[0].text : null,\n      body: isSymbol ? null : ordargument(body)\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\n\nconst singleCharIntegrals = {\n  \"\\u222b\": \"\\\\int\",\n  \"\\u222c\": \"\\\\iint\",\n  \"\\u222d\": \"\\\\iiint\",\n  \"\\u222e\": \"\\\\oint\",\n  \"\\u222f\": \"\\\\oiint\",\n  \"\\u2230\": \"\\\\oiiint\",\n  \"\\u2231\": \"\\\\intclockwise\",\n  \"\\u2232\": \"\\\\varointclockwise\",\n  \"\\u2a0c\": \"\\\\iiiint\",\n  \"\\u2a0d\": \"\\\\intbar\",\n  \"\\u2a0e\": \"\\\\intBar\",\n  \"\\u2a0f\": \"\\\\fint\",\n  \"\\u2a12\": \"\\\\rppolint\",\n  \"\\u2a13\": \"\\\\scpolint\",\n  \"\\u2a15\": \"\\\\pointint\",\n  \"\\u2a16\": \"\\\\sqint\",\n  \"\\u2a17\": \"\\\\intlarhk\",\n  \"\\u2a18\": \"\\\\intx\",\n  \"\\u2a19\": \"\\\\intcap\",\n  \"\\u2a1a\": \"\\\\intcup\"\n};\n\n// No limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\n    \"\\\\arcsin\",\n    \"\\\\arccos\",\n    \"\\\\arctan\",\n    \"\\\\arctg\",\n    \"\\\\arcctg\",\n    \"\\\\arg\",\n    \"\\\\ch\",\n    \"\\\\cos\",\n    \"\\\\cosec\",\n    \"\\\\cosh\",\n    \"\\\\cot\",\n    \"\\\\cotg\",\n    \"\\\\coth\",\n    \"\\\\csc\",\n    \"\\\\ctg\",\n    \"\\\\cth\",\n    \"\\\\deg\",\n    \"\\\\dim\",\n    \"\\\\exp\",\n    \"\\\\hom\",\n    \"\\\\ker\",\n    \"\\\\lg\",\n    \"\\\\ln\",\n    \"\\\\log\",\n    \"\\\\sec\",\n    \"\\\\sin\",\n    \"\\\\sinh\",\n    \"\\\\sh\",\n    \"\\\\sgn\",\n    \"\\\\tan\",\n    \"\\\\tanh\",\n    \"\\\\tg\",\n    \"\\\\th\"\n  ],\n  props: {\n    numArgs: 0\n  },\n  handler({ parser, funcName }) {\n    const prevAtomType = parser.prevAtomType;\n    const next = parser.gullet.future().text;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: false,\n      stack: false,\n      isFollowedByDelimiter: isDelimiter(next),\n      needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n      name: funcName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// Limits, not symbols\ndefineFunction({\n  type: \"op\",\n  names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n  props: {\n    numArgs: 0\n  },\n  handler({ parser, funcName }) {\n    const prevAtomType = parser.prevAtomType;\n    const next = parser.gullet.future().text;\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: true,\n      parentIsSupSub: false,\n      symbol: false,\n      stack: false,\n      isFollowedByDelimiter: isDelimiter(next),\n      needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType),\n      name: funcName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// No limits, symbols\ndefineFunction({\n  type: \"op\",\n  names: [\n    \"\\\\int\",\n    \"\\\\iint\",\n    \"\\\\iiint\",\n    \"\\\\iiiint\",\n    \"\\\\oint\",\n    \"\\\\oiint\",\n    \"\\\\oiiint\",\n    \"\\\\intclockwise\",\n    \"\\\\varointclockwise\",\n    \"\\\\intbar\",\n    \"\\\\intBar\",\n    \"\\\\fint\",\n    \"\\\\rppolint\",\n    \"\\\\scpolint\",\n    \"\\\\pointint\",\n    \"\\\\sqint\",\n    \"\\\\intlarhk\",\n    \"\\\\intx\",\n    \"\\\\intcap\",\n    \"\\\\intcup\",\n    \"\\u222b\",\n    \"\\u222c\",\n    \"\\u222d\",\n    \"\\u222e\",\n    \"\\u222f\",\n    \"\\u2230\",\n    \"\\u2231\",\n    \"\\u2232\",\n    \"\\u2a0c\",\n    \"\\u2a0d\",\n    \"\\u2a0e\",\n    \"\\u2a0f\",\n    \"\\u2a12\",\n    \"\\u2a13\",\n    \"\\u2a15\",\n    \"\\u2a16\",\n    \"\\u2a17\",\n    \"\\u2a18\",\n    \"\\u2a19\",\n    \"\\u2a1a\"\n  ],\n  props: {\n    numArgs: 0\n  },\n  handler({ parser, funcName }) {\n    let fName = funcName;\n    if (fName.length === 1) {\n      fName = singleCharIntegrals[fName];\n    }\n    return {\n      type: \"op\",\n      mode: parser.mode,\n      limits: false,\n      parentIsSupSub: false,\n      symbol: true,\n      stack: false,\n      name: fName\n    };\n  },\n  mathmlBuilder: mathmlBuilder$2\n});\n\n// NOTE: Unlike most builders, this one handles not only\n// \"operatorname\", but also  \"supsub\" since \\operatorname* can\n// affect super/subscripting.\n\nconst mathmlBuilder$1 = (group, style) => {\n  let expression = buildExpression(group.body, style.withFont(\"mathrm\"));\n\n  // Is expression a string or has it something like a fraction?\n  let isAllString = true; // default\n  for (let i = 0; i < expression.length; i++) {\n    let node = expression[i];\n    if (node instanceof mathMLTree.MathNode) {\n      if (node.type === \"mrow\" && node.children.length === 1 &&\n          node.children[0] instanceof mathMLTree.MathNode) {\n        node = node.children[0];\n      }\n      switch (node.type) {\n        case \"mi\":\n        case \"mn\":\n        case \"ms\":\n        case \"mtext\":\n          break; // Do nothing yet.\n        case \"mspace\":\n          {\n            if (node.attributes.width) {\n              const width = node.attributes.width.replace(\"em\", \"\");\n              const ch = spaceCharacter(Number(width));\n              if (ch === \"\") {\n                isAllString = false;\n              } else {\n                expression[i] = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(ch)]);\n              }\n            }\n          }\n          break\n        case \"mo\": {\n          const child = node.children[0];\n          if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {\n            child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n          } else {\n            isAllString = false;\n          }\n          break\n        }\n        default:\n          isAllString = false;\n      }\n    } else {\n      isAllString = false;\n    }\n  }\n\n  if (isAllString) {\n    // Write a single TextNode instead of multiple nested tags.\n    const word = expression.map((node) => node.toText()).join(\"\");\n    expression = [new mathMLTree.TextNode(word)];\n  } else if (\n    expression.length === 1\n    && [\"mover\", \"munder\"].includes(expression[0].type) &&\n    (expression[0].children[0].type === \"mi\" || expression[0].children[0].type === \"mtext\")\n  ) {\n    expression[0].children[0].type = \"mi\";\n    if (group.parentIsSupSub) {\n      return new mathMLTree.MathNode(\"mrow\", expression)\n    } else {\n      const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n      return mathMLTree.newDocumentFragment([expression[0], operator])\n    }\n  }\n\n  let wrapper;\n  if (isAllString) {\n    wrapper = new mathMLTree.MathNode(\"mi\", expression);\n    if (expression[0].text.length === 1) {\n      wrapper.setAttribute(\"mathvariant\", \"normal\");\n    }\n  } else {\n    wrapper = new mathMLTree.MathNode(\"mrow\", expression);\n  }\n\n  if (!group.parentIsSupSub) {\n    // Append an <mo>&ApplyFunction;</mo>.\n    // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n    const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n    const fragment = [wrapper, operator];\n    if (group.needsLeadingSpace) {\n      // LaTeX gives operator spacing, but a <mi> gets ord spacing.\n      // So add a leading space.\n      const space = new mathMLTree.MathNode(\"mspace\");\n      space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n      fragment.unshift(space);\n    }\n    if (!group.isFollowedByDelimiter) {\n      const trail = new mathMLTree.MathNode(\"mspace\");\n      trail.setAttribute(\"width\", \"0.1667em\"); // thin space.\n      fragment.push(trail);\n    }\n    return mathMLTree.newDocumentFragment(fragment)\n  }\n\n  return wrapper\n};\n\n// \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\ndefineFunction({\n  type: \"operatorname\",\n  names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n  props: {\n    numArgs: 1,\n    allowedInArgument: true\n  },\n  handler: ({ parser, funcName }, args) => {\n    const body = args[0];\n    const prevAtomType = parser.prevAtomType;\n    const next = parser.gullet.future().text;\n    return {\n      type: \"operatorname\",\n      mode: parser.mode,\n      body: ordargument(body),\n      alwaysHandleSupSub: (funcName === \"\\\\operatornamewithlimits\"),\n      limits: false,\n      parentIsSupSub: false,\n      isFollowedByDelimiter: isDelimiter(next),\n      needsLeadingSpace: prevAtomType.length > 0 && ordTypes.includes(prevAtomType)\n    };\n  },\n  mathmlBuilder: mathmlBuilder$1\n});\n\ndefineMacro(\"\\\\operatorname\",\n  \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n  type: \"ordgroup\",\n  mathmlBuilder(group, style) {\n    return buildExpressionRow(group.body, style, group.semisimple);\n  }\n});\n\ndefineFunction({\n  type: \"phantom\",\n  names: [\"\\\\phantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    return {\n      type: \"phantom\",\n      mode: parser.mode,\n      body: ordargument(body)\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const inner = buildExpression(group.body, style);\n    return new mathMLTree.MathNode(\"mphantom\", inner);\n  }\n});\n\ndefineFunction({\n  type: \"hphantom\",\n  names: [\"\\\\hphantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    return {\n      type: \"hphantom\",\n      mode: parser.mode,\n      body\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const inner = buildExpression(ordargument(group.body), style);\n    const phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n    const node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n    node.setAttribute(\"height\", \"0px\");\n    node.setAttribute(\"depth\", \"0px\");\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"vphantom\",\n  names: [\"\\\\vphantom\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args) => {\n    const body = args[0];\n    return {\n      type: \"vphantom\",\n      mode: parser.mode,\n      body\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const inner = buildExpression(ordargument(group.body), style);\n    const phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n    const node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n    node.setAttribute(\"width\", \"0px\");\n    return node;\n  }\n});\n\n// In LaTeX, \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies of the argument\n// with small offsets. We use CSS font-weight:bold.\n\ndefineFunction({\n  type: \"pmb\",\n  names: [\"\\\\pmb\"],\n  props: {\n    numArgs: 1,\n    allowedInText: true\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"pmb\",\n      mode: parser.mode,\n      body: ordargument(args[0])\n    }\n  },\n  mathmlBuilder(group, style) {\n    const inner = buildExpression(group.body, style);\n    // Wrap with an <mstyle> element.\n    const node = wrapWithMstyle(inner);\n    node.setAttribute(\"style\", \"font-weight:bold\");\n    return node\n  }\n});\n\n// \\raise, \\lower, and \\raisebox\n\nconst mathmlBuilder = (group, style) => {\n  const newStyle = style.withLevel(StyleLevel.TEXT);\n  const node = new mathMLTree.MathNode(\"mpadded\", [buildGroup$1(group.body, newStyle)]);\n  const dy = calculateSize(group.dy, style);\n  node.setAttribute(\"voffset\", dy.number + dy.unit);\n  // Add padding, which acts to increase height in Chromium.\n  // TODO: Figure out some way to change height in Firefox w/o breaking Chromium.\n  if (dy.number > 0) {\n    node.style.padding = dy.number + dy.unit + \" 0 0 0\";\n  } else {\n    node.style.padding = \"0 0 \" + Math.abs(dy.number) + dy.unit + \" 0\";\n  }\n  return node\n};\n\ndefineFunction({\n  type: \"raise\",\n  names: [\"\\\\raise\", \"\\\\lower\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"size\", \"primitive\"],\n    primitive: true\n  },\n  handler({ parser, funcName }, args) {\n    const amount = assertNodeType(args[0], \"size\").value;\n    if (funcName === \"\\\\lower\") { amount.number *= -1; }\n    const body = args[1];\n    return {\n      type: \"raise\",\n      mode: parser.mode,\n      dy: amount,\n      body\n    };\n  },\n  mathmlBuilder\n});\n\n\ndefineFunction({\n  type: \"raise\",\n  names: [\"\\\\raisebox\"],\n  props: {\n    numArgs: 2,\n    argTypes: [\"size\", \"hbox\"],\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const amount = assertNodeType(args[0], \"size\").value;\n    const body = args[1];\n    return {\n      type: \"raise\",\n      mode: parser.mode,\n      dy: amount,\n      body\n    };\n  },\n  mathmlBuilder\n});\n\ndefineFunction({\n  type: \"ref\",\n  names: [\"\\\\ref\", \"\\\\eqref\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"raw\"]\n  },\n  handler({ parser, funcName }, args) {\n    return {\n      type: \"ref\",\n      mode: parser.mode,\n      funcName,\n      string: args[0].string.replace(invalidIdRegEx, \"\")\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Create an empty <a> node. Set a class and an href attribute.\n    // The post-processor will populate with the target's tag or equation number.\n    const classes = group.funcName === \"\\\\ref\" ? [\"tml-ref\"] : [\"tml-ref\", \"tml-eqref\"];\n    return new AnchorNode(\"#\" + group.string, classes, null)\n  }\n});\n\ndefineFunction({\n  type: \"reflect\",\n  names: [\"\\\\reflectbox\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"hbox\"],\n    allowedInText: true\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"reflect\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    const node = buildGroup$1(group.body, style);\n    node.style.transform = \"scaleX(-1)\";\n    return node\n  }\n});\n\ndefineFunction({\n  type: \"internal\",\n  names: [\"\\\\relax\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler({ parser }) {\n    return {\n      type: \"internal\",\n      mode: parser.mode\n    };\n  }\n});\n\ndefineFunction({\n  type: \"rule\",\n  names: [\"\\\\rule\"],\n  props: {\n    numArgs: 2,\n    numOptionalArgs: 1,\n    allowedInText: true,\n    allowedInMath: true,\n    argTypes: [\"size\", \"size\", \"size\"]\n  },\n  handler({ parser }, args, optArgs) {\n    const shift = optArgs[0];\n    const width = assertNodeType(args[0], \"size\");\n    const height = assertNodeType(args[1], \"size\");\n    return {\n      type: \"rule\",\n      mode: parser.mode,\n      shift: shift && assertNodeType(shift, \"size\").value,\n      width: width.value,\n      height: height.value\n    };\n  },\n  mathmlBuilder(group, style) {\n    const width = calculateSize(group.width, style);\n    const height = calculateSize(group.height, style);\n    const shift = group.shift\n      ? calculateSize(group.shift, style)\n      : { number: 0, unit: \"em\" };\n    const color = (style.color && style.getColor()) || \"black\";\n\n    const rule = new mathMLTree.MathNode(\"mspace\");\n    if (width.number > 0 && height.number > 0) {\n      rule.setAttribute(\"mathbackground\", color);\n    }\n    rule.setAttribute(\"width\", width.number + width.unit);\n    rule.setAttribute(\"height\", height.number + height.unit);\n    if (shift.number === 0) { return rule }\n\n    const wrapper = new mathMLTree.MathNode(\"mpadded\", [rule]);\n    if (shift.number >= 0) {\n      wrapper.setAttribute(\"height\", \"+\" + shift.number + shift.unit);\n    } else {\n      wrapper.setAttribute(\"height\", shift.number + shift.unit);\n      wrapper.setAttribute(\"depth\", \"+\" + -shift.number + shift.unit);\n    }\n    wrapper.setAttribute(\"voffset\", shift.number + shift.unit);\n    return wrapper;\n  }\n});\n\n// The size mappings are taken from TeX with \\normalsize=10pt.\n// We don't have to track script level. MathML does that.\nconst sizeMap = {\n  \"\\\\tiny\": 0.5,\n  \"\\\\sixptsize\": 0.6,\n  \"\\\\Tiny\": 0.6,\n  \"\\\\scriptsize\": 0.7,\n  \"\\\\footnotesize\": 0.8,\n  \"\\\\small\": 0.9,\n  \"\\\\normalsize\": 1.0,\n  \"\\\\large\": 1.2,\n  \"\\\\Large\": 1.44,\n  \"\\\\LARGE\": 1.728,\n  \"\\\\huge\": 2.074,\n  \"\\\\Huge\": 2.488\n};\n\ndefineFunction({\n  type: \"sizing\",\n  names: [\n    \"\\\\tiny\",\n    \"\\\\sixptsize\",\n    \"\\\\Tiny\",\n    \"\\\\scriptsize\",\n    \"\\\\footnotesize\",\n    \"\\\\small\",\n    \"\\\\normalsize\",\n    \"\\\\large\",\n    \"\\\\Large\",\n    \"\\\\LARGE\",\n    \"\\\\huge\",\n    \"\\\\Huge\"\n  ],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler: ({ breakOnTokenText, funcName, parser }, args) => {\n    if (parser.settings.strict && parser.mode === \"math\") {\n      // eslint-disable-next-line no-console\n      console.log(`Temml strict-mode warning: Command $funcName} is invalid in math mode.`);\n    }\n    const body = parser.parseExpression(false, breakOnTokenText, true);\n    return {\n      type: \"sizing\",\n      mode: parser.mode,\n      funcName,\n      body\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const newStyle = style.withFontSize(sizeMap[group.funcName]);\n    const inner = buildExpression(group.body, newStyle);\n    // Wrap with an <mstyle> element.\n    const node = wrapWithMstyle(inner);\n    const factor = (sizeMap[group.funcName] / style.fontSize).toFixed(4);\n    node.setAttribute(\"mathsize\", factor + \"em\");\n    return node;\n  }\n});\n\n// smash, with optional [tb], as in AMS\n\ndefineFunction({\n  type: \"smash\",\n  names: [\"\\\\smash\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1,\n    allowedInText: true\n  },\n  handler: ({ parser }, args, optArgs) => {\n    let smashHeight = false;\n    let smashDepth = false;\n    const tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n    if (tbArg) {\n      // Optional [tb] argument is engaged.\n      // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n      //               def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n      let letter = \"\";\n      for (let i = 0; i < tbArg.body.length; ++i) {\n        const node = tbArg.body[i];\n        // TODO: Write an AssertSymbolNode\n        letter = node.text;\n        if (letter === \"t\") {\n          smashHeight = true;\n        } else if (letter === \"b\") {\n          smashDepth = true;\n        } else {\n          smashHeight = false;\n          smashDepth = false;\n          break;\n        }\n      }\n    } else {\n      smashHeight = true;\n      smashDepth = true;\n    }\n\n    const body = args[0];\n    return {\n      type: \"smash\",\n      mode: parser.mode,\n      body,\n      smashHeight,\n      smashDepth\n    };\n  },\n  mathmlBuilder: (group, style) => {\n    const node = new mathMLTree.MathNode(\"mpadded\", [buildGroup$1(group.body, style)]);\n\n    if (group.smashHeight) {\n      node.setAttribute(\"height\", \"0px\");\n    }\n\n    if (group.smashDepth) {\n      node.setAttribute(\"depth\", \"0px\");\n    }\n\n    return node;\n  }\n});\n\ndefineFunction({\n  type: \"sqrt\",\n  names: [\"\\\\sqrt\"],\n  props: {\n    numArgs: 1,\n    numOptionalArgs: 1\n  },\n  handler({ parser }, args, optArgs) {\n    const index = optArgs[0];\n    const body = args[0];\n    return {\n      type: \"sqrt\",\n      mode: parser.mode,\n      body,\n      index\n    };\n  },\n  mathmlBuilder(group, style) {\n    const { body, index } = group;\n    return index\n      ? new mathMLTree.MathNode(\"mroot\", [\n        buildGroup$1(body, style),\n        buildGroup$1(index, style.incrementLevel())\n      ])\n    : new mathMLTree.MathNode(\"msqrt\", [buildGroup$1(body, style)]);\n  }\n});\n\nconst styleMap = {\n  display: 0,\n  text: 1,\n  script: 2,\n  scriptscript: 3\n};\n\nconst styleAttributes = {\n  display: [\"0\", \"true\"],\n  text: [\"0\", \"false\"],\n  script: [\"1\", \"false\"],\n  scriptscript: [\"2\", \"false\"]\n};\n\ndefineFunction({\n  type: \"styling\",\n  names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true,\n    primitive: true\n  },\n  handler({ breakOnTokenText, funcName, parser }, args) {\n    // parse out the implicit body\n    const body = parser.parseExpression(true, breakOnTokenText, true);\n\n    const scriptLevel = funcName.slice(1, funcName.length - 5);\n    return {\n      type: \"styling\",\n      mode: parser.mode,\n      // Figure out what scriptLevel to use by pulling out the scriptLevel from\n      // the function name\n      scriptLevel,\n      body\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Figure out what scriptLevel we're changing to.\n    const newStyle = style.withLevel(styleMap[group.scriptLevel]);\n    // The style argument in the next line does NOT directly set a MathML script level.\n    // It just tracks the style level, in case we need to know it for supsub or mathchoice.\n    const inner = buildExpression(group.body, newStyle);\n    // Wrap with an <mstyle> element.\n    const node = wrapWithMstyle(inner);\n\n    const attr = styleAttributes[group.scriptLevel];\n\n    // Here is where we set the MathML script level.\n    node.setAttribute(\"scriptlevel\", attr[0]);\n    node.setAttribute(\"displaystyle\", attr[1]);\n\n    return node;\n  }\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\n\n// Helpers\nconst symbolRegEx = /^m(over|under|underover)$/;\n\n// Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\ndefineFunctionBuilders({\n  type: \"supsub\",\n  mathmlBuilder(group, style) {\n    // Is the inner group a relevant horizonal brace?\n    let isBrace = false;\n    let isOver;\n    let isSup;\n    let appendApplyFunction = false;\n    let appendSpace = false;\n    let needsLeadingSpace = false;\n\n    if (group.base && group.base.type === \"horizBrace\") {\n      isSup = !!group.sup;\n      if (isSup === group.base.isOver) {\n        isBrace = true;\n        isOver = group.base.isOver;\n      }\n    }\n\n    if (group.base && !group.base.stack &&\n      (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n      group.base.parentIsSupSub = true;\n      appendApplyFunction = !group.base.symbol;\n      appendSpace = appendApplyFunction && !group.isFollowedByDelimiter;\n      needsLeadingSpace = group.base.needsLeadingSpace;\n    }\n\n    const children = group.base && group.base.stack\n      ? [buildGroup$1(group.base.body[0], style)]\n      : [buildGroup$1(group.base, style)];\n\n    // Note regarding scriptstyle level.\n    // (Sub|super)scripts should not shrink beyond MathML scriptlevel 2 aka \\scriptscriptstyle\n    // Ref: https://w3c.github.io/mathml-core/#the-displaystyle-and-scriptlevel-attributes\n    // (BTW, MathML scriptlevel 2 is equal to Temml level 3.)\n    // But Chromium continues to shrink the (sub|super)scripts. So we explicitly set scriptlevel 2.\n\n    const childStyle = style.inSubOrSup();\n    if (group.sub) {\n      const sub = buildGroup$1(group.sub, childStyle);\n      if (style.level === 3) { sub.setAttribute(\"scriptlevel\", \"2\"); }\n      children.push(sub);\n    }\n\n    if (group.sup) {\n      const sup = buildGroup$1(group.sup, childStyle);\n      if (style.level === 3) { sup.setAttribute(\"scriptlevel\", \"2\"); }\n      const testNode = sup.type === \"mrow\" ? sup.children[0] : sup;\n      if ((testNode && testNode.type === \"mo\" && testNode.classes.includes(\"tml-prime\"))\n        && group.base && group.base.text && \"fF\".indexOf(group.base.text) > -1) {\n        // Chromium does not address italic correction on prime.  Prevent f\u2032 from overlapping.\n        testNode.classes.push(\"prime-pad\");\n      }\n      children.push(sup);\n    }\n\n    let nodeType;\n    if (isBrace) {\n      nodeType = isOver ? \"mover\" : \"munder\";\n    } else if (!group.sub) {\n      const base = group.base;\n      if (\n        base &&\n        base.type === \"op\" &&\n        base.limits &&\n        (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n      ) {\n        nodeType = \"mover\";\n      } else if (\n        base &&\n        base.type === \"operatorname\" &&\n        base.alwaysHandleSupSub &&\n        (base.limits || style.level === StyleLevel.DISPLAY)\n      ) {\n        nodeType = \"mover\";\n      } else {\n        nodeType = \"msup\";\n      }\n    } else if (!group.sup) {\n      const base = group.base;\n      if (\n        base &&\n        base.type === \"op\" &&\n        base.limits &&\n        (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n      ) {\n        nodeType = \"munder\";\n      } else if (\n        base &&\n        base.type === \"operatorname\" &&\n        base.alwaysHandleSupSub &&\n        (base.limits || style.level === StyleLevel.DISPLAY)\n      ) {\n        nodeType = \"munder\";\n      } else {\n        nodeType = \"msub\";\n      }\n    } else {\n      const base = group.base;\n      if (base && ((base.type === \"op\" && base.limits) || base.type === \"multiscript\") &&\n        (style.level === StyleLevel.DISPLAY || base.alwaysHandleSupSub)\n      ) {\n        nodeType = \"munderover\";\n      } else if (\n        base &&\n        base.type === \"operatorname\" &&\n        base.alwaysHandleSupSub &&\n        (style.level === StyleLevel.DISPLAY || base.limits)\n      ) {\n        nodeType = \"munderover\";\n      } else {\n        nodeType = \"msubsup\";\n      }\n    }\n\n    let node = new mathMLTree.MathNode(nodeType, children);\n    if (appendApplyFunction) {\n      // Append an <mo>&ApplyFunction;</mo>.\n      // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n      const operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n      if (needsLeadingSpace) {\n        const space = new mathMLTree.MathNode(\"mspace\");\n        space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        node = mathMLTree.newDocumentFragment([space, node, operator]);\n      } else {\n        node = mathMLTree.newDocumentFragment([node, operator]);\n      }\n      if (appendSpace) {\n        const space = new mathMLTree.MathNode(\"mspace\");\n        space.setAttribute(\"width\", \"0.1667em\"); // thin space.\n        node.children.push(space);\n      }\n    } else if (symbolRegEx.test(nodeType)) {\n      // Wrap in a <mrow>. Otherwise Firefox stretchy parens will not stretch to include limits.\n      node = new mathMLTree.MathNode(\"mrow\", [node]);\n    }\n\n    return node\n  }\n});\n\n// Operator ParseNodes created in Parser.js from symbol Groups in src/symbols.js.\n\nconst short = [\"\\\\shortmid\", \"\\\\nshortmid\", \"\\\\shortparallel\",\n  \"\\\\nshortparallel\", \"\\\\smallsetminus\"];\n\nconst arrows = [\"\\\\Rsh\", \"\\\\Lsh\", \"\\\\restriction\"];\n\nconst isArrow = str => {\n  if (str.length === 1) {\n    const codePoint = str.codePointAt(0);\n    return (0x218f < codePoint && codePoint < 0x2200)\n  }\n  return str.indexOf(\"arrow\") > -1 || str.indexOf(\"harpoon\") > -1 || arrows.includes(str)\n};\n\ndefineFunctionBuilders({\n  type: \"atom\",\n  mathmlBuilder(group, style) {\n    const node = new mathMLTree.MathNode(\"mo\", [makeText(group.text, group.mode)]);\n    if (group.family === \"punct\") {\n      node.setAttribute(\"separator\", \"true\");\n    } else if (group.family === \"open\" || group.family === \"close\") {\n      // Delims built here should not stretch vertically.\n      // See delimsizing.js for stretchy delims.\n      if (group.family === \"open\") {\n        node.setAttribute(\"form\", \"prefix\");\n        // Set an explicit attribute for stretch. Otherwise Firefox may do it wrong.\n        node.setAttribute(\"stretchy\", \"false\");\n      } else if (group.family === \"close\") {\n        node.setAttribute(\"form\", \"postfix\");\n        node.setAttribute(\"stretchy\", \"false\");\n      }\n    } else if (group.text === \"\\\\mid\") {\n      // Firefox messes up this spacing if at the end of an <mrow>. See it explicitly.\n      node.setAttribute(\"lspace\", \"0.22em\"); // medium space\n      node.setAttribute(\"rspace\", \"0.22em\");\n      node.setAttribute(\"stretchy\", \"false\");\n    } else if (group.family === \"rel\" && isArrow(group.text)) {\n      node.setAttribute(\"stretchy\", \"false\");\n    } else if (short.includes(group.text)) {\n      node.setAttribute(\"mathsize\", \"70%\");\n    } else if (group.text === \":\") {\n      // \":\" is not in the MathML operator dictionary. Give it BIN spacing.\n      node.attributes.lspace = \"0.2222em\";\n      node.attributes.rspace = \"0.2222em\";\n    }\n    return node;\n  }\n});\n\n/**\n * Maps TeX font commands to \"mathvariant\" attribute in buildMathML.js\n */\nconst fontMap = {\n  // styles\n  mathbf: \"bold\",\n  mathrm: \"normal\",\n  textit: \"italic\",\n  mathit: \"italic\",\n  mathnormal: \"italic\",\n\n  // families\n  mathbb: \"double-struck\",\n  mathcal: \"script\",\n  mathfrak: \"fraktur\",\n  mathscr: \"script\",\n  mathsf: \"sans-serif\",\n  mathtt: \"monospace\"\n};\n\n/**\n * Returns the math variant as a string or null if none is required.\n */\nconst getVariant = function(group, style) {\n  // Handle font specifiers as best we can.\n  // Chromium does not support the MathML mathvariant attribute.\n  // So we'll use Unicode replacement characters instead.\n  // But first, determine the math variant.\n\n  // Deal with the \\textit, \\textbf, etc., functions.\n  if (style.fontFamily === \"texttt\") {\n    return \"monospace\"\n  } else if (style.fontFamily === \"textsc\") {\n    return \"normal\"; // handled via character substitution in symbolsOrd.js.\n  } else if (style.fontFamily === \"textsf\") {\n    if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n      return \"sans-serif-bold-italic\"\n    } else if (style.fontShape === \"textit\") {\n      return \"sans-serif-italic\"\n    } else if (style.fontWeight === \"textbf\") {\n      return \"sans-serif-bold\"\n    } else {\n      return \"sans-serif\"\n    }\n  } else if (style.fontShape === \"textit\" && style.fontWeight === \"textbf\") {\n    return \"bold-italic\"\n  } else if (style.fontShape === \"textit\") {\n    return \"italic\"\n  } else if (style.fontWeight === \"textbf\") {\n    return \"bold\"\n  }\n\n  // Deal with the \\mathit, mathbf, etc, functions.\n  const font = style.font;\n  if (!font || font === \"mathnormal\") {\n    return null\n  }\n\n  const mode = group.mode;\n  switch (font) {\n    case \"mathit\":\n      return \"italic\"\n    case \"mathrm\": {\n      const codePoint = group.text.codePointAt(0);\n      // LaTeX \\mathrm returns italic for Greek characters.\n      return  (0x03ab < codePoint && codePoint < 0x03cf) ? \"italic\" : \"normal\"\n    }\n    case \"greekItalic\":\n      return \"italic\"\n    case \"up@greek\":\n      return \"normal\"\n    case \"boldsymbol\":\n    case \"mathboldsymbol\":\n      return \"bold-italic\"\n    case \"mathbf\":\n      return \"bold\"\n    case \"mathbb\":\n      return \"double-struck\"\n    case \"mathfrak\":\n      return \"fraktur\"\n    case \"mathscr\":\n    case \"mathcal\":\n      return \"script\"\n    case \"mathsf\":\n      return \"sans-serif\"\n    case \"mathsfit\":\n      return \"sans-serif-italic\"\n    case \"mathtt\":\n      return \"monospace\"\n  }\n\n  let text = group.text;\n  if (symbols[mode][text] && symbols[mode][text].replace) {\n    text = symbols[mode][text].replace;\n  }\n\n  return Object.prototype.hasOwnProperty.call(fontMap, font) ? fontMap[font] : null\n};\n\n// Chromium does not support the MathML `mathvariant` attribute.\n// Instead, we replace ASCII characters with Unicode characters that\n// are defined in the font as bold, italic, double-struck, etc.\n// This module identifies those Unicode code points.\n\n// First, a few helpers.\nconst script = Object.freeze({\n  B: 0x20EA, // Offset from ASCII B to Unicode script B\n  E: 0x20EB,\n  F: 0x20EB,\n  H: 0x20C3,\n  I: 0x20C7,\n  L: 0x20C6,\n  M: 0x20E6,\n  R: 0x20C9,\n  e: 0x20CA,\n  g: 0x20A3,\n  o: 0x20C5\n});\n\nconst frak = Object.freeze({\n  C: 0x20EA,\n  H: 0x20C4,\n  I: 0x20C8,\n  R: 0x20CA,\n  Z: 0x20CE\n});\n\nconst bbb = Object.freeze({\n  C: 0x20BF, // blackboard bold\n  H: 0x20C5,\n  N: 0x20C7,\n  P: 0x20C9,\n  Q: 0x20C9,\n  R: 0x20CB,\n  Z: 0x20CA\n});\n\nconst bold = Object.freeze({\n  \"\\u03f5\": 0x1D2E7, // lunate epsilon\n  \"\\u03d1\": 0x1D30C, // vartheta\n  \"\\u03f0\": 0x1D2EE, // varkappa\n  \"\\u03c6\": 0x1D319, // varphi\n  \"\\u03f1\": 0x1D2EF, // varrho\n  \"\\u03d6\": 0x1D30B  // varpi\n});\n\nconst boldItalic = Object.freeze({\n  \"\\u03f5\": 0x1D35B, // lunate epsilon\n  \"\\u03d1\": 0x1D380, // vartheta\n  \"\\u03f0\": 0x1D362, // varkappa\n  \"\\u03c6\": 0x1D38D, // varphi\n  \"\\u03f1\": 0x1D363, // varrho\n  \"\\u03d6\": 0x1D37F  // varpi\n});\n\nconst boldsf = Object.freeze({\n  \"\\u03f5\": 0x1D395, // lunate epsilon\n  \"\\u03d1\": 0x1D3BA, // vartheta\n  \"\\u03f0\": 0x1D39C, // varkappa\n  \"\\u03c6\": 0x1D3C7, // varphi\n  \"\\u03f1\": 0x1D39D, // varrho\n  \"\\u03d6\": 0x1D3B9  // varpi\n});\n\nconst bisf = Object.freeze({\n  \"\\u03f5\": 0x1D3CF, // lunate epsilon\n  \"\\u03d1\": 0x1D3F4, // vartheta\n  \"\\u03f0\": 0x1D3D6, // varkappa\n  \"\\u03c6\": 0x1D401, // varphi\n  \"\\u03f1\": 0x1D3D7, // varrho\n  \"\\u03d6\": 0x1D3F3  // varpi\n});\n\n// Code point offsets below are derived from https://www.unicode.org/charts/PDF/U1D400.pdf\nconst offset = Object.freeze({\n  upperCaseLatin: { // A-Z\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D3BF },\n    \"italic\": ch =>                 { return 0x1D3F3 },\n    \"bold-italic\": ch =>            { return 0x1D427 },\n    \"script\": ch =>                 { return script[ch] || 0x1D45B },\n    \"script-bold\": ch =>            { return 0x1D48F },\n    \"fraktur\": ch =>                { return frak[ch] || 0x1D4C3 },\n    \"fraktur-bold\": ch =>           { return 0x1D52B },\n    \"double-struck\": ch =>          { return bbb[ch] || 0x1D4F7 },\n    \"sans-serif\": ch =>             { return 0x1D55F },\n    \"sans-serif-bold\": ch =>        { return 0x1D593 },\n    \"sans-serif-italic\": ch =>      { return 0x1D5C7 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D63C },\n    \"monospace\": ch =>              { return 0x1D62F }\n  },\n  lowerCaseLatin: { // a-z\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D3B9 },\n    \"italic\": ch =>                 { return ch === \"h\" ? 0x20A6 : 0x1D3ED },\n    \"bold-italic\": ch =>            { return 0x1D421 },\n    \"script\": ch =>                 { return script[ch] || 0x1D455 },\n    \"script-bold\": ch =>            { return 0x1D489 },\n    \"fraktur\": ch =>                { return 0x1D4BD },\n    \"fraktur-bold\": ch =>           { return 0x1D525 },\n    \"double-struck\": ch =>          { return 0x1D4F1 },\n    \"sans-serif\": ch =>             { return 0x1D559 },\n    \"sans-serif-bold\": ch =>        { return 0x1D58D },\n    \"sans-serif-italic\": ch =>      { return 0x1D5C1 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D5F5 },\n    \"monospace\": ch =>              { return 0x1D629 }\n  },\n  upperCaseGreek: { // A-\u03A9\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D317 },\n    \"italic\": ch =>                 { return 0x1D351 },\n    // \\boldsymbol actually returns upright bold for upperCaseGreek\n    \"bold-italic\": ch =>            { return 0x1D317 },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0 },\n    // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n    \"sans-serif\": ch =>             { return 0x1D3C5 },\n    \"sans-serif-bold\": ch =>        { return 0x1D3C5 },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D3FF },\n    \"monospace\": ch =>              { return 0 }\n  },\n  lowerCaseGreek: { // \u03B1-\u03C9\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D311 },\n    \"italic\": ch =>                 { return 0x1D34B },\n    \"bold-italic\": ch =>            { return ch === \"\\u03d5\" ? 0x1D37E : 0x1D385 },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0 },\n    // Unicode has no code points for regular-weight san-serif Greek. Use bold.\n    \"sans-serif\": ch =>             { return 0x1D3BF },\n    \"sans-serif-bold\": ch =>        { return 0x1D3BF },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return 0x1D3F9 },\n    \"monospace\": ch =>              { return 0 }\n  },\n  varGreek: { // \\varGamma, etc\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return  bold[ch] || -51 },\n    \"italic\": ch =>                 { return 0 },\n    \"bold-italic\": ch =>            { return boldItalic[ch] || 0x3A },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0 },\n    \"sans-serif\": ch =>             { return boldsf[ch] || 0x74 },\n    \"sans-serif-bold\": ch =>        { return boldsf[ch] || 0x74 },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return bisf[ch] || 0xAE },\n    \"monospace\": ch =>              { return 0 }\n  },\n  numeral: { // 0-9\n    \"normal\": ch =>                 { return 0 },\n    \"bold\": ch =>                   { return 0x1D79E },\n    \"italic\": ch =>                 { return 0 },\n    \"bold-italic\": ch =>            { return 0 },\n    \"script\": ch =>                 { return 0 },\n    \"script-bold\": ch =>            { return 0 },\n    \"fraktur\": ch =>                { return 0 },\n    \"fraktur-bold\": ch =>           { return 0 },\n    \"double-struck\": ch =>          { return 0x1D7A8 },\n    \"sans-serif\": ch =>             { return 0x1D7B2 },\n    \"sans-serif-bold\": ch =>        { return 0x1D7BC },\n    \"sans-serif-italic\": ch =>      { return 0 },\n    \"sans-serif-bold-italic\": ch => { return 0 },\n    \"monospace\": ch =>              { return 0x1D7C6 }\n  }\n});\n\nconst variantChar = (ch, variant) => {\n  const codePoint = ch.codePointAt(0);\n  const block = 0x40 < codePoint && codePoint < 0x5b\n    ? \"upperCaseLatin\"\n    : 0x60 < codePoint && codePoint < 0x7b\n    ? \"lowerCaseLatin\"\n    : (0x390  < codePoint && codePoint < 0x3AA)\n    ? \"upperCaseGreek\"\n    : 0x3B0 < codePoint && codePoint < 0x3CA || ch === \"\\u03d5\"\n    ? \"lowerCaseGreek\"\n    : 0x1D6E1 < codePoint && codePoint < 0x1D6FC  || bold[ch]\n    ? \"varGreek\"\n    : (0x2F < codePoint && codePoint <  0x3A)\n    ? \"numeral\"\n    : \"other\";\n  return block === \"other\"\n    ? ch\n    : String.fromCodePoint(codePoint + offset[block][variant](ch))\n};\n\nconst smallCaps = Object.freeze({\n  a: \"\u1D00\",\n  b: \"\u0299\",\n  c: \"\u1D04\",\n  d: \"\u1D05\",\n  e: \"\u1D07\",\n  f: \"\uA730\",\n  g: \"\u0262\",\n  h: \"\u029C\",\n  i: \"\u026A\",\n  j: \"\u1D0A\",\n  k: \"\u1D0B\",\n  l: \"\u029F\",\n  m: \"\u1D0D\",\n  n: \"\u0274\",\n  o: \"\u1D0F\",\n  p: \"\u1D18\",\n  q: \"\u01EB\",\n  r: \"\u0280\",\n  s: \"s\",\n  t: \"\u1D1B\",\n  u: \"\u1D1C\",\n  v: \"\u1D20\",\n  w: \"\u1D21\",\n  x: \"x\",\n  y: \"\u028F\",\n  z: \"\u1D22\"\n});\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\n\nconst numberRegEx = /^\\d(?:[\\d,.]*\\d)?$/;\nconst latinRegEx = /[A-Ba-z]/;\nconst primes = new Set([\"\\\\prime\", \"\\\\dprime\", \"\\\\trprime\", \"\\\\qprime\",\n  \"\\\\backprime\", \"\\\\backdprime\", \"\\\\backtrprime\"]);\n\nconst italicNumber = (text, variant, tag) => {\n  const mn = new mathMLTree.MathNode(tag, [text]);\n  const wrapper = new mathMLTree.MathNode(\"mstyle\", [mn]);\n  wrapper.style[\"font-style\"] = \"italic\";\n  wrapper.style[\"font-family\"] = \"Cambria, 'Times New Roman', serif\";\n  if (variant === \"bold-italic\") { wrapper.style[\"font-weight\"] = \"bold\"; }\n  return wrapper\n};\n\ndefineFunctionBuilders({\n  type: \"mathord\",\n  mathmlBuilder(group, style) {\n    const text = makeText(group.text, group.mode, style);\n    const codePoint = text.text.codePointAt(0);\n    // Test for upper-case Greek\n    const defaultVariant = (0x0390 < codePoint && codePoint < 0x03aa) ? \"normal\" : \"italic\";\n    const variant = getVariant(group, style) || defaultVariant;\n    if (variant === \"script\") {\n      text.text = variantChar(text.text, variant);\n      return new mathMLTree.MathNode(\"mi\", [text], [style.font])\n    } else if (variant !== \"italic\") {\n      text.text = variantChar(text.text, variant);\n    }\n    let node = new mathMLTree.MathNode(\"mi\", [text]);\n    // TODO: Handle U+1D49C - U+1D4CF per https://www.unicode.org/charts/PDF/U1D400.pdf\n    if (variant === \"normal\") {\n      node.setAttribute(\"mathvariant\", \"normal\");\n      if (text.text.length === 1) {\n        // A Firefox bug will apply spacing here, but there should be none. Fix it.\n        node = new mathMLTree.MathNode(\"mrow\", [node]);\n      }\n    }\n    return node\n  }\n});\n\ndefineFunctionBuilders({\n  type: \"textord\",\n  mathmlBuilder(group, style) {\n    let ch = group.text;\n    const codePoint = ch.codePointAt(0);\n    if (style.fontFamily === \"textsc\") {\n      // Convert small latin letters to small caps.\n      if (96 < codePoint && codePoint < 123) {\n        ch = smallCaps[ch];\n      }\n    }\n    const text = makeText(ch, group.mode, style);\n    const variant = getVariant(group, style) || \"normal\";\n\n    let node;\n    if (numberRegEx.test(group.text)) {\n      const tag = group.mode === \"text\" ? \"mtext\" : \"mn\";\n      if (variant === \"italic\" || variant === \"bold-italic\") {\n        return italicNumber(text, variant, tag)\n      } else {\n        if (variant !== \"normal\") {\n          text.text = text.text.split(\"\").map(c => variantChar(c, variant)).join(\"\");\n        }\n        node = new mathMLTree.MathNode(tag, [text]);\n      }\n    } else if (group.mode === \"text\") {\n      if (variant !== \"normal\") {\n        text.text = variantChar(text.text, variant);\n      }\n      node = new mathMLTree.MathNode(\"mtext\", [text]);\n    } else if (primes.has(group.text)) {\n      node = new mathMLTree.MathNode(\"mo\", [text]);\n      // TODO: If/when Chromium uses ssty variant for prime, remove the next line.\n      node.classes.push(\"tml-prime\");\n    } else {\n      const origText = text.text;\n      if (variant !== \"italic\") {\n        text.text = variantChar(text.text, variant);\n      }\n      node = new mathMLTree.MathNode(\"mi\", [text]);\n      if (text.text === origText && latinRegEx.test(origText)) {\n        node.setAttribute(\"mathvariant\", \"italic\");\n      }\n    }\n    return node\n  }\n});\n\n// A map of CSS-based spacing functions to their CSS class.\nconst cssSpace = {\n  \"\\\\nobreak\": \"nobreak\",\n  \"\\\\allowbreak\": \"allowbreak\"\n};\n\n// A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character.  If a symbol or command is a key\n// in this table, then it should be a regular space character.  Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\nconst regularSpace = {\n  \" \": {},\n  \"\\\\ \": {},\n  \"~\": {\n    className: \"nobreak\"\n  },\n  \"\\\\space\": {},\n  \"\\\\nobreakspace\": {\n    className: \"nobreak\"\n  }\n};\n\n// ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\ndefineFunctionBuilders({\n  type: \"spacing\",\n  mathmlBuilder(group, style) {\n    let node;\n\n    if (Object.prototype.hasOwnProperty.call(regularSpace, group.text)) {\n      // Firefox does not render a space in a <mtext> </mtext>. So write a no-break space.\n      // TODO: If Firefox fixes that bug, uncomment the next line and write ch into the node.\n      //const ch = (regularSpace[group.text].className === \"nobreak\") ? \"\\u00a0\" : \" \"\n      node = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(\"\\u00a0\")]);\n    } else if (Object.prototype.hasOwnProperty.call(cssSpace, group.text)) {\n      // MathML 3.0 calls for nobreak to occur in an <mo>, not an <mtext>\n      // Ref: https://www.w3.org/Math/draft-spec/mathml.html#chapter3_presm.lbattrs\n      node = new mathMLTree.MathNode(\"mo\");\n      if (group.text === \"\\\\nobreak\") {\n        node.setAttribute(\"linebreak\", \"nobreak\");\n      }\n    } else {\n      throw new ParseError(`Unknown type of space \"$group.text}\"`)\n    }\n\n    return node\n  }\n});\n\ndefineFunctionBuilders({\n  type: \"tag\"\n});\n\n// For a \\tag, the work usually done in a mathmlBuilder is instead done in buildMathML.js.\n// That way, a \\tag can be pulled out of the parse tree and wrapped around the outer node.\n\n// Non-mathy text, possibly in a font\nconst textFontFamilies = {\n  \"\\\\text\": undefined,\n  \"\\\\textrm\": \"textrm\",\n  \"\\\\textsf\": \"textsf\",\n  \"\\\\texttt\": \"texttt\",\n  \"\\\\textnormal\": \"textrm\",\n  \"\\\\textsc\": \"textsc\"      // small caps\n};\n\nconst textFontWeights = {\n  \"\\\\textbf\": \"textbf\",\n  \"\\\\textmd\": \"textmd\"\n};\n\nconst textFontShapes = {\n  \"\\\\textit\": \"textit\",\n  \"\\\\textup\": \"textup\"\n};\n\nconst styleWithFont = (group, style) => {\n  const font = group.font;\n  // Checks if the argument is a font family or a font style.\n  if (!font) {\n    return style;\n  } else if (textFontFamilies[font]) {\n    return style.withTextFontFamily(textFontFamilies[font]);\n  } else if (textFontWeights[font]) {\n    return style.withTextFontWeight(textFontWeights[font]);\n  } else if (font === \"\\\\emph\") {\n    return style.fontShape === \"textit\"\n      ? style.withTextFontShape(\"textup\")\n      : style.withTextFontShape(\"textit\")\n  }\n  return style.withTextFontShape(textFontShapes[font])\n};\n\ndefineFunction({\n  type: \"text\",\n  names: [\n    // Font families\n    \"\\\\text\",\n    \"\\\\textrm\",\n    \"\\\\textsf\",\n    \"\\\\texttt\",\n    \"\\\\textnormal\",\n    \"\\\\textsc\",\n    // Font weights\n    \"\\\\textbf\",\n    \"\\\\textmd\",\n    // Font Shapes\n    \"\\\\textit\",\n    \"\\\\textup\",\n    \"\\\\emph\"\n  ],\n  props: {\n    numArgs: 1,\n    argTypes: [\"text\"],\n    allowedInArgument: true,\n    allowedInText: true\n  },\n  handler({ parser, funcName }, args) {\n    const body = args[0];\n    return {\n      type: \"text\",\n      mode: parser.mode,\n      body: ordargument(body),\n      font: funcName\n    };\n  },\n  mathmlBuilder(group, style) {\n    const newStyle = styleWithFont(group, style);\n    const mrow = buildExpressionRow(group.body, newStyle);\n    return consolidateText(mrow)\n  }\n});\n\n// \\vcenter:  Vertically center the argument group on the math axis.\n\ndefineFunction({\n  type: \"vcenter\",\n  names: [\"\\\\vcenter\"],\n  props: {\n    numArgs: 1,\n    argTypes: [\"original\"],\n    allowedInText: false\n  },\n  handler({ parser }, args) {\n    return {\n      type: \"vcenter\",\n      mode: parser.mode,\n      body: args[0]\n    };\n  },\n  mathmlBuilder(group, style) {\n    // Use a math table to create vertically centered content.\n    const mtd = new mathMLTree.MathNode(\"mtd\", [buildGroup$1(group.body, style)]);\n    mtd.style.padding = \"0\";\n    const mtr = new mathMLTree.MathNode(\"mtr\", [mtd]);\n    return new mathMLTree.MathNode(\"mtable\", [mtr])\n  }\n});\n\ndefineFunction({\n  type: \"verb\",\n  names: [\"\\\\verb\"],\n  props: {\n    numArgs: 0,\n    allowedInText: true\n  },\n  handler(context, args, optArgs) {\n    // \\verb and \\verb* are dealt with directly in Parser.js.\n    // If we end up here, it's because of a failure to match the two delimiters\n    // in the regex in Lexer.js.  LaTeX raises the following error when \\verb is\n    // terminated by end of line (or file).\n    throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n  },\n  mathmlBuilder(group, style) {\n    const text = new mathMLTree.TextNode(makeVerb(group));\n    const node = new mathMLTree.MathNode(\"mtext\", [text]);\n    node.setAttribute(\"mathvariant\", \"monospace\");\n    return node;\n  }\n});\n\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\nconst makeVerb = (group) => group.body.replace(/ /g, group.star ? \"\\u2423\" : \"\\xA0\");\n\n/** Include this to ensure that all functions are defined. */\n\nconst functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n\n\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first two groups\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - mathches numerals\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n *   [1] regular whitespace\n *   [2] backslash followed by whitespace\n *   [3] anything else, which may include:\n *     [4] left character of \\verb*\n *     [5] left character of \\verb\n *     [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nconst spaceRegexString = \"[ \\r\\n\\t]\";\nconst controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nconst controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nconst controlWordWhitespaceRegexString = `($controlWordRegexString})$spaceRegexString}*`;\nconst controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nconst combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nconst combiningDiacriticalMarksEndRegex = new RegExp(`$combiningDiacriticalMarkString}+$`);\nconst tokenRegexString =\n  `($spaceRegexString}+)|` + // whitespace\n  `$controlSpaceRegexString}|` +  // whitespace\n  \"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + // single codepoint\n  `$combiningDiacriticalMarkString}*` + // ...plus accents\n  \"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + // surrogate pair\n  `$combiningDiacriticalMarkString}*` + // ...plus accents\n  \"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" + // \\verb*\n  \"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + // \\verb unstarred\n  `|$controlWordWhitespaceRegexString}` + // \\macroName + spaces\n  `|$controlSymbolRegexString})`; // \\\\, \\', etc.\n\n/** Main Lexer class */\nclass Lexer {\n  constructor(input, settings) {\n    // Separate accents from characters\n    this.input = input;\n    this.settings = settings;\n    this.tokenRegex = new RegExp(tokenRegexString, 'g');\n    // Category codes. The lexer only supports comment characters (14) for now.\n    // MacroExpander additionally distinguishes active (13).\n    this.catcodes = {\n      \"%\": 14, // comment character\n      \"~\": 13  // active character\n    };\n  }\n\n  setCatcode(char, code) {\n    this.catcodes[char] = code;\n  }\n\n  /**\n   * This function lexes a single token.\n   */\n  lex() {\n    const input = this.input;\n    const pos = this.tokenRegex.lastIndex;\n    if (pos === input.length) {\n      return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n    }\n    const match = this.tokenRegex.exec(input);\n    if (match === null || match.index !== pos) {\n      throw new ParseError(\n        `Unexpected character: '$input[pos]}'`,\n        new Token(input[pos], new SourceLocation(this, pos, pos + 1))\n      );\n    }\n    const text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n\n    if (this.catcodes[text] === 14) {\n      // comment character\n      const nlIndex = input.indexOf(\"\\n\", this.tokenRegex.lastIndex);\n      if (nlIndex === -1) {\n        this.tokenRegex.lastIndex = input.length; // EOF\n        if (this.settings.strict) {\n          throw new ParseError(\"% comment has no terminating newline; LaTeX would \" +\n              \"fail because of commenting the end of math mode\")\n        }\n      } else {\n        this.tokenRegex.lastIndex = nlIndex + 1;\n      }\n      return this.lex();\n    }\n\n    return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n  }\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\n\n\nclass Namespace {\n  /**\n   * Both arguments are optional.  The first argument is an object of\n   * built-in mappings which never change.  The second argument is an object\n   * of initial (global-level) mappings, which will constantly change\n   * according to any global/top-level `set`s done.\n   */\n  constructor(builtins = {}, globalMacros = {}) {\n    this.current = globalMacros;\n    this.builtins = builtins;\n    this.undefStack = [];\n  }\n\n  /**\n   * Start a new nested group, affecting future local `set`s.\n   */\n  beginGroup() {\n    this.undefStack.push({});\n  }\n\n  /**\n   * End current nested group, restoring values before the group began.\n   */\n  endGroup() {\n    if (this.undefStack.length === 0) {\n      throw new ParseError(\n        \"Unbalanced namespace destruction: attempt \" +\n          \"to pop global namespace; please report this as a bug\"\n      );\n    }\n    const undefs = this.undefStack.pop();\n    for (const undef in undefs) {\n      if (Object.prototype.hasOwnProperty.call(undefs, undef )) {\n        if (undefs[undef] === undefined) {\n          delete this.current[undef];\n        } else {\n          this.current[undef] = undefs[undef];\n        }\n      }\n    }\n  }\n\n  /**\n   * Detect whether `name` has a definition.  Equivalent to\n   * `get(name) != null`.\n   */\n  has(name) {\n    return Object.prototype.hasOwnProperty.call(this.current, name ) ||\n    Object.prototype.hasOwnProperty.call(this.builtins, name );\n  }\n\n  /**\n   * Get the current value of a name, or `undefined` if there is no value.\n   *\n   * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n   * is defined, as the definition may be the empty string which evaluates\n   * to `false` in JavaScript.  Use `if (namespace.get(...) != null)` or\n   * `if (namespace.has(...))`.\n   */\n  get(name) {\n    if (Object.prototype.hasOwnProperty.call(this.current, name )) {\n      return this.current[name];\n    } else {\n      return this.builtins[name];\n    }\n  }\n\n  /**\n   * Set the current value of a name, and optionally set it globally too.\n   * Local set() sets the current value and (when appropriate) adds an undo\n   * operation to the undo stack.  Global set() may change the undo\n   * operation at every level, so takes time linear in their number.\n   */\n  set(name, value, global = false) {\n    if (global) {\n      // Global set is equivalent to setting in all groups.  Simulate this\n      // by destroying any undos currently scheduled for this name,\n      // and adding an undo with the *new* value (in case it later gets\n      // locally reset within this environment).\n      for (let i = 0; i < this.undefStack.length; i++) {\n        delete this.undefStack[i][name];\n      }\n      if (this.undefStack.length > 0) {\n        this.undefStack[this.undefStack.length - 1][name] = value;\n      }\n    } else {\n      // Undo this set at end of this group (possibly to `undefined`),\n      // unless an undo is already in place, in which case that older\n      // value is the correct one.\n      const top = this.undefStack[this.undefStack.length - 1];\n      if (top && !Object.prototype.hasOwnProperty.call(top, name )) {\n        top[name] = this.current[name];\n      }\n    }\n    this.current[name] = value;\n  }\n}\n\n/**\n * This file contains the \u201Cgullet\u201D where macros are expanded\n * until only non-macro tokens remain.\n */\n\n\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol.  Used in `isDefined`.\nconst implicitCommands = {\n  \"^\": true, // Parser.js\n  _: true, // Parser.js\n  \"\\\\limits\": true, // Parser.js\n  \"\\\\nolimits\": true // Parser.js\n};\n\nclass MacroExpander {\n  constructor(input, settings, mode) {\n    this.settings = settings;\n    this.expansionCount = 0;\n    this.feed(input);\n    // Make new global namespace\n    this.macros = new Namespace(macros, settings.macros);\n    this.mode = mode;\n    this.stack = []; // contains tokens in REVERSE order\n  }\n\n  /**\n   * Feed a new input string to the same MacroExpander\n   * (with existing macros etc.).\n   */\n  feed(input) {\n    this.lexer = new Lexer(input, this.settings);\n  }\n\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n  }\n\n  /**\n   * Start a new group nesting within all namespaces.\n   */\n  beginGroup() {\n    this.macros.beginGroup();\n  }\n\n  /**\n   * End current group nesting within all namespaces.\n   */\n  endGroup() {\n    this.macros.endGroup();\n  }\n\n  /**\n   * Returns the topmost token on the stack, without expanding it.\n   * Similar in behavior to TeX's `\\futurelet`.\n   */\n  future() {\n    if (this.stack.length === 0) {\n      this.pushToken(this.lexer.lex());\n    }\n    return this.stack[this.stack.length - 1]\n  }\n\n  /**\n   * Remove and return the next unexpanded token.\n   */\n  popToken() {\n    this.future(); // ensure non-empty stack\n    return this.stack.pop();\n  }\n\n  /**\n   * Add a given token to the token stack.  In particular, this get be used\n   * to put back a token returned from one of the other methods.\n   */\n  pushToken(token) {\n    this.stack.push(token);\n  }\n\n  /**\n   * Append an array of tokens to the token stack.\n   */\n  pushTokens(tokens) {\n    this.stack.push(...tokens);\n  }\n\n  /**\n   * Find an macro argument without expanding tokens and append the array of\n   * tokens to the token stack. Uses Token as a container for the result.\n   */\n  scanArgument(isOptional) {\n    let start;\n    let end;\n    let tokens;\n    if (isOptional) {\n      this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n      if (this.future().text !== \"[\") {\n        return null;\n      }\n      start = this.popToken(); // don't include [ in tokens\n      ({ tokens, end } = this.consumeArg([\"]\"]));\n    } else {\n      ({ tokens, start, end } = this.consumeArg());\n    }\n\n    // indicate the end of an argument\n    this.pushToken(new Token(\"EOF\", end.loc));\n\n    this.pushTokens(tokens);\n    return start.range(end, \"\");\n  }\n\n  /**\n   * Consume all following space tokens, without expansion.\n   */\n  consumeSpaces() {\n    for (;;) {\n      const token = this.future();\n      if (token.text === \" \") {\n        this.stack.pop();\n      } else {\n        break;\n      }\n    }\n  }\n\n  /**\n   * Consume an argument from the token stream, and return the resulting array\n   * of tokens and start/end token.\n   */\n  consumeArg(delims) {\n    // The argument for a delimited parameter is the shortest (possibly\n    // empty) sequence of tokens with properly nested {...} groups that is\n    // followed ... by this particular list of non-parameter tokens.\n    // The argument for an undelimited parameter is the next nonblank\n    // token, unless that token is \u2018{\u2019, when the argument will be the\n    // entire {...} group that follows.\n    const tokens = [];\n    const isDelimited = delims && delims.length > 0;\n    if (!isDelimited) {\n      // Ignore spaces between arguments.  As the TeXbook says:\n      // \"After you have said \u2018\\def\\row#1#2{...}\u2019, you are allowed to\n      //  put spaces between the arguments (e.g., \u2018\\row x n\u2019), because\n      //  TeX doesn\u2019t use single spaces as undelimited arguments.\"\n      this.consumeSpaces();\n    }\n    const start = this.future();\n    let tok;\n    let depth = 0;\n    let match = 0;\n    do {\n      tok = this.popToken();\n      tokens.push(tok);\n      if (tok.text === \"{\") {\n        ++depth;\n      } else if (tok.text === \"}\") {\n        --depth;\n        if (depth === -1) {\n          throw new ParseError(\"Extra }\", tok);\n        }\n      } else if (tok.text === \"EOF\") {\n        throw new ParseError(\n          \"Unexpected end of input in a macro argument\" +\n            \", expected '\" +\n            (delims && isDelimited ? delims[match] : \"}\") +\n            \"'\",\n          tok\n        );\n      }\n      if (delims && isDelimited) {\n        if ((depth === 0 || (depth === 1 && delims[match] === \"{\")) && tok.text === delims[match]) {\n          ++match;\n          if (match === delims.length) {\n            // don't include delims in tokens\n            tokens.splice(-match, match);\n            break;\n          }\n        } else {\n          match = 0;\n        }\n      }\n    } while (depth !== 0 || isDelimited);\n    // If the argument found ... has the form \u2018{<nested tokens>}\u2019,\n    // ... the outermost braces enclosing the argument are removed\n    if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n      tokens.pop();\n      tokens.shift();\n    }\n    tokens.reverse(); // to fit in with stack order\n    return { tokens, start, end: tok };\n  }\n\n  /**\n   * Consume the specified number of (delimited) arguments from the token\n   * stream and return the resulting array of arguments.\n   */\n  consumeArgs(numArgs, delimiters) {\n    if (delimiters) {\n      if (delimiters.length !== numArgs + 1) {\n        throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n      }\n      const delims = delimiters[0];\n      for (let i = 0; i < delims.length; i++) {\n        const tok = this.popToken();\n        if (delims[i] !== tok.text) {\n          throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n        }\n      }\n    }\n\n    const args = [];\n    for (let i = 0; i < numArgs; i++) {\n      args.push(this.consumeArg(delimiters && delimiters[i + 1]).tokens);\n    }\n    return args;\n  }\n\n  /**\n   * Expand the next token only once if possible.\n   *\n   * If the token is expanded, the resulting tokens will be pushed onto\n   * the stack in reverse order, and the number of such tokens will be\n   * returned.  This number might be zero or positive.\n   *\n   * If not, the return value is `false`, and the next token remains at the\n   * top of the stack.\n   *\n   * In either case, the next token will be on the top of the stack,\n   * or the stack will be empty (in case of empty expansion\n   * and no other tokens).\n   *\n   * Used to implement `expandAfterFuture` and `expandNextToken`.\n   *\n   * If expandableOnly, only expandable tokens are expanded and\n   * an undefined control sequence results in an error.\n   */\n  expandOnce(expandableOnly) {\n    const topToken = this.popToken();\n    const name = topToken.text;\n    const expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n    if (expansion == null || (expandableOnly && expansion.unexpandable)) {\n      if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n        throw new ParseError(\"Undefined control sequence: \" + name);\n      }\n      this.pushToken(topToken);\n      return false;\n    }\n    this.expansionCount++;\n    if (this.expansionCount > this.settings.maxExpand) {\n      throw new ParseError(\n        \"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\"\n      );\n    }\n    let tokens = expansion.tokens;\n    const args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n    if (expansion.numArgs) {\n      // paste arguments in place of the placeholders\n      tokens = tokens.slice(); // make a shallow copy\n      for (let i = tokens.length - 1; i >= 0; --i) {\n        let tok = tokens[i];\n        if (tok.text === \"#\") {\n          if (i === 0) {\n            throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n          }\n          tok = tokens[--i]; // next token on stack\n          if (tok.text === \"#\") {\n            // ## \u2192 #\n            tokens.splice(i + 1, 1); // drop first #\n          } else if (/^[1-9]$/.test(tok.text)) {\n            // replace the placeholder with the indicated argument\n            tokens.splice(i, 2, ...args[+tok.text - 1]);\n          } else {\n            throw new ParseError(\"Not a valid argument number\", tok);\n          }\n        }\n      }\n    }\n    // Concatenate expansion onto top of stack.\n    this.pushTokens(tokens);\n    return tokens.length;\n  }\n\n  /**\n   * Expand the next token only once (if possible), and return the resulting\n   * top token on the stack (without removing anything from the stack).\n   * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n   * Equivalent to expandOnce() followed by future().\n   */\n  expandAfterFuture() {\n    this.expandOnce();\n    return this.future();\n  }\n\n  /**\n   * Recursively expand first token, then return first non-expandable token.\n   */\n  expandNextToken() {\n    for (;;) {\n      if (this.expandOnce() === false) { // fully expanded\n        const token = this.stack.pop();\n        // The token after \\noexpand is interpreted as if its meaning were \u2018\\relax\u2019\n        if (token.treatAsRelax) {\n          token.text = \"\\\\relax\";\n        }\n        return token\n      }\n    }\n\n    // This pathway is impossible.\n    throw new Error(); // eslint-disable-line no-unreachable\n  }\n\n  /**\n   * Fully expand the given macro name and return the resulting list of\n   * tokens, or return `undefined` if no such macro is defined.\n   */\n  expandMacro(name) {\n    return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n  }\n\n  /**\n   * Fully expand the given token stream and return the resulting list of\n   * tokens.  Note that the input tokens are in reverse order, but the\n   * output tokens are in forward order.\n   */\n  expandTokens(tokens) {\n    const output = [];\n    const oldStackLength = this.stack.length;\n    this.pushTokens(tokens);\n    while (this.stack.length > oldStackLength) {\n      // Expand only expandable tokens\n      if (this.expandOnce(true) === false) {  // fully expanded\n        const token = this.stack.pop();\n        if (token.treatAsRelax) {\n          // the expansion of \\noexpand is the token itself\n          token.noexpand = false;\n          token.treatAsRelax = false;\n        }\n        output.push(token);\n      }\n    }\n    return output;\n  }\n\n  /**\n   * Fully expand the given macro name and return the result as a string,\n   * or return `undefined` if no such macro is defined.\n   */\n  expandMacroAsText(name) {\n    const tokens = this.expandMacro(name);\n    if (tokens) {\n      return tokens.map((token) => token.text).join(\"\");\n    } else {\n      return tokens;\n    }\n  }\n\n  /**\n   * Returns the expanded macro as a reversed array of tokens and a macro\n   * argument count.  Or returns `null` if no such macro.\n   */\n  _getExpansion(name) {\n    const definition = this.macros.get(name);\n    if (definition == null) {\n      // mainly checking for undefined here\n      return definition;\n    }\n    // If a single character has an associated catcode other than 13\n    // (active character), then don't expand it.\n    if (name.length === 1) {\n      const catcode = this.lexer.catcodes[name];\n      if (catcode != null && catcode !== 13) {\n        return\n      }\n    }\n    const expansion = typeof definition === \"function\" ? definition(this) : definition;\n    if (typeof expansion === \"string\") {\n      let numArgs = 0;\n      if (expansion.indexOf(\"#\") !== -1) {\n        const stripped = expansion.replace(/##/g, \"\");\n        while (stripped.indexOf(\"#\" + (numArgs + 1)) !== -1) {\n          ++numArgs;\n        }\n      }\n      const bodyLexer = new Lexer(expansion, this.settings);\n      const tokens = [];\n      let tok = bodyLexer.lex();\n      while (tok.text !== \"EOF\") {\n        tokens.push(tok);\n        tok = bodyLexer.lex();\n      }\n      tokens.reverse(); // to fit in with stack using push and pop\n      const expanded = { tokens, numArgs };\n      return expanded;\n    }\n\n    return expansion;\n  }\n\n  /**\n   * Determine whether a command is currently \"defined\" (has some\n   * functionality), meaning that it's a macro (in the current group),\n   * a function, a symbol, or one of the special commands listed in\n   * `implicitCommands`.\n   */\n  isDefined(name) {\n    return (\n      this.macros.has(name) ||\n      Object.prototype.hasOwnProperty.call(functions, name ) ||\n      Object.prototype.hasOwnProperty.call(symbols.math, name ) ||\n      Object.prototype.hasOwnProperty.call(symbols.text, name ) ||\n      Object.prototype.hasOwnProperty.call(implicitCommands, name )\n    );\n  }\n\n  /**\n   * Determine whether a command is expandable.\n   */\n  isExpandable(name) {\n    const macro = this.macros.get(name);\n    return macro != null\n      ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable\n      : Object.prototype.hasOwnProperty.call(functions, name ) && !functions[name].primitive;\n  }\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\n\nconst unicodeSubRegEx = /^[\u208A\u208B\u208C\u208D\u208E\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1D62\u2C7C\u2096\u2097\u2098\u2099\u2092\u209A\u1D63\u209B\u209C\u1D64\u1D65\u2093\u1D66\u1D67\u1D68\u1D69\u1D6A]/;\n\nconst uSubsAndSups = Object.freeze({\n  '\u208A': '+',\n  '\u208B': '-',\n  '\u208C': '=',\n  '\u208D': '(',\n  '\u208E': ')',\n  '\u2080': '0',\n  '\u2081': '1',\n  '\u2082': '2',\n  '\u2083': '3',\n  '\u2084': '4',\n  '\u2085': '5',\n  '\u2086': '6',\n  '\u2087': '7',\n  '\u2088': '8',\n  '\u2089': '9',\n  '\\u2090': 'a',\n  '\\u2091': 'e',\n  '\\u2095': 'h',\n  '\\u1D62': 'i',\n  '\\u2C7C': 'j',\n  '\\u2096': 'k',\n  '\\u2097': 'l',\n  '\\u2098': 'm',\n  '\\u2099': 'n',\n  '\\u2092': 'o',\n  '\\u209A': 'p',\n  '\\u1D63': 'r',\n  '\\u209B': 's',\n  '\\u209C': 't',\n  '\\u1D64': 'u',\n  '\\u1D65': 'v',\n  '\\u2093': 'x',\n  '\\u1D66': '\u03B2',\n  '\\u1D67': '\u03B3',\n  '\\u1D68': '\u03C1',\n  '\\u1D69': '\\u03d5',\n  '\\u1D6A': '\u03C7',\n  '\u207A': '+',\n  '\u207B': '-',\n  '\u207C': '=',\n  '\u207D': '(',\n  '\u207E': ')',\n  '\u2070': '0',\n  '\u00B9': '1',\n  '\u00B2': '2',\n  '\u00B3': '3',\n  '\u2074': '4',\n  '\u2075': '5',\n  '\u2076': '6',\n  '\u2077': '7',\n  '\u2078': '8',\n  '\u2079': '9',\n  '\\u1D2C': 'A',\n  '\\u1D2E': 'B',\n  '\\u1D30': 'D',\n  '\\u1D31': 'E',\n  '\\u1D33': 'G',\n  '\\u1D34': 'H',\n  '\\u1D35': 'I',\n  '\\u1D36': 'J',\n  '\\u1D37': 'K',\n  '\\u1D38': 'L',\n  '\\u1D39': 'M',\n  '\\u1D3A': 'N',\n  '\\u1D3C': 'O',\n  '\\u1D3E': 'P',\n  '\\u1D3F': 'R',\n  '\\u1D40': 'T',\n  '\\u1D41': 'U',\n  '\\u2C7D': 'V',\n  '\\u1D42': 'W',\n  '\\u1D43': 'a',\n  '\\u1D47': 'b',\n  '\\u1D9C': 'c',\n  '\\u1D48': 'd',\n  '\\u1D49': 'e',\n  '\\u1DA0': 'f',\n  '\\u1D4D': 'g',\n  '\\u02B0': 'h',\n  '\\u2071': 'i',\n  '\\u02B2': 'j',\n  '\\u1D4F': 'k',\n  '\\u02E1': 'l',\n  '\\u1D50': 'm',\n  '\\u207F': 'n',\n  '\\u1D52': 'o',\n  '\\u1D56': 'p',\n  '\\u02B3': 'r',\n  '\\u02E2': 's',\n  '\\u1D57': 't',\n  '\\u1D58': 'u',\n  '\\u1D5B': 'v',\n  '\\u02B7': 'w',\n  '\\u02E3': 'x',\n  '\\u02B8': 'y',\n  '\\u1DBB': 'z',\n  '\\u1D5D': '\u03B2',\n  '\\u1D5E': '\u03B3',\n  '\\u1D5F': '\u03B4',\n  '\\u1D60': '\\u03d5',\n  '\\u1D61': '\u03C7',\n  '\\u1DBF': '\u03B8'\n});\n\n// Used for Unicode input of calligraphic and script letters\nconst asciiFromScript = Object.freeze({\n  \"\\ud835\\udc9c\": \"A\",\n  \"\\u212c\": \"B\",\n  \"\\ud835\\udc9e\": \"C\",\n  \"\\ud835\\udc9f\": \"D\",\n  \"\\u2130\": \"E\",\n  \"\\u2131\": \"F\",\n  \"\\ud835\\udca2\": \"G\",\n  \"\\u210B\": \"H\",\n  \"\\u2110\": \"I\",\n  \"\\ud835\\udca5\": \"J\",\n  \"\\ud835\\udca6\": \"K\",\n  \"\\u2112\": \"L\",\n  \"\\u2133\": \"M\",\n  \"\\ud835\\udca9\": \"N\",\n  \"\\ud835\\udcaa\": \"O\",\n  \"\\ud835\\udcab\": \"P\",\n  \"\\ud835\\udcac\": \"Q\",\n  \"\\u211B\": \"R\",\n  \"\\ud835\\udcae\": \"S\",\n  \"\\ud835\\udcaf\": \"T\",\n  \"\\ud835\\udcb0\": \"U\",\n  \"\\ud835\\udcb1\": \"V\",\n  \"\\ud835\\udcb2\": \"W\",\n  \"\\ud835\\udcb3\": \"X\",\n  \"\\ud835\\udcb4\": \"Y\",\n  \"\\ud835\\udcb5\": \"Z\"\n});\n\n// Mapping of Unicode accent characters to their LaTeX equivalent in text and\n// math mode (when they exist).\nvar unicodeAccents = {\n  \"\\u0301\": { text: \"\\\\'\", math: \"\\\\acute\" },\n  \"\\u0300\": { text: \"\\\\`\", math: \"\\\\grave\" },\n  \"\\u0308\": { text: '\\\\\"', math: \"\\\\ddot\" },\n  \"\\u0303\": { text: \"\\\\~\", math: \"\\\\tilde\" },\n  \"\\u0304\": { text: \"\\\\=\", math: \"\\\\bar\" },\n  \"\\u0306\": { text: \"\\\\u\", math: \"\\\\breve\" },\n  \"\\u030c\": { text: \"\\\\v\", math: \"\\\\check\" },\n  \"\\u0302\": { text: \"\\\\^\", math: \"\\\\hat\" },\n  \"\\u0307\": { text: \"\\\\.\", math: \"\\\\dot\" },\n  \"\\u030a\": { text: \"\\\\r\", math: \"\\\\mathring\" },\n  \"\\u030b\": { text: \"\\\\H\" },\n  '\\u0327': { text: '\\\\c' }\n};\n\nvar unicodeSymbols = {\n  \"\u00E1\": \"a\u0301\",\n  \"\u00E0\": \"a\u0300\",\n  \"\u00E4\": \"a\u0308\",\n  \"\u01DF\": \"a\u0308\u0304\",\n  \"\u00E3\": \"a\u0303\",\n  \"\u0101\": \"a\u0304\",\n  \"\u0103\": \"a\u0306\",\n  \"\u1EAF\": \"a\u0306\u0301\",\n  \"\u1EB1\": \"a\u0306\u0300\",\n  \"\u1EB5\": \"a\u0306\u0303\",\n  \"\u01CE\": \"a\u030C\",\n  \"\u00E2\": \"a\u0302\",\n  \"\u1EA5\": \"a\u0302\u0301\",\n  \"\u1EA7\": \"a\u0302\u0300\",\n  \"\u1EAB\": \"a\u0302\u0303\",\n  \"\u0227\": \"a\u0307\",\n  \"\u01E1\": \"a\u0307\u0304\",\n  \"\u00E5\": \"a\u030A\",\n  \"\u01FB\": \"a\u030A\u0301\",\n  \"\u1E03\": \"b\u0307\",\n  \"\u0107\": \"c\u0301\",\n  \"\u010D\": \"c\u030C\",\n  \"\u0109\": \"c\u0302\",\n  \"\u010B\": \"c\u0307\",\n  \"\u010F\": \"d\u030C\",\n  \"\u1E0B\": \"d\u0307\",\n  \"\u00E9\": \"e\u0301\",\n  \"\u00E8\": \"e\u0300\",\n  \"\u00EB\": \"e\u0308\",\n  \"\u1EBD\": \"e\u0303\",\n  \"\u0113\": \"e\u0304\",\n  \"\u1E17\": \"e\u0304\u0301\",\n  \"\u1E15\": \"e\u0304\u0300\",\n  \"\u0115\": \"e\u0306\",\n  \"\u011B\": \"e\u030C\",\n  \"\u00EA\": \"e\u0302\",\n  \"\u1EBF\": \"e\u0302\u0301\",\n  \"\u1EC1\": \"e\u0302\u0300\",\n  \"\u1EC5\": \"e\u0302\u0303\",\n  \"\u0117\": \"e\u0307\",\n  \"\u1E1F\": \"f\u0307\",\n  \"\u01F5\": \"g\u0301\",\n  \"\u1E21\": \"g\u0304\",\n  \"\u011F\": \"g\u0306\",\n  \"\u01E7\": \"g\u030C\",\n  \"\u011D\": \"g\u0302\",\n  \"\u0121\": \"g\u0307\",\n  \"\u1E27\": \"h\u0308\",\n  \"\u021F\": \"h\u030C\",\n  \"\u0125\": \"h\u0302\",\n  \"\u1E23\": \"h\u0307\",\n  \"\u00ED\": \"i\u0301\",\n  \"\u00EC\": \"i\u0300\",\n  \"\u00EF\": \"i\u0308\",\n  \"\u1E2F\": \"i\u0308\u0301\",\n  \"\u0129\": \"i\u0303\",\n  \"\u012B\": \"i\u0304\",\n  \"\u012D\": \"i\u0306\",\n  \"\u01D0\": \"i\u030C\",\n  \"\u00EE\": \"i\u0302\",\n  \"\u01F0\": \"j\u030C\",\n  \"\u0135\": \"j\u0302\",\n  \"\u1E31\": \"k\u0301\",\n  \"\u01E9\": \"k\u030C\",\n  \"\u013A\": \"l\u0301\",\n  \"\u013E\": \"l\u030C\",\n  \"\u1E3F\": \"m\u0301\",\n  \"\u1E41\": \"m\u0307\",\n  \"\u0144\": \"n\u0301\",\n  \"\u01F9\": \"n\u0300\",\n  \"\u00F1\": \"n\u0303\",\n  \"\u0148\": \"n\u030C\",\n  \"\u1E45\": \"n\u0307\",\n  \"\u00F3\": \"o\u0301\",\n  \"\u00F2\": \"o\u0300\",\n  \"\u00F6\": \"o\u0308\",\n  \"\u022B\": \"o\u0308\u0304\",\n  \"\u00F5\": \"o\u0303\",\n  \"\u1E4D\": \"o\u0303\u0301\",\n  \"\u1E4F\": \"o\u0303\u0308\",\n  \"\u022D\": \"o\u0303\u0304\",\n  \"\u014D\": \"o\u0304\",\n  \"\u1E53\": \"o\u0304\u0301\",\n  \"\u1E51\": \"o\u0304\u0300\",\n  \"\u014F\": \"o\u0306\",\n  \"\u01D2\": \"o\u030C\",\n  \"\u00F4\": \"o\u0302\",\n  \"\u1ED1\": \"o\u0302\u0301\",\n  \"\u1ED3\": \"o\u0302\u0300\",\n  \"\u1ED7\": \"o\u0302\u0303\",\n  \"\u022F\": \"o\u0307\",\n  \"\u0231\": \"o\u0307\u0304\",\n  \"\u0151\": \"o\u030B\",\n  \"\u1E55\": \"p\u0301\",\n  \"\u1E57\": \"p\u0307\",\n  \"\u0155\": \"r\u0301\",\n  \"\u0159\": \"r\u030C\",\n  \"\u1E59\": \"r\u0307\",\n  \"\u015B\": \"s\u0301\",\n  \"\u1E65\": \"s\u0301\u0307\",\n  \"\u0161\": \"s\u030C\",\n  \"\u1E67\": \"s\u030C\u0307\",\n  \"\u015D\": \"s\u0302\",\n  \"\u1E61\": \"s\u0307\",\n  \"\u1E97\": \"t\u0308\",\n  \"\u0165\": \"t\u030C\",\n  \"\u1E6B\": \"t\u0307\",\n  \"\u00FA\": \"u\u0301\",\n  \"\u00F9\": \"u\u0300\",\n  \"\u00FC\": \"u\u0308\",\n  \"\u01D8\": \"u\u0308\u0301\",\n  \"\u01DC\": \"u\u0308\u0300\",\n  \"\u01D6\": \"u\u0308\u0304\",\n  \"\u01DA\": \"u\u0308\u030C\",\n  \"\u0169\": \"u\u0303\",\n  \"\u1E79\": \"u\u0303\u0301\",\n  \"\u016B\": \"u\u0304\",\n  \"\u1E7B\": \"u\u0304\u0308\",\n  \"\u016D\": \"u\u0306\",\n  \"\u01D4\": \"u\u030C\",\n  \"\u00FB\": \"u\u0302\",\n  \"\u016F\": \"u\u030A\",\n  \"\u0171\": \"u\u030B\",\n  \"\u1E7D\": \"v\u0303\",\n  \"\u1E83\": \"w\u0301\",\n  \"\u1E81\": \"w\u0300\",\n  \"\u1E85\": \"w\u0308\",\n  \"\u0175\": \"w\u0302\",\n  \"\u1E87\": \"w\u0307\",\n  \"\u1E98\": \"w\u030A\",\n  \"\u1E8D\": \"x\u0308\",\n  \"\u1E8B\": \"x\u0307\",\n  \"\u00FD\": \"y\u0301\",\n  \"\u1EF3\": \"y\u0300\",\n  \"\u00FF\": \"y\u0308\",\n  \"\u1EF9\": \"y\u0303\",\n  \"\u0233\": \"y\u0304\",\n  \"\u0177\": \"y\u0302\",\n  \"\u1E8F\": \"y\u0307\",\n  \"\u1E99\": \"y\u030A\",\n  \"\u017A\": \"z\u0301\",\n  \"\u017E\": \"z\u030C\",\n  \"\u1E91\": \"z\u0302\",\n  \"\u017C\": \"z\u0307\",\n  \"\u00C1\": \"A\u0301\",\n  \"\u00C0\": \"A\u0300\",\n  \"\u00C4\": \"A\u0308\",\n  \"\u01DE\": \"A\u0308\u0304\",\n  \"\u00C3\": \"A\u0303\",\n  \"\u0100\": \"A\u0304\",\n  \"\u0102\": \"A\u0306\",\n  \"\u1EAE\": \"A\u0306\u0301\",\n  \"\u1EB0\": \"A\u0306\u0300\",\n  \"\u1EB4\": \"A\u0306\u0303\",\n  \"\u01CD\": \"A\u030C\",\n  \"\u00C2\": \"A\u0302\",\n  \"\u1EA4\": \"A\u0302\u0301\",\n  \"\u1EA6\": \"A\u0302\u0300\",\n  \"\u1EAA\": \"A\u0302\u0303\",\n  \"\u0226\": \"A\u0307\",\n  \"\u01E0\": \"A\u0307\u0304\",\n  \"\u00C5\": \"A\u030A\",\n  \"\u01FA\": \"A\u030A\u0301\",\n  \"\u1E02\": \"B\u0307\",\n  \"\u0106\": \"C\u0301\",\n  \"\u010C\": \"C\u030C\",\n  \"\u0108\": \"C\u0302\",\n  \"\u010A\": \"C\u0307\",\n  \"\u010E\": \"D\u030C\",\n  \"\u1E0A\": \"D\u0307\",\n  \"\u00C9\": \"E\u0301\",\n  \"\u00C8\": \"E\u0300\",\n  \"\u00CB\": \"E\u0308\",\n  \"\u1EBC\": \"E\u0303\",\n  \"\u0112\": \"E\u0304\",\n  \"\u1E16\": \"E\u0304\u0301\",\n  \"\u1E14\": \"E\u0304\u0300\",\n  \"\u0114\": \"E\u0306\",\n  \"\u011A\": \"E\u030C\",\n  \"\u00CA\": \"E\u0302\",\n  \"\u1EBE\": \"E\u0302\u0301\",\n  \"\u1EC0\": \"E\u0302\u0300\",\n  \"\u1EC4\": \"E\u0302\u0303\",\n  \"\u0116\": \"E\u0307\",\n  \"\u1E1E\": \"F\u0307\",\n  \"\u01F4\": \"G\u0301\",\n  \"\u1E20\": \"G\u0304\",\n  \"\u011E\": \"G\u0306\",\n  \"\u01E6\": \"G\u030C\",\n  \"\u011C\": \"G\u0302\",\n  \"\u0120\": \"G\u0307\",\n  \"\u1E26\": \"H\u0308\",\n  \"\u021E\": \"H\u030C\",\n  \"\u0124\": \"H\u0302\",\n  \"\u1E22\": \"H\u0307\",\n  \"\u00CD\": \"I\u0301\",\n  \"\u00CC\": \"I\u0300\",\n  \"\u00CF\": \"I\u0308\",\n  \"\u1E2E\": \"I\u0308\u0301\",\n  \"\u0128\": \"I\u0303\",\n  \"\u012A\": \"I\u0304\",\n  \"\u012C\": \"I\u0306\",\n  \"\u01CF\": \"I\u030C\",\n  \"\u00CE\": \"I\u0302\",\n  \"\u0130\": \"I\u0307\",\n  \"\u0134\": \"J\u0302\",\n  \"\u1E30\": \"K\u0301\",\n  \"\u01E8\": \"K\u030C\",\n  \"\u0139\": \"L\u0301\",\n  \"\u013D\": \"L\u030C\",\n  \"\u1E3E\": \"M\u0301\",\n  \"\u1E40\": \"M\u0307\",\n  \"\u0143\": \"N\u0301\",\n  \"\u01F8\": \"N\u0300\",\n  \"\u00D1\": \"N\u0303\",\n  \"\u0147\": \"N\u030C\",\n  \"\u1E44\": \"N\u0307\",\n  \"\u00D3\": \"O\u0301\",\n  \"\u00D2\": \"O\u0300\",\n  \"\u00D6\": \"O\u0308\",\n  \"\u022A\": \"O\u0308\u0304\",\n  \"\u00D5\": \"O\u0303\",\n  \"\u1E4C\": \"O\u0303\u0301\",\n  \"\u1E4E\": \"O\u0303\u0308\",\n  \"\u022C\": \"O\u0303\u0304\",\n  \"\u014C\": \"O\u0304\",\n  \"\u1E52\": \"O\u0304\u0301\",\n  \"\u1E50\": \"O\u0304\u0300\",\n  \"\u014E\": \"O\u0306\",\n  \"\u01D1\": \"O\u030C\",\n  \"\u00D4\": \"O\u0302\",\n  \"\u1ED0\": \"O\u0302\u0301\",\n  \"\u1ED2\": \"O\u0302\u0300\",\n  \"\u1ED6\": \"O\u0302\u0303\",\n  \"\u022E\": \"O\u0307\",\n  \"\u0230\": \"O\u0307\u0304\",\n  \"\u0150\": \"O\u030B\",\n  \"\u1E54\": \"P\u0301\",\n  \"\u1E56\": \"P\u0307\",\n  \"\u0154\": \"R\u0301\",\n  \"\u0158\": \"R\u030C\",\n  \"\u1E58\": \"R\u0307\",\n  \"\u015A\": \"S\u0301\",\n  \"\u1E64\": \"S\u0301\u0307\",\n  \"\u0160\": \"S\u030C\",\n  \"\u1E66\": \"S\u030C\u0307\",\n  \"\u015C\": \"S\u0302\",\n  \"\u1E60\": \"S\u0307\",\n  \"\u0164\": \"T\u030C\",\n  \"\u1E6A\": \"T\u0307\",\n  \"\u00DA\": \"U\u0301\",\n  \"\u00D9\": \"U\u0300\",\n  \"\u00DC\": \"U\u0308\",\n  \"\u01D7\": \"U\u0308\u0301\",\n  \"\u01DB\": \"U\u0308\u0300\",\n  \"\u01D5\": \"U\u0308\u0304\",\n  \"\u01D9\": \"U\u0308\u030C\",\n  \"\u0168\": \"U\u0303\",\n  \"\u1E78\": \"U\u0303\u0301\",\n  \"\u016A\": \"U\u0304\",\n  \"\u1E7A\": \"U\u0304\u0308\",\n  \"\u016C\": \"U\u0306\",\n  \"\u01D3\": \"U\u030C\",\n  \"\u00DB\": \"U\u0302\",\n  \"\u016E\": \"U\u030A\",\n  \"\u0170\": \"U\u030B\",\n  \"\u1E7C\": \"V\u0303\",\n  \"\u1E82\": \"W\u0301\",\n  \"\u1E80\": \"W\u0300\",\n  \"\u1E84\": \"W\u0308\",\n  \"\u0174\": \"W\u0302\",\n  \"\u1E86\": \"W\u0307\",\n  \"\u1E8C\": \"X\u0308\",\n  \"\u1E8A\": \"X\u0307\",\n  \"\u00DD\": \"Y\u0301\",\n  \"\u1EF2\": \"Y\u0300\",\n  \"\u0178\": \"Y\u0308\",\n  \"\u1EF8\": \"Y\u0303\",\n  \"\u0232\": \"Y\u0304\",\n  \"\u0176\": \"Y\u0302\",\n  \"\u1E8E\": \"Y\u0307\",\n  \"\u0179\": \"Z\u0301\",\n  \"\u017D\": \"Z\u030C\",\n  \"\u1E90\": \"Z\u0302\",\n  \"\u017B\": \"Z\u0307\",\n  \"\u03AC\": \"\u03B1\u0301\",\n  \"\u1F70\": \"\u03B1\u0300\",\n  \"\u1FB1\": \"\u03B1\u0304\",\n  \"\u1FB0\": \"\u03B1\u0306\",\n  \"\u03AD\": \"\u03B5\u0301\",\n  \"\u1F72\": \"\u03B5\u0300\",\n  \"\u03AE\": \"\u03B7\u0301\",\n  \"\u1F74\": \"\u03B7\u0300\",\n  \"\u03AF\": \"\u03B9\u0301\",\n  \"\u1F76\": \"\u03B9\u0300\",\n  \"\u03CA\": \"\u03B9\u0308\",\n  \"\u0390\": \"\u03B9\u0308\u0301\",\n  \"\u1FD2\": \"\u03B9\u0308\u0300\",\n  \"\u1FD1\": \"\u03B9\u0304\",\n  \"\u1FD0\": \"\u03B9\u0306\",\n  \"\u03CC\": \"\u03BF\u0301\",\n  \"\u1F78\": \"\u03BF\u0300\",\n  \"\u03CD\": \"\u03C5\u0301\",\n  \"\u1F7A\": \"\u03C5\u0300\",\n  \"\u03CB\": \"\u03C5\u0308\",\n  \"\u03B0\": \"\u03C5\u0308\u0301\",\n  \"\u1FE2\": \"\u03C5\u0308\u0300\",\n  \"\u1FE1\": \"\u03C5\u0304\",\n  \"\u1FE0\": \"\u03C5\u0306\",\n  \"\u03CE\": \"\u03C9\u0301\",\n  \"\u1F7C\": \"\u03C9\u0300\",\n  \"\u038E\": \"\u03A5\u0301\",\n  \"\u1FEA\": \"\u03A5\u0300\",\n  \"\u03AB\": \"\u03A5\u0308\",\n  \"\u1FE9\": \"\u03A5\u0304\",\n  \"\u1FE8\": \"\u03A5\u0306\",\n  \"\u038F\": \"\u03A9\u0301\",\n  \"\u1FFA\": \"\u03A9\u0300\"\n};\n\n/* eslint no-constant-condition:0 */\n\nconst binLeftCancellers = [\"bin\", \"op\", \"open\", \"punct\", \"rel\"];\nconst sizeRegEx = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/;\n\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\n\nclass Parser {\n  constructor(input, settings, isPreamble = false) {\n    // Start in math mode\n    this.mode = \"math\";\n    // Create a new macro expander (gullet) and (indirectly via that) also a\n    // new lexer (mouth) for this parser (stomach, in the language of TeX)\n    this.gullet = new MacroExpander(input, settings, this.mode);\n    // Store the settings for use in parsing\n    this.settings = settings;\n    // Are we defining a preamble?\n    this.isPreamble = isPreamble;\n    // Count leftright depth (for \\middle errors)\n    this.leftrightDepth = 0;\n    this.prevAtomType = \"\";\n  }\n\n  /**\n   * Checks a result to make sure it has the right type, and throws an\n   * appropriate error otherwise.\n   */\n  expect(text, consume = true) {\n    if (this.fetch().text !== text) {\n      throw new ParseError(`Expected '$text}', got '$this.fetch().text}'`, this.fetch());\n    }\n    if (consume) {\n      this.consume();\n    }\n  }\n\n  /**\n   * Discards the current lookahead token, considering it consumed.\n   */\n  consume() {\n    this.nextToken = null;\n  }\n\n  /**\n   * Return the current lookahead token, or if there isn't one (at the\n   * beginning, or if the previous lookahead token was consume()d),\n   * fetch the next token as the new lookahead token and return it.\n   */\n  fetch() {\n    if (this.nextToken == null) {\n      this.nextToken = this.gullet.expandNextToken();\n    }\n    return this.nextToken;\n  }\n\n  /**\n   * Switches between \"text\" and \"math\" modes.\n   */\n  switchMode(newMode) {\n    this.mode = newMode;\n    this.gullet.switchMode(newMode);\n  }\n\n  /**\n   * Main parsing function, which parses an entire input.\n   */\n  parse() {\n    // Create a group namespace for every $...$, $$...$$, \\[...\\].)\n    // A \\def is then valid only within that pair of delimiters.\n    this.gullet.beginGroup();\n\n    if (this.settings.colorIsTextColor) {\n      // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n      // We do this within the group for the math expression, so it doesn't\n      // pollute settings.macros.\n      this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n    }\n\n    // Try to parse the input\n    const parse = this.parseExpression(false);\n\n    // If we succeeded, make sure there's an EOF at the end\n    this.expect(\"EOF\");\n\n    if (this.isPreamble) {\n      const macros = Object.create(null);\n      Object.entries(this.gullet.macros.current).forEach(([key, value]) => {\n        macros[key] = value;\n      });\n      this.gullet.endGroup();\n      return macros\n    }\n\n    // The only local macro that we want to save is from \\tag.\n    const tag = this.gullet.macros.get(\"\\\\df@tag\");\n\n    // End the group namespace for the expression\n    this.gullet.endGroup();\n\n    if (tag) { this.gullet.macros.current[\"\\\\df@tag\"] = tag; }\n\n    return parse;\n  }\n\n  static get endOfExpression() {\n    return [\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"\\\\endtoggle\", \"&\"];\n  }\n\n  /**\n   * Fully parse a separate sequence of tokens as a separate job.\n   * Tokens should be specified in reverse order, as in a MacroDefinition.\n   */\n  subparse(tokens) {\n    // Save the next token from the current job.\n    const oldToken = this.nextToken;\n    this.consume();\n\n    // Run the new job, terminating it with an excess '}'\n    this.gullet.pushToken(new Token(\"}\"));\n    this.gullet.pushTokens(tokens);\n    const parse = this.parseExpression(false);\n    this.expect(\"}\");\n\n    // Restore the next token from the current job.\n    this.nextToken = oldToken;\n\n    return parse;\n  }\n\n/**\n   * Parses an \"expression\", which is a list of atoms.\n   *\n   * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n   *                 happens when functions have higher precedence han infix\n   *                 nodes in implicit parses.\n   *\n   * `breakOnTokenText`: The text of the token that the expression should end\n   *                     with, or `null` if something else should end the\n   *                     expression.\n   *\n   * `breakOnMiddle`: \\color, \\over, and old styling functions work on an implicit group.\n   *                  These groups end just before the usual tokens, but they also\n   *                  end just before `\\middle`.\n   */\n  parseExpression(breakOnInfix, breakOnTokenText, breakOnMiddle) {\n    const body = [];\n    this.prevAtomType = \"\";\n    // Keep adding atoms to the body until we can't parse any more atoms (either\n    // we reached the end, a }, or a \\right)\n    while (true) {\n      // Ignore spaces in math mode\n      if (this.mode === \"math\") {\n        this.consumeSpaces();\n      }\n      const lex = this.fetch();\n      if (Parser.endOfExpression.indexOf(lex.text) !== -1) {\n        break;\n      }\n      if (breakOnTokenText && lex.text === breakOnTokenText) {\n        break;\n      }\n      if (breakOnMiddle && lex.text === \"\\\\middle\") {\n        break\n      }\n      if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n        break;\n      }\n      const atom = this.parseAtom(breakOnTokenText);\n      if (!atom) {\n        break;\n      } else if (atom.type === \"internal\") {\n        continue;\n      }\n      body.push(atom);\n      // Keep a record of the atom type, so that op.js can set correct spacing.\n      this.prevAtomType = atom.type === \"atom\" ? atom.family : atom.type;\n    }\n    if (this.mode === \"text\") {\n      this.formLigatures(body);\n    }\n    return this.handleInfixNodes(body);\n  }\n\n  /**\n   * Rewrites infix operators such as \\over with corresponding commands such\n   * as \\frac.\n   *\n   * There can only be one infix operator per group.  If there's more than one\n   * then the expression is ambiguous.  This can be resolved by adding {}.\n   */\n  handleInfixNodes(body) {\n    let overIndex = -1;\n    let funcName;\n\n    for (let i = 0; i < body.length; i++) {\n      if (body[i].type === \"infix\") {\n        if (overIndex !== -1) {\n          throw new ParseError(\"only one infix operator per group\", body[i].token);\n        }\n        overIndex = i;\n        funcName = body[i].replaceWith;\n      }\n    }\n\n    if (overIndex !== -1 && funcName) {\n      let numerNode;\n      let denomNode;\n\n      const numerBody = body.slice(0, overIndex);\n      const denomBody = body.slice(overIndex + 1);\n\n      if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n        numerNode = numerBody[0];\n      } else {\n        numerNode = { type: \"ordgroup\", mode: this.mode, body: numerBody };\n      }\n\n      if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n        denomNode = denomBody[0];\n      } else {\n        denomNode = { type: \"ordgroup\", mode: this.mode, body: denomBody };\n      }\n\n      let node;\n      if (funcName === \"\\\\\\\\abovefrac\") {\n        node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n      } else {\n        node = this.callFunction(funcName, [numerNode, denomNode], []);\n      }\n      return [node];\n    } else {\n      return body;\n    }\n  }\n\n  /**\n   * Handle a subscript or superscript with nice errors.\n   */\n  handleSupSubscript(\n    name // For error reporting.\n  ) {\n    const symbolToken = this.fetch();\n    const symbol = symbolToken.text;\n    this.consume();\n    this.consumeSpaces(); // ignore spaces before sup/subscript argument\n    const group = this.parseGroup(name);\n\n    if (!group) {\n      throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n    }\n\n    return group;\n  }\n\n  /**\n   * Converts the textual input of an unsupported command into a text node\n   * contained within a color node whose color is determined by errorColor\n   */\n  formatUnsupportedCmd(text) {\n    const textordArray = [];\n\n    for (let i = 0; i < text.length; i++) {\n      textordArray.push({ type: \"textord\", mode: \"text\", text: text[i] });\n    }\n\n    const textNode = {\n      type: \"text\",\n      mode: this.mode,\n      body: textordArray\n    };\n\n    const colorNode = {\n      type: \"color\",\n      mode: this.mode,\n      color: this.settings.errorColor,\n      body: [textNode]\n    };\n\n    return colorNode;\n  }\n\n  /**\n   * Parses a group with optional super/subscripts.\n   */\n  parseAtom(breakOnTokenText) {\n    // The body of an atom is an implicit group, so that things like\n    // \\left(x\\right)^2 work correctly.\n    const base = this.parseGroup(\"atom\", breakOnTokenText);\n\n    // In text mode, we don't have superscripts or subscripts\n    if (this.mode === \"text\") {\n      return base;\n    }\n\n    // Note that base may be empty (i.e. null) at this point.\n\n    let superscript;\n    let subscript;\n    while (true) {\n      // Guaranteed in math mode, so eat any spaces first.\n      this.consumeSpaces();\n\n      // Lex the first token\n      const lex = this.fetch();\n\n      if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n        // We got a limit control\n        if (base && base.type === \"op\") {\n          const limits = lex.text === \"\\\\limits\";\n          base.limits = limits;\n          base.alwaysHandleSupSub = true;\n        } else if (base && base.type === \"operatorname\") {\n          if (base.alwaysHandleSupSub) {\n            base.limits = lex.text === \"\\\\limits\";\n          }\n        } else {\n          throw new ParseError(\"Limit controls must follow a math operator\", lex);\n        }\n        this.consume();\n      } else if (lex.text === \"^\") {\n        // We got a superscript start\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        superscript = this.handleSupSubscript(\"superscript\");\n      } else if (lex.text === \"_\") {\n        // We got a subscript start\n        if (subscript) {\n          throw new ParseError(\"Double subscript\", lex);\n        }\n        subscript = this.handleSupSubscript(\"subscript\");\n      } else if (lex.text === \"'\") {\n        // We got a prime\n        if (superscript) {\n          throw new ParseError(\"Double superscript\", lex);\n        }\n        const prime = { type: \"textord\", mode: this.mode, text: \"\\\\prime\" };\n\n        // Many primes can be grouped together, so we handle this here\n        const primes = [prime];\n        this.consume();\n        // Keep lexing tokens until we get something that's not a prime\n        while (this.fetch().text === \"'\") {\n          // For each one, add another prime to the list\n          primes.push(prime);\n          this.consume();\n        }\n        // If there's a superscript following the primes, combine that\n        // superscript in with the primes.\n        if (this.fetch().text === \"^\") {\n          primes.push(this.handleSupSubscript(\"superscript\"));\n        }\n        // Put everything into an ordgroup as the superscript\n        superscript = { type: \"ordgroup\", mode: this.mode, body: primes };\n      } else if (uSubsAndSups[lex.text]) {\n        // A Unicode subscript or superscript character.\n        // We treat these similarly to the unicode-math package.\n        // So we render a string of Unicode (sub|super)scripts the\n        // same as a (sub|super)script of regular characters.\n        const isSub = unicodeSubRegEx.test(lex.text);\n        const subsupTokens = [];\n        subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n        this.consume();\n        // Continue fetching tokens to fill out the group.\n        while (true) {\n          const token = this.fetch().text;\n          if (!(uSubsAndSups[token])) { break }\n          if (unicodeSubRegEx.test(token) !== isSub) { break }\n          subsupTokens.unshift(new Token(uSubsAndSups[token]));\n          this.consume();\n        }\n        // Now create a (sub|super)script.\n        const body = this.subparse(subsupTokens);\n        if (isSub) {\n          subscript = { type: \"ordgroup\", mode: \"math\", body };\n        } else {\n          superscript = { type: \"ordgroup\", mode: \"math\", body };\n        }\n      } else {\n        // If it wasn't ^, _, a Unicode (sub|super)script, or ', stop parsing super/subscripts\n        break;\n      }\n    }\n\n    if (superscript || subscript) {\n      if (base && base.type === \"multiscript\" && !base.postscripts) {\n        // base is the result of a \\prescript function.\n        // Write the sub- & superscripts into the multiscript element.\n        base.postscripts = { sup: superscript, sub: subscript };\n        return base\n      } else {\n        // We got either a superscript or subscript, create a supsub\n        const isFollowedByDelimiter = (!base || base.type !== \"op\" && base.type !== \"operatorname\")\n          ? undefined\n          : isDelimiter(this.nextToken.text);\n        return {\n          type: \"supsub\",\n          mode: this.mode,\n          base: base,\n          sup: superscript,\n          sub: subscript,\n          isFollowedByDelimiter\n        }\n      }\n    } else {\n      // Otherwise return the original body\n      return base;\n    }\n  }\n\n  /**\n   * Parses an entire function, including its base and all of its arguments.\n   */\n  parseFunction(\n    breakOnTokenText,\n    name // For determining its context\n  ) {\n    const token = this.fetch();\n    const func = token.text;\n    const funcData = functions[func];\n    if (!funcData) {\n      return null;\n    }\n    this.consume(); // consume command token\n\n    if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n      throw new ParseError(\n        \"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"),\n        token\n      );\n    } else if (this.mode === \"text\" && !funcData.allowedInText) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n    } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n      throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n    }\n\n    const prevAtomType = this.prevAtomType;\n    const { args, optArgs } = this.parseArguments(func, funcData);\n    this.prevAtomType = prevAtomType;\n    return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n  }\n\n  /**\n   * Call a function handler with a suitable context and arguments.\n   */\n  callFunction(name, args, optArgs, token, breakOnTokenText) {\n    const context = {\n      funcName: name,\n      parser: this,\n      token,\n      breakOnTokenText\n    };\n    const func = functions[name];\n    if (func && func.handler) {\n      return func.handler(context, args, optArgs);\n    } else {\n      throw new ParseError(`No function handler for $name}`);\n    }\n  }\n\n  /**\n   * Parses the arguments of a function or environment\n   */\n  parseArguments(\n    func, // Should look like \"\\name\" or \"\\begin{name}\".\n    funcData\n  ) {\n    const totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n    if (totalArgs === 0) {\n      return { args: [], optArgs: [] };\n    }\n\n    const args = [];\n    const optArgs = [];\n\n    for (let i = 0; i < totalArgs; i++) {\n      let argType = funcData.argTypes && funcData.argTypes[i];\n      const isOptional = i < funcData.numOptionalArgs;\n\n      if (\n        (funcData.primitive && argType == null) ||\n        // \\sqrt expands into primitive if optional argument doesn't exist\n        (funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null)\n      ) {\n        argType = \"primitive\";\n      }\n\n      const arg = this.parseGroupOfType(`argument to '$func}'`, argType, isOptional);\n      if (isOptional) {\n        optArgs.push(arg);\n      } else if (arg != null) {\n        args.push(arg);\n      } else {\n        // should be unreachable\n        throw new ParseError(\"Null argument, please report this as a bug\");\n      }\n    }\n\n    return { args, optArgs };\n  }\n\n  /**\n   * Parses a group when the mode is changing.\n   */\n  parseGroupOfType(name, type, optional) {\n    switch (type) {\n      case \"size\":\n        return this.parseSizeGroup(optional);\n      case \"url\":\n        return this.parseUrlGroup(optional);\n      case \"math\":\n      case \"text\":\n        return this.parseArgumentGroup(optional, type);\n      case \"hbox\": {\n        // hbox argument type wraps the argument in the equivalent of\n        // \\hbox, which is like \\text but switching to \\textstyle size.\n        const group = this.parseArgumentGroup(optional, \"text\");\n        return group != null\n          ? {\n            type: \"styling\",\n            mode: group.mode,\n            body: [group],\n            scriptLevel: \"text\" // simulate \\textstyle\n          }\n          : null;\n      }\n      case \"raw\": {\n        const token = this.parseStringGroup(\"raw\", optional);\n        return token != null\n          ? {\n            type: \"raw\",\n            mode: \"text\",\n            string: token.text\n          }\n          : null;\n      }\n      case \"primitive\": {\n        if (optional) {\n          throw new ParseError(\"A primitive argument cannot be optional\");\n        }\n        const group = this.parseGroup(name);\n        if (group == null) {\n          throw new ParseError(\"Expected group as \" + name, this.fetch());\n        }\n        return group;\n      }\n      case \"original\":\n      case null:\n      case undefined:\n        return this.parseArgumentGroup(optional);\n      default:\n        throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n    }\n  }\n\n  /**\n   * Discard any space tokens, fetching the next non-space token.\n   */\n  consumeSpaces() {\n    while (true) {\n      const ch = this.fetch().text;\n      // \\ufe0e is the Unicode variation selector to supress emoji. Ignore it.\n      if (ch === \" \" || ch === \"\\u00a0\" || ch === \"\\ufe0e\") {\n        this.consume();\n      } else {\n        break\n      }\n    }\n  }\n\n  /**\n   * Parses a group, essentially returning the string formed by the\n   * brace-enclosed tokens plus some position information.\n   */\n  parseStringGroup(\n    modeName, // Used to describe the mode in error messages.\n    optional\n  ) {\n    const argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    let str = \"\";\n    let nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\") {\n      str += nextToken.text;\n      this.consume();\n    }\n    this.consume(); // consume the end of the argument\n    argToken.text = str;\n    return argToken;\n  }\n\n  /**\n   * Parses a regex-delimited group: the largest sequence of tokens\n   * whose concatenated strings match `regex`. Returns the string\n   * formed by the tokens plus some position information.\n   */\n  parseRegexGroup(\n    regex,\n    modeName // Used to describe the mode in error messages.\n  ) {\n    const firstToken = this.fetch();\n    let lastToken = firstToken;\n    let str = \"\";\n    let nextToken;\n    while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n      lastToken = nextToken;\n      str += lastToken.text;\n      this.consume();\n    }\n    if (str === \"\") {\n      throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n    }\n    return firstToken.range(lastToken, str);\n  }\n\n  /**\n   * Parses a size specification, consisting of magnitude and unit.\n   */\n  parseSizeGroup(optional) {\n    let res;\n    let isBlank = false;\n    // don't expand before parseStringGroup\n    this.gullet.consumeSpaces();\n    if (!optional && this.gullet.future().text !== \"{\") {\n      res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n    } else {\n      res = this.parseStringGroup(\"size\", optional);\n    }\n    if (!res) {\n      return null;\n    }\n    if (!optional && res.text.length === 0) {\n      // Because we've tested for what is !optional, this block won't\n      // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n      // to \\genfrac and \\above.\n      res.text = \"0pt\"; // Enable \\above{}\n      isBlank = true; // This is here specifically for \\genfrac\n    }\n    const match = sizeRegEx.exec(res.text);\n    if (!match) {\n      throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n    }\n    const data = {\n      number: +(match[1] + match[2]), // sign + magnitude, cast to number\n      unit: match[3]\n    };\n    if (!validUnit(data)) {\n      throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n    }\n    return {\n      type: \"size\",\n      mode: this.mode,\n      value: data,\n      isBlank\n    };\n  }\n\n  /**\n   * Parses an URL, checking escaped letters and allowed protocols,\n   * and setting the catcode of % as an active character (as in \\hyperref).\n   */\n  parseUrlGroup(optional) {\n    this.gullet.lexer.setCatcode(\"%\", 13); // active character\n    this.gullet.lexer.setCatcode(\"~\", 12); // other character\n    const res = this.parseStringGroup(\"url\", optional);\n    this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n    this.gullet.lexer.setCatcode(\"~\", 13); // active character\n    if (res == null) {\n      return null;\n    }\n    // hyperref package allows backslashes alone in href, but doesn't\n    // generate valid links in such cases; we interpret this as\n    // \"undefined\" behaviour, and keep them as-is. Some browser will\n    // replace backslashes with forward slashes.\n    let url = res.text.replace(/\\\\([#$%&~_^{}])/g, \"$1\");\n    url = res.text.replace(/{\\u2044}/g, \"/\");\n    return {\n      type: \"url\",\n      mode: this.mode,\n      url\n    };\n  }\n\n  /**\n   * Parses an argument with the mode specified.\n   */\n  parseArgumentGroup(optional, mode) {\n    const argToken = this.gullet.scanArgument(optional);\n    if (argToken == null) {\n      return null;\n    }\n    const outerMode = this.mode;\n    if (mode) {\n      // Switch to specified mode\n      this.switchMode(mode);\n    }\n\n    this.gullet.beginGroup();\n    const expression = this.parseExpression(false, \"EOF\");\n    // TODO: find an alternative way to denote the end\n    this.expect(\"EOF\"); // expect the end of the argument\n    this.gullet.endGroup();\n    const result = {\n      type: \"ordgroup\",\n      mode: this.mode,\n      loc: argToken.loc,\n      body: expression\n    };\n\n    if (mode) {\n      // Switch mode back\n      this.switchMode(outerMode);\n    }\n    return result;\n  }\n\n  /**\n   * Parses an ordinary group, which is either a single nucleus (like \"x\")\n   * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n   * that starts at the current position, and ends right before a higher explicit\n   * group ends, or at EOF.\n   */\n  parseGroup(\n    name, // For error reporting.\n    breakOnTokenText\n  ) {\n    const firstToken = this.fetch();\n    const text = firstToken.text;\n\n    let result;\n    // Try to parse an open brace or \\begingroup\n    if (text === \"{\" || text === \"\\\\begingroup\" || text === \"\\\\toggle\") {\n      this.consume();\n      const groupEnd = text === \"{\"\n        ? \"}\"\n        : text === \"\\\\begingroup\"\n        ? \"\\\\endgroup\"\n        : \"\\\\endtoggle\";\n\n      this.gullet.beginGroup();\n      // If we get a brace, parse an expression\n      const expression = this.parseExpression(false, groupEnd);\n      const lastToken = this.fetch();\n      this.expect(groupEnd); // Check that we got a matching closing brace\n      this.gullet.endGroup();\n      result = {\n        type: (lastToken.text === \"\\\\endtoggle\" ? \"toggle\" : \"ordgroup\"),\n        mode: this.mode,\n        loc: SourceLocation.range(firstToken, lastToken),\n        body: expression,\n        // A group formed by \\begingroup...\\endgroup is a semi-simple group\n        // which doesn't affect spacing in math mode, i.e., is transparent.\n        // https://tex.stackexchange.com/questions/1930/\n        semisimple: text === \"\\\\begingroup\" || undefined\n      };\n    } else {\n      // If there exists a function with this name, parse the function.\n      // Otherwise, just return a nucleus\n      result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n      if (result == null && text[0] === \"\\\\\" &&\n          !Object.prototype.hasOwnProperty.call(implicitCommands, text )) {\n        result = this.formatUnsupportedCmd(text);\n        this.consume();\n      }\n    }\n    return result;\n  }\n\n  /**\n   * Form ligature-like combinations of characters for text mode.\n   * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n   * The result will simply replace multiple textord nodes with a single\n   * character in each value by a single textord node having multiple\n   * characters in its value.  The representation is still ASCII source.\n   * The group will be modified in place.\n   */\n  formLigatures(group) {\n    let n = group.length - 1;\n    for (let i = 0; i < n; ++i) {\n      const a = group[i];\n      const v = a.text;\n      if (v === \"-\" && group[i + 1].text === \"-\") {\n        if (i + 1 < n && group[i + 2].text === \"-\") {\n          group.splice(i, 3, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, group[i + 2]),\n            text: \"---\"\n          });\n          n -= 2;\n        } else {\n          group.splice(i, 2, {\n            type: \"textord\",\n            mode: \"text\",\n            loc: SourceLocation.range(a, group[i + 1]),\n            text: \"--\"\n          });\n          n -= 1;\n        }\n      }\n      if ((v === \"'\" || v === \"`\") && group[i + 1].text === v) {\n        group.splice(i, 2, {\n          type: \"textord\",\n          mode: \"text\",\n          loc: SourceLocation.range(a, group[i + 1]),\n          text: v + v\n        });\n        n -= 1;\n      }\n    }\n  }\n\n  /**\n   * Parse a single symbol out of the string. Here, we handle single character\n   * symbols and special functions like \\verb.\n   */\n  parseSymbol() {\n    const nucleus = this.fetch();\n    let text = nucleus.text;\n\n    if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n      this.consume();\n      let arg = text.slice(5);\n      const star = arg.charAt(0) === \"*\";\n      if (star) {\n        arg = arg.slice(1);\n      }\n      // Lexer's tokenRegex is constructed to always have matching\n      // first/last characters.\n      if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n        throw new ParseError(`\\\\verb assertion failed --\n                    please report what input caused this bug`);\n      }\n      arg = arg.slice(1, -1); // remove first and last char\n      return {\n        type: \"verb\",\n        mode: \"text\",\n        body: arg,\n        star\n      };\n    }\n    // At this point, we should have a symbol, possibly with accents.\n    // First expand any accented base symbol according to unicodeSymbols.\n    if (Object.prototype.hasOwnProperty.call(unicodeSymbols, text[0]) &&\n      this.mode === \"math\" && !symbols[this.mode][text[0]]) {\n      // This behavior is not strict (XeTeX-compatible) in math mode.\n      if (this.settings.strict && this.mode === \"math\") {\n        throw new ParseError(`Accented Unicode text character \"$text[0]}\" used in ` + `math mode`,\n          nucleus\n        );\n      }\n      text = unicodeSymbols[text[0]] + text.slice(1);\n    }\n    // Strip off any combining characters\n    const match = this.mode === \"math\"\n      ? combiningDiacriticalMarksEndRegex.exec(text)\n      : null;\n    if (match) {\n      text = text.substring(0, match.index);\n      if (text === \"i\") {\n        text = \"\\u0131\"; // dotless i, in math and text mode\n      } else if (text === \"j\") {\n        text = \"\\u0237\"; // dotless j, in math and text mode\n      }\n    }\n    // Recognize base symbol\n    let symbol;\n    if (symbols[this.mode][text]) {\n      let group = symbols[this.mode][text].group;\n      if (group === \"bin\" && binLeftCancellers.includes(this.prevAtomType)) {\n        // Change from a binary operator to a unary (prefix) operator\n        group = \"open\";\n      }\n      const loc = SourceLocation.range(nucleus);\n      let s;\n      if (Object.prototype.hasOwnProperty.call(ATOMS, group )) {\n        const family = group;\n        s = {\n          type: \"atom\",\n          mode: this.mode,\n          family,\n          loc,\n          text\n        };\n      } else {\n        if (asciiFromScript[text]) {\n          // Unicode 14 disambiguates chancery from roundhand.\n          // See https://www.unicode.org/charts/PDF/U1D400.pdf\n          this.consume();\n          const nextCode = this.fetch().text.charCodeAt(0);\n          // mathcal is Temml default. Use mathscript if called for.\n          const font = nextCode === 0xfe01 ? \"mathscr\" : \"mathcal\";\n          if (nextCode === 0xfe00 || nextCode === 0xfe01) { this.consume(); }\n          return {\n            type: \"font\",\n            mode: \"math\",\n            font,\n            body: { type: \"mathord\", mode: \"math\", loc, text: asciiFromScript[text] }\n          }\n        }\n        // Default ord character. No disambiguation necessary.\n        s = {\n          type: group,\n          mode: this.mode,\n          loc,\n          text\n        };\n      }\n      symbol = s;\n    } else if (text.charCodeAt(0) >= 0x80 || combiningDiacriticalMarksEndRegex.exec(text)) {\n      // no symbol for e.g. ^\n      if (this.settings.strict && this.mode === \"math\") {\n        throw new ParseError(`Unicode text character \"$text[0]}\" used in math mode`, nucleus)\n      }\n      // All nonmathematical Unicode characters are rendered as if they\n      // are in text mode (wrapped in \\text) because that's what it\n      // takes to render them in LaTeX.\n      symbol = {\n        type: \"textord\",\n        mode: \"text\",\n        loc: SourceLocation.range(nucleus),\n        text\n      };\n    } else {\n      return null; // EOF, ^, _, {, }, etc.\n    }\n    this.consume();\n    // Transform combining characters into accents\n    if (match) {\n      for (let i = 0; i < match[0].length; i++) {\n        const accent = match[0][i];\n        if (!unicodeAccents[accent]) {\n          throw new ParseError(`Unknown accent ' $accent}'`, nucleus);\n        }\n        const command = unicodeAccents[accent][this.mode] ||\n                        unicodeAccents[accent].text;\n        if (!command) {\n          throw new ParseError(`Accent $accent} unsupported in $this.mode} mode`, nucleus);\n        }\n        symbol = {\n          type: \"accent\",\n          mode: this.mode,\n          loc: SourceLocation.range(nucleus),\n          label: command,\n          isStretchy: false,\n          base: symbol\n        };\n      }\n    }\n    return symbol;\n  }\n}\n\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nconst parseTree = function(toParse, settings) {\n  if (!(typeof toParse === \"string\" || toParse instanceof String)) {\n    throw new TypeError(\"Temml can only parse string typed expression\")\n  }\n  const parser = new Parser(toParse, settings);\n  // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n  delete parser.gullet.macros.current[\"\\\\df@tag\"];\n\n  let tree = parser.parse();\n\n  // LaTeX ignores a \\tag placed outside an AMS environment.\n  if (!(tree.length > 0 &&  tree[0].type && tree[0].type === \"array\" && tree[0].addEqnNum)) {\n    // If the input used \\tag, it will set the \\df@tag macro to the tag.\n    // In this case, we separately parse the tag and wrap the tree.\n    if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n      if (!settings.displayMode) {\n        throw new ParseError(\"\\\\tag works only in display mode\")\n      }\n      parser.gullet.feed(\"\\\\df@tag\");\n      tree = [\n        {\n          type: \"tag\",\n          mode: \"text\",\n          body: tree,\n          tag: parser.parse()\n        }\n      ];\n    }\n  }\n\n  return tree\n};\n\n/**\n * This file contains information about the style that the mathmlBuilder carries\n * around with it. Data is held in an `Style` object, and when\n * recursing, a new `Style` object can be created with the `.with*` functions.\n */\n\nconst subOrSupLevel = [2, 2, 3, 3];\n\n/**\n * This is the main Style class. It contains the current style.level, color, and font.\n *\n * Style objects should not be modified. To create a new Style with\n * different properties, call a `.with*` method.\n */\nclass Style {\n  constructor(data) {\n    // Style.level can be 0 | 1 | 2 | 3, which correspond to\n    //       displaystyle, textstyle, scriptstyle, and scriptscriptstyle.\n    // style.level usually does not directly set MathML's script level. MathML does that itself.\n    // However, Chromium does not stop shrinking after scriptscriptstyle, so we do explicitly\n    // set a scriptlevel attribute in those conditions.\n    // We also use style.level to track math style so that we can get the correct\n    // scriptlevel when needed in supsub.js, mathchoice.js, or for dimensions in em.\n    this.level = data.level;\n    this.color = data.color;  // string | void\n    // A font family applies to a group of fonts (i.e. SansSerif), while a font\n    // represents a specific font (i.e. SansSerif Bold).\n    // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n    this.font = data.font || \"\";                // string\n    this.fontFamily = data.fontFamily || \"\";    // string\n    this.fontSize = data.fontSize || 1.0;       // number\n    this.fontWeight = data.fontWeight || \"\";\n    this.fontShape = data.fontShape || \"\";\n    this.maxSize = data.maxSize;                // [number, number]\n  }\n\n  /**\n   * Returns a new style object with the same properties as \"this\".  Properties\n   * from \"extension\" will be copied to the new style object.\n   */\n  extend(extension) {\n    const data = {\n      level: this.level,\n      color: this.color,\n      font: this.font,\n      fontFamily: this.fontFamily,\n      fontSize: this.fontSize,\n      fontWeight: this.fontWeight,\n      fontShape: this.fontShape,\n      maxSize: this.maxSize\n    };\n\n    for (const key in extension) {\n      if (Object.prototype.hasOwnProperty.call(extension, key)) {\n        data[key] = extension[key];\n      }\n    }\n\n    return new Style(data);\n  }\n\n  withLevel(n) {\n    return this.extend({\n      level: n\n    });\n  }\n\n  incrementLevel() {\n    return this.extend({\n      level: Math.min(this.level + 1, 3)\n    });\n  }\n\n  inSubOrSup() {\n    return this.extend({\n      level: subOrSupLevel[this.level]\n    })\n  }\n\n  /**\n   * Create a new style object with the given color.\n   */\n  withColor(color) {\n    return this.extend({\n      color: color\n    });\n  }\n\n  /**\n   * Creates a new style object with the given math font or old text font.\n   * @type {[type]}\n   */\n  withFont(font) {\n    return this.extend({\n      font\n    });\n  }\n\n  /**\n   * Create a new style objects with the given fontFamily.\n   */\n  withTextFontFamily(fontFamily) {\n    return this.extend({\n      fontFamily,\n      font: \"\"\n    });\n  }\n\n  /**\n   * Creates a new style object with the given font size\n   */\n  withFontSize(num) {\n    return this.extend({\n      fontSize: num\n    });\n  }\n\n  /**\n   * Creates a new style object with the given font weight\n   */\n  withTextFontWeight(fontWeight) {\n    return this.extend({\n      fontWeight,\n      font: \"\"\n    });\n  }\n\n  /**\n   * Creates a new style object with the given font weight\n   */\n  withTextFontShape(fontShape) {\n    return this.extend({\n      fontShape,\n      font: \"\"\n    });\n  }\n\n  /**\n   * Gets the CSS color of the current style object\n   */\n  getColor() {\n    return this.color;\n  }\n}\n\n/* Temml Post Process\n * Populate the text contents of each \\ref & \\eqref\n *\n * As with other Temml code, this file is released under terms of the MIT license.\n * https://mit-license.org/\n */\n\nconst version = \"0.10.34\";\n\nfunction postProcess(block) {\n  const labelMap = {};\n  let i = 0;\n\n  // Get a collection of the parents of each \\tag & auto-numbered equation\n  const amsEqns = document.getElementsByClassName('tml-eqn');\n  for (let parent of amsEqns) {\n    // AMS automatically numbered equation.\n    // Assign an id.\n    i += 1;\n    parent.setAttribute(\"id\", \"tml-eqn-\" + String(i));\n    // No need to write a number into the text content of the element.\n    // A CSS counter has done that even if this postProcess() function is not used.\n\n    // Find any \\label that refers to an AMS automatic eqn number.\n    while (true) {\n      if (parent.tagName === \"mtable\") { break }\n      const labels = parent.getElementsByClassName(\"tml-label\");\n      if (labels.length > 0) {\n        const id = parent.attributes.id.value;\n        labelMap[id] = String(i);\n        break\n      } else {\n        parent = parent.parentElement;\n      }\n    }\n  }\n\n  // Find \\labels associated with \\tag\n  const taggedEqns = document.getElementsByClassName('tml-tageqn');\n  for (const parent of taggedEqns) {\n    const labels = parent.getElementsByClassName(\"tml-label\");\n    if (labels.length > 0) {\n      const tags = parent.getElementsByClassName(\"tml-tag\");\n      if (tags.length > 0) {\n        const id = parent.attributes.id.value;\n        labelMap[id] = tags[0].textContent;\n      }\n    }\n  }\n\n  // Populate \\ref & \\eqref text content\n  const refs = block.getElementsByClassName(\"tml-ref\");\n  [...refs].forEach(ref => {\n    const attr = ref.getAttribute(\"href\");\n    let str = labelMap[attr.slice(1)];\n    if (ref.className.indexOf(\"tml-eqref\") === -1) {\n      // \\ref. Omit parens.\n      str = str.replace(/^\\(/, \"\");\n      str = str.replace(/\\)$/, \"\");\n    } else {\n      // \\eqref. Include parens\n      if (str.charAt(0) !== \"(\") { str = \"(\" + str; }\n      if (str.slice(-1) !== \")\") { str =  str + \")\"; }\n    }\n    const mtext = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mtext\");\n    mtext.appendChild(document.createTextNode(str));\n    const math =  document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"math\");\n    math.appendChild(mtext);\n    ref.appendChild(math);\n  });\n}\n\n/* eslint no-console:0 */\n/**\n * This is the main entry point for Temml. Here, we expose functions for\n * rendering expressions either to DOM nodes or to markup strings.\n *\n * We also expose the ParseError class to check if errors thrown from Temml are\n * errors in the expression, or errors in javascript handling.\n */\n\n\n/**\n * @type {import('./temml').render}\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nlet render = function(expression, baseNode, options = {}) {\n  baseNode.textContent = \"\";\n  const alreadyInMathElement = baseNode.tagName.toLowerCase() === \"math\";\n  if (alreadyInMathElement) { options.wrap = \"none\"; }\n  const math = renderToMathMLTree(expression, options);\n  if (alreadyInMathElement) {\n    // The <math> element already exists. Populate it.\n    baseNode.textContent = \"\";\n    math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n  } else if (math.children.length > 1) {\n    baseNode.textContent = \"\";\n    math.children.forEach(e => { baseNode.appendChild(e.toNode()); });\n  } else {\n    baseNode.appendChild(math.toNode());\n  }\n};\n\n// Temml's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\nif (typeof document !== \"undefined\") {\n  if (document.compatMode !== \"CSS1Compat\") {\n    typeof console !== \"undefined\" &&\n      console.warn(\n        \"Warning: Temml doesn't work in quirks mode. Make sure your \" +\n          \"website has a suitable doctype.\"\n      );\n\n    render = function() {\n      throw new ParseError(\"Temml doesn't work in quirks mode.\");\n    };\n  }\n}\n\n/**\n * @type {import('./temml').renderToString}\n * Parse and build an expression, and return the markup for that.\n */\nconst renderToString = function(expression, options) {\n  const markup = renderToMathMLTree(expression, options).toMarkup();\n  return markup;\n};\n\n/**\n * @type {import('./temml').generateParseTree}\n * Parse an expression and return the parse tree.\n */\nconst generateParseTree = function(expression, options) {\n  const settings = new Settings(options);\n  return parseTree(expression, settings);\n};\n\n/**\n * @type {import('./temml').definePreamble}\n * Take an expression which contains a preamble.\n * Parse it and return the macros.\n */\nconst definePreamble = function(expression, options) {\n  const settings = new Settings(options);\n  settings.macros = {};\n  if (!(typeof expression === \"string\" || expression instanceof String)) {\n    throw new TypeError(\"Temml can only parse string typed expression\")\n  }\n  const parser = new Parser(expression, settings, true);\n  // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n  delete parser.gullet.macros.current[\"\\\\df@tag\"];\n  const macros = parser.parse();\n  return macros\n};\n\n/**\n * If the given error is a Temml ParseError,\n * renders the invalid LaTeX as a span with hover title giving the Temml\n * error message.  Otherwise, simply throws the error.\n */\nconst renderError = function(error, expression, options) {\n  if (options.throwOnError || !(error instanceof ParseError)) {\n    throw error;\n  }\n  const node = new Span([\"temml-error\"], [new TextNode$1(expression + \"\\n\" + error.toString())]);\n  node.style.color = options.errorColor;\n  node.style.whiteSpace = \"pre-line\";\n  return node;\n};\n\n/**\n * @type {import('./temml').renderToMathMLTree}\n * Generates and returns the Temml build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\nconst renderToMathMLTree = function(expression, options) {\n  const settings = new Settings(options);\n  try {\n    const tree = parseTree(expression, settings);\n    const style = new Style({\n      level: settings.displayMode ? StyleLevel.DISPLAY : StyleLevel.TEXT,\n      maxSize: settings.maxSize\n    });\n    return buildMathML(tree, expression, style, settings);\n  } catch (error) {\n    return renderError(error, expression, settings);\n  }\n};\n\n/** @type {import('./temml').default} */\nvar temml = {\n  /**\n   * Current Temml version\n   */\n  version: version,\n  /**\n   * Renders the given LaTeX into MathML, and adds\n   * it as a child to the specified DOM node.\n   */\n  render,\n  /**\n   * Renders the given LaTeX into MathML string,\n   * for sending to the client.\n   */\n  renderToString,\n  /**\n   * Post-process an entire HTML block.\n   * Writes AMS auto-numbers and implements \\ref{}.\n   * Typcally called once, after a loop has rendered many individual spans.\n   */\n  postProcess,\n  /**\n   * Temml error, usually during parsing.\n   */\n  ParseError,\n  /**\n   * Creates a set of macros with document-wide scope.\n   */\n  definePreamble,\n  /**\n   * Parses the given LaTeX into Temml's internal parse tree structure,\n   * without rendering to HTML or MathML.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __parse: generateParseTree,\n  /**\n   * Renders the given LaTeX into a MathML internal DOM tree\n   * representation, without flattening that representation to a string.\n   *\n   * NOTE: This method is not currently recommended for public use.\n   * The internal tree representation is unstable and is very likely\n   * to change. Use at your own risk.\n   */\n  __renderToMathMLTree: renderToMathMLTree,\n  /**\n   * adds a new symbol to builtin symbols table\n   */\n  __defineSymbol: defineSymbol,\n  /**\n   * adds a new macro to builtin macro list\n   */\n  __defineMacro: defineMacro\n};\n\nexport { temml as default };\n", "/**\n * External dependencies\n */\nimport temml from 'temml';\n\n/**\n * Options for LaTeX to MathML conversion.\n */\nexport interface LatexToMathMLOptions {\n\t/**\n\t * Whether to render in display mode (block) or inline mode.\n\t * @default true\n\t */\n\tdisplayMode?: boolean;\n}\n\n/**\n * Converts LaTeX math syntax to MathML.\n *\n * @param latex               - The LaTeX string to convert.\n * @param options             - Conversion options.\n * @param options.displayMode\n * @return The MathML string.\n * @throws Will throw an error if the LaTeX is invalid.\n *\n * @example\n * ```js\n * import latexToMathML from '@wordpress/latex-to-mathml';\n *\n * const mathML = latexToMathML( 'x^2', { displayMode: false } );\n * ```\n */\nexport default function latexToMathML(\n\tlatex: string,\n\t{ displayMode = true }: LatexToMathMLOptions = {}\n): string {\n\tconst mathML = temml.renderToString( latex, {\n\t\tdisplayMode,\n\t\tannotate: true,\n\t\tthrowOnError: true,\n\t} );\n\tconst doc = document.implementation.createHTMLDocument( '' );\n\tdoc.body.innerHTML = mathML;\n\treturn doc.body.querySelector( 'math' )?.innerHTML ?? '';\n}\n"],
   5    "mappings": "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K;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,QAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAAK;AAAA,EACL,UAA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",
   6    "names": ["text", "mathmlBuilder", "TextNode", "math", "accentNode", "scriptLevel", "macros", "delimiters", "tok", "inner", "style", "input", "match", "align", "textord", "args", "mi", "offset", "close", "isCharacterBox", "primes", "accent"]
   7  }


Generated : Wed Apr 15 08:20:10 2026 Cross-referenced by PHPXref