# Orca
#
# Copyright 2014 Igalia, S.L.
#
# Author: Joanmarie Diggs <jdiggs@igalia.com>
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., Franklin Street, Fifth Floor,
# Boston MA  02110-1301 USA.

# pylint: disable=too-many-lines

"""Turns math symbols into their spoken representation."""

import unicodedata

from . import debug
from .orca_i18n import C_  # pylint: disable=import-error

SPEAK_NEVER = 1
SPEAK_ALWAYS = 2
SPEAK_FOR_CHARS = 3
speak_style = SPEAK_ALWAYS  # pylint: disable=invalid-name

fall_back_on_unicode_data = False  # pylint: disable=invalid-name

_all: dict[str, str] = {}
_alnum: dict[str, str] = {}
_arrows: dict[str, str] = {}
_operators: dict[str, str] = {}
_shapes: dict[str, str] = {}
_combining: dict[str, str] = {}

# Note that the following are to help us identify what is likely a math symbol
# (as opposed to one serving the function of an image in "This way up.")
_arrows.update(dict.fromkeys(map(chr, range(0x2190, 0x2200)), ""))
_arrows.update(dict.fromkeys(map(chr, range(0x2750, 0x2800)), ""))
_arrows.update(dict.fromkeys(map(chr, range(0x2B30, 0x2B50)), ""))
_operators.update(dict.fromkeys(map(chr, range(0x2220, 0x2300)), ""))
_operators.update(dict.fromkeys(map(chr, range(0x2A00, 0x2B00)), ""))
_shapes.update(dict.fromkeys(map(chr, range(0x25A0, 0x2600)), ""))

# Unicode has a huge number of individual symbols to include styles, such as
# bold, italic, double-struck, etc. These are so far not supported by speech
# synthesizers. So we'll maintain a dictionary of equivalent symbols which
# speech synthesizers should know along with lists of the various styles.
_alnum["\u2102"] = "C"
_alnum["\u210a"] = "g"
_alnum["\u210b"] = "H"
_alnum["\u210c"] = "H"
_alnum["\u210d"] = "H"
_alnum["\u210e"] = "h"
_alnum["\u2110"] = "I"
_alnum["\u2111"] = "I"
_alnum["\u2112"] = "L"
_alnum["\u2113"] = "l"
_alnum["\u2115"] = "N"
_alnum["\u2119"] = "P"
_alnum["\u211a"] = "Q"
_alnum["\u211b"] = "R"
_alnum["\u211c"] = "R"
_alnum["\u211d"] = "R"
_alnum["\u2124"] = "Z"
_alnum["\u2128"] = "Z"
_alnum["\u212c"] = "B"
_alnum["\u212d"] = "C"
_alnum["\u212f"] = "e"
_alnum["\u2130"] = "E"
_alnum["\u2131"] = "F"
_alnum["\u2133"] = "M"
_alnum["\u2134"] = "o"
_alnum["\U0001d400"] = "A"
_alnum["\U0001d401"] = "B"
_alnum["\U0001d402"] = "C"
_alnum["\U0001d403"] = "D"
_alnum["\U0001d404"] = "E"
_alnum["\U0001d405"] = "F"
_alnum["\U0001d406"] = "G"
_alnum["\U0001d407"] = "H"
_alnum["\U0001d408"] = "I"
_alnum["\U0001d409"] = "J"
_alnum["\U0001d40a"] = "K"
_alnum["\U0001d40b"] = "L"
_alnum["\U0001d40c"] = "M"
_alnum["\U0001d40d"] = "N"
_alnum["\U0001d40e"] = "O"
_alnum["\U0001d40f"] = "P"
_alnum["\U0001d410"] = "Q"
_alnum["\U0001d411"] = "R"
_alnum["\U0001d412"] = "S"
_alnum["\U0001d413"] = "T"
_alnum["\U0001d414"] = "U"
_alnum["\U0001d415"] = "V"
_alnum["\U0001d416"] = "W"
_alnum["\U0001d417"] = "X"
_alnum["\U0001d418"] = "Y"
_alnum["\U0001d419"] = "Z"
_alnum["\U0001d41a"] = "a"
_alnum["\U0001d41b"] = "b"
_alnum["\U0001d41c"] = "c"
_alnum["\U0001d41d"] = "d"
_alnum["\U0001d41e"] = "e"
_alnum["\U0001d41f"] = "f"
_alnum["\U0001d420"] = "g"
_alnum["\U0001d421"] = "h"
_alnum["\U0001d422"] = "i"
_alnum["\U0001d423"] = "j"
_alnum["\U0001d424"] = "k"
_alnum["\U0001d425"] = "l"
_alnum["\U0001d426"] = "m"
_alnum["\U0001d427"] = "n"
_alnum["\U0001d428"] = "o"
_alnum["\U0001d429"] = "p"
_alnum["\U0001d42a"] = "q"
_alnum["\U0001d42b"] = "r"
_alnum["\U0001d42c"] = "s"
_alnum["\U0001d42d"] = "t"
_alnum["\U0001d42e"] = "u"
_alnum["\U0001d42f"] = "v"
_alnum["\U0001d430"] = "w"
_alnum["\U0001d431"] = "x"
_alnum["\U0001d432"] = "y"
_alnum["\U0001d433"] = "z"
_alnum["\U0001d434"] = "A"
_alnum["\U0001d435"] = "B"
_alnum["\U0001d436"] = "C"
_alnum["\U0001d437"] = "D"
_alnum["\U0001d438"] = "E"
_alnum["\U0001d439"] = "F"
_alnum["\U0001d43a"] = "G"
_alnum["\U0001d43b"] = "H"
_alnum["\U0001d43c"] = "I"
_alnum["\U0001d43d"] = "J"
_alnum["\U0001d43e"] = "K"
_alnum["\U0001d43f"] = "L"
_alnum["\U0001d440"] = "M"
_alnum["\U0001d441"] = "N"
_alnum["\U0001d442"] = "O"
_alnum["\U0001d443"] = "P"
_alnum["\U0001d444"] = "Q"
_alnum["\U0001d445"] = "R"
_alnum["\U0001d446"] = "S"
_alnum["\U0001d447"] = "T"
_alnum["\U0001d448"] = "U"
_alnum["\U0001d449"] = "V"
_alnum["\U0001d44a"] = "W"
_alnum["\U0001d44b"] = "X"
_alnum["\U0001d44c"] = "Y"
_alnum["\U0001d44d"] = "Z"
_alnum["\U0001d44e"] = "a"
_alnum["\U0001d44f"] = "b"
_alnum["\U0001d450"] = "c"
_alnum["\U0001d451"] = "d"
_alnum["\U0001d452"] = "e"
_alnum["\U0001d453"] = "f"
_alnum["\U0001d454"] = "g"
_alnum["\U0001d456"] = "i"
_alnum["\U0001d457"] = "j"
_alnum["\U0001d458"] = "k"
_alnum["\U0001d459"] = "l"
_alnum["\U0001d45a"] = "m"
_alnum["\U0001d45b"] = "n"
_alnum["\U0001d45c"] = "o"
_alnum["\U0001d45d"] = "p"
_alnum["\U0001d45e"] = "q"
_alnum["\U0001d45f"] = "r"
_alnum["\U0001d460"] = "s"
_alnum["\U0001d461"] = "t"
_alnum["\U0001d462"] = "u"
_alnum["\U0001d463"] = "v"
_alnum["\U0001d464"] = "w"
_alnum["\U0001d465"] = "x"
_alnum["\U0001d466"] = "y"
_alnum["\U0001d467"] = "z"
_alnum["\U0001d468"] = "A"
_alnum["\U0001d469"] = "B"
_alnum["\U0001d46a"] = "C"
_alnum["\U0001d46b"] = "D"
_alnum["\U0001d46c"] = "E"
_alnum["\U0001d46d"] = "F"
_alnum["\U0001d46e"] = "G"
_alnum["\U0001d46f"] = "H"
_alnum["\U0001d470"] = "I"
_alnum["\U0001d471"] = "J"
_alnum["\U0001d472"] = "K"
_alnum["\U0001d473"] = "L"
_alnum["\U0001d474"] = "M"
_alnum["\U0001d475"] = "N"
_alnum["\U0001d476"] = "O"
_alnum["\U0001d477"] = "P"
_alnum["\U0001d478"] = "Q"
_alnum["\U0001d479"] = "R"
_alnum["\U0001d47a"] = "S"
_alnum["\U0001d47b"] = "T"
_alnum["\U0001d47c"] = "U"
_alnum["\U0001d47d"] = "V"
_alnum["\U0001d47e"] = "W"
_alnum["\U0001d47f"] = "X"
_alnum["\U0001d480"] = "Y"
_alnum["\U0001d481"] = "Z"
_alnum["\U0001d482"] = "a"
_alnum["\U0001d483"] = "b"
_alnum["\U0001d484"] = "c"
_alnum["\U0001d485"] = "d"
_alnum["\U0001d486"] = "e"
_alnum["\U0001d487"] = "f"
_alnum["\U0001d488"] = "g"
_alnum["\U0001d489"] = "h"
_alnum["\U0001d48a"] = "i"
_alnum["\U0001d48b"] = "j"
_alnum["\U0001d48c"] = "k"
_alnum["\U0001d48d"] = "l"
_alnum["\U0001d48e"] = "m"
_alnum["\U0001d48f"] = "n"
_alnum["\U0001d490"] = "o"
_alnum["\U0001d491"] = "p"
_alnum["\U0001d492"] = "q"
_alnum["\U0001d493"] = "r"
_alnum["\U0001d494"] = "s"
_alnum["\U0001d495"] = "t"
_alnum["\U0001d496"] = "u"
_alnum["\U0001d497"] = "v"
_alnum["\U0001d498"] = "w"
_alnum["\U0001d499"] = "x"
_alnum["\U0001d49a"] = "y"
_alnum["\U0001d49b"] = "z"
_alnum["\U0001d49c"] = "A"
_alnum["\U0001d49e"] = "C"
_alnum["\U0001d49f"] = "D"
_alnum["\U0001d4a2"] = "G"
_alnum["\U0001d4a5"] = "J"
_alnum["\U0001d4a6"] = "K"
_alnum["\U0001d4a9"] = "N"
_alnum["\U0001d4aa"] = "O"
_alnum["\U0001d4ab"] = "P"
_alnum["\U0001d4ac"] = "Q"
_alnum["\U0001d4ae"] = "S"
_alnum["\U0001d4af"] = "T"
_alnum["\U0001d4b0"] = "U"
_alnum["\U0001d4b1"] = "V"
_alnum["\U0001d4b2"] = "W"
_alnum["\U0001d4b3"] = "X"
_alnum["\U0001d4b4"] = "Y"
_alnum["\U0001d4b5"] = "Z"
_alnum["\U0001d4b6"] = "a"
_alnum["\U0001d4b7"] = "b"
_alnum["\U0001d4b8"] = "c"
_alnum["\U0001d4b9"] = "d"
_alnum["\U0001d4bb"] = "f"
_alnum["\U0001d4bd"] = "h"
_alnum["\U0001d4be"] = "i"
_alnum["\U0001d4bf"] = "j"
_alnum["\U0001d4c0"] = "k"
_alnum["\U0001d4c1"] = "l"
_alnum["\U0001d4c2"] = "m"
_alnum["\U0001d4c3"] = "n"
_alnum["\U0001d4c5"] = "p"
_alnum["\U0001d4c6"] = "q"
_alnum["\U0001d4c7"] = "r"
_alnum["\U0001d4c8"] = "s"
_alnum["\U0001d4c9"] = "t"
_alnum["\U0001d4ca"] = "u"
_alnum["\U0001d4cb"] = "v"
_alnum["\U0001d4cc"] = "w"
_alnum["\U0001d4cd"] = "x"
_alnum["\U0001d4ce"] = "y"
_alnum["\U0001d4cf"] = "z"
_alnum["\U0001d4d0"] = "A"
_alnum["\U0001d4d1"] = "B"
_alnum["\U0001d4d2"] = "C"
_alnum["\U0001d4d3"] = "D"
_alnum["\U0001d4d4"] = "E"
_alnum["\U0001d4d5"] = "F"
_alnum["\U0001d4d6"] = "G"
_alnum["\U0001d4d7"] = "H"
_alnum["\U0001d4d8"] = "I"
_alnum["\U0001d4d9"] = "J"
_alnum["\U0001d4da"] = "K"
_alnum["\U0001d4db"] = "L"
_alnum["\U0001d4dc"] = "M"
_alnum["\U0001d4dd"] = "N"
_alnum["\U0001d4de"] = "O"
_alnum["\U0001d4df"] = "P"
_alnum["\U0001d4e0"] = "Q"
_alnum["\U0001d4e1"] = "R"
_alnum["\U0001d4e2"] = "S"
_alnum["\U0001d4e3"] = "T"
_alnum["\U0001d4e4"] = "U"
_alnum["\U0001d4e5"] = "V"
_alnum["\U0001d4e6"] = "W"
_alnum["\U0001d4e7"] = "X"
_alnum["\U0001d4e8"] = "Y"
_alnum["\U0001d4e9"] = "Z"
_alnum["\U0001d4ea"] = "a"
_alnum["\U0001d4eb"] = "b"
_alnum["\U0001d4ec"] = "c"
_alnum["\U0001d4ed"] = "d"
_alnum["\U0001d4ee"] = "e"
_alnum["\U0001d4ef"] = "f"
_alnum["\U0001d4f0"] = "g"
_alnum["\U0001d4f1"] = "h"
_alnum["\U0001d4f2"] = "i"
_alnum["\U0001d4f3"] = "j"
_alnum["\U0001d4f4"] = "k"
_alnum["\U0001d4f5"] = "l"
_alnum["\U0001d4f6"] = "m"
_alnum["\U0001d4f7"] = "n"
_alnum["\U0001d4f8"] = "o"
_alnum["\U0001d4f9"] = "p"
_alnum["\U0001d4fa"] = "q"
_alnum["\U0001d4fb"] = "r"
_alnum["\U0001d4fc"] = "s"
_alnum["\U0001d4fd"] = "t"
_alnum["\U0001d4fe"] = "u"
_alnum["\U0001d4ff"] = "v"
_alnum["\U0001d500"] = "w"
_alnum["\U0001d501"] = "x"
_alnum["\U0001d502"] = "y"
_alnum["\U0001d503"] = "z"
_alnum["\U0001d504"] = "A"
_alnum["\U0001d505"] = "B"
_alnum["\U0001d507"] = "D"
_alnum["\U0001d508"] = "E"
_alnum["\U0001d509"] = "F"
_alnum["\U0001d50a"] = "G"
_alnum["\U0001d50d"] = "J"
_alnum["\U0001d50e"] = "K"
_alnum["\U0001d50f"] = "L"
_alnum["\U0001d510"] = "M"
_alnum["\U0001d511"] = "N"
_alnum["\U0001d512"] = "O"
_alnum["\U0001d513"] = "P"
_alnum["\U0001d514"] = "Q"
_alnum["\U0001d516"] = "S"
_alnum["\U0001d517"] = "T"
_alnum["\U0001d518"] = "U"
_alnum["\U0001d519"] = "V"
_alnum["\U0001d51a"] = "W"
_alnum["\U0001d51b"] = "X"
_alnum["\U0001d51c"] = "Y"
_alnum["\U0001d51e"] = "a"
_alnum["\U0001d51f"] = "b"
_alnum["\U0001d520"] = "c"
_alnum["\U0001d521"] = "d"
_alnum["\U0001d522"] = "e"
_alnum["\U0001d523"] = "f"
_alnum["\U0001d524"] = "g"
_alnum["\U0001d525"] = "h"
_alnum["\U0001d526"] = "i"
_alnum["\U0001d527"] = "j"
_alnum["\U0001d528"] = "k"
_alnum["\U0001d529"] = "l"
_alnum["\U0001d52a"] = "m"
_alnum["\U0001d52b"] = "n"
_alnum["\U0001d52c"] = "o"
_alnum["\U0001d52d"] = "p"
_alnum["\U0001d52e"] = "q"
_alnum["\U0001d52f"] = "r"
_alnum["\U0001d530"] = "s"
_alnum["\U0001d531"] = "t"
_alnum["\U0001d532"] = "u"
_alnum["\U0001d533"] = "v"
_alnum["\U0001d534"] = "w"
_alnum["\U0001d535"] = "x"
_alnum["\U0001d536"] = "y"
_alnum["\U0001d537"] = "z"
_alnum["\U0001d538"] = "A"
_alnum["\U0001d539"] = "B"
_alnum["\U0001d53b"] = "D"
_alnum["\U0001d53c"] = "E"
_alnum["\U0001d53d"] = "F"
_alnum["\U0001d53e"] = "G"
_alnum["\U0001d540"] = "I"
_alnum["\U0001d541"] = "J"
_alnum["\U0001d542"] = "K"
_alnum["\U0001d543"] = "L"
_alnum["\U0001d544"] = "M"
_alnum["\U0001d546"] = "O"
_alnum["\U0001d54a"] = "S"
_alnum["\U0001d54b"] = "T"
_alnum["\U0001d54c"] = "U"
_alnum["\U0001d54d"] = "V"
_alnum["\U0001d54e"] = "W"
_alnum["\U0001d54f"] = "X"
_alnum["\U0001d550"] = "Y"
_alnum["\U0001d552"] = "a"
_alnum["\U0001d553"] = "b"
_alnum["\U0001d554"] = "c"
_alnum["\U0001d555"] = "d"
_alnum["\U0001d556"] = "e"
_alnum["\U0001d557"] = "f"
_alnum["\U0001d558"] = "g"
_alnum["\U0001d559"] = "h"
_alnum["\U0001d55a"] = "i"
_alnum["\U0001d55b"] = "j"
_alnum["\U0001d55c"] = "k"
_alnum["\U0001d55d"] = "l"
_alnum["\U0001d55e"] = "m"
_alnum["\U0001d55f"] = "n"
_alnum["\U0001d560"] = "o"
_alnum["\U0001d561"] = "p"
_alnum["\U0001d562"] = "q"
_alnum["\U0001d563"] = "r"
_alnum["\U0001d564"] = "s"
_alnum["\U0001d565"] = "t"
_alnum["\U0001d566"] = "u"
_alnum["\U0001d567"] = "v"
_alnum["\U0001d568"] = "w"
_alnum["\U0001d569"] = "x"
_alnum["\U0001d56a"] = "y"
_alnum["\U0001d56b"] = "z"
_alnum["\U0001d56c"] = "A"
_alnum["\U0001d56d"] = "B"
_alnum["\U0001d56e"] = "C"
_alnum["\U0001d56f"] = "D"
_alnum["\U0001d570"] = "E"
_alnum["\U0001d571"] = "F"
_alnum["\U0001d572"] = "G"
_alnum["\U0001d573"] = "H"
_alnum["\U0001d574"] = "I"
_alnum["\U0001d575"] = "J"
_alnum["\U0001d576"] = "K"
_alnum["\U0001d577"] = "L"
_alnum["\U0001d578"] = "M"
_alnum["\U0001d579"] = "N"
_alnum["\U0001d57a"] = "O"
_alnum["\U0001d57b"] = "P"
_alnum["\U0001d57c"] = "Q"
_alnum["\U0001d57d"] = "R"
_alnum["\U0001d57e"] = "S"
_alnum["\U0001d57f"] = "T"
_alnum["\U0001d580"] = "U"
_alnum["\U0001d581"] = "V"
_alnum["\U0001d582"] = "W"
_alnum["\U0001d583"] = "X"
_alnum["\U0001d584"] = "Y"
_alnum["\U0001d585"] = "Z"
_alnum["\U0001d586"] = "a"
_alnum["\U0001d587"] = "b"
_alnum["\U0001d588"] = "c"
_alnum["\U0001d589"] = "d"
_alnum["\U0001d58a"] = "e"
_alnum["\U0001d58b"] = "f"
_alnum["\U0001d58c"] = "g"
_alnum["\U0001d58d"] = "h"
_alnum["\U0001d58e"] = "i"
_alnum["\U0001d58f"] = "j"
_alnum["\U0001d590"] = "k"
_alnum["\U0001d591"] = "l"
_alnum["\U0001d592"] = "m"
_alnum["\U0001d593"] = "n"
_alnum["\U0001d594"] = "o"
_alnum["\U0001d595"] = "p"
_alnum["\U0001d596"] = "q"
_alnum["\U0001d597"] = "r"
_alnum["\U0001d598"] = "s"
_alnum["\U0001d599"] = "t"
_alnum["\U0001d59a"] = "u"
_alnum["\U0001d59b"] = "v"
_alnum["\U0001d59c"] = "w"
_alnum["\U0001d59d"] = "x"
_alnum["\U0001d59e"] = "y"
_alnum["\U0001d59f"] = "z"
_alnum["\U0001d5a0"] = "A"
_alnum["\U0001d5a1"] = "B"
_alnum["\U0001d5a2"] = "C"
_alnum["\U0001d5a3"] = "D"
_alnum["\U0001d5a4"] = "E"
_alnum["\U0001d5a5"] = "F"
_alnum["\U0001d5a6"] = "G"
_alnum["\U0001d5a7"] = "H"
_alnum["\U0001d5a8"] = "I"
_alnum["\U0001d5a9"] = "J"
_alnum["\U0001d5aa"] = "K"
_alnum["\U0001d5ab"] = "L"
_alnum["\U0001d5ac"] = "M"
_alnum["\U0001d5ad"] = "N"
_alnum["\U0001d5ae"] = "O"
_alnum["\U0001d5af"] = "P"
_alnum["\U0001d5b0"] = "Q"
_alnum["\U0001d5b1"] = "R"
_alnum["\U0001d5b2"] = "S"
_alnum["\U0001d5b3"] = "T"
_alnum["\U0001d5b4"] = "U"
_alnum["\U0001d5b5"] = "V"
_alnum["\U0001d5b6"] = "W"
_alnum["\U0001d5b7"] = "X"
_alnum["\U0001d5b8"] = "Y"
_alnum["\U0001d5b9"] = "Z"
_alnum["\U0001d5ba"] = "a"
_alnum["\U0001d5bb"] = "b"
_alnum["\U0001d5bc"] = "c"
_alnum["\U0001d5bd"] = "d"
_alnum["\U0001d5be"] = "e"
_alnum["\U0001d5bf"] = "f"
_alnum["\U0001d5c0"] = "g"
_alnum["\U0001d5c1"] = "h"
_alnum["\U0001d5c2"] = "i"
_alnum["\U0001d5c3"] = "j"
_alnum["\U0001d5c4"] = "k"
_alnum["\U0001d5c5"] = "l"
_alnum["\U0001d5c6"] = "m"
_alnum["\U0001d5c7"] = "n"
_alnum["\U0001d5c8"] = "o"
_alnum["\U0001d5c9"] = "p"
_alnum["\U0001d5ca"] = "q"
_alnum["\U0001d5cb"] = "r"
_alnum["\U0001d5cc"] = "s"
_alnum["\U0001d5cd"] = "t"
_alnum["\U0001d5ce"] = "u"
_alnum["\U0001d5cf"] = "v"
_alnum["\U0001d5d0"] = "w"
_alnum["\U0001d5d1"] = "x"
_alnum["\U0001d5d2"] = "y"
_alnum["\U0001d5d3"] = "z"
_alnum["\U0001d5d4"] = "A"
_alnum["\U0001d5d5"] = "B"
_alnum["\U0001d5d6"] = "C"
_alnum["\U0001d5d7"] = "D"
_alnum["\U0001d5d8"] = "E"
_alnum["\U0001d5d9"] = "F"
_alnum["\U0001d5da"] = "G"
_alnum["\U0001d5db"] = "H"
_alnum["\U0001d5dc"] = "I"
_alnum["\U0001d5dd"] = "J"
_alnum["\U0001d5de"] = "K"
_alnum["\U0001d5df"] = "L"
_alnum["\U0001d5e0"] = "M"
_alnum["\U0001d5e1"] = "N"
_alnum["\U0001d5e2"] = "O"
_alnum["\U0001d5e3"] = "P"
_alnum["\U0001d5e4"] = "Q"
_alnum["\U0001d5e5"] = "R"
_alnum["\U0001d5e6"] = "S"
_alnum["\U0001d5e7"] = "T"
_alnum["\U0001d5e8"] = "U"
_alnum["\U0001d5e9"] = "V"
_alnum["\U0001d5ea"] = "W"
_alnum["\U0001d5eb"] = "X"
_alnum["\U0001d5ec"] = "Y"
_alnum["\U0001d5ed"] = "Z"
_alnum["\U0001d5ee"] = "a"
_alnum["\U0001d5ef"] = "b"
_alnum["\U0001d5f0"] = "c"
_alnum["\U0001d5f1"] = "d"
_alnum["\U0001d5f2"] = "e"
_alnum["\U0001d5f3"] = "f"
_alnum["\U0001d5f4"] = "g"
_alnum["\U0001d5f5"] = "h"
_alnum["\U0001d5f6"] = "i"
_alnum["\U0001d5f7"] = "j"
_alnum["\U0001d5f8"] = "k"
_alnum["\U0001d5f9"] = "l"
_alnum["\U0001d5fa"] = "m"
_alnum["\U0001d5fb"] = "n"
_alnum["\U0001d5fc"] = "o"
_alnum["\U0001d5fd"] = "p"
_alnum["\U0001d5fe"] = "q"
_alnum["\U0001d5ff"] = "r"
_alnum["\U0001d600"] = "s"
_alnum["\U0001d601"] = "t"
_alnum["\U0001d602"] = "u"
_alnum["\U0001d603"] = "v"
_alnum["\U0001d604"] = "w"
_alnum["\U0001d605"] = "x"
_alnum["\U0001d606"] = "y"
_alnum["\U0001d607"] = "z"
_alnum["\U0001d608"] = "A"
_alnum["\U0001d609"] = "B"
_alnum["\U0001d60a"] = "C"
_alnum["\U0001d60b"] = "D"
_alnum["\U0001d60c"] = "E"
_alnum["\U0001d60d"] = "F"
_alnum["\U0001d60e"] = "G"
_alnum["\U0001d60f"] = "H"
_alnum["\U0001d610"] = "I"
_alnum["\U0001d611"] = "J"
_alnum["\U0001d612"] = "K"
_alnum["\U0001d613"] = "L"
_alnum["\U0001d614"] = "M"
_alnum["\U0001d615"] = "N"
_alnum["\U0001d616"] = "O"
_alnum["\U0001d617"] = "P"
_alnum["\U0001d618"] = "Q"
_alnum["\U0001d619"] = "R"
_alnum["\U0001d61a"] = "S"
_alnum["\U0001d61b"] = "T"
_alnum["\U0001d61c"] = "U"
_alnum["\U0001d61d"] = "V"
_alnum["\U0001d61e"] = "W"
_alnum["\U0001d61f"] = "X"
_alnum["\U0001d620"] = "Y"
_alnum["\U0001d621"] = "Z"
_alnum["\U0001d622"] = "a"
_alnum["\U0001d623"] = "b"
_alnum["\U0001d624"] = "c"
_alnum["\U0001d625"] = "d"
_alnum["\U0001d626"] = "e"
_alnum["\U0001d627"] = "f"
_alnum["\U0001d628"] = "g"
_alnum["\U0001d629"] = "h"
_alnum["\U0001d62a"] = "i"
_alnum["\U0001d62b"] = "j"
_alnum["\U0001d62c"] = "k"
_alnum["\U0001d62d"] = "l"
_alnum["\U0001d62e"] = "m"
_alnum["\U0001d62f"] = "n"
_alnum["\U0001d630"] = "o"
_alnum["\U0001d631"] = "p"
_alnum["\U0001d632"] = "q"
_alnum["\U0001d633"] = "r"
_alnum["\U0001d634"] = "s"
_alnum["\U0001d635"] = "t"
_alnum["\U0001d636"] = "u"
_alnum["\U0001d637"] = "v"
_alnum["\U0001d638"] = "w"
_alnum["\U0001d639"] = "x"
_alnum["\U0001d63a"] = "y"
_alnum["\U0001d63b"] = "z"
_alnum["\U0001d63c"] = "A"
_alnum["\U0001d63d"] = "B"
_alnum["\U0001d63e"] = "C"
_alnum["\U0001d63f"] = "D"
_alnum["\U0001d640"] = "E"
_alnum["\U0001d641"] = "F"
_alnum["\U0001d642"] = "G"
_alnum["\U0001d643"] = "H"
_alnum["\U0001d644"] = "I"
_alnum["\U0001d645"] = "J"
_alnum["\U0001d646"] = "K"
_alnum["\U0001d647"] = "L"
_alnum["\U0001d648"] = "M"
_alnum["\U0001d649"] = "N"
_alnum["\U0001d64a"] = "O"
_alnum["\U0001d64b"] = "P"
_alnum["\U0001d64c"] = "Q"
_alnum["\U0001d64d"] = "R"
_alnum["\U0001d64e"] = "S"
_alnum["\U0001d64f"] = "T"
_alnum["\U0001d650"] = "U"
_alnum["\U0001d651"] = "V"
_alnum["\U0001d652"] = "W"
_alnum["\U0001d653"] = "X"
_alnum["\U0001d654"] = "Y"
_alnum["\U0001d655"] = "Z"
_alnum["\U0001d656"] = "a"
_alnum["\U0001d657"] = "b"
_alnum["\U0001d658"] = "c"
_alnum["\U0001d659"] = "d"
_alnum["\U0001d65a"] = "e"
_alnum["\U0001d65b"] = "f"
_alnum["\U0001d65c"] = "g"
_alnum["\U0001d65d"] = "h"
_alnum["\U0001d65e"] = "i"
_alnum["\U0001d65f"] = "j"
_alnum["\U0001d660"] = "k"
_alnum["\U0001d661"] = "l"
_alnum["\U0001d662"] = "m"
_alnum["\U0001d663"] = "n"
_alnum["\U0001d664"] = "o"
_alnum["\U0001d665"] = "p"
_alnum["\U0001d666"] = "q"
_alnum["\U0001d667"] = "r"
_alnum["\U0001d668"] = "s"
_alnum["\U0001d669"] = "t"
_alnum["\U0001d66a"] = "u"
_alnum["\U0001d66b"] = "v"
_alnum["\U0001d66c"] = "w"
_alnum["\U0001d66d"] = "x"
_alnum["\U0001d66e"] = "y"
_alnum["\U0001d66f"] = "z"
_alnum["\U0001d670"] = "A"
_alnum["\U0001d671"] = "B"
_alnum["\U0001d672"] = "C"
_alnum["\U0001d673"] = "D"
_alnum["\U0001d674"] = "E"
_alnum["\U0001d675"] = "F"
_alnum["\U0001d676"] = "G"
_alnum["\U0001d677"] = "H"
_alnum["\U0001d678"] = "I"
_alnum["\U0001d679"] = "J"
_alnum["\U0001d67a"] = "K"
_alnum["\U0001d67b"] = "L"
_alnum["\U0001d67c"] = "M"
_alnum["\U0001d67d"] = "N"
_alnum["\U0001d67e"] = "O"
_alnum["\U0001d67f"] = "P"
_alnum["\U0001d680"] = "Q"
_alnum["\U0001d681"] = "R"
_alnum["\U0001d682"] = "S"
_alnum["\U0001d683"] = "T"
_alnum["\U0001d684"] = "U"
_alnum["\U0001d685"] = "V"
_alnum["\U0001d686"] = "W"
_alnum["\U0001d687"] = "X"
_alnum["\U0001d688"] = "Y"
_alnum["\U0001d689"] = "Z"
_alnum["\U0001d68a"] = "a"
_alnum["\U0001d68b"] = "b"
_alnum["\U0001d68c"] = "c"
_alnum["\U0001d68d"] = "d"
_alnum["\U0001d68e"] = "e"
_alnum["\U0001d68f"] = "f"
_alnum["\U0001d690"] = "g"
_alnum["\U0001d691"] = "h"
_alnum["\U0001d692"] = "i"
_alnum["\U0001d693"] = "j"
_alnum["\U0001d694"] = "k"
_alnum["\U0001d695"] = "l"
_alnum["\U0001d696"] = "m"
_alnum["\U0001d697"] = "n"
_alnum["\U0001d698"] = "o"
_alnum["\U0001d699"] = "p"
_alnum["\U0001d69a"] = "q"
_alnum["\U0001d69b"] = "r"
_alnum["\U0001d69c"] = "s"
_alnum["\U0001d69d"] = "t"
_alnum["\U0001d69e"] = "u"
_alnum["\U0001d69f"] = "v"
_alnum["\U0001d6a0"] = "w"
_alnum["\U0001d6a1"] = "x"
_alnum["\U0001d6a2"] = "y"
_alnum["\U0001d6a3"] = "z"
_alnum["\U0001d6a4"] = "i"
_alnum["\U0001d6a5"] = "j"
_alnum["\U0001d6a8"] = "Α"
_alnum["\U0001d6a9"] = "Β"
_alnum["\U0001d6aa"] = "Γ"
_alnum["\U0001d6ab"] = "Δ"
_alnum["\U0001d6ac"] = "Ε"
_alnum["\U0001d6ad"] = "Ζ"
_alnum["\U0001d6ae"] = "Η"
_alnum["\U0001d6af"] = "ϴ"
_alnum["\U0001d6b0"] = "Ι"
_alnum["\U0001d6b1"] = "Κ"
_alnum["\U0001d6b2"] = "Λ"
_alnum["\U0001d6b3"] = "Μ"
_alnum["\U0001d6b4"] = "Ν"
_alnum["\U0001d6b5"] = "Ξ"
_alnum["\U0001d6b6"] = "Ο"
_alnum["\U0001d6b7"] = "Π"
_alnum["\U0001d6b8"] = "Ρ"
_alnum["\U0001d6b9"] = "ϴ"
_alnum["\U0001d6ba"] = "Σ"
_alnum["\U0001d6bb"] = "Τ"
_alnum["\U0001d6bc"] = "Υ"
_alnum["\U0001d6bd"] = "Φ"
_alnum["\U0001d6be"] = "Χ"
_alnum["\U0001d6bf"] = "Ψ"
_alnum["\U0001d6c0"] = "Ω"
_alnum["\U0001d6c1"] = "∇"
_alnum["\U0001d6c2"] = "α"
_alnum["\U0001d6c3"] = "β"
_alnum["\U0001d6c4"] = "γ"
_alnum["\U0001d6c5"] = "δ"
_alnum["\U0001d6c6"] = "ε"
_alnum["\U0001d6c7"] = "ζ"
_alnum["\U0001d6c8"] = "η"
_alnum["\U0001d6c9"] = "θ"
_alnum["\U0001d6ca"] = "ι"
_alnum["\U0001d6cb"] = "κ"
_alnum["\U0001d6cc"] = "λ"
_alnum["\U0001d6cd"] = "μ"
_alnum["\U0001d6ce"] = "ν"
_alnum["\U0001d6cf"] = "ξ"
_alnum["\U0001d6d0"] = "ο"
_alnum["\U0001d6d1"] = "π"
_alnum["\U0001d6d2"] = "ρ"
_alnum["\U0001d6d3"] = "ς"
_alnum["\U0001d6d4"] = "σ"
_alnum["\U0001d6d5"] = "τ"
_alnum["\U0001d6d6"] = "υ"
_alnum["\U0001d6d7"] = "φ"
_alnum["\U0001d6d8"] = "χ"
_alnum["\U0001d6d9"] = "ψ"
_alnum["\U0001d6da"] = "ω"
_alnum["\U0001d6db"] = "∂"
_alnum["\U0001d6dc"] = "ϵ"
_alnum["\U0001d6dd"] = "ϑ"
_alnum["\U0001d6de"] = "ϰ"
_alnum["\U0001d6df"] = "ϕ"
_alnum["\U0001d6e0"] = "ϱ"
_alnum["\U0001d6e1"] = "ϖ"
_alnum["\U0001d6e2"] = "Α"
_alnum["\U0001d6e3"] = "Β"
_alnum["\U0001d6e4"] = "Γ"
_alnum["\U0001d6e5"] = "Δ"
_alnum["\U0001d6e6"] = "Ε"
_alnum["\U0001d6e7"] = "Ζ"
_alnum["\U0001d6e8"] = "Η"
_alnum["\U0001d6e9"] = "ϴ"
_alnum["\U0001d6ea"] = "Ι"
_alnum["\U0001d6eb"] = "Κ"
_alnum["\U0001d6ec"] = "Λ"
_alnum["\U0001d6ed"] = "Μ"
_alnum["\U0001d6ee"] = "Ν"
_alnum["\U0001d6ef"] = "Ξ"
_alnum["\U0001d6f0"] = "Ο"
_alnum["\U0001d6f1"] = "Π"
_alnum["\U0001d6f2"] = "Ρ"
_alnum["\U0001d6f3"] = "ϴ"
_alnum["\U0001d6f4"] = "Σ"
_alnum["\U0001d6f5"] = "Τ"
_alnum["\U0001d6f6"] = "Υ"
_alnum["\U0001d6f7"] = "Φ"
_alnum["\U0001d6f8"] = "Χ"
_alnum["\U0001d6f9"] = "Ψ"
_alnum["\U0001d6fa"] = "Ω"
_alnum["\U0001d6fb"] = "∇"
_alnum["\U0001d6fc"] = "α"
_alnum["\U0001d6fd"] = "β"
_alnum["\U0001d6fe"] = "γ"
_alnum["\U0001d6ff"] = "δ"
_alnum["\U0001d700"] = "ε"
_alnum["\U0001d701"] = "ζ"
_alnum["\U0001d702"] = "η"
_alnum["\U0001d703"] = "θ"
_alnum["\U0001d704"] = "ι"
_alnum["\U0001d705"] = "κ"
_alnum["\U0001d706"] = "λ"
_alnum["\U0001d707"] = "μ"
_alnum["\U0001d708"] = "ν"
_alnum["\U0001d709"] = "ξ"
_alnum["\U0001d70a"] = "ο"
_alnum["\U0001d70b"] = "π"
_alnum["\U0001d70c"] = "ρ"
_alnum["\U0001d70d"] = "ς"
_alnum["\U0001d70e"] = "σ"
_alnum["\U0001d70f"] = "τ"
_alnum["\U0001d710"] = "υ"
_alnum["\U0001d711"] = "φ"
_alnum["\U0001d712"] = "χ"
_alnum["\U0001d713"] = "ψ"
_alnum["\U0001d714"] = "ω"
_alnum["\U0001d715"] = "∂"
_alnum["\U0001d716"] = "ϵ"
_alnum["\U0001d717"] = "ϑ"
_alnum["\U0001d718"] = "ϰ"
_alnum["\U0001d719"] = "ϕ"
_alnum["\U0001d71a"] = "ϱ"
_alnum["\U0001d71b"] = "ϖ"
_alnum["\U0001d71c"] = "Α"
_alnum["\U0001d71d"] = "Β"
_alnum["\U0001d71e"] = "Γ"
_alnum["\U0001d71f"] = "Δ"
_alnum["\U0001d720"] = "Ε"
_alnum["\U0001d721"] = "Ζ"
_alnum["\U0001d722"] = "Η"
_alnum["\U0001d723"] = "ϴ"
_alnum["\U0001d724"] = "Ι"
_alnum["\U0001d725"] = "Κ"
_alnum["\U0001d726"] = "Λ"
_alnum["\U0001d727"] = "Μ"
_alnum["\U0001d728"] = "Ν"
_alnum["\U0001d729"] = "Ξ"
_alnum["\U0001d72a"] = "Ο"
_alnum["\U0001d72b"] = "Π"
_alnum["\U0001d72c"] = "Ρ"
_alnum["\U0001d72d"] = "ϴ"
_alnum["\U0001d72e"] = "Σ"
_alnum["\U0001d72f"] = "Τ"
_alnum["\U0001d730"] = "Υ"
_alnum["\U0001d731"] = "Φ"
_alnum["\U0001d732"] = "Χ"
_alnum["\U0001d733"] = "Ψ"
_alnum["\U0001d734"] = "Ω"
_alnum["\U0001d735"] = "∇"
_alnum["\U0001d736"] = "α"
_alnum["\U0001d737"] = "β"
_alnum["\U0001d738"] = "γ"
_alnum["\U0001d739"] = "δ"
_alnum["\U0001d73a"] = "ε"
_alnum["\U0001d73b"] = "ζ"
_alnum["\U0001d73c"] = "η"
_alnum["\U0001d73d"] = "θ"
_alnum["\U0001d73e"] = "ι"
_alnum["\U0001d73f"] = "κ"
_alnum["\U0001d740"] = "λ"
_alnum["\U0001d741"] = "μ"
_alnum["\U0001d742"] = "ν"
_alnum["\U0001d743"] = "ξ"
_alnum["\U0001d744"] = "ο"
_alnum["\U0001d745"] = "π"
_alnum["\U0001d746"] = "ρ"
_alnum["\U0001d747"] = "ς"
_alnum["\U0001d748"] = "σ"
_alnum["\U0001d749"] = "τ"
_alnum["\U0001d74a"] = "υ"
_alnum["\U0001d74b"] = "φ"
_alnum["\U0001d74c"] = "χ"
_alnum["\U0001d74d"] = "ψ"
_alnum["\U0001d74e"] = "ω"
_alnum["\U0001d74f"] = "∂"
_alnum["\U0001d750"] = "ϵ"
_alnum["\U0001d751"] = "ϑ"
_alnum["\U0001d752"] = "ϰ"
_alnum["\U0001d753"] = "ϕ"
_alnum["\U0001d754"] = "ϱ"
_alnum["\U0001d755"] = "ϖ"
_alnum["\U0001d756"] = "Α"
_alnum["\U0001d757"] = "Β"
_alnum["\U0001d758"] = "Γ"
_alnum["\U0001d759"] = "Δ"
_alnum["\U0001d75a"] = "Ε"
_alnum["\U0001d75b"] = "Ζ"
_alnum["\U0001d75c"] = "Η"
_alnum["\U0001d75d"] = "ϴ"
_alnum["\U0001d75e"] = "Ι"
_alnum["\U0001d75f"] = "Κ"
_alnum["\U0001d760"] = "Λ"
_alnum["\U0001d761"] = "Μ"
_alnum["\U0001d762"] = "Ν"
_alnum["\U0001d763"] = "Ξ"
_alnum["\U0001d764"] = "Ο"
_alnum["\U0001d765"] = "Π"
_alnum["\U0001d766"] = "Ρ"
_alnum["\U0001d767"] = "ϴ"
_alnum["\U0001d768"] = "Σ"
_alnum["\U0001d769"] = "Τ"
_alnum["\U0001d76a"] = "Υ"
_alnum["\U0001d76b"] = "Φ"
_alnum["\U0001d76c"] = "Χ"
_alnum["\U0001d76d"] = "Ψ"
_alnum["\U0001d76e"] = "Ω"
_alnum["\U0001d76f"] = "∇"
_alnum["\U0001d770"] = "α"
_alnum["\U0001d771"] = "β"
_alnum["\U0001d772"] = "γ"
_alnum["\U0001d773"] = "δ"
_alnum["\U0001d774"] = "ε"
_alnum["\U0001d775"] = "ζ"
_alnum["\U0001d776"] = "η"
_alnum["\U0001d777"] = "θ"
_alnum["\U0001d778"] = "ι"
_alnum["\U0001d779"] = "κ"
_alnum["\U0001d77a"] = "λ"
_alnum["\U0001d77b"] = "μ"
_alnum["\U0001d77c"] = "ν"
_alnum["\U0001d77d"] = "ξ"
_alnum["\U0001d77e"] = "ο"
_alnum["\U0001d77f"] = "π"
_alnum["\U0001d780"] = "ρ"
_alnum["\U0001d781"] = "ς"
_alnum["\U0001d782"] = "σ"
_alnum["\U0001d783"] = "τ"
_alnum["\U0001d784"] = "υ"
_alnum["\U0001d785"] = "φ"
_alnum["\U0001d786"] = "χ"
_alnum["\U0001d787"] = "ψ"
_alnum["\U0001d788"] = "ω"
_alnum["\U0001d789"] = "∂"
_alnum["\U0001d78a"] = "ϵ"
_alnum["\U0001d78b"] = "ϑ"
_alnum["\U0001d78c"] = "ϰ"
_alnum["\U0001d78d"] = "ϕ"
_alnum["\U0001d78e"] = "ϱ"
_alnum["\U0001d78f"] = "ϖ"
_alnum["\U0001d790"] = "Α"
_alnum["\U0001d791"] = "Β"
_alnum["\U0001d792"] = "Γ"
_alnum["\U0001d793"] = "Δ"
_alnum["\U0001d794"] = "Ε"
_alnum["\U0001d795"] = "Ζ"
_alnum["\U0001d796"] = "Η"
_alnum["\U0001d797"] = "ϴ"
_alnum["\U0001d798"] = "Ι"
_alnum["\U0001d799"] = "Κ"
_alnum["\U0001d79a"] = "Λ"
_alnum["\U0001d79b"] = "Μ"
_alnum["\U0001d79c"] = "Ν"
_alnum["\U0001d79d"] = "Ξ"
_alnum["\U0001d79e"] = "Ο"
_alnum["\U0001d79f"] = "Π"
_alnum["\U0001d7a0"] = "Ρ"
_alnum["\U0001d7a1"] = "ϴ"
_alnum["\U0001d7a2"] = "Σ"
_alnum["\U0001d7a3"] = "Τ"
_alnum["\U0001d7a4"] = "Υ"
_alnum["\U0001d7a5"] = "Φ"
_alnum["\U0001d7a6"] = "Χ"
_alnum["\U0001d7a7"] = "Ψ"
_alnum["\U0001d7a8"] = "Ω"
_alnum["\U0001d7a9"] = "∇"
_alnum["\U0001d7aa"] = "α"
_alnum["\U0001d7ab"] = "β"
_alnum["\U0001d7ac"] = "γ"
_alnum["\U0001d7ad"] = "δ"
_alnum["\U0001d7ae"] = "ε"
_alnum["\U0001d7af"] = "ζ"
_alnum["\U0001d7b0"] = "η"
_alnum["\U0001d7b1"] = "θ"
_alnum["\U0001d7b2"] = "ι"
_alnum["\U0001d7b3"] = "κ"
_alnum["\U0001d7b4"] = "λ"
_alnum["\U0001d7b5"] = "μ"
_alnum["\U0001d7b6"] = "ν"
_alnum["\U0001d7b7"] = "ξ"
_alnum["\U0001d7b8"] = "ο"
_alnum["\U0001d7b9"] = "π"
_alnum["\U0001d7ba"] = "ρ"
_alnum["\U0001d7bb"] = "ς"
_alnum["\U0001d7bc"] = "σ"
_alnum["\U0001d7bd"] = "τ"
_alnum["\U0001d7be"] = "υ"
_alnum["\U0001d7bf"] = "φ"
_alnum["\U0001d7c0"] = "χ"
_alnum["\U0001d7c1"] = "ψ"
_alnum["\U0001d7c2"] = "ω"
_alnum["\U0001d7c3"] = "∂"
_alnum["\U0001d7c4"] = "ϵ"
_alnum["\U0001d7c5"] = "ϑ"
_alnum["\U0001d7c6"] = "ϰ"
_alnum["\U0001d7c7"] = "ϕ"
_alnum["\U0001d7c8"] = "ϱ"
_alnum["\U0001d7c9"] = "ϖ"
_alnum["\U0001d7ca"] = "Ϝ"
_alnum["\U0001d7cb"] = "ϝ"
_alnum["\U0001d7ce"] = "0"
_alnum["\U0001d7cf"] = "1"
_alnum["\U0001d7d0"] = "2"
_alnum["\U0001d7d1"] = "3"
_alnum["\U0001d7d2"] = "4"
_alnum["\U0001d7d3"] = "5"
_alnum["\U0001d7d4"] = "6"
_alnum["\U0001d7d5"] = "7"
_alnum["\U0001d7d6"] = "8"
_alnum["\U0001d7d7"] = "9"
_alnum["\U0001d7d8"] = "0"
_alnum["\U0001d7d9"] = "1"
_alnum["\U0001d7da"] = "2"
_alnum["\U0001d7db"] = "3"
_alnum["\U0001d7dc"] = "4"
_alnum["\U0001d7dd"] = "5"
_alnum["\U0001d7de"] = "6"
_alnum["\U0001d7df"] = "7"
_alnum["\U0001d7e0"] = "8"
_alnum["\U0001d7e1"] = "9"
_alnum["\U0001d7e2"] = "0"
_alnum["\U0001d7e3"] = "1"
_alnum["\U0001d7e4"] = "2"
_alnum["\U0001d7e5"] = "3"
_alnum["\U0001d7e6"] = "4"
_alnum["\U0001d7e7"] = "5"
_alnum["\U0001d7e8"] = "6"
_alnum["\U0001d7e9"] = "7"
_alnum["\U0001d7ea"] = "8"
_alnum["\U0001d7eb"] = "9"
_alnum["\U0001d7ec"] = "0"
_alnum["\U0001d7ed"] = "1"
_alnum["\U0001d7ee"] = "2"
_alnum["\U0001d7ef"] = "3"
_alnum["\U0001d7f0"] = "4"
_alnum["\U0001d7f1"] = "5"
_alnum["\U0001d7f2"] = "6"
_alnum["\U0001d7f3"] = "7"
_alnum["\U0001d7f4"] = "8"
_alnum["\U0001d7f5"] = "9"
_alnum["\U0001d7f6"] = "0"
_alnum["\U0001d7f7"] = "1"
_alnum["\U0001d7f8"] = "2"
_alnum["\U0001d7f9"] = "3"
_alnum["\U0001d7fa"] = "4"
_alnum["\U0001d7fb"] = "5"
_alnum["\U0001d7fc"] = "6"
_alnum["\U0001d7fd"] = "7"
_alnum["\U0001d7fe"] = "8"
_alnum["\U0001d7ff"] = "9"

_bold = range(0x1D400, 0x1D434)
_italic = range(0x1D434, 0x1D468)
_bold_italic = range(0x1D468, 0x1D49C)
_script = range(0x1D49C, 0x1D4D0)
_bold_script = range(0x1D4D0, 0x1D504)
_fraktur = range(0x1D504, 0x1D538)
_double_struck = range(0x1D538, 0x1D56C)
_bold_fraktur = range(0x1D56C, 0x1D5A0)
_sans_serif = range(0x1D5A0, 0x1D5D4)
_sans_serif_bold = range(0x1D5D4, 0x1D608)
_sans_serif_italic = range(0x1D608, 0x1D63C)
_sans_serif_bold_italic = range(0x1D63C, 0x1D670)
_monospace = range(0x1D670, 0x1D6A4)
_dotless = range(0x1D6A4, 0x1D6A8)
_bold_greek = range(0x1D6A8, 0x1D6E2)
_italic_greek = range(0x1D6E2, 0x1D71C)
_bold_italic_greek = range(0x1D71C, 0x1D756)
_sans_serif_bold_greek = range(0x1D756, 0x1D790)
_sans_serif_bold_italic_greek = range(0x1D790, 0x1D7CA)
_bold_greek_digamma = range(0x1D7CA, 0x1D7CC)
_bold_digits = range(0x1D7CE, 0x1D7D8)
_double_struck_digits = range(0x1D7D8, 0x1D7E2)
_sans_serif_digits = range(0x1D7E2, 0x1D7EC)
_sans_serif_bold_digits = range(0x1D7EC, 0x1D7F6)
_monospace_digits = range(0x1D7F6, 0x1D800)
_other_double_struck = [0x2102, 0x210D, 0x2115, 0x2119, 0x211A, 0x211D, 0x2124]
_other_fraktur = [0x212D, 0x210C, 0x2111, 0x211C, 0x2128]
_other_italic = [0x210E]
_other_script = [
    0x212C,
    0x2130,
    0x2131,
    0x210B,
    0x2110,
    0x2112,
    0x2133,
    0x211B,
    0x212F,
    0x210A,
    0x2134,
]

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
BOLD = C_("math symbol", "bold %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
ITALIC = C_("math symbol", "italic %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
BOLD_ITALIC = C_("math symbol", "bold italic %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
SCRIPT = C_("math symbol", "script %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
BOLD_SCRIPT = C_("math symbol", "bold script %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
FRAKTUR = C_("math symbol", "fraktur %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
DOUBLE_STRUCK = C_("math symbol", "double-struck %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
BOLD_FRAKTUR = C_("math symbol", "bold fraktur %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
SANS_SERIF = C_("math symbol", "sans-serif %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
SANS_SERIF_BOLD = C_("math symbol", "sans-serif bold %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
SANS_SERIF_ITALIC = C_("math symbol", "sans-serif italic %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
SANS_SERIF_BOLD_ITALIC = C_("math symbol", "sans-serif bold italic %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
MONOSPACE = C_("math symbol", "monospace %s")

# Translators: Unicode has a large set of characters consisting of a common
# alphanumeric symbol and a style. For instance, character 1D400 is a bold A,
# 1D468 is a bold italic A, 1D4D0 is a bold script A,, etc., etc. These styles
# can have specific meanings in mathematics and thus should be spoken along
# with the alphanumeric character. However, given the vast quantity of these
# characters, string substitution is being used with the substituted string
# being a single alphanumeric character. The full set of symbols can be found
# at http://www.unicode.org/charts/PDF/U1D400.pdf.
DOTLESS = C_("math symbol", "dotless %s")

# Translators: this is the spoken representation for the character '←' (U+2190)
_arrows["\u2190"] = C_("math symbol", "left arrow")

# Translators: this is the spoken representation for the character '↑' (U+2191)
_arrows["\u2191"] = C_("math symbol", "up arrow")

# Translators: this is the spoken representation for the character '→' (U+2192)
_arrows["\u2192"] = C_("math symbol", "right arrow")

# Translators: this is the spoken representation for the character '↓' (U+2193)
_arrows["\u2193"] = C_("math symbol", "down arrow")

# Translators: this is the spoken representation for the character '↔' (U+2194)
_arrows["\u2194"] = C_("math symbol", "left right arrow")

# Translators: this is the spoken representation for the character '↕' (U+2195)
_arrows["\u2195"] = C_("math symbol", "up down arrow")

# Translators: this is the spoken representation for the character '↖' (U+2196)
_arrows["\u2196"] = C_("math symbol", "north west arrow")

# Translators: this is the spoken representation for the character '↗' (U+2197)
_arrows["\u2197"] = C_("math symbol", "north east arrow")

# Translators: this is the spoken representation for the character '↘' (U+2198)
_arrows["\u2198"] = C_("math symbol", "south east arrow")

# Translators: this is the spoken representation for the character '↤' (U+21a4)
_arrows["\u21a4"] = C_("math symbol", "left arrow from bar")

# Translators: this is the spoken representation for the character '↥' (U+21a5)
_arrows["\u21a5"] = C_("math symbol", "up arrow from bar")

# Translators: this is the spoken representation for the character '↦' (U+21a6)
_arrows["\u21a6"] = C_("math symbol", "right arrow from bar")

# Translators: this is the spoken representation for the character '↧' (U+21a7)
_arrows["\u21a7"] = C_("math symbol", "down arrow from bar")

# Translators: this is the spoken representation for the character '⇐' (U+21d0)
_arrows["\u21d0"] = C_("math symbol", "left double arrow")

# Translators: this is the spoken representation for the character '⇑' (U+21d1)
_arrows["\u21d1"] = C_("math symbol", "up double arrow")

# Translators: this is the spoken representation for the character '⇒' (U+21d2)
_arrows["\u21d2"] = C_("math symbol", "right double arrow")

# Translators: this is the spoken representation for the character '⇓' (U+21d3)
_arrows["\u21d3"] = C_("math symbol", "down double arrow")

# Translators: this is the spoken representation for the character '⇔' (U+21d4)
_arrows["\u21d4"] = C_("math symbol", "left right double arrow")

# Translators: this is the spoken representation for the character '⇕' (U+21d5)
_arrows["\u21d5"] = C_("math symbol", "up down double arrow")

# Translators: this is the spoken representation for the character '⇖' (U+21d6)
_arrows["\u21d6"] = C_("math symbol", "north west double arrow")

# Translators: this is the spoken representation for the character '⇗' (U+21d7)
_arrows["\u21d7"] = C_("math symbol", "north east double arrow")

# Translators: this is the spoken representation for the character '⇘' (U+21d8)
_arrows["\u21d8"] = C_("math symbol", "south east double arrow")

# Translators: this is the spoken representation for the character '⇙' (U+21d9)
_arrows["\u21d9"] = C_("math symbol", "south west double arrow")

# Translators: this is the spoken representation for the character '➔' (U+2794)
_arrows["\u2794"] = C_("math symbol", "right-pointing arrow")

# Translators: this is the spoken representation for the character '➢' (U+27a2)
_arrows["\u27a2"] = C_("math symbol", "right-pointing arrowhead")

# Translators: this is the spoken word for the character '-' (U+002d) when used
# as a MathML operator.
_operators["\u002d"] = C_("math symbol", "minus")

# Translators: this is the spoken word for the character '<' (U+003c) when used
# as a MathML operator.
_operators["\u003c"] = C_("math symbol", "less than")

# Translators: this is the spoken word for the character '>' (U+003e) when used
# as a MathML operator.
_operators["\u003e"] = C_("math symbol", "greater than")

# Translators: this is the spoken word for the character '^' (U+005e) when used
# as a MathML operator.
_operators["\u005e"] = C_("math symbol", "circumflex")

# Translators: this is the spoken word for the character 'ˇ' (U+02c7) when used
# as a MathML operator.
_operators["\u02c7"] = C_("math symbol", "háček")

# Translators: this is the spoken word for the character '˘' (U+02d8) when used
# as a MathML operator.
_operators["\u02d8"] = C_("math symbol", "breve")

# Translators: this is the spoken word for the character '˙' (U+02d9) when used
# as a MathML operator.
_operators["\u02d9"] = C_("math symbol", "dot")

# Translators: this is the spoken word for the character '‖' (U+2016) when used
# as a MathML operator.
_operators["\u2016"] = C_("math symbol", "double vertical line")

# Translators: this is the spoken representation for the character '…' (U+2026)
_operators["\u2026"] = C_("math symbol", "horizontal ellipsis")

# Translators: this is the spoken representation for the character '∀' (U+2200)
_operators["\u2200"] = C_("math symbol", "for all")

# Translators: this is the spoken representation for the character '∁' (U+2201)
_operators["\u2201"] = C_("math symbol", "complement")

# Translators: this is the spoken representation for the character '∂' (U+2202)
_operators["\u2202"] = C_("math symbol", "partial differential")

# Translators: this is the spoken representation for the character '∃' (U+2203)
_operators["\u2203"] = C_("math symbol", "there exists")

# Translators: this is the spoken representation for the character '∄' (U+2204)
_operators["\u2204"] = C_("math symbol", "there does not exist")

# Translators: this is the spoken representation for the character '∅' (U+2205)
_operators["\u2205"] = C_("math symbol", "empty set")

# Translators: this is the spoken representation for the character '∆' (U+2206)
_operators["\u2206"] = C_("math symbol", "increment")

# Translators: this is the spoken representation for the character '∇' (U+2207)
_operators["\u2207"] = C_("math symbol", "nabla")

# Translators: this is the spoken representation for the character '∈' (U+2208)
_operators["\u2208"] = C_("math symbol", "element of")

# Translators: this is the spoken representation for the character '∉' (U+2209)
_operators["\u2209"] = C_("math symbol", "not an element of")

# Translators: this is the spoken representation for the character '∊' (U+220a)
_operators["\u220a"] = C_("math symbol", "small element of")

# Translators: this is the spoken representation for the character '∋' (U+220b)
_operators["\u220b"] = C_("math symbol", "contains as a member")

# Translators: this is the spoken representation for the character '∌' (U+220c)
_operators["\u220c"] = C_("math symbol", "does not contain as a member")

# Translators: this is the spoken representation for the character '∍' (U+220d)
_operators["\u220d"] = C_("math symbol", "small contains as a member")

# Translators: this is the spoken representation for the character '∎' (U+220e)
_operators["\u220e"] = C_("math symbol", "end of proof")

# Translators: this is the spoken representation for the character '∏' (U+220f)
_operators["\u220f"] = C_("math symbol", "product")

# Translators: this is the spoken representation for the character '∐' (U+2210)
_operators["\u2210"] = C_("math symbol", "coproduct")

# Translators: this is the spoken representation for the character '∑' (U+2211)
_operators["\u2211"] = C_("math symbol", "sum")

# Translators: this is the spoken representation for the character '−' (U+2212)
_operators["\u2212"] = C_("math symbol", "minus")

# Translators: this is the spoken representation for the character '∓' (U+2213)
_operators["\u2213"] = C_("math symbol", "minus or plus")

# Translators: this is the spoken representation for the character '∔' (U+2214)
_operators["\u2214"] = C_("math symbol", "dot plus")

# Translators: this is the spoken representation for the character '∕' (U+2215)
_operators["\u2215"] = C_("math symbol", "division slash")

# Translators: this is the spoken representation for the character '∖' (U+2216)
_operators["\u2216"] = C_("math symbol", "set minus")

# Translators: this is the spoken representation for the character '∗' (U+2217)
_operators["\u2217"] = C_("math symbol", "asterisk operator")

# Translators: this is the spoken representation for the character '∘' (U+2218)
_operators["\u2218"] = C_("math symbol", "ring operator")

# Translators: this is the spoken representation for the character '∙' (U+2219)
_operators["\u2219"] = C_("math symbol", "bullet operator")

# Translators: this is the spoken representation for the character '√' (U+221a)
_operators["\u221a"] = C_("math symbol", "square root")

# Translators: this is the spoken representation for the character '∛' (U+221b)
_operators["\u221b"] = C_("math symbol", "cube root")

# Translators: this is the spoken representation for the character '∜' (U+221c)
_operators["\u221c"] = C_("math symbol", "fourth root")

# Translators: this is the spoken representation for the character '∝' (U+221d)
_operators["\u221d"] = C_("math symbol", "proportional to")

# Translators: this is the spoken representation for the character '∞' (U+221e)
_operators["\u221e"] = C_("math symbol", "infinity")

# Translators: this is the spoken representation for the character '∟' (U+221f)
_operators["\u221f"] = C_("math symbol", "right angle")

# Translators: this is the spoken representation for the character '∠' (U+2220)
_operators["\u2220"] = C_("math symbol", "angle")

# Translators: this is the spoken representation for the character '∡' (U+2221)
_operators["\u2221"] = C_("math symbol", "measured angle")

# Translators: this is the spoken representation for the character '∢' (U+2222)
_operators["\u2222"] = C_("math symbol", "spherical angle")

# Translators: this is the spoken representation for the character '∣' (U+2223)
_operators["\u2223"] = C_("math symbol", "divides")

# Translators: this is the spoken representation for the character '∤' (U+2224)
_operators["\u2224"] = C_("math symbol", "does not divide")

# Translators: this is the spoken representation for the character '∥' (U+2225)
_operators["\u2225"] = C_("math symbol", "parallel to")

# Translators: this is the spoken representation for the character '∦' (U+2226)
_operators["\u2226"] = C_("math symbol", "not parallel to")

# Translators: this is the spoken representation for the character '∧' (U+2227)
_operators["\u2227"] = C_("math symbol", "logical and")

# Translators: this is the spoken representation for the character '∨' (U+2228)
_operators["\u2228"] = C_("math symbol", "logical or")

# Translators: this is the spoken representation for the character '∩' (U+2229)
_operators["\u2229"] = C_("math symbol", "intersection")

# Translators: this is the spoken representation for the character '∪' (U+222a)
_operators["\u222a"] = C_("math symbol", "union")

# Translators: this is the spoken representation for the character '∫' (U+222b)
_operators["\u222b"] = C_("math symbol", "integral")

# Translators: this is the spoken representation for the character '∬' (U+222c)
_operators["\u222c"] = C_("math symbol", "double integral")

# Translators: this is the spoken representation for the character '∭' (U+222d)
_operators["\u222d"] = C_("math symbol", "triple integral")

# Translators: this is the spoken representation for the character '∮' (U+222e)
_operators["\u222e"] = C_("math symbol", "contour integral")

# Translators: this is the spoken representation for the character '∯' (U+222f)
_operators["\u222f"] = C_("math symbol", "surface integral")

# Translators: this is the spoken representation for the character '∰' (U+2230)
_operators["\u2230"] = C_("math symbol", "volume integral")

# Translators: this is the spoken representation for the character '∱' (U+2231)
_operators["\u2231"] = C_("math symbol", "clockwise integral")

# Translators: this is the spoken representation for the character '∲' (U+2232)
_operators["\u2232"] = C_("math symbol", "clockwise contour integral")

# Translators: this is the spoken representation for the character '∳' (U+2233)
_operators["\u2233"] = C_("math symbol", "anticlockwise contour integral")

# Translators: this is the spoken representation for the character '∴' (U+2234)
_operators["\u2234"] = C_("math symbol", "therefore")

# Translators: this is the spoken representation for the character '∵' (U+2235)
_operators["\u2235"] = C_("math symbol", "because")

# Translators: this is the spoken representation for the character '∶' (U+2236)
_operators["\u2236"] = C_("math symbol", "ratio")

# Translators: this is the spoken representation for the character '∷' (U+2237)
_operators["\u2237"] = C_("math symbol", "proportion")

# Translators: this is the spoken representation for the character '∸' (U+2238)
_operators["\u2238"] = C_("math symbol", "dot minus")

# Translators: this is the spoken representation for the character '∹' (U+2239)
_operators["\u2239"] = C_("math symbol", "excess")

# Translators: this is the spoken representation for the character '∺' (U+223a)
_operators["\u223a"] = C_("math symbol", "geometric proportion")

# Translators: this is the spoken representation for the character '∻' (U+223b)
_operators["\u223b"] = C_("math symbol", "homothetic")

# Translators: this is the spoken representation for the character '∼' (U+223c)
_operators["\u223c"] = C_("math symbol", "tilde")

# Translators: this is the spoken representation for the character '∽' (U+223d)
_operators["\u223d"] = C_("math symbol", "reversed tilde")

# Translators: this is the spoken representation for the character '∾' (U+223e)
_operators["\u223e"] = C_("math symbol", "inverted lazy S")

# Translators: this is the spoken representation for the character '∿' (U+223f)
_operators["\u223f"] = C_("math symbol", "sine wave")

# Translators: this is the spoken representation for the character '≀' (U+2240)
_operators["\u2240"] = C_("math symbol", "wreath product")

# Translators: this is the spoken representation for the character '≁' (U+2241)
_operators["\u2241"] = C_("math symbol", "not tilde")

# Translators: this is the spoken representation for the character '≂' (U+2242)
_operators["\u2242"] = C_("math symbol", "minus tilde")

# Translators: this is the spoken representation for the character '≃' (U+2243)
_operators["\u2243"] = C_("math symbol", "asymptotically equal to")

# Translators: this is the spoken representation for the character '≄' (U+2244)
_operators["\u2244"] = C_("math symbol", "not asymptotically equal to")

# Translators: this is the spoken representation for the character '≅' (U+2245)
_operators["\u2245"] = C_("math symbol", "approximately equal to")

# Translators: this is the spoken representation for the character '≆' (U+2246)
_operators["\u2246"] = C_("math symbol", "approximately but not actually equal to")

# Translators: this is the spoken representation for the character '≇' (U+2247)
_operators["\u2247"] = C_("math symbol", "neither approximately nor actually equal to")

# Translators: this is the spoken representation for the character '≈' (U+2248)
_operators["\u2248"] = C_("math symbol", "almost equal to")

# Translators: this is the spoken representation for the character '≉' (U+2249)
_operators["\u2249"] = C_("math symbol", "not almost equal to")

# Translators: this is the spoken representation for the character '≊' (U+224a)
_operators["\u224a"] = C_("math symbol", "almost equal or equal to")

# Translators: this is the spoken representation for the character '≋' (U+224b)
_operators["\u224b"] = C_("math symbol", "triple tilde")

# Translators: this is the spoken representation for the character '≌' (U+224c)
_operators["\u224c"] = C_("math symbol", "all equal to")

# Translators: this is the spoken representation for the character '≍' (U+224d)
_operators["\u224d"] = C_("math symbol", "equivalent to")

# Translators: this is the spoken representation for the character '≎' (U+224e)
_operators["\u224e"] = C_("math symbol", "geometrically equivalent to")

# Translators: this is the spoken representation for the character '≏' (U+224f)
_operators["\u224f"] = C_("math symbol", "difference between")

# Translators: this is the spoken representation for the character '≐' (U+2250)
_operators["\u2250"] = C_("math symbol", "approaches the limit")

# Translators: this is the spoken representation for the character '≑' (U+2251)
_operators["\u2251"] = C_("math symbol", "geometrically equal to")

# Translators: this is the spoken representation for the character '≒' (U+2252)
_operators["\u2252"] = C_("math symbol", "approximately equal to or the image of")

# Translators: this is the spoken representation for the character '≓' (U+2253)
_operators["\u2253"] = C_("math symbol", "image of or approximately equal to")

# Translators: this is the spoken representation for the character '≔' (U+2254)
_operators["\u2254"] = C_("math symbol", "colon equals")

# Translators: this is the spoken representation for the character '≕' (U+2255)
_operators["\u2255"] = C_("math symbol", "equals colon")

# Translators: this is the spoken representation for the character '≖' (U+2256)
_operators["\u2256"] = C_("math symbol", "ring in equal to")

# Translators: this is the spoken representation for the character '≗' (U+2257)
_operators["\u2257"] = C_("math symbol", "ring equal to")

# Translators: this is the spoken representation for the character '≘' (U+2258)
_operators["\u2258"] = C_("math symbol", "corresponds to")

# Translators: this is the spoken representation for the character '≙' (U+2259)
_operators["\u2259"] = C_("math symbol", "estimates")

# Translators: this is the spoken representation for the character '≚' (U+225a)
_operators["\u225a"] = C_("math symbol", "equiangular to")

# Translators: this is the spoken representation for the character '≛' (U+225b)
_operators["\u225b"] = C_("math symbol", "star equals")

# Translators: this is the spoken representation for the character '≜' (U+225c)
_operators["\u225c"] = C_("math symbol", "delta equal to")

# Translators: this is the spoken representation for the character '≝' (U+225d)
_operators["\u225d"] = C_("math symbol", "equal to by definition")

# Translators: this is the spoken representation for the character '≞' (U+225e)
_operators["\u225e"] = C_("math symbol", "measured by")

# Translators: this is the spoken representation for the character '≟' (U+225f)
_operators["\u225f"] = C_("math symbol", "questioned equal to")

# Translators: this is the spoken representation for the character '≠' (U+2260)
_operators["\u2260"] = C_("math symbol", "not equal to")

# Translators: this is the spoken representation for the character '≡' (U+2261)
_operators["\u2261"] = C_("math symbol", "identical to")

# Translators: this is the spoken representation for the character '≢' (U+2262)
_operators["\u2262"] = C_("math symbol", "not identical to")

# Translators: this is the spoken representation for the character '≣' (U+2263)
_operators["\u2263"] = C_("math symbol", "strictly equivalent to")

# Translators: this is the spoken representation for the character '≤' (U+2264)
_operators["\u2264"] = C_("math symbol", "less than or equal to")

# Translators: this is the spoken representation for the character '≥' (U+2265)
_operators["\u2265"] = C_("math symbol", "greater than or equal to")

# Translators: this is the spoken representation for the character '≦' (U+2266)
_operators["\u2266"] = C_("math symbol", "less than over equal to")

# Translators: this is the spoken representation for the character '≧' (U+2267)
_operators["\u2267"] = C_("math symbol", "greater than over equal to")

# Translators: this is the spoken representation for the character '≨' (U+2268)
_operators["\u2268"] = C_("math symbol", "less than but not equal to")

# Translators: this is the spoken representation for the character '≩' (U+2269)
_operators["\u2269"] = C_("math symbol", "greater than but not equal to")

# Translators: this is the spoken representation for the character '≪' (U+226a)
_operators["\u226a"] = C_("math symbol", "much less than")

# Translators: this is the spoken representation for the character '≫' (U+226b)
_operators["\u226b"] = C_("math symbol", "much greater than")

# Translators: this is the spoken representation for the character '≬' (U+226c)
_operators["\u226c"] = C_("math symbol", "between")

# Translators: this is the spoken representation for the character '≭' (U+226d)
_operators["\u226d"] = C_("math symbol", "not equivalent to")

# Translators: this is the spoken representation for the character '≮' (U+226e)
_operators["\u226e"] = C_("math symbol", "not less than")

# Translators: this is the spoken representation for the character '≯' (U+226f)
_operators["\u226f"] = C_("math symbol", "not greater than")

# Translators: this is the spoken representation for the character '≰' (U+2270)
_operators["\u2270"] = C_("math symbol", "neither less than nor equal to")

# Translators: this is the spoken representation for the character '≱' (U+2271)
_operators["\u2271"] = C_("math symbol", "neither greater than nor equal to")

# Translators: this is the spoken representation for the character '≲' (U+2272)
_operators["\u2272"] = C_("math symbol", "less than or equivalent to")

# Translators: this is the spoken representation for the character '≳' (U+2273)
_operators["\u2273"] = C_("math symbol", "greater than or equivalent to")

# Translators: this is the spoken representation for the character '≴' (U+2274)
_operators["\u2274"] = C_("math symbol", "neither less than nor equivalent to")

# Translators: this is the spoken representation for the character '≵' (U+2275)
_operators["\u2275"] = C_("math symbol", "neither greater than nor equivalent to")

# Translators: this is the spoken representation for the character '≶' (U+2276)
_operators["\u2276"] = C_("math symbol", "less than or greater than")

# Translators: this is the spoken representation for the character '≷' (U+2277)
_operators["\u2277"] = C_("math symbol", "greater than or less than")

# Translators: this is the spoken representation for the character '≸' (U+2278)
_operators["\u2278"] = C_("math symbol", "neither less than nor greater than")

# Translators: this is the spoken representation for the character '≹' (U+2279)
_operators["\u2279"] = C_("math symbol", "neither greater than nor less than")

# Translators: this is the spoken representation for the character '≺' (U+227a)
_operators["\u227a"] = C_("math symbol", "precedes")

# Translators: this is the spoken representation for the character '≻' (U+227b)
_operators["\u227b"] = C_("math symbol", "succeeds")

# Translators: this is the spoken representation for the character '≼' (U+227c)
_operators["\u227c"] = C_("math symbol", "precedes or equal to")

# Translators: this is the spoken representation for the character '≽' (U+227d)
_operators["\u227d"] = C_("math symbol", "succeeds or equal to")

# Translators: this is the spoken representation for the character '≾' (U+227e)
_operators["\u227e"] = C_("math symbol", "precedes or equivalent to")

# Translators: this is the spoken representation for the character '≿' (U+227f)
_operators["\u227f"] = C_("math symbol", "succeeds or equivalent to")

# Translators: this is the spoken representation for the character '⊀' (U+2280)
_operators["\u2280"] = C_("math symbol", "does not precede")

# Translators: this is the spoken representation for the character '⊁' (U+2281)
_operators["\u2281"] = C_("math symbol", "does not succeed")

# Translators: this is the spoken representation for the character '⊂' (U+2282)
_operators["\u2282"] = C_("math symbol", "subset of")

# Translators: this is the spoken representation for the character '⊃' (U+2283)
_operators["\u2283"] = C_("math symbol", "superset of")

# Translators: this is the spoken representation for the character '⊄' (U+2284)
_operators["\u2284"] = C_("math symbol", "not a subset of")

# Translators: this is the spoken representation for the character '⊅' (U+2285)
_operators["\u2285"] = C_("math symbol", "not a superset of")

# Translators: this is the spoken representation for the character '⊆' (U+2286)
_operators["\u2286"] = C_("math symbol", "subset of or equal to")

# Translators: this is the spoken representation for the character '⊇' (U+2287)
_operators["\u2287"] = C_("math symbol", "superset of or equal to")

# Translators: this is the spoken representation for the character '⊈' (U+2288)
_operators["\u2288"] = C_("math symbol", "neither a subset of nor equal to")

# Translators: this is the spoken representation for the character '⊉' (U+2289)
_operators["\u2289"] = C_("math symbol", "neither a superset of nor equal to")

# Translators: this is the spoken representation for the character '⊊' (U+228a)
_operators["\u228a"] = C_("math symbol", "subset of with not equal to")

# Translators: this is the spoken representation for the character '⊋' (U+228b)
_operators["\u228b"] = C_("math symbol", "superset of with not equal to")

# Translators: this is the spoken representation for the character '⊌' (U+228c)
_operators["\u228c"] = C_("math symbol", "multiset")

# Translators: this is the spoken representation for the character '⊍' (U+228d)
_operators["\u228d"] = C_("math symbol", "multiset multiplication")

# Translators: this is the spoken representation for the character '⊎' (U+228e)
_operators["\u228e"] = C_("math symbol", "multiset union")

# Translators: this is the spoken representation for the character '⊏' (U+228f)
_operators["\u228f"] = C_("math symbol", "square image of")

# Translators: this is the spoken representation for the character '⊐' (U+2290)
_operators["\u2290"] = C_("math symbol", "square original of")

# Translators: this is the spoken representation for the character '⊑' (U+2291)
_operators["\u2291"] = C_("math symbol", "square image of or equal to")

# Translators: this is the spoken representation for the character '⊒' (U+2292)
_operators["\u2292"] = C_("math symbol", "square original of or equal to")

# Translators: this is the spoken representation for the character '⊓' (U+2293)
_operators["\u2293"] = C_("math symbol", "square cap")

# Translators: this is the spoken representation for the character '⊔' (U+2294)
_operators["\u2294"] = C_("math symbol", "square cup")

# Translators: this is the spoken representation for the character '⊕' (U+2295)
_operators["\u2295"] = C_("math symbol", "circled plus")

# Translators: this is the spoken representation for the character '⊖' (U+2296)
_operators["\u2296"] = C_("math symbol", "circled minus")

# Translators: this is the spoken representation for the character '⊗' (U+2297)
_operators["\u2297"] = C_("math symbol", "circled times")

# Translators: this is the spoken representation for the character '⊘' (U+2298)
_operators["\u2298"] = C_("math symbol", "circled division slash")

# Translators: this is the spoken representation for the character '⊙' (U+2299)
_operators["\u2299"] = C_("math symbol", "circled dot operator")

# Translators: this is the spoken representation for the character '⊚' (U+229a)
_operators["\u229a"] = C_("math symbol", "circled ring operator")

# Translators: this is the spoken representation for the character '⊛' (U+229b)
_operators["\u229b"] = C_("math symbol", "circled asterisk operator")

# Translators: this is the spoken representation for the character '⊜' (U+229c)
_operators["\u229c"] = C_("math symbol", "circled equals")

# Translators: this is the spoken representation for the character '⊝' (U+229d)
_operators["\u229d"] = C_("math symbol", "circled dash")

# Translators: this is the spoken representation for the character '⊞' (U+229e)
_operators["\u229e"] = C_("math symbol", "squared plus")

# Translators: this is the spoken representation for the character '⊟' (U+229f)
_operators["\u229f"] = C_("math symbol", "squared minus")

# Translators: this is the spoken representation for the character '⊠' (U+22a0)
_operators["\u22a0"] = C_("math symbol", "squared times")

# Translators: this is the spoken representation for the character '⊡' (U+22a1)
_operators["\u22a1"] = C_("math symbol", "squared dot operator")

# Translators: this is the spoken representation for the character '⊢' (U+22a2)
_operators["\u22a2"] = C_("math symbol", "right tack")

# Translators: this is the spoken representation for the character '⊣' (U+22a3)
_operators["\u22a3"] = C_("math symbol", "left tack")

# Translators: this is the spoken representation for the character '⊤' (U+22a4)
_operators["\u22a4"] = C_("math symbol", "down tack")

# Translators: this is the spoken representation for the character '⊥' (U+22a5)
_operators["\u22a5"] = C_("math symbol", "up tack")

# Translators: this is the spoken representation for the character '⊦' (U+22a6)
_operators["\u22a6"] = C_("math symbol", "assertion")

# Translators: this is the spoken representation for the character '⊧' (U+22a7)
_operators["\u22a7"] = C_("math symbol", "models")

# Translators: this is the spoken representation for the character '⊨' (U+22a8)
_operators["\u22a8"] = C_("math symbol", "true")

# Translators: this is the spoken representation for the character '⊩' (U+22a9)
_operators["\u22a9"] = C_("math symbol", "forces")

# Translators: this is the spoken representation for the character '⊪' (U+22aa)
_operators["\u22aa"] = C_("math symbol", "triple vertical bar right turnstile")

# Translators: this is the spoken representation for the character '⊫' (U+22ab)
_operators["\u22ab"] = C_("math symbol", "double vertical bar double right turnstile")

# Translators: this is the spoken representation for the character '⊬' (U+22ac)
_operators["\u22ac"] = C_("math symbol", "does not prove")

# Translators: this is the spoken representation for the character '⊭' (U+22ad)
_operators["\u22ad"] = C_("math symbol", "not true")

# Translators: this is the spoken representation for the character '⊮' (U+22ae)
_operators["\u22ae"] = C_("math symbol", "does not force")

# Translators: this is the spoken representation for the character '⊯' (U+22af)
_operators["\u22af"] = C_("math symbol", "negated double vertical bar double right turnstile")

# Translators: this is the spoken representation for the character '⊰' (U+22b0)
_operators["\u22b0"] = C_("math symbol", "precedes under relation")

# Translators: this is the spoken representation for the character '⊱' (U+22b1)
_operators["\u22b1"] = C_("math symbol", "succeeds under relation")

# Translators: this is the spoken representation for the character '⊲' (U+22b2)
_operators["\u22b2"] = C_("math symbol", "normal subgroup of")

# Translators: this is the spoken representation for the character '⊳' (U+22b3)
_operators["\u22b3"] = C_("math symbol", "contains as normal subgroup")

# Translators: this is the spoken representation for the character '⊴' (U+22b4)
_operators["\u22b4"] = C_("math symbol", "normal subgroup of or equal to")

# Translators: this is the spoken representation for the character '⊵' (U+22b5)
_operators["\u22b5"] = C_("math symbol", "contains as normal subgroup of or equal to")

# Translators: this is the spoken representation for the character '⊶' (U+22b6)
_operators["\u22b6"] = C_("math symbol", "original of")

# Translators: this is the spoken representation for the character '⊷' (U+22b7)
_operators["\u22b7"] = C_("math symbol", "image of")

# Translators: this is the spoken representation for the character '⊸' (U+22b8)
_operators["\u22b8"] = C_("math symbol", "multimap")

# Translators: this is the spoken representation for the character '⊹' (U+22b9)
_operators["\u22b9"] = C_("math symbol", "hermitian conjugate matrix")

# Translators: this is the spoken representation for the character '⊺' (U+22ba)
_operators["\u22ba"] = C_("math symbol", "intercalate")

# Translators: this is the spoken representation for the character '⊻' (U+22bb)
_operators["\u22bb"] = C_("math symbol", "xor")

# Translators: this is the spoken representation for the character '⊼' (U+22bc)
_operators["\u22bc"] = C_("math symbol", "nand")

# Translators: this is the spoken representation for the character '⊽' (U+22bd)
_operators["\u22bd"] = C_("math symbol", "nor")

# Translators: this is the spoken representation for the character '⊾' (U+22be)
_operators["\u22be"] = C_("math symbol", "right angle with arc")

# Translators: this is the spoken representation for the character '⊿' (U+22bf)
_operators["\u22bf"] = C_("math symbol", "right triangle")

# Translators: this is the spoken representation for the character '⋀' (U+22c0)
_operators["\u22c0"] = C_("math symbol", "logical and")

# Translators: this is the spoken representation for the character '⋁' (U+22c1)
_operators["\u22c1"] = C_("math symbol", "logical or")

# Translators: this is the spoken representation for the character '⋂' (U+22c2)
_operators["\u22c2"] = C_("math symbol", "intersection")

# Translators: this is the spoken representation for the character '⋃' (U+22c3)
_operators["\u22c3"] = C_("math symbol", "union")

# Translators: this is the spoken representation for the character '⋄' (U+22c4)
_operators["\u22c4"] = C_("math symbol", "diamond operator")

# Translators: this is the spoken representation for the character '⋅' (U+22c5)
_operators["\u22c5"] = C_("math symbol", "dot operator")

# Translators: this is the spoken representation for the character '⋆' (U+22c6)
_operators["\u22c6"] = C_("math symbol", "star operator")

# Translators: this is the spoken representation for the character '⋇' (U+22c7)
_operators["\u22c7"] = C_("math symbol", "division times")

# Translators: this is the spoken representation for the character '⋈' (U+22c8)
_operators["\u22c8"] = C_("math symbol", "bowtie")

# Translators: this is the spoken representation for the character '⋉' (U+22c9)
_operators["\u22c9"] = C_("math symbol", "left normal factor semidirect product")

# Translators: this is the spoken representation for the character '⋊' (U+22ca)
_operators["\u22ca"] = C_("math symbol", "right normal factor semidirect product")

# Translators: this is the spoken representation for the character '⋋' (U+22cb)
_operators["\u22cb"] = C_("math symbol", "left semidirect product")

# Translators: this is the spoken representation for the character '⋌' (U+22cc)
_operators["\u22cc"] = C_("math symbol", "right semidirect product")

# Translators: this is the spoken representation for the character '⋍' (U+22cd)
_operators["\u22cd"] = C_("math symbol", "reversed tilde equals")

# Translators: this is the spoken representation for the character '⋎' (U+22ce)
_operators["\u22ce"] = C_("math symbol", "curly logical or")

# Translators: this is the spoken representation for the character '⋏' (U+22cf)
_operators["\u22cf"] = C_("math symbol", "curly logical and")

# Translators: this is the spoken representation for the character '⋐' (U+22d0)
_operators["\u22d0"] = C_("math symbol", "double subset")

# Translators: this is the spoken representation for the character '⋑' (U+22d1)
_operators["\u22d1"] = C_("math symbol", "double superset")

# Translators: this is the spoken representation for the character '⋒' (U+22d2)
_operators["\u22d2"] = C_("math symbol", "double intersection")

# Translators: this is the spoken representation for the character '⋓' (U+22d3)
_operators["\u22d3"] = C_("math symbol", "double union")

# Translators: this is the spoken representation for the character '⋔' (U+22d4)
_operators["\u22d4"] = C_("math symbol", "pitchfork")

# Translators: this is the spoken representation for the character '⋕' (U+22d5)
_operators["\u22d5"] = C_("math symbol", "equal and parallel to")

# Translators: this is the spoken representation for the character '⋖' (U+22d6)
_operators["\u22d6"] = C_("math symbol", "less than with dot")

# Translators: this is the spoken representation for the character '⋗' (U+22d7)
_operators["\u22d7"] = C_("math symbol", "greater than with dot")

# Translators: this is the spoken representation for the character '⋘' (U+22d8)
_operators["\u22d8"] = C_("math symbol", "very much less than")

# Translators: this is the spoken representation for the character '⋙' (U+22d9)
_operators["\u22d9"] = C_("math symbol", "very much greater than")

# Translators: this is the spoken representation for the character '⋚' (U+22da)
_operators["\u22da"] = C_("math symbol", "less than equal to or greater than")

# Translators: this is the spoken representation for the character '⋛' (U+22db)
_operators["\u22db"] = C_("math symbol", "greater than equal to or less than")

# Translators: this is the spoken representation for the character '⋜' (U+22dc)
_operators["\u22dc"] = C_("math symbol", "equal to or less than")

# Translators: this is the spoken representation for the character '⋝' (U+22dd)
_operators["\u22dd"] = C_("math symbol", "equal to or greater than")

# Translators: this is the spoken representation for the character '⋝' (U+22de)
_operators["\u22de"] = C_("math symbol", "equal to or precedes")

# Translators: this is the spoken representation for the character '⋝' (U+22df)
_operators["\u22df"] = C_("math symbol", "equal to or succeeds")

# Translators: this is the spoken representation for the character '⋠' (U+22e0)
_operators["\u22e0"] = C_("math symbol", "does not precede or equal")

# Translators: this is the spoken representation for the character '⋡' (U+22e1)
_operators["\u22e1"] = C_("math symbol", "does not succeed or equal")

# Translators: this is the spoken representation for the character '⋢' (U+22e2)
_operators["\u22e2"] = C_("math symbol", "not square image of or equal to")

# Translators: this is the spoken representation for the character '⋣' (U+22e3)
_operators["\u22e3"] = C_("math symbol", "not square original of or equal to")

# Translators: this is the spoken representation for the character '⋤' (U+22e4)
_operators["\u22e4"] = C_("math symbol", "square image of or not equal to")

# Translators: this is the spoken representation for the character '⋥' (U+22e5)
_operators["\u22e5"] = C_("math symbol", "square original of or not equal to")

# Translators: this is the spoken representation for the character '⋦' (U+22e6)
_operators["\u22e6"] = C_("math symbol", "less than but not equivalent to")

# Translators: this is the spoken representation for the character '⋧' (U+22e7)
_operators["\u22e7"] = C_("math symbol", "greater than but not equivalent to")

# Translators: this is the spoken representation for the character '⋨' (U+22e8)
_operators["\u22e8"] = C_("math symbol", "precedes but not equivalent to")

# Translators: this is the spoken representation for the character '⋩' (U+22e9)
_operators["\u22e9"] = C_("math symbol", "succeeds but not equivalent to")

# Translators: this is the spoken representation for the character '⋪' (U+22ea)
_operators["\u22ea"] = C_("math symbol", "not normal subgroup of")

# Translators: this is the spoken representation for the character '⋫' (U+22eb)
_operators["\u22eb"] = C_("math symbol", "does not contain as normal subgroup")

# Translators: this is the spoken representation for the character '⋬' (U+22ec)
_operators["\u22ec"] = C_("math symbol", "not normal subgroup of or equal to")

# Translators: this is the spoken representation for the character '⋭' (U+22ed)
_operators["\u22ed"] = C_("math symbol", "does not contain as normal subgroup or equal")

# Translators: this is the spoken representation for the character '⋮' (U+22ee)
_operators["\u22ee"] = C_("math symbol", "vertical ellipsis")

# Translators: this is the spoken representation for the character '⋯' (U+22ef)
_operators["\u22ef"] = C_("math symbol", "midline horizontal ellipsis")

# Translators: this is the spoken representation for the character '⋰' (U+22f0)
_operators["\u22f0"] = C_("math symbol", "up right diagonal ellipsis")

# Translators: this is the spoken representation for the character '⋱' (U+22f1)
_operators["\u22f1"] = C_("math symbol", "down right diagonal ellipsis")

# Translators: this is the spoken representation for the character '⋲' (U+22f2)
_operators["\u22f2"] = C_("math symbol", "element of with long horizontal stroke")

# Translators: this is the spoken representation for the character '⋳' (U+22f3)
_operators["\u22f3"] = C_("math symbol", "element of with vertical bar at end of horizontal stroke")

# Translators: this is the spoken representation for the character '⋴' (U+22f4)
_operators["\u22f4"] = C_(
    "math symbol",
    "small element of with vertical bar at end of horizontal stroke",
)

# Translators: this is the spoken representation for the character '⋵' (U+22f5)
_operators["\u22f5"] = C_("math symbol", "element of with dot above")

# Translators: this is the spoken representation for the character '⋶' (U+22f6)
_operators["\u22f6"] = C_("math symbol", "element of with overbar")

# Translators: this is the spoken representation for the character '⋷' (U+22f7)
_operators["\u22f7"] = C_("math symbol", "small element of with overbar")

# Translators: this is the spoken representation for the character '⋸' (U+22f8)
_operators["\u22f8"] = C_("math symbol", "element of with underbar")

# Translators: this is the spoken representation for the character '⋹' (U+22f9)
_operators["\u22f9"] = C_("math symbol", "element of with two horizontal strokes")

# Translators: this is the spoken representation for the character '⋺' (U+22fa)
_operators["\u22fa"] = C_("math symbol", "contains with long horizontal stroke")

# Translators: this is the spoken representation for the character '⋻' (U+22fb)
_operators["\u22fb"] = C_("math symbol", "contains with vertical bar at end of horizontal stroke")

# Translators: this is the spoken representation for the character '⋼' (U+22fc)
_operators["\u22fc"] = C_(
    "math symbol",
    "small contains with vertical bar at end of horizontal stroke",
)

# Translators: this is the spoken representation for the character '⋽' (U+22fd)
_operators["\u22fd"] = C_("math symbol", "contains with overbar")

# Translators: this is the spoken representation for the character '⋾' (U+22fe)
_operators["\u22fe"] = C_("math symbol", "small contains with overbar")

# Translators: this is the spoken representation for the character '⋿' (U+22ff)
_operators["\u22ff"] = C_("math symbol", "z notation bag membership")

# Translators: this is the spoken representation for the character '⌈' (U+2308)
_operators["\u2308"] = C_("math symbol", "left ceiling")

# Translators: this is the spoken representation for the character '⌉' (U+2309)
_operators["\u2309"] = C_("math symbol", "right ceiling")

# Translators: this is the spoken representation for the character '⌊' (U+230a)
_operators["\u230a"] = C_("math symbol", "left floor")

# Translators: this is the spoken representation for the character '⌋' (U+230b)
_operators["\u230b"] = C_("math symbol", "right floor")

# Translators: this is the spoken representation for the character '⏞' (U+23de)
_operators["\u23de"] = C_("math symbol", "top brace")

# Translators: this is the spoken representation for the character '⏟' (U+23df)
_operators["\u23df"] = C_("math symbol", "bottom brace")

# Translators: this is the spoken representation for the character '⟨' (U+27e8)
_operators["\u27e8"] = C_("math symbol", "left angle bracket")

# Translators: this is the spoken representation for the character '⟩' (U+27e9)
_operators["\u27e9"] = C_("math symbol", "right angle bracket")

# Translators: this is the spoken representation for the character '⨀' (U+2a00)
_operators["\u2a00"] = C_("math symbol", "circled dot")

# Translators: this is the spoken representation for the character '⨁' (U+2a01)
_operators["\u2a01"] = C_("math symbol", "circled plus")

# Translators: this is the spoken representation for the character '⨂' (U+2a02)
_operators["\u2a02"] = C_("math symbol", "circled times")
# Translators: this is the spoken representation for the character '⨃' (U+2a03)
_operators["\u2a03"] = C_("math symbol", "union with dot")
# Translators: this is the spoken representation for the character '⨄' (U+2a04)
_operators["\u2a04"] = C_("math symbol", "union with plus")
# Translators: this is the spoken representation for the character '⨅' (U+2a05)
_operators["\u2a05"] = C_("math symbol", "square intersection")
# Translators: this is the spoken representation for the character '⨆' (U+2a06)
_operators["\u2a06"] = C_("math symbol", "square union")

# Translators: this is the spoken representation for the character '■' (U+25a0)
# when used as a geometric shape (i.e. as opposed to a bullet in a list).
_shapes["\u25a0"] = C_("math symbol", "black square")

# Translators: this is the spoken representation for the character '□' (U+25a1)
# when used as a geometric shape (i.e. as opposed to a bullet in a list).
_shapes["\u25a1"] = C_("math symbol", "white square")

# Translators: this is the spoken representation for the character '◆' (U+25c6)
# when used as a geometric shape (i.e. as opposed to a bullet in a list).
_shapes["\u25c6"] = C_("math symbol", "black diamond")

# Translators: this is the spoken representation for the character '○' (U+25cb)
# when used as a geometric shape (i.e. as opposed to a bullet in a list).
_shapes["\u25cb"] = C_("math symbol", "white circle")

# Translators: this is the spoken representation for the character '●' (U+25cf)
# when used as a geometric shape (i.e. as opposed to a bullet in a list).
_shapes["\u25cf"] = C_("math symbol", "black circle")

# Translators: this is the spoken representation for the character '◦' (U+25e6)
_shapes["\u25e6"] = C_("math symbol", "white bullet")

# Translators: this is the spoken representation for the character '◾' (U+25fe)
# when used as a geometric shape (i.e. as opposed to a bullet in a list).
_shapes["\u25fe"] = C_("math symbol", "black medium small square")

# Translators: this is the spoken representation for the character '̱' (U+0331)
# which combines with the preceding character. '%s' is a placeholder for the
# preceding character. Some examples of combined symbols can be seen in this
# table: http://www.w3.org/TR/MathML3/appendixc.html#oper-dict.entries-table.
_combining["\u0331"] = C_("math symbol", "%s with underline")

# Translators: this is the spoken representation for the character '̸' (U+0338)
# which combines with the preceding character. '%s' is a placeholder for the
# preceding character. Some examples of combined symbols can be seen in this
# table: http://www.w3.org/TR/MathML3/appendixc.html#oper-dict.entries-table.
_combining["\u0338"] = C_("math symbol", "%s with slash")

# Translators: this is the spoken representation for the character '⃒' (U+20D2)
# which combines with the preceding character. '%s' is a placeholder for the
# preceding character. Some examples of combined symbols can be seen in this
# table: http://www.w3.org/TR/MathML3/appendixc.html#oper-dict.entries-table.
_combining["\u20d2"] = C_("math symbol", "%s with vertical line")

_all.update(_alnum)
_all.update(_arrows)
_all.update(_operators)
_all.update(_shapes)


_STYLE_MAP: list[tuple[str, list[range | list[int]]]] = [
    (BOLD, [_bold, _bold_greek, _bold_digits]),
    (ITALIC, [_italic, _italic_greek, _other_italic]),
    (BOLD_ITALIC, [_bold_italic, _bold_italic_greek]),
    (SCRIPT, [_script, _other_script]),
    (BOLD_SCRIPT, [_bold_script]),
    (FRAKTUR, [_fraktur, _other_fraktur]),
    (DOUBLE_STRUCK, [_double_struck, _double_struck_digits, _other_double_struck]),
    (BOLD_FRAKTUR, [_bold_fraktur]),
    (SANS_SERIF, [_sans_serif, _sans_serif_digits]),
    (SANS_SERIF_BOLD, [_sans_serif_bold, _sans_serif_bold_greek, _sans_serif_bold_digits]),
    (SANS_SERIF_ITALIC, [_sans_serif_italic]),
    (SANS_SERIF_BOLD_ITALIC, [_sans_serif_bold_italic, _sans_serif_bold_italic_greek]),
    (MONOSPACE, [_monospace, _monospace_digits]),
    (DOTLESS, [_dotless]),
]


def _get_style_string(symbol):
    o = ord(symbol)
    for style, dicts in _STYLE_MAP:
        if any(o in d for d in dicts):
            return style
    return "%s"


def _update_symbols(symbol_dict):
    _all.update(symbol_dict)


def _get_spoken_name(symbol, include_style):
    if symbol not in _all:
        return ""

    name = _all.get(symbol)
    if not name and fall_back_on_unicode_data:
        name = unicodedata.name(symbol).lower()
        _update_symbols({symbol: name})
        return name

    if include_style and symbol in _alnum:
        name = _get_style_string(symbol) % name

    return name


def get_character_name(symbol):
    """Returns the character name of symbol."""

    result = _get_spoken_name(symbol, speak_style != SPEAK_NEVER)
    msg = f"MATHSYMBOLS: Name of '{symbol}' is '{result}'"
    debug.print_message(debug.LEVEL_INFO, msg, True, True)
    return result


def adjust_for_speech(string):
    """Adjusts string for speech by replacing math symbols with their spoken names."""

    # Handle combining characters first
    # Combining characters modify the preceding character
    result = string
    for combining_char, name_template in _combining.items():
        # Look for any character followed by the combining character
        i = 0
        while i < len(result) - 1:
            if result[i + 1] == combining_char:
                base_char = result[i]
                name = name_template % base_char
                # Replace the base char + combining char with the spoken name
                result = result[:i] + f" {name} " + result[i + 2 :]
                i += len(f" {name} ")
            else:
                i += 1

    # Handle regular math symbols
    include_style = speak_style == SPEAK_ALWAYS
    for char in _all:
        if char in result:
            name = _get_spoken_name(char, include_style)
            if name:
                result = result.replace(char, f" {name} ")

    return result
