File: /var/www/indoadvisory_new/webapp/node_modules/miniflare/dist/src/workers/email/send_email.worker.js
// src/workers/email/send_email.worker.ts
import { WorkerEntrypoint } from "cloudflare:workers";
// ../../node_modules/.pnpm/kleur@4.1.5/node_modules/kleur/colors.mjs
var FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM, isTTY = !0;
typeof process < "u" && ({ FORCE_COLOR, NODE_DISABLE_COLORS, NO_COLOR, TERM } = process.env || {}, isTTY = process.stdout && process.stdout.isTTY);
var $ = {
  enabled: !NODE_DISABLE_COLORS && NO_COLOR == null && TERM !== "dumb" && (FORCE_COLOR != null && FORCE_COLOR !== "0" || isTTY)
};
function init(x, y) {
  let rgx = new RegExp(`\\x1b\\[${y}m`, "g"), open = `\x1B[${x}m`, close = `\x1B[${y}m`;
  return function(txt) {
    return !$.enabled || txt == null ? txt : open + (~("" + txt).indexOf(close) ? txt.replace(rgx, close + open) : txt) + close;
  };
}
var reset = init(0, 0), bold = init(1, 22), dim = init(2, 22), italic = init(3, 23), underline = init(4, 24), inverse = init(7, 27), hidden = init(8, 28), strikethrough = init(9, 29), black = init(30, 39), red = init(31, 39), green = init(32, 39), yellow = init(33, 39), blue = init(34, 39), magenta = init(35, 39), cyan = init(36, 39), white = init(37, 39), gray = init(90, 39), grey = init(90, 39), bgBlack = init(40, 49), bgRed = init(41, 49), bgGreen = init(42, 49), bgYellow = init(43, 49), bgBlue = init(44, 49), bgMagenta = init(45, 49), bgCyan = init(46, 49), bgWhite = init(47, 49);
// src/workers/email/send_email.worker.ts
import { LogLevel, SharedHeaders } from "miniflare:shared";
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/decode-strings.js
var textEncoder = new TextEncoder(), base64Chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", base64Lookup = new Uint8Array(256);
for (i = 0; i < base64Chars.length; i++)
  base64Lookup[base64Chars.charCodeAt(i)] = i;
var i;
function decodeBase64(base64) {
  let bufferLength = Math.ceil(base64.length / 4) * 3, len = base64.length, p = 0;
  base64.length % 4 === 3 ? bufferLength-- : base64.length % 4 === 2 ? bufferLength -= 2 : base64[base64.length - 1] === "=" && (bufferLength--, base64[base64.length - 2] === "=" && bufferLength--);
  let arrayBuffer = new ArrayBuffer(bufferLength), bytes = new Uint8Array(arrayBuffer);
  for (let i = 0; i < len; i += 4) {
    let encoded1 = base64Lookup[base64.charCodeAt(i)], encoded2 = base64Lookup[base64.charCodeAt(i + 1)], encoded3 = base64Lookup[base64.charCodeAt(i + 2)], encoded4 = base64Lookup[base64.charCodeAt(i + 3)];
    bytes[p++] = encoded1 << 2 | encoded2 >> 4, bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2, bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;
  }
  return arrayBuffer;
}
function getDecoder(charset) {
  return charset = charset || "utf8", new TextDecoder(charset);
}
async function blobToArrayBuffer(blob) {
  if ("arrayBuffer" in blob)
    return await blob.arrayBuffer();
  let fr = new FileReader();
  return new Promise((resolve, reject) => {
    fr.onload = function(e) {
      resolve(e.target.result);
    }, fr.onerror = function(e) {
      reject(fr.error);
    }, fr.readAsArrayBuffer(blob);
  });
}
function getHex(c) {
  return c >= 48 && c <= 57 || c >= 97 && c <= 102 || c >= 65 && c <= 70 ? String.fromCharCode(c) : !1;
}
function decodeWord(charset, encoding, str) {
  let splitPos = charset.indexOf("*");
  splitPos >= 0 && (charset = charset.substr(0, splitPos)), encoding = encoding.toUpperCase();
  let byteStr;
  if (encoding === "Q") {
    str = str.replace(/=\s+([0-9a-fA-F])/g, "=$1").replace(/[_\s]/g, " ");
    let buf = textEncoder.encode(str), encodedBytes = [];
    for (let i = 0, len = buf.length; i < len; i++) {
      let c = buf[i];
      if (i <= len - 2 && c === 61) {
        let c1 = getHex(buf[i + 1]), c2 = getHex(buf[i + 2]);
        if (c1 && c2) {
          let c3 = parseInt(c1 + c2, 16);
          encodedBytes.push(c3), i += 2;
          continue;
        }
      }
      encodedBytes.push(c);
    }
    byteStr = new ArrayBuffer(encodedBytes.length);
    let dataView = new DataView(byteStr);
    for (let i = 0, len = encodedBytes.length; i < len; i++)
      dataView.setUint8(i, encodedBytes[i]);
  } else encoding === "B" ? byteStr = decodeBase64(str.replace(/[^a-zA-Z0-9\+\/=]+/g, "")) : byteStr = textEncoder.encode(str);
  return getDecoder(charset).decode(byteStr);
}
function decodeWords(str) {
  let joinString = !0, done = !1;
  for (; !done; ) {
    let result = (str || "").toString().replace(/(=\?([^?]+)\?[Bb]\?([^?]*)\?=)\s*(?==\?([^?]+)\?[Bb]\?[^?]*\?=)/g, (match, left, chLeft, encodedLeftStr, chRight) => joinString && chLeft === chRight && encodedLeftStr.length % 4 === 0 && !/=$/.test(encodedLeftStr) ? left + "__\0JOIN\0__" : match).replace(/(=\?([^?]+)\?[Qq]\?[^?]*\?=)\s*(?==\?([^?]+)\?[Qq]\?[^?]*\?=)/g, (match, left, chLeft, chRight) => joinString && chLeft === chRight ? left + "__\0JOIN\0__" : match).replace(/(\?=)?__\x00JOIN\x00__(=\?([^?]+)\?[QqBb]\?)?/g, "").replace(/(=\?[^?]+\?[QqBb]\?[^?]*\?=)\s+(?==\?[^?]+\?[QqBb]\?[^?]*\?=)/g, "$1").replace(/=\?([\w_\-*]+)\?([QqBb])\?([^?]*)\?=/g, (m, charset, encoding, text) => decodeWord(charset, encoding, text));
    if (joinString && result.indexOf("\uFFFD") >= 0)
      joinString = !1;
    else
      return result;
  }
}
function decodeURIComponentWithCharset(encodedStr, charset) {
  charset = charset || "utf-8";
  let encodedBytes = [];
  for (let i = 0; i < encodedStr.length; i++) {
    let c = encodedStr.charAt(i);
    if (c === "%" && /^[a-f0-9]{2}/i.test(encodedStr.substr(i + 1, 2))) {
      let byte = encodedStr.substr(i + 1, 2);
      i += 2, encodedBytes.push(parseInt(byte, 16));
    } else if (c.charCodeAt(0) > 126) {
      c = textEncoder.encode(c);
      for (let j = 0; j < c.length; j++)
        encodedBytes.push(c[j]);
    } else
      encodedBytes.push(c.charCodeAt(0));
  }
  let byteStr = new ArrayBuffer(encodedBytes.length), dataView = new DataView(byteStr);
  for (let i = 0, len = encodedBytes.length; i < len; i++)
    dataView.setUint8(i, encodedBytes[i]);
  return getDecoder(charset).decode(byteStr);
}
function decodeParameterValueContinuations(header) {
  let paramKeys = /* @__PURE__ */ new Map();
  Object.keys(header.params).forEach((key) => {
    let match = key.match(/\*((\d+)\*?)?$/);
    if (!match)
      return;
    let actualKey = key.substr(0, match.index).toLowerCase(), nr = Number(match[2]) || 0, paramVal;
    paramKeys.has(actualKey) ? paramVal = paramKeys.get(actualKey) : (paramVal = {
      charset: !1,
      values: []
    }, paramKeys.set(actualKey, paramVal));
    let value = header.params[key];
    nr === 0 && match[0].charAt(match[0].length - 1) === "*" && (match = value.match(/^([^']*)'[^']*'(.*)$/)) && (paramVal.charset = match[1] || "utf-8", value = match[2]), paramVal.values.push({ nr, value }), delete header.params[key];
  }), paramKeys.forEach((paramVal, key) => {
    header.params[key] = decodeURIComponentWithCharset(
      paramVal.values.sort((a, b) => a.nr - b.nr).map((a) => a.value).join(""),
      paramVal.charset
    );
  });
}
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/pass-through-decoder.js
var PassThroughDecoder = class {
  constructor() {
    this.chunks = [];
  }
  update(line) {
    this.chunks.push(line), this.chunks.push(`
`);
  }
  finalize() {
    return blobToArrayBuffer(new Blob(this.chunks, { type: "application/octet-stream" }));
  }
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/base64-decoder.js
var Base64Decoder = class {
  constructor(opts) {
    opts = opts || {}, this.decoder = opts.decoder || new TextDecoder(), this.maxChunkSize = 100 * 1024, this.chunks = [], this.remainder = "";
  }
  update(buffer) {
    let str = this.decoder.decode(buffer);
    if (/[^a-zA-Z0-9+\/]/.test(str) && (str = str.replace(/[^a-zA-Z0-9+\/]+/g, "")), this.remainder += str, this.remainder.length >= this.maxChunkSize) {
      let allowedBytes = Math.floor(this.remainder.length / 4) * 4, base64Str;
      allowedBytes === this.remainder.length ? (base64Str = this.remainder, this.remainder = "") : (base64Str = this.remainder.substr(0, allowedBytes), this.remainder = this.remainder.substr(allowedBytes)), base64Str.length && this.chunks.push(decodeBase64(base64Str));
    }
  }
  finalize() {
    return this.remainder && !/^=+$/.test(this.remainder) && this.chunks.push(decodeBase64(this.remainder)), blobToArrayBuffer(new Blob(this.chunks, { type: "application/octet-stream" }));
  }
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/qp-decoder.js
var QPDecoder = class {
  constructor(opts) {
    opts = opts || {}, this.decoder = opts.decoder || new TextDecoder(), this.maxChunkSize = 100 * 1024, this.remainder = "", this.chunks = [];
  }
  decodeQPBytes(encodedBytes) {
    let buf = new ArrayBuffer(encodedBytes.length), dataView = new DataView(buf);
    for (let i = 0, len = encodedBytes.length; i < len; i++)
      dataView.setUint8(i, parseInt(encodedBytes[i], 16));
    return buf;
  }
  decodeChunks(str) {
    str = str.replace(/=\r?\n/g, "");
    let list = str.split(/(?==)/), encodedBytes = [];
    for (let part of list) {
      if (part.charAt(0) !== "=") {
        encodedBytes.length && (this.chunks.push(this.decodeQPBytes(encodedBytes)), encodedBytes = []), this.chunks.push(part);
        continue;
      }
      if (part.length === 3) {
        encodedBytes.push(part.substr(1));
        continue;
      }
      part.length > 3 && (encodedBytes.push(part.substr(1, 2)), this.chunks.push(this.decodeQPBytes(encodedBytes)), encodedBytes = [], part = part.substr(3), this.chunks.push(part));
    }
    encodedBytes.length && (this.chunks.push(this.decodeQPBytes(encodedBytes)), encodedBytes = []);
  }
  update(buffer) {
    let str = this.decoder.decode(buffer) + `
`;
    if (str = this.remainder + str, str.length < this.maxChunkSize) {
      this.remainder = str;
      return;
    }
    this.remainder = "";
    let partialEnding = str.match(/=[a-fA-F0-9]?$/);
    if (partialEnding) {
      if (partialEnding.index === 0) {
        this.remainder = str;
        return;
      }
      this.remainder = str.substr(partialEnding.index), str = str.substr(0, partialEnding.index);
    }
    this.decodeChunks(str);
  }
  finalize() {
    return this.remainder.length && (this.decodeChunks(this.remainder), this.remainder = ""), blobToArrayBuffer(new Blob(this.chunks, { type: "application/octet-stream" }));
  }
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/mime-node.js
var MimeNode = class {
  constructor(opts) {
    opts = opts || {}, this.postalMime = opts.postalMime, this.root = !!opts.parentNode, this.childNodes = [], opts.parentNode && opts.parentNode.childNodes.push(this), this.state = "header", this.headerLines = [], this.contentType = {
      value: "text/plain",
      default: !0
    }, this.contentTransferEncoding = {
      value: "8bit"
    }, this.contentDisposition = {
      value: ""
    }, this.headers = [], this.contentDecoder = !1;
  }
  setupContentDecoder(transferEncoding) {
    /base64/i.test(transferEncoding) ? this.contentDecoder = new Base64Decoder() : /quoted-printable/i.test(transferEncoding) ? this.contentDecoder = new QPDecoder({ decoder: getDecoder(this.contentType.parsed.params.charset) }) : this.contentDecoder = new PassThroughDecoder();
  }
  async finalize() {
    if (this.state === "finished")
      return;
    this.state === "header" && this.processHeaders();
    let boundaries = this.postalMime.boundaries;
    for (let i = boundaries.length - 1; i >= 0; i--)
      if (boundaries[i].node === this) {
        boundaries.splice(i, 1);
        break;
      }
    await this.finalizeChildNodes(), this.content = this.contentDecoder ? await this.contentDecoder.finalize() : null, this.state = "finished";
  }
  async finalizeChildNodes() {
    for (let childNode of this.childNodes)
      await childNode.finalize();
  }
  parseStructuredHeader(str) {
    let response = {
      value: !1,
      params: {}
    }, key = !1, value = "", stage = "value", quote = !1, escaped = !1, chr;
    for (let i = 0, len = str.length; i < len; i++)
      switch (chr = str.charAt(i), stage) {
        case "key":
          if (chr === "=") {
            key = value.trim().toLowerCase(), stage = "value", value = "";
            break;
          }
          value += chr;
          break;
        case "value":
          if (escaped)
            value += chr;
          else if (chr === "\\") {
            escaped = !0;
            continue;
          } else quote && chr === quote ? quote = !1 : !quote && chr === '"' ? quote = chr : !quote && chr === ";" ? (key === !1 ? response.value = value.trim() : response.params[key] = value.trim(), stage = "key", value = "") : value += chr;
          escaped = !1;
          break;
      }
    return value = value.trim(), stage === "value" ? key === !1 ? response.value = value : response.params[key] = value : value && (response.params[value.toLowerCase()] = ""), response.value && (response.value = response.value.toLowerCase()), decodeParameterValueContinuations(response), response;
  }
  decodeFlowedText(str, delSp) {
    return str.split(/\r?\n/).reduce((previousValue, currentValue) => / $/.test(previousValue) && !/(^|\n)-- $/.test(previousValue) ? delSp ? previousValue.slice(0, -1) + currentValue : previousValue + currentValue : previousValue + `
` + currentValue).replace(/^ /gm, "");
  }
  getTextContent() {
    if (!this.content)
      return "";
    let str = getDecoder(this.contentType.parsed.params.charset).decode(this.content);
    return /^flowed$/i.test(this.contentType.parsed.params.format) && (str = this.decodeFlowedText(str, /^yes$/i.test(this.contentType.parsed.params.delsp))), str;
  }
  processHeaders() {
    for (let i = this.headerLines.length - 1; i >= 0; i--) {
      let line = this.headerLines[i];
      if (i && /^\s/.test(line))
        this.headerLines[i - 1] += `
` + line, this.headerLines.splice(i, 1);
      else {
        line = line.replace(/\s+/g, " ");
        let sep = line.indexOf(":"), key = sep < 0 ? line.trim() : line.substr(0, sep).trim(), value = sep < 0 ? "" : line.substr(sep + 1).trim();
        switch (this.headers.push({ key: key.toLowerCase(), originalKey: key, value }), key.toLowerCase()) {
          case "content-type":
            this.contentType.default && (this.contentType = { value, parsed: {} });
            break;
          case "content-transfer-encoding":
            this.contentTransferEncoding = { value, parsed: {} };
            break;
          case "content-disposition":
            this.contentDisposition = { value, parsed: {} };
            break;
          case "content-id":
            this.contentId = value;
            break;
          case "content-description":
            this.contentDescription = value;
            break;
        }
      }
    }
    this.contentType.parsed = this.parseStructuredHeader(this.contentType.value), this.contentType.multipart = /^multipart\//i.test(this.contentType.parsed.value) ? this.contentType.parsed.value.substr(this.contentType.parsed.value.indexOf("/") + 1) : !1, this.contentType.multipart && this.contentType.parsed.params.boundary && this.postalMime.boundaries.push({
      value: textEncoder.encode(this.contentType.parsed.params.boundary),
      node: this
    }), this.contentDisposition.parsed = this.parseStructuredHeader(this.contentDisposition.value), this.contentTransferEncoding.encoding = this.contentTransferEncoding.value.toLowerCase().split(/[^\w-]/).shift(), this.setupContentDecoder(this.contentTransferEncoding.encoding);
  }
  feed(line) {
    switch (this.state) {
      case "header":
        if (!line.length)
          return this.state = "body", this.processHeaders();
        this.headerLines.push(getDecoder().decode(line));
        break;
      case "body":
        this.contentDecoder.update(line);
    }
  }
};
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/html-entities.js
var htmlEntities = {
  "Æ": "\xC6",
  "Æ": "\xC6",
  "&": "&",
  "&": "&",
  "Á": "\xC1",
  "Á": "\xC1",
  "Ă": "\u0102",
  "Â": "\xC2",
  "Â": "\xC2",
  "А": "\u0410",
  "𝔄": "\u{1D504}",
  "À": "\xC0",
  "À": "\xC0",
  "Α": "\u0391",
  "Ā": "\u0100",
  "⩓": "\u2A53",
  "Ą": "\u0104",
  "𝔸": "\u{1D538}",
  "⁡": "\u2061",
  "Å": "\xC5",
  "Å": "\xC5",
  "𝒜": "\u{1D49C}",
  "≔": "\u2254",
  "Ã": "\xC3",
  "Ã": "\xC3",
  "Ä": "\xC4",
  "Ä": "\xC4",
  "∖": "\u2216",
  "⫧": "\u2AE7",
  "⌆": "\u2306",
  "Б": "\u0411",
  "∵": "\u2235",
  "ℬ": "\u212C",
  "Β": "\u0392",
  "𝔅": "\u{1D505}",
  "𝔹": "\u{1D539}",
  "˘": "\u02D8",
  "ℬ": "\u212C",
  "≎": "\u224E",
  "Ч": "\u0427",
  "©": "\xA9",
  "©": "\xA9",
  "Ć": "\u0106",
  "⋒": "\u22D2",
  "ⅅ": "\u2145",
  "ℭ": "\u212D",
  "Č": "\u010C",
  "Ç": "\xC7",
  "Ç": "\xC7",
  "Ĉ": "\u0108",
  "∰": "\u2230",
  "Ċ": "\u010A",
  "¸": "\xB8",
  "·": "\xB7",
  "ℭ": "\u212D",
  "Χ": "\u03A7",
  "⊙": "\u2299",
  "⊖": "\u2296",
  "⊕": "\u2295",
  "⊗": "\u2297",
  "∲": "\u2232",
  "”": "\u201D",
  "’": "\u2019",
  "∷": "\u2237",
  "⩴": "\u2A74",
  "≡": "\u2261",
  "∯": "\u222F",
  "∮": "\u222E",
  "ℂ": "\u2102",
  "∐": "\u2210",
  "∳": "\u2233",
  "⨯": "\u2A2F",
  "𝒞": "\u{1D49E}",
  "⋓": "\u22D3",
  "≍": "\u224D",
  "ⅅ": "\u2145",
  "⤑": "\u2911",
  "Ђ": "\u0402",
  "Ѕ": "\u0405",
  "Џ": "\u040F",
  "‡": "\u2021",
  "↡": "\u21A1",
  "⫤": "\u2AE4",
  "Ď": "\u010E",
  "Д": "\u0414",
  "∇": "\u2207",
  "Δ": "\u0394",
  "𝔇": "\u{1D507}",
  "´": "\xB4",
  "˙": "\u02D9",
  "˝": "\u02DD",
  "`": "`",
  "˜": "\u02DC",
  "⋄": "\u22C4",
  "ⅆ": "\u2146",
  "𝔻": "\u{1D53B}",
  "¨": "\xA8",
  "⃜": "\u20DC",
  "≐": "\u2250",
  "∯": "\u222F",
  "¨": "\xA8",
  "⇓": "\u21D3",
  "⇐": "\u21D0",
  "⇔": "\u21D4",
  "⫤": "\u2AE4",
  "⟸": "\u27F8",
  "⟺": "\u27FA",
  "⟹": "\u27F9",
  "⇒": "\u21D2",
  "⊨": "\u22A8",
  "⇑": "\u21D1",
  "⇕": "\u21D5",
  "∥": "\u2225",
  "↓": "\u2193",
  "⤓": "\u2913",
  "⇵": "\u21F5",
  "̑": "\u0311",
  "⥐": "\u2950",
  "⥞": "\u295E",
  "↽": "\u21BD",
  "⥖": "\u2956",
  "⥟": "\u295F",
  "⇁": "\u21C1",
  "⥗": "\u2957",
  "⊤": "\u22A4",
  "↧": "\u21A7",
  "⇓": "\u21D3",
  "𝒟": "\u{1D49F}",
  "Đ": "\u0110",
  "Ŋ": "\u014A",
  "Ð": "\xD0",
  "Ð": "\xD0",
  "É": "\xC9",
  "É": "\xC9",
  "Ě": "\u011A",
  "Ê": "\xCA",
  "Ê": "\xCA",
  "Э": "\u042D",
  "Ė": "\u0116",
  "𝔈": "\u{1D508}",
  "È": "\xC8",
  "È": "\xC8",
  "∈": "\u2208",
  "Ē": "\u0112",
  "◻": "\u25FB",
  "▫": "\u25AB",
  "Ę": "\u0118",
  "𝔼": "\u{1D53C}",
  "Ε": "\u0395",
  "⩵": "\u2A75",
  "≂": "\u2242",
  "⇌": "\u21CC",
  "ℰ": "\u2130",
  "⩳": "\u2A73",
  "Η": "\u0397",
  "Ë": "\xCB",
  "Ë": "\xCB",
  "∃": "\u2203",
  "ⅇ": "\u2147",
  "Ф": "\u0424",
  "𝔉": "\u{1D509}",
  "◼": "\u25FC",
  "▪": "\u25AA",
  "𝔽": "\u{1D53D}",
  "∀": "\u2200",
  "ℱ": "\u2131",
  "ℱ": "\u2131",
  "Ѓ": "\u0403",
  ">": ">",
  ">": ">",
  "Γ": "\u0393",
  "Ϝ": "\u03DC",
  "Ğ": "\u011E",
  "Ģ": "\u0122",
  "Ĝ": "\u011C",
  "Г": "\u0413",
  "Ġ": "\u0120",
  "𝔊": "\u{1D50A}",
  "⋙": "\u22D9",
  "𝔾": "\u{1D53E}",
  "≥": "\u2265",
  "⋛": "\u22DB",
  "≧": "\u2267",
  "⪢": "\u2AA2",
  "≷": "\u2277",
  "⩾": "\u2A7E",
  "≳": "\u2273",
  "𝒢": "\u{1D4A2}",
  "≫": "\u226B",
  "Ъ": "\u042A",
  "ˇ": "\u02C7",
  "^": "^",
  "Ĥ": "\u0124",
  "ℌ": "\u210C",
  "ℋ": "\u210B",
  "ℍ": "\u210D",
  "─": "\u2500",
  "ℋ": "\u210B",
  "Ħ": "\u0126",
  "≎": "\u224E",
  "≏": "\u224F",
  "Е": "\u0415",
  "IJ": "\u0132",
  "Ё": "\u0401",
  "Í": "\xCD",
  "Í": "\xCD",
  "Î": "\xCE",
  "Î": "\xCE",
  "И": "\u0418",
  "İ": "\u0130",
  "ℑ": "\u2111",
  "Ì": "\xCC",
  "Ì": "\xCC",
  "ℑ": "\u2111",
  "Ī": "\u012A",
  "ⅈ": "\u2148",
  "⇒": "\u21D2",
  "∬": "\u222C",
  "∫": "\u222B",
  "⋂": "\u22C2",
  "⁣": "\u2063",
  "⁢": "\u2062",
  "Į": "\u012E",
  "𝕀": "\u{1D540}",
  "Ι": "\u0399",
  "ℐ": "\u2110",
  "Ĩ": "\u0128",
  "І": "\u0406",
  "Ï": "\xCF",
  "Ï": "\xCF",
  "Ĵ": "\u0134",
  "Й": "\u0419",
  "𝔍": "\u{1D50D}",
  "𝕁": "\u{1D541}",
  "𝒥": "\u{1D4A5}",
  "Ј": "\u0408",
  "Є": "\u0404",
  "Х": "\u0425",
  "Ќ": "\u040C",
  "Κ": "\u039A",
  "Ķ": "\u0136",
  "К": "\u041A",
  "𝔎": "\u{1D50E}",
  "𝕂": "\u{1D542}",
  "𝒦": "\u{1D4A6}",
  "Љ": "\u0409",
  "<": "<",
  "<": "<",
  "Ĺ": "\u0139",
  "Λ": "\u039B",
  "⟪": "\u27EA",
  "ℒ": "\u2112",
  "↞": "\u219E",
  "Ľ": "\u013D",
  "Ļ": "\u013B",
  "Л": "\u041B",
  "⟨": "\u27E8",
  "←": "\u2190",
  "⇤": "\u21E4",
  "⇆": "\u21C6",
  "⌈": "\u2308",
  "⟦": "\u27E6",
  "⥡": "\u2961",
  "⇃": "\u21C3",
  "⥙": "\u2959",
  "⌊": "\u230A",
  "↔": "\u2194",
  "⥎": "\u294E",
  "⊣": "\u22A3",
  "↤": "\u21A4",
  "⥚": "\u295A",
  "⊲": "\u22B2",
  "⧏": "\u29CF",
  "⊴": "\u22B4",
  "⥑": "\u2951",
  "⥠": "\u2960",
  "↿": "\u21BF",
  "⥘": "\u2958",
  "↼": "\u21BC",
  "⥒": "\u2952",
  "⇐": "\u21D0",
  "⇔": "\u21D4",
  "⋚": "\u22DA",
  "≦": "\u2266",
  "≶": "\u2276",
  "⪡": "\u2AA1",
  "⩽": "\u2A7D",
  "≲": "\u2272",
  "𝔏": "\u{1D50F}",
  "⋘": "\u22D8",
  "⇚": "\u21DA",
  "Ŀ": "\u013F",
  "⟵": "\u27F5",
  "⟷": "\u27F7",
  "⟶": "\u27F6",
  "⟸": "\u27F8",
  "⟺": "\u27FA",
  "⟹": "\u27F9",
  "𝕃": "\u{1D543}",
  "↙": "\u2199",
  "↘": "\u2198",
  "ℒ": "\u2112",
  "↰": "\u21B0",
  "Ł": "\u0141",
  "≪": "\u226A",
  "⤅": "\u2905",
  "М": "\u041C",
  " ": "\u205F",
  "ℳ": "\u2133",
  "𝔐": "\u{1D510}",
  "∓": "\u2213",
  "𝕄": "\u{1D544}",
  "ℳ": "\u2133",
  "Μ": "\u039C",
  "Њ": "\u040A",
  "Ń": "\u0143",
  "Ň": "\u0147",
  "Ņ": "\u0145",
  "Н": "\u041D",
  "​": "\u200B",
  "​": "\u200B",
  "​": "\u200B",
  "​": "\u200B",
  "≫": "\u226B",
  "≪": "\u226A",
  "
": `
`,
  "𝔑": "\u{1D511}",
  "⁠": "\u2060",
  " ": "\xA0",
  "ℕ": "\u2115",
  "⫬": "\u2AEC",
  "≢": "\u2262",
  "≭": "\u226D",
  "∦": "\u2226",
  "∉": "\u2209",
  "≠": "\u2260",
  "≂̸": "\u2242\u0338",
  "∄": "\u2204",
  "≯": "\u226F",
  "≱": "\u2271",
  "≧̸": "\u2267\u0338",
  "≫̸": "\u226B\u0338",
  "≹": "\u2279",
  "⩾̸": "\u2A7E\u0338",
  "≵": "\u2275",
  "≎̸": "\u224E\u0338",
  "≏̸": "\u224F\u0338",
  "⋪": "\u22EA",
  "⧏̸": "\u29CF\u0338",
  "⋬": "\u22EC",
  "≮": "\u226E",
  "≰": "\u2270",
  "≸": "\u2278",
  "≪̸": "\u226A\u0338",
  "⩽̸": "\u2A7D\u0338",
  "≴": "\u2274",
  "⪢̸": "\u2AA2\u0338",
  "⪡̸": "\u2AA1\u0338",
  "⊀": "\u2280",
  "⪯̸": "\u2AAF\u0338",
  "⋠": "\u22E0",
  "∌": "\u220C",
  "⋫": "\u22EB",
  "⧐̸": "\u29D0\u0338",
  "⋭": "\u22ED",
  "⊏̸": "\u228F\u0338",
  "⋢": "\u22E2",
  "⊐̸": "\u2290\u0338",
  "⋣": "\u22E3",
  "⊂⃒": "\u2282\u20D2",
  "⊈": "\u2288",
  "⊁": "\u2281",
  "⪰̸": "\u2AB0\u0338",
  "⋡": "\u22E1",
  "≿̸": "\u227F\u0338",
  "⊃⃒": "\u2283\u20D2",
  "⊉": "\u2289",
  "≁": "\u2241",
  "≄": "\u2244",
  "≇": "\u2247",
  "≉": "\u2249",
  "∤": "\u2224",
  "𝒩": "\u{1D4A9}",
  "Ñ": "\xD1",
  "Ñ": "\xD1",
  "Ν": "\u039D",
  "Œ": "\u0152",
  "Ó": "\xD3",
  "Ó": "\xD3",
  "Ô": "\xD4",
  "Ô": "\xD4",
  "О": "\u041E",
  "Ő": "\u0150",
  "𝔒": "\u{1D512}",
  "Ò": "\xD2",
  "Ò": "\xD2",
  "Ō": "\u014C",
  "Ω": "\u03A9",
  "Ο": "\u039F",
  "𝕆": "\u{1D546}",
  "“": "\u201C",
  "‘": "\u2018",
  "⩔": "\u2A54",
  "𝒪": "\u{1D4AA}",
  "Ø": "\xD8",
  "Ø": "\xD8",
  "Õ": "\xD5",
  "Õ": "\xD5",
  "⨷": "\u2A37",
  "Ö": "\xD6",
  "Ö": "\xD6",
  "‾": "\u203E",
  "⏞": "\u23DE",
  "⎴": "\u23B4",
  "⏜": "\u23DC",
  "∂": "\u2202",
  "П": "\u041F",
  "𝔓": "\u{1D513}",
  "Φ": "\u03A6",
  "Π": "\u03A0",
  "±": "\xB1",
  "ℌ": "\u210C",
  "ℙ": "\u2119",
  "⪻": "\u2ABB",
  "≺": "\u227A",
  "⪯": "\u2AAF",
  "≼": "\u227C",
  "≾": "\u227E",
  "″": "\u2033",
  "∏": "\u220F",
  "∷": "\u2237",
  "∝": "\u221D",
  "𝒫": "\u{1D4AB}",
  "Ψ": "\u03A8",
  """: '"',
  """: '"',
  "𝔔": "\u{1D514}",
  "ℚ": "\u211A",
  "𝒬": "\u{1D4AC}",
  "⤐": "\u2910",
  "®": "\xAE",
  "®": "\xAE",
  "Ŕ": "\u0154",
  "⟫": "\u27EB",
  "↠": "\u21A0",
  "⤖": "\u2916",
  "Ř": "\u0158",
  "Ŗ": "\u0156",
  "Р": "\u0420",
  "ℜ": "\u211C",
  "∋": "\u220B",
  "⇋": "\u21CB",
  "⥯": "\u296F",
  "ℜ": "\u211C",
  "Ρ": "\u03A1",
  "⟩": "\u27E9",
  "→": "\u2192",
  "⇥": "\u21E5",
  "⇄": "\u21C4",
  "⌉": "\u2309",
  "⟧": "\u27E7",
  "⥝": "\u295D",
  "⇂": "\u21C2",
  "⥕": "\u2955",
  "⌋": "\u230B",
  "⊢": "\u22A2",
  "↦": "\u21A6",
  "⥛": "\u295B",
  "⊳": "\u22B3",
  "⧐": "\u29D0",
  "⊵": "\u22B5",
  "⥏": "\u294F",
  "⥜": "\u295C",
  "↾": "\u21BE",
  "⥔": "\u2954",
  "⇀": "\u21C0",
  "⥓": "\u2953",
  "⇒": "\u21D2",
  "ℝ": "\u211D",
  "⥰": "\u2970",
  "⇛": "\u21DB",
  "ℛ": "\u211B",
  "↱": "\u21B1",
  "⧴": "\u29F4",
  "Щ": "\u0429",
  "Ш": "\u0428",
  "Ь": "\u042C",
  "Ś": "\u015A",
  "⪼": "\u2ABC",
  "Š": "\u0160",
  "Ş": "\u015E",
  "Ŝ": "\u015C",
  "С": "\u0421",
  "𝔖": "\u{1D516}",
  "↓": "\u2193",
  "←": "\u2190",
  "→": "\u2192",
  "↑": "\u2191",
  "Σ": "\u03A3",
  "∘": "\u2218",
  "𝕊": "\u{1D54A}",
  "√": "\u221A",
  "□": "\u25A1",
  "⊓": "\u2293",
  "⊏": "\u228F",
  "⊑": "\u2291",
  "⊐": "\u2290",
  "⊒": "\u2292",
  "⊔": "\u2294",
  "𝒮": "\u{1D4AE}",
  "⋆": "\u22C6",
  "⋐": "\u22D0",
  "⋐": "\u22D0",
  "⊆": "\u2286",
  "≻": "\u227B",
  "⪰": "\u2AB0",
  "≽": "\u227D",
  "≿": "\u227F",
  "∋": "\u220B",
  "∑": "\u2211",
  "⋑": "\u22D1",
  "⊃": "\u2283",
  "⊇": "\u2287",
  "⋑": "\u22D1",
  "Þ": "\xDE",
  "Þ": "\xDE",
  "™": "\u2122",
  "Ћ": "\u040B",
  "Ц": "\u0426",
  "	": "	",
  "Τ": "\u03A4",
  "Ť": "\u0164",
  "Ţ": "\u0162",
  "Т": "\u0422",
  "𝔗": "\u{1D517}",
  "∴": "\u2234",
  "Θ": "\u0398",
  "  ": "\u205F\u200A",
  " ": "\u2009",
  "∼": "\u223C",
  "≃": "\u2243",
  "≅": "\u2245",
  "≈": "\u2248",
  "𝕋": "\u{1D54B}",
  "⃛": "\u20DB",
  "𝒯": "\u{1D4AF}",
  "Ŧ": "\u0166",
  "Ú": "\xDA",
  "Ú": "\xDA",
  "↟": "\u219F",
  "⥉": "\u2949",
  "Ў": "\u040E",
  "Ŭ": "\u016C",
  "Û": "\xDB",
  "Û": "\xDB",
  "У": "\u0423",
  "Ű": "\u0170",
  "𝔘": "\u{1D518}",
  "Ù": "\xD9",
  "Ù": "\xD9",
  "Ū": "\u016A",
  "_": "_",
  "⏟": "\u23DF",
  "⎵": "\u23B5",
  "⏝": "\u23DD",
  "⋃": "\u22C3",
  "⊎": "\u228E",
  "Ų": "\u0172",
  "𝕌": "\u{1D54C}",
  "↑": "\u2191",
  "⤒": "\u2912",
  "⇅": "\u21C5",
  "↕": "\u2195",
  "⥮": "\u296E",
  "⊥": "\u22A5",
  "↥": "\u21A5",
  "⇑": "\u21D1",
  "⇕": "\u21D5",
  "↖": "\u2196",
  "↗": "\u2197",
  "ϒ": "\u03D2",
  "Υ": "\u03A5",
  "Ů": "\u016E",
  "𝒰": "\u{1D4B0}",
  "Ũ": "\u0168",
  "Ü": "\xDC",
  "Ü": "\xDC",
  "⊫": "\u22AB",
  "⫫": "\u2AEB",
  "В": "\u0412",
  "⊩": "\u22A9",
  "⫦": "\u2AE6",
  "⋁": "\u22C1",
  "‖": "\u2016",
  "‖": "\u2016",
  "∣": "\u2223",
  "|": "|",
  "❘": "\u2758",
  "≀": "\u2240",
  " ": "\u200A",
  "𝔙": "\u{1D519}",
  "𝕍": "\u{1D54D}",
  "𝒱": "\u{1D4B1}",
  "⊪": "\u22AA",
  "Ŵ": "\u0174",
  "⋀": "\u22C0",
  "𝔚": "\u{1D51A}",
  "𝕎": "\u{1D54E}",
  "𝒲": "\u{1D4B2}",
  "𝔛": "\u{1D51B}",
  "Ξ": "\u039E",
  "𝕏": "\u{1D54F}",
  "𝒳": "\u{1D4B3}",
  "Я": "\u042F",
  "Ї": "\u0407",
  "Ю": "\u042E",
  "Ý": "\xDD",
  "Ý": "\xDD",
  "Ŷ": "\u0176",
  "Ы": "\u042B",
  "𝔜": "\u{1D51C}",
  "𝕐": "\u{1D550}",
  "𝒴": "\u{1D4B4}",
  "Ÿ": "\u0178",
  "Ж": "\u0416",
  "Ź": "\u0179",
  "Ž": "\u017D",
  "З": "\u0417",
  "Ż": "\u017B",
  "​": "\u200B",
  "Ζ": "\u0396",
  "ℨ": "\u2128",
  "ℤ": "\u2124",
  "𝒵": "\u{1D4B5}",
  "á": "\xE1",
  "á": "\xE1",
  "ă": "\u0103",
  "∾": "\u223E",
  "∾̳": "\u223E\u0333",
  "∿": "\u223F",
  "â": "\xE2",
  "â": "\xE2",
  "´": "\xB4",
  "´": "\xB4",
  "а": "\u0430",
  "æ": "\xE6",
  "æ": "\xE6",
  "⁡": "\u2061",
  "𝔞": "\u{1D51E}",
  "à": "\xE0",
  "à": "\xE0",
  "ℵ": "\u2135",
  "ℵ": "\u2135",
  "α": "\u03B1",
  "ā": "\u0101",
  "⨿": "\u2A3F",
  "&": "&",
  "&": "&",
  "∧": "\u2227",
  "⩕": "\u2A55",
  "⩜": "\u2A5C",
  "⩘": "\u2A58",
  "⩚": "\u2A5A",
  "∠": "\u2220",
  "⦤": "\u29A4",
  "∠": "\u2220",
  "∡": "\u2221",
  "⦨": "\u29A8",
  "⦩": "\u29A9",
  "⦪": "\u29AA",
  "⦫": "\u29AB",
  "⦬": "\u29AC",
  "⦭": "\u29AD",
  "⦮": "\u29AE",
  "⦯": "\u29AF",
  "∟": "\u221F",
  "⊾": "\u22BE",
  "⦝": "\u299D",
  "∢": "\u2222",
  "Å": "\xC5",
  "⍼": "\u237C",
  "ą": "\u0105",
  "𝕒": "\u{1D552}",
  "≈": "\u2248",
  "⩰": "\u2A70",
  "⩯": "\u2A6F",
  "≊": "\u224A",
  "≋": "\u224B",
  "'": "'",
  "≈": "\u2248",
  "≊": "\u224A",
  "å": "\xE5",
  "å": "\xE5",
  "𝒶": "\u{1D4B6}",
  "*": "*",
  "≈": "\u2248",
  "≍": "\u224D",
  "ã": "\xE3",
  "ã": "\xE3",
  "ä": "\xE4",
  "ä": "\xE4",
  "∳": "\u2233",
  "⨑": "\u2A11",
  "⫭": "\u2AED",
  "≌": "\u224C",
  "϶": "\u03F6",
  "‵": "\u2035",
  "∽": "\u223D",
  "⋍": "\u22CD",
  "⊽": "\u22BD",
  "⌅": "\u2305",
  "⌅": "\u2305",
  "⎵": "\u23B5",
  "⎶": "\u23B6",
  "≌": "\u224C",
  "б": "\u0431",
  "„": "\u201E",
  "∵": "\u2235",
  "∵": "\u2235",
  "⦰": "\u29B0",
  "϶": "\u03F6",
  "ℬ": "\u212C",
  "β": "\u03B2",
  "ℶ": "\u2136",
  "≬": "\u226C",
  "𝔟": "\u{1D51F}",
  "⋂": "\u22C2",
  "◯": "\u25EF",
  "⋃": "\u22C3",
  "⨀": "\u2A00",
  "⨁": "\u2A01",
  "⨂": "\u2A02",
  "⨆": "\u2A06",
  "★": "\u2605",
  "▽": "\u25BD",
  "△": "\u25B3",
  "⨄": "\u2A04",
  "⋁": "\u22C1",
  "⋀": "\u22C0",
  "⤍": "\u290D",
  "⧫": "\u29EB",
  "▪": "\u25AA",
  "▴": "\u25B4",
  "▾": "\u25BE",
  "◂": "\u25C2",
  "▸": "\u25B8",
  "␣": "\u2423",
  "▒": "\u2592",
  "░": "\u2591",
  "▓": "\u2593",
  "█": "\u2588",
  "=⃥": "=\u20E5",
  "≡⃥": "\u2261\u20E5",
  "⌐": "\u2310",
  "𝕓": "\u{1D553}",
  "⊥": "\u22A5",
  "⊥": "\u22A5",
  "⋈": "\u22C8",
  "╗": "\u2557",
  "╔": "\u2554",
  "╖": "\u2556",
  "╓": "\u2553",
  "═": "\u2550",
  "╦": "\u2566",
  "╩": "\u2569",
  "╤": "\u2564",
  "╧": "\u2567",
  "╝": "\u255D",
  "╚": "\u255A",
  "╜": "\u255C",
  "╙": "\u2559",
  "║": "\u2551",
  "╬": "\u256C",
  "╣": "\u2563",
  "╠": "\u2560",
  "╫": "\u256B",
  "╢": "\u2562",
  "╟": "\u255F",
  "⧉": "\u29C9",
  "╕": "\u2555",
  "╒": "\u2552",
  "┐": "\u2510",
  "┌": "\u250C",
  "─": "\u2500",
  "╥": "\u2565",
  "╨": "\u2568",
  "┬": "\u252C",
  "┴": "\u2534",
  "⊟": "\u229F",
  "⊞": "\u229E",
  "⊠": "\u22A0",
  "╛": "\u255B",
  "╘": "\u2558",
  "┘": "\u2518",
  "└": "\u2514",
  "│": "\u2502",
  "╪": "\u256A",
  "╡": "\u2561",
  "╞": "\u255E",
  "┼": "\u253C",
  "┤": "\u2524",
  "├": "\u251C",
  "‵": "\u2035",
  "˘": "\u02D8",
  "¦": "\xA6",
  "¦": "\xA6",
  "𝒷": "\u{1D4B7}",
  "⁏": "\u204F",
  "∽": "\u223D",
  "⋍": "\u22CD",
  "\": "\\",
  "⧅": "\u29C5",
  "⟈": "\u27C8",
  "•": "\u2022",
  "•": "\u2022",
  "≎": "\u224E",
  "⪮": "\u2AAE",
  "≏": "\u224F",
  "≏": "\u224F",
  "ć": "\u0107",
  "∩": "\u2229",
  "⩄": "\u2A44",
  "⩉": "\u2A49",
  "⩋": "\u2A4B",
  "⩇": "\u2A47",
  "⩀": "\u2A40",
  "∩︀": "\u2229\uFE00",
  "⁁": "\u2041",
  "ˇ": "\u02C7",
  "⩍": "\u2A4D",
  "č": "\u010D",
  "ç": "\xE7",
  "ç": "\xE7",
  "ĉ": "\u0109",
  "⩌": "\u2A4C",
  "⩐": "\u2A50",
  "ċ": "\u010B",
  "¸": "\xB8",
  "¸": "\xB8",
  "⦲": "\u29B2",
  "¢": "\xA2",
  "¢": "\xA2",
  "·": "\xB7",
  "𝔠": "\u{1D520}",
  "ч": "\u0447",
  "✓": "\u2713",
  "✓": "\u2713",
  "χ": "\u03C7",
  "○": "\u25CB",
  "⧃": "\u29C3",
  "ˆ": "\u02C6",
  "≗": "\u2257",
  "↺": "\u21BA",
  "↻": "\u21BB",
  "®": "\xAE",
  "Ⓢ": "\u24C8",
  "⊛": "\u229B",
  "⊚": "\u229A",
  "⊝": "\u229D",
  "≗": "\u2257",
  "⨐": "\u2A10",
  "⫯": "\u2AEF",
  "⧂": "\u29C2",
  "♣": "\u2663",
  "♣": "\u2663",
  ":": ":",
  "≔": "\u2254",
  "≔": "\u2254",
  ",": ",",
  "@": "@",
  "∁": "\u2201",
  "∘": "\u2218",
  "∁": "\u2201",
  "ℂ": "\u2102",
  "≅": "\u2245",
  "⩭": "\u2A6D",
  "∮": "\u222E",
  "𝕔": "\u{1D554}",
  "∐": "\u2210",
  "©": "\xA9",
  "©": "\xA9",
  "℗": "\u2117",
  "↵": "\u21B5",
  "✗": "\u2717",
  "𝒸": "\u{1D4B8}",
  "⫏": "\u2ACF",
  "⫑": "\u2AD1",
  "⫐": "\u2AD0",
  "⫒": "\u2AD2",
  "⋯": "\u22EF",
  "⤸": "\u2938",
  "⤵": "\u2935",
  "⋞": "\u22DE",
  "⋟": "\u22DF",
  "↶": "\u21B6",
  "⤽": "\u293D",
  "∪": "\u222A",
  "⩈": "\u2A48",
  "⩆": "\u2A46",
  "⩊": "\u2A4A",
  "⊍": "\u228D",
  "⩅": "\u2A45",
  "∪︀": "\u222A\uFE00",
  "↷": "\u21B7",
  "⤼": "\u293C",
  "⋞": "\u22DE",
  "⋟": "\u22DF",
  "⋎": "\u22CE",
  "⋏": "\u22CF",
  "¤": "\xA4",
  "¤": "\xA4",
  "↶": "\u21B6",
  "↷": "\u21B7",
  "⋎": "\u22CE",
  "⋏": "\u22CF",
  "∲": "\u2232",
  "∱": "\u2231",
  "⌭": "\u232D",
  "⇓": "\u21D3",
  "⥥": "\u2965",
  "†": "\u2020",
  "ℸ": "\u2138",
  "↓": "\u2193",
  "‐": "\u2010",
  "⊣": "\u22A3",
  "⤏": "\u290F",
  "˝": "\u02DD",
  "ď": "\u010F",
  "д": "\u0434",
  "ⅆ": "\u2146",
  "‡": "\u2021",
  "⇊": "\u21CA",
  "⩷": "\u2A77",
  "°": "\xB0",
  "°": "\xB0",
  "δ": "\u03B4",
  "⦱": "\u29B1",
  "⥿": "\u297F",
  "𝔡": "\u{1D521}",
  "⇃": "\u21C3",
  "⇂": "\u21C2",
  "⋄": "\u22C4",
  "⋄": "\u22C4",
  "♦": "\u2666",
  "♦": "\u2666",
  "¨": "\xA8",
  "ϝ": "\u03DD",
  "⋲": "\u22F2",
  "÷": "\xF7",
  "÷": "\xF7",
  "÷": "\xF7",
  "⋇": "\u22C7",
  "⋇": "\u22C7",
  "ђ": "\u0452",
  "⌞": "\u231E",
  "⌍": "\u230D",
  "$": "$",
  "𝕕": "\u{1D555}",
  "˙": "\u02D9",
  "≐": "\u2250",
  "≑": "\u2251",
  "∸": "\u2238",
  "∔": "\u2214",
  "⊡": "\u22A1",
  "⌆": "\u2306",
  "↓": "\u2193",
  "⇊": "\u21CA",
  "⇃": "\u21C3",
  "⇂": "\u21C2",
  "⤐": "\u2910",
  "⌟": "\u231F",
  "⌌": "\u230C",
  "𝒹": "\u{1D4B9}",
  "ѕ": "\u0455",
  "⧶": "\u29F6",
  "đ": "\u0111",
  "⋱": "\u22F1",
  "▿": "\u25BF",
  "▾": "\u25BE",
  "⇵": "\u21F5",
  "⥯": "\u296F",
  "⦦": "\u29A6",
  "џ": "\u045F",
  "⟿": "\u27FF",
  "⩷": "\u2A77",
  "≑": "\u2251",
  "é": "\xE9",
  "é": "\xE9",
  "⩮": "\u2A6E",
  "ě": "\u011B",
  "≖": "\u2256",
  "ê": "\xEA",
  "ê": "\xEA",
  "≕": "\u2255",
  "э": "\u044D",
  "ė": "\u0117",
  "ⅇ": "\u2147",
  "≒": "\u2252",
  "𝔢": "\u{1D522}",
  "⪚": "\u2A9A",
  "è": "\xE8",
  "è": "\xE8",
  "⪖": "\u2A96",
  "⪘": "\u2A98",
  "⪙": "\u2A99",
  "⏧": "\u23E7",
  "ℓ": "\u2113",
  "⪕": "\u2A95",
  "⪗": "\u2A97",
  "ē": "\u0113",
  "∅": "\u2205",
  "∅": "\u2205",
  "∅": "\u2205",
  " ": "\u2004",
  " ": "\u2005",
  " ": "\u2003",
  "ŋ": "\u014B",
  " ": "\u2002",
  "ę": "\u0119",
  "𝕖": "\u{1D556}",
  "⋕": "\u22D5",
  "⧣": "\u29E3",
  "⩱": "\u2A71",
  "ε": "\u03B5",
  "ε": "\u03B5",
  "ϵ": "\u03F5",
  "≖": "\u2256",
  "≕": "\u2255",
  "≂": "\u2242",
  "⪖": "\u2A96",
  "⪕": "\u2A95",
  "=": "=",
  "≟": "\u225F",
  "≡": "\u2261",
  "⩸": "\u2A78",
  "⧥": "\u29E5",
  "≓": "\u2253",
  "⥱": "\u2971",
  "ℯ": "\u212F",
  "≐": "\u2250",
  "≂": "\u2242",
  "η": "\u03B7",
  "ð": "\xF0",
  "ð": "\xF0",
  "ë": "\xEB",
  "ë": "\xEB",
  "€": "\u20AC",
  "!": "!",
  "∃": "\u2203",
  "ℰ": "\u2130",
  "ⅇ": "\u2147",
  "≒": "\u2252",
  "ф": "\u0444",
  "♀": "\u2640",
  "ffi": "\uFB03",
  "ff": "\uFB00",
  "ffl": "\uFB04",
  "𝔣": "\u{1D523}",
  "fi": "\uFB01",
  "fj": "fj",
  "♭": "\u266D",
  "fl": "\uFB02",
  "▱": "\u25B1",
  "ƒ": "\u0192",
  "𝕗": "\u{1D557}",
  "∀": "\u2200",
  "⋔": "\u22D4",
  "⫙": "\u2AD9",
  "⨍": "\u2A0D",
  "½": "\xBD",
  "½": "\xBD",
  "⅓": "\u2153",
  "¼": "\xBC",
  "¼": "\xBC",
  "⅕": "\u2155",
  "⅙": "\u2159",
  "⅛": "\u215B",
  "⅔": "\u2154",
  "⅖": "\u2156",
  "¾": "\xBE",
  "¾": "\xBE",
  "⅗": "\u2157",
  "⅜": "\u215C",
  "⅘": "\u2158",
  "⅚": "\u215A",
  "⅝": "\u215D",
  "⅞": "\u215E",
  "⁄": "\u2044",
  "⌢": "\u2322",
  "𝒻": "\u{1D4BB}",
  "≧": "\u2267",
  "⪌": "\u2A8C",
  "ǵ": "\u01F5",
  "γ": "\u03B3",
  "ϝ": "\u03DD",
  "⪆": "\u2A86",
  "ğ": "\u011F",
  "ĝ": "\u011D",
  "г": "\u0433",
  "ġ": "\u0121",
  "≥": "\u2265",
  "⋛": "\u22DB",
  "≥": "\u2265",
  "≧": "\u2267",
  "⩾": "\u2A7E",
  "⩾": "\u2A7E",
  "⪩": "\u2AA9",
  "⪀": "\u2A80",
  "⪂": "\u2A82",
  "⪄": "\u2A84",
  "⋛︀": "\u22DB\uFE00",
  "⪔": "\u2A94",
  "𝔤": "\u{1D524}",
  "≫": "\u226B",
  "⋙": "\u22D9",
  "ℷ": "\u2137",
  "ѓ": "\u0453",
  "≷": "\u2277",
  "⪒": "\u2A92",
  "⪥": "\u2AA5",
  "⪤": "\u2AA4",
  "≩": "\u2269",
  "⪊": "\u2A8A",
  "⪊": "\u2A8A",
  "⪈": "\u2A88",
  "⪈": "\u2A88",
  "≩": "\u2269",
  "⋧": "\u22E7",
  "𝕘": "\u{1D558}",
  "`": "`",
  "ℊ": "\u210A",
  "≳": "\u2273",
  "⪎": "\u2A8E",
  "⪐": "\u2A90",
  ">": ">",
  ">": ">",
  "⪧": "\u2AA7",
  "⩺": "\u2A7A",
  "⋗": "\u22D7",
  "⦕": "\u2995",
  "⩼": "\u2A7C",
  "⪆": "\u2A86",
  "⥸": "\u2978",
  "⋗": "\u22D7",
  "⋛": "\u22DB",
  "⪌": "\u2A8C",
  "≷": "\u2277",
  "≳": "\u2273",
  "≩︀": "\u2269\uFE00",
  "≩︀": "\u2269\uFE00",
  "⇔": "\u21D4",
  " ": "\u200A",
  "½": "\xBD",
  "ℋ": "\u210B",
  "ъ": "\u044A",
  "↔": "\u2194",
  "⥈": "\u2948",
  "↭": "\u21AD",
  "ℏ": "\u210F",
  "ĥ": "\u0125",
  "♥": "\u2665",
  "♥": "\u2665",
  "…": "\u2026",
  "⊹": "\u22B9",
  "𝔥": "\u{1D525}",
  "⤥": "\u2925",
  "⤦": "\u2926",
  "⇿": "\u21FF",
  "∻": "\u223B",
  "↩": "\u21A9",
  "↪": "\u21AA",
  "𝕙": "\u{1D559}",
  "―": "\u2015",
  "𝒽": "\u{1D4BD}",
  "ℏ": "\u210F",
  "ħ": "\u0127",
  "⁃": "\u2043",
  "‐": "\u2010",
  "í": "\xED",
  "í": "\xED",
  "⁣": "\u2063",
  "î": "\xEE",
  "î": "\xEE",
  "и": "\u0438",
  "е": "\u0435",
  "¡": "\xA1",
  "¡": "\xA1",
  "⇔": "\u21D4",
  "𝔦": "\u{1D526}",
  "ì": "\xEC",
  "ì": "\xEC",
  "ⅈ": "\u2148",
  "⨌": "\u2A0C",
  "∭": "\u222D",
  "⧜": "\u29DC",
  "℩": "\u2129",
  "ij": "\u0133",
  "ī": "\u012B",
  "ℑ": "\u2111",
  "ℐ": "\u2110",
  "ℑ": "\u2111",
  "ı": "\u0131",
  "⊷": "\u22B7",
  "Ƶ": "\u01B5",
  "∈": "\u2208",
  "℅": "\u2105",
  "∞": "\u221E",
  "⧝": "\u29DD",
  "ı": "\u0131",
  "∫": "\u222B",
  "⊺": "\u22BA",
  "ℤ": "\u2124",
  "⊺": "\u22BA",
  "⨗": "\u2A17",
  "⨼": "\u2A3C",
  "ё": "\u0451",
  "į": "\u012F",
  "𝕚": "\u{1D55A}",
  "ι": "\u03B9",
  "⨼": "\u2A3C",
  "¿": "\xBF",
  "¿": "\xBF",
  "𝒾": "\u{1D4BE}",
  "∈": "\u2208",
  "⋹": "\u22F9",
  "⋵": "\u22F5",
  "⋴": "\u22F4",
  "⋳": "\u22F3",
  "∈": "\u2208",
  "⁢": "\u2062",
  "ĩ": "\u0129",
  "і": "\u0456",
  "ï": "\xEF",
  "ï": "\xEF",
  "ĵ": "\u0135",
  "й": "\u0439",
  "𝔧": "\u{1D527}",
  "ȷ": "\u0237",
  "𝕛": "\u{1D55B}",
  "𝒿": "\u{1D4BF}",
  "ј": "\u0458",
  "є": "\u0454",
  "κ": "\u03BA",
  "ϰ": "\u03F0",
  "ķ": "\u0137",
  "к": "\u043A",
  "𝔨": "\u{1D528}",
  "ĸ": "\u0138",
  "х": "\u0445",
  "ќ": "\u045C",
  "𝕜": "\u{1D55C}",
  "𝓀": "\u{1D4C0}",
  "⇚": "\u21DA",
  "⇐": "\u21D0",
  "⤛": "\u291B",
  "⤎": "\u290E",
  "≦": "\u2266",
  "⪋": "\u2A8B",
  "⥢": "\u2962",
  "ĺ": "\u013A",
  "⦴": "\u29B4",
  "ℒ": "\u2112",
  "λ": "\u03BB",
  "⟨": "\u27E8",
  "⦑": "\u2991",
  "⟨": "\u27E8",
  "⪅": "\u2A85",
  "«": "\xAB",
  "«": "\xAB",
  "←": "\u2190",
  "⇤": "\u21E4",
  "⤟": "\u291F",
  "⤝": "\u291D",
  "↩": "\u21A9",
  "↫": "\u21AB",
  "⤹": "\u2939",
  "⥳": "\u2973",
  "↢": "\u21A2",
  "⪫": "\u2AAB",
  "⤙": "\u2919",
  "⪭": "\u2AAD",
  "⪭︀": "\u2AAD\uFE00",
  "⤌": "\u290C",
  "❲": "\u2772",
  "{": "{",
  "[": "[",
  "⦋": "\u298B",
  "⦏": "\u298F",
  "⦍": "\u298D",
  "ľ": "\u013E",
  "ļ": "\u013C",
  "⌈": "\u2308",
  "{": "{",
  "л": "\u043B",
  "⤶": "\u2936",
  "“": "\u201C",
  "„": "\u201E",
  "⥧": "\u2967",
  "⥋": "\u294B",
  "↲": "\u21B2",
  "≤": "\u2264",
  "←": "\u2190",
  "↢": "\u21A2",
  "↽": "\u21BD",
  "↼": "\u21BC",
  "⇇": "\u21C7",
  "↔": "\u2194",
  "⇆": "\u21C6",
  "⇋": "\u21CB",
  "↭": "\u21AD",
  "⋋": "\u22CB",
  "⋚": "\u22DA",
  "≤": "\u2264",
  "≦": "\u2266",
  "⩽": "\u2A7D",
  "⩽": "\u2A7D",
  "⪨": "\u2AA8",
  "⩿": "\u2A7F",
  "⪁": "\u2A81",
  "⪃": "\u2A83",
  "⋚︀": "\u22DA\uFE00",
  "⪓": "\u2A93",
  "⪅": "\u2A85",
  "⋖": "\u22D6",
  "⋚": "\u22DA",
  "⪋": "\u2A8B",
  "≶": "\u2276",
  "≲": "\u2272",
  "⥼": "\u297C",
  "⌊": "\u230A",
  "𝔩": "\u{1D529}",
  "≶": "\u2276",
  "⪑": "\u2A91",
  "↽": "\u21BD",
  "↼": "\u21BC",
  "⥪": "\u296A",
  "▄": "\u2584",
  "љ": "\u0459",
  "≪": "\u226A",
  "⇇": "\u21C7",
  "⌞": "\u231E",
  "⥫": "\u296B",
  "◺": "\u25FA",
  "ŀ": "\u0140",
  "⎰": "\u23B0",
  "⎰": "\u23B0",
  "≨": "\u2268",
  "⪉": "\u2A89",
  "⪉": "\u2A89",
  "⪇": "\u2A87",
  "⪇": "\u2A87",
  "≨": "\u2268",
  "⋦": "\u22E6",
  "⟬": "\u27EC",
  "⇽": "\u21FD",
  "⟦": "\u27E6",
  "⟵": "\u27F5",
  "⟷": "\u27F7",
  "⟼": "\u27FC",
  "⟶": "\u27F6",
  "↫": "\u21AB",
  "↬": "\u21AC",
  "⦅": "\u2985",
  "𝕝": "\u{1D55D}",
  "⨭": "\u2A2D",
  "⨴": "\u2A34",
  "∗": "\u2217",
  "_": "_",
  "◊": "\u25CA",
  "◊": "\u25CA",
  "⧫": "\u29EB",
  "(": "(",
  "⦓": "\u2993",
  "⇆": "\u21C6",
  "⌟": "\u231F",
  "⇋": "\u21CB",
  "⥭": "\u296D",
  "‎": "\u200E",
  "⊿": "\u22BF",
  "‹": "\u2039",
  "𝓁": "\u{1D4C1}",
  "↰": "\u21B0",
  "≲": "\u2272",
  "⪍": "\u2A8D",
  "⪏": "\u2A8F",
  "[": "[",
  "‘": "\u2018",
  "‚": "\u201A",
  "ł": "\u0142",
  "<": "<",
  "<": "<",
  "⪦": "\u2AA6",
  "⩹": "\u2A79",
  "⋖": "\u22D6",
  "⋋": "\u22CB",
  "⋉": "\u22C9",
  "⥶": "\u2976",
  "⩻": "\u2A7B",
  "⦖": "\u2996",
  "◃": "\u25C3",
  "⊴": "\u22B4",
  "◂": "\u25C2",
  "⥊": "\u294A",
  "⥦": "\u2966",
  "≨︀": "\u2268\uFE00",
  "≨︀": "\u2268\uFE00",
  "∺": "\u223A",
  "¯": "\xAF",
  "¯": "\xAF",
  "♂": "\u2642",
  "✠": "\u2720",
  "✠": "\u2720",
  "↦": "\u21A6",
  "↦": "\u21A6",
  "↧": "\u21A7",
  "↤": "\u21A4",
  "↥": "\u21A5",
  "▮": "\u25AE",
  "⨩": "\u2A29",
  "м": "\u043C",
  "—": "\u2014",
  "∡": "\u2221",
  "𝔪": "\u{1D52A}",
  "℧": "\u2127",
  "µ": "\xB5",
  "µ": "\xB5",
  "∣": "\u2223",
  "*": "*",
  "⫰": "\u2AF0",
  "·": "\xB7",
  "·": "\xB7",
  "−": "\u2212",
  "⊟": "\u229F",
  "∸": "\u2238",
  "⨪": "\u2A2A",
  "⫛": "\u2ADB",
  "…": "\u2026",
  "∓": "\u2213",
  "⊧": "\u22A7",
  "𝕞": "\u{1D55E}",
  "∓": "\u2213",
  "𝓂": "\u{1D4C2}",
  "∾": "\u223E",
  "μ": "\u03BC",
  "⊸": "\u22B8",
  "⊸": "\u22B8",
  "⋙̸": "\u22D9\u0338",
  "≫⃒": "\u226B\u20D2",
  "≫̸": "\u226B\u0338",
  "⇍": "\u21CD",
  "⇎": "\u21CE",
  "⋘̸": "\u22D8\u0338",
  "≪⃒": "\u226A\u20D2",
  "≪̸": "\u226A\u0338",
  "⇏": "\u21CF",
  "⊯": "\u22AF",
  "⊮": "\u22AE",
  "∇": "\u2207",
  "ń": "\u0144",
  "∠⃒": "\u2220\u20D2",
  "≉": "\u2249",
  "⩰̸": "\u2A70\u0338",
  "≋̸": "\u224B\u0338",
  "ʼn": "\u0149",
  "≉": "\u2249",
  "♮": "\u266E",
  "♮": "\u266E",
  "ℕ": "\u2115",
  " ": "\xA0",
  " ": "\xA0",
  "≎̸": "\u224E\u0338",
  "≏̸": "\u224F\u0338",
  "⩃": "\u2A43",
  "ň": "\u0148",
  "ņ": "\u0146",
  "≇": "\u2247",
  "⩭̸": "\u2A6D\u0338",
  "⩂": "\u2A42",
  "н": "\u043D",
  "–": "\u2013",
  "≠": "\u2260",
  "⇗": "\u21D7",
  "⤤": "\u2924",
  "↗": "\u2197",
  "↗": "\u2197",
  "≐̸": "\u2250\u0338",
  "≢": "\u2262",
  "⤨": "\u2928",
  "≂̸": "\u2242\u0338",
  "∄": "\u2204",
  "∄": "\u2204",
  "𝔫": "\u{1D52B}",
  "≧̸": "\u2267\u0338",
  "≱": "\u2271",
  "≱": "\u2271",
  "≧̸": "\u2267\u0338",
  "⩾̸": "\u2A7E\u0338",
  "⩾̸": "\u2A7E\u0338",
  "≵": "\u2275",
  "≯": "\u226F",
  "≯": "\u226F",
  "⇎": "\u21CE",
  "↮": "\u21AE",
  "⫲": "\u2AF2",
  "∋": "\u220B",
  "⋼": "\u22FC",
  "⋺": "\u22FA",
  "∋": "\u220B",
  "њ": "\u045A",
  "⇍": "\u21CD",
  "≦̸": "\u2266\u0338",
  "↚": "\u219A",
  "‥": "\u2025",
  "≰": "\u2270",
  "↚": "\u219A",
  "↮": "\u21AE",
  "≰": "\u2270",
  "≦̸": "\u2266\u0338",
  "⩽̸": "\u2A7D\u0338",
  "⩽̸": "\u2A7D\u0338",
  "≮": "\u226E",
  "≴": "\u2274",
  "≮": "\u226E",
  "⋪": "\u22EA",
  "⋬": "\u22EC",
  "∤": "\u2224",
  "𝕟": "\u{1D55F}",
  "¬": "\xAC",
  "¬": "\xAC",
  "∉": "\u2209",
  "⋹̸": "\u22F9\u0338",
  "⋵̸": "\u22F5\u0338",
  "∉": "\u2209",
  "⋷": "\u22F7",
  "⋶": "\u22F6",
  "∌": "\u220C",
  "∌": "\u220C",
  "⋾": "\u22FE",
  "⋽": "\u22FD",
  "∦": "\u2226",
  "∦": "\u2226",
  "⫽⃥": "\u2AFD\u20E5",
  "∂̸": "\u2202\u0338",
  "⨔": "\u2A14",
  "⊀": "\u2280",
  "⋠": "\u22E0",
  "⪯̸": "\u2AAF\u0338",
  "⊀": "\u2280",
  "⪯̸": "\u2AAF\u0338",
  "⇏": "\u21CF",
  "↛": "\u219B",
  "⤳̸": "\u2933\u0338",
  "↝̸": "\u219D\u0338",
  "↛": "\u219B",
  "⋫": "\u22EB",
  "⋭": "\u22ED",
  "⊁": "\u2281",
  "⋡": "\u22E1",
  "⪰̸": "\u2AB0\u0338",
  "𝓃": "\u{1D4C3}",
  "∤": "\u2224",
  "∦": "\u2226",
  "≁": "\u2241",
  "≄": "\u2244",
  "≄": "\u2244",
  "∤": "\u2224",
  "∦": "\u2226",
  "⋢": "\u22E2",
  "⋣": "\u22E3",
  "⊄": "\u2284",
  "⫅̸": "\u2AC5\u0338",
  "⊈": "\u2288",
  "⊂⃒": "\u2282\u20D2",
  "⊈": "\u2288",
  "⫅̸": "\u2AC5\u0338",
  "⊁": "\u2281",
  "⪰̸": "\u2AB0\u0338",
  "⊅": "\u2285",
  "⫆̸": "\u2AC6\u0338",
  "⊉": "\u2289",
  "⊃⃒": "\u2283\u20D2",
  "⊉": "\u2289",
  "⫆̸": "\u2AC6\u0338",
  "≹": "\u2279",
  "ñ": "\xF1",
  "ñ": "\xF1",
  "≸": "\u2278",
  "⋪": "\u22EA",
  "⋬": "\u22EC",
  "⋫": "\u22EB",
  "⋭": "\u22ED",
  "ν": "\u03BD",
  "#": "#",
  "№": "\u2116",
  " ": "\u2007",
  "⊭": "\u22AD",
  "⤄": "\u2904",
  "≍⃒": "\u224D\u20D2",
  "⊬": "\u22AC",
  "≥⃒": "\u2265\u20D2",
  ">⃒": ">\u20D2",
  "⧞": "\u29DE",
  "⤂": "\u2902",
  "≤⃒": "\u2264\u20D2",
  "<⃒": "<\u20D2",
  "⊴⃒": "\u22B4\u20D2",
  "⤃": "\u2903",
  "⊵⃒": "\u22B5\u20D2",
  "∼⃒": "\u223C\u20D2",
  "⇖": "\u21D6",
  "⤣": "\u2923",
  "↖": "\u2196",
  "↖": "\u2196",
  "⤧": "\u2927",
  "Ⓢ": "\u24C8",
  "ó": "\xF3",
  "ó": "\xF3",
  "⊛": "\u229B",
  "⊚": "\u229A",
  "ô": "\xF4",
  "ô": "\xF4",
  "о": "\u043E",
  "⊝": "\u229D",
  "ő": "\u0151",
  "⨸": "\u2A38",
  "⊙": "\u2299",
  "⦼": "\u29BC",
  "œ": "\u0153",
  "⦿": "\u29BF",
  "𝔬": "\u{1D52C}",
  "˛": "\u02DB",
  "ò": "\xF2",
  "ò": "\xF2",
  "⧁": "\u29C1",
  "⦵": "\u29B5",
  "Ω": "\u03A9",
  "∮": "\u222E",
  "↺": "\u21BA",
  "⦾": "\u29BE",
  "⦻": "\u29BB",
  "‾": "\u203E",
  "⧀": "\u29C0",
  "ō": "\u014D",
  "ω": "\u03C9",
  "ο": "\u03BF",
  "⦶": "\u29B6",
  "⊖": "\u2296",
  "𝕠": "\u{1D560}",
  "⦷": "\u29B7",
  "⦹": "\u29B9",
  "⊕": "\u2295",
  "∨": "\u2228",
  "↻": "\u21BB",
  "⩝": "\u2A5D",
  "ℴ": "\u2134",
  "ℴ": "\u2134",
  "ª": "\xAA",
  "ª": "\xAA",
  "º": "\xBA",
  "º": "\xBA",
  "⊶": "\u22B6",
  "⩖": "\u2A56",
  "⩗": "\u2A57",
  "⩛": "\u2A5B",
  "ℴ": "\u2134",
  "ø": "\xF8",
  "ø": "\xF8",
  "⊘": "\u2298",
  "õ": "\xF5",
  "õ": "\xF5",
  "⊗": "\u2297",
  "⨶": "\u2A36",
  "ö": "\xF6",
  "ö": "\xF6",
  "⌽": "\u233D",
  "∥": "\u2225",
  "¶": "\xB6",
  "¶": "\xB6",
  "∥": "\u2225",
  "⫳": "\u2AF3",
  "⫽": "\u2AFD",
  "∂": "\u2202",
  "п": "\u043F",
  "%": "%",
  ".": ".",
  "‰": "\u2030",
  "⊥": "\u22A5",
  "‱": "\u2031",
  "𝔭": "\u{1D52D}",
  "φ": "\u03C6",
  "ϕ": "\u03D5",
  "ℳ": "\u2133",
  "☎": "\u260E",
  "π": "\u03C0",
  "⋔": "\u22D4",
  "ϖ": "\u03D6",
  "ℏ": "\u210F",
  "ℎ": "\u210E",
  "ℏ": "\u210F",
  "+": "+",
  "⨣": "\u2A23",
  "⊞": "\u229E",
  "⨢": "\u2A22",
  "∔": "\u2214",
  "⨥": "\u2A25",
  "⩲": "\u2A72",
  "±": "\xB1",
  "±": "\xB1",
  "⨦": "\u2A26",
  "⨧": "\u2A27",
  "±": "\xB1",
  "⨕": "\u2A15",
  "𝕡": "\u{1D561}",
  "£": "\xA3",
  "£": "\xA3",
  "≺": "\u227A",
  "⪳": "\u2AB3",
  "⪷": "\u2AB7",
  "≼": "\u227C",
  "⪯": "\u2AAF",
  "≺": "\u227A",
  "⪷": "\u2AB7",
  "≼": "\u227C",
  "⪯": "\u2AAF",
  "⪹": "\u2AB9",
  "⪵": "\u2AB5",
  "⋨": "\u22E8",
  "≾": "\u227E",
  "′": "\u2032",
  "ℙ": "\u2119",
  "⪵": "\u2AB5",
  "⪹": "\u2AB9",
  "⋨": "\u22E8",
  "∏": "\u220F",
  "⌮": "\u232E",
  "⌒": "\u2312",
  "⌓": "\u2313",
  "∝": "\u221D",
  "∝": "\u221D",
  "≾": "\u227E",
  "⊰": "\u22B0",
  "𝓅": "\u{1D4C5}",
  "ψ": "\u03C8",
  " ": "\u2008",
  "𝔮": "\u{1D52E}",
  "⨌": "\u2A0C",
  "𝕢": "\u{1D562}",
  "⁗": "\u2057",
  "𝓆": "\u{1D4C6}",
  "ℍ": "\u210D",
  "⨖": "\u2A16",
  "?": "?",
  "≟": "\u225F",
  """: '"',
  """: '"',
  "⇛": "\u21DB",
  "⇒": "\u21D2",
  "⤜": "\u291C",
  "⤏": "\u290F",
  "⥤": "\u2964",
  "∽̱": "\u223D\u0331",
  "ŕ": "\u0155",
  "√": "\u221A",
  "⦳": "\u29B3",
  "⟩": "\u27E9",
  "⦒": "\u2992",
  "⦥": "\u29A5",
  "⟩": "\u27E9",
  "»": "\xBB",
  "»": "\xBB",
  "→": "\u2192",
  "⥵": "\u2975",
  "⇥": "\u21E5",
  "⤠": "\u2920",
  "⤳": "\u2933",
  "⤞": "\u291E",
  "↪": "\u21AA",
  "↬": "\u21AC",
  "⥅": "\u2945",
  "⥴": "\u2974",
  "↣": "\u21A3",
  "↝": "\u219D",
  "⤚": "\u291A",
  "∶": "\u2236",
  "ℚ": "\u211A",
  "⤍": "\u290D",
  "❳": "\u2773",
  "}": "}",
  "]": "]",
  "⦌": "\u298C",
  "⦎": "\u298E",
  "⦐": "\u2990",
  "ř": "\u0159",
  "ŗ": "\u0157",
  "⌉": "\u2309",
  "}": "}",
  "р": "\u0440",
  "⤷": "\u2937",
  "⥩": "\u2969",
  "”": "\u201D",
  "”": "\u201D",
  "↳": "\u21B3",
  "ℜ": "\u211C",
  "ℛ": "\u211B",
  "ℜ": "\u211C",
  "ℝ": "\u211D",
  "▭": "\u25AD",
  "®": "\xAE",
  "®": "\xAE",
  "⥽": "\u297D",
  "⌋": "\u230B",
  "𝔯": "\u{1D52F}",
  "⇁": "\u21C1",
  "⇀": "\u21C0",
  "⥬": "\u296C",
  "ρ": "\u03C1",
  "ϱ": "\u03F1",
  "→": "\u2192",
  "↣": "\u21A3",
  "⇁": "\u21C1",
  "⇀": "\u21C0",
  "⇄": "\u21C4",
  "⇌": "\u21CC",
  "⇉": "\u21C9",
  "↝": "\u219D",
  "⋌": "\u22CC",
  "˚": "\u02DA",
  "≓": "\u2253",
  "⇄": "\u21C4",
  "⇌": "\u21CC",
  "‏": "\u200F",
  "⎱": "\u23B1",
  "⎱": "\u23B1",
  "⫮": "\u2AEE",
  "⟭": "\u27ED",
  "⇾": "\u21FE",
  "⟧": "\u27E7",
  "⦆": "\u2986",
  "𝕣": "\u{1D563}",
  "⨮": "\u2A2E",
  "⨵": "\u2A35",
  ")": ")",
  "⦔": "\u2994",
  "⨒": "\u2A12",
  "⇉": "\u21C9",
  "›": "\u203A",
  "𝓇": "\u{1D4C7}",
  "↱": "\u21B1",
  "]": "]",
  "’": "\u2019",
  "’": "\u2019",
  "⋌": "\u22CC",
  "⋊": "\u22CA",
  "▹": "\u25B9",
  "⊵": "\u22B5",
  "▸": "\u25B8",
  "⧎": "\u29CE",
  "⥨": "\u2968",
  "℞": "\u211E",
  "ś": "\u015B",
  "‚": "\u201A",
  "≻": "\u227B",
  "⪴": "\u2AB4",
  "⪸": "\u2AB8",
  "š": "\u0161",
  "≽": "\u227D",
  "⪰": "\u2AB0",
  "ş": "\u015F",
  "ŝ": "\u015D",
  "⪶": "\u2AB6",
  "⪺": "\u2ABA",
  "⋩": "\u22E9",
  "⨓": "\u2A13",
  "≿": "\u227F",
  "с": "\u0441",
  "⋅": "\u22C5",
  "⊡": "\u22A1",
  "⩦": "\u2A66",
  "⇘": "\u21D8",
  "⤥": "\u2925",
  "↘": "\u2198",
  "↘": "\u2198",
  "§": "\xA7",
  "§": "\xA7",
  ";": ";",
  "⤩": "\u2929",
  "∖": "\u2216",
  "∖": "\u2216",
  "✶": "\u2736",
  "𝔰": "\u{1D530}",
  "⌢": "\u2322",
  "♯": "\u266F",
  "щ": "\u0449",
  "ш": "\u0448",
  "∣": "\u2223",
  "∥": "\u2225",
  "­": "\xAD",
  "­": "\xAD",
  "σ": "\u03C3",
  "ς": "\u03C2",
  "ς": "\u03C2",
  "∼": "\u223C",
  "⩪": "\u2A6A",
  "≃": "\u2243",
  "≃": "\u2243",
  "⪞": "\u2A9E",
  "⪠": "\u2AA0",
  "⪝": "\u2A9D",
  "⪟": "\u2A9F",
  "≆": "\u2246",
  "⨤": "\u2A24",
  "⥲": "\u2972",
  "←": "\u2190",
  "∖": "\u2216",
  "⨳": "\u2A33",
  "⧤": "\u29E4",
  "∣": "\u2223",
  "⌣": "\u2323",
  "⪪": "\u2AAA",
  "⪬": "\u2AAC",
  "⪬︀": "\u2AAC\uFE00",
  "ь": "\u044C",
  "/": "/",
  "⧄": "\u29C4",
  "⌿": "\u233F",
  "𝕤": "\u{1D564}",
  "♠": "\u2660",
  "♠": "\u2660",
  "∥": "\u2225",
  "⊓": "\u2293",
  "⊓︀": "\u2293\uFE00",
  "⊔": "\u2294",
  "⊔︀": "\u2294\uFE00",
  "⊏": "\u228F",
  "⊑": "\u2291",
  "⊏": "\u228F",
  "⊑": "\u2291",
  "⊐": "\u2290",
  "⊒": "\u2292",
  "⊐": "\u2290",
  "⊒": "\u2292",
  "□": "\u25A1",
  "□": "\u25A1",
  "▪": "\u25AA",
  "▪": "\u25AA",
  "→": "\u2192",
  "𝓈": "\u{1D4C8}",
  "∖": "\u2216",
  "⌣": "\u2323",
  "⋆": "\u22C6",
  "☆": "\u2606",
  "★": "\u2605",
  "ϵ": "\u03F5",
  "ϕ": "\u03D5",
  "¯": "\xAF",
  "⊂": "\u2282",
  "⫅": "\u2AC5",
  "⪽": "\u2ABD",
  "⊆": "\u2286",
  "⫃": "\u2AC3",
  "⫁": "\u2AC1",
  "⫋": "\u2ACB",
  "⊊": "\u228A",
  "⪿": "\u2ABF",
  "⥹": "\u2979",
  "⊂": "\u2282",
  "⊆": "\u2286",
  "⫅": "\u2AC5",
  "⊊": "\u228A",
  "⫋": "\u2ACB",
  "⫇": "\u2AC7",
  "⫕": "\u2AD5",
  "⫓": "\u2AD3",
  "≻": "\u227B",
  "⪸": "\u2AB8",
  "≽": "\u227D",
  "⪰": "\u2AB0",
  "⪺": "\u2ABA",
  "⪶": "\u2AB6",
  "⋩": "\u22E9",
  "≿": "\u227F",
  "∑": "\u2211",
  "♪": "\u266A",
  "¹": "\xB9",
  "¹": "\xB9",
  "²": "\xB2",
  "²": "\xB2",
  "³": "\xB3",
  "³": "\xB3",
  "⊃": "\u2283",
  "⫆": "\u2AC6",
  "⪾": "\u2ABE",
  "⫘": "\u2AD8",
  "⊇": "\u2287",
  "⫄": "\u2AC4",
  "⟉": "\u27C9",
  "⫗": "\u2AD7",
  "⥻": "\u297B",
  "⫂": "\u2AC2",
  "⫌": "\u2ACC",
  "⊋": "\u228B",
  "⫀": "\u2AC0",
  "⊃": "\u2283",
  "⊇": "\u2287",
  "⫆": "\u2AC6",
  "⊋": "\u228B",
  "⫌": "\u2ACC",
  "⫈": "\u2AC8",
  "⫔": "\u2AD4",
  "⫖": "\u2AD6",
  "⇙": "\u21D9",
  "⤦": "\u2926",
  "↙": "\u2199",
  "↙": "\u2199",
  "⤪": "\u292A",
  "ß": "\xDF",
  "ß": "\xDF",
  "⌖": "\u2316",
  "τ": "\u03C4",
  "⎴": "\u23B4",
  "ť": "\u0165",
  "ţ": "\u0163",
  "т": "\u0442",
  "⃛": "\u20DB",
  "⌕": "\u2315",
  "𝔱": "\u{1D531}",
  "∴": "\u2234",
  "∴": "\u2234",
  "θ": "\u03B8",
  "ϑ": "\u03D1",
  "ϑ": "\u03D1",
  "≈": "\u2248",
  "∼": "\u223C",
  " ": "\u2009",
  "≈": "\u2248",
  "∼": "\u223C",
  "þ": "\xFE",
  "þ": "\xFE",
  "˜": "\u02DC",
  "×": "\xD7",
  "×": "\xD7",
  "⊠": "\u22A0",
  "⨱": "\u2A31",
  "⨰": "\u2A30",
  "∭": "\u222D",
  "⤨": "\u2928",
  "⊤": "\u22A4",
  "⌶": "\u2336",
  "⫱": "\u2AF1",
  "𝕥": "\u{1D565}",
  "⫚": "\u2ADA",
  "⤩": "\u2929",
  "‴": "\u2034",
  "™": "\u2122",
  "▵": "\u25B5",
  "▿": "\u25BF",
  "◃": "\u25C3",
  "⊴": "\u22B4",
  "≜": "\u225C",
  "▹": "\u25B9",
  "⊵": "\u22B5",
  "◬": "\u25EC",
  "≜": "\u225C",
  "⨺": "\u2A3A",
  "⨹": "\u2A39",
  "⧍": "\u29CD",
  "⨻": "\u2A3B",
  "⏢": "\u23E2",
  "𝓉": "\u{1D4C9}",
  "ц": "\u0446",
  "ћ": "\u045B",
  "ŧ": "\u0167",
  "≬": "\u226C",
  "↞": "\u219E",
  "↠": "\u21A0",
  "⇑": "\u21D1",
  "⥣": "\u2963",
  "ú": "\xFA",
  "ú": "\xFA",
  "↑": "\u2191",
  "ў": "\u045E",
  "ŭ": "\u016D",
  "û": "\xFB",
  "û": "\xFB",
  "у": "\u0443",
  "⇅": "\u21C5",
  "ű": "\u0171",
  "⥮": "\u296E",
  "⥾": "\u297E",
  "𝔲": "\u{1D532}",
  "ù": "\xF9",
  "ù": "\xF9",
  "↿": "\u21BF",
  "↾": "\u21BE",
  "▀": "\u2580",
  "⌜": "\u231C",
  "⌜": "\u231C",
  "⌏": "\u230F",
  "◸": "\u25F8",
  "ū": "\u016B",
  "¨": "\xA8",
  "¨": "\xA8",
  "ų": "\u0173",
  "𝕦": "\u{1D566}",
  "↑": "\u2191",
  "↕": "\u2195",
  "↿": "\u21BF",
  "↾": "\u21BE",
  "⊎": "\u228E",
  "υ": "\u03C5",
  "ϒ": "\u03D2",
  "υ": "\u03C5",
  "⇈": "\u21C8",
  "⌝": "\u231D",
  "⌝": "\u231D",
  "⌎": "\u230E",
  "ů": "\u016F",
  "◹": "\u25F9",
  "𝓊": "\u{1D4CA}",
  "⋰": "\u22F0",
  "ũ": "\u0169",
  "▵": "\u25B5",
  "▴": "\u25B4",
  "⇈": "\u21C8",
  "ü": "\xFC",
  "ü": "\xFC",
  "⦧": "\u29A7",
  "⇕": "\u21D5",
  "⫨": "\u2AE8",
  "⫩": "\u2AE9",
  "⊨": "\u22A8",
  "⦜": "\u299C",
  "ϵ": "\u03F5",
  "ϰ": "\u03F0",
  "∅": "\u2205",
  "ϕ": "\u03D5",
  "ϖ": "\u03D6",
  "∝": "\u221D",
  "↕": "\u2195",
  "ϱ": "\u03F1",
  "ς": "\u03C2",
  "⊊︀": "\u228A\uFE00",
  "⫋︀": "\u2ACB\uFE00",
  "⊋︀": "\u228B\uFE00",
  "⫌︀": "\u2ACC\uFE00",
  "ϑ": "\u03D1",
  "⊲": "\u22B2",
  "⊳": "\u22B3",
  "в": "\u0432",
  "⊢": "\u22A2",
  "∨": "\u2228",
  "⊻": "\u22BB",
  "≚": "\u225A",
  "⋮": "\u22EE",
  "|": "|",
  "|": "|",
  "𝔳": "\u{1D533}",
  "⊲": "\u22B2",
  "⊂⃒": "\u2282\u20D2",
  "⊃⃒": "\u2283\u20D2",
  "𝕧": "\u{1D567}",
  "∝": "\u221D",
  "⊳": "\u22B3",
  "𝓋": "\u{1D4CB}",
  "⫋︀": "\u2ACB\uFE00",
  "⊊︀": "\u228A\uFE00",
  "⫌︀": "\u2ACC\uFE00",
  "⊋︀": "\u228B\uFE00",
  "⦚": "\u299A",
  "ŵ": "\u0175",
  "⩟": "\u2A5F",
  "∧": "\u2227",
  "≙": "\u2259",
  "℘": "\u2118",
  "𝔴": "\u{1D534}",
  "𝕨": "\u{1D568}",
  "℘": "\u2118",
  "≀": "\u2240",
  "≀": "\u2240",
  "𝓌": "\u{1D4CC}",
  "⋂": "\u22C2",
  "◯": "\u25EF",
  "⋃": "\u22C3",
  "▽": "\u25BD",
  "𝔵": "\u{1D535}",
  "⟺": "\u27FA",
  "⟷": "\u27F7",
  "ξ": "\u03BE",
  "⟸": "\u27F8",
  "⟵": "\u27F5",
  "⟼": "\u27FC",
  "⋻": "\u22FB",
  "⨀": "\u2A00",
  "𝕩": "\u{1D569}",
  "⨁": "\u2A01",
  "⨂": "\u2A02",
  "⟹": "\u27F9",
  "⟶": "\u27F6",
  "𝓍": "\u{1D4CD}",
  "⨆": "\u2A06",
  "⨄": "\u2A04",
  "△": "\u25B3",
  "⋁": "\u22C1",
  "⋀": "\u22C0",
  "ý": "\xFD",
  "ý": "\xFD",
  "я": "\u044F",
  "ŷ": "\u0177",
  "ы": "\u044B",
  "¥": "\xA5",
  "¥": "\xA5",
  "𝔶": "\u{1D536}",
  "ї": "\u0457",
  "𝕪": "\u{1D56A}",
  "𝓎": "\u{1D4CE}",
  "ю": "\u044E",
  "ÿ": "\xFF",
  "ÿ": "\xFF",
  "ź": "\u017A",
  "ž": "\u017E",
  "з": "\u0437",
  "ż": "\u017C",
  "ℨ": "\u2128",
  "ζ": "\u03B6",
  "𝔷": "\u{1D537}",
  "ж": "\u0436",
  "⇝": "\u21DD",
  "𝕫": "\u{1D56B}",
  "𝓏": "\u{1D4CF}",
  "‍": "\u200D",
  "‌": "\u200C"
}, html_entities_default = htmlEntities;
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/text-format.js
function decodeHTMLEntities(str) {
  return str.replace(/&(#\d+|#x[a-f0-9]+|[a-z]+\d*);?/gi, (match, entity) => {
    if (typeof html_entities_default[match] == "string")
      return html_entities_default[match];
    if (entity.charAt(0) !== "#" || match.charAt(match.length - 1) !== ";")
      return match;
    let codePoint;
    entity.charAt(1) === "x" ? codePoint = parseInt(entity.substr(2), 16) : codePoint = parseInt(entity.substr(1), 10);
    var output = "";
    return codePoint >= 55296 && codePoint <= 57343 || codePoint > 1114111 ? "\uFFFD" : (codePoint > 65535 && (codePoint -= 65536, output += String.fromCharCode(codePoint >>> 10 & 1023 | 55296), codePoint = 56320 | codePoint & 1023), output += String.fromCharCode(codePoint), output);
  });
}
function escapeHtml(str) {
  return str.trim().replace(/[<>"'?&]/g, (c) => {
    let hex = c.charCodeAt(0).toString(16);
    return hex.length < 2 && (hex = "0" + hex), "&#x" + hex.toUpperCase() + ";";
  });
}
function textToHtml(str) {
  return "<div>" + escapeHtml(str).replace(/\n/g, "<br />") + "</div>";
}
function htmlToText(str) {
  return str = str.replace(/\r?\n/g, "").replace(/<\!\-\-.*?\-\->/gi, " ").replace(/<br\b[^>]*>/gi, `
`).replace(/<\/?(p|div|table|tr|td|th)\b[^>]*>/gi, `
`).replace(/<script\b[^>]*>.*?<\/script\b[^>]*>/gi, " ").replace(/^.*<body\b[^>]*>/i, "").replace(/^.*<\/head\b[^>]*>/i, "").replace(/^.*<\!doctype\b[^>]*>/i, "").replace(/<\/body\b[^>]*>.*$/i, "").replace(/<\/html\b[^>]*>.*$/i, "").replace(/<a\b[^>]*href\s*=\s*["']?([^\s"']+)[^>]*>/gi, " ($1) ").replace(/<\/?(span|em|i|strong|b|u|a)\b[^>]*>/gi, "").replace(/<li\b[^>]*>[\n\u0001\s]*/gi, "* ").replace(/<hr\b[^>]*>/g, `
-------------
`).replace(/<[^>]*>/g, " ").replace(/\u0001/g, `
`).replace(/[ \t]+/g, " ").replace(/^\s+$/gm, "").replace(/\n\n+/g, `
`).replace(/^\n+/, `
`).replace(/\n+$/, `
`), str = decodeHTMLEntities(str), str;
}
function formatTextAddress(address) {
  return [].concat(address.name || []).concat(address.name ? `<${address.address}>` : address.address).join(" ");
}
function formatTextAddresses(addresses) {
  let parts = [], processAddress = (address, partCounter) => {
    if (partCounter && parts.push(", "), address.group) {
      let groupStart = `${address.name}:`, groupEnd = ";";
      parts.push(groupStart), address.group.forEach(processAddress), parts.push(groupEnd);
    } else
      parts.push(formatTextAddress(address));
  };
  return addresses.forEach(processAddress), parts.join("");
}
function formatHtmlAddress(address) {
  return `<a href="mailto:${escapeHtml(address.address)}" class="postal-email-address">${escapeHtml(address.name || `<${address.address}>`)}</a>`;
}
function formatHtmlAddresses(addresses) {
  let parts = [], processAddress = (address, partCounter) => {
    if (partCounter && parts.push('<span class="postal-email-address-separator">, </span>'), address.group) {
      let groupStart = `<span class="postal-email-address-group">${escapeHtml(address.name)}:</span>`, groupEnd = '<span class="postal-email-address-group">;</span>';
      parts.push(groupStart), address.group.forEach(processAddress), parts.push(groupEnd);
    } else
      parts.push(formatHtmlAddress(address));
  };
  return addresses.forEach(processAddress), parts.join(" ");
}
function foldLines(str, lineLength, afterSpace) {
  str = (str || "").toString(), lineLength = lineLength || 76;
  let pos = 0, len = str.length, result = "", line, match;
  for (; pos < len; ) {
    if (line = str.substr(pos, lineLength), line.length < lineLength) {
      result += line;
      break;
    }
    if (match = line.match(/^[^\n\r]*(\r?\n|\r)/)) {
      line = match[0], result += line, pos += line.length;
      continue;
    } else (match = line.match(/(\s+)[^\s]*$/)) && match[0].length - (afterSpace ? (match[1] || "").length : 0) < line.length ? line = line.substr(0, line.length - (match[0].length - (afterSpace ? (match[1] || "").length : 0))) : (match = str.substr(pos + line.length).match(/^[^\s]+(\s*)/)) && (line = line + match[0].substr(0, match[0].length - (afterSpace ? 0 : (match[1] || "").length)));
    result += line, pos += line.length, pos < len && (result += `\r
`);
  }
  return result;
}
function formatTextHeader(message) {
  let rows = [];
  if (message.from && rows.push({ key: "From", val: formatTextAddress(message.from) }), message.subject && rows.push({ key: "Subject", val: message.subject }), message.date) {
    let dateOptions = {
      year: "numeric",
      month: "numeric",
      day: "numeric",
      hour: "numeric",
      minute: "numeric",
      second: "numeric",
      hour12: !1
    }, dateStr = typeof Intl > "u" ? message.date : new Intl.DateTimeFormat("default", dateOptions).format(new Date(message.date));
    rows.push({ key: "Date", val: dateStr });
  }
  message.to && message.to.length && rows.push({ key: "To", val: formatTextAddresses(message.to) }), message.cc && message.cc.length && rows.push({ key: "Cc", val: formatTextAddresses(message.cc) }), message.bcc && message.bcc.length && rows.push({ key: "Bcc", val: formatTextAddresses(message.bcc) });
  let maxKeyLength = rows.map((r) => r.key.length).reduce((acc, cur) => cur > acc ? cur : acc, 0);
  rows = rows.flatMap((row) => {
    let sepLen = maxKeyLength - row.key.length, prefix = `${row.key}: ${" ".repeat(sepLen)}`, emptyPrefix = `${" ".repeat(row.key.length + 1)} ${" ".repeat(sepLen)}`;
    return foldLines(row.val, 80, !0).split(/\r?\n/).map((line) => line.trim()).map((line, i) => `${i ? emptyPrefix : prefix}${line}`);
  });
  let maxLineLength = rows.map((r) => r.length).reduce((acc, cur) => cur > acc ? cur : acc, 0), lineMarker = "-".repeat(maxLineLength);
  return `
${lineMarker}
${rows.join(`
`)}
${lineMarker}
`;
}
function formatHtmlHeader(message) {
  let rows = [];
  if (message.from && rows.push(`<div class="postal-email-header-key">From</div><div class="postal-email-header-value">${formatHtmlAddress(message.from)}</div>`), message.subject && rows.push(
    `<div class="postal-email-header-key">Subject</div><div class="postal-email-header-value postal-email-header-subject">${escapeHtml(
      message.subject
    )}</div>`
  ), message.date) {
    let dateOptions = {
      year: "numeric",
      month: "numeric",
      day: "numeric",
      hour: "numeric",
      minute: "numeric",
      second: "numeric",
      hour12: !1
    }, dateStr = typeof Intl > "u" ? message.date : new Intl.DateTimeFormat("default", dateOptions).format(new Date(message.date));
    rows.push(
      `<div class="postal-email-header-key">Date</div><div class="postal-email-header-value postal-email-header-date" data-date="${escapeHtml(
        message.date
      )}">${escapeHtml(dateStr)}</div>`
    );
  }
  return message.to && message.to.length && rows.push(`<div class="postal-email-header-key">To</div><div class="postal-email-header-value">${formatHtmlAddresses(message.to)}</div>`), message.cc && message.cc.length && rows.push(`<div class="postal-email-header-key">Cc</div><div class="postal-email-header-value">${formatHtmlAddresses(message.cc)}</div>`), message.bcc && message.bcc.length && rows.push(`<div class="postal-email-header-key">Bcc</div><div class="postal-email-header-value">${formatHtmlAddresses(message.bcc)}</div>`), `<div class="postal-email-header">${rows.length ? '<div class="postal-email-header-row">' : ""}${rows.join(
    `</div>
<div class="postal-email-header-row">`
  )}${rows.length ? "</div>" : ""}</div>`;
}
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/address-parser.js
function _handleAddress(tokens) {
  let token, isGroup = !1, state = "text", address, addresses = [], data = {
    address: [],
    comment: [],
    group: [],
    text: []
  }, i, len;
  for (i = 0, len = tokens.length; i < len; i++)
    if (token = tokens[i], token.type === "operator")
      switch (token.value) {
        case "<":
          state = "address";
          break;
        case "(":
          state = "comment";
          break;
        case ":":
          state = "group", isGroup = !0;
          break;
        default:
          state = "text";
      }
    else token.value && (state === "address" && (token.value = token.value.replace(/^[^<]*<\s*/, "")), data[state].push(token.value));
  if (!data.text.length && data.comment.length && (data.text = data.comment, data.comment = []), isGroup)
    data.text = data.text.join(" "), addresses.push({
      name: decodeWords(data.text || address && address.name),
      group: data.group.length ? addressParser(data.group.join(",")) : []
    });
  else {
    if (!data.address.length && data.text.length) {
      for (i = data.text.length - 1; i >= 0; i--)
        if (data.text[i].match(/^[^@\s]+@[^@\s]+$/)) {
          data.address = data.text.splice(i, 1);
          break;
        }
      let _regexHandler = function(address2) {
        return data.address.length ? address2 : (data.address = [address2.trim()], " ");
      };
      if (!data.address.length)
        for (i = data.text.length - 1; i >= 0 && (data.text[i] = data.text[i].replace(/\s*\b[^@\s]+@[^\s]+\b\s*/, _regexHandler).trim(), !data.address.length); i--)
          ;
    }
    if (!data.text.length && data.comment.length && (data.text = data.comment, data.comment = []), data.address.length > 1 && (data.text = data.text.concat(data.address.splice(1))), data.text = data.text.join(" "), data.address = data.address.join(" "), !data.address && /^=\?[^=]+?=$/.test(data.text.trim())) {
      let parsedSubAddresses = addressParser(decodeWords(data.text));
      if (parsedSubAddresses && parsedSubAddresses.length)
        return parsedSubAddresses;
    }
    if (!data.address && isGroup)
      return [];
    address = {
      address: data.address || data.text || "",
      name: decodeWords(data.text || data.address || "")
    }, address.address === address.name && ((address.address || "").match(/@/) ? address.name = "" : address.address = ""), addresses.push(address);
  }
  return addresses;
}
var Tokenizer = class {
  constructor(str) {
    this.str = (str || "").toString(), this.operatorCurrent = "", this.operatorExpecting = "", this.node = null, this.escaped = !1, this.list = [], this.operators = {
      '"': '"',
      "(": ")",
      "<": ">",
      ",": "",
      ":": ";",
      // Semicolons are not a legal delimiter per the RFC2822 grammar other
      // than for terminating a group, but they are also not valid for any
      // other use in this context.  Given that some mail clients have
      // historically allowed the semicolon as a delimiter equivalent to the
      // comma in their UI, it makes sense to treat them the same as a comma
      // when used outside of a group.
      ";": ""
    };
  }
  /**
   * Tokenizes the original input string
   *
   * @return {Array} An array of operator|text tokens
   */
  tokenize() {
    let chr, list = [];
    for (let i = 0, len = this.str.length; i < len; i++)
      chr = this.str.charAt(i), this.checkChar(chr);
    return this.list.forEach((node) => {
      node.value = (node.value || "").toString().trim(), node.value && list.push(node);
    }), list;
  }
  /**
   * Checks if a character is an operator or text and acts accordingly
   *
   * @param {String} chr Character from the address field
   */
  checkChar(chr) {
    if (!this.escaped) {
      if (chr === this.operatorExpecting) {
        this.node = {
          type: "operator",
          value: chr
        }, this.list.push(this.node), this.node = null, this.operatorExpecting = "", this.escaped = !1;
        return;
      } else if (!this.operatorExpecting && chr in this.operators) {
        this.node = {
          type: "operator",
          value: chr
        }, this.list.push(this.node), this.node = null, this.operatorExpecting = this.operators[chr], this.escaped = !1;
        return;
      } else if (['"', "'"].includes(this.operatorExpecting) && chr === "\\") {
        this.escaped = !0;
        return;
      }
    }
    this.node || (this.node = {
      type: "text",
      value: ""
    }, this.list.push(this.node)), chr === `
` && (chr = " "), (chr.charCodeAt(0) >= 33 || [" ", "	"].includes(chr)) && (this.node.value += chr), this.escaped = !1;
  }
};
function addressParser(str, options) {
  options = options || {};
  let tokens = new Tokenizer(str).tokenize(), addresses = [], address = [], parsedAddresses = [];
  if (tokens.forEach((token) => {
    token.type === "operator" && (token.value === "," || token.value === ";") ? (address.length && addresses.push(address), address = []) : address.push(token);
  }), address.length && addresses.push(address), addresses.forEach((address2) => {
    address2 = _handleAddress(address2), address2.length && (parsedAddresses = parsedAddresses.concat(address2));
  }), options.flatten) {
    let addresses2 = [], walkAddressList = (list) => {
      list.forEach((address2) => {
        if (address2.group)
          return walkAddressList(address2.group);
        addresses2.push(address2);
      });
    };
    return walkAddressList(parsedAddresses), addresses2;
  }
  return parsedAddresses;
}
var address_parser_default = addressParser;
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/base64-encoder.js
function base64ArrayBuffer(arrayBuffer) {
  for (var base64 = "", encodings = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", bytes = new Uint8Array(arrayBuffer), byteLength = bytes.byteLength, byteRemainder = byteLength % 3, mainLength = byteLength - byteRemainder, a, b, c, d, chunk, i = 0; i < mainLength; i = i + 3)
    chunk = bytes[i] << 16 | bytes[i + 1] << 8 | bytes[i + 2], a = (chunk & 16515072) >> 18, b = (chunk & 258048) >> 12, c = (chunk & 4032) >> 6, d = chunk & 63, base64 += encodings[a] + encodings[b] + encodings[c] + encodings[d];
  return byteRemainder == 1 ? (chunk = bytes[mainLength], a = (chunk & 252) >> 2, b = (chunk & 3) << 4, base64 += encodings[a] + encodings[b] + "==") : byteRemainder == 2 && (chunk = bytes[mainLength] << 8 | bytes[mainLength + 1], a = (chunk & 64512) >> 10, b = (chunk & 1008) >> 4, c = (chunk & 15) << 2, base64 += encodings[a] + encodings[b] + encodings[c] + "="), base64;
}
// ../../node_modules/.pnpm/postal-mime@2.4.3_patch_hash=ngwql2fj2dlex3jjynq4iizhk4/node_modules/postal-mime/src/postal-mime.js
var PostalMime = class _PostalMime {
  static parse(buf, options) {
    return new _PostalMime(options).parse(buf);
  }
  constructor(options) {
    this.options = options || {}, this.root = this.currentNode = new MimeNode({
      postalMime: this
    }), this.boundaries = [], this.textContent = {}, this.attachments = [], this.attachmentEncoding = (this.options.attachmentEncoding || "").toString().replace(/[-_\s]/g, "").trim().toLowerCase() || "arraybuffer", this.started = !1;
  }
  async finalize() {
    await this.root.finalize();
  }
  async processLine(line, isFinal) {
    let boundaries = this.boundaries;
    if (boundaries.length && line.length > 2 && line[0] === 45 && line[1] === 45)
      for (let i = boundaries.length - 1; i >= 0; i--) {
        let boundary = boundaries[i];
        if (line.length !== boundary.value.length + 2 && line.length !== boundary.value.length + 4)
          continue;
        let isTerminator = line.length === boundary.value.length + 4;
        if (isTerminator && (line[line.length - 2] !== 45 || line[line.length - 1] !== 45))
          continue;
        let boudaryMatches = !0;
        for (let i2 = 0; i2 < boundary.value.length; i2++)
          if (line[i2 + 2] !== boundary.value[i2]) {
            boudaryMatches = !1;
            break;
          }
        if (boudaryMatches)
          return isTerminator ? (await boundary.node.finalize(), this.currentNode = boundary.node.parentNode || this.root) : (await boundary.node.finalizeChildNodes(), this.currentNode = new MimeNode({
            postalMime: this,
            parentNode: boundary.node
          })), isFinal ? this.finalize() : void 0;
      }
    if (this.currentNode.feed(line), isFinal)
      return this.finalize();
  }
  readLine() {
    let startPos = this.readPos, endPos = this.readPos, res = () => ({
      bytes: new Uint8Array(this.buf, startPos, endPos - startPos),
      done: this.readPos >= this.av.length
    });
    for (; this.readPos < this.av.length; ) {
      let c = this.av[this.readPos++];
      if (c !== 13 && c !== 10 && (endPos = this.readPos), c === 10)
        return res();
    }
    return res();
  }
  async processNodeTree() {
    let textContent = {}, textTypes = /* @__PURE__ */ new Set(), textMap = this.textMap = /* @__PURE__ */ new Map(), forceRfc822Attachments = this.forceRfc822Attachments(), walk = async (node, alternative, related) => {
      if (alternative = alternative || !1, related = related || !1, node.contentType.multipart)
        node.contentType.multipart === "alternative" ? alternative = node : node.contentType.multipart === "related" && (related = node);
      else if (this.isInlineMessageRfc822(node) && !forceRfc822Attachments) {
        let subParser = new _PostalMime();
        node.subMessage = await subParser.parse(node.content), textMap.has(node) || textMap.set(node, {});
        let textEntry = textMap.get(node);
        (node.subMessage.text || !node.subMessage.html) && (textEntry.plain = textEntry.plain || [], textEntry.plain.push({ type: "subMessage", value: node.subMessage }), textTypes.add("plain")), node.subMessage.html && (textEntry.html = textEntry.html || [], textEntry.html.push({ type: "subMessage", value: node.subMessage }), textTypes.add("html")), subParser.textMap && subParser.textMap.forEach((subTextEntry, subTextNode) => {
          textMap.set(subTextNode, subTextEntry);
        });
        for (let attachment of node.subMessage.attachments || [])
          this.attachments.push(attachment);
      } else if (this.isInlineTextNode(node)) {
        let textType = node.contentType.parsed.value.substr(node.contentType.parsed.value.indexOf("/") + 1), selectorNode = alternative || node;
        textMap.has(selectorNode) || textMap.set(selectorNode, {});
        let textEntry = textMap.get(selectorNode);
        textEntry[textType] = textEntry[textType] || [], textEntry[textType].push({ type: "text", value: node.getTextContent() }), textTypes.add(textType);
      } else if (node.content) {
        let filename = node.contentDisposition.parsed.params.filename || node.contentType.parsed.params.name || null, attachment = {
          filename: filename ? decodeWords(filename) : null,
          mimeType: node.contentType.parsed.value,
          disposition: node.contentDisposition.parsed.value || null
        };
        switch (related && node.contentId && (attachment.related = !0), node.contentDescription && (attachment.description = node.contentDescription), node.contentId && (attachment.contentId = node.contentId), node.contentType.parsed.value) {
          // Special handling for calendar events
          case "text/calendar":
          case "application/ics": {
            node.contentType.parsed.params.method && (attachment.method = node.contentType.parsed.params.method.toString().toUpperCase().trim());
            let decodedText = node.getTextContent().replace(/\r?\n/g, `
`).replace(/\n*$/, `
`);
            attachment.content = textEncoder.encode(decodedText);
            break;
          }
          // Regular attachments
          default:
            attachment.content = node.content;
        }
        this.attachments.push(attachment);
      }
      for (let childNode of node.childNodes)
        await walk(childNode, alternative, related);
    };
    await walk(this.root, !1, []), textMap.forEach((mapEntry) => {
      textTypes.forEach((textType) => {
        if (textContent[textType] || (textContent[textType] = []), mapEntry[textType])
          mapEntry[textType].forEach((textEntry) => {
            switch (textEntry.type) {
              case "text":
                textContent[textType].push(textEntry.value);
                break;
              case "subMessage":
                switch (textType) {
                  case "html":
                    textContent[textType].push(formatHtmlHeader(textEntry.value));
                    break;
                  case "plain":
                    textContent[textType].push(formatTextHeader(textEntry.value));
                    break;
                }
                break;
            }
          });
        else {
          let alternativeType;
          switch (textType) {
            case "html":
              alternativeType = "plain";
              break;
            case "plain":
              alternativeType = "html";
              break;
          }
          (mapEntry[alternativeType] || []).forEach((textEntry) => {
            switch (textEntry.type) {
              case "text":
                switch (textType) {
                  case "html":
                    textContent[textType].push(textToHtml(textEntry.value));
                    break;
                  case "plain":
                    textContent[textType].push(htmlToText(textEntry.value));
                    break;
                }
                break;
              case "subMessage":
                switch (textType) {
                  case "html":
                    textContent[textType].push(formatHtmlHeader(textEntry.value));
                    break;
                  case "plain":
                    textContent[textType].push(formatTextHeader(textEntry.value));
                    break;
                }
                break;
            }
          });
        }
      });
    }), Object.keys(textContent).forEach((textType) => {
      textContent[textType] = textContent[textType].join(`
`);
    }), this.textContent = textContent;
  }
  isInlineTextNode(node) {
    if (node.contentDisposition.parsed.value === "attachment")
      return !1;
    switch (node.contentType.parsed.value) {
      case "text/html":
      case "text/plain":
        return !0;
      case "text/calendar":
      case "text/csv":
      default:
        return !1;
    }
  }
  isInlineMessageRfc822(node) {
    return node.contentType.parsed.value !== "message/rfc822" ? !1 : (node.contentDisposition.parsed.value || (this.options.rfc822Attachments ? "attachment" : "inline")) === "inline";
  }
  // Check if this is a specially crafted report email where message/rfc822 content should not be inlined
  forceRfc822Attachments() {
    if (this.options.forceRfc822Attachments)
      return !0;
    let forceRfc822Attachments = !1, walk = (node) => {
      node.contentType.multipart || ["message/delivery-status", "message/feedback-report"].includes(node.contentType.parsed.value) && (forceRfc822Attachments = !0);
      for (let childNode of node.childNodes)
        walk(childNode);
    };
    return walk(this.root), forceRfc822Attachments;
  }
  async resolveStream(stream) {
    let chunkLen = 0, chunks = [], reader = stream.getReader();
    for (; ; ) {
      let { done, value } = await reader.read();
      if (done)
        break;
      chunks.push(value), chunkLen += value.length;
    }
    let result = new Uint8Array(chunkLen), chunkPointer = 0;
    for (let chunk of chunks)
      result.set(chunk, chunkPointer), chunkPointer += chunk.length;
    return result;
  }
  async parse(buf) {
    if (this.started)
      throw new Error("Can not reuse parser, create a new PostalMime object");
    for (this.started = !0, buf && typeof buf.getReader == "function" && (buf = await this.resolveStream(buf)), buf = buf || new ArrayBuffer(0), typeof buf == "string" && (buf = textEncoder.encode(buf)), (buf instanceof Blob || Object.prototype.toString.call(buf) === "[object Blob]") && (buf = await blobToArrayBuffer(buf)), buf.buffer instanceof ArrayBuffer && (buf = new Uint8Array(buf).buffer), this.buf = buf, this.av = new Uint8Array(buf), this.readPos = 0; this.readPos < this.av.length; ) {
      let line = this.readLine();
      await this.processLine(line.bytes, line.done);
    }
    await this.processNodeTree();
    let message = {
      headers: this.root.headers.map((entry) => ({ key: entry.key, value: entry.value })).reverse()
    };
    for (let key of ["from", "sender"]) {
      let addressHeader = this.root.headers.find((line) => line.key === key);
      if (addressHeader && addressHeader.value) {
        let addresses = address_parser_default(addressHeader.value);
        addresses && addresses.length && (message[key] = addresses[0]);
      }
    }
    for (let key of ["delivered-to", "return-path"]) {
      let addressHeader = this.root.headers.find((line) => line.key === key);
      if (addressHeader && addressHeader.value) {
        let addresses = address_parser_default(addressHeader.value);
        if (addresses && addresses.length && addresses[0].address) {
          let camelKey = key.replace(/\-(.)/g, (o, c) => c.toUpperCase());
          message[camelKey] = addresses[0].address;
        }
      }
    }
    for (let key of ["to", "cc", "bcc", "reply-to"]) {
      let addressHeaders = this.root.headers.filter((line) => line.key === key), addresses = [];
      if (addressHeaders.filter((entry) => entry && entry.value).map((entry) => address_parser_default(entry.value)).forEach((parsed) => addresses = addresses.concat(parsed || [])), addresses && addresses.length) {
        let camelKey = key.replace(/\-(.)/g, (o, c) => c.toUpperCase());
        message[camelKey] = addresses;
      }
    }
    for (let key of ["subject", "message-id", "in-reply-to", "references"]) {
      let header = this.root.headers.find((line) => line.key === key);
      if (header && header.value) {
        let camelKey = key.replace(/\-(.)/g, (o, c) => c.toUpperCase());
        message[camelKey] = decodeWords(header.value);
      }
    }
    let dateHeader = this.root.headers.find((line) => line.key === "date");
    if (dateHeader) {
      let date = new Date(dateHeader.value);
      !date || date.toString() === "Invalid Date" ? date = dateHeader.value : date = date.toISOString(), message.date = date;
    }
    switch (this.textContent?.html && (message.html = this.textContent.html), this.textContent?.plain && (message.text = this.textContent.plain), message.attachments = this.attachments, this.attachmentEncoding) {
      case "arraybuffer":
        break;
      case "base64":
        for (let attachment of message.attachments || [])
          attachment?.content && (attachment.content = base64ArrayBuffer(attachment.content), attachment.encoding = "base64");
        break;
      case "utf8":
        let attachmentDecoder = new TextDecoder("utf8");
        for (let attachment of message.attachments || [])
          attachment?.content && (attachment.content = attachmentDecoder.decode(attachment.content), attachment.encoding = "utf8");
        break;
      default:
        throw new Error("Unknwon attachment encoding");
    }
    return message;
  }
};
// src/workers/core/constants.ts
var CoreBindings = {
  SERVICE_LOOPBACK: "MINIFLARE_LOOPBACK",
  SERVICE_USER_ROUTE_PREFIX: "MINIFLARE_USER_ROUTE_",
  SERVICE_USER_FALLBACK: "MINIFLARE_USER_FALLBACK",
  TEXT_CUSTOM_SERVICE: "MINIFLARE_CUSTOM_SERVICE",
  IMAGES_SERVICE: "MINIFLARE_IMAGES_SERVICE",
  TEXT_UPSTREAM_URL: "MINIFLARE_UPSTREAM_URL",
  JSON_CF_BLOB: "CF_BLOB",
  JSON_ROUTES: "MINIFLARE_ROUTES",
  JSON_LOG_LEVEL: "MINIFLARE_LOG_LEVEL",
  DATA_LIVE_RELOAD_SCRIPT: "MINIFLARE_LIVE_RELOAD_SCRIPT",
  DURABLE_OBJECT_NAMESPACE_PROXY: "MINIFLARE_PROXY",
  DATA_PROXY_SECRET: "MINIFLARE_PROXY_SECRET",
  DATA_PROXY_SHARED_SECRET: "MINIFLARE_PROXY_SHARED_SECRET",
  TRIGGER_HANDLERS: "TRIGGER_HANDLERS",
  LOG_REQUESTS: "LOG_REQUESTS",
  STRIP_DISABLE_PRETTY_ERROR: "STRIP_DISABLE_PRETTY_ERROR"
};
// src/workers/email/constants.ts
var RAW_EMAIL = "EmailMessage::raw";
// src/workers/email/send_email.worker.ts
var SendEmailBinding = class extends WorkerEntrypoint {
  checkDestinationAllowed(to) {
    if (this.env.destination_address !== void 0 && to !== this.env.destination_address)
      throw new Error(`email to ${to} not allowed`);
    if (this.env.allowed_destination_addresses !== void 0 && !this.env.allowed_destination_addresses.includes(to))
      throw new Error(`email to ${to} not allowed`);
  }
  async send(emailMessage) {
    this.checkDestinationAllowed(emailMessage.to);
    let rawEmail = emailMessage[RAW_EMAIL], rawEmailBuffer = new Uint8Array(
      await new Response(rawEmail).arrayBuffer()
    ), parsedEmail;
    try {
      parsedEmail = await PostalMime.parse(rawEmailBuffer);
    } catch (e) {
      let error = e;
      throw new Error(`could not parse email: ${error.message}`);
    }
    if (parsedEmail.messageId === void 0)
      throw new Error("invalid message-id");
    let emailHeaders;
    try {
      emailHeaders = new Headers(
        parsedEmail.headers.map((header) => [header.key, header.value])
      );
    } catch (e) {
      let error = e;
      throw new Error(`could not parse email: ${error.message}`);
    }
    if (emailMessage.from !== parsedEmail.from.address)
      throw new Error("From: header does not match mail from");
    if (emailHeaders.get("received") !== null)
      throw new Error("invalid headers set");
    let file = await (await this.env[CoreBindings.SERVICE_LOOPBACK].fetch(
      "http://localhost/core/store-temp-file?extension=eml&prefix=email",
      {
        method: "POST",
        body: rawEmailBuffer
      }
    )).text();
    this.ctx.waitUntil(
      this.env[CoreBindings.SERVICE_LOOPBACK].fetch(
        "http://localhost/core/log",
        {
          method: "POST",
          headers: { [SharedHeaders.LOG_LEVEL]: LogLevel.INFO.toString() },
          body: `${blue("send_email binding called with the following message:")}
  ${file}`
        }
      )
    );
  }
};
export {
  SendEmailBinding
};
//# sourceMappingURL=send_email.worker.js.map