diff --git a/.gitattributes b/.gitattributes index a9dc81a83dce673d55f07c4e5a0f3437db3a0b0d..33f88b69027551ceefeccdc9bfac0d1c99c7b89a 100644 --- a/.gitattributes +++ b/.gitattributes @@ -333,3 +333,5 @@ tuning-competition-baseline/.venv/lib/python3.11/site-packages/nvidia/cudnn/lib/ .venv/lib/python3.11/site-packages/sentencepiece/_sentencepiece.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text .venv/lib/python3.11/site-packages/tiktoken/_tiktoken.cpython-311-x86_64-linux-gnu.so filter=lfs diff=lfs merge=lfs -text .venv/lib/python3.11/site-packages/cryptography/hazmat/bindings/_rust.abi3.so filter=lfs diff=lfs merge=lfs -text +.venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text +.venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc filter=lfs diff=lfs merge=lfs -text diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c4cf279ac7e34f8450703cb3cb978e19e1482e51 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29e7cb87477c4162d4a7a5b5a446b8a0bda9b41a1d17b53e5914a80d010fd67b +size 131577 diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4196709b1a02ea73213e1c3a7982c4b7bfe8ab41 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d33dfe3598d64cd87d0e97f91eff29005b725510660439fc64f90ef595a1b1b0 +size 108731 diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..73f58d7740813264d20047ffe918c82e1acc84eb --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__init__.py @@ -0,0 +1,177 @@ +"""Rich text and beautiful formatting in the terminal.""" + +import os +from typing import IO, TYPE_CHECKING, Any, Callable, Optional, Union + +from ._extension import load_ipython_extension # noqa: F401 + +__all__ = ["get_console", "reconfigure", "print", "inspect", "print_json"] + +if TYPE_CHECKING: + from .console import Console + +# Global console used by alternative print +_console: Optional["Console"] = None + +try: + _IMPORT_CWD = os.path.abspath(os.getcwd()) +except FileNotFoundError: + # Can happen if the cwd has been deleted + _IMPORT_CWD = "" + + +def get_console() -> "Console": + """Get a global :class:`~rich.console.Console` instance. This function is used when Rich requires a Console, + and hasn't been explicitly given one. + + Returns: + Console: A console instance. + """ + global _console + if _console is None: + from .console import Console + + _console = Console() + + return _console + + +def reconfigure(*args: Any, **kwargs: Any) -> None: + """Reconfigures the global console by replacing it with another. + + Args: + *args (Any): Positional arguments for the replacement :class:`~rich.console.Console`. + **kwargs (Any): Keyword arguments for the replacement :class:`~rich.console.Console`. + """ + from pip._vendor.rich.console import Console + + new_console = Console(*args, **kwargs) + _console = get_console() + _console.__dict__ = new_console.__dict__ + + +def print( + *objects: Any, + sep: str = " ", + end: str = "\n", + file: Optional[IO[str]] = None, + flush: bool = False, +) -> None: + r"""Print object(s) supplied via positional arguments. + This function has an identical signature to the built-in print. + For more advanced features, see the :class:`~rich.console.Console` class. + + Args: + sep (str, optional): Separator between printed objects. Defaults to " ". + end (str, optional): Character to write at end of output. Defaults to "\\n". + file (IO[str], optional): File to write to, or None for stdout. Defaults to None. + flush (bool, optional): Has no effect as Rich always flushes output. Defaults to False. + + """ + from .console import Console + + write_console = get_console() if file is None else Console(file=file) + return write_console.print(*objects, sep=sep, end=end) + + +def print_json( + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = False, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, +) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (str): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (int, optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + + get_console().print_json( + json, + data=data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + + +def inspect( + obj: Any, + *, + console: Optional["Console"] = None, + title: Optional[str] = None, + help: bool = False, + methods: bool = False, + docs: bool = True, + private: bool = False, + dunder: bool = False, + sort: bool = True, + all: bool = False, + value: bool = True, +) -> None: + """Inspect any Python object. + + * inspect() to see summarized info. + * inspect(, methods=True) to see methods. + * inspect(, help=True) to see full (non-abbreviated) help. + * inspect(, private=True) to see private attributes (single underscore). + * inspect(, dunder=True) to see attributes beginning with double underscore. + * inspect(, all=True) to see all attributes. + + Args: + obj (Any): An object to inspect. + title (str, optional): Title to display over inspect result, or None use type. Defaults to None. + help (bool, optional): Show full help text rather than just first paragraph. Defaults to False. + methods (bool, optional): Enable inspection of callables. Defaults to False. + docs (bool, optional): Also render doc strings. Defaults to True. + private (bool, optional): Show private attributes (beginning with underscore). Defaults to False. + dunder (bool, optional): Show attributes starting with double underscore. Defaults to False. + sort (bool, optional): Sort attributes alphabetically. Defaults to True. + all (bool, optional): Show all attributes. Defaults to False. + value (bool, optional): Pretty print value. Defaults to True. + """ + _console = console or get_console() + from pip._vendor.rich._inspect import Inspect + + # Special case for inspect(inspect) + is_inspect = obj is inspect + + _inspect = Inspect( + obj, + title=title, + help=is_inspect or help, + methods=is_inspect or methods, + docs=is_inspect or docs, + private=private, + dunder=dunder, + sort=sort, + all=all, + value=value, + ) + _console.print(_inspect) + + +if __name__ == "__main__": # pragma: no cover + print("Hello, **World**") diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..130d1407e3ffddd71c61a5beef2d528c4006294d Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..089f302510ce369f8c057e6c32fcbcd50a835a6e Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fec3947fcd6564ce31541e5c24205832ac32eebe Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c0d04e6b038fedb6af695af334e08a4aefe55a7f Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48a7a488521c2d24301ea466118b580881c25461 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7e2d7d8e0c517b86933ef84e1550a06368c7043f Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..97c085791d87cd7b35a5dbdbcfd678363244a823 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fae99497d473016682906f690454abf103a83a36 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e7e040df2f9127406959f2f9c85cf96a15aa6471 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ac24b5fa3e3c571200ba0ef2fb31013bb173ed5c Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1632e6fe7ff834412609e03f208445676f98a148 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..01cd570eead9db06a4c6b6091f5c54768e7bc9e3 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e03657ff6cd77d6e0442e5decb538e9deb5c125d Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ef039045d8f01486257719240fc63fddb66c727c Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc591cf0b0d4e79e80db326c16132f4370149d38 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7a0e7c615e2be9279694961ac01f8c9cedfece11 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c01a4f5e2366673238a2edd0de194610aeea3a59 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ba73f7e90f3ee0e7d413101cb9e8e62cd4fd4577 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e75bd0cb5b9339786004f607e6629378343447a4 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f527f20fc1907344c9c6007535275b3d67c9b082 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39fa3ac22977e8baa19b3ea79b0f0894e27bd923 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d99ebb097ca03b76cd74881e41a05d704f340a1f Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..34bae43c068d9b940573e8d45eeedfc1a6c00309 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fbe00caa21031d54f8b53dfcc8e6caf6a63a9e56 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..569ef1835c3ab362a4f1c75e8a7192463457d1f7 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8e4d992bae710570826d466a48950611d2e5c430 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..56fb63055b5b7ee80bfa174686c5fa39185d7f94 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2fe306c5b4e4f673f7b2fc1571561304fa624297 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5690a3e0d278077ae40b1c986067216f8042500a Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d09cdf573f51ea860799b4f80b67b0da8b6c591a Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0cf3c98976893c30b2507fe1e2a620fc4ca0e87c Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..588e942d1fed20c0e74cce8e3e7059b0200cdacd Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..65b1de5147d9f5329e8bc2891d24701e8a21397b Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..da0411d19b17dbeb0b9b5684142c39688f680e44 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..35d065c3812c6a5e6d8c386cd96a762c2c374b29 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0be0974908be78a51f137d7e3a3b731aeca68d3 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4174cf22f66dfca7b6257e90ab37ed143dba944e Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e1205915206c412dc41da66edbda26060a15ec25 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..79f08e2eadf02acf1ec33bde6dbcc598670c537b Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..baeb372b059b1b91ca8c7cf73a13d64b4e28014d Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2a4f24489615ed25a4dd44c7639985d46171d368 Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0ddda7813fee12b65c9e4636e36caa356a9fd6ba Binary files /dev/null and b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc differ diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py new file mode 100644 index 0000000000000000000000000000000000000000..36286df379e28ea997bea3ee1fd62cadebebbba9 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_cell_widths.py @@ -0,0 +1,451 @@ +# Auto generated by make_terminal_widths.py + +CELL_WIDTHS = [ + (0, 0, 0), + (1, 31, -1), + (127, 159, -1), + (768, 879, 0), + (1155, 1161, 0), + (1425, 1469, 0), + (1471, 1471, 0), + (1473, 1474, 0), + (1476, 1477, 0), + (1479, 1479, 0), + (1552, 1562, 0), + (1611, 1631, 0), + (1648, 1648, 0), + (1750, 1756, 0), + (1759, 1764, 0), + (1767, 1768, 0), + (1770, 1773, 0), + (1809, 1809, 0), + (1840, 1866, 0), + (1958, 1968, 0), + (2027, 2035, 0), + (2045, 2045, 0), + (2070, 2073, 0), + (2075, 2083, 0), + (2085, 2087, 0), + (2089, 2093, 0), + (2137, 2139, 0), + (2259, 2273, 0), + (2275, 2306, 0), + (2362, 2362, 0), + (2364, 2364, 0), + (2369, 2376, 0), + (2381, 2381, 0), + (2385, 2391, 0), + (2402, 2403, 0), + (2433, 2433, 0), + (2492, 2492, 0), + (2497, 2500, 0), + (2509, 2509, 0), + (2530, 2531, 0), + (2558, 2558, 0), + (2561, 2562, 0), + (2620, 2620, 0), + (2625, 2626, 0), + (2631, 2632, 0), + (2635, 2637, 0), + (2641, 2641, 0), + (2672, 2673, 0), + (2677, 2677, 0), + (2689, 2690, 0), + (2748, 2748, 0), + (2753, 2757, 0), + (2759, 2760, 0), + (2765, 2765, 0), + (2786, 2787, 0), + (2810, 2815, 0), + (2817, 2817, 0), + (2876, 2876, 0), + (2879, 2879, 0), + (2881, 2884, 0), + (2893, 2893, 0), + (2901, 2902, 0), + (2914, 2915, 0), + (2946, 2946, 0), + (3008, 3008, 0), + (3021, 3021, 0), + (3072, 3072, 0), + (3076, 3076, 0), + (3134, 3136, 0), + (3142, 3144, 0), + (3146, 3149, 0), + (3157, 3158, 0), + (3170, 3171, 0), + (3201, 3201, 0), + (3260, 3260, 0), + (3263, 3263, 0), + (3270, 3270, 0), + (3276, 3277, 0), + (3298, 3299, 0), + (3328, 3329, 0), + (3387, 3388, 0), + (3393, 3396, 0), + (3405, 3405, 0), + (3426, 3427, 0), + (3457, 3457, 0), + (3530, 3530, 0), + (3538, 3540, 0), + (3542, 3542, 0), + (3633, 3633, 0), + (3636, 3642, 0), + (3655, 3662, 0), + (3761, 3761, 0), + (3764, 3772, 0), + (3784, 3789, 0), + (3864, 3865, 0), + (3893, 3893, 0), + (3895, 3895, 0), + (3897, 3897, 0), + (3953, 3966, 0), + (3968, 3972, 0), + (3974, 3975, 0), + (3981, 3991, 0), + (3993, 4028, 0), + (4038, 4038, 0), + (4141, 4144, 0), + (4146, 4151, 0), + (4153, 4154, 0), + (4157, 4158, 0), + (4184, 4185, 0), + (4190, 4192, 0), + (4209, 4212, 0), + (4226, 4226, 0), + (4229, 4230, 0), + (4237, 4237, 0), + (4253, 4253, 0), + (4352, 4447, 2), + (4957, 4959, 0), + (5906, 5908, 0), + (5938, 5940, 0), + (5970, 5971, 0), + (6002, 6003, 0), + (6068, 6069, 0), + (6071, 6077, 0), + (6086, 6086, 0), + (6089, 6099, 0), + (6109, 6109, 0), + (6155, 6157, 0), + (6277, 6278, 0), + (6313, 6313, 0), + (6432, 6434, 0), + (6439, 6440, 0), + (6450, 6450, 0), + (6457, 6459, 0), + (6679, 6680, 0), + (6683, 6683, 0), + (6742, 6742, 0), + (6744, 6750, 0), + (6752, 6752, 0), + (6754, 6754, 0), + (6757, 6764, 0), + (6771, 6780, 0), + (6783, 6783, 0), + (6832, 6848, 0), + (6912, 6915, 0), + (6964, 6964, 0), + (6966, 6970, 0), + (6972, 6972, 0), + (6978, 6978, 0), + (7019, 7027, 0), + (7040, 7041, 0), + (7074, 7077, 0), + (7080, 7081, 0), + (7083, 7085, 0), + (7142, 7142, 0), + (7144, 7145, 0), + (7149, 7149, 0), + (7151, 7153, 0), + (7212, 7219, 0), + (7222, 7223, 0), + (7376, 7378, 0), + (7380, 7392, 0), + (7394, 7400, 0), + (7405, 7405, 0), + (7412, 7412, 0), + (7416, 7417, 0), + (7616, 7673, 0), + (7675, 7679, 0), + (8203, 8207, 0), + (8232, 8238, 0), + (8288, 8291, 0), + (8400, 8432, 0), + (8986, 8987, 2), + (9001, 9002, 2), + (9193, 9196, 2), + (9200, 9200, 2), + (9203, 9203, 2), + (9725, 9726, 2), + (9748, 9749, 2), + (9800, 9811, 2), + (9855, 9855, 2), + (9875, 9875, 2), + (9889, 9889, 2), + (9898, 9899, 2), + (9917, 9918, 2), + (9924, 9925, 2), + (9934, 9934, 2), + (9940, 9940, 2), + (9962, 9962, 2), + (9970, 9971, 2), + (9973, 9973, 2), + (9978, 9978, 2), + (9981, 9981, 2), + (9989, 9989, 2), + (9994, 9995, 2), + (10024, 10024, 2), + (10060, 10060, 2), + (10062, 10062, 2), + (10067, 10069, 2), + (10071, 10071, 2), + (10133, 10135, 2), + (10160, 10160, 2), + (10175, 10175, 2), + (11035, 11036, 2), + (11088, 11088, 2), + (11093, 11093, 2), + (11503, 11505, 0), + (11647, 11647, 0), + (11744, 11775, 0), + (11904, 11929, 2), + (11931, 12019, 2), + (12032, 12245, 2), + (12272, 12283, 2), + (12288, 12329, 2), + (12330, 12333, 0), + (12334, 12350, 2), + (12353, 12438, 2), + (12441, 12442, 0), + (12443, 12543, 2), + (12549, 12591, 2), + (12593, 12686, 2), + (12688, 12771, 2), + (12784, 12830, 2), + (12832, 12871, 2), + (12880, 19903, 2), + (19968, 42124, 2), + (42128, 42182, 2), + (42607, 42610, 0), + (42612, 42621, 0), + (42654, 42655, 0), + (42736, 42737, 0), + (43010, 43010, 0), + (43014, 43014, 0), + (43019, 43019, 0), + (43045, 43046, 0), + (43052, 43052, 0), + (43204, 43205, 0), + (43232, 43249, 0), + (43263, 43263, 0), + (43302, 43309, 0), + (43335, 43345, 0), + (43360, 43388, 2), + (43392, 43394, 0), + (43443, 43443, 0), + (43446, 43449, 0), + (43452, 43453, 0), + (43493, 43493, 0), + (43561, 43566, 0), + (43569, 43570, 0), + (43573, 43574, 0), + (43587, 43587, 0), + (43596, 43596, 0), + (43644, 43644, 0), + (43696, 43696, 0), + (43698, 43700, 0), + (43703, 43704, 0), + (43710, 43711, 0), + (43713, 43713, 0), + (43756, 43757, 0), + (43766, 43766, 0), + (44005, 44005, 0), + (44008, 44008, 0), + (44013, 44013, 0), + (44032, 55203, 2), + (63744, 64255, 2), + (64286, 64286, 0), + (65024, 65039, 0), + (65040, 65049, 2), + (65056, 65071, 0), + (65072, 65106, 2), + (65108, 65126, 2), + (65128, 65131, 2), + (65281, 65376, 2), + (65504, 65510, 2), + (66045, 66045, 0), + (66272, 66272, 0), + (66422, 66426, 0), + (68097, 68099, 0), + (68101, 68102, 0), + (68108, 68111, 0), + (68152, 68154, 0), + (68159, 68159, 0), + (68325, 68326, 0), + (68900, 68903, 0), + (69291, 69292, 0), + (69446, 69456, 0), + (69633, 69633, 0), + (69688, 69702, 0), + (69759, 69761, 0), + (69811, 69814, 0), + (69817, 69818, 0), + (69888, 69890, 0), + (69927, 69931, 0), + (69933, 69940, 0), + (70003, 70003, 0), + (70016, 70017, 0), + (70070, 70078, 0), + (70089, 70092, 0), + (70095, 70095, 0), + (70191, 70193, 0), + (70196, 70196, 0), + (70198, 70199, 0), + (70206, 70206, 0), + (70367, 70367, 0), + (70371, 70378, 0), + (70400, 70401, 0), + (70459, 70460, 0), + (70464, 70464, 0), + (70502, 70508, 0), + (70512, 70516, 0), + (70712, 70719, 0), + (70722, 70724, 0), + (70726, 70726, 0), + (70750, 70750, 0), + (70835, 70840, 0), + (70842, 70842, 0), + (70847, 70848, 0), + (70850, 70851, 0), + (71090, 71093, 0), + (71100, 71101, 0), + (71103, 71104, 0), + (71132, 71133, 0), + (71219, 71226, 0), + (71229, 71229, 0), + (71231, 71232, 0), + (71339, 71339, 0), + (71341, 71341, 0), + (71344, 71349, 0), + (71351, 71351, 0), + (71453, 71455, 0), + (71458, 71461, 0), + (71463, 71467, 0), + (71727, 71735, 0), + (71737, 71738, 0), + (71995, 71996, 0), + (71998, 71998, 0), + (72003, 72003, 0), + (72148, 72151, 0), + (72154, 72155, 0), + (72160, 72160, 0), + (72193, 72202, 0), + (72243, 72248, 0), + (72251, 72254, 0), + (72263, 72263, 0), + (72273, 72278, 0), + (72281, 72283, 0), + (72330, 72342, 0), + (72344, 72345, 0), + (72752, 72758, 0), + (72760, 72765, 0), + (72767, 72767, 0), + (72850, 72871, 0), + (72874, 72880, 0), + (72882, 72883, 0), + (72885, 72886, 0), + (73009, 73014, 0), + (73018, 73018, 0), + (73020, 73021, 0), + (73023, 73029, 0), + (73031, 73031, 0), + (73104, 73105, 0), + (73109, 73109, 0), + (73111, 73111, 0), + (73459, 73460, 0), + (92912, 92916, 0), + (92976, 92982, 0), + (94031, 94031, 0), + (94095, 94098, 0), + (94176, 94179, 2), + (94180, 94180, 0), + (94192, 94193, 2), + (94208, 100343, 2), + (100352, 101589, 2), + (101632, 101640, 2), + (110592, 110878, 2), + (110928, 110930, 2), + (110948, 110951, 2), + (110960, 111355, 2), + (113821, 113822, 0), + (119143, 119145, 0), + (119163, 119170, 0), + (119173, 119179, 0), + (119210, 119213, 0), + (119362, 119364, 0), + (121344, 121398, 0), + (121403, 121452, 0), + (121461, 121461, 0), + (121476, 121476, 0), + (121499, 121503, 0), + (121505, 121519, 0), + (122880, 122886, 0), + (122888, 122904, 0), + (122907, 122913, 0), + (122915, 122916, 0), + (122918, 122922, 0), + (123184, 123190, 0), + (123628, 123631, 0), + (125136, 125142, 0), + (125252, 125258, 0), + (126980, 126980, 2), + (127183, 127183, 2), + (127374, 127374, 2), + (127377, 127386, 2), + (127488, 127490, 2), + (127504, 127547, 2), + (127552, 127560, 2), + (127568, 127569, 2), + (127584, 127589, 2), + (127744, 127776, 2), + (127789, 127797, 2), + (127799, 127868, 2), + (127870, 127891, 2), + (127904, 127946, 2), + (127951, 127955, 2), + (127968, 127984, 2), + (127988, 127988, 2), + (127992, 128062, 2), + (128064, 128064, 2), + (128066, 128252, 2), + (128255, 128317, 2), + (128331, 128334, 2), + (128336, 128359, 2), + (128378, 128378, 2), + (128405, 128406, 2), + (128420, 128420, 2), + (128507, 128591, 2), + (128640, 128709, 2), + (128716, 128716, 2), + (128720, 128722, 2), + (128725, 128727, 2), + (128747, 128748, 2), + (128756, 128764, 2), + (128992, 129003, 2), + (129292, 129338, 2), + (129340, 129349, 2), + (129351, 129400, 2), + (129402, 129483, 2), + (129485, 129535, 2), + (129648, 129652, 2), + (129656, 129658, 2), + (129664, 129670, 2), + (129680, 129704, 2), + (129712, 129718, 2), + (129728, 129730, 2), + (129744, 129750, 2), + (131072, 196605, 2), + (196608, 262141, 2), + (917760, 917999, 0), +] diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py new file mode 100644 index 0000000000000000000000000000000000000000..1f2877bb2bd520253502b1c05bb811bb0d7ef64c --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_codes.py @@ -0,0 +1,3610 @@ +EMOJI = { + "1st_place_medal": "๐Ÿฅ‡", + "2nd_place_medal": "๐Ÿฅˆ", + "3rd_place_medal": "๐Ÿฅ‰", + "ab_button_(blood_type)": "๐Ÿ†Ž", + "atm_sign": "๐Ÿง", + "a_button_(blood_type)": "๐Ÿ…ฐ", + "afghanistan": "๐Ÿ‡ฆ๐Ÿ‡ซ", + "albania": "๐Ÿ‡ฆ๐Ÿ‡ฑ", + "algeria": "๐Ÿ‡ฉ๐Ÿ‡ฟ", + "american_samoa": "๐Ÿ‡ฆ๐Ÿ‡ธ", + "andorra": "๐Ÿ‡ฆ๐Ÿ‡ฉ", + "angola": "๐Ÿ‡ฆ๐Ÿ‡ด", + "anguilla": "๐Ÿ‡ฆ๐Ÿ‡ฎ", + "antarctica": "๐Ÿ‡ฆ๐Ÿ‡ถ", + "antigua_&_barbuda": "๐Ÿ‡ฆ๐Ÿ‡ฌ", + "aquarius": "โ™’", + "argentina": "๐Ÿ‡ฆ๐Ÿ‡ท", + "aries": "โ™ˆ", + "armenia": "๐Ÿ‡ฆ๐Ÿ‡ฒ", + "aruba": "๐Ÿ‡ฆ๐Ÿ‡ผ", + "ascension_island": "๐Ÿ‡ฆ๐Ÿ‡จ", + "australia": "๐Ÿ‡ฆ๐Ÿ‡บ", + "austria": "๐Ÿ‡ฆ๐Ÿ‡น", + "azerbaijan": "๐Ÿ‡ฆ๐Ÿ‡ฟ", + "back_arrow": "๐Ÿ”™", + "b_button_(blood_type)": "๐Ÿ…ฑ", + "bahamas": "๐Ÿ‡ง๐Ÿ‡ธ", + "bahrain": "๐Ÿ‡ง๐Ÿ‡ญ", + "bangladesh": "๐Ÿ‡ง๐Ÿ‡ฉ", + "barbados": "๐Ÿ‡ง๐Ÿ‡ง", + "belarus": "๐Ÿ‡ง๐Ÿ‡พ", + "belgium": "๐Ÿ‡ง๐Ÿ‡ช", + "belize": "๐Ÿ‡ง๐Ÿ‡ฟ", + "benin": "๐Ÿ‡ง๐Ÿ‡ฏ", + "bermuda": "๐Ÿ‡ง๐Ÿ‡ฒ", + "bhutan": "๐Ÿ‡ง๐Ÿ‡น", + "bolivia": "๐Ÿ‡ง๐Ÿ‡ด", + "bosnia_&_herzegovina": "๐Ÿ‡ง๐Ÿ‡ฆ", + "botswana": "๐Ÿ‡ง๐Ÿ‡ผ", + "bouvet_island": "๐Ÿ‡ง๐Ÿ‡ป", + "brazil": "๐Ÿ‡ง๐Ÿ‡ท", + "british_indian_ocean_territory": "๐Ÿ‡ฎ๐Ÿ‡ด", + "british_virgin_islands": "๐Ÿ‡ป๐Ÿ‡ฌ", + "brunei": "๐Ÿ‡ง๐Ÿ‡ณ", + "bulgaria": "๐Ÿ‡ง๐Ÿ‡ฌ", + "burkina_faso": "๐Ÿ‡ง๐Ÿ‡ซ", + "burundi": "๐Ÿ‡ง๐Ÿ‡ฎ", + "cl_button": "๐Ÿ†‘", + "cool_button": "๐Ÿ†’", + "cambodia": "๐Ÿ‡ฐ๐Ÿ‡ญ", + "cameroon": "๐Ÿ‡จ๐Ÿ‡ฒ", + "canada": "๐Ÿ‡จ๐Ÿ‡ฆ", + "canary_islands": "๐Ÿ‡ฎ๐Ÿ‡จ", + "cancer": "โ™‹", + "cape_verde": "๐Ÿ‡จ๐Ÿ‡ป", + "capricorn": "โ™‘", + "caribbean_netherlands": "๐Ÿ‡ง๐Ÿ‡ถ", + "cayman_islands": "๐Ÿ‡ฐ๐Ÿ‡พ", + "central_african_republic": "๐Ÿ‡จ๐Ÿ‡ซ", + "ceuta_&_melilla": "๐Ÿ‡ช๐Ÿ‡ฆ", + "chad": "๐Ÿ‡น๐Ÿ‡ฉ", + "chile": "๐Ÿ‡จ๐Ÿ‡ฑ", + "china": "๐Ÿ‡จ๐Ÿ‡ณ", + "christmas_island": "๐Ÿ‡จ๐Ÿ‡ฝ", + "christmas_tree": "๐ŸŽ„", + "clipperton_island": "๐Ÿ‡จ๐Ÿ‡ต", + "cocos_(keeling)_islands": "๐Ÿ‡จ๐Ÿ‡จ", + "colombia": "๐Ÿ‡จ๐Ÿ‡ด", + "comoros": "๐Ÿ‡ฐ๐Ÿ‡ฒ", + "congo_-_brazzaville": "๐Ÿ‡จ๐Ÿ‡ฌ", + "congo_-_kinshasa": "๐Ÿ‡จ๐Ÿ‡ฉ", + "cook_islands": "๐Ÿ‡จ๐Ÿ‡ฐ", + "costa_rica": "๐Ÿ‡จ๐Ÿ‡ท", + "croatia": "๐Ÿ‡ญ๐Ÿ‡ท", + "cuba": "๐Ÿ‡จ๐Ÿ‡บ", + "curaรงao": "๐Ÿ‡จ๐Ÿ‡ผ", + "cyprus": "๐Ÿ‡จ๐Ÿ‡พ", + "czechia": "๐Ÿ‡จ๐Ÿ‡ฟ", + "cรดte_dโ€™ivoire": "๐Ÿ‡จ๐Ÿ‡ฎ", + "denmark": "๐Ÿ‡ฉ๐Ÿ‡ฐ", + "diego_garcia": "๐Ÿ‡ฉ๐Ÿ‡ฌ", + "djibouti": "๐Ÿ‡ฉ๐Ÿ‡ฏ", + "dominica": "๐Ÿ‡ฉ๐Ÿ‡ฒ", + "dominican_republic": "๐Ÿ‡ฉ๐Ÿ‡ด", + "end_arrow": "๐Ÿ”š", + "ecuador": "๐Ÿ‡ช๐Ÿ‡จ", + "egypt": "๐Ÿ‡ช๐Ÿ‡ฌ", + "el_salvador": "๐Ÿ‡ธ๐Ÿ‡ป", + "england": "๐Ÿด\U000e0067\U000e0062\U000e0065\U000e006e\U000e0067\U000e007f", + "equatorial_guinea": "๐Ÿ‡ฌ๐Ÿ‡ถ", + "eritrea": "๐Ÿ‡ช๐Ÿ‡ท", + "estonia": "๐Ÿ‡ช๐Ÿ‡ช", + "ethiopia": "๐Ÿ‡ช๐Ÿ‡น", + "european_union": "๐Ÿ‡ช๐Ÿ‡บ", + "free_button": "๐Ÿ†“", + "falkland_islands": "๐Ÿ‡ซ๐Ÿ‡ฐ", + "faroe_islands": "๐Ÿ‡ซ๐Ÿ‡ด", + "fiji": "๐Ÿ‡ซ๐Ÿ‡ฏ", + "finland": "๐Ÿ‡ซ๐Ÿ‡ฎ", + "france": "๐Ÿ‡ซ๐Ÿ‡ท", + "french_guiana": "๐Ÿ‡ฌ๐Ÿ‡ซ", + "french_polynesia": "๐Ÿ‡ต๐Ÿ‡ซ", + "french_southern_territories": "๐Ÿ‡น๐Ÿ‡ซ", + "gabon": "๐Ÿ‡ฌ๐Ÿ‡ฆ", + "gambia": "๐Ÿ‡ฌ๐Ÿ‡ฒ", + "gemini": "โ™Š", + "georgia": "๐Ÿ‡ฌ๐Ÿ‡ช", + "germany": "๐Ÿ‡ฉ๐Ÿ‡ช", + "ghana": "๐Ÿ‡ฌ๐Ÿ‡ญ", + "gibraltar": "๐Ÿ‡ฌ๐Ÿ‡ฎ", + "greece": "๐Ÿ‡ฌ๐Ÿ‡ท", + "greenland": "๐Ÿ‡ฌ๐Ÿ‡ฑ", + "grenada": "๐Ÿ‡ฌ๐Ÿ‡ฉ", + "guadeloupe": "๐Ÿ‡ฌ๐Ÿ‡ต", + "guam": "๐Ÿ‡ฌ๐Ÿ‡บ", + "guatemala": "๐Ÿ‡ฌ๐Ÿ‡น", + "guernsey": "๐Ÿ‡ฌ๐Ÿ‡ฌ", + "guinea": "๐Ÿ‡ฌ๐Ÿ‡ณ", + "guinea-bissau": "๐Ÿ‡ฌ๐Ÿ‡ผ", + "guyana": "๐Ÿ‡ฌ๐Ÿ‡พ", + "haiti": "๐Ÿ‡ญ๐Ÿ‡น", + "heard_&_mcdonald_islands": "๐Ÿ‡ญ๐Ÿ‡ฒ", + "honduras": "๐Ÿ‡ญ๐Ÿ‡ณ", + "hong_kong_sar_china": "๐Ÿ‡ญ๐Ÿ‡ฐ", + "hungary": "๐Ÿ‡ญ๐Ÿ‡บ", + "id_button": "๐Ÿ†”", + "iceland": "๐Ÿ‡ฎ๐Ÿ‡ธ", + "india": "๐Ÿ‡ฎ๐Ÿ‡ณ", + "indonesia": "๐Ÿ‡ฎ๐Ÿ‡ฉ", + "iran": "๐Ÿ‡ฎ๐Ÿ‡ท", + "iraq": "๐Ÿ‡ฎ๐Ÿ‡ถ", + "ireland": "๐Ÿ‡ฎ๐Ÿ‡ช", + "isle_of_man": "๐Ÿ‡ฎ๐Ÿ‡ฒ", + "israel": "๐Ÿ‡ฎ๐Ÿ‡ฑ", + "italy": "๐Ÿ‡ฎ๐Ÿ‡น", + "jamaica": "๐Ÿ‡ฏ๐Ÿ‡ฒ", + "japan": "๐Ÿ—พ", + "japanese_acceptable_button": "๐Ÿ‰‘", + "japanese_application_button": "๐Ÿˆธ", + "japanese_bargain_button": "๐Ÿ‰", + "japanese_castle": "๐Ÿฏ", + "japanese_congratulations_button": "ใŠ—", + "japanese_discount_button": "๐Ÿˆน", + "japanese_dolls": "๐ŸŽŽ", + "japanese_free_of_charge_button": "๐Ÿˆš", + "japanese_here_button": "๐Ÿˆ", + "japanese_monthly_amount_button": "๐Ÿˆท", + "japanese_no_vacancy_button": "๐Ÿˆต", + "japanese_not_free_of_charge_button": "๐Ÿˆถ", + "japanese_open_for_business_button": "๐Ÿˆบ", + "japanese_passing_grade_button": "๐Ÿˆด", + "japanese_post_office": "๐Ÿฃ", + "japanese_prohibited_button": "๐Ÿˆฒ", + "japanese_reserved_button": "๐Ÿˆฏ", + "japanese_secret_button": "ใŠ™", + "japanese_service_charge_button": "๐Ÿˆ‚", + "japanese_symbol_for_beginner": "๐Ÿ”ฐ", + "japanese_vacancy_button": "๐Ÿˆณ", + "jersey": "๐Ÿ‡ฏ๐Ÿ‡ช", + "jordan": "๐Ÿ‡ฏ๐Ÿ‡ด", + "kazakhstan": "๐Ÿ‡ฐ๐Ÿ‡ฟ", + "kenya": "๐Ÿ‡ฐ๐Ÿ‡ช", + "kiribati": "๐Ÿ‡ฐ๐Ÿ‡ฎ", + "kosovo": "๐Ÿ‡ฝ๐Ÿ‡ฐ", + "kuwait": "๐Ÿ‡ฐ๐Ÿ‡ผ", + "kyrgyzstan": "๐Ÿ‡ฐ๐Ÿ‡ฌ", + "laos": "๐Ÿ‡ฑ๐Ÿ‡ฆ", + "latvia": "๐Ÿ‡ฑ๐Ÿ‡ป", + "lebanon": "๐Ÿ‡ฑ๐Ÿ‡ง", + "leo": "โ™Œ", + "lesotho": "๐Ÿ‡ฑ๐Ÿ‡ธ", + "liberia": "๐Ÿ‡ฑ๐Ÿ‡ท", + "libra": "โ™Ž", + "libya": "๐Ÿ‡ฑ๐Ÿ‡พ", + "liechtenstein": "๐Ÿ‡ฑ๐Ÿ‡ฎ", + "lithuania": "๐Ÿ‡ฑ๐Ÿ‡น", + "luxembourg": "๐Ÿ‡ฑ๐Ÿ‡บ", + "macau_sar_china": "๐Ÿ‡ฒ๐Ÿ‡ด", + "macedonia": "๐Ÿ‡ฒ๐Ÿ‡ฐ", + "madagascar": "๐Ÿ‡ฒ๐Ÿ‡ฌ", + "malawi": "๐Ÿ‡ฒ๐Ÿ‡ผ", + "malaysia": "๐Ÿ‡ฒ๐Ÿ‡พ", + "maldives": "๐Ÿ‡ฒ๐Ÿ‡ป", + "mali": "๐Ÿ‡ฒ๐Ÿ‡ฑ", + "malta": "๐Ÿ‡ฒ๐Ÿ‡น", + "marshall_islands": "๐Ÿ‡ฒ๐Ÿ‡ญ", + "martinique": "๐Ÿ‡ฒ๐Ÿ‡ถ", + "mauritania": "๐Ÿ‡ฒ๐Ÿ‡ท", + "mauritius": "๐Ÿ‡ฒ๐Ÿ‡บ", + "mayotte": "๐Ÿ‡พ๐Ÿ‡น", + "mexico": "๐Ÿ‡ฒ๐Ÿ‡ฝ", + "micronesia": "๐Ÿ‡ซ๐Ÿ‡ฒ", + "moldova": "๐Ÿ‡ฒ๐Ÿ‡ฉ", + "monaco": "๐Ÿ‡ฒ๐Ÿ‡จ", + "mongolia": "๐Ÿ‡ฒ๐Ÿ‡ณ", + "montenegro": "๐Ÿ‡ฒ๐Ÿ‡ช", + "montserrat": "๐Ÿ‡ฒ๐Ÿ‡ธ", + "morocco": "๐Ÿ‡ฒ๐Ÿ‡ฆ", + "mozambique": "๐Ÿ‡ฒ๐Ÿ‡ฟ", + "mrs._claus": "๐Ÿคถ", + "mrs._claus_dark_skin_tone": "๐Ÿคถ๐Ÿฟ", + "mrs._claus_light_skin_tone": "๐Ÿคถ๐Ÿป", + "mrs._claus_medium-dark_skin_tone": "๐Ÿคถ๐Ÿพ", + "mrs._claus_medium-light_skin_tone": "๐Ÿคถ๐Ÿผ", + "mrs._claus_medium_skin_tone": "๐Ÿคถ๐Ÿฝ", + "myanmar_(burma)": "๐Ÿ‡ฒ๐Ÿ‡ฒ", + "new_button": "๐Ÿ†•", + "ng_button": "๐Ÿ†–", + "namibia": "๐Ÿ‡ณ๐Ÿ‡ฆ", + "nauru": "๐Ÿ‡ณ๐Ÿ‡ท", + "nepal": "๐Ÿ‡ณ๐Ÿ‡ต", + "netherlands": "๐Ÿ‡ณ๐Ÿ‡ฑ", + "new_caledonia": "๐Ÿ‡ณ๐Ÿ‡จ", + "new_zealand": "๐Ÿ‡ณ๐Ÿ‡ฟ", + "nicaragua": "๐Ÿ‡ณ๐Ÿ‡ฎ", + "niger": "๐Ÿ‡ณ๐Ÿ‡ช", + "nigeria": "๐Ÿ‡ณ๐Ÿ‡ฌ", + "niue": "๐Ÿ‡ณ๐Ÿ‡บ", + "norfolk_island": "๐Ÿ‡ณ๐Ÿ‡ซ", + "north_korea": "๐Ÿ‡ฐ๐Ÿ‡ต", + "northern_mariana_islands": "๐Ÿ‡ฒ๐Ÿ‡ต", + "norway": "๐Ÿ‡ณ๐Ÿ‡ด", + "ok_button": "๐Ÿ†—", + "ok_hand": "๐Ÿ‘Œ", + "ok_hand_dark_skin_tone": "๐Ÿ‘Œ๐Ÿฟ", + "ok_hand_light_skin_tone": "๐Ÿ‘Œ๐Ÿป", + "ok_hand_medium-dark_skin_tone": "๐Ÿ‘Œ๐Ÿพ", + "ok_hand_medium-light_skin_tone": "๐Ÿ‘Œ๐Ÿผ", + "ok_hand_medium_skin_tone": "๐Ÿ‘Œ๐Ÿฝ", + "on!_arrow": "๐Ÿ”›", + "o_button_(blood_type)": "๐Ÿ…พ", + "oman": "๐Ÿ‡ด๐Ÿ‡ฒ", + "ophiuchus": "โ›Ž", + "p_button": "๐Ÿ…ฟ", + "pakistan": "๐Ÿ‡ต๐Ÿ‡ฐ", + "palau": "๐Ÿ‡ต๐Ÿ‡ผ", + "palestinian_territories": "๐Ÿ‡ต๐Ÿ‡ธ", + "panama": "๐Ÿ‡ต๐Ÿ‡ฆ", + "papua_new_guinea": "๐Ÿ‡ต๐Ÿ‡ฌ", + "paraguay": "๐Ÿ‡ต๐Ÿ‡พ", + "peru": "๐Ÿ‡ต๐Ÿ‡ช", + "philippines": "๐Ÿ‡ต๐Ÿ‡ญ", + "pisces": "โ™“", + "pitcairn_islands": "๐Ÿ‡ต๐Ÿ‡ณ", + "poland": "๐Ÿ‡ต๐Ÿ‡ฑ", + "portugal": "๐Ÿ‡ต๐Ÿ‡น", + "puerto_rico": "๐Ÿ‡ต๐Ÿ‡ท", + "qatar": "๐Ÿ‡ถ๐Ÿ‡ฆ", + "romania": "๐Ÿ‡ท๐Ÿ‡ด", + "russia": "๐Ÿ‡ท๐Ÿ‡บ", + "rwanda": "๐Ÿ‡ท๐Ÿ‡ผ", + "rรฉunion": "๐Ÿ‡ท๐Ÿ‡ช", + "soon_arrow": "๐Ÿ”œ", + "sos_button": "๐Ÿ†˜", + "sagittarius": "โ™", + "samoa": "๐Ÿ‡ผ๐Ÿ‡ธ", + "san_marino": "๐Ÿ‡ธ๐Ÿ‡ฒ", + "santa_claus": "๐ŸŽ…", + "santa_claus_dark_skin_tone": "๐ŸŽ…๐Ÿฟ", + "santa_claus_light_skin_tone": "๐ŸŽ…๐Ÿป", + "santa_claus_medium-dark_skin_tone": "๐ŸŽ…๐Ÿพ", + "santa_claus_medium-light_skin_tone": "๐ŸŽ…๐Ÿผ", + "santa_claus_medium_skin_tone": "๐ŸŽ…๐Ÿฝ", + "saudi_arabia": "๐Ÿ‡ธ๐Ÿ‡ฆ", + "scorpio": "โ™", + "scotland": "๐Ÿด\U000e0067\U000e0062\U000e0073\U000e0063\U000e0074\U000e007f", + "senegal": "๐Ÿ‡ธ๐Ÿ‡ณ", + "serbia": "๐Ÿ‡ท๐Ÿ‡ธ", + "seychelles": "๐Ÿ‡ธ๐Ÿ‡จ", + "sierra_leone": "๐Ÿ‡ธ๐Ÿ‡ฑ", + "singapore": "๐Ÿ‡ธ๐Ÿ‡ฌ", + "sint_maarten": "๐Ÿ‡ธ๐Ÿ‡ฝ", + "slovakia": "๐Ÿ‡ธ๐Ÿ‡ฐ", + "slovenia": "๐Ÿ‡ธ๐Ÿ‡ฎ", + "solomon_islands": "๐Ÿ‡ธ๐Ÿ‡ง", + "somalia": "๐Ÿ‡ธ๐Ÿ‡ด", + "south_africa": "๐Ÿ‡ฟ๐Ÿ‡ฆ", + "south_georgia_&_south_sandwich_islands": "๐Ÿ‡ฌ๐Ÿ‡ธ", + "south_korea": "๐Ÿ‡ฐ๐Ÿ‡ท", + "south_sudan": "๐Ÿ‡ธ๐Ÿ‡ธ", + "spain": "๐Ÿ‡ช๐Ÿ‡ธ", + "sri_lanka": "๐Ÿ‡ฑ๐Ÿ‡ฐ", + "st._barthรฉlemy": "๐Ÿ‡ง๐Ÿ‡ฑ", + "st._helena": "๐Ÿ‡ธ๐Ÿ‡ญ", + "st._kitts_&_nevis": "๐Ÿ‡ฐ๐Ÿ‡ณ", + "st._lucia": "๐Ÿ‡ฑ๐Ÿ‡จ", + "st._martin": "๐Ÿ‡ฒ๐Ÿ‡ซ", + "st._pierre_&_miquelon": "๐Ÿ‡ต๐Ÿ‡ฒ", + "st._vincent_&_grenadines": "๐Ÿ‡ป๐Ÿ‡จ", + "statue_of_liberty": "๐Ÿ—ฝ", + "sudan": "๐Ÿ‡ธ๐Ÿ‡ฉ", + "suriname": "๐Ÿ‡ธ๐Ÿ‡ท", + "svalbard_&_jan_mayen": "๐Ÿ‡ธ๐Ÿ‡ฏ", + "swaziland": "๐Ÿ‡ธ๐Ÿ‡ฟ", + "sweden": "๐Ÿ‡ธ๐Ÿ‡ช", + "switzerland": "๐Ÿ‡จ๐Ÿ‡ญ", + "syria": "๐Ÿ‡ธ๐Ÿ‡พ", + "sรฃo_tomรฉ_&_prรญncipe": "๐Ÿ‡ธ๐Ÿ‡น", + "t-rex": "๐Ÿฆ–", + "top_arrow": "๐Ÿ”", + "taiwan": "๐Ÿ‡น๐Ÿ‡ผ", + "tajikistan": "๐Ÿ‡น๐Ÿ‡ฏ", + "tanzania": "๐Ÿ‡น๐Ÿ‡ฟ", + "taurus": "โ™‰", + "thailand": "๐Ÿ‡น๐Ÿ‡ญ", + "timor-leste": "๐Ÿ‡น๐Ÿ‡ฑ", + "togo": "๐Ÿ‡น๐Ÿ‡ฌ", + "tokelau": "๐Ÿ‡น๐Ÿ‡ฐ", + "tokyo_tower": "๐Ÿ—ผ", + "tonga": "๐Ÿ‡น๐Ÿ‡ด", + "trinidad_&_tobago": "๐Ÿ‡น๐Ÿ‡น", + "tristan_da_cunha": "๐Ÿ‡น๐Ÿ‡ฆ", + "tunisia": "๐Ÿ‡น๐Ÿ‡ณ", + "turkey": "๐Ÿฆƒ", + "turkmenistan": "๐Ÿ‡น๐Ÿ‡ฒ", + "turks_&_caicos_islands": "๐Ÿ‡น๐Ÿ‡จ", + "tuvalu": "๐Ÿ‡น๐Ÿ‡ป", + "u.s._outlying_islands": "๐Ÿ‡บ๐Ÿ‡ฒ", + "u.s._virgin_islands": "๐Ÿ‡ป๐Ÿ‡ฎ", + "up!_button": "๐Ÿ†™", + "uganda": "๐Ÿ‡บ๐Ÿ‡ฌ", + "ukraine": "๐Ÿ‡บ๐Ÿ‡ฆ", + "united_arab_emirates": "๐Ÿ‡ฆ๐Ÿ‡ช", + "united_kingdom": "๐Ÿ‡ฌ๐Ÿ‡ง", + "united_nations": "๐Ÿ‡บ๐Ÿ‡ณ", + "united_states": "๐Ÿ‡บ๐Ÿ‡ธ", + "uruguay": "๐Ÿ‡บ๐Ÿ‡พ", + "uzbekistan": "๐Ÿ‡บ๐Ÿ‡ฟ", + "vs_button": "๐Ÿ†š", + "vanuatu": "๐Ÿ‡ป๐Ÿ‡บ", + "vatican_city": "๐Ÿ‡ป๐Ÿ‡ฆ", + "venezuela": "๐Ÿ‡ป๐Ÿ‡ช", + "vietnam": "๐Ÿ‡ป๐Ÿ‡ณ", + "virgo": "โ™", + "wales": "๐Ÿด\U000e0067\U000e0062\U000e0077\U000e006c\U000e0073\U000e007f", + "wallis_&_futuna": "๐Ÿ‡ผ๐Ÿ‡ซ", + "western_sahara": "๐Ÿ‡ช๐Ÿ‡ญ", + "yemen": "๐Ÿ‡พ๐Ÿ‡ช", + "zambia": "๐Ÿ‡ฟ๐Ÿ‡ฒ", + "zimbabwe": "๐Ÿ‡ฟ๐Ÿ‡ผ", + "abacus": "๐Ÿงฎ", + "adhesive_bandage": "๐Ÿฉน", + "admission_tickets": "๐ŸŽŸ", + "adult": "๐Ÿง‘", + "adult_dark_skin_tone": "๐Ÿง‘๐Ÿฟ", + "adult_light_skin_tone": "๐Ÿง‘๐Ÿป", + "adult_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพ", + "adult_medium-light_skin_tone": "๐Ÿง‘๐Ÿผ", + "adult_medium_skin_tone": "๐Ÿง‘๐Ÿฝ", + "aerial_tramway": "๐Ÿšก", + "airplane": "โœˆ", + "airplane_arrival": "๐Ÿ›ฌ", + "airplane_departure": "๐Ÿ›ซ", + "alarm_clock": "โฐ", + "alembic": "โš—", + "alien": "๐Ÿ‘ฝ", + "alien_monster": "๐Ÿ‘พ", + "ambulance": "๐Ÿš‘", + "american_football": "๐Ÿˆ", + "amphora": "๐Ÿบ", + "anchor": "โš“", + "anger_symbol": "๐Ÿ’ข", + "angry_face": "๐Ÿ˜ ", + "angry_face_with_horns": "๐Ÿ‘ฟ", + "anguished_face": "๐Ÿ˜ง", + "ant": "๐Ÿœ", + "antenna_bars": "๐Ÿ“ถ", + "anxious_face_with_sweat": "๐Ÿ˜ฐ", + "articulated_lorry": "๐Ÿš›", + "artist_palette": "๐ŸŽจ", + "astonished_face": "๐Ÿ˜ฒ", + "atom_symbol": "โš›", + "auto_rickshaw": "๐Ÿ›บ", + "automobile": "๐Ÿš—", + "avocado": "๐Ÿฅ‘", + "axe": "๐Ÿช“", + "baby": "๐Ÿ‘ถ", + "baby_angel": "๐Ÿ‘ผ", + "baby_angel_dark_skin_tone": "๐Ÿ‘ผ๐Ÿฟ", + "baby_angel_light_skin_tone": "๐Ÿ‘ผ๐Ÿป", + "baby_angel_medium-dark_skin_tone": "๐Ÿ‘ผ๐Ÿพ", + "baby_angel_medium-light_skin_tone": "๐Ÿ‘ผ๐Ÿผ", + "baby_angel_medium_skin_tone": "๐Ÿ‘ผ๐Ÿฝ", + "baby_bottle": "๐Ÿผ", + "baby_chick": "๐Ÿค", + "baby_dark_skin_tone": "๐Ÿ‘ถ๐Ÿฟ", + "baby_light_skin_tone": "๐Ÿ‘ถ๐Ÿป", + "baby_medium-dark_skin_tone": "๐Ÿ‘ถ๐Ÿพ", + "baby_medium-light_skin_tone": "๐Ÿ‘ถ๐Ÿผ", + "baby_medium_skin_tone": "๐Ÿ‘ถ๐Ÿฝ", + "baby_symbol": "๐Ÿšผ", + "backhand_index_pointing_down": "๐Ÿ‘‡", + "backhand_index_pointing_down_dark_skin_tone": "๐Ÿ‘‡๐Ÿฟ", + "backhand_index_pointing_down_light_skin_tone": "๐Ÿ‘‡๐Ÿป", + "backhand_index_pointing_down_medium-dark_skin_tone": "๐Ÿ‘‡๐Ÿพ", + "backhand_index_pointing_down_medium-light_skin_tone": "๐Ÿ‘‡๐Ÿผ", + "backhand_index_pointing_down_medium_skin_tone": "๐Ÿ‘‡๐Ÿฝ", + "backhand_index_pointing_left": "๐Ÿ‘ˆ", + "backhand_index_pointing_left_dark_skin_tone": "๐Ÿ‘ˆ๐Ÿฟ", + "backhand_index_pointing_left_light_skin_tone": "๐Ÿ‘ˆ๐Ÿป", + "backhand_index_pointing_left_medium-dark_skin_tone": "๐Ÿ‘ˆ๐Ÿพ", + "backhand_index_pointing_left_medium-light_skin_tone": "๐Ÿ‘ˆ๐Ÿผ", + "backhand_index_pointing_left_medium_skin_tone": "๐Ÿ‘ˆ๐Ÿฝ", + "backhand_index_pointing_right": "๐Ÿ‘‰", + "backhand_index_pointing_right_dark_skin_tone": "๐Ÿ‘‰๐Ÿฟ", + "backhand_index_pointing_right_light_skin_tone": "๐Ÿ‘‰๐Ÿป", + "backhand_index_pointing_right_medium-dark_skin_tone": "๐Ÿ‘‰๐Ÿพ", + "backhand_index_pointing_right_medium-light_skin_tone": "๐Ÿ‘‰๐Ÿผ", + "backhand_index_pointing_right_medium_skin_tone": "๐Ÿ‘‰๐Ÿฝ", + "backhand_index_pointing_up": "๐Ÿ‘†", + "backhand_index_pointing_up_dark_skin_tone": "๐Ÿ‘†๐Ÿฟ", + "backhand_index_pointing_up_light_skin_tone": "๐Ÿ‘†๐Ÿป", + "backhand_index_pointing_up_medium-dark_skin_tone": "๐Ÿ‘†๐Ÿพ", + "backhand_index_pointing_up_medium-light_skin_tone": "๐Ÿ‘†๐Ÿผ", + "backhand_index_pointing_up_medium_skin_tone": "๐Ÿ‘†๐Ÿฝ", + "bacon": "๐Ÿฅ“", + "badger": "๐Ÿฆก", + "badminton": "๐Ÿธ", + "bagel": "๐Ÿฅฏ", + "baggage_claim": "๐Ÿ›„", + "baguette_bread": "๐Ÿฅ–", + "balance_scale": "โš–", + "bald": "๐Ÿฆฒ", + "bald_man": "๐Ÿ‘จ\u200d๐Ÿฆฒ", + "bald_woman": "๐Ÿ‘ฉ\u200d๐Ÿฆฒ", + "ballet_shoes": "๐Ÿฉฐ", + "balloon": "๐ŸŽˆ", + "ballot_box_with_ballot": "๐Ÿ—ณ", + "ballot_box_with_check": "โ˜‘", + "banana": "๐ŸŒ", + "banjo": "๐Ÿช•", + "bank": "๐Ÿฆ", + "bar_chart": "๐Ÿ“Š", + "barber_pole": "๐Ÿ’ˆ", + "baseball": "โšพ", + "basket": "๐Ÿงบ", + "basketball": "๐Ÿ€", + "bat": "๐Ÿฆ‡", + "bathtub": "๐Ÿ›", + "battery": "๐Ÿ”‹", + "beach_with_umbrella": "๐Ÿ–", + "beaming_face_with_smiling_eyes": "๐Ÿ˜", + "bear_face": "๐Ÿป", + "bearded_person": "๐Ÿง”", + "bearded_person_dark_skin_tone": "๐Ÿง”๐Ÿฟ", + "bearded_person_light_skin_tone": "๐Ÿง”๐Ÿป", + "bearded_person_medium-dark_skin_tone": "๐Ÿง”๐Ÿพ", + "bearded_person_medium-light_skin_tone": "๐Ÿง”๐Ÿผ", + "bearded_person_medium_skin_tone": "๐Ÿง”๐Ÿฝ", + "beating_heart": "๐Ÿ’“", + "bed": "๐Ÿ›", + "beer_mug": "๐Ÿบ", + "bell": "๐Ÿ””", + "bell_with_slash": "๐Ÿ”•", + "bellhop_bell": "๐Ÿ›Ž", + "bento_box": "๐Ÿฑ", + "beverage_box": "๐Ÿงƒ", + "bicycle": "๐Ÿšฒ", + "bikini": "๐Ÿ‘™", + "billed_cap": "๐Ÿงข", + "biohazard": "โ˜ฃ", + "bird": "๐Ÿฆ", + "birthday_cake": "๐ŸŽ‚", + "black_circle": "โšซ", + "black_flag": "๐Ÿด", + "black_heart": "๐Ÿ–ค", + "black_large_square": "โฌ›", + "black_medium-small_square": "โ—พ", + "black_medium_square": "โ—ผ", + "black_nib": "โœ’", + "black_small_square": "โ–ช", + "black_square_button": "๐Ÿ”ฒ", + "blond-haired_man": "๐Ÿ‘ฑ\u200dโ™‚๏ธ", + "blond-haired_man_dark_skin_tone": "๐Ÿ‘ฑ๐Ÿฟ\u200dโ™‚๏ธ", + "blond-haired_man_light_skin_tone": "๐Ÿ‘ฑ๐Ÿป\u200dโ™‚๏ธ", + "blond-haired_man_medium-dark_skin_tone": "๐Ÿ‘ฑ๐Ÿพ\u200dโ™‚๏ธ", + "blond-haired_man_medium-light_skin_tone": "๐Ÿ‘ฑ๐Ÿผ\u200dโ™‚๏ธ", + "blond-haired_man_medium_skin_tone": "๐Ÿ‘ฑ๐Ÿฝ\u200dโ™‚๏ธ", + "blond-haired_person": "๐Ÿ‘ฑ", + "blond-haired_person_dark_skin_tone": "๐Ÿ‘ฑ๐Ÿฟ", + "blond-haired_person_light_skin_tone": "๐Ÿ‘ฑ๐Ÿป", + "blond-haired_person_medium-dark_skin_tone": "๐Ÿ‘ฑ๐Ÿพ", + "blond-haired_person_medium-light_skin_tone": "๐Ÿ‘ฑ๐Ÿผ", + "blond-haired_person_medium_skin_tone": "๐Ÿ‘ฑ๐Ÿฝ", + "blond-haired_woman": "๐Ÿ‘ฑ\u200dโ™€๏ธ", + "blond-haired_woman_dark_skin_tone": "๐Ÿ‘ฑ๐Ÿฟ\u200dโ™€๏ธ", + "blond-haired_woman_light_skin_tone": "๐Ÿ‘ฑ๐Ÿป\u200dโ™€๏ธ", + "blond-haired_woman_medium-dark_skin_tone": "๐Ÿ‘ฑ๐Ÿพ\u200dโ™€๏ธ", + "blond-haired_woman_medium-light_skin_tone": "๐Ÿ‘ฑ๐Ÿผ\u200dโ™€๏ธ", + "blond-haired_woman_medium_skin_tone": "๐Ÿ‘ฑ๐Ÿฝ\u200dโ™€๏ธ", + "blossom": "๐ŸŒผ", + "blowfish": "๐Ÿก", + "blue_book": "๐Ÿ“˜", + "blue_circle": "๐Ÿ”ต", + "blue_heart": "๐Ÿ’™", + "blue_square": "๐ŸŸฆ", + "boar": "๐Ÿ—", + "bomb": "๐Ÿ’ฃ", + "bone": "๐Ÿฆด", + "bookmark": "๐Ÿ”–", + "bookmark_tabs": "๐Ÿ“‘", + "books": "๐Ÿ“š", + "bottle_with_popping_cork": "๐Ÿพ", + "bouquet": "๐Ÿ’", + "bow_and_arrow": "๐Ÿน", + "bowl_with_spoon": "๐Ÿฅฃ", + "bowling": "๐ŸŽณ", + "boxing_glove": "๐ŸฅŠ", + "boy": "๐Ÿ‘ฆ", + "boy_dark_skin_tone": "๐Ÿ‘ฆ๐Ÿฟ", + "boy_light_skin_tone": "๐Ÿ‘ฆ๐Ÿป", + "boy_medium-dark_skin_tone": "๐Ÿ‘ฆ๐Ÿพ", + "boy_medium-light_skin_tone": "๐Ÿ‘ฆ๐Ÿผ", + "boy_medium_skin_tone": "๐Ÿ‘ฆ๐Ÿฝ", + "brain": "๐Ÿง ", + "bread": "๐Ÿž", + "breast-feeding": "๐Ÿคฑ", + "breast-feeding_dark_skin_tone": "๐Ÿคฑ๐Ÿฟ", + "breast-feeding_light_skin_tone": "๐Ÿคฑ๐Ÿป", + "breast-feeding_medium-dark_skin_tone": "๐Ÿคฑ๐Ÿพ", + "breast-feeding_medium-light_skin_tone": "๐Ÿคฑ๐Ÿผ", + "breast-feeding_medium_skin_tone": "๐Ÿคฑ๐Ÿฝ", + "brick": "๐Ÿงฑ", + "bride_with_veil": "๐Ÿ‘ฐ", + "bride_with_veil_dark_skin_tone": "๐Ÿ‘ฐ๐Ÿฟ", + "bride_with_veil_light_skin_tone": "๐Ÿ‘ฐ๐Ÿป", + "bride_with_veil_medium-dark_skin_tone": "๐Ÿ‘ฐ๐Ÿพ", + "bride_with_veil_medium-light_skin_tone": "๐Ÿ‘ฐ๐Ÿผ", + "bride_with_veil_medium_skin_tone": "๐Ÿ‘ฐ๐Ÿฝ", + "bridge_at_night": "๐ŸŒ‰", + "briefcase": "๐Ÿ’ผ", + "briefs": "๐Ÿฉฒ", + "bright_button": "๐Ÿ”†", + "broccoli": "๐Ÿฅฆ", + "broken_heart": "๐Ÿ’”", + "broom": "๐Ÿงน", + "brown_circle": "๐ŸŸค", + "brown_heart": "๐ŸคŽ", + "brown_square": "๐ŸŸซ", + "bug": "๐Ÿ›", + "building_construction": "๐Ÿ—", + "bullet_train": "๐Ÿš…", + "burrito": "๐ŸŒฏ", + "bus": "๐ŸšŒ", + "bus_stop": "๐Ÿš", + "bust_in_silhouette": "๐Ÿ‘ค", + "busts_in_silhouette": "๐Ÿ‘ฅ", + "butter": "๐Ÿงˆ", + "butterfly": "๐Ÿฆ‹", + "cactus": "๐ŸŒต", + "calendar": "๐Ÿ“†", + "call_me_hand": "๐Ÿค™", + "call_me_hand_dark_skin_tone": "๐Ÿค™๐Ÿฟ", + "call_me_hand_light_skin_tone": "๐Ÿค™๐Ÿป", + "call_me_hand_medium-dark_skin_tone": "๐Ÿค™๐Ÿพ", + "call_me_hand_medium-light_skin_tone": "๐Ÿค™๐Ÿผ", + "call_me_hand_medium_skin_tone": "๐Ÿค™๐Ÿฝ", + "camel": "๐Ÿซ", + "camera": "๐Ÿ“ท", + "camera_with_flash": "๐Ÿ“ธ", + "camping": "๐Ÿ•", + "candle": "๐Ÿ•ฏ", + "candy": "๐Ÿฌ", + "canned_food": "๐Ÿฅซ", + "canoe": "๐Ÿ›ถ", + "card_file_box": "๐Ÿ—ƒ", + "card_index": "๐Ÿ“‡", + "card_index_dividers": "๐Ÿ—‚", + "carousel_horse": "๐ŸŽ ", + "carp_streamer": "๐ŸŽ", + "carrot": "๐Ÿฅ•", + "castle": "๐Ÿฐ", + "cat": "๐Ÿฑ", + "cat_face": "๐Ÿฑ", + "cat_face_with_tears_of_joy": "๐Ÿ˜น", + "cat_face_with_wry_smile": "๐Ÿ˜ผ", + "chains": "โ›“", + "chair": "๐Ÿช‘", + "chart_decreasing": "๐Ÿ“‰", + "chart_increasing": "๐Ÿ“ˆ", + "chart_increasing_with_yen": "๐Ÿ’น", + "cheese_wedge": "๐Ÿง€", + "chequered_flag": "๐Ÿ", + "cherries": "๐Ÿ’", + "cherry_blossom": "๐ŸŒธ", + "chess_pawn": "โ™Ÿ", + "chestnut": "๐ŸŒฐ", + "chicken": "๐Ÿ”", + "child": "๐Ÿง’", + "child_dark_skin_tone": "๐Ÿง’๐Ÿฟ", + "child_light_skin_tone": "๐Ÿง’๐Ÿป", + "child_medium-dark_skin_tone": "๐Ÿง’๐Ÿพ", + "child_medium-light_skin_tone": "๐Ÿง’๐Ÿผ", + "child_medium_skin_tone": "๐Ÿง’๐Ÿฝ", + "children_crossing": "๐Ÿšธ", + "chipmunk": "๐Ÿฟ", + "chocolate_bar": "๐Ÿซ", + "chopsticks": "๐Ÿฅข", + "church": "โ›ช", + "cigarette": "๐Ÿšฌ", + "cinema": "๐ŸŽฆ", + "circled_m": "โ“‚", + "circus_tent": "๐ŸŽช", + "cityscape": "๐Ÿ™", + "cityscape_at_dusk": "๐ŸŒ†", + "clamp": "๐Ÿ—œ", + "clapper_board": "๐ŸŽฌ", + "clapping_hands": "๐Ÿ‘", + "clapping_hands_dark_skin_tone": "๐Ÿ‘๐Ÿฟ", + "clapping_hands_light_skin_tone": "๐Ÿ‘๐Ÿป", + "clapping_hands_medium-dark_skin_tone": "๐Ÿ‘๐Ÿพ", + "clapping_hands_medium-light_skin_tone": "๐Ÿ‘๐Ÿผ", + "clapping_hands_medium_skin_tone": "๐Ÿ‘๐Ÿฝ", + "classical_building": "๐Ÿ›", + "clinking_beer_mugs": "๐Ÿป", + "clinking_glasses": "๐Ÿฅ‚", + "clipboard": "๐Ÿ“‹", + "clockwise_vertical_arrows": "๐Ÿ”ƒ", + "closed_book": "๐Ÿ“•", + "closed_mailbox_with_lowered_flag": "๐Ÿ“ช", + "closed_mailbox_with_raised_flag": "๐Ÿ“ซ", + "closed_umbrella": "๐ŸŒ‚", + "cloud": "โ˜", + "cloud_with_lightning": "๐ŸŒฉ", + "cloud_with_lightning_and_rain": "โ›ˆ", + "cloud_with_rain": "๐ŸŒง", + "cloud_with_snow": "๐ŸŒจ", + "clown_face": "๐Ÿคก", + "club_suit": "โ™ฃ", + "clutch_bag": "๐Ÿ‘", + "coat": "๐Ÿงฅ", + "cocktail_glass": "๐Ÿธ", + "coconut": "๐Ÿฅฅ", + "coffin": "โšฐ", + "cold_face": "๐Ÿฅถ", + "collision": "๐Ÿ’ฅ", + "comet": "โ˜„", + "compass": "๐Ÿงญ", + "computer_disk": "๐Ÿ’ฝ", + "computer_mouse": "๐Ÿ–ฑ", + "confetti_ball": "๐ŸŽŠ", + "confounded_face": "๐Ÿ˜–", + "confused_face": "๐Ÿ˜•", + "construction": "๐Ÿšง", + "construction_worker": "๐Ÿ‘ท", + "construction_worker_dark_skin_tone": "๐Ÿ‘ท๐Ÿฟ", + "construction_worker_light_skin_tone": "๐Ÿ‘ท๐Ÿป", + "construction_worker_medium-dark_skin_tone": "๐Ÿ‘ท๐Ÿพ", + "construction_worker_medium-light_skin_tone": "๐Ÿ‘ท๐Ÿผ", + "construction_worker_medium_skin_tone": "๐Ÿ‘ท๐Ÿฝ", + "control_knobs": "๐ŸŽ›", + "convenience_store": "๐Ÿช", + "cooked_rice": "๐Ÿš", + "cookie": "๐Ÿช", + "cooking": "๐Ÿณ", + "copyright": "ยฉ", + "couch_and_lamp": "๐Ÿ›‹", + "counterclockwise_arrows_button": "๐Ÿ”„", + "couple_with_heart": "๐Ÿ’‘", + "couple_with_heart_man_man": "๐Ÿ‘จ\u200dโค๏ธ\u200d๐Ÿ‘จ", + "couple_with_heart_woman_man": "๐Ÿ‘ฉ\u200dโค๏ธ\u200d๐Ÿ‘จ", + "couple_with_heart_woman_woman": "๐Ÿ‘ฉ\u200dโค๏ธ\u200d๐Ÿ‘ฉ", + "cow": "๐Ÿฎ", + "cow_face": "๐Ÿฎ", + "cowboy_hat_face": "๐Ÿค ", + "crab": "๐Ÿฆ€", + "crayon": "๐Ÿ–", + "credit_card": "๐Ÿ’ณ", + "crescent_moon": "๐ŸŒ™", + "cricket": "๐Ÿฆ—", + "cricket_game": "๐Ÿ", + "crocodile": "๐ŸŠ", + "croissant": "๐Ÿฅ", + "cross_mark": "โŒ", + "cross_mark_button": "โŽ", + "crossed_fingers": "๐Ÿคž", + "crossed_fingers_dark_skin_tone": "๐Ÿคž๐Ÿฟ", + "crossed_fingers_light_skin_tone": "๐Ÿคž๐Ÿป", + "crossed_fingers_medium-dark_skin_tone": "๐Ÿคž๐Ÿพ", + "crossed_fingers_medium-light_skin_tone": "๐Ÿคž๐Ÿผ", + "crossed_fingers_medium_skin_tone": "๐Ÿคž๐Ÿฝ", + "crossed_flags": "๐ŸŽŒ", + "crossed_swords": "โš”", + "crown": "๐Ÿ‘‘", + "crying_cat_face": "๐Ÿ˜ฟ", + "crying_face": "๐Ÿ˜ข", + "crystal_ball": "๐Ÿ”ฎ", + "cucumber": "๐Ÿฅ’", + "cupcake": "๐Ÿง", + "cup_with_straw": "๐Ÿฅค", + "curling_stone": "๐ŸฅŒ", + "curly_hair": "๐Ÿฆฑ", + "curly-haired_man": "๐Ÿ‘จ\u200d๐Ÿฆฑ", + "curly-haired_woman": "๐Ÿ‘ฉ\u200d๐Ÿฆฑ", + "curly_loop": "โžฐ", + "currency_exchange": "๐Ÿ’ฑ", + "curry_rice": "๐Ÿ›", + "custard": "๐Ÿฎ", + "customs": "๐Ÿ›ƒ", + "cut_of_meat": "๐Ÿฅฉ", + "cyclone": "๐ŸŒ€", + "dagger": "๐Ÿ—ก", + "dango": "๐Ÿก", + "dashing_away": "๐Ÿ’จ", + "deaf_person": "๐Ÿง", + "deciduous_tree": "๐ŸŒณ", + "deer": "๐ŸฆŒ", + "delivery_truck": "๐Ÿšš", + "department_store": "๐Ÿฌ", + "derelict_house": "๐Ÿš", + "desert": "๐Ÿœ", + "desert_island": "๐Ÿ", + "desktop_computer": "๐Ÿ–ฅ", + "detective": "๐Ÿ•ต", + "detective_dark_skin_tone": "๐Ÿ•ต๐Ÿฟ", + "detective_light_skin_tone": "๐Ÿ•ต๐Ÿป", + "detective_medium-dark_skin_tone": "๐Ÿ•ต๐Ÿพ", + "detective_medium-light_skin_tone": "๐Ÿ•ต๐Ÿผ", + "detective_medium_skin_tone": "๐Ÿ•ต๐Ÿฝ", + "diamond_suit": "โ™ฆ", + "diamond_with_a_dot": "๐Ÿ’ ", + "dim_button": "๐Ÿ”…", + "direct_hit": "๐ŸŽฏ", + "disappointed_face": "๐Ÿ˜ž", + "diving_mask": "๐Ÿคฟ", + "diya_lamp": "๐Ÿช”", + "dizzy": "๐Ÿ’ซ", + "dizzy_face": "๐Ÿ˜ต", + "dna": "๐Ÿงฌ", + "dog": "๐Ÿถ", + "dog_face": "๐Ÿถ", + "dollar_banknote": "๐Ÿ’ต", + "dolphin": "๐Ÿฌ", + "door": "๐Ÿšช", + "dotted_six-pointed_star": "๐Ÿ”ฏ", + "double_curly_loop": "โžฟ", + "double_exclamation_mark": "โ€ผ", + "doughnut": "๐Ÿฉ", + "dove": "๐Ÿ•Š", + "down-left_arrow": "โ†™", + "down-right_arrow": "โ†˜", + "down_arrow": "โฌ‡", + "downcast_face_with_sweat": "๐Ÿ˜“", + "downwards_button": "๐Ÿ”ฝ", + "dragon": "๐Ÿ‰", + "dragon_face": "๐Ÿฒ", + "dress": "๐Ÿ‘—", + "drooling_face": "๐Ÿคค", + "drop_of_blood": "๐Ÿฉธ", + "droplet": "๐Ÿ’ง", + "drum": "๐Ÿฅ", + "duck": "๐Ÿฆ†", + "dumpling": "๐ŸฅŸ", + "dvd": "๐Ÿ“€", + "e-mail": "๐Ÿ“ง", + "eagle": "๐Ÿฆ…", + "ear": "๐Ÿ‘‚", + "ear_dark_skin_tone": "๐Ÿ‘‚๐Ÿฟ", + "ear_light_skin_tone": "๐Ÿ‘‚๐Ÿป", + "ear_medium-dark_skin_tone": "๐Ÿ‘‚๐Ÿพ", + "ear_medium-light_skin_tone": "๐Ÿ‘‚๐Ÿผ", + "ear_medium_skin_tone": "๐Ÿ‘‚๐Ÿฝ", + "ear_of_corn": "๐ŸŒฝ", + "ear_with_hearing_aid": "๐Ÿฆป", + "egg": "๐Ÿณ", + "eggplant": "๐Ÿ†", + "eight-pointed_star": "โœด", + "eight-spoked_asterisk": "โœณ", + "eight-thirty": "๐Ÿ•ฃ", + "eight_oโ€™clock": "๐Ÿ•—", + "eject_button": "โ", + "electric_plug": "๐Ÿ”Œ", + "elephant": "๐Ÿ˜", + "eleven-thirty": "๐Ÿ•ฆ", + "eleven_oโ€™clock": "๐Ÿ•š", + "elf": "๐Ÿง", + "elf_dark_skin_tone": "๐Ÿง๐Ÿฟ", + "elf_light_skin_tone": "๐Ÿง๐Ÿป", + "elf_medium-dark_skin_tone": "๐Ÿง๐Ÿพ", + "elf_medium-light_skin_tone": "๐Ÿง๐Ÿผ", + "elf_medium_skin_tone": "๐Ÿง๐Ÿฝ", + "envelope": "โœ‰", + "envelope_with_arrow": "๐Ÿ“ฉ", + "euro_banknote": "๐Ÿ’ถ", + "evergreen_tree": "๐ŸŒฒ", + "ewe": "๐Ÿ‘", + "exclamation_mark": "โ—", + "exclamation_question_mark": "โ‰", + "exploding_head": "๐Ÿคฏ", + "expressionless_face": "๐Ÿ˜‘", + "eye": "๐Ÿ‘", + "eye_in_speech_bubble": "๐Ÿ‘๏ธ\u200d๐Ÿ—จ๏ธ", + "eyes": "๐Ÿ‘€", + "face_blowing_a_kiss": "๐Ÿ˜˜", + "face_savoring_food": "๐Ÿ˜‹", + "face_screaming_in_fear": "๐Ÿ˜ฑ", + "face_vomiting": "๐Ÿคฎ", + "face_with_hand_over_mouth": "๐Ÿคญ", + "face_with_head-bandage": "๐Ÿค•", + "face_with_medical_mask": "๐Ÿ˜ท", + "face_with_monocle": "๐Ÿง", + "face_with_open_mouth": "๐Ÿ˜ฎ", + "face_with_raised_eyebrow": "๐Ÿคจ", + "face_with_rolling_eyes": "๐Ÿ™„", + "face_with_steam_from_nose": "๐Ÿ˜ค", + "face_with_symbols_on_mouth": "๐Ÿคฌ", + "face_with_tears_of_joy": "๐Ÿ˜‚", + "face_with_thermometer": "๐Ÿค’", + "face_with_tongue": "๐Ÿ˜›", + "face_without_mouth": "๐Ÿ˜ถ", + "factory": "๐Ÿญ", + "fairy": "๐Ÿงš", + "fairy_dark_skin_tone": "๐Ÿงš๐Ÿฟ", + "fairy_light_skin_tone": "๐Ÿงš๐Ÿป", + "fairy_medium-dark_skin_tone": "๐Ÿงš๐Ÿพ", + "fairy_medium-light_skin_tone": "๐Ÿงš๐Ÿผ", + "fairy_medium_skin_tone": "๐Ÿงš๐Ÿฝ", + "falafel": "๐Ÿง†", + "fallen_leaf": "๐Ÿ‚", + "family": "๐Ÿ‘ช", + "family_man_boy": "๐Ÿ‘จ\u200d๐Ÿ‘ฆ", + "family_man_boy_boy": "๐Ÿ‘จ\u200d๐Ÿ‘ฆ\u200d๐Ÿ‘ฆ", + "family_man_girl": "๐Ÿ‘จ\u200d๐Ÿ‘ง", + "family_man_girl_boy": "๐Ÿ‘จ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ฆ", + "family_man_girl_girl": "๐Ÿ‘จ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ง", + "family_man_man_boy": "๐Ÿ‘จ\u200d๐Ÿ‘จ\u200d๐Ÿ‘ฆ", + "family_man_man_boy_boy": "๐Ÿ‘จ\u200d๐Ÿ‘จ\u200d๐Ÿ‘ฆ\u200d๐Ÿ‘ฆ", + "family_man_man_girl": "๐Ÿ‘จ\u200d๐Ÿ‘จ\u200d๐Ÿ‘ง", + "family_man_man_girl_boy": "๐Ÿ‘จ\u200d๐Ÿ‘จ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ฆ", + "family_man_man_girl_girl": "๐Ÿ‘จ\u200d๐Ÿ‘จ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ง", + "family_man_woman_boy": "๐Ÿ‘จ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ฆ", + "family_man_woman_boy_boy": "๐Ÿ‘จ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ฆ\u200d๐Ÿ‘ฆ", + "family_man_woman_girl": "๐Ÿ‘จ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ง", + "family_man_woman_girl_boy": "๐Ÿ‘จ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ฆ", + "family_man_woman_girl_girl": "๐Ÿ‘จ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ง", + "family_woman_boy": "๐Ÿ‘ฉ\u200d๐Ÿ‘ฆ", + "family_woman_boy_boy": "๐Ÿ‘ฉ\u200d๐Ÿ‘ฆ\u200d๐Ÿ‘ฆ", + "family_woman_girl": "๐Ÿ‘ฉ\u200d๐Ÿ‘ง", + "family_woman_girl_boy": "๐Ÿ‘ฉ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ฆ", + "family_woman_girl_girl": "๐Ÿ‘ฉ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ง", + "family_woman_woman_boy": "๐Ÿ‘ฉ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ฆ", + "family_woman_woman_boy_boy": "๐Ÿ‘ฉ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ฆ\u200d๐Ÿ‘ฆ", + "family_woman_woman_girl": "๐Ÿ‘ฉ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ง", + "family_woman_woman_girl_boy": "๐Ÿ‘ฉ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ฆ", + "family_woman_woman_girl_girl": "๐Ÿ‘ฉ\u200d๐Ÿ‘ฉ\u200d๐Ÿ‘ง\u200d๐Ÿ‘ง", + "fast-forward_button": "โฉ", + "fast_down_button": "โฌ", + "fast_reverse_button": "โช", + "fast_up_button": "โซ", + "fax_machine": "๐Ÿ“ ", + "fearful_face": "๐Ÿ˜จ", + "female_sign": "โ™€", + "ferris_wheel": "๐ŸŽก", + "ferry": "โ›ด", + "field_hockey": "๐Ÿ‘", + "file_cabinet": "๐Ÿ—„", + "file_folder": "๐Ÿ“", + "film_frames": "๐ŸŽž", + "film_projector": "๐Ÿ“ฝ", + "fire": "๐Ÿ”ฅ", + "fire_extinguisher": "๐Ÿงฏ", + "firecracker": "๐Ÿงจ", + "fire_engine": "๐Ÿš’", + "fireworks": "๐ŸŽ†", + "first_quarter_moon": "๐ŸŒ“", + "first_quarter_moon_face": "๐ŸŒ›", + "fish": "๐ŸŸ", + "fish_cake_with_swirl": "๐Ÿฅ", + "fishing_pole": "๐ŸŽฃ", + "five-thirty": "๐Ÿ• ", + "five_oโ€™clock": "๐Ÿ•”", + "flag_in_hole": "โ›ณ", + "flamingo": "๐Ÿฆฉ", + "flashlight": "๐Ÿ”ฆ", + "flat_shoe": "๐Ÿฅฟ", + "fleur-de-lis": "โšœ", + "flexed_biceps": "๐Ÿ’ช", + "flexed_biceps_dark_skin_tone": "๐Ÿ’ช๐Ÿฟ", + "flexed_biceps_light_skin_tone": "๐Ÿ’ช๐Ÿป", + "flexed_biceps_medium-dark_skin_tone": "๐Ÿ’ช๐Ÿพ", + "flexed_biceps_medium-light_skin_tone": "๐Ÿ’ช๐Ÿผ", + "flexed_biceps_medium_skin_tone": "๐Ÿ’ช๐Ÿฝ", + "floppy_disk": "๐Ÿ’พ", + "flower_playing_cards": "๐ŸŽด", + "flushed_face": "๐Ÿ˜ณ", + "flying_disc": "๐Ÿฅ", + "flying_saucer": "๐Ÿ›ธ", + "fog": "๐ŸŒซ", + "foggy": "๐ŸŒ", + "folded_hands": "๐Ÿ™", + "folded_hands_dark_skin_tone": "๐Ÿ™๐Ÿฟ", + "folded_hands_light_skin_tone": "๐Ÿ™๐Ÿป", + "folded_hands_medium-dark_skin_tone": "๐Ÿ™๐Ÿพ", + "folded_hands_medium-light_skin_tone": "๐Ÿ™๐Ÿผ", + "folded_hands_medium_skin_tone": "๐Ÿ™๐Ÿฝ", + "foot": "๐Ÿฆถ", + "footprints": "๐Ÿ‘ฃ", + "fork_and_knife": "๐Ÿด", + "fork_and_knife_with_plate": "๐Ÿฝ", + "fortune_cookie": "๐Ÿฅ ", + "fountain": "โ›ฒ", + "fountain_pen": "๐Ÿ–‹", + "four-thirty": "๐Ÿ•Ÿ", + "four_leaf_clover": "๐Ÿ€", + "four_oโ€™clock": "๐Ÿ•“", + "fox_face": "๐ŸฆŠ", + "framed_picture": "๐Ÿ–ผ", + "french_fries": "๐ŸŸ", + "fried_shrimp": "๐Ÿค", + "frog_face": "๐Ÿธ", + "front-facing_baby_chick": "๐Ÿฅ", + "frowning_face": "โ˜น", + "frowning_face_with_open_mouth": "๐Ÿ˜ฆ", + "fuel_pump": "โ›ฝ", + "full_moon": "๐ŸŒ•", + "full_moon_face": "๐ŸŒ", + "funeral_urn": "โšฑ", + "game_die": "๐ŸŽฒ", + "garlic": "๐Ÿง„", + "gear": "โš™", + "gem_stone": "๐Ÿ’Ž", + "genie": "๐Ÿงž", + "ghost": "๐Ÿ‘ป", + "giraffe": "๐Ÿฆ’", + "girl": "๐Ÿ‘ง", + "girl_dark_skin_tone": "๐Ÿ‘ง๐Ÿฟ", + "girl_light_skin_tone": "๐Ÿ‘ง๐Ÿป", + "girl_medium-dark_skin_tone": "๐Ÿ‘ง๐Ÿพ", + "girl_medium-light_skin_tone": "๐Ÿ‘ง๐Ÿผ", + "girl_medium_skin_tone": "๐Ÿ‘ง๐Ÿฝ", + "glass_of_milk": "๐Ÿฅ›", + "glasses": "๐Ÿ‘“", + "globe_showing_americas": "๐ŸŒŽ", + "globe_showing_asia-australia": "๐ŸŒ", + "globe_showing_europe-africa": "๐ŸŒ", + "globe_with_meridians": "๐ŸŒ", + "gloves": "๐Ÿงค", + "glowing_star": "๐ŸŒŸ", + "goal_net": "๐Ÿฅ…", + "goat": "๐Ÿ", + "goblin": "๐Ÿ‘บ", + "goggles": "๐Ÿฅฝ", + "gorilla": "๐Ÿฆ", + "graduation_cap": "๐ŸŽ“", + "grapes": "๐Ÿ‡", + "green_apple": "๐Ÿ", + "green_book": "๐Ÿ“—", + "green_circle": "๐ŸŸข", + "green_heart": "๐Ÿ’š", + "green_salad": "๐Ÿฅ—", + "green_square": "๐ŸŸฉ", + "grimacing_face": "๐Ÿ˜ฌ", + "grinning_cat_face": "๐Ÿ˜บ", + "grinning_cat_face_with_smiling_eyes": "๐Ÿ˜ธ", + "grinning_face": "๐Ÿ˜€", + "grinning_face_with_big_eyes": "๐Ÿ˜ƒ", + "grinning_face_with_smiling_eyes": "๐Ÿ˜„", + "grinning_face_with_sweat": "๐Ÿ˜…", + "grinning_squinting_face": "๐Ÿ˜†", + "growing_heart": "๐Ÿ’—", + "guard": "๐Ÿ’‚", + "guard_dark_skin_tone": "๐Ÿ’‚๐Ÿฟ", + "guard_light_skin_tone": "๐Ÿ’‚๐Ÿป", + "guard_medium-dark_skin_tone": "๐Ÿ’‚๐Ÿพ", + "guard_medium-light_skin_tone": "๐Ÿ’‚๐Ÿผ", + "guard_medium_skin_tone": "๐Ÿ’‚๐Ÿฝ", + "guide_dog": "๐Ÿฆฎ", + "guitar": "๐ŸŽธ", + "hamburger": "๐Ÿ”", + "hammer": "๐Ÿ”จ", + "hammer_and_pick": "โš’", + "hammer_and_wrench": "๐Ÿ› ", + "hamster_face": "๐Ÿน", + "hand_with_fingers_splayed": "๐Ÿ–", + "hand_with_fingers_splayed_dark_skin_tone": "๐Ÿ–๐Ÿฟ", + "hand_with_fingers_splayed_light_skin_tone": "๐Ÿ–๐Ÿป", + "hand_with_fingers_splayed_medium-dark_skin_tone": "๐Ÿ–๐Ÿพ", + "hand_with_fingers_splayed_medium-light_skin_tone": "๐Ÿ–๐Ÿผ", + "hand_with_fingers_splayed_medium_skin_tone": "๐Ÿ–๐Ÿฝ", + "handbag": "๐Ÿ‘œ", + "handshake": "๐Ÿค", + "hatching_chick": "๐Ÿฃ", + "headphone": "๐ŸŽง", + "hear-no-evil_monkey": "๐Ÿ™‰", + "heart_decoration": "๐Ÿ’Ÿ", + "heart_suit": "โ™ฅ", + "heart_with_arrow": "๐Ÿ’˜", + "heart_with_ribbon": "๐Ÿ’", + "heavy_check_mark": "โœ”", + "heavy_division_sign": "โž—", + "heavy_dollar_sign": "๐Ÿ’ฒ", + "heavy_heart_exclamation": "โฃ", + "heavy_large_circle": "โญ•", + "heavy_minus_sign": "โž–", + "heavy_multiplication_x": "โœ–", + "heavy_plus_sign": "โž•", + "hedgehog": "๐Ÿฆ”", + "helicopter": "๐Ÿš", + "herb": "๐ŸŒฟ", + "hibiscus": "๐ŸŒบ", + "high-heeled_shoe": "๐Ÿ‘ ", + "high-speed_train": "๐Ÿš„", + "high_voltage": "โšก", + "hiking_boot": "๐Ÿฅพ", + "hindu_temple": "๐Ÿ›•", + "hippopotamus": "๐Ÿฆ›", + "hole": "๐Ÿ•ณ", + "honey_pot": "๐Ÿฏ", + "honeybee": "๐Ÿ", + "horizontal_traffic_light": "๐Ÿšฅ", + "horse": "๐Ÿด", + "horse_face": "๐Ÿด", + "horse_racing": "๐Ÿ‡", + "horse_racing_dark_skin_tone": "๐Ÿ‡๐Ÿฟ", + "horse_racing_light_skin_tone": "๐Ÿ‡๐Ÿป", + "horse_racing_medium-dark_skin_tone": "๐Ÿ‡๐Ÿพ", + "horse_racing_medium-light_skin_tone": "๐Ÿ‡๐Ÿผ", + "horse_racing_medium_skin_tone": "๐Ÿ‡๐Ÿฝ", + "hospital": "๐Ÿฅ", + "hot_beverage": "โ˜•", + "hot_dog": "๐ŸŒญ", + "hot_face": "๐Ÿฅต", + "hot_pepper": "๐ŸŒถ", + "hot_springs": "โ™จ", + "hotel": "๐Ÿจ", + "hourglass_done": "โŒ›", + "hourglass_not_done": "โณ", + "house": "๐Ÿ ", + "house_with_garden": "๐Ÿก", + "houses": "๐Ÿ˜", + "hugging_face": "๐Ÿค—", + "hundred_points": "๐Ÿ’ฏ", + "hushed_face": "๐Ÿ˜ฏ", + "ice": "๐ŸงŠ", + "ice_cream": "๐Ÿจ", + "ice_hockey": "๐Ÿ’", + "ice_skate": "โ›ธ", + "inbox_tray": "๐Ÿ“ฅ", + "incoming_envelope": "๐Ÿ“จ", + "index_pointing_up": "โ˜", + "index_pointing_up_dark_skin_tone": "โ˜๐Ÿฟ", + "index_pointing_up_light_skin_tone": "โ˜๐Ÿป", + "index_pointing_up_medium-dark_skin_tone": "โ˜๐Ÿพ", + "index_pointing_up_medium-light_skin_tone": "โ˜๐Ÿผ", + "index_pointing_up_medium_skin_tone": "โ˜๐Ÿฝ", + "infinity": "โ™พ", + "information": "โ„น", + "input_latin_letters": "๐Ÿ”ค", + "input_latin_lowercase": "๐Ÿ”ก", + "input_latin_uppercase": "๐Ÿ” ", + "input_numbers": "๐Ÿ”ข", + "input_symbols": "๐Ÿ”ฃ", + "jack-o-lantern": "๐ŸŽƒ", + "jeans": "๐Ÿ‘–", + "jigsaw": "๐Ÿงฉ", + "joker": "๐Ÿƒ", + "joystick": "๐Ÿ•น", + "kaaba": "๐Ÿ•‹", + "kangaroo": "๐Ÿฆ˜", + "key": "๐Ÿ”‘", + "keyboard": "โŒจ", + "keycap_#": "#๏ธโƒฃ", + "keycap_*": "*๏ธโƒฃ", + "keycap_0": "0๏ธโƒฃ", + "keycap_1": "1๏ธโƒฃ", + "keycap_10": "๐Ÿ”Ÿ", + "keycap_2": "2๏ธโƒฃ", + "keycap_3": "3๏ธโƒฃ", + "keycap_4": "4๏ธโƒฃ", + "keycap_5": "5๏ธโƒฃ", + "keycap_6": "6๏ธโƒฃ", + "keycap_7": "7๏ธโƒฃ", + "keycap_8": "8๏ธโƒฃ", + "keycap_9": "9๏ธโƒฃ", + "kick_scooter": "๐Ÿ›ด", + "kimono": "๐Ÿ‘˜", + "kiss": "๐Ÿ’‹", + "kiss_man_man": "๐Ÿ‘จ\u200dโค๏ธ\u200d๐Ÿ’‹\u200d๐Ÿ‘จ", + "kiss_mark": "๐Ÿ’‹", + "kiss_woman_man": "๐Ÿ‘ฉ\u200dโค๏ธ\u200d๐Ÿ’‹\u200d๐Ÿ‘จ", + "kiss_woman_woman": "๐Ÿ‘ฉ\u200dโค๏ธ\u200d๐Ÿ’‹\u200d๐Ÿ‘ฉ", + "kissing_cat_face": "๐Ÿ˜ฝ", + "kissing_face": "๐Ÿ˜—", + "kissing_face_with_closed_eyes": "๐Ÿ˜š", + "kissing_face_with_smiling_eyes": "๐Ÿ˜™", + "kitchen_knife": "๐Ÿ”ช", + "kite": "๐Ÿช", + "kiwi_fruit": "๐Ÿฅ", + "koala": "๐Ÿจ", + "lab_coat": "๐Ÿฅผ", + "label": "๐Ÿท", + "lacrosse": "๐Ÿฅ", + "lady_beetle": "๐Ÿž", + "laptop_computer": "๐Ÿ’ป", + "large_blue_diamond": "๐Ÿ”ท", + "large_orange_diamond": "๐Ÿ”ถ", + "last_quarter_moon": "๐ŸŒ—", + "last_quarter_moon_face": "๐ŸŒœ", + "last_track_button": "โฎ", + "latin_cross": "โœ", + "leaf_fluttering_in_wind": "๐Ÿƒ", + "leafy_green": "๐Ÿฅฌ", + "ledger": "๐Ÿ“’", + "left-facing_fist": "๐Ÿค›", + "left-facing_fist_dark_skin_tone": "๐Ÿค›๐Ÿฟ", + "left-facing_fist_light_skin_tone": "๐Ÿค›๐Ÿป", + "left-facing_fist_medium-dark_skin_tone": "๐Ÿค›๐Ÿพ", + "left-facing_fist_medium-light_skin_tone": "๐Ÿค›๐Ÿผ", + "left-facing_fist_medium_skin_tone": "๐Ÿค›๐Ÿฝ", + "left-right_arrow": "โ†”", + "left_arrow": "โฌ…", + "left_arrow_curving_right": "โ†ช", + "left_luggage": "๐Ÿ›…", + "left_speech_bubble": "๐Ÿ—จ", + "leg": "๐Ÿฆต", + "lemon": "๐Ÿ‹", + "leopard": "๐Ÿ†", + "level_slider": "๐ŸŽš", + "light_bulb": "๐Ÿ’ก", + "light_rail": "๐Ÿšˆ", + "link": "๐Ÿ”—", + "linked_paperclips": "๐Ÿ–‡", + "lion_face": "๐Ÿฆ", + "lipstick": "๐Ÿ’„", + "litter_in_bin_sign": "๐Ÿšฎ", + "lizard": "๐ŸฆŽ", + "llama": "๐Ÿฆ™", + "lobster": "๐Ÿฆž", + "locked": "๐Ÿ”’", + "locked_with_key": "๐Ÿ”", + "locked_with_pen": "๐Ÿ”", + "locomotive": "๐Ÿš‚", + "lollipop": "๐Ÿญ", + "lotion_bottle": "๐Ÿงด", + "loudly_crying_face": "๐Ÿ˜ญ", + "loudspeaker": "๐Ÿ“ข", + "love-you_gesture": "๐ŸคŸ", + "love-you_gesture_dark_skin_tone": "๐ŸคŸ๐Ÿฟ", + "love-you_gesture_light_skin_tone": "๐ŸคŸ๐Ÿป", + "love-you_gesture_medium-dark_skin_tone": "๐ŸคŸ๐Ÿพ", + "love-you_gesture_medium-light_skin_tone": "๐ŸคŸ๐Ÿผ", + "love-you_gesture_medium_skin_tone": "๐ŸคŸ๐Ÿฝ", + "love_hotel": "๐Ÿฉ", + "love_letter": "๐Ÿ’Œ", + "luggage": "๐Ÿงณ", + "lying_face": "๐Ÿคฅ", + "mage": "๐Ÿง™", + "mage_dark_skin_tone": "๐Ÿง™๐Ÿฟ", + "mage_light_skin_tone": "๐Ÿง™๐Ÿป", + "mage_medium-dark_skin_tone": "๐Ÿง™๐Ÿพ", + "mage_medium-light_skin_tone": "๐Ÿง™๐Ÿผ", + "mage_medium_skin_tone": "๐Ÿง™๐Ÿฝ", + "magnet": "๐Ÿงฒ", + "magnifying_glass_tilted_left": "๐Ÿ”", + "magnifying_glass_tilted_right": "๐Ÿ”Ž", + "mahjong_red_dragon": "๐Ÿ€„", + "male_sign": "โ™‚", + "man": "๐Ÿ‘จ", + "man_and_woman_holding_hands": "๐Ÿ‘ซ", + "man_artist": "๐Ÿ‘จ\u200d๐ŸŽจ", + "man_artist_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐ŸŽจ", + "man_artist_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐ŸŽจ", + "man_artist_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐ŸŽจ", + "man_artist_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐ŸŽจ", + "man_artist_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐ŸŽจ", + "man_astronaut": "๐Ÿ‘จ\u200d๐Ÿš€", + "man_astronaut_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿš€", + "man_astronaut_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿš€", + "man_astronaut_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿš€", + "man_astronaut_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿš€", + "man_astronaut_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿš€", + "man_biking": "๐Ÿšด\u200dโ™‚๏ธ", + "man_biking_dark_skin_tone": "๐Ÿšด๐Ÿฟ\u200dโ™‚๏ธ", + "man_biking_light_skin_tone": "๐Ÿšด๐Ÿป\u200dโ™‚๏ธ", + "man_biking_medium-dark_skin_tone": "๐Ÿšด๐Ÿพ\u200dโ™‚๏ธ", + "man_biking_medium-light_skin_tone": "๐Ÿšด๐Ÿผ\u200dโ™‚๏ธ", + "man_biking_medium_skin_tone": "๐Ÿšด๐Ÿฝ\u200dโ™‚๏ธ", + "man_bouncing_ball": "โ›น๏ธ\u200dโ™‚๏ธ", + "man_bouncing_ball_dark_skin_tone": "โ›น๐Ÿฟ\u200dโ™‚๏ธ", + "man_bouncing_ball_light_skin_tone": "โ›น๐Ÿป\u200dโ™‚๏ธ", + "man_bouncing_ball_medium-dark_skin_tone": "โ›น๐Ÿพ\u200dโ™‚๏ธ", + "man_bouncing_ball_medium-light_skin_tone": "โ›น๐Ÿผ\u200dโ™‚๏ธ", + "man_bouncing_ball_medium_skin_tone": "โ›น๐Ÿฝ\u200dโ™‚๏ธ", + "man_bowing": "๐Ÿ™‡\u200dโ™‚๏ธ", + "man_bowing_dark_skin_tone": "๐Ÿ™‡๐Ÿฟ\u200dโ™‚๏ธ", + "man_bowing_light_skin_tone": "๐Ÿ™‡๐Ÿป\u200dโ™‚๏ธ", + "man_bowing_medium-dark_skin_tone": "๐Ÿ™‡๐Ÿพ\u200dโ™‚๏ธ", + "man_bowing_medium-light_skin_tone": "๐Ÿ™‡๐Ÿผ\u200dโ™‚๏ธ", + "man_bowing_medium_skin_tone": "๐Ÿ™‡๐Ÿฝ\u200dโ™‚๏ธ", + "man_cartwheeling": "๐Ÿคธ\u200dโ™‚๏ธ", + "man_cartwheeling_dark_skin_tone": "๐Ÿคธ๐Ÿฟ\u200dโ™‚๏ธ", + "man_cartwheeling_light_skin_tone": "๐Ÿคธ๐Ÿป\u200dโ™‚๏ธ", + "man_cartwheeling_medium-dark_skin_tone": "๐Ÿคธ๐Ÿพ\u200dโ™‚๏ธ", + "man_cartwheeling_medium-light_skin_tone": "๐Ÿคธ๐Ÿผ\u200dโ™‚๏ธ", + "man_cartwheeling_medium_skin_tone": "๐Ÿคธ๐Ÿฝ\u200dโ™‚๏ธ", + "man_climbing": "๐Ÿง—\u200dโ™‚๏ธ", + "man_climbing_dark_skin_tone": "๐Ÿง—๐Ÿฟ\u200dโ™‚๏ธ", + "man_climbing_light_skin_tone": "๐Ÿง—๐Ÿป\u200dโ™‚๏ธ", + "man_climbing_medium-dark_skin_tone": "๐Ÿง—๐Ÿพ\u200dโ™‚๏ธ", + "man_climbing_medium-light_skin_tone": "๐Ÿง—๐Ÿผ\u200dโ™‚๏ธ", + "man_climbing_medium_skin_tone": "๐Ÿง—๐Ÿฝ\u200dโ™‚๏ธ", + "man_construction_worker": "๐Ÿ‘ท\u200dโ™‚๏ธ", + "man_construction_worker_dark_skin_tone": "๐Ÿ‘ท๐Ÿฟ\u200dโ™‚๏ธ", + "man_construction_worker_light_skin_tone": "๐Ÿ‘ท๐Ÿป\u200dโ™‚๏ธ", + "man_construction_worker_medium-dark_skin_tone": "๐Ÿ‘ท๐Ÿพ\u200dโ™‚๏ธ", + "man_construction_worker_medium-light_skin_tone": "๐Ÿ‘ท๐Ÿผ\u200dโ™‚๏ธ", + "man_construction_worker_medium_skin_tone": "๐Ÿ‘ท๐Ÿฝ\u200dโ™‚๏ธ", + "man_cook": "๐Ÿ‘จ\u200d๐Ÿณ", + "man_cook_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿณ", + "man_cook_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿณ", + "man_cook_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿณ", + "man_cook_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿณ", + "man_cook_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿณ", + "man_dancing": "๐Ÿ•บ", + "man_dancing_dark_skin_tone": "๐Ÿ•บ๐Ÿฟ", + "man_dancing_light_skin_tone": "๐Ÿ•บ๐Ÿป", + "man_dancing_medium-dark_skin_tone": "๐Ÿ•บ๐Ÿพ", + "man_dancing_medium-light_skin_tone": "๐Ÿ•บ๐Ÿผ", + "man_dancing_medium_skin_tone": "๐Ÿ•บ๐Ÿฝ", + "man_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ", + "man_detective": "๐Ÿ•ต๏ธ\u200dโ™‚๏ธ", + "man_detective_dark_skin_tone": "๐Ÿ•ต๐Ÿฟ\u200dโ™‚๏ธ", + "man_detective_light_skin_tone": "๐Ÿ•ต๐Ÿป\u200dโ™‚๏ธ", + "man_detective_medium-dark_skin_tone": "๐Ÿ•ต๐Ÿพ\u200dโ™‚๏ธ", + "man_detective_medium-light_skin_tone": "๐Ÿ•ต๐Ÿผ\u200dโ™‚๏ธ", + "man_detective_medium_skin_tone": "๐Ÿ•ต๐Ÿฝ\u200dโ™‚๏ธ", + "man_elf": "๐Ÿง\u200dโ™‚๏ธ", + "man_elf_dark_skin_tone": "๐Ÿง๐Ÿฟ\u200dโ™‚๏ธ", + "man_elf_light_skin_tone": "๐Ÿง๐Ÿป\u200dโ™‚๏ธ", + "man_elf_medium-dark_skin_tone": "๐Ÿง๐Ÿพ\u200dโ™‚๏ธ", + "man_elf_medium-light_skin_tone": "๐Ÿง๐Ÿผ\u200dโ™‚๏ธ", + "man_elf_medium_skin_tone": "๐Ÿง๐Ÿฝ\u200dโ™‚๏ธ", + "man_facepalming": "๐Ÿคฆ\u200dโ™‚๏ธ", + "man_facepalming_dark_skin_tone": "๐Ÿคฆ๐Ÿฟ\u200dโ™‚๏ธ", + "man_facepalming_light_skin_tone": "๐Ÿคฆ๐Ÿป\u200dโ™‚๏ธ", + "man_facepalming_medium-dark_skin_tone": "๐Ÿคฆ๐Ÿพ\u200dโ™‚๏ธ", + "man_facepalming_medium-light_skin_tone": "๐Ÿคฆ๐Ÿผ\u200dโ™‚๏ธ", + "man_facepalming_medium_skin_tone": "๐Ÿคฆ๐Ÿฝ\u200dโ™‚๏ธ", + "man_factory_worker": "๐Ÿ‘จ\u200d๐Ÿญ", + "man_factory_worker_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿญ", + "man_factory_worker_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿญ", + "man_factory_worker_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿญ", + "man_factory_worker_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿญ", + "man_factory_worker_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿญ", + "man_fairy": "๐Ÿงš\u200dโ™‚๏ธ", + "man_fairy_dark_skin_tone": "๐Ÿงš๐Ÿฟ\u200dโ™‚๏ธ", + "man_fairy_light_skin_tone": "๐Ÿงš๐Ÿป\u200dโ™‚๏ธ", + "man_fairy_medium-dark_skin_tone": "๐Ÿงš๐Ÿพ\u200dโ™‚๏ธ", + "man_fairy_medium-light_skin_tone": "๐Ÿงš๐Ÿผ\u200dโ™‚๏ธ", + "man_fairy_medium_skin_tone": "๐Ÿงš๐Ÿฝ\u200dโ™‚๏ธ", + "man_farmer": "๐Ÿ‘จ\u200d๐ŸŒพ", + "man_farmer_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐ŸŒพ", + "man_farmer_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐ŸŒพ", + "man_farmer_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐ŸŒพ", + "man_farmer_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐ŸŒพ", + "man_farmer_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐ŸŒพ", + "man_firefighter": "๐Ÿ‘จ\u200d๐Ÿš’", + "man_firefighter_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿš’", + "man_firefighter_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿš’", + "man_firefighter_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿš’", + "man_firefighter_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿš’", + "man_firefighter_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿš’", + "man_frowning": "๐Ÿ™\u200dโ™‚๏ธ", + "man_frowning_dark_skin_tone": "๐Ÿ™๐Ÿฟ\u200dโ™‚๏ธ", + "man_frowning_light_skin_tone": "๐Ÿ™๐Ÿป\u200dโ™‚๏ธ", + "man_frowning_medium-dark_skin_tone": "๐Ÿ™๐Ÿพ\u200dโ™‚๏ธ", + "man_frowning_medium-light_skin_tone": "๐Ÿ™๐Ÿผ\u200dโ™‚๏ธ", + "man_frowning_medium_skin_tone": "๐Ÿ™๐Ÿฝ\u200dโ™‚๏ธ", + "man_genie": "๐Ÿงž\u200dโ™‚๏ธ", + "man_gesturing_no": "๐Ÿ™…\u200dโ™‚๏ธ", + "man_gesturing_no_dark_skin_tone": "๐Ÿ™…๐Ÿฟ\u200dโ™‚๏ธ", + "man_gesturing_no_light_skin_tone": "๐Ÿ™…๐Ÿป\u200dโ™‚๏ธ", + "man_gesturing_no_medium-dark_skin_tone": "๐Ÿ™…๐Ÿพ\u200dโ™‚๏ธ", + "man_gesturing_no_medium-light_skin_tone": "๐Ÿ™…๐Ÿผ\u200dโ™‚๏ธ", + "man_gesturing_no_medium_skin_tone": "๐Ÿ™…๐Ÿฝ\u200dโ™‚๏ธ", + "man_gesturing_ok": "๐Ÿ™†\u200dโ™‚๏ธ", + "man_gesturing_ok_dark_skin_tone": "๐Ÿ™†๐Ÿฟ\u200dโ™‚๏ธ", + "man_gesturing_ok_light_skin_tone": "๐Ÿ™†๐Ÿป\u200dโ™‚๏ธ", + "man_gesturing_ok_medium-dark_skin_tone": "๐Ÿ™†๐Ÿพ\u200dโ™‚๏ธ", + "man_gesturing_ok_medium-light_skin_tone": "๐Ÿ™†๐Ÿผ\u200dโ™‚๏ธ", + "man_gesturing_ok_medium_skin_tone": "๐Ÿ™†๐Ÿฝ\u200dโ™‚๏ธ", + "man_getting_haircut": "๐Ÿ’‡\u200dโ™‚๏ธ", + "man_getting_haircut_dark_skin_tone": "๐Ÿ’‡๐Ÿฟ\u200dโ™‚๏ธ", + "man_getting_haircut_light_skin_tone": "๐Ÿ’‡๐Ÿป\u200dโ™‚๏ธ", + "man_getting_haircut_medium-dark_skin_tone": "๐Ÿ’‡๐Ÿพ\u200dโ™‚๏ธ", + "man_getting_haircut_medium-light_skin_tone": "๐Ÿ’‡๐Ÿผ\u200dโ™‚๏ธ", + "man_getting_haircut_medium_skin_tone": "๐Ÿ’‡๐Ÿฝ\u200dโ™‚๏ธ", + "man_getting_massage": "๐Ÿ’†\u200dโ™‚๏ธ", + "man_getting_massage_dark_skin_tone": "๐Ÿ’†๐Ÿฟ\u200dโ™‚๏ธ", + "man_getting_massage_light_skin_tone": "๐Ÿ’†๐Ÿป\u200dโ™‚๏ธ", + "man_getting_massage_medium-dark_skin_tone": "๐Ÿ’†๐Ÿพ\u200dโ™‚๏ธ", + "man_getting_massage_medium-light_skin_tone": "๐Ÿ’†๐Ÿผ\u200dโ™‚๏ธ", + "man_getting_massage_medium_skin_tone": "๐Ÿ’†๐Ÿฝ\u200dโ™‚๏ธ", + "man_golfing": "๐ŸŒ๏ธ\u200dโ™‚๏ธ", + "man_golfing_dark_skin_tone": "๐ŸŒ๐Ÿฟ\u200dโ™‚๏ธ", + "man_golfing_light_skin_tone": "๐ŸŒ๐Ÿป\u200dโ™‚๏ธ", + "man_golfing_medium-dark_skin_tone": "๐ŸŒ๐Ÿพ\u200dโ™‚๏ธ", + "man_golfing_medium-light_skin_tone": "๐ŸŒ๐Ÿผ\u200dโ™‚๏ธ", + "man_golfing_medium_skin_tone": "๐ŸŒ๐Ÿฝ\u200dโ™‚๏ธ", + "man_guard": "๐Ÿ’‚\u200dโ™‚๏ธ", + "man_guard_dark_skin_tone": "๐Ÿ’‚๐Ÿฟ\u200dโ™‚๏ธ", + "man_guard_light_skin_tone": "๐Ÿ’‚๐Ÿป\u200dโ™‚๏ธ", + "man_guard_medium-dark_skin_tone": "๐Ÿ’‚๐Ÿพ\u200dโ™‚๏ธ", + "man_guard_medium-light_skin_tone": "๐Ÿ’‚๐Ÿผ\u200dโ™‚๏ธ", + "man_guard_medium_skin_tone": "๐Ÿ’‚๐Ÿฝ\u200dโ™‚๏ธ", + "man_health_worker": "๐Ÿ‘จ\u200dโš•๏ธ", + "man_health_worker_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200dโš•๏ธ", + "man_health_worker_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200dโš•๏ธ", + "man_health_worker_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200dโš•๏ธ", + "man_health_worker_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200dโš•๏ธ", + "man_health_worker_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200dโš•๏ธ", + "man_in_lotus_position": "๐Ÿง˜\u200dโ™‚๏ธ", + "man_in_lotus_position_dark_skin_tone": "๐Ÿง˜๐Ÿฟ\u200dโ™‚๏ธ", + "man_in_lotus_position_light_skin_tone": "๐Ÿง˜๐Ÿป\u200dโ™‚๏ธ", + "man_in_lotus_position_medium-dark_skin_tone": "๐Ÿง˜๐Ÿพ\u200dโ™‚๏ธ", + "man_in_lotus_position_medium-light_skin_tone": "๐Ÿง˜๐Ÿผ\u200dโ™‚๏ธ", + "man_in_lotus_position_medium_skin_tone": "๐Ÿง˜๐Ÿฝ\u200dโ™‚๏ธ", + "man_in_manual_wheelchair": "๐Ÿ‘จ\u200d๐Ÿฆฝ", + "man_in_motorized_wheelchair": "๐Ÿ‘จ\u200d๐Ÿฆผ", + "man_in_steamy_room": "๐Ÿง–\u200dโ™‚๏ธ", + "man_in_steamy_room_dark_skin_tone": "๐Ÿง–๐Ÿฟ\u200dโ™‚๏ธ", + "man_in_steamy_room_light_skin_tone": "๐Ÿง–๐Ÿป\u200dโ™‚๏ธ", + "man_in_steamy_room_medium-dark_skin_tone": "๐Ÿง–๐Ÿพ\u200dโ™‚๏ธ", + "man_in_steamy_room_medium-light_skin_tone": "๐Ÿง–๐Ÿผ\u200dโ™‚๏ธ", + "man_in_steamy_room_medium_skin_tone": "๐Ÿง–๐Ÿฝ\u200dโ™‚๏ธ", + "man_in_suit_levitating": "๐Ÿ•ด", + "man_in_suit_levitating_dark_skin_tone": "๐Ÿ•ด๐Ÿฟ", + "man_in_suit_levitating_light_skin_tone": "๐Ÿ•ด๐Ÿป", + "man_in_suit_levitating_medium-dark_skin_tone": "๐Ÿ•ด๐Ÿพ", + "man_in_suit_levitating_medium-light_skin_tone": "๐Ÿ•ด๐Ÿผ", + "man_in_suit_levitating_medium_skin_tone": "๐Ÿ•ด๐Ÿฝ", + "man_in_tuxedo": "๐Ÿคต", + "man_in_tuxedo_dark_skin_tone": "๐Ÿคต๐Ÿฟ", + "man_in_tuxedo_light_skin_tone": "๐Ÿคต๐Ÿป", + "man_in_tuxedo_medium-dark_skin_tone": "๐Ÿคต๐Ÿพ", + "man_in_tuxedo_medium-light_skin_tone": "๐Ÿคต๐Ÿผ", + "man_in_tuxedo_medium_skin_tone": "๐Ÿคต๐Ÿฝ", + "man_judge": "๐Ÿ‘จ\u200dโš–๏ธ", + "man_judge_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200dโš–๏ธ", + "man_judge_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200dโš–๏ธ", + "man_judge_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200dโš–๏ธ", + "man_judge_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200dโš–๏ธ", + "man_judge_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200dโš–๏ธ", + "man_juggling": "๐Ÿคน\u200dโ™‚๏ธ", + "man_juggling_dark_skin_tone": "๐Ÿคน๐Ÿฟ\u200dโ™‚๏ธ", + "man_juggling_light_skin_tone": "๐Ÿคน๐Ÿป\u200dโ™‚๏ธ", + "man_juggling_medium-dark_skin_tone": "๐Ÿคน๐Ÿพ\u200dโ™‚๏ธ", + "man_juggling_medium-light_skin_tone": "๐Ÿคน๐Ÿผ\u200dโ™‚๏ธ", + "man_juggling_medium_skin_tone": "๐Ÿคน๐Ÿฝ\u200dโ™‚๏ธ", + "man_lifting_weights": "๐Ÿ‹๏ธ\u200dโ™‚๏ธ", + "man_lifting_weights_dark_skin_tone": "๐Ÿ‹๐Ÿฟ\u200dโ™‚๏ธ", + "man_lifting_weights_light_skin_tone": "๐Ÿ‹๐Ÿป\u200dโ™‚๏ธ", + "man_lifting_weights_medium-dark_skin_tone": "๐Ÿ‹๐Ÿพ\u200dโ™‚๏ธ", + "man_lifting_weights_medium-light_skin_tone": "๐Ÿ‹๐Ÿผ\u200dโ™‚๏ธ", + "man_lifting_weights_medium_skin_tone": "๐Ÿ‹๐Ÿฝ\u200dโ™‚๏ธ", + "man_light_skin_tone": "๐Ÿ‘จ๐Ÿป", + "man_mage": "๐Ÿง™\u200dโ™‚๏ธ", + "man_mage_dark_skin_tone": "๐Ÿง™๐Ÿฟ\u200dโ™‚๏ธ", + "man_mage_light_skin_tone": "๐Ÿง™๐Ÿป\u200dโ™‚๏ธ", + "man_mage_medium-dark_skin_tone": "๐Ÿง™๐Ÿพ\u200dโ™‚๏ธ", + "man_mage_medium-light_skin_tone": "๐Ÿง™๐Ÿผ\u200dโ™‚๏ธ", + "man_mage_medium_skin_tone": "๐Ÿง™๐Ÿฝ\u200dโ™‚๏ธ", + "man_mechanic": "๐Ÿ‘จ\u200d๐Ÿ”ง", + "man_mechanic_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿ”ง", + "man_mechanic_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿ”ง", + "man_mechanic_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿ”ง", + "man_mechanic_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿ”ง", + "man_mechanic_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿ”ง", + "man_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ", + "man_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ", + "man_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ", + "man_mountain_biking": "๐Ÿšต\u200dโ™‚๏ธ", + "man_mountain_biking_dark_skin_tone": "๐Ÿšต๐Ÿฟ\u200dโ™‚๏ธ", + "man_mountain_biking_light_skin_tone": "๐Ÿšต๐Ÿป\u200dโ™‚๏ธ", + "man_mountain_biking_medium-dark_skin_tone": "๐Ÿšต๐Ÿพ\u200dโ™‚๏ธ", + "man_mountain_biking_medium-light_skin_tone": "๐Ÿšต๐Ÿผ\u200dโ™‚๏ธ", + "man_mountain_biking_medium_skin_tone": "๐Ÿšต๐Ÿฝ\u200dโ™‚๏ธ", + "man_office_worker": "๐Ÿ‘จ\u200d๐Ÿ’ผ", + "man_office_worker_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿ’ผ", + "man_office_worker_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿ’ผ", + "man_office_worker_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿ’ผ", + "man_office_worker_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿ’ผ", + "man_office_worker_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿ’ผ", + "man_pilot": "๐Ÿ‘จ\u200dโœˆ๏ธ", + "man_pilot_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200dโœˆ๏ธ", + "man_pilot_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200dโœˆ๏ธ", + "man_pilot_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200dโœˆ๏ธ", + "man_pilot_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200dโœˆ๏ธ", + "man_pilot_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200dโœˆ๏ธ", + "man_playing_handball": "๐Ÿคพ\u200dโ™‚๏ธ", + "man_playing_handball_dark_skin_tone": "๐Ÿคพ๐Ÿฟ\u200dโ™‚๏ธ", + "man_playing_handball_light_skin_tone": "๐Ÿคพ๐Ÿป\u200dโ™‚๏ธ", + "man_playing_handball_medium-dark_skin_tone": "๐Ÿคพ๐Ÿพ\u200dโ™‚๏ธ", + "man_playing_handball_medium-light_skin_tone": "๐Ÿคพ๐Ÿผ\u200dโ™‚๏ธ", + "man_playing_handball_medium_skin_tone": "๐Ÿคพ๐Ÿฝ\u200dโ™‚๏ธ", + "man_playing_water_polo": "๐Ÿคฝ\u200dโ™‚๏ธ", + "man_playing_water_polo_dark_skin_tone": "๐Ÿคฝ๐Ÿฟ\u200dโ™‚๏ธ", + "man_playing_water_polo_light_skin_tone": "๐Ÿคฝ๐Ÿป\u200dโ™‚๏ธ", + "man_playing_water_polo_medium-dark_skin_tone": "๐Ÿคฝ๐Ÿพ\u200dโ™‚๏ธ", + "man_playing_water_polo_medium-light_skin_tone": "๐Ÿคฝ๐Ÿผ\u200dโ™‚๏ธ", + "man_playing_water_polo_medium_skin_tone": "๐Ÿคฝ๐Ÿฝ\u200dโ™‚๏ธ", + "man_police_officer": "๐Ÿ‘ฎ\u200dโ™‚๏ธ", + "man_police_officer_dark_skin_tone": "๐Ÿ‘ฎ๐Ÿฟ\u200dโ™‚๏ธ", + "man_police_officer_light_skin_tone": "๐Ÿ‘ฎ๐Ÿป\u200dโ™‚๏ธ", + "man_police_officer_medium-dark_skin_tone": "๐Ÿ‘ฎ๐Ÿพ\u200dโ™‚๏ธ", + "man_police_officer_medium-light_skin_tone": "๐Ÿ‘ฎ๐Ÿผ\u200dโ™‚๏ธ", + "man_police_officer_medium_skin_tone": "๐Ÿ‘ฎ๐Ÿฝ\u200dโ™‚๏ธ", + "man_pouting": "๐Ÿ™Ž\u200dโ™‚๏ธ", + "man_pouting_dark_skin_tone": "๐Ÿ™Ž๐Ÿฟ\u200dโ™‚๏ธ", + "man_pouting_light_skin_tone": "๐Ÿ™Ž๐Ÿป\u200dโ™‚๏ธ", + "man_pouting_medium-dark_skin_tone": "๐Ÿ™Ž๐Ÿพ\u200dโ™‚๏ธ", + "man_pouting_medium-light_skin_tone": "๐Ÿ™Ž๐Ÿผ\u200dโ™‚๏ธ", + "man_pouting_medium_skin_tone": "๐Ÿ™Ž๐Ÿฝ\u200dโ™‚๏ธ", + "man_raising_hand": "๐Ÿ™‹\u200dโ™‚๏ธ", + "man_raising_hand_dark_skin_tone": "๐Ÿ™‹๐Ÿฟ\u200dโ™‚๏ธ", + "man_raising_hand_light_skin_tone": "๐Ÿ™‹๐Ÿป\u200dโ™‚๏ธ", + "man_raising_hand_medium-dark_skin_tone": "๐Ÿ™‹๐Ÿพ\u200dโ™‚๏ธ", + "man_raising_hand_medium-light_skin_tone": "๐Ÿ™‹๐Ÿผ\u200dโ™‚๏ธ", + "man_raising_hand_medium_skin_tone": "๐Ÿ™‹๐Ÿฝ\u200dโ™‚๏ธ", + "man_rowing_boat": "๐Ÿšฃ\u200dโ™‚๏ธ", + "man_rowing_boat_dark_skin_tone": "๐Ÿšฃ๐Ÿฟ\u200dโ™‚๏ธ", + "man_rowing_boat_light_skin_tone": "๐Ÿšฃ๐Ÿป\u200dโ™‚๏ธ", + "man_rowing_boat_medium-dark_skin_tone": "๐Ÿšฃ๐Ÿพ\u200dโ™‚๏ธ", + "man_rowing_boat_medium-light_skin_tone": "๐Ÿšฃ๐Ÿผ\u200dโ™‚๏ธ", + "man_rowing_boat_medium_skin_tone": "๐Ÿšฃ๐Ÿฝ\u200dโ™‚๏ธ", + "man_running": "๐Ÿƒ\u200dโ™‚๏ธ", + "man_running_dark_skin_tone": "๐Ÿƒ๐Ÿฟ\u200dโ™‚๏ธ", + "man_running_light_skin_tone": "๐Ÿƒ๐Ÿป\u200dโ™‚๏ธ", + "man_running_medium-dark_skin_tone": "๐Ÿƒ๐Ÿพ\u200dโ™‚๏ธ", + "man_running_medium-light_skin_tone": "๐Ÿƒ๐Ÿผ\u200dโ™‚๏ธ", + "man_running_medium_skin_tone": "๐Ÿƒ๐Ÿฝ\u200dโ™‚๏ธ", + "man_scientist": "๐Ÿ‘จ\u200d๐Ÿ”ฌ", + "man_scientist_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿ”ฌ", + "man_scientist_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿ”ฌ", + "man_scientist_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿ”ฌ", + "man_scientist_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿ”ฌ", + "man_scientist_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿ”ฌ", + "man_shrugging": "๐Ÿคท\u200dโ™‚๏ธ", + "man_shrugging_dark_skin_tone": "๐Ÿคท๐Ÿฟ\u200dโ™‚๏ธ", + "man_shrugging_light_skin_tone": "๐Ÿคท๐Ÿป\u200dโ™‚๏ธ", + "man_shrugging_medium-dark_skin_tone": "๐Ÿคท๐Ÿพ\u200dโ™‚๏ธ", + "man_shrugging_medium-light_skin_tone": "๐Ÿคท๐Ÿผ\u200dโ™‚๏ธ", + "man_shrugging_medium_skin_tone": "๐Ÿคท๐Ÿฝ\u200dโ™‚๏ธ", + "man_singer": "๐Ÿ‘จ\u200d๐ŸŽค", + "man_singer_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐ŸŽค", + "man_singer_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐ŸŽค", + "man_singer_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐ŸŽค", + "man_singer_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐ŸŽค", + "man_singer_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐ŸŽค", + "man_student": "๐Ÿ‘จ\u200d๐ŸŽ“", + "man_student_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐ŸŽ“", + "man_student_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐ŸŽ“", + "man_student_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐ŸŽ“", + "man_student_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐ŸŽ“", + "man_student_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐ŸŽ“", + "man_surfing": "๐Ÿ„\u200dโ™‚๏ธ", + "man_surfing_dark_skin_tone": "๐Ÿ„๐Ÿฟ\u200dโ™‚๏ธ", + "man_surfing_light_skin_tone": "๐Ÿ„๐Ÿป\u200dโ™‚๏ธ", + "man_surfing_medium-dark_skin_tone": "๐Ÿ„๐Ÿพ\u200dโ™‚๏ธ", + "man_surfing_medium-light_skin_tone": "๐Ÿ„๐Ÿผ\u200dโ™‚๏ธ", + "man_surfing_medium_skin_tone": "๐Ÿ„๐Ÿฝ\u200dโ™‚๏ธ", + "man_swimming": "๐ŸŠ\u200dโ™‚๏ธ", + "man_swimming_dark_skin_tone": "๐ŸŠ๐Ÿฟ\u200dโ™‚๏ธ", + "man_swimming_light_skin_tone": "๐ŸŠ๐Ÿป\u200dโ™‚๏ธ", + "man_swimming_medium-dark_skin_tone": "๐ŸŠ๐Ÿพ\u200dโ™‚๏ธ", + "man_swimming_medium-light_skin_tone": "๐ŸŠ๐Ÿผ\u200dโ™‚๏ธ", + "man_swimming_medium_skin_tone": "๐ŸŠ๐Ÿฝ\u200dโ™‚๏ธ", + "man_teacher": "๐Ÿ‘จ\u200d๐Ÿซ", + "man_teacher_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿซ", + "man_teacher_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿซ", + "man_teacher_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿซ", + "man_teacher_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿซ", + "man_teacher_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿซ", + "man_technologist": "๐Ÿ‘จ\u200d๐Ÿ’ป", + "man_technologist_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ\u200d๐Ÿ’ป", + "man_technologist_light_skin_tone": "๐Ÿ‘จ๐Ÿป\u200d๐Ÿ’ป", + "man_technologist_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ\u200d๐Ÿ’ป", + "man_technologist_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ\u200d๐Ÿ’ป", + "man_technologist_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ\u200d๐Ÿ’ป", + "man_tipping_hand": "๐Ÿ’\u200dโ™‚๏ธ", + "man_tipping_hand_dark_skin_tone": "๐Ÿ’๐Ÿฟ\u200dโ™‚๏ธ", + "man_tipping_hand_light_skin_tone": "๐Ÿ’๐Ÿป\u200dโ™‚๏ธ", + "man_tipping_hand_medium-dark_skin_tone": "๐Ÿ’๐Ÿพ\u200dโ™‚๏ธ", + "man_tipping_hand_medium-light_skin_tone": "๐Ÿ’๐Ÿผ\u200dโ™‚๏ธ", + "man_tipping_hand_medium_skin_tone": "๐Ÿ’๐Ÿฝ\u200dโ™‚๏ธ", + "man_vampire": "๐Ÿง›\u200dโ™‚๏ธ", + "man_vampire_dark_skin_tone": "๐Ÿง›๐Ÿฟ\u200dโ™‚๏ธ", + "man_vampire_light_skin_tone": "๐Ÿง›๐Ÿป\u200dโ™‚๏ธ", + "man_vampire_medium-dark_skin_tone": "๐Ÿง›๐Ÿพ\u200dโ™‚๏ธ", + "man_vampire_medium-light_skin_tone": "๐Ÿง›๐Ÿผ\u200dโ™‚๏ธ", + "man_vampire_medium_skin_tone": "๐Ÿง›๐Ÿฝ\u200dโ™‚๏ธ", + "man_walking": "๐Ÿšถ\u200dโ™‚๏ธ", + "man_walking_dark_skin_tone": "๐Ÿšถ๐Ÿฟ\u200dโ™‚๏ธ", + "man_walking_light_skin_tone": "๐Ÿšถ๐Ÿป\u200dโ™‚๏ธ", + "man_walking_medium-dark_skin_tone": "๐Ÿšถ๐Ÿพ\u200dโ™‚๏ธ", + "man_walking_medium-light_skin_tone": "๐Ÿšถ๐Ÿผ\u200dโ™‚๏ธ", + "man_walking_medium_skin_tone": "๐Ÿšถ๐Ÿฝ\u200dโ™‚๏ธ", + "man_wearing_turban": "๐Ÿ‘ณ\u200dโ™‚๏ธ", + "man_wearing_turban_dark_skin_tone": "๐Ÿ‘ณ๐Ÿฟ\u200dโ™‚๏ธ", + "man_wearing_turban_light_skin_tone": "๐Ÿ‘ณ๐Ÿป\u200dโ™‚๏ธ", + "man_wearing_turban_medium-dark_skin_tone": "๐Ÿ‘ณ๐Ÿพ\u200dโ™‚๏ธ", + "man_wearing_turban_medium-light_skin_tone": "๐Ÿ‘ณ๐Ÿผ\u200dโ™‚๏ธ", + "man_wearing_turban_medium_skin_tone": "๐Ÿ‘ณ๐Ÿฝ\u200dโ™‚๏ธ", + "man_with_probing_cane": "๐Ÿ‘จ\u200d๐Ÿฆฏ", + "man_with_chinese_cap": "๐Ÿ‘ฒ", + "man_with_chinese_cap_dark_skin_tone": "๐Ÿ‘ฒ๐Ÿฟ", + "man_with_chinese_cap_light_skin_tone": "๐Ÿ‘ฒ๐Ÿป", + "man_with_chinese_cap_medium-dark_skin_tone": "๐Ÿ‘ฒ๐Ÿพ", + "man_with_chinese_cap_medium-light_skin_tone": "๐Ÿ‘ฒ๐Ÿผ", + "man_with_chinese_cap_medium_skin_tone": "๐Ÿ‘ฒ๐Ÿฝ", + "man_zombie": "๐ŸงŸ\u200dโ™‚๏ธ", + "mango": "๐Ÿฅญ", + "mantelpiece_clock": "๐Ÿ•ฐ", + "manual_wheelchair": "๐Ÿฆฝ", + "manโ€™s_shoe": "๐Ÿ‘ž", + "map_of_japan": "๐Ÿ—พ", + "maple_leaf": "๐Ÿ", + "martial_arts_uniform": "๐Ÿฅ‹", + "mate": "๐Ÿง‰", + "meat_on_bone": "๐Ÿ–", + "mechanical_arm": "๐Ÿฆพ", + "mechanical_leg": "๐Ÿฆฟ", + "medical_symbol": "โš•", + "megaphone": "๐Ÿ“ฃ", + "melon": "๐Ÿˆ", + "memo": "๐Ÿ“", + "men_with_bunny_ears": "๐Ÿ‘ฏ\u200dโ™‚๏ธ", + "men_wrestling": "๐Ÿคผ\u200dโ™‚๏ธ", + "menorah": "๐Ÿ•Ž", + "menโ€™s_room": "๐Ÿšน", + "mermaid": "๐Ÿงœ\u200dโ™€๏ธ", + "mermaid_dark_skin_tone": "๐Ÿงœ๐Ÿฟ\u200dโ™€๏ธ", + "mermaid_light_skin_tone": "๐Ÿงœ๐Ÿป\u200dโ™€๏ธ", + "mermaid_medium-dark_skin_tone": "๐Ÿงœ๐Ÿพ\u200dโ™€๏ธ", + "mermaid_medium-light_skin_tone": "๐Ÿงœ๐Ÿผ\u200dโ™€๏ธ", + "mermaid_medium_skin_tone": "๐Ÿงœ๐Ÿฝ\u200dโ™€๏ธ", + "merman": "๐Ÿงœ\u200dโ™‚๏ธ", + "merman_dark_skin_tone": "๐Ÿงœ๐Ÿฟ\u200dโ™‚๏ธ", + "merman_light_skin_tone": "๐Ÿงœ๐Ÿป\u200dโ™‚๏ธ", + "merman_medium-dark_skin_tone": "๐Ÿงœ๐Ÿพ\u200dโ™‚๏ธ", + "merman_medium-light_skin_tone": "๐Ÿงœ๐Ÿผ\u200dโ™‚๏ธ", + "merman_medium_skin_tone": "๐Ÿงœ๐Ÿฝ\u200dโ™‚๏ธ", + "merperson": "๐Ÿงœ", + "merperson_dark_skin_tone": "๐Ÿงœ๐Ÿฟ", + "merperson_light_skin_tone": "๐Ÿงœ๐Ÿป", + "merperson_medium-dark_skin_tone": "๐Ÿงœ๐Ÿพ", + "merperson_medium-light_skin_tone": "๐Ÿงœ๐Ÿผ", + "merperson_medium_skin_tone": "๐Ÿงœ๐Ÿฝ", + "metro": "๐Ÿš‡", + "microbe": "๐Ÿฆ ", + "microphone": "๐ŸŽค", + "microscope": "๐Ÿ”ฌ", + "middle_finger": "๐Ÿ–•", + "middle_finger_dark_skin_tone": "๐Ÿ–•๐Ÿฟ", + "middle_finger_light_skin_tone": "๐Ÿ–•๐Ÿป", + "middle_finger_medium-dark_skin_tone": "๐Ÿ–•๐Ÿพ", + "middle_finger_medium-light_skin_tone": "๐Ÿ–•๐Ÿผ", + "middle_finger_medium_skin_tone": "๐Ÿ–•๐Ÿฝ", + "military_medal": "๐ŸŽ–", + "milky_way": "๐ŸŒŒ", + "minibus": "๐Ÿš", + "moai": "๐Ÿ—ฟ", + "mobile_phone": "๐Ÿ“ฑ", + "mobile_phone_off": "๐Ÿ“ด", + "mobile_phone_with_arrow": "๐Ÿ“ฒ", + "money-mouth_face": "๐Ÿค‘", + "money_bag": "๐Ÿ’ฐ", + "money_with_wings": "๐Ÿ’ธ", + "monkey": "๐Ÿ’", + "monkey_face": "๐Ÿต", + "monorail": "๐Ÿš", + "moon_cake": "๐Ÿฅฎ", + "moon_viewing_ceremony": "๐ŸŽ‘", + "mosque": "๐Ÿ•Œ", + "mosquito": "๐ŸฆŸ", + "motor_boat": "๐Ÿ›ฅ", + "motor_scooter": "๐Ÿ›ต", + "motorcycle": "๐Ÿ", + "motorized_wheelchair": "๐Ÿฆผ", + "motorway": "๐Ÿ›ฃ", + "mount_fuji": "๐Ÿ—ป", + "mountain": "โ›ฐ", + "mountain_cableway": "๐Ÿš ", + "mountain_railway": "๐Ÿšž", + "mouse": "๐Ÿญ", + "mouse_face": "๐Ÿญ", + "mouth": "๐Ÿ‘„", + "movie_camera": "๐ŸŽฅ", + "mushroom": "๐Ÿ„", + "musical_keyboard": "๐ŸŽน", + "musical_note": "๐ŸŽต", + "musical_notes": "๐ŸŽถ", + "musical_score": "๐ŸŽผ", + "muted_speaker": "๐Ÿ”‡", + "nail_polish": "๐Ÿ’…", + "nail_polish_dark_skin_tone": "๐Ÿ’…๐Ÿฟ", + "nail_polish_light_skin_tone": "๐Ÿ’…๐Ÿป", + "nail_polish_medium-dark_skin_tone": "๐Ÿ’…๐Ÿพ", + "nail_polish_medium-light_skin_tone": "๐Ÿ’…๐Ÿผ", + "nail_polish_medium_skin_tone": "๐Ÿ’…๐Ÿฝ", + "name_badge": "๐Ÿ“›", + "national_park": "๐Ÿž", + "nauseated_face": "๐Ÿคข", + "nazar_amulet": "๐Ÿงฟ", + "necktie": "๐Ÿ‘”", + "nerd_face": "๐Ÿค“", + "neutral_face": "๐Ÿ˜", + "new_moon": "๐ŸŒ‘", + "new_moon_face": "๐ŸŒš", + "newspaper": "๐Ÿ“ฐ", + "next_track_button": "โญ", + "night_with_stars": "๐ŸŒƒ", + "nine-thirty": "๐Ÿ•ค", + "nine_oโ€™clock": "๐Ÿ•˜", + "no_bicycles": "๐Ÿšณ", + "no_entry": "โ›”", + "no_littering": "๐Ÿšฏ", + "no_mobile_phones": "๐Ÿ“ต", + "no_one_under_eighteen": "๐Ÿ”ž", + "no_pedestrians": "๐Ÿšท", + "no_smoking": "๐Ÿšญ", + "non-potable_water": "๐Ÿšฑ", + "nose": "๐Ÿ‘ƒ", + "nose_dark_skin_tone": "๐Ÿ‘ƒ๐Ÿฟ", + "nose_light_skin_tone": "๐Ÿ‘ƒ๐Ÿป", + "nose_medium-dark_skin_tone": "๐Ÿ‘ƒ๐Ÿพ", + "nose_medium-light_skin_tone": "๐Ÿ‘ƒ๐Ÿผ", + "nose_medium_skin_tone": "๐Ÿ‘ƒ๐Ÿฝ", + "notebook": "๐Ÿ““", + "notebook_with_decorative_cover": "๐Ÿ“”", + "nut_and_bolt": "๐Ÿ”ฉ", + "octopus": "๐Ÿ™", + "oden": "๐Ÿข", + "office_building": "๐Ÿข", + "ogre": "๐Ÿ‘น", + "oil_drum": "๐Ÿ›ข", + "old_key": "๐Ÿ—", + "old_man": "๐Ÿ‘ด", + "old_man_dark_skin_tone": "๐Ÿ‘ด๐Ÿฟ", + "old_man_light_skin_tone": "๐Ÿ‘ด๐Ÿป", + "old_man_medium-dark_skin_tone": "๐Ÿ‘ด๐Ÿพ", + "old_man_medium-light_skin_tone": "๐Ÿ‘ด๐Ÿผ", + "old_man_medium_skin_tone": "๐Ÿ‘ด๐Ÿฝ", + "old_woman": "๐Ÿ‘ต", + "old_woman_dark_skin_tone": "๐Ÿ‘ต๐Ÿฟ", + "old_woman_light_skin_tone": "๐Ÿ‘ต๐Ÿป", + "old_woman_medium-dark_skin_tone": "๐Ÿ‘ต๐Ÿพ", + "old_woman_medium-light_skin_tone": "๐Ÿ‘ต๐Ÿผ", + "old_woman_medium_skin_tone": "๐Ÿ‘ต๐Ÿฝ", + "older_adult": "๐Ÿง“", + "older_adult_dark_skin_tone": "๐Ÿง“๐Ÿฟ", + "older_adult_light_skin_tone": "๐Ÿง“๐Ÿป", + "older_adult_medium-dark_skin_tone": "๐Ÿง“๐Ÿพ", + "older_adult_medium-light_skin_tone": "๐Ÿง“๐Ÿผ", + "older_adult_medium_skin_tone": "๐Ÿง“๐Ÿฝ", + "om": "๐Ÿ•‰", + "oncoming_automobile": "๐Ÿš˜", + "oncoming_bus": "๐Ÿš", + "oncoming_fist": "๐Ÿ‘Š", + "oncoming_fist_dark_skin_tone": "๐Ÿ‘Š๐Ÿฟ", + "oncoming_fist_light_skin_tone": "๐Ÿ‘Š๐Ÿป", + "oncoming_fist_medium-dark_skin_tone": "๐Ÿ‘Š๐Ÿพ", + "oncoming_fist_medium-light_skin_tone": "๐Ÿ‘Š๐Ÿผ", + "oncoming_fist_medium_skin_tone": "๐Ÿ‘Š๐Ÿฝ", + "oncoming_police_car": "๐Ÿš”", + "oncoming_taxi": "๐Ÿš–", + "one-piece_swimsuit": "๐Ÿฉฑ", + "one-thirty": "๐Ÿ•œ", + "one_oโ€™clock": "๐Ÿ•", + "onion": "๐Ÿง…", + "open_book": "๐Ÿ“–", + "open_file_folder": "๐Ÿ“‚", + "open_hands": "๐Ÿ‘", + "open_hands_dark_skin_tone": "๐Ÿ‘๐Ÿฟ", + "open_hands_light_skin_tone": "๐Ÿ‘๐Ÿป", + "open_hands_medium-dark_skin_tone": "๐Ÿ‘๐Ÿพ", + "open_hands_medium-light_skin_tone": "๐Ÿ‘๐Ÿผ", + "open_hands_medium_skin_tone": "๐Ÿ‘๐Ÿฝ", + "open_mailbox_with_lowered_flag": "๐Ÿ“ญ", + "open_mailbox_with_raised_flag": "๐Ÿ“ฌ", + "optical_disk": "๐Ÿ’ฟ", + "orange_book": "๐Ÿ“™", + "orange_circle": "๐ŸŸ ", + "orange_heart": "๐Ÿงก", + "orange_square": "๐ŸŸง", + "orangutan": "๐Ÿฆง", + "orthodox_cross": "โ˜ฆ", + "otter": "๐Ÿฆฆ", + "outbox_tray": "๐Ÿ“ค", + "owl": "๐Ÿฆ‰", + "ox": "๐Ÿ‚", + "oyster": "๐Ÿฆช", + "package": "๐Ÿ“ฆ", + "page_facing_up": "๐Ÿ“„", + "page_with_curl": "๐Ÿ“ƒ", + "pager": "๐Ÿ“Ÿ", + "paintbrush": "๐Ÿ–Œ", + "palm_tree": "๐ŸŒด", + "palms_up_together": "๐Ÿคฒ", + "palms_up_together_dark_skin_tone": "๐Ÿคฒ๐Ÿฟ", + "palms_up_together_light_skin_tone": "๐Ÿคฒ๐Ÿป", + "palms_up_together_medium-dark_skin_tone": "๐Ÿคฒ๐Ÿพ", + "palms_up_together_medium-light_skin_tone": "๐Ÿคฒ๐Ÿผ", + "palms_up_together_medium_skin_tone": "๐Ÿคฒ๐Ÿฝ", + "pancakes": "๐Ÿฅž", + "panda_face": "๐Ÿผ", + "paperclip": "๐Ÿ“Ž", + "parrot": "๐Ÿฆœ", + "part_alternation_mark": "ใ€ฝ", + "party_popper": "๐ŸŽ‰", + "partying_face": "๐Ÿฅณ", + "passenger_ship": "๐Ÿ›ณ", + "passport_control": "๐Ÿ›‚", + "pause_button": "โธ", + "paw_prints": "๐Ÿพ", + "peace_symbol": "โ˜ฎ", + "peach": "๐Ÿ‘", + "peacock": "๐Ÿฆš", + "peanuts": "๐Ÿฅœ", + "pear": "๐Ÿ", + "pen": "๐Ÿ–Š", + "pencil": "๐Ÿ“", + "penguin": "๐Ÿง", + "pensive_face": "๐Ÿ˜”", + "people_holding_hands": "๐Ÿง‘\u200d๐Ÿค\u200d๐Ÿง‘", + "people_with_bunny_ears": "๐Ÿ‘ฏ", + "people_wrestling": "๐Ÿคผ", + "performing_arts": "๐ŸŽญ", + "persevering_face": "๐Ÿ˜ฃ", + "person_biking": "๐Ÿšด", + "person_biking_dark_skin_tone": "๐Ÿšด๐Ÿฟ", + "person_biking_light_skin_tone": "๐Ÿšด๐Ÿป", + "person_biking_medium-dark_skin_tone": "๐Ÿšด๐Ÿพ", + "person_biking_medium-light_skin_tone": "๐Ÿšด๐Ÿผ", + "person_biking_medium_skin_tone": "๐Ÿšด๐Ÿฝ", + "person_bouncing_ball": "โ›น", + "person_bouncing_ball_dark_skin_tone": "โ›น๐Ÿฟ", + "person_bouncing_ball_light_skin_tone": "โ›น๐Ÿป", + "person_bouncing_ball_medium-dark_skin_tone": "โ›น๐Ÿพ", + "person_bouncing_ball_medium-light_skin_tone": "โ›น๐Ÿผ", + "person_bouncing_ball_medium_skin_tone": "โ›น๐Ÿฝ", + "person_bowing": "๐Ÿ™‡", + "person_bowing_dark_skin_tone": "๐Ÿ™‡๐Ÿฟ", + "person_bowing_light_skin_tone": "๐Ÿ™‡๐Ÿป", + "person_bowing_medium-dark_skin_tone": "๐Ÿ™‡๐Ÿพ", + "person_bowing_medium-light_skin_tone": "๐Ÿ™‡๐Ÿผ", + "person_bowing_medium_skin_tone": "๐Ÿ™‡๐Ÿฝ", + "person_cartwheeling": "๐Ÿคธ", + "person_cartwheeling_dark_skin_tone": "๐Ÿคธ๐Ÿฟ", + "person_cartwheeling_light_skin_tone": "๐Ÿคธ๐Ÿป", + "person_cartwheeling_medium-dark_skin_tone": "๐Ÿคธ๐Ÿพ", + "person_cartwheeling_medium-light_skin_tone": "๐Ÿคธ๐Ÿผ", + "person_cartwheeling_medium_skin_tone": "๐Ÿคธ๐Ÿฝ", + "person_climbing": "๐Ÿง—", + "person_climbing_dark_skin_tone": "๐Ÿง—๐Ÿฟ", + "person_climbing_light_skin_tone": "๐Ÿง—๐Ÿป", + "person_climbing_medium-dark_skin_tone": "๐Ÿง—๐Ÿพ", + "person_climbing_medium-light_skin_tone": "๐Ÿง—๐Ÿผ", + "person_climbing_medium_skin_tone": "๐Ÿง—๐Ÿฝ", + "person_facepalming": "๐Ÿคฆ", + "person_facepalming_dark_skin_tone": "๐Ÿคฆ๐Ÿฟ", + "person_facepalming_light_skin_tone": "๐Ÿคฆ๐Ÿป", + "person_facepalming_medium-dark_skin_tone": "๐Ÿคฆ๐Ÿพ", + "person_facepalming_medium-light_skin_tone": "๐Ÿคฆ๐Ÿผ", + "person_facepalming_medium_skin_tone": "๐Ÿคฆ๐Ÿฝ", + "person_fencing": "๐Ÿคบ", + "person_frowning": "๐Ÿ™", + "person_frowning_dark_skin_tone": "๐Ÿ™๐Ÿฟ", + "person_frowning_light_skin_tone": "๐Ÿ™๐Ÿป", + "person_frowning_medium-dark_skin_tone": "๐Ÿ™๐Ÿพ", + "person_frowning_medium-light_skin_tone": "๐Ÿ™๐Ÿผ", + "person_frowning_medium_skin_tone": "๐Ÿ™๐Ÿฝ", + "person_gesturing_no": "๐Ÿ™…", + "person_gesturing_no_dark_skin_tone": "๐Ÿ™…๐Ÿฟ", + "person_gesturing_no_light_skin_tone": "๐Ÿ™…๐Ÿป", + "person_gesturing_no_medium-dark_skin_tone": "๐Ÿ™…๐Ÿพ", + "person_gesturing_no_medium-light_skin_tone": "๐Ÿ™…๐Ÿผ", + "person_gesturing_no_medium_skin_tone": "๐Ÿ™…๐Ÿฝ", + "person_gesturing_ok": "๐Ÿ™†", + "person_gesturing_ok_dark_skin_tone": "๐Ÿ™†๐Ÿฟ", + "person_gesturing_ok_light_skin_tone": "๐Ÿ™†๐Ÿป", + "person_gesturing_ok_medium-dark_skin_tone": "๐Ÿ™†๐Ÿพ", + "person_gesturing_ok_medium-light_skin_tone": "๐Ÿ™†๐Ÿผ", + "person_gesturing_ok_medium_skin_tone": "๐Ÿ™†๐Ÿฝ", + "person_getting_haircut": "๐Ÿ’‡", + "person_getting_haircut_dark_skin_tone": "๐Ÿ’‡๐Ÿฟ", + "person_getting_haircut_light_skin_tone": "๐Ÿ’‡๐Ÿป", + "person_getting_haircut_medium-dark_skin_tone": "๐Ÿ’‡๐Ÿพ", + "person_getting_haircut_medium-light_skin_tone": "๐Ÿ’‡๐Ÿผ", + "person_getting_haircut_medium_skin_tone": "๐Ÿ’‡๐Ÿฝ", + "person_getting_massage": "๐Ÿ’†", + "person_getting_massage_dark_skin_tone": "๐Ÿ’†๐Ÿฟ", + "person_getting_massage_light_skin_tone": "๐Ÿ’†๐Ÿป", + "person_getting_massage_medium-dark_skin_tone": "๐Ÿ’†๐Ÿพ", + "person_getting_massage_medium-light_skin_tone": "๐Ÿ’†๐Ÿผ", + "person_getting_massage_medium_skin_tone": "๐Ÿ’†๐Ÿฝ", + "person_golfing": "๐ŸŒ", + "person_golfing_dark_skin_tone": "๐ŸŒ๐Ÿฟ", + "person_golfing_light_skin_tone": "๐ŸŒ๐Ÿป", + "person_golfing_medium-dark_skin_tone": "๐ŸŒ๐Ÿพ", + "person_golfing_medium-light_skin_tone": "๐ŸŒ๐Ÿผ", + "person_golfing_medium_skin_tone": "๐ŸŒ๐Ÿฝ", + "person_in_bed": "๐Ÿ›Œ", + "person_in_bed_dark_skin_tone": "๐Ÿ›Œ๐Ÿฟ", + "person_in_bed_light_skin_tone": "๐Ÿ›Œ๐Ÿป", + "person_in_bed_medium-dark_skin_tone": "๐Ÿ›Œ๐Ÿพ", + "person_in_bed_medium-light_skin_tone": "๐Ÿ›Œ๐Ÿผ", + "person_in_bed_medium_skin_tone": "๐Ÿ›Œ๐Ÿฝ", + "person_in_lotus_position": "๐Ÿง˜", + "person_in_lotus_position_dark_skin_tone": "๐Ÿง˜๐Ÿฟ", + "person_in_lotus_position_light_skin_tone": "๐Ÿง˜๐Ÿป", + "person_in_lotus_position_medium-dark_skin_tone": "๐Ÿง˜๐Ÿพ", + "person_in_lotus_position_medium-light_skin_tone": "๐Ÿง˜๐Ÿผ", + "person_in_lotus_position_medium_skin_tone": "๐Ÿง˜๐Ÿฝ", + "person_in_steamy_room": "๐Ÿง–", + "person_in_steamy_room_dark_skin_tone": "๐Ÿง–๐Ÿฟ", + "person_in_steamy_room_light_skin_tone": "๐Ÿง–๐Ÿป", + "person_in_steamy_room_medium-dark_skin_tone": "๐Ÿง–๐Ÿพ", + "person_in_steamy_room_medium-light_skin_tone": "๐Ÿง–๐Ÿผ", + "person_in_steamy_room_medium_skin_tone": "๐Ÿง–๐Ÿฝ", + "person_juggling": "๐Ÿคน", + "person_juggling_dark_skin_tone": "๐Ÿคน๐Ÿฟ", + "person_juggling_light_skin_tone": "๐Ÿคน๐Ÿป", + "person_juggling_medium-dark_skin_tone": "๐Ÿคน๐Ÿพ", + "person_juggling_medium-light_skin_tone": "๐Ÿคน๐Ÿผ", + "person_juggling_medium_skin_tone": "๐Ÿคน๐Ÿฝ", + "person_kneeling": "๐ŸงŽ", + "person_lifting_weights": "๐Ÿ‹", + "person_lifting_weights_dark_skin_tone": "๐Ÿ‹๐Ÿฟ", + "person_lifting_weights_light_skin_tone": "๐Ÿ‹๐Ÿป", + "person_lifting_weights_medium-dark_skin_tone": "๐Ÿ‹๐Ÿพ", + "person_lifting_weights_medium-light_skin_tone": "๐Ÿ‹๐Ÿผ", + "person_lifting_weights_medium_skin_tone": "๐Ÿ‹๐Ÿฝ", + "person_mountain_biking": "๐Ÿšต", + "person_mountain_biking_dark_skin_tone": "๐Ÿšต๐Ÿฟ", + "person_mountain_biking_light_skin_tone": "๐Ÿšต๐Ÿป", + "person_mountain_biking_medium-dark_skin_tone": "๐Ÿšต๐Ÿพ", + "person_mountain_biking_medium-light_skin_tone": "๐Ÿšต๐Ÿผ", + "person_mountain_biking_medium_skin_tone": "๐Ÿšต๐Ÿฝ", + "person_playing_handball": "๐Ÿคพ", + "person_playing_handball_dark_skin_tone": "๐Ÿคพ๐Ÿฟ", + "person_playing_handball_light_skin_tone": "๐Ÿคพ๐Ÿป", + "person_playing_handball_medium-dark_skin_tone": "๐Ÿคพ๐Ÿพ", + "person_playing_handball_medium-light_skin_tone": "๐Ÿคพ๐Ÿผ", + "person_playing_handball_medium_skin_tone": "๐Ÿคพ๐Ÿฝ", + "person_playing_water_polo": "๐Ÿคฝ", + "person_playing_water_polo_dark_skin_tone": "๐Ÿคฝ๐Ÿฟ", + "person_playing_water_polo_light_skin_tone": "๐Ÿคฝ๐Ÿป", + "person_playing_water_polo_medium-dark_skin_tone": "๐Ÿคฝ๐Ÿพ", + "person_playing_water_polo_medium-light_skin_tone": "๐Ÿคฝ๐Ÿผ", + "person_playing_water_polo_medium_skin_tone": "๐Ÿคฝ๐Ÿฝ", + "person_pouting": "๐Ÿ™Ž", + "person_pouting_dark_skin_tone": "๐Ÿ™Ž๐Ÿฟ", + "person_pouting_light_skin_tone": "๐Ÿ™Ž๐Ÿป", + "person_pouting_medium-dark_skin_tone": "๐Ÿ™Ž๐Ÿพ", + "person_pouting_medium-light_skin_tone": "๐Ÿ™Ž๐Ÿผ", + "person_pouting_medium_skin_tone": "๐Ÿ™Ž๐Ÿฝ", + "person_raising_hand": "๐Ÿ™‹", + "person_raising_hand_dark_skin_tone": "๐Ÿ™‹๐Ÿฟ", + "person_raising_hand_light_skin_tone": "๐Ÿ™‹๐Ÿป", + "person_raising_hand_medium-dark_skin_tone": "๐Ÿ™‹๐Ÿพ", + "person_raising_hand_medium-light_skin_tone": "๐Ÿ™‹๐Ÿผ", + "person_raising_hand_medium_skin_tone": "๐Ÿ™‹๐Ÿฝ", + "person_rowing_boat": "๐Ÿšฃ", + "person_rowing_boat_dark_skin_tone": "๐Ÿšฃ๐Ÿฟ", + "person_rowing_boat_light_skin_tone": "๐Ÿšฃ๐Ÿป", + "person_rowing_boat_medium-dark_skin_tone": "๐Ÿšฃ๐Ÿพ", + "person_rowing_boat_medium-light_skin_tone": "๐Ÿšฃ๐Ÿผ", + "person_rowing_boat_medium_skin_tone": "๐Ÿšฃ๐Ÿฝ", + "person_running": "๐Ÿƒ", + "person_running_dark_skin_tone": "๐Ÿƒ๐Ÿฟ", + "person_running_light_skin_tone": "๐Ÿƒ๐Ÿป", + "person_running_medium-dark_skin_tone": "๐Ÿƒ๐Ÿพ", + "person_running_medium-light_skin_tone": "๐Ÿƒ๐Ÿผ", + "person_running_medium_skin_tone": "๐Ÿƒ๐Ÿฝ", + "person_shrugging": "๐Ÿคท", + "person_shrugging_dark_skin_tone": "๐Ÿคท๐Ÿฟ", + "person_shrugging_light_skin_tone": "๐Ÿคท๐Ÿป", + "person_shrugging_medium-dark_skin_tone": "๐Ÿคท๐Ÿพ", + "person_shrugging_medium-light_skin_tone": "๐Ÿคท๐Ÿผ", + "person_shrugging_medium_skin_tone": "๐Ÿคท๐Ÿฝ", + "person_standing": "๐Ÿง", + "person_surfing": "๐Ÿ„", + "person_surfing_dark_skin_tone": "๐Ÿ„๐Ÿฟ", + "person_surfing_light_skin_tone": "๐Ÿ„๐Ÿป", + "person_surfing_medium-dark_skin_tone": "๐Ÿ„๐Ÿพ", + "person_surfing_medium-light_skin_tone": "๐Ÿ„๐Ÿผ", + "person_surfing_medium_skin_tone": "๐Ÿ„๐Ÿฝ", + "person_swimming": "๐ŸŠ", + "person_swimming_dark_skin_tone": "๐ŸŠ๐Ÿฟ", + "person_swimming_light_skin_tone": "๐ŸŠ๐Ÿป", + "person_swimming_medium-dark_skin_tone": "๐ŸŠ๐Ÿพ", + "person_swimming_medium-light_skin_tone": "๐ŸŠ๐Ÿผ", + "person_swimming_medium_skin_tone": "๐ŸŠ๐Ÿฝ", + "person_taking_bath": "๐Ÿ›€", + "person_taking_bath_dark_skin_tone": "๐Ÿ›€๐Ÿฟ", + "person_taking_bath_light_skin_tone": "๐Ÿ›€๐Ÿป", + "person_taking_bath_medium-dark_skin_tone": "๐Ÿ›€๐Ÿพ", + "person_taking_bath_medium-light_skin_tone": "๐Ÿ›€๐Ÿผ", + "person_taking_bath_medium_skin_tone": "๐Ÿ›€๐Ÿฝ", + "person_tipping_hand": "๐Ÿ’", + "person_tipping_hand_dark_skin_tone": "๐Ÿ’๐Ÿฟ", + "person_tipping_hand_light_skin_tone": "๐Ÿ’๐Ÿป", + "person_tipping_hand_medium-dark_skin_tone": "๐Ÿ’๐Ÿพ", + "person_tipping_hand_medium-light_skin_tone": "๐Ÿ’๐Ÿผ", + "person_tipping_hand_medium_skin_tone": "๐Ÿ’๐Ÿฝ", + "person_walking": "๐Ÿšถ", + "person_walking_dark_skin_tone": "๐Ÿšถ๐Ÿฟ", + "person_walking_light_skin_tone": "๐Ÿšถ๐Ÿป", + "person_walking_medium-dark_skin_tone": "๐Ÿšถ๐Ÿพ", + "person_walking_medium-light_skin_tone": "๐Ÿšถ๐Ÿผ", + "person_walking_medium_skin_tone": "๐Ÿšถ๐Ÿฝ", + "person_wearing_turban": "๐Ÿ‘ณ", + "person_wearing_turban_dark_skin_tone": "๐Ÿ‘ณ๐Ÿฟ", + "person_wearing_turban_light_skin_tone": "๐Ÿ‘ณ๐Ÿป", + "person_wearing_turban_medium-dark_skin_tone": "๐Ÿ‘ณ๐Ÿพ", + "person_wearing_turban_medium-light_skin_tone": "๐Ÿ‘ณ๐Ÿผ", + "person_wearing_turban_medium_skin_tone": "๐Ÿ‘ณ๐Ÿฝ", + "petri_dish": "๐Ÿงซ", + "pick": "โ›", + "pie": "๐Ÿฅง", + "pig": "๐Ÿท", + "pig_face": "๐Ÿท", + "pig_nose": "๐Ÿฝ", + "pile_of_poo": "๐Ÿ’ฉ", + "pill": "๐Ÿ’Š", + "pinching_hand": "๐Ÿค", + "pine_decoration": "๐ŸŽ", + "pineapple": "๐Ÿ", + "ping_pong": "๐Ÿ“", + "pirate_flag": "๐Ÿด\u200dโ˜ ๏ธ", + "pistol": "๐Ÿ”ซ", + "pizza": "๐Ÿ•", + "place_of_worship": "๐Ÿ›", + "play_button": "โ–ถ", + "play_or_pause_button": "โฏ", + "pleading_face": "๐Ÿฅบ", + "police_car": "๐Ÿš“", + "police_car_light": "๐Ÿšจ", + "police_officer": "๐Ÿ‘ฎ", + "police_officer_dark_skin_tone": "๐Ÿ‘ฎ๐Ÿฟ", + "police_officer_light_skin_tone": "๐Ÿ‘ฎ๐Ÿป", + "police_officer_medium-dark_skin_tone": "๐Ÿ‘ฎ๐Ÿพ", + "police_officer_medium-light_skin_tone": "๐Ÿ‘ฎ๐Ÿผ", + "police_officer_medium_skin_tone": "๐Ÿ‘ฎ๐Ÿฝ", + "poodle": "๐Ÿฉ", + "pool_8_ball": "๐ŸŽฑ", + "popcorn": "๐Ÿฟ", + "post_office": "๐Ÿฃ", + "postal_horn": "๐Ÿ“ฏ", + "postbox": "๐Ÿ“ฎ", + "pot_of_food": "๐Ÿฒ", + "potable_water": "๐Ÿšฐ", + "potato": "๐Ÿฅ”", + "poultry_leg": "๐Ÿ—", + "pound_banknote": "๐Ÿ’ท", + "pouting_cat_face": "๐Ÿ˜พ", + "pouting_face": "๐Ÿ˜ก", + "prayer_beads": "๐Ÿ“ฟ", + "pregnant_woman": "๐Ÿคฐ", + "pregnant_woman_dark_skin_tone": "๐Ÿคฐ๐Ÿฟ", + "pregnant_woman_light_skin_tone": "๐Ÿคฐ๐Ÿป", + "pregnant_woman_medium-dark_skin_tone": "๐Ÿคฐ๐Ÿพ", + "pregnant_woman_medium-light_skin_tone": "๐Ÿคฐ๐Ÿผ", + "pregnant_woman_medium_skin_tone": "๐Ÿคฐ๐Ÿฝ", + "pretzel": "๐Ÿฅจ", + "probing_cane": "๐Ÿฆฏ", + "prince": "๐Ÿคด", + "prince_dark_skin_tone": "๐Ÿคด๐Ÿฟ", + "prince_light_skin_tone": "๐Ÿคด๐Ÿป", + "prince_medium-dark_skin_tone": "๐Ÿคด๐Ÿพ", + "prince_medium-light_skin_tone": "๐Ÿคด๐Ÿผ", + "prince_medium_skin_tone": "๐Ÿคด๐Ÿฝ", + "princess": "๐Ÿ‘ธ", + "princess_dark_skin_tone": "๐Ÿ‘ธ๐Ÿฟ", + "princess_light_skin_tone": "๐Ÿ‘ธ๐Ÿป", + "princess_medium-dark_skin_tone": "๐Ÿ‘ธ๐Ÿพ", + "princess_medium-light_skin_tone": "๐Ÿ‘ธ๐Ÿผ", + "princess_medium_skin_tone": "๐Ÿ‘ธ๐Ÿฝ", + "printer": "๐Ÿ–จ", + "prohibited": "๐Ÿšซ", + "purple_circle": "๐ŸŸฃ", + "purple_heart": "๐Ÿ’œ", + "purple_square": "๐ŸŸช", + "purse": "๐Ÿ‘›", + "pushpin": "๐Ÿ“Œ", + "question_mark": "โ“", + "rabbit": "๐Ÿฐ", + "rabbit_face": "๐Ÿฐ", + "raccoon": "๐Ÿฆ", + "racing_car": "๐ŸŽ", + "radio": "๐Ÿ“ป", + "radio_button": "๐Ÿ”˜", + "radioactive": "โ˜ข", + "railway_car": "๐Ÿšƒ", + "railway_track": "๐Ÿ›ค", + "rainbow": "๐ŸŒˆ", + "rainbow_flag": "๐Ÿณ๏ธ\u200d๐ŸŒˆ", + "raised_back_of_hand": "๐Ÿคš", + "raised_back_of_hand_dark_skin_tone": "๐Ÿคš๐Ÿฟ", + "raised_back_of_hand_light_skin_tone": "๐Ÿคš๐Ÿป", + "raised_back_of_hand_medium-dark_skin_tone": "๐Ÿคš๐Ÿพ", + "raised_back_of_hand_medium-light_skin_tone": "๐Ÿคš๐Ÿผ", + "raised_back_of_hand_medium_skin_tone": "๐Ÿคš๐Ÿฝ", + "raised_fist": "โœŠ", + "raised_fist_dark_skin_tone": "โœŠ๐Ÿฟ", + "raised_fist_light_skin_tone": "โœŠ๐Ÿป", + "raised_fist_medium-dark_skin_tone": "โœŠ๐Ÿพ", + "raised_fist_medium-light_skin_tone": "โœŠ๐Ÿผ", + "raised_fist_medium_skin_tone": "โœŠ๐Ÿฝ", + "raised_hand": "โœ‹", + "raised_hand_dark_skin_tone": "โœ‹๐Ÿฟ", + "raised_hand_light_skin_tone": "โœ‹๐Ÿป", + "raised_hand_medium-dark_skin_tone": "โœ‹๐Ÿพ", + "raised_hand_medium-light_skin_tone": "โœ‹๐Ÿผ", + "raised_hand_medium_skin_tone": "โœ‹๐Ÿฝ", + "raising_hands": "๐Ÿ™Œ", + "raising_hands_dark_skin_tone": "๐Ÿ™Œ๐Ÿฟ", + "raising_hands_light_skin_tone": "๐Ÿ™Œ๐Ÿป", + "raising_hands_medium-dark_skin_tone": "๐Ÿ™Œ๐Ÿพ", + "raising_hands_medium-light_skin_tone": "๐Ÿ™Œ๐Ÿผ", + "raising_hands_medium_skin_tone": "๐Ÿ™Œ๐Ÿฝ", + "ram": "๐Ÿ", + "rat": "๐Ÿ€", + "razor": "๐Ÿช’", + "ringed_planet": "๐Ÿช", + "receipt": "๐Ÿงพ", + "record_button": "โบ", + "recycling_symbol": "โ™ป", + "red_apple": "๐ŸŽ", + "red_circle": "๐Ÿ”ด", + "red_envelope": "๐Ÿงง", + "red_hair": "๐Ÿฆฐ", + "red-haired_man": "๐Ÿ‘จ\u200d๐Ÿฆฐ", + "red-haired_woman": "๐Ÿ‘ฉ\u200d๐Ÿฆฐ", + "red_heart": "โค", + "red_paper_lantern": "๐Ÿฎ", + "red_square": "๐ŸŸฅ", + "red_triangle_pointed_down": "๐Ÿ”ป", + "red_triangle_pointed_up": "๐Ÿ”บ", + "registered": "ยฎ", + "relieved_face": "๐Ÿ˜Œ", + "reminder_ribbon": "๐ŸŽ—", + "repeat_button": "๐Ÿ”", + "repeat_single_button": "๐Ÿ”‚", + "rescue_workerโ€™s_helmet": "โ›‘", + "restroom": "๐Ÿšป", + "reverse_button": "โ—€", + "revolving_hearts": "๐Ÿ’ž", + "rhinoceros": "๐Ÿฆ", + "ribbon": "๐ŸŽ€", + "rice_ball": "๐Ÿ™", + "rice_cracker": "๐Ÿ˜", + "right-facing_fist": "๐Ÿคœ", + "right-facing_fist_dark_skin_tone": "๐Ÿคœ๐Ÿฟ", + "right-facing_fist_light_skin_tone": "๐Ÿคœ๐Ÿป", + "right-facing_fist_medium-dark_skin_tone": "๐Ÿคœ๐Ÿพ", + "right-facing_fist_medium-light_skin_tone": "๐Ÿคœ๐Ÿผ", + "right-facing_fist_medium_skin_tone": "๐Ÿคœ๐Ÿฝ", + "right_anger_bubble": "๐Ÿ—ฏ", + "right_arrow": "โžก", + "right_arrow_curving_down": "โคต", + "right_arrow_curving_left": "โ†ฉ", + "right_arrow_curving_up": "โคด", + "ring": "๐Ÿ’", + "roasted_sweet_potato": "๐Ÿ ", + "robot_face": "๐Ÿค–", + "rocket": "๐Ÿš€", + "roll_of_paper": "๐Ÿงป", + "rolled-up_newspaper": "๐Ÿ—ž", + "roller_coaster": "๐ŸŽข", + "rolling_on_the_floor_laughing": "๐Ÿคฃ", + "rooster": "๐Ÿ“", + "rose": "๐ŸŒน", + "rosette": "๐Ÿต", + "round_pushpin": "๐Ÿ“", + "rugby_football": "๐Ÿ‰", + "running_shirt": "๐ŸŽฝ", + "running_shoe": "๐Ÿ‘Ÿ", + "sad_but_relieved_face": "๐Ÿ˜ฅ", + "safety_pin": "๐Ÿงท", + "safety_vest": "๐Ÿฆบ", + "salt": "๐Ÿง‚", + "sailboat": "โ›ต", + "sake": "๐Ÿถ", + "sandwich": "๐Ÿฅช", + "sari": "๐Ÿฅป", + "satellite": "๐Ÿ“ก", + "satellite_antenna": "๐Ÿ“ก", + "sauropod": "๐Ÿฆ•", + "saxophone": "๐ŸŽท", + "scarf": "๐Ÿงฃ", + "school": "๐Ÿซ", + "school_backpack": "๐ŸŽ’", + "scissors": "โœ‚", + "scorpion": "๐Ÿฆ‚", + "scroll": "๐Ÿ“œ", + "seat": "๐Ÿ’บ", + "see-no-evil_monkey": "๐Ÿ™ˆ", + "seedling": "๐ŸŒฑ", + "selfie": "๐Ÿคณ", + "selfie_dark_skin_tone": "๐Ÿคณ๐Ÿฟ", + "selfie_light_skin_tone": "๐Ÿคณ๐Ÿป", + "selfie_medium-dark_skin_tone": "๐Ÿคณ๐Ÿพ", + "selfie_medium-light_skin_tone": "๐Ÿคณ๐Ÿผ", + "selfie_medium_skin_tone": "๐Ÿคณ๐Ÿฝ", + "service_dog": "๐Ÿ•\u200d๐Ÿฆบ", + "seven-thirty": "๐Ÿ•ข", + "seven_oโ€™clock": "๐Ÿ•–", + "shallow_pan_of_food": "๐Ÿฅ˜", + "shamrock": "โ˜˜", + "shark": "๐Ÿฆˆ", + "shaved_ice": "๐Ÿง", + "sheaf_of_rice": "๐ŸŒพ", + "shield": "๐Ÿ›ก", + "shinto_shrine": "โ›ฉ", + "ship": "๐Ÿšข", + "shooting_star": "๐ŸŒ ", + "shopping_bags": "๐Ÿ›", + "shopping_cart": "๐Ÿ›’", + "shortcake": "๐Ÿฐ", + "shorts": "๐Ÿฉณ", + "shower": "๐Ÿšฟ", + "shrimp": "๐Ÿฆ", + "shuffle_tracks_button": "๐Ÿ”€", + "shushing_face": "๐Ÿคซ", + "sign_of_the_horns": "๐Ÿค˜", + "sign_of_the_horns_dark_skin_tone": "๐Ÿค˜๐Ÿฟ", + "sign_of_the_horns_light_skin_tone": "๐Ÿค˜๐Ÿป", + "sign_of_the_horns_medium-dark_skin_tone": "๐Ÿค˜๐Ÿพ", + "sign_of_the_horns_medium-light_skin_tone": "๐Ÿค˜๐Ÿผ", + "sign_of_the_horns_medium_skin_tone": "๐Ÿค˜๐Ÿฝ", + "six-thirty": "๐Ÿ•ก", + "six_oโ€™clock": "๐Ÿ••", + "skateboard": "๐Ÿ›น", + "skier": "โ›ท", + "skis": "๐ŸŽฟ", + "skull": "๐Ÿ’€", + "skull_and_crossbones": "โ˜ ", + "skunk": "๐Ÿฆจ", + "sled": "๐Ÿ›ท", + "sleeping_face": "๐Ÿ˜ด", + "sleepy_face": "๐Ÿ˜ช", + "slightly_frowning_face": "๐Ÿ™", + "slightly_smiling_face": "๐Ÿ™‚", + "slot_machine": "๐ŸŽฐ", + "sloth": "๐Ÿฆฅ", + "small_airplane": "๐Ÿ›ฉ", + "small_blue_diamond": "๐Ÿ”น", + "small_orange_diamond": "๐Ÿ”ธ", + "smiling_cat_face_with_heart-eyes": "๐Ÿ˜ป", + "smiling_face": "โ˜บ", + "smiling_face_with_halo": "๐Ÿ˜‡", + "smiling_face_with_3_hearts": "๐Ÿฅฐ", + "smiling_face_with_heart-eyes": "๐Ÿ˜", + "smiling_face_with_horns": "๐Ÿ˜ˆ", + "smiling_face_with_smiling_eyes": "๐Ÿ˜Š", + "smiling_face_with_sunglasses": "๐Ÿ˜Ž", + "smirking_face": "๐Ÿ˜", + "snail": "๐ŸŒ", + "snake": "๐Ÿ", + "sneezing_face": "๐Ÿคง", + "snow-capped_mountain": "๐Ÿ”", + "snowboarder": "๐Ÿ‚", + "snowboarder_dark_skin_tone": "๐Ÿ‚๐Ÿฟ", + "snowboarder_light_skin_tone": "๐Ÿ‚๐Ÿป", + "snowboarder_medium-dark_skin_tone": "๐Ÿ‚๐Ÿพ", + "snowboarder_medium-light_skin_tone": "๐Ÿ‚๐Ÿผ", + "snowboarder_medium_skin_tone": "๐Ÿ‚๐Ÿฝ", + "snowflake": "โ„", + "snowman": "โ˜ƒ", + "snowman_without_snow": "โ›„", + "soap": "๐Ÿงผ", + "soccer_ball": "โšฝ", + "socks": "๐Ÿงฆ", + "softball": "๐ŸฅŽ", + "soft_ice_cream": "๐Ÿฆ", + "spade_suit": "โ™ ", + "spaghetti": "๐Ÿ", + "sparkle": "โ‡", + "sparkler": "๐ŸŽ‡", + "sparkles": "โœจ", + "sparkling_heart": "๐Ÿ’–", + "speak-no-evil_monkey": "๐Ÿ™Š", + "speaker_high_volume": "๐Ÿ”Š", + "speaker_low_volume": "๐Ÿ”ˆ", + "speaker_medium_volume": "๐Ÿ”‰", + "speaking_head": "๐Ÿ—ฃ", + "speech_balloon": "๐Ÿ’ฌ", + "speedboat": "๐Ÿšค", + "spider": "๐Ÿ•ท", + "spider_web": "๐Ÿ•ธ", + "spiral_calendar": "๐Ÿ—“", + "spiral_notepad": "๐Ÿ—’", + "spiral_shell": "๐Ÿš", + "spoon": "๐Ÿฅ„", + "sponge": "๐Ÿงฝ", + "sport_utility_vehicle": "๐Ÿš™", + "sports_medal": "๐Ÿ…", + "spouting_whale": "๐Ÿณ", + "squid": "๐Ÿฆ‘", + "squinting_face_with_tongue": "๐Ÿ˜", + "stadium": "๐ŸŸ", + "star-struck": "๐Ÿคฉ", + "star_and_crescent": "โ˜ช", + "star_of_david": "โœก", + "station": "๐Ÿš‰", + "steaming_bowl": "๐Ÿœ", + "stethoscope": "๐Ÿฉบ", + "stop_button": "โน", + "stop_sign": "๐Ÿ›‘", + "stopwatch": "โฑ", + "straight_ruler": "๐Ÿ“", + "strawberry": "๐Ÿ“", + "studio_microphone": "๐ŸŽ™", + "stuffed_flatbread": "๐Ÿฅ™", + "sun": "โ˜€", + "sun_behind_cloud": "โ›…", + "sun_behind_large_cloud": "๐ŸŒฅ", + "sun_behind_rain_cloud": "๐ŸŒฆ", + "sun_behind_small_cloud": "๐ŸŒค", + "sun_with_face": "๐ŸŒž", + "sunflower": "๐ŸŒป", + "sunglasses": "๐Ÿ˜Ž", + "sunrise": "๐ŸŒ…", + "sunrise_over_mountains": "๐ŸŒ„", + "sunset": "๐ŸŒ‡", + "superhero": "๐Ÿฆธ", + "supervillain": "๐Ÿฆน", + "sushi": "๐Ÿฃ", + "suspension_railway": "๐ŸšŸ", + "swan": "๐Ÿฆข", + "sweat_droplets": "๐Ÿ’ฆ", + "synagogue": "๐Ÿ•", + "syringe": "๐Ÿ’‰", + "t-shirt": "๐Ÿ‘•", + "taco": "๐ŸŒฎ", + "takeout_box": "๐Ÿฅก", + "tanabata_tree": "๐ŸŽ‹", + "tangerine": "๐ŸŠ", + "taxi": "๐Ÿš•", + "teacup_without_handle": "๐Ÿต", + "tear-off_calendar": "๐Ÿ“†", + "teddy_bear": "๐Ÿงธ", + "telephone": "โ˜Ž", + "telephone_receiver": "๐Ÿ“ž", + "telescope": "๐Ÿ”ญ", + "television": "๐Ÿ“บ", + "ten-thirty": "๐Ÿ•ฅ", + "ten_oโ€™clock": "๐Ÿ•™", + "tennis": "๐ŸŽพ", + "tent": "โ›บ", + "test_tube": "๐Ÿงช", + "thermometer": "๐ŸŒก", + "thinking_face": "๐Ÿค”", + "thought_balloon": "๐Ÿ’ญ", + "thread": "๐Ÿงต", + "three-thirty": "๐Ÿ•ž", + "three_oโ€™clock": "๐Ÿ•’", + "thumbs_down": "๐Ÿ‘Ž", + "thumbs_down_dark_skin_tone": "๐Ÿ‘Ž๐Ÿฟ", + "thumbs_down_light_skin_tone": "๐Ÿ‘Ž๐Ÿป", + "thumbs_down_medium-dark_skin_tone": "๐Ÿ‘Ž๐Ÿพ", + "thumbs_down_medium-light_skin_tone": "๐Ÿ‘Ž๐Ÿผ", + "thumbs_down_medium_skin_tone": "๐Ÿ‘Ž๐Ÿฝ", + "thumbs_up": "๐Ÿ‘", + "thumbs_up_dark_skin_tone": "๐Ÿ‘๐Ÿฟ", + "thumbs_up_light_skin_tone": "๐Ÿ‘๐Ÿป", + "thumbs_up_medium-dark_skin_tone": "๐Ÿ‘๐Ÿพ", + "thumbs_up_medium-light_skin_tone": "๐Ÿ‘๐Ÿผ", + "thumbs_up_medium_skin_tone": "๐Ÿ‘๐Ÿฝ", + "ticket": "๐ŸŽซ", + "tiger": "๐Ÿฏ", + "tiger_face": "๐Ÿฏ", + "timer_clock": "โฒ", + "tired_face": "๐Ÿ˜ซ", + "toolbox": "๐Ÿงฐ", + "toilet": "๐Ÿšฝ", + "tomato": "๐Ÿ…", + "tongue": "๐Ÿ‘…", + "tooth": "๐Ÿฆท", + "top_hat": "๐ŸŽฉ", + "tornado": "๐ŸŒช", + "trackball": "๐Ÿ–ฒ", + "tractor": "๐Ÿšœ", + "trade_mark": "โ„ข", + "train": "๐Ÿš‹", + "tram": "๐ŸšŠ", + "tram_car": "๐Ÿš‹", + "triangular_flag": "๐Ÿšฉ", + "triangular_ruler": "๐Ÿ“", + "trident_emblem": "๐Ÿ”ฑ", + "trolleybus": "๐ŸšŽ", + "trophy": "๐Ÿ†", + "tropical_drink": "๐Ÿน", + "tropical_fish": "๐Ÿ ", + "trumpet": "๐ŸŽบ", + "tulip": "๐ŸŒท", + "tumbler_glass": "๐Ÿฅƒ", + "turtle": "๐Ÿข", + "twelve-thirty": "๐Ÿ•ง", + "twelve_oโ€™clock": "๐Ÿ•›", + "two-hump_camel": "๐Ÿซ", + "two-thirty": "๐Ÿ•", + "two_hearts": "๐Ÿ’•", + "two_men_holding_hands": "๐Ÿ‘ฌ", + "two_oโ€™clock": "๐Ÿ•‘", + "two_women_holding_hands": "๐Ÿ‘ญ", + "umbrella": "โ˜‚", + "umbrella_on_ground": "โ›ฑ", + "umbrella_with_rain_drops": "โ˜”", + "unamused_face": "๐Ÿ˜’", + "unicorn_face": "๐Ÿฆ„", + "unlocked": "๐Ÿ”“", + "up-down_arrow": "โ†•", + "up-left_arrow": "โ†–", + "up-right_arrow": "โ†—", + "up_arrow": "โฌ†", + "upside-down_face": "๐Ÿ™ƒ", + "upwards_button": "๐Ÿ”ผ", + "vampire": "๐Ÿง›", + "vampire_dark_skin_tone": "๐Ÿง›๐Ÿฟ", + "vampire_light_skin_tone": "๐Ÿง›๐Ÿป", + "vampire_medium-dark_skin_tone": "๐Ÿง›๐Ÿพ", + "vampire_medium-light_skin_tone": "๐Ÿง›๐Ÿผ", + "vampire_medium_skin_tone": "๐Ÿง›๐Ÿฝ", + "vertical_traffic_light": "๐Ÿšฆ", + "vibration_mode": "๐Ÿ“ณ", + "victory_hand": "โœŒ", + "victory_hand_dark_skin_tone": "โœŒ๐Ÿฟ", + "victory_hand_light_skin_tone": "โœŒ๐Ÿป", + "victory_hand_medium-dark_skin_tone": "โœŒ๐Ÿพ", + "victory_hand_medium-light_skin_tone": "โœŒ๐Ÿผ", + "victory_hand_medium_skin_tone": "โœŒ๐Ÿฝ", + "video_camera": "๐Ÿ“น", + "video_game": "๐ŸŽฎ", + "videocassette": "๐Ÿ“ผ", + "violin": "๐ŸŽป", + "volcano": "๐ŸŒ‹", + "volleyball": "๐Ÿ", + "vulcan_salute": "๐Ÿ––", + "vulcan_salute_dark_skin_tone": "๐Ÿ––๐Ÿฟ", + "vulcan_salute_light_skin_tone": "๐Ÿ––๐Ÿป", + "vulcan_salute_medium-dark_skin_tone": "๐Ÿ––๐Ÿพ", + "vulcan_salute_medium-light_skin_tone": "๐Ÿ––๐Ÿผ", + "vulcan_salute_medium_skin_tone": "๐Ÿ––๐Ÿฝ", + "waffle": "๐Ÿง‡", + "waning_crescent_moon": "๐ŸŒ˜", + "waning_gibbous_moon": "๐ŸŒ–", + "warning": "โš ", + "wastebasket": "๐Ÿ—‘", + "watch": "โŒš", + "water_buffalo": "๐Ÿƒ", + "water_closet": "๐Ÿšพ", + "water_wave": "๐ŸŒŠ", + "watermelon": "๐Ÿ‰", + "waving_hand": "๐Ÿ‘‹", + "waving_hand_dark_skin_tone": "๐Ÿ‘‹๐Ÿฟ", + "waving_hand_light_skin_tone": "๐Ÿ‘‹๐Ÿป", + "waving_hand_medium-dark_skin_tone": "๐Ÿ‘‹๐Ÿพ", + "waving_hand_medium-light_skin_tone": "๐Ÿ‘‹๐Ÿผ", + "waving_hand_medium_skin_tone": "๐Ÿ‘‹๐Ÿฝ", + "wavy_dash": "ใ€ฐ", + "waxing_crescent_moon": "๐ŸŒ’", + "waxing_gibbous_moon": "๐ŸŒ”", + "weary_cat_face": "๐Ÿ™€", + "weary_face": "๐Ÿ˜ฉ", + "wedding": "๐Ÿ’’", + "whale": "๐Ÿณ", + "wheel_of_dharma": "โ˜ธ", + "wheelchair_symbol": "โ™ฟ", + "white_circle": "โšช", + "white_exclamation_mark": "โ•", + "white_flag": "๐Ÿณ", + "white_flower": "๐Ÿ’ฎ", + "white_hair": "๐Ÿฆณ", + "white-haired_man": "๐Ÿ‘จ\u200d๐Ÿฆณ", + "white-haired_woman": "๐Ÿ‘ฉ\u200d๐Ÿฆณ", + "white_heart": "๐Ÿค", + "white_heavy_check_mark": "โœ…", + "white_large_square": "โฌœ", + "white_medium-small_square": "โ—ฝ", + "white_medium_square": "โ—ป", + "white_medium_star": "โญ", + "white_question_mark": "โ”", + "white_small_square": "โ–ซ", + "white_square_button": "๐Ÿ”ณ", + "wilted_flower": "๐Ÿฅ€", + "wind_chime": "๐ŸŽ", + "wind_face": "๐ŸŒฌ", + "wine_glass": "๐Ÿท", + "winking_face": "๐Ÿ˜‰", + "winking_face_with_tongue": "๐Ÿ˜œ", + "wolf_face": "๐Ÿบ", + "woman": "๐Ÿ‘ฉ", + "woman_artist": "๐Ÿ‘ฉ\u200d๐ŸŽจ", + "woman_artist_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐ŸŽจ", + "woman_artist_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐ŸŽจ", + "woman_artist_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐ŸŽจ", + "woman_artist_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐ŸŽจ", + "woman_artist_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐ŸŽจ", + "woman_astronaut": "๐Ÿ‘ฉ\u200d๐Ÿš€", + "woman_astronaut_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿš€", + "woman_astronaut_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿš€", + "woman_astronaut_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿš€", + "woman_astronaut_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿš€", + "woman_astronaut_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿš€", + "woman_biking": "๐Ÿšด\u200dโ™€๏ธ", + "woman_biking_dark_skin_tone": "๐Ÿšด๐Ÿฟ\u200dโ™€๏ธ", + "woman_biking_light_skin_tone": "๐Ÿšด๐Ÿป\u200dโ™€๏ธ", + "woman_biking_medium-dark_skin_tone": "๐Ÿšด๐Ÿพ\u200dโ™€๏ธ", + "woman_biking_medium-light_skin_tone": "๐Ÿšด๐Ÿผ\u200dโ™€๏ธ", + "woman_biking_medium_skin_tone": "๐Ÿšด๐Ÿฝ\u200dโ™€๏ธ", + "woman_bouncing_ball": "โ›น๏ธ\u200dโ™€๏ธ", + "woman_bouncing_ball_dark_skin_tone": "โ›น๐Ÿฟ\u200dโ™€๏ธ", + "woman_bouncing_ball_light_skin_tone": "โ›น๐Ÿป\u200dโ™€๏ธ", + "woman_bouncing_ball_medium-dark_skin_tone": "โ›น๐Ÿพ\u200dโ™€๏ธ", + "woman_bouncing_ball_medium-light_skin_tone": "โ›น๐Ÿผ\u200dโ™€๏ธ", + "woman_bouncing_ball_medium_skin_tone": "โ›น๐Ÿฝ\u200dโ™€๏ธ", + "woman_bowing": "๐Ÿ™‡\u200dโ™€๏ธ", + "woman_bowing_dark_skin_tone": "๐Ÿ™‡๐Ÿฟ\u200dโ™€๏ธ", + "woman_bowing_light_skin_tone": "๐Ÿ™‡๐Ÿป\u200dโ™€๏ธ", + "woman_bowing_medium-dark_skin_tone": "๐Ÿ™‡๐Ÿพ\u200dโ™€๏ธ", + "woman_bowing_medium-light_skin_tone": "๐Ÿ™‡๐Ÿผ\u200dโ™€๏ธ", + "woman_bowing_medium_skin_tone": "๐Ÿ™‡๐Ÿฝ\u200dโ™€๏ธ", + "woman_cartwheeling": "๐Ÿคธ\u200dโ™€๏ธ", + "woman_cartwheeling_dark_skin_tone": "๐Ÿคธ๐Ÿฟ\u200dโ™€๏ธ", + "woman_cartwheeling_light_skin_tone": "๐Ÿคธ๐Ÿป\u200dโ™€๏ธ", + "woman_cartwheeling_medium-dark_skin_tone": "๐Ÿคธ๐Ÿพ\u200dโ™€๏ธ", + "woman_cartwheeling_medium-light_skin_tone": "๐Ÿคธ๐Ÿผ\u200dโ™€๏ธ", + "woman_cartwheeling_medium_skin_tone": "๐Ÿคธ๐Ÿฝ\u200dโ™€๏ธ", + "woman_climbing": "๐Ÿง—\u200dโ™€๏ธ", + "woman_climbing_dark_skin_tone": "๐Ÿง—๐Ÿฟ\u200dโ™€๏ธ", + "woman_climbing_light_skin_tone": "๐Ÿง—๐Ÿป\u200dโ™€๏ธ", + "woman_climbing_medium-dark_skin_tone": "๐Ÿง—๐Ÿพ\u200dโ™€๏ธ", + "woman_climbing_medium-light_skin_tone": "๐Ÿง—๐Ÿผ\u200dโ™€๏ธ", + "woman_climbing_medium_skin_tone": "๐Ÿง—๐Ÿฝ\u200dโ™€๏ธ", + "woman_construction_worker": "๐Ÿ‘ท\u200dโ™€๏ธ", + "woman_construction_worker_dark_skin_tone": "๐Ÿ‘ท๐Ÿฟ\u200dโ™€๏ธ", + "woman_construction_worker_light_skin_tone": "๐Ÿ‘ท๐Ÿป\u200dโ™€๏ธ", + "woman_construction_worker_medium-dark_skin_tone": "๐Ÿ‘ท๐Ÿพ\u200dโ™€๏ธ", + "woman_construction_worker_medium-light_skin_tone": "๐Ÿ‘ท๐Ÿผ\u200dโ™€๏ธ", + "woman_construction_worker_medium_skin_tone": "๐Ÿ‘ท๐Ÿฝ\u200dโ™€๏ธ", + "woman_cook": "๐Ÿ‘ฉ\u200d๐Ÿณ", + "woman_cook_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿณ", + "woman_cook_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿณ", + "woman_cook_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿณ", + "woman_cook_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿณ", + "woman_cook_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿณ", + "woman_dancing": "๐Ÿ’ƒ", + "woman_dancing_dark_skin_tone": "๐Ÿ’ƒ๐Ÿฟ", + "woman_dancing_light_skin_tone": "๐Ÿ’ƒ๐Ÿป", + "woman_dancing_medium-dark_skin_tone": "๐Ÿ’ƒ๐Ÿพ", + "woman_dancing_medium-light_skin_tone": "๐Ÿ’ƒ๐Ÿผ", + "woman_dancing_medium_skin_tone": "๐Ÿ’ƒ๐Ÿฝ", + "woman_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ", + "woman_detective": "๐Ÿ•ต๏ธ\u200dโ™€๏ธ", + "woman_detective_dark_skin_tone": "๐Ÿ•ต๐Ÿฟ\u200dโ™€๏ธ", + "woman_detective_light_skin_tone": "๐Ÿ•ต๐Ÿป\u200dโ™€๏ธ", + "woman_detective_medium-dark_skin_tone": "๐Ÿ•ต๐Ÿพ\u200dโ™€๏ธ", + "woman_detective_medium-light_skin_tone": "๐Ÿ•ต๐Ÿผ\u200dโ™€๏ธ", + "woman_detective_medium_skin_tone": "๐Ÿ•ต๐Ÿฝ\u200dโ™€๏ธ", + "woman_elf": "๐Ÿง\u200dโ™€๏ธ", + "woman_elf_dark_skin_tone": "๐Ÿง๐Ÿฟ\u200dโ™€๏ธ", + "woman_elf_light_skin_tone": "๐Ÿง๐Ÿป\u200dโ™€๏ธ", + "woman_elf_medium-dark_skin_tone": "๐Ÿง๐Ÿพ\u200dโ™€๏ธ", + "woman_elf_medium-light_skin_tone": "๐Ÿง๐Ÿผ\u200dโ™€๏ธ", + "woman_elf_medium_skin_tone": "๐Ÿง๐Ÿฝ\u200dโ™€๏ธ", + "woman_facepalming": "๐Ÿคฆ\u200dโ™€๏ธ", + "woman_facepalming_dark_skin_tone": "๐Ÿคฆ๐Ÿฟ\u200dโ™€๏ธ", + "woman_facepalming_light_skin_tone": "๐Ÿคฆ๐Ÿป\u200dโ™€๏ธ", + "woman_facepalming_medium-dark_skin_tone": "๐Ÿคฆ๐Ÿพ\u200dโ™€๏ธ", + "woman_facepalming_medium-light_skin_tone": "๐Ÿคฆ๐Ÿผ\u200dโ™€๏ธ", + "woman_facepalming_medium_skin_tone": "๐Ÿคฆ๐Ÿฝ\u200dโ™€๏ธ", + "woman_factory_worker": "๐Ÿ‘ฉ\u200d๐Ÿญ", + "woman_factory_worker_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿญ", + "woman_factory_worker_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿญ", + "woman_factory_worker_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿญ", + "woman_factory_worker_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿญ", + "woman_factory_worker_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿญ", + "woman_fairy": "๐Ÿงš\u200dโ™€๏ธ", + "woman_fairy_dark_skin_tone": "๐Ÿงš๐Ÿฟ\u200dโ™€๏ธ", + "woman_fairy_light_skin_tone": "๐Ÿงš๐Ÿป\u200dโ™€๏ธ", + "woman_fairy_medium-dark_skin_tone": "๐Ÿงš๐Ÿพ\u200dโ™€๏ธ", + "woman_fairy_medium-light_skin_tone": "๐Ÿงš๐Ÿผ\u200dโ™€๏ธ", + "woman_fairy_medium_skin_tone": "๐Ÿงš๐Ÿฝ\u200dโ™€๏ธ", + "woman_farmer": "๐Ÿ‘ฉ\u200d๐ŸŒพ", + "woman_farmer_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐ŸŒพ", + "woman_farmer_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐ŸŒพ", + "woman_farmer_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐ŸŒพ", + "woman_farmer_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐ŸŒพ", + "woman_farmer_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐ŸŒพ", + "woman_firefighter": "๐Ÿ‘ฉ\u200d๐Ÿš’", + "woman_firefighter_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿš’", + "woman_firefighter_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿš’", + "woman_firefighter_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿš’", + "woman_firefighter_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿš’", + "woman_firefighter_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿš’", + "woman_frowning": "๐Ÿ™\u200dโ™€๏ธ", + "woman_frowning_dark_skin_tone": "๐Ÿ™๐Ÿฟ\u200dโ™€๏ธ", + "woman_frowning_light_skin_tone": "๐Ÿ™๐Ÿป\u200dโ™€๏ธ", + "woman_frowning_medium-dark_skin_tone": "๐Ÿ™๐Ÿพ\u200dโ™€๏ธ", + "woman_frowning_medium-light_skin_tone": "๐Ÿ™๐Ÿผ\u200dโ™€๏ธ", + "woman_frowning_medium_skin_tone": "๐Ÿ™๐Ÿฝ\u200dโ™€๏ธ", + "woman_genie": "๐Ÿงž\u200dโ™€๏ธ", + "woman_gesturing_no": "๐Ÿ™…\u200dโ™€๏ธ", + "woman_gesturing_no_dark_skin_tone": "๐Ÿ™…๐Ÿฟ\u200dโ™€๏ธ", + "woman_gesturing_no_light_skin_tone": "๐Ÿ™…๐Ÿป\u200dโ™€๏ธ", + "woman_gesturing_no_medium-dark_skin_tone": "๐Ÿ™…๐Ÿพ\u200dโ™€๏ธ", + "woman_gesturing_no_medium-light_skin_tone": "๐Ÿ™…๐Ÿผ\u200dโ™€๏ธ", + "woman_gesturing_no_medium_skin_tone": "๐Ÿ™…๐Ÿฝ\u200dโ™€๏ธ", + "woman_gesturing_ok": "๐Ÿ™†\u200dโ™€๏ธ", + "woman_gesturing_ok_dark_skin_tone": "๐Ÿ™†๐Ÿฟ\u200dโ™€๏ธ", + "woman_gesturing_ok_light_skin_tone": "๐Ÿ™†๐Ÿป\u200dโ™€๏ธ", + "woman_gesturing_ok_medium-dark_skin_tone": "๐Ÿ™†๐Ÿพ\u200dโ™€๏ธ", + "woman_gesturing_ok_medium-light_skin_tone": "๐Ÿ™†๐Ÿผ\u200dโ™€๏ธ", + "woman_gesturing_ok_medium_skin_tone": "๐Ÿ™†๐Ÿฝ\u200dโ™€๏ธ", + "woman_getting_haircut": "๐Ÿ’‡\u200dโ™€๏ธ", + "woman_getting_haircut_dark_skin_tone": "๐Ÿ’‡๐Ÿฟ\u200dโ™€๏ธ", + "woman_getting_haircut_light_skin_tone": "๐Ÿ’‡๐Ÿป\u200dโ™€๏ธ", + "woman_getting_haircut_medium-dark_skin_tone": "๐Ÿ’‡๐Ÿพ\u200dโ™€๏ธ", + "woman_getting_haircut_medium-light_skin_tone": "๐Ÿ’‡๐Ÿผ\u200dโ™€๏ธ", + "woman_getting_haircut_medium_skin_tone": "๐Ÿ’‡๐Ÿฝ\u200dโ™€๏ธ", + "woman_getting_massage": "๐Ÿ’†\u200dโ™€๏ธ", + "woman_getting_massage_dark_skin_tone": "๐Ÿ’†๐Ÿฟ\u200dโ™€๏ธ", + "woman_getting_massage_light_skin_tone": "๐Ÿ’†๐Ÿป\u200dโ™€๏ธ", + "woman_getting_massage_medium-dark_skin_tone": "๐Ÿ’†๐Ÿพ\u200dโ™€๏ธ", + "woman_getting_massage_medium-light_skin_tone": "๐Ÿ’†๐Ÿผ\u200dโ™€๏ธ", + "woman_getting_massage_medium_skin_tone": "๐Ÿ’†๐Ÿฝ\u200dโ™€๏ธ", + "woman_golfing": "๐ŸŒ๏ธ\u200dโ™€๏ธ", + "woman_golfing_dark_skin_tone": "๐ŸŒ๐Ÿฟ\u200dโ™€๏ธ", + "woman_golfing_light_skin_tone": "๐ŸŒ๐Ÿป\u200dโ™€๏ธ", + "woman_golfing_medium-dark_skin_tone": "๐ŸŒ๐Ÿพ\u200dโ™€๏ธ", + "woman_golfing_medium-light_skin_tone": "๐ŸŒ๐Ÿผ\u200dโ™€๏ธ", + "woman_golfing_medium_skin_tone": "๐ŸŒ๐Ÿฝ\u200dโ™€๏ธ", + "woman_guard": "๐Ÿ’‚\u200dโ™€๏ธ", + "woman_guard_dark_skin_tone": "๐Ÿ’‚๐Ÿฟ\u200dโ™€๏ธ", + "woman_guard_light_skin_tone": "๐Ÿ’‚๐Ÿป\u200dโ™€๏ธ", + "woman_guard_medium-dark_skin_tone": "๐Ÿ’‚๐Ÿพ\u200dโ™€๏ธ", + "woman_guard_medium-light_skin_tone": "๐Ÿ’‚๐Ÿผ\u200dโ™€๏ธ", + "woman_guard_medium_skin_tone": "๐Ÿ’‚๐Ÿฝ\u200dโ™€๏ธ", + "woman_health_worker": "๐Ÿ‘ฉ\u200dโš•๏ธ", + "woman_health_worker_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200dโš•๏ธ", + "woman_health_worker_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200dโš•๏ธ", + "woman_health_worker_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200dโš•๏ธ", + "woman_health_worker_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200dโš•๏ธ", + "woman_health_worker_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200dโš•๏ธ", + "woman_in_lotus_position": "๐Ÿง˜\u200dโ™€๏ธ", + "woman_in_lotus_position_dark_skin_tone": "๐Ÿง˜๐Ÿฟ\u200dโ™€๏ธ", + "woman_in_lotus_position_light_skin_tone": "๐Ÿง˜๐Ÿป\u200dโ™€๏ธ", + "woman_in_lotus_position_medium-dark_skin_tone": "๐Ÿง˜๐Ÿพ\u200dโ™€๏ธ", + "woman_in_lotus_position_medium-light_skin_tone": "๐Ÿง˜๐Ÿผ\u200dโ™€๏ธ", + "woman_in_lotus_position_medium_skin_tone": "๐Ÿง˜๐Ÿฝ\u200dโ™€๏ธ", + "woman_in_manual_wheelchair": "๐Ÿ‘ฉ\u200d๐Ÿฆฝ", + "woman_in_motorized_wheelchair": "๐Ÿ‘ฉ\u200d๐Ÿฆผ", + "woman_in_steamy_room": "๐Ÿง–\u200dโ™€๏ธ", + "woman_in_steamy_room_dark_skin_tone": "๐Ÿง–๐Ÿฟ\u200dโ™€๏ธ", + "woman_in_steamy_room_light_skin_tone": "๐Ÿง–๐Ÿป\u200dโ™€๏ธ", + "woman_in_steamy_room_medium-dark_skin_tone": "๐Ÿง–๐Ÿพ\u200dโ™€๏ธ", + "woman_in_steamy_room_medium-light_skin_tone": "๐Ÿง–๐Ÿผ\u200dโ™€๏ธ", + "woman_in_steamy_room_medium_skin_tone": "๐Ÿง–๐Ÿฝ\u200dโ™€๏ธ", + "woman_judge": "๐Ÿ‘ฉ\u200dโš–๏ธ", + "woman_judge_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200dโš–๏ธ", + "woman_judge_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200dโš–๏ธ", + "woman_judge_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200dโš–๏ธ", + "woman_judge_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200dโš–๏ธ", + "woman_judge_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200dโš–๏ธ", + "woman_juggling": "๐Ÿคน\u200dโ™€๏ธ", + "woman_juggling_dark_skin_tone": "๐Ÿคน๐Ÿฟ\u200dโ™€๏ธ", + "woman_juggling_light_skin_tone": "๐Ÿคน๐Ÿป\u200dโ™€๏ธ", + "woman_juggling_medium-dark_skin_tone": "๐Ÿคน๐Ÿพ\u200dโ™€๏ธ", + "woman_juggling_medium-light_skin_tone": "๐Ÿคน๐Ÿผ\u200dโ™€๏ธ", + "woman_juggling_medium_skin_tone": "๐Ÿคน๐Ÿฝ\u200dโ™€๏ธ", + "woman_lifting_weights": "๐Ÿ‹๏ธ\u200dโ™€๏ธ", + "woman_lifting_weights_dark_skin_tone": "๐Ÿ‹๐Ÿฟ\u200dโ™€๏ธ", + "woman_lifting_weights_light_skin_tone": "๐Ÿ‹๐Ÿป\u200dโ™€๏ธ", + "woman_lifting_weights_medium-dark_skin_tone": "๐Ÿ‹๐Ÿพ\u200dโ™€๏ธ", + "woman_lifting_weights_medium-light_skin_tone": "๐Ÿ‹๐Ÿผ\u200dโ™€๏ธ", + "woman_lifting_weights_medium_skin_tone": "๐Ÿ‹๐Ÿฝ\u200dโ™€๏ธ", + "woman_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป", + "woman_mage": "๐Ÿง™\u200dโ™€๏ธ", + "woman_mage_dark_skin_tone": "๐Ÿง™๐Ÿฟ\u200dโ™€๏ธ", + "woman_mage_light_skin_tone": "๐Ÿง™๐Ÿป\u200dโ™€๏ธ", + "woman_mage_medium-dark_skin_tone": "๐Ÿง™๐Ÿพ\u200dโ™€๏ธ", + "woman_mage_medium-light_skin_tone": "๐Ÿง™๐Ÿผ\u200dโ™€๏ธ", + "woman_mage_medium_skin_tone": "๐Ÿง™๐Ÿฝ\u200dโ™€๏ธ", + "woman_mechanic": "๐Ÿ‘ฉ\u200d๐Ÿ”ง", + "woman_mechanic_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿ”ง", + "woman_mechanic_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿ”ง", + "woman_mechanic_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿ”ง", + "woman_mechanic_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿ”ง", + "woman_mechanic_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿ”ง", + "woman_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ", + "woman_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ", + "woman_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ", + "woman_mountain_biking": "๐Ÿšต\u200dโ™€๏ธ", + "woman_mountain_biking_dark_skin_tone": "๐Ÿšต๐Ÿฟ\u200dโ™€๏ธ", + "woman_mountain_biking_light_skin_tone": "๐Ÿšต๐Ÿป\u200dโ™€๏ธ", + "woman_mountain_biking_medium-dark_skin_tone": "๐Ÿšต๐Ÿพ\u200dโ™€๏ธ", + "woman_mountain_biking_medium-light_skin_tone": "๐Ÿšต๐Ÿผ\u200dโ™€๏ธ", + "woman_mountain_biking_medium_skin_tone": "๐Ÿšต๐Ÿฝ\u200dโ™€๏ธ", + "woman_office_worker": "๐Ÿ‘ฉ\u200d๐Ÿ’ผ", + "woman_office_worker_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿ’ผ", + "woman_office_worker_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿ’ผ", + "woman_office_worker_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿ’ผ", + "woman_office_worker_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿ’ผ", + "woman_office_worker_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿ’ผ", + "woman_pilot": "๐Ÿ‘ฉ\u200dโœˆ๏ธ", + "woman_pilot_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200dโœˆ๏ธ", + "woman_pilot_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200dโœˆ๏ธ", + "woman_pilot_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200dโœˆ๏ธ", + "woman_pilot_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200dโœˆ๏ธ", + "woman_pilot_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200dโœˆ๏ธ", + "woman_playing_handball": "๐Ÿคพ\u200dโ™€๏ธ", + "woman_playing_handball_dark_skin_tone": "๐Ÿคพ๐Ÿฟ\u200dโ™€๏ธ", + "woman_playing_handball_light_skin_tone": "๐Ÿคพ๐Ÿป\u200dโ™€๏ธ", + "woman_playing_handball_medium-dark_skin_tone": "๐Ÿคพ๐Ÿพ\u200dโ™€๏ธ", + "woman_playing_handball_medium-light_skin_tone": "๐Ÿคพ๐Ÿผ\u200dโ™€๏ธ", + "woman_playing_handball_medium_skin_tone": "๐Ÿคพ๐Ÿฝ\u200dโ™€๏ธ", + "woman_playing_water_polo": "๐Ÿคฝ\u200dโ™€๏ธ", + "woman_playing_water_polo_dark_skin_tone": "๐Ÿคฝ๐Ÿฟ\u200dโ™€๏ธ", + "woman_playing_water_polo_light_skin_tone": "๐Ÿคฝ๐Ÿป\u200dโ™€๏ธ", + "woman_playing_water_polo_medium-dark_skin_tone": "๐Ÿคฝ๐Ÿพ\u200dโ™€๏ธ", + "woman_playing_water_polo_medium-light_skin_tone": "๐Ÿคฝ๐Ÿผ\u200dโ™€๏ธ", + "woman_playing_water_polo_medium_skin_tone": "๐Ÿคฝ๐Ÿฝ\u200dโ™€๏ธ", + "woman_police_officer": "๐Ÿ‘ฎ\u200dโ™€๏ธ", + "woman_police_officer_dark_skin_tone": "๐Ÿ‘ฎ๐Ÿฟ\u200dโ™€๏ธ", + "woman_police_officer_light_skin_tone": "๐Ÿ‘ฎ๐Ÿป\u200dโ™€๏ธ", + "woman_police_officer_medium-dark_skin_tone": "๐Ÿ‘ฎ๐Ÿพ\u200dโ™€๏ธ", + "woman_police_officer_medium-light_skin_tone": "๐Ÿ‘ฎ๐Ÿผ\u200dโ™€๏ธ", + "woman_police_officer_medium_skin_tone": "๐Ÿ‘ฎ๐Ÿฝ\u200dโ™€๏ธ", + "woman_pouting": "๐Ÿ™Ž\u200dโ™€๏ธ", + "woman_pouting_dark_skin_tone": "๐Ÿ™Ž๐Ÿฟ\u200dโ™€๏ธ", + "woman_pouting_light_skin_tone": "๐Ÿ™Ž๐Ÿป\u200dโ™€๏ธ", + "woman_pouting_medium-dark_skin_tone": "๐Ÿ™Ž๐Ÿพ\u200dโ™€๏ธ", + "woman_pouting_medium-light_skin_tone": "๐Ÿ™Ž๐Ÿผ\u200dโ™€๏ธ", + "woman_pouting_medium_skin_tone": "๐Ÿ™Ž๐Ÿฝ\u200dโ™€๏ธ", + "woman_raising_hand": "๐Ÿ™‹\u200dโ™€๏ธ", + "woman_raising_hand_dark_skin_tone": "๐Ÿ™‹๐Ÿฟ\u200dโ™€๏ธ", + "woman_raising_hand_light_skin_tone": "๐Ÿ™‹๐Ÿป\u200dโ™€๏ธ", + "woman_raising_hand_medium-dark_skin_tone": "๐Ÿ™‹๐Ÿพ\u200dโ™€๏ธ", + "woman_raising_hand_medium-light_skin_tone": "๐Ÿ™‹๐Ÿผ\u200dโ™€๏ธ", + "woman_raising_hand_medium_skin_tone": "๐Ÿ™‹๐Ÿฝ\u200dโ™€๏ธ", + "woman_rowing_boat": "๐Ÿšฃ\u200dโ™€๏ธ", + "woman_rowing_boat_dark_skin_tone": "๐Ÿšฃ๐Ÿฟ\u200dโ™€๏ธ", + "woman_rowing_boat_light_skin_tone": "๐Ÿšฃ๐Ÿป\u200dโ™€๏ธ", + "woman_rowing_boat_medium-dark_skin_tone": "๐Ÿšฃ๐Ÿพ\u200dโ™€๏ธ", + "woman_rowing_boat_medium-light_skin_tone": "๐Ÿšฃ๐Ÿผ\u200dโ™€๏ธ", + "woman_rowing_boat_medium_skin_tone": "๐Ÿšฃ๐Ÿฝ\u200dโ™€๏ธ", + "woman_running": "๐Ÿƒ\u200dโ™€๏ธ", + "woman_running_dark_skin_tone": "๐Ÿƒ๐Ÿฟ\u200dโ™€๏ธ", + "woman_running_light_skin_tone": "๐Ÿƒ๐Ÿป\u200dโ™€๏ธ", + "woman_running_medium-dark_skin_tone": "๐Ÿƒ๐Ÿพ\u200dโ™€๏ธ", + "woman_running_medium-light_skin_tone": "๐Ÿƒ๐Ÿผ\u200dโ™€๏ธ", + "woman_running_medium_skin_tone": "๐Ÿƒ๐Ÿฝ\u200dโ™€๏ธ", + "woman_scientist": "๐Ÿ‘ฉ\u200d๐Ÿ”ฌ", + "woman_scientist_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿ”ฌ", + "woman_scientist_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿ”ฌ", + "woman_scientist_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿ”ฌ", + "woman_scientist_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿ”ฌ", + "woman_scientist_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿ”ฌ", + "woman_shrugging": "๐Ÿคท\u200dโ™€๏ธ", + "woman_shrugging_dark_skin_tone": "๐Ÿคท๐Ÿฟ\u200dโ™€๏ธ", + "woman_shrugging_light_skin_tone": "๐Ÿคท๐Ÿป\u200dโ™€๏ธ", + "woman_shrugging_medium-dark_skin_tone": "๐Ÿคท๐Ÿพ\u200dโ™€๏ธ", + "woman_shrugging_medium-light_skin_tone": "๐Ÿคท๐Ÿผ\u200dโ™€๏ธ", + "woman_shrugging_medium_skin_tone": "๐Ÿคท๐Ÿฝ\u200dโ™€๏ธ", + "woman_singer": "๐Ÿ‘ฉ\u200d๐ŸŽค", + "woman_singer_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐ŸŽค", + "woman_singer_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐ŸŽค", + "woman_singer_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐ŸŽค", + "woman_singer_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐ŸŽค", + "woman_singer_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐ŸŽค", + "woman_student": "๐Ÿ‘ฉ\u200d๐ŸŽ“", + "woman_student_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐ŸŽ“", + "woman_student_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐ŸŽ“", + "woman_student_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐ŸŽ“", + "woman_student_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐ŸŽ“", + "woman_student_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐ŸŽ“", + "woman_surfing": "๐Ÿ„\u200dโ™€๏ธ", + "woman_surfing_dark_skin_tone": "๐Ÿ„๐Ÿฟ\u200dโ™€๏ธ", + "woman_surfing_light_skin_tone": "๐Ÿ„๐Ÿป\u200dโ™€๏ธ", + "woman_surfing_medium-dark_skin_tone": "๐Ÿ„๐Ÿพ\u200dโ™€๏ธ", + "woman_surfing_medium-light_skin_tone": "๐Ÿ„๐Ÿผ\u200dโ™€๏ธ", + "woman_surfing_medium_skin_tone": "๐Ÿ„๐Ÿฝ\u200dโ™€๏ธ", + "woman_swimming": "๐ŸŠ\u200dโ™€๏ธ", + "woman_swimming_dark_skin_tone": "๐ŸŠ๐Ÿฟ\u200dโ™€๏ธ", + "woman_swimming_light_skin_tone": "๐ŸŠ๐Ÿป\u200dโ™€๏ธ", + "woman_swimming_medium-dark_skin_tone": "๐ŸŠ๐Ÿพ\u200dโ™€๏ธ", + "woman_swimming_medium-light_skin_tone": "๐ŸŠ๐Ÿผ\u200dโ™€๏ธ", + "woman_swimming_medium_skin_tone": "๐ŸŠ๐Ÿฝ\u200dโ™€๏ธ", + "woman_teacher": "๐Ÿ‘ฉ\u200d๐Ÿซ", + "woman_teacher_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿซ", + "woman_teacher_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿซ", + "woman_teacher_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿซ", + "woman_teacher_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿซ", + "woman_teacher_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿซ", + "woman_technologist": "๐Ÿ‘ฉ\u200d๐Ÿ’ป", + "woman_technologist_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ\u200d๐Ÿ’ป", + "woman_technologist_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป\u200d๐Ÿ’ป", + "woman_technologist_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ\u200d๐Ÿ’ป", + "woman_technologist_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ\u200d๐Ÿ’ป", + "woman_technologist_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ\u200d๐Ÿ’ป", + "woman_tipping_hand": "๐Ÿ’\u200dโ™€๏ธ", + "woman_tipping_hand_dark_skin_tone": "๐Ÿ’๐Ÿฟ\u200dโ™€๏ธ", + "woman_tipping_hand_light_skin_tone": "๐Ÿ’๐Ÿป\u200dโ™€๏ธ", + "woman_tipping_hand_medium-dark_skin_tone": "๐Ÿ’๐Ÿพ\u200dโ™€๏ธ", + "woman_tipping_hand_medium-light_skin_tone": "๐Ÿ’๐Ÿผ\u200dโ™€๏ธ", + "woman_tipping_hand_medium_skin_tone": "๐Ÿ’๐Ÿฝ\u200dโ™€๏ธ", + "woman_vampire": "๐Ÿง›\u200dโ™€๏ธ", + "woman_vampire_dark_skin_tone": "๐Ÿง›๐Ÿฟ\u200dโ™€๏ธ", + "woman_vampire_light_skin_tone": "๐Ÿง›๐Ÿป\u200dโ™€๏ธ", + "woman_vampire_medium-dark_skin_tone": "๐Ÿง›๐Ÿพ\u200dโ™€๏ธ", + "woman_vampire_medium-light_skin_tone": "๐Ÿง›๐Ÿผ\u200dโ™€๏ธ", + "woman_vampire_medium_skin_tone": "๐Ÿง›๐Ÿฝ\u200dโ™€๏ธ", + "woman_walking": "๐Ÿšถ\u200dโ™€๏ธ", + "woman_walking_dark_skin_tone": "๐Ÿšถ๐Ÿฟ\u200dโ™€๏ธ", + "woman_walking_light_skin_tone": "๐Ÿšถ๐Ÿป\u200dโ™€๏ธ", + "woman_walking_medium-dark_skin_tone": "๐Ÿšถ๐Ÿพ\u200dโ™€๏ธ", + "woman_walking_medium-light_skin_tone": "๐Ÿšถ๐Ÿผ\u200dโ™€๏ธ", + "woman_walking_medium_skin_tone": "๐Ÿšถ๐Ÿฝ\u200dโ™€๏ธ", + "woman_wearing_turban": "๐Ÿ‘ณ\u200dโ™€๏ธ", + "woman_wearing_turban_dark_skin_tone": "๐Ÿ‘ณ๐Ÿฟ\u200dโ™€๏ธ", + "woman_wearing_turban_light_skin_tone": "๐Ÿ‘ณ๐Ÿป\u200dโ™€๏ธ", + "woman_wearing_turban_medium-dark_skin_tone": "๐Ÿ‘ณ๐Ÿพ\u200dโ™€๏ธ", + "woman_wearing_turban_medium-light_skin_tone": "๐Ÿ‘ณ๐Ÿผ\u200dโ™€๏ธ", + "woman_wearing_turban_medium_skin_tone": "๐Ÿ‘ณ๐Ÿฝ\u200dโ™€๏ธ", + "woman_with_headscarf": "๐Ÿง•", + "woman_with_headscarf_dark_skin_tone": "๐Ÿง•๐Ÿฟ", + "woman_with_headscarf_light_skin_tone": "๐Ÿง•๐Ÿป", + "woman_with_headscarf_medium-dark_skin_tone": "๐Ÿง•๐Ÿพ", + "woman_with_headscarf_medium-light_skin_tone": "๐Ÿง•๐Ÿผ", + "woman_with_headscarf_medium_skin_tone": "๐Ÿง•๐Ÿฝ", + "woman_with_probing_cane": "๐Ÿ‘ฉ\u200d๐Ÿฆฏ", + "woman_zombie": "๐ŸงŸ\u200dโ™€๏ธ", + "womanโ€™s_boot": "๐Ÿ‘ข", + "womanโ€™s_clothes": "๐Ÿ‘š", + "womanโ€™s_hat": "๐Ÿ‘’", + "womanโ€™s_sandal": "๐Ÿ‘ก", + "women_with_bunny_ears": "๐Ÿ‘ฏ\u200dโ™€๏ธ", + "women_wrestling": "๐Ÿคผ\u200dโ™€๏ธ", + "womenโ€™s_room": "๐Ÿšบ", + "woozy_face": "๐Ÿฅด", + "world_map": "๐Ÿ—บ", + "worried_face": "๐Ÿ˜Ÿ", + "wrapped_gift": "๐ŸŽ", + "wrench": "๐Ÿ”ง", + "writing_hand": "โœ", + "writing_hand_dark_skin_tone": "โœ๐Ÿฟ", + "writing_hand_light_skin_tone": "โœ๐Ÿป", + "writing_hand_medium-dark_skin_tone": "โœ๐Ÿพ", + "writing_hand_medium-light_skin_tone": "โœ๐Ÿผ", + "writing_hand_medium_skin_tone": "โœ๐Ÿฝ", + "yarn": "๐Ÿงถ", + "yawning_face": "๐Ÿฅฑ", + "yellow_circle": "๐ŸŸก", + "yellow_heart": "๐Ÿ’›", + "yellow_square": "๐ŸŸจ", + "yen_banknote": "๐Ÿ’ด", + "yo-yo": "๐Ÿช€", + "yin_yang": "โ˜ฏ", + "zany_face": "๐Ÿคช", + "zebra": "๐Ÿฆ“", + "zipper-mouth_face": "๐Ÿค", + "zombie": "๐ŸงŸ", + "zzz": "๐Ÿ’ค", + "รฅland_islands": "๐Ÿ‡ฆ๐Ÿ‡ฝ", + "keycap_asterisk": "*โƒฃ", + "keycap_digit_eight": "8โƒฃ", + "keycap_digit_five": "5โƒฃ", + "keycap_digit_four": "4โƒฃ", + "keycap_digit_nine": "9โƒฃ", + "keycap_digit_one": "1โƒฃ", + "keycap_digit_seven": "7โƒฃ", + "keycap_digit_six": "6โƒฃ", + "keycap_digit_three": "3โƒฃ", + "keycap_digit_two": "2โƒฃ", + "keycap_digit_zero": "0โƒฃ", + "keycap_number_sign": "#โƒฃ", + "light_skin_tone": "๐Ÿป", + "medium_light_skin_tone": "๐Ÿผ", + "medium_skin_tone": "๐Ÿฝ", + "medium_dark_skin_tone": "๐Ÿพ", + "dark_skin_tone": "๐Ÿฟ", + "regional_indicator_symbol_letter_a": "๐Ÿ‡ฆ", + "regional_indicator_symbol_letter_b": "๐Ÿ‡ง", + "regional_indicator_symbol_letter_c": "๐Ÿ‡จ", + "regional_indicator_symbol_letter_d": "๐Ÿ‡ฉ", + "regional_indicator_symbol_letter_e": "๐Ÿ‡ช", + "regional_indicator_symbol_letter_f": "๐Ÿ‡ซ", + "regional_indicator_symbol_letter_g": "๐Ÿ‡ฌ", + "regional_indicator_symbol_letter_h": "๐Ÿ‡ญ", + "regional_indicator_symbol_letter_i": "๐Ÿ‡ฎ", + "regional_indicator_symbol_letter_j": "๐Ÿ‡ฏ", + "regional_indicator_symbol_letter_k": "๐Ÿ‡ฐ", + "regional_indicator_symbol_letter_l": "๐Ÿ‡ฑ", + "regional_indicator_symbol_letter_m": "๐Ÿ‡ฒ", + "regional_indicator_symbol_letter_n": "๐Ÿ‡ณ", + "regional_indicator_symbol_letter_o": "๐Ÿ‡ด", + "regional_indicator_symbol_letter_p": "๐Ÿ‡ต", + "regional_indicator_symbol_letter_q": "๐Ÿ‡ถ", + "regional_indicator_symbol_letter_r": "๐Ÿ‡ท", + "regional_indicator_symbol_letter_s": "๐Ÿ‡ธ", + "regional_indicator_symbol_letter_t": "๐Ÿ‡น", + "regional_indicator_symbol_letter_u": "๐Ÿ‡บ", + "regional_indicator_symbol_letter_v": "๐Ÿ‡ป", + "regional_indicator_symbol_letter_w": "๐Ÿ‡ผ", + "regional_indicator_symbol_letter_x": "๐Ÿ‡ฝ", + "regional_indicator_symbol_letter_y": "๐Ÿ‡พ", + "regional_indicator_symbol_letter_z": "๐Ÿ‡ฟ", + "airplane_arriving": "๐Ÿ›ฌ", + "space_invader": "๐Ÿ‘พ", + "football": "๐Ÿˆ", + "anger": "๐Ÿ’ข", + "angry": "๐Ÿ˜ ", + "anguished": "๐Ÿ˜ง", + "signal_strength": "๐Ÿ“ถ", + "arrows_counterclockwise": "๐Ÿ”„", + "arrow_heading_down": "โคต", + "arrow_heading_up": "โคด", + "art": "๐ŸŽจ", + "astonished": "๐Ÿ˜ฒ", + "athletic_shoe": "๐Ÿ‘Ÿ", + "atm": "๐Ÿง", + "car": "๐Ÿš—", + "red_car": "๐Ÿš—", + "angel": "๐Ÿ‘ผ", + "back": "๐Ÿ”™", + "badminton_racquet_and_shuttlecock": "๐Ÿธ", + "dollar": "๐Ÿ’ต", + "euro": "๐Ÿ’ถ", + "pound": "๐Ÿ’ท", + "yen": "๐Ÿ’ด", + "barber": "๐Ÿ’ˆ", + "bath": "๐Ÿ›€", + "bear": "๐Ÿป", + "heartbeat": "๐Ÿ’“", + "beer": "๐Ÿบ", + "no_bell": "๐Ÿ”•", + "bento": "๐Ÿฑ", + "bike": "๐Ÿšฒ", + "bicyclist": "๐Ÿšด", + "8ball": "๐ŸŽฑ", + "biohazard_sign": "โ˜ฃ", + "birthday": "๐ŸŽ‚", + "black_circle_for_record": "โบ", + "clubs": "โ™ฃ", + "diamonds": "โ™ฆ", + "arrow_double_down": "โฌ", + "hearts": "โ™ฅ", + "rewind": "โช", + "black_left__pointing_double_triangle_with_vertical_bar": "โฎ", + "arrow_backward": "โ—€", + "black_medium_small_square": "โ—พ", + "question": "โ“", + "fast_forward": "โฉ", + "black_right__pointing_double_triangle_with_vertical_bar": "โญ", + "arrow_forward": "โ–ถ", + "black_right__pointing_triangle_with_double_vertical_bar": "โฏ", + "arrow_right": "โžก", + "spades": "โ™ ", + "black_square_for_stop": "โน", + "sunny": "โ˜€", + "phone": "โ˜Ž", + "recycle": "โ™ป", + "arrow_double_up": "โซ", + "busstop": "๐Ÿš", + "date": "๐Ÿ“…", + "flags": "๐ŸŽ", + "cat2": "๐Ÿˆ", + "joy_cat": "๐Ÿ˜น", + "smirk_cat": "๐Ÿ˜ผ", + "chart_with_downwards_trend": "๐Ÿ“‰", + "chart_with_upwards_trend": "๐Ÿ“ˆ", + "chart": "๐Ÿ’น", + "mega": "๐Ÿ“ฃ", + "checkered_flag": "๐Ÿ", + "accept": "๐Ÿ‰‘", + "ideograph_advantage": "๐Ÿ‰", + "congratulations": "ใŠ—", + "secret": "ใŠ™", + "m": "โ“‚", + "city_sunset": "๐ŸŒ†", + "clapper": "๐ŸŽฌ", + "clap": "๐Ÿ‘", + "beers": "๐Ÿป", + "clock830": "๐Ÿ•ฃ", + "clock8": "๐Ÿ•—", + "clock1130": "๐Ÿ•ฆ", + "clock11": "๐Ÿ•š", + "clock530": "๐Ÿ• ", + "clock5": "๐Ÿ•”", + "clock430": "๐Ÿ•Ÿ", + "clock4": "๐Ÿ•“", + "clock930": "๐Ÿ•ค", + "clock9": "๐Ÿ•˜", + "clock130": "๐Ÿ•œ", + "clock1": "๐Ÿ•", + "clock730": "๐Ÿ•ข", + "clock7": "๐Ÿ•–", + "clock630": "๐Ÿ•ก", + "clock6": "๐Ÿ••", + "clock1030": "๐Ÿ•ฅ", + "clock10": "๐Ÿ•™", + "clock330": "๐Ÿ•ž", + "clock3": "๐Ÿ•’", + "clock1230": "๐Ÿ•ง", + "clock12": "๐Ÿ•›", + "clock230": "๐Ÿ•", + "clock2": "๐Ÿ•‘", + "arrows_clockwise": "๐Ÿ”ƒ", + "repeat": "๐Ÿ”", + "repeat_one": "๐Ÿ”‚", + "closed_lock_with_key": "๐Ÿ”", + "mailbox_closed": "๐Ÿ“ช", + "mailbox": "๐Ÿ“ซ", + "cloud_with_tornado": "๐ŸŒช", + "cocktail": "๐Ÿธ", + "boom": "๐Ÿ’ฅ", + "compression": "๐Ÿ—œ", + "confounded": "๐Ÿ˜–", + "confused": "๐Ÿ˜•", + "rice": "๐Ÿš", + "cow2": "๐Ÿ„", + "cricket_bat_and_ball": "๐Ÿ", + "x": "โŒ", + "cry": "๐Ÿ˜ข", + "curry": "๐Ÿ›", + "dagger_knife": "๐Ÿ—ก", + "dancer": "๐Ÿ’ƒ", + "dark_sunglasses": "๐Ÿ•ถ", + "dash": "๐Ÿ’จ", + "truck": "๐Ÿšš", + "derelict_house_building": "๐Ÿš", + "diamond_shape_with_a_dot_inside": "๐Ÿ’ ", + "dart": "๐ŸŽฏ", + "disappointed_relieved": "๐Ÿ˜ฅ", + "disappointed": "๐Ÿ˜ž", + "do_not_litter": "๐Ÿšฏ", + "dog2": "๐Ÿ•", + "flipper": "๐Ÿฌ", + "loop": "โžฟ", + "bangbang": "โ€ผ", + "double_vertical_bar": "โธ", + "dove_of_peace": "๐Ÿ•Š", + "small_red_triangle_down": "๐Ÿ”ป", + "arrow_down_small": "๐Ÿ”ฝ", + "arrow_down": "โฌ‡", + "dromedary_camel": "๐Ÿช", + "e__mail": "๐Ÿ“ง", + "corn": "๐ŸŒฝ", + "ear_of_rice": "๐ŸŒพ", + "earth_americas": "๐ŸŒŽ", + "earth_asia": "๐ŸŒ", + "earth_africa": "๐ŸŒ", + "eight_pointed_black_star": "โœด", + "eight_spoked_asterisk": "โœณ", + "eject_symbol": "โ", + "bulb": "๐Ÿ’ก", + "emoji_modifier_fitzpatrick_type__1__2": "๐Ÿป", + "emoji_modifier_fitzpatrick_type__3": "๐Ÿผ", + "emoji_modifier_fitzpatrick_type__4": "๐Ÿฝ", + "emoji_modifier_fitzpatrick_type__5": "๐Ÿพ", + "emoji_modifier_fitzpatrick_type__6": "๐Ÿฟ", + "end": "๐Ÿ”š", + "email": "โœ‰", + "european_castle": "๐Ÿฐ", + "european_post_office": "๐Ÿค", + "interrobang": "โ‰", + "expressionless": "๐Ÿ˜‘", + "eyeglasses": "๐Ÿ‘“", + "massage": "๐Ÿ’†", + "yum": "๐Ÿ˜‹", + "scream": "๐Ÿ˜ฑ", + "kissing_heart": "๐Ÿ˜˜", + "sweat": "๐Ÿ˜“", + "face_with_head__bandage": "๐Ÿค•", + "triumph": "๐Ÿ˜ค", + "mask": "๐Ÿ˜ท", + "no_good": "๐Ÿ™…", + "ok_woman": "๐Ÿ™†", + "open_mouth": "๐Ÿ˜ฎ", + "cold_sweat": "๐Ÿ˜ฐ", + "stuck_out_tongue": "๐Ÿ˜›", + "stuck_out_tongue_closed_eyes": "๐Ÿ˜", + "stuck_out_tongue_winking_eye": "๐Ÿ˜œ", + "joy": "๐Ÿ˜‚", + "no_mouth": "๐Ÿ˜ถ", + "santa": "๐ŸŽ…", + "fax": "๐Ÿ“ ", + "fearful": "๐Ÿ˜จ", + "field_hockey_stick_and_ball": "๐Ÿ‘", + "first_quarter_moon_with_face": "๐ŸŒ›", + "fish_cake": "๐Ÿฅ", + "fishing_pole_and_fish": "๐ŸŽฃ", + "facepunch": "๐Ÿ‘Š", + "punch": "๐Ÿ‘Š", + "flag_for_afghanistan": "๐Ÿ‡ฆ๐Ÿ‡ซ", + "flag_for_albania": "๐Ÿ‡ฆ๐Ÿ‡ฑ", + "flag_for_algeria": "๐Ÿ‡ฉ๐Ÿ‡ฟ", + "flag_for_american_samoa": "๐Ÿ‡ฆ๐Ÿ‡ธ", + "flag_for_andorra": "๐Ÿ‡ฆ๐Ÿ‡ฉ", + "flag_for_angola": "๐Ÿ‡ฆ๐Ÿ‡ด", + "flag_for_anguilla": "๐Ÿ‡ฆ๐Ÿ‡ฎ", + "flag_for_antarctica": "๐Ÿ‡ฆ๐Ÿ‡ถ", + "flag_for_antigua_&_barbuda": "๐Ÿ‡ฆ๐Ÿ‡ฌ", + "flag_for_argentina": "๐Ÿ‡ฆ๐Ÿ‡ท", + "flag_for_armenia": "๐Ÿ‡ฆ๐Ÿ‡ฒ", + "flag_for_aruba": "๐Ÿ‡ฆ๐Ÿ‡ผ", + "flag_for_ascension_island": "๐Ÿ‡ฆ๐Ÿ‡จ", + "flag_for_australia": "๐Ÿ‡ฆ๐Ÿ‡บ", + "flag_for_austria": "๐Ÿ‡ฆ๐Ÿ‡น", + "flag_for_azerbaijan": "๐Ÿ‡ฆ๐Ÿ‡ฟ", + "flag_for_bahamas": "๐Ÿ‡ง๐Ÿ‡ธ", + "flag_for_bahrain": "๐Ÿ‡ง๐Ÿ‡ญ", + "flag_for_bangladesh": "๐Ÿ‡ง๐Ÿ‡ฉ", + "flag_for_barbados": "๐Ÿ‡ง๐Ÿ‡ง", + "flag_for_belarus": "๐Ÿ‡ง๐Ÿ‡พ", + "flag_for_belgium": "๐Ÿ‡ง๐Ÿ‡ช", + "flag_for_belize": "๐Ÿ‡ง๐Ÿ‡ฟ", + "flag_for_benin": "๐Ÿ‡ง๐Ÿ‡ฏ", + "flag_for_bermuda": "๐Ÿ‡ง๐Ÿ‡ฒ", + "flag_for_bhutan": "๐Ÿ‡ง๐Ÿ‡น", + "flag_for_bolivia": "๐Ÿ‡ง๐Ÿ‡ด", + "flag_for_bosnia_&_herzegovina": "๐Ÿ‡ง๐Ÿ‡ฆ", + "flag_for_botswana": "๐Ÿ‡ง๐Ÿ‡ผ", + "flag_for_bouvet_island": "๐Ÿ‡ง๐Ÿ‡ป", + "flag_for_brazil": "๐Ÿ‡ง๐Ÿ‡ท", + "flag_for_british_indian_ocean_territory": "๐Ÿ‡ฎ๐Ÿ‡ด", + "flag_for_british_virgin_islands": "๐Ÿ‡ป๐Ÿ‡ฌ", + "flag_for_brunei": "๐Ÿ‡ง๐Ÿ‡ณ", + "flag_for_bulgaria": "๐Ÿ‡ง๐Ÿ‡ฌ", + "flag_for_burkina_faso": "๐Ÿ‡ง๐Ÿ‡ซ", + "flag_for_burundi": "๐Ÿ‡ง๐Ÿ‡ฎ", + "flag_for_cambodia": "๐Ÿ‡ฐ๐Ÿ‡ญ", + "flag_for_cameroon": "๐Ÿ‡จ๐Ÿ‡ฒ", + "flag_for_canada": "๐Ÿ‡จ๐Ÿ‡ฆ", + "flag_for_canary_islands": "๐Ÿ‡ฎ๐Ÿ‡จ", + "flag_for_cape_verde": "๐Ÿ‡จ๐Ÿ‡ป", + "flag_for_caribbean_netherlands": "๐Ÿ‡ง๐Ÿ‡ถ", + "flag_for_cayman_islands": "๐Ÿ‡ฐ๐Ÿ‡พ", + "flag_for_central_african_republic": "๐Ÿ‡จ๐Ÿ‡ซ", + "flag_for_ceuta_&_melilla": "๐Ÿ‡ช๐Ÿ‡ฆ", + "flag_for_chad": "๐Ÿ‡น๐Ÿ‡ฉ", + "flag_for_chile": "๐Ÿ‡จ๐Ÿ‡ฑ", + "flag_for_china": "๐Ÿ‡จ๐Ÿ‡ณ", + "flag_for_christmas_island": "๐Ÿ‡จ๐Ÿ‡ฝ", + "flag_for_clipperton_island": "๐Ÿ‡จ๐Ÿ‡ต", + "flag_for_cocos__islands": "๐Ÿ‡จ๐Ÿ‡จ", + "flag_for_colombia": "๐Ÿ‡จ๐Ÿ‡ด", + "flag_for_comoros": "๐Ÿ‡ฐ๐Ÿ‡ฒ", + "flag_for_congo____brazzaville": "๐Ÿ‡จ๐Ÿ‡ฌ", + "flag_for_congo____kinshasa": "๐Ÿ‡จ๐Ÿ‡ฉ", + "flag_for_cook_islands": "๐Ÿ‡จ๐Ÿ‡ฐ", + "flag_for_costa_rica": "๐Ÿ‡จ๐Ÿ‡ท", + "flag_for_croatia": "๐Ÿ‡ญ๐Ÿ‡ท", + "flag_for_cuba": "๐Ÿ‡จ๐Ÿ‡บ", + "flag_for_curaรงao": "๐Ÿ‡จ๐Ÿ‡ผ", + "flag_for_cyprus": "๐Ÿ‡จ๐Ÿ‡พ", + "flag_for_czech_republic": "๐Ÿ‡จ๐Ÿ‡ฟ", + "flag_for_cรดte_dโ€™ivoire": "๐Ÿ‡จ๐Ÿ‡ฎ", + "flag_for_denmark": "๐Ÿ‡ฉ๐Ÿ‡ฐ", + "flag_for_diego_garcia": "๐Ÿ‡ฉ๐Ÿ‡ฌ", + "flag_for_djibouti": "๐Ÿ‡ฉ๐Ÿ‡ฏ", + "flag_for_dominica": "๐Ÿ‡ฉ๐Ÿ‡ฒ", + "flag_for_dominican_republic": "๐Ÿ‡ฉ๐Ÿ‡ด", + "flag_for_ecuador": "๐Ÿ‡ช๐Ÿ‡จ", + "flag_for_egypt": "๐Ÿ‡ช๐Ÿ‡ฌ", + "flag_for_el_salvador": "๐Ÿ‡ธ๐Ÿ‡ป", + "flag_for_equatorial_guinea": "๐Ÿ‡ฌ๐Ÿ‡ถ", + "flag_for_eritrea": "๐Ÿ‡ช๐Ÿ‡ท", + "flag_for_estonia": "๐Ÿ‡ช๐Ÿ‡ช", + "flag_for_ethiopia": "๐Ÿ‡ช๐Ÿ‡น", + "flag_for_european_union": "๐Ÿ‡ช๐Ÿ‡บ", + "flag_for_falkland_islands": "๐Ÿ‡ซ๐Ÿ‡ฐ", + "flag_for_faroe_islands": "๐Ÿ‡ซ๐Ÿ‡ด", + "flag_for_fiji": "๐Ÿ‡ซ๐Ÿ‡ฏ", + "flag_for_finland": "๐Ÿ‡ซ๐Ÿ‡ฎ", + "flag_for_france": "๐Ÿ‡ซ๐Ÿ‡ท", + "flag_for_french_guiana": "๐Ÿ‡ฌ๐Ÿ‡ซ", + "flag_for_french_polynesia": "๐Ÿ‡ต๐Ÿ‡ซ", + "flag_for_french_southern_territories": "๐Ÿ‡น๐Ÿ‡ซ", + "flag_for_gabon": "๐Ÿ‡ฌ๐Ÿ‡ฆ", + "flag_for_gambia": "๐Ÿ‡ฌ๐Ÿ‡ฒ", + "flag_for_georgia": "๐Ÿ‡ฌ๐Ÿ‡ช", + "flag_for_germany": "๐Ÿ‡ฉ๐Ÿ‡ช", + "flag_for_ghana": "๐Ÿ‡ฌ๐Ÿ‡ญ", + "flag_for_gibraltar": "๐Ÿ‡ฌ๐Ÿ‡ฎ", + "flag_for_greece": "๐Ÿ‡ฌ๐Ÿ‡ท", + "flag_for_greenland": "๐Ÿ‡ฌ๐Ÿ‡ฑ", + "flag_for_grenada": "๐Ÿ‡ฌ๐Ÿ‡ฉ", + "flag_for_guadeloupe": "๐Ÿ‡ฌ๐Ÿ‡ต", + "flag_for_guam": "๐Ÿ‡ฌ๐Ÿ‡บ", + "flag_for_guatemala": "๐Ÿ‡ฌ๐Ÿ‡น", + "flag_for_guernsey": "๐Ÿ‡ฌ๐Ÿ‡ฌ", + "flag_for_guinea": "๐Ÿ‡ฌ๐Ÿ‡ณ", + "flag_for_guinea__bissau": "๐Ÿ‡ฌ๐Ÿ‡ผ", + "flag_for_guyana": "๐Ÿ‡ฌ๐Ÿ‡พ", + "flag_for_haiti": "๐Ÿ‡ญ๐Ÿ‡น", + "flag_for_heard_&_mcdonald_islands": "๐Ÿ‡ญ๐Ÿ‡ฒ", + "flag_for_honduras": "๐Ÿ‡ญ๐Ÿ‡ณ", + "flag_for_hong_kong": "๐Ÿ‡ญ๐Ÿ‡ฐ", + "flag_for_hungary": "๐Ÿ‡ญ๐Ÿ‡บ", + "flag_for_iceland": "๐Ÿ‡ฎ๐Ÿ‡ธ", + "flag_for_india": "๐Ÿ‡ฎ๐Ÿ‡ณ", + "flag_for_indonesia": "๐Ÿ‡ฎ๐Ÿ‡ฉ", + "flag_for_iran": "๐Ÿ‡ฎ๐Ÿ‡ท", + "flag_for_iraq": "๐Ÿ‡ฎ๐Ÿ‡ถ", + "flag_for_ireland": "๐Ÿ‡ฎ๐Ÿ‡ช", + "flag_for_isle_of_man": "๐Ÿ‡ฎ๐Ÿ‡ฒ", + "flag_for_israel": "๐Ÿ‡ฎ๐Ÿ‡ฑ", + "flag_for_italy": "๐Ÿ‡ฎ๐Ÿ‡น", + "flag_for_jamaica": "๐Ÿ‡ฏ๐Ÿ‡ฒ", + "flag_for_japan": "๐Ÿ‡ฏ๐Ÿ‡ต", + "flag_for_jersey": "๐Ÿ‡ฏ๐Ÿ‡ช", + "flag_for_jordan": "๐Ÿ‡ฏ๐Ÿ‡ด", + "flag_for_kazakhstan": "๐Ÿ‡ฐ๐Ÿ‡ฟ", + "flag_for_kenya": "๐Ÿ‡ฐ๐Ÿ‡ช", + "flag_for_kiribati": "๐Ÿ‡ฐ๐Ÿ‡ฎ", + "flag_for_kosovo": "๐Ÿ‡ฝ๐Ÿ‡ฐ", + "flag_for_kuwait": "๐Ÿ‡ฐ๐Ÿ‡ผ", + "flag_for_kyrgyzstan": "๐Ÿ‡ฐ๐Ÿ‡ฌ", + "flag_for_laos": "๐Ÿ‡ฑ๐Ÿ‡ฆ", + "flag_for_latvia": "๐Ÿ‡ฑ๐Ÿ‡ป", + "flag_for_lebanon": "๐Ÿ‡ฑ๐Ÿ‡ง", + "flag_for_lesotho": "๐Ÿ‡ฑ๐Ÿ‡ธ", + "flag_for_liberia": "๐Ÿ‡ฑ๐Ÿ‡ท", + "flag_for_libya": "๐Ÿ‡ฑ๐Ÿ‡พ", + "flag_for_liechtenstein": "๐Ÿ‡ฑ๐Ÿ‡ฎ", + "flag_for_lithuania": "๐Ÿ‡ฑ๐Ÿ‡น", + "flag_for_luxembourg": "๐Ÿ‡ฑ๐Ÿ‡บ", + "flag_for_macau": "๐Ÿ‡ฒ๐Ÿ‡ด", + "flag_for_macedonia": "๐Ÿ‡ฒ๐Ÿ‡ฐ", + "flag_for_madagascar": "๐Ÿ‡ฒ๐Ÿ‡ฌ", + "flag_for_malawi": "๐Ÿ‡ฒ๐Ÿ‡ผ", + "flag_for_malaysia": "๐Ÿ‡ฒ๐Ÿ‡พ", + "flag_for_maldives": "๐Ÿ‡ฒ๐Ÿ‡ป", + "flag_for_mali": "๐Ÿ‡ฒ๐Ÿ‡ฑ", + "flag_for_malta": "๐Ÿ‡ฒ๐Ÿ‡น", + "flag_for_marshall_islands": "๐Ÿ‡ฒ๐Ÿ‡ญ", + "flag_for_martinique": "๐Ÿ‡ฒ๐Ÿ‡ถ", + "flag_for_mauritania": "๐Ÿ‡ฒ๐Ÿ‡ท", + "flag_for_mauritius": "๐Ÿ‡ฒ๐Ÿ‡บ", + "flag_for_mayotte": "๐Ÿ‡พ๐Ÿ‡น", + "flag_for_mexico": "๐Ÿ‡ฒ๐Ÿ‡ฝ", + "flag_for_micronesia": "๐Ÿ‡ซ๐Ÿ‡ฒ", + "flag_for_moldova": "๐Ÿ‡ฒ๐Ÿ‡ฉ", + "flag_for_monaco": "๐Ÿ‡ฒ๐Ÿ‡จ", + "flag_for_mongolia": "๐Ÿ‡ฒ๐Ÿ‡ณ", + "flag_for_montenegro": "๐Ÿ‡ฒ๐Ÿ‡ช", + "flag_for_montserrat": "๐Ÿ‡ฒ๐Ÿ‡ธ", + "flag_for_morocco": "๐Ÿ‡ฒ๐Ÿ‡ฆ", + "flag_for_mozambique": "๐Ÿ‡ฒ๐Ÿ‡ฟ", + "flag_for_myanmar": "๐Ÿ‡ฒ๐Ÿ‡ฒ", + "flag_for_namibia": "๐Ÿ‡ณ๐Ÿ‡ฆ", + "flag_for_nauru": "๐Ÿ‡ณ๐Ÿ‡ท", + "flag_for_nepal": "๐Ÿ‡ณ๐Ÿ‡ต", + "flag_for_netherlands": "๐Ÿ‡ณ๐Ÿ‡ฑ", + "flag_for_new_caledonia": "๐Ÿ‡ณ๐Ÿ‡จ", + "flag_for_new_zealand": "๐Ÿ‡ณ๐Ÿ‡ฟ", + "flag_for_nicaragua": "๐Ÿ‡ณ๐Ÿ‡ฎ", + "flag_for_niger": "๐Ÿ‡ณ๐Ÿ‡ช", + "flag_for_nigeria": "๐Ÿ‡ณ๐Ÿ‡ฌ", + "flag_for_niue": "๐Ÿ‡ณ๐Ÿ‡บ", + "flag_for_norfolk_island": "๐Ÿ‡ณ๐Ÿ‡ซ", + "flag_for_north_korea": "๐Ÿ‡ฐ๐Ÿ‡ต", + "flag_for_northern_mariana_islands": "๐Ÿ‡ฒ๐Ÿ‡ต", + "flag_for_norway": "๐Ÿ‡ณ๐Ÿ‡ด", + "flag_for_oman": "๐Ÿ‡ด๐Ÿ‡ฒ", + "flag_for_pakistan": "๐Ÿ‡ต๐Ÿ‡ฐ", + "flag_for_palau": "๐Ÿ‡ต๐Ÿ‡ผ", + "flag_for_palestinian_territories": "๐Ÿ‡ต๐Ÿ‡ธ", + "flag_for_panama": "๐Ÿ‡ต๐Ÿ‡ฆ", + "flag_for_papua_new_guinea": "๐Ÿ‡ต๐Ÿ‡ฌ", + "flag_for_paraguay": "๐Ÿ‡ต๐Ÿ‡พ", + "flag_for_peru": "๐Ÿ‡ต๐Ÿ‡ช", + "flag_for_philippines": "๐Ÿ‡ต๐Ÿ‡ญ", + "flag_for_pitcairn_islands": "๐Ÿ‡ต๐Ÿ‡ณ", + "flag_for_poland": "๐Ÿ‡ต๐Ÿ‡ฑ", + "flag_for_portugal": "๐Ÿ‡ต๐Ÿ‡น", + "flag_for_puerto_rico": "๐Ÿ‡ต๐Ÿ‡ท", + "flag_for_qatar": "๐Ÿ‡ถ๐Ÿ‡ฆ", + "flag_for_romania": "๐Ÿ‡ท๐Ÿ‡ด", + "flag_for_russia": "๐Ÿ‡ท๐Ÿ‡บ", + "flag_for_rwanda": "๐Ÿ‡ท๐Ÿ‡ผ", + "flag_for_rรฉunion": "๐Ÿ‡ท๐Ÿ‡ช", + "flag_for_samoa": "๐Ÿ‡ผ๐Ÿ‡ธ", + "flag_for_san_marino": "๐Ÿ‡ธ๐Ÿ‡ฒ", + "flag_for_saudi_arabia": "๐Ÿ‡ธ๐Ÿ‡ฆ", + "flag_for_senegal": "๐Ÿ‡ธ๐Ÿ‡ณ", + "flag_for_serbia": "๐Ÿ‡ท๐Ÿ‡ธ", + "flag_for_seychelles": "๐Ÿ‡ธ๐Ÿ‡จ", + "flag_for_sierra_leone": "๐Ÿ‡ธ๐Ÿ‡ฑ", + "flag_for_singapore": "๐Ÿ‡ธ๐Ÿ‡ฌ", + "flag_for_sint_maarten": "๐Ÿ‡ธ๐Ÿ‡ฝ", + "flag_for_slovakia": "๐Ÿ‡ธ๐Ÿ‡ฐ", + "flag_for_slovenia": "๐Ÿ‡ธ๐Ÿ‡ฎ", + "flag_for_solomon_islands": "๐Ÿ‡ธ๐Ÿ‡ง", + "flag_for_somalia": "๐Ÿ‡ธ๐Ÿ‡ด", + "flag_for_south_africa": "๐Ÿ‡ฟ๐Ÿ‡ฆ", + "flag_for_south_georgia_&_south_sandwich_islands": "๐Ÿ‡ฌ๐Ÿ‡ธ", + "flag_for_south_korea": "๐Ÿ‡ฐ๐Ÿ‡ท", + "flag_for_south_sudan": "๐Ÿ‡ธ๐Ÿ‡ธ", + "flag_for_spain": "๐Ÿ‡ช๐Ÿ‡ธ", + "flag_for_sri_lanka": "๐Ÿ‡ฑ๐Ÿ‡ฐ", + "flag_for_st._barthรฉlemy": "๐Ÿ‡ง๐Ÿ‡ฑ", + "flag_for_st._helena": "๐Ÿ‡ธ๐Ÿ‡ญ", + "flag_for_st._kitts_&_nevis": "๐Ÿ‡ฐ๐Ÿ‡ณ", + "flag_for_st._lucia": "๐Ÿ‡ฑ๐Ÿ‡จ", + "flag_for_st._martin": "๐Ÿ‡ฒ๐Ÿ‡ซ", + "flag_for_st._pierre_&_miquelon": "๐Ÿ‡ต๐Ÿ‡ฒ", + "flag_for_st._vincent_&_grenadines": "๐Ÿ‡ป๐Ÿ‡จ", + "flag_for_sudan": "๐Ÿ‡ธ๐Ÿ‡ฉ", + "flag_for_suriname": "๐Ÿ‡ธ๐Ÿ‡ท", + "flag_for_svalbard_&_jan_mayen": "๐Ÿ‡ธ๐Ÿ‡ฏ", + "flag_for_swaziland": "๐Ÿ‡ธ๐Ÿ‡ฟ", + "flag_for_sweden": "๐Ÿ‡ธ๐Ÿ‡ช", + "flag_for_switzerland": "๐Ÿ‡จ๐Ÿ‡ญ", + "flag_for_syria": "๐Ÿ‡ธ๐Ÿ‡พ", + "flag_for_sรฃo_tomรฉ_&_prรญncipe": "๐Ÿ‡ธ๐Ÿ‡น", + "flag_for_taiwan": "๐Ÿ‡น๐Ÿ‡ผ", + "flag_for_tajikistan": "๐Ÿ‡น๐Ÿ‡ฏ", + "flag_for_tanzania": "๐Ÿ‡น๐Ÿ‡ฟ", + "flag_for_thailand": "๐Ÿ‡น๐Ÿ‡ญ", + "flag_for_timor__leste": "๐Ÿ‡น๐Ÿ‡ฑ", + "flag_for_togo": "๐Ÿ‡น๐Ÿ‡ฌ", + "flag_for_tokelau": "๐Ÿ‡น๐Ÿ‡ฐ", + "flag_for_tonga": "๐Ÿ‡น๐Ÿ‡ด", + "flag_for_trinidad_&_tobago": "๐Ÿ‡น๐Ÿ‡น", + "flag_for_tristan_da_cunha": "๐Ÿ‡น๐Ÿ‡ฆ", + "flag_for_tunisia": "๐Ÿ‡น๐Ÿ‡ณ", + "flag_for_turkey": "๐Ÿ‡น๐Ÿ‡ท", + "flag_for_turkmenistan": "๐Ÿ‡น๐Ÿ‡ฒ", + "flag_for_turks_&_caicos_islands": "๐Ÿ‡น๐Ÿ‡จ", + "flag_for_tuvalu": "๐Ÿ‡น๐Ÿ‡ป", + "flag_for_u.s._outlying_islands": "๐Ÿ‡บ๐Ÿ‡ฒ", + "flag_for_u.s._virgin_islands": "๐Ÿ‡ป๐Ÿ‡ฎ", + "flag_for_uganda": "๐Ÿ‡บ๐Ÿ‡ฌ", + "flag_for_ukraine": "๐Ÿ‡บ๐Ÿ‡ฆ", + "flag_for_united_arab_emirates": "๐Ÿ‡ฆ๐Ÿ‡ช", + "flag_for_united_kingdom": "๐Ÿ‡ฌ๐Ÿ‡ง", + "flag_for_united_states": "๐Ÿ‡บ๐Ÿ‡ธ", + "flag_for_uruguay": "๐Ÿ‡บ๐Ÿ‡พ", + "flag_for_uzbekistan": "๐Ÿ‡บ๐Ÿ‡ฟ", + "flag_for_vanuatu": "๐Ÿ‡ป๐Ÿ‡บ", + "flag_for_vatican_city": "๐Ÿ‡ป๐Ÿ‡ฆ", + "flag_for_venezuela": "๐Ÿ‡ป๐Ÿ‡ช", + "flag_for_vietnam": "๐Ÿ‡ป๐Ÿ‡ณ", + "flag_for_wallis_&_futuna": "๐Ÿ‡ผ๐Ÿ‡ซ", + "flag_for_western_sahara": "๐Ÿ‡ช๐Ÿ‡ญ", + "flag_for_yemen": "๐Ÿ‡พ๐Ÿ‡ช", + "flag_for_zambia": "๐Ÿ‡ฟ๐Ÿ‡ฒ", + "flag_for_zimbabwe": "๐Ÿ‡ฟ๐Ÿ‡ผ", + "flag_for_รฅland_islands": "๐Ÿ‡ฆ๐Ÿ‡ฝ", + "golf": "โ›ณ", + "fleur__de__lis": "โšœ", + "muscle": "๐Ÿ’ช", + "flushed": "๐Ÿ˜ณ", + "frame_with_picture": "๐Ÿ–ผ", + "fries": "๐ŸŸ", + "frog": "๐Ÿธ", + "hatched_chick": "๐Ÿฅ", + "frowning": "๐Ÿ˜ฆ", + "fuelpump": "โ›ฝ", + "full_moon_with_face": "๐ŸŒ", + "gem": "๐Ÿ’Ž", + "star2": "๐ŸŒŸ", + "golfer": "๐ŸŒ", + "mortar_board": "๐ŸŽ“", + "grimacing": "๐Ÿ˜ฌ", + "smile_cat": "๐Ÿ˜ธ", + "grinning": "๐Ÿ˜€", + "grin": "๐Ÿ˜", + "heartpulse": "๐Ÿ’—", + "guardsman": "๐Ÿ’‚", + "haircut": "๐Ÿ’‡", + "hamster": "๐Ÿน", + "raising_hand": "๐Ÿ™‹", + "headphones": "๐ŸŽง", + "hear_no_evil": "๐Ÿ™‰", + "cupid": "๐Ÿ’˜", + "gift_heart": "๐Ÿ’", + "heart": "โค", + "exclamation": "โ—", + "heavy_exclamation_mark": "โ—", + "heavy_heart_exclamation_mark_ornament": "โฃ", + "o": "โญ•", + "helm_symbol": "โŽˆ", + "helmet_with_white_cross": "โ›‘", + "high_heel": "๐Ÿ‘ ", + "bullettrain_side": "๐Ÿš„", + "bullettrain_front": "๐Ÿš…", + "high_brightness": "๐Ÿ”†", + "zap": "โšก", + "hocho": "๐Ÿ”ช", + "knife": "๐Ÿ”ช", + "bee": "๐Ÿ", + "traffic_light": "๐Ÿšฅ", + "racehorse": "๐ŸŽ", + "coffee": "โ˜•", + "hotsprings": "โ™จ", + "hourglass": "โŒ›", + "hourglass_flowing_sand": "โณ", + "house_buildings": "๐Ÿ˜", + "100": "๐Ÿ’ฏ", + "hushed": "๐Ÿ˜ฏ", + "ice_hockey_stick_and_puck": "๐Ÿ’", + "imp": "๐Ÿ‘ฟ", + "information_desk_person": "๐Ÿ’", + "information_source": "โ„น", + "capital_abcd": "๐Ÿ” ", + "abc": "๐Ÿ”ค", + "abcd": "๐Ÿ”ก", + "1234": "๐Ÿ”ข", + "symbols": "๐Ÿ”ฃ", + "izakaya_lantern": "๐Ÿฎ", + "lantern": "๐Ÿฎ", + "jack_o_lantern": "๐ŸŽƒ", + "dolls": "๐ŸŽŽ", + "japanese_goblin": "๐Ÿ‘บ", + "japanese_ogre": "๐Ÿ‘น", + "beginner": "๐Ÿ”ฐ", + "zero": "0๏ธโƒฃ", + "one": "1๏ธโƒฃ", + "ten": "๐Ÿ”Ÿ", + "two": "2๏ธโƒฃ", + "three": "3๏ธโƒฃ", + "four": "4๏ธโƒฃ", + "five": "5๏ธโƒฃ", + "six": "6๏ธโƒฃ", + "seven": "7๏ธโƒฃ", + "eight": "8๏ธโƒฃ", + "nine": "9๏ธโƒฃ", + "couplekiss": "๐Ÿ’", + "kissing_cat": "๐Ÿ˜ฝ", + "kissing": "๐Ÿ˜—", + "kissing_closed_eyes": "๐Ÿ˜š", + "kissing_smiling_eyes": "๐Ÿ˜™", + "beetle": "๐Ÿž", + "large_blue_circle": "๐Ÿ”ต", + "last_quarter_moon_with_face": "๐ŸŒœ", + "leaves": "๐Ÿƒ", + "mag": "๐Ÿ”", + "left_right_arrow": "โ†”", + "leftwards_arrow_with_hook": "โ†ฉ", + "arrow_left": "โฌ…", + "lock": "๐Ÿ”’", + "lock_with_ink_pen": "๐Ÿ”", + "sob": "๐Ÿ˜ญ", + "low_brightness": "๐Ÿ”…", + "lower_left_ballpoint_pen": "๐Ÿ–Š", + "lower_left_crayon": "๐Ÿ–", + "lower_left_fountain_pen": "๐Ÿ–‹", + "lower_left_paintbrush": "๐Ÿ–Œ", + "mahjong": "๐Ÿ€„", + "couple": "๐Ÿ‘ซ", + "man_in_business_suit_levitating": "๐Ÿ•ด", + "man_with_gua_pi_mao": "๐Ÿ‘ฒ", + "man_with_turban": "๐Ÿ‘ณ", + "mans_shoe": "๐Ÿ‘ž", + "shoe": "๐Ÿ‘ž", + "menorah_with_nine_branches": "๐Ÿ•Ž", + "mens": "๐Ÿšน", + "minidisc": "๐Ÿ’ฝ", + "iphone": "๐Ÿ“ฑ", + "calling": "๐Ÿ“ฒ", + "money__mouth_face": "๐Ÿค‘", + "moneybag": "๐Ÿ’ฐ", + "rice_scene": "๐ŸŽ‘", + "mountain_bicyclist": "๐Ÿšต", + "mouse2": "๐Ÿ", + "lips": "๐Ÿ‘„", + "moyai": "๐Ÿ—ฟ", + "notes": "๐ŸŽถ", + "nail_care": "๐Ÿ’…", + "ab": "๐Ÿ†Ž", + "negative_squared_cross_mark": "โŽ", + "a": "๐Ÿ…ฐ", + "b": "๐Ÿ…ฑ", + "o2": "๐Ÿ…พ", + "parking": "๐Ÿ…ฟ", + "new_moon_with_face": "๐ŸŒš", + "no_entry_sign": "๐Ÿšซ", + "underage": "๐Ÿ”ž", + "non__potable_water": "๐Ÿšฑ", + "arrow_upper_right": "โ†—", + "arrow_upper_left": "โ†–", + "office": "๐Ÿข", + "older_man": "๐Ÿ‘ด", + "older_woman": "๐Ÿ‘ต", + "om_symbol": "๐Ÿ•‰", + "on": "๐Ÿ”›", + "book": "๐Ÿ“–", + "unlock": "๐Ÿ”“", + "mailbox_with_no_mail": "๐Ÿ“ญ", + "mailbox_with_mail": "๐Ÿ“ฌ", + "cd": "๐Ÿ’ฟ", + "tada": "๐ŸŽ‰", + "feet": "๐Ÿพ", + "walking": "๐Ÿšถ", + "pencil2": "โœ", + "pensive": "๐Ÿ˜”", + "persevere": "๐Ÿ˜ฃ", + "bow": "๐Ÿ™‡", + "raised_hands": "๐Ÿ™Œ", + "person_with_ball": "โ›น", + "person_with_blond_hair": "๐Ÿ‘ฑ", + "pray": "๐Ÿ™", + "person_with_pouting_face": "๐Ÿ™Ž", + "computer": "๐Ÿ’ป", + "pig2": "๐Ÿ–", + "hankey": "๐Ÿ’ฉ", + "poop": "๐Ÿ’ฉ", + "shit": "๐Ÿ’ฉ", + "bamboo": "๐ŸŽ", + "gun": "๐Ÿ”ซ", + "black_joker": "๐Ÿƒ", + "rotating_light": "๐Ÿšจ", + "cop": "๐Ÿ‘ฎ", + "stew": "๐Ÿฒ", + "pouch": "๐Ÿ‘", + "pouting_cat": "๐Ÿ˜พ", + "rage": "๐Ÿ˜ก", + "put_litter_in_its_place": "๐Ÿšฎ", + "rabbit2": "๐Ÿ‡", + "racing_motorcycle": "๐Ÿ", + "radioactive_sign": "โ˜ข", + "fist": "โœŠ", + "hand": "โœ‹", + "raised_hand_with_fingers_splayed": "๐Ÿ–", + "raised_hand_with_part_between_middle_and_ring_fingers": "๐Ÿ––", + "blue_car": "๐Ÿš™", + "apple": "๐ŸŽ", + "relieved": "๐Ÿ˜Œ", + "reversed_hand_with_middle_finger_extended": "๐Ÿ–•", + "mag_right": "๐Ÿ”Ž", + "arrow_right_hook": "โ†ช", + "sweet_potato": "๐Ÿ ", + "robot": "๐Ÿค–", + "rolled__up_newspaper": "๐Ÿ—ž", + "rowboat": "๐Ÿšฃ", + "runner": "๐Ÿƒ", + "running": "๐Ÿƒ", + "running_shirt_with_sash": "๐ŸŽฝ", + "boat": "โ›ต", + "scales": "โš–", + "school_satchel": "๐ŸŽ’", + "scorpius": "โ™", + "see_no_evil": "๐Ÿ™ˆ", + "sheep": "๐Ÿ‘", + "stars": "๐ŸŒ ", + "cake": "๐Ÿฐ", + "six_pointed_star": "๐Ÿ”ฏ", + "ski": "๐ŸŽฟ", + "sleeping_accommodation": "๐Ÿ›Œ", + "sleeping": "๐Ÿ˜ด", + "sleepy": "๐Ÿ˜ช", + "sleuth_or_spy": "๐Ÿ•ต", + "heart_eyes_cat": "๐Ÿ˜ป", + "smiley_cat": "๐Ÿ˜บ", + "innocent": "๐Ÿ˜‡", + "heart_eyes": "๐Ÿ˜", + "smiling_imp": "๐Ÿ˜ˆ", + "smiley": "๐Ÿ˜ƒ", + "sweat_smile": "๐Ÿ˜…", + "smile": "๐Ÿ˜„", + "laughing": "๐Ÿ˜†", + "satisfied": "๐Ÿ˜†", + "blush": "๐Ÿ˜Š", + "smirk": "๐Ÿ˜", + "smoking": "๐Ÿšฌ", + "snow_capped_mountain": "๐Ÿ”", + "soccer": "โšฝ", + "icecream": "๐Ÿฆ", + "soon": "๐Ÿ”œ", + "arrow_lower_right": "โ†˜", + "arrow_lower_left": "โ†™", + "speak_no_evil": "๐Ÿ™Š", + "speaker": "๐Ÿ”ˆ", + "mute": "๐Ÿ”‡", + "sound": "๐Ÿ”‰", + "loud_sound": "๐Ÿ”Š", + "speaking_head_in_silhouette": "๐Ÿ—ฃ", + "spiral_calendar_pad": "๐Ÿ—“", + "spiral_note_pad": "๐Ÿ—’", + "shell": "๐Ÿš", + "sweat_drops": "๐Ÿ’ฆ", + "u5272": "๐Ÿˆน", + "u5408": "๐Ÿˆด", + "u55b6": "๐Ÿˆบ", + "u6307": "๐Ÿˆฏ", + "u6708": "๐Ÿˆท", + "u6709": "๐Ÿˆถ", + "u6e80": "๐Ÿˆต", + "u7121": "๐Ÿˆš", + "u7533": "๐Ÿˆธ", + "u7981": "๐Ÿˆฒ", + "u7a7a": "๐Ÿˆณ", + "cl": "๐Ÿ†‘", + "cool": "๐Ÿ†’", + "free": "๐Ÿ†“", + "id": "๐Ÿ†”", + "koko": "๐Ÿˆ", + "sa": "๐Ÿˆ‚", + "new": "๐Ÿ†•", + "ng": "๐Ÿ†–", + "ok": "๐Ÿ†—", + "sos": "๐Ÿ†˜", + "up": "๐Ÿ†™", + "vs": "๐Ÿ†š", + "steam_locomotive": "๐Ÿš‚", + "ramen": "๐Ÿœ", + "partly_sunny": "โ›…", + "city_sunrise": "๐ŸŒ‡", + "surfer": "๐Ÿ„", + "swimmer": "๐ŸŠ", + "shirt": "๐Ÿ‘•", + "tshirt": "๐Ÿ‘•", + "table_tennis_paddle_and_ball": "๐Ÿ“", + "tea": "๐Ÿต", + "tv": "๐Ÿ“บ", + "three_button_mouse": "๐Ÿ–ฑ", + "+1": "๐Ÿ‘", + "thumbsup": "๐Ÿ‘", + "__1": "๐Ÿ‘Ž", + "-1": "๐Ÿ‘Ž", + "thumbsdown": "๐Ÿ‘Ž", + "thunder_cloud_and_rain": "โ›ˆ", + "tiger2": "๐Ÿ…", + "tophat": "๐ŸŽฉ", + "top": "๐Ÿ”", + "tm": "โ„ข", + "train2": "๐Ÿš†", + "triangular_flag_on_post": "๐Ÿšฉ", + "trident": "๐Ÿ”ฑ", + "twisted_rightwards_arrows": "๐Ÿ”€", + "unamused": "๐Ÿ˜’", + "small_red_triangle": "๐Ÿ”บ", + "arrow_up_small": "๐Ÿ”ผ", + "arrow_up_down": "โ†•", + "upside__down_face": "๐Ÿ™ƒ", + "arrow_up": "โฌ†", + "v": "โœŒ", + "vhs": "๐Ÿ“ผ", + "wc": "๐Ÿšพ", + "ocean": "๐ŸŒŠ", + "waving_black_flag": "๐Ÿด", + "wave": "๐Ÿ‘‹", + "waving_white_flag": "๐Ÿณ", + "moon": "๐ŸŒ”", + "scream_cat": "๐Ÿ™€", + "weary": "๐Ÿ˜ฉ", + "weight_lifter": "๐Ÿ‹", + "whale2": "๐Ÿ‹", + "wheelchair": "โ™ฟ", + "point_down": "๐Ÿ‘‡", + "grey_exclamation": "โ•", + "white_frowning_face": "โ˜น", + "white_check_mark": "โœ…", + "point_left": "๐Ÿ‘ˆ", + "white_medium_small_square": "โ—ฝ", + "star": "โญ", + "grey_question": "โ”", + "point_right": "๐Ÿ‘‰", + "relaxed": "โ˜บ", + "white_sun_behind_cloud": "๐ŸŒฅ", + "white_sun_behind_cloud_with_rain": "๐ŸŒฆ", + "white_sun_with_small_cloud": "๐ŸŒค", + "point_up_2": "๐Ÿ‘†", + "point_up": "โ˜", + "wind_blowing_face": "๐ŸŒฌ", + "wink": "๐Ÿ˜‰", + "wolf": "๐Ÿบ", + "dancers": "๐Ÿ‘ฏ", + "boot": "๐Ÿ‘ข", + "womans_clothes": "๐Ÿ‘š", + "womans_hat": "๐Ÿ‘’", + "sandal": "๐Ÿ‘ก", + "womens": "๐Ÿšบ", + "worried": "๐Ÿ˜Ÿ", + "gift": "๐ŸŽ", + "zipper__mouth_face": "๐Ÿค", + "regional_indicator_a": "๐Ÿ‡ฆ", + "regional_indicator_b": "๐Ÿ‡ง", + "regional_indicator_c": "๐Ÿ‡จ", + "regional_indicator_d": "๐Ÿ‡ฉ", + "regional_indicator_e": "๐Ÿ‡ช", + "regional_indicator_f": "๐Ÿ‡ซ", + "regional_indicator_g": "๐Ÿ‡ฌ", + "regional_indicator_h": "๐Ÿ‡ญ", + "regional_indicator_i": "๐Ÿ‡ฎ", + "regional_indicator_j": "๐Ÿ‡ฏ", + "regional_indicator_k": "๐Ÿ‡ฐ", + "regional_indicator_l": "๐Ÿ‡ฑ", + "regional_indicator_m": "๐Ÿ‡ฒ", + "regional_indicator_n": "๐Ÿ‡ณ", + "regional_indicator_o": "๐Ÿ‡ด", + "regional_indicator_p": "๐Ÿ‡ต", + "regional_indicator_q": "๐Ÿ‡ถ", + "regional_indicator_r": "๐Ÿ‡ท", + "regional_indicator_s": "๐Ÿ‡ธ", + "regional_indicator_t": "๐Ÿ‡น", + "regional_indicator_u": "๐Ÿ‡บ", + "regional_indicator_v": "๐Ÿ‡ป", + "regional_indicator_w": "๐Ÿ‡ผ", + "regional_indicator_x": "๐Ÿ‡ฝ", + "regional_indicator_y": "๐Ÿ‡พ", + "regional_indicator_z": "๐Ÿ‡ฟ", +} diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py new file mode 100644 index 0000000000000000000000000000000000000000..bb2cafa18011e7115773055338291c366f173d6f --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_emoji_replace.py @@ -0,0 +1,32 @@ +from typing import Callable, Match, Optional +import re + +from ._emoji_codes import EMOJI + + +_ReStringMatch = Match[str] # regex match object +_ReSubCallable = Callable[[_ReStringMatch], str] # Callable invoked by re.sub +_EmojiSubMethod = Callable[[_ReSubCallable, str], str] # Sub method of a compiled re + + +def _emoji_replace( + text: str, + default_variant: Optional[str] = None, + _emoji_sub: _EmojiSubMethod = re.compile(r"(:(\S*?)(?:(?:\-)(emoji|text))?:)").sub, +) -> str: + """Replace emoji code in text.""" + get_emoji = EMOJI.__getitem__ + variants = {"text": "\uFE0E", "emoji": "\uFE0F"} + get_variant = variants.get + default_variant_code = variants.get(default_variant, "") if default_variant else "" + + def do_replace(match: Match[str]) -> str: + emoji_code, emoji_name, variant = match.groups() + try: + return get_emoji(emoji_name.lower()) + get_variant( + variant, default_variant_code + ) + except KeyError: + return emoji_code + + return _emoji_sub(do_replace, text) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py new file mode 100644 index 0000000000000000000000000000000000000000..3c748d33e45bfcdc690ceee490cbb50b516cd2b3 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_palettes.py @@ -0,0 +1,309 @@ +from .palette import Palette + + +# Taken from https://en.wikipedia.org/wiki/ANSI_escape_code (Windows 10 column) +WINDOWS_PALETTE = Palette( + [ + (12, 12, 12), + (197, 15, 31), + (19, 161, 14), + (193, 156, 0), + (0, 55, 218), + (136, 23, 152), + (58, 150, 221), + (204, 204, 204), + (118, 118, 118), + (231, 72, 86), + (22, 198, 12), + (249, 241, 165), + (59, 120, 255), + (180, 0, 158), + (97, 214, 214), + (242, 242, 242), + ] +) + +# # The standard ansi colors (including bright variants) +STANDARD_PALETTE = Palette( + [ + (0, 0, 0), + (170, 0, 0), + (0, 170, 0), + (170, 85, 0), + (0, 0, 170), + (170, 0, 170), + (0, 170, 170), + (170, 170, 170), + (85, 85, 85), + (255, 85, 85), + (85, 255, 85), + (255, 255, 85), + (85, 85, 255), + (255, 85, 255), + (85, 255, 255), + (255, 255, 255), + ] +) + + +# The 256 color palette +EIGHT_BIT_PALETTE = Palette( + [ + (0, 0, 0), + (128, 0, 0), + (0, 128, 0), + (128, 128, 0), + (0, 0, 128), + (128, 0, 128), + (0, 128, 128), + (192, 192, 192), + (128, 128, 128), + (255, 0, 0), + (0, 255, 0), + (255, 255, 0), + (0, 0, 255), + (255, 0, 255), + (0, 255, 255), + (255, 255, 255), + (0, 0, 0), + (0, 0, 95), + (0, 0, 135), + (0, 0, 175), + (0, 0, 215), + (0, 0, 255), + (0, 95, 0), + (0, 95, 95), + (0, 95, 135), + (0, 95, 175), + (0, 95, 215), + (0, 95, 255), + (0, 135, 0), + (0, 135, 95), + (0, 135, 135), + (0, 135, 175), + (0, 135, 215), + (0, 135, 255), + (0, 175, 0), + (0, 175, 95), + (0, 175, 135), + (0, 175, 175), + (0, 175, 215), + (0, 175, 255), + (0, 215, 0), + (0, 215, 95), + (0, 215, 135), + (0, 215, 175), + (0, 215, 215), + (0, 215, 255), + (0, 255, 0), + (0, 255, 95), + (0, 255, 135), + (0, 255, 175), + (0, 255, 215), + (0, 255, 255), + (95, 0, 0), + (95, 0, 95), + (95, 0, 135), + (95, 0, 175), + (95, 0, 215), + (95, 0, 255), + (95, 95, 0), + (95, 95, 95), + (95, 95, 135), + (95, 95, 175), + (95, 95, 215), + (95, 95, 255), + (95, 135, 0), + (95, 135, 95), + (95, 135, 135), + (95, 135, 175), + (95, 135, 215), + (95, 135, 255), + (95, 175, 0), + (95, 175, 95), + (95, 175, 135), + (95, 175, 175), + (95, 175, 215), + (95, 175, 255), + (95, 215, 0), + (95, 215, 95), + (95, 215, 135), + (95, 215, 175), + (95, 215, 215), + (95, 215, 255), + (95, 255, 0), + (95, 255, 95), + (95, 255, 135), + (95, 255, 175), + (95, 255, 215), + (95, 255, 255), + (135, 0, 0), + (135, 0, 95), + (135, 0, 135), + (135, 0, 175), + (135, 0, 215), + (135, 0, 255), + (135, 95, 0), + (135, 95, 95), + (135, 95, 135), + (135, 95, 175), + (135, 95, 215), + (135, 95, 255), + (135, 135, 0), + (135, 135, 95), + (135, 135, 135), + (135, 135, 175), + (135, 135, 215), + (135, 135, 255), + (135, 175, 0), + (135, 175, 95), + (135, 175, 135), + (135, 175, 175), + (135, 175, 215), + (135, 175, 255), + (135, 215, 0), + (135, 215, 95), + (135, 215, 135), + (135, 215, 175), + (135, 215, 215), + (135, 215, 255), + (135, 255, 0), + (135, 255, 95), + (135, 255, 135), + (135, 255, 175), + (135, 255, 215), + (135, 255, 255), + (175, 0, 0), + (175, 0, 95), + (175, 0, 135), + (175, 0, 175), + (175, 0, 215), + (175, 0, 255), + (175, 95, 0), + (175, 95, 95), + (175, 95, 135), + (175, 95, 175), + (175, 95, 215), + (175, 95, 255), + (175, 135, 0), + (175, 135, 95), + (175, 135, 135), + (175, 135, 175), + (175, 135, 215), + (175, 135, 255), + (175, 175, 0), + (175, 175, 95), + (175, 175, 135), + (175, 175, 175), + (175, 175, 215), + (175, 175, 255), + (175, 215, 0), + (175, 215, 95), + (175, 215, 135), + (175, 215, 175), + (175, 215, 215), + (175, 215, 255), + (175, 255, 0), + (175, 255, 95), + (175, 255, 135), + (175, 255, 175), + (175, 255, 215), + (175, 255, 255), + (215, 0, 0), + (215, 0, 95), + (215, 0, 135), + (215, 0, 175), + (215, 0, 215), + (215, 0, 255), + (215, 95, 0), + (215, 95, 95), + (215, 95, 135), + (215, 95, 175), + (215, 95, 215), + (215, 95, 255), + (215, 135, 0), + (215, 135, 95), + (215, 135, 135), + (215, 135, 175), + (215, 135, 215), + (215, 135, 255), + (215, 175, 0), + (215, 175, 95), + (215, 175, 135), + (215, 175, 175), + (215, 175, 215), + (215, 175, 255), + (215, 215, 0), + (215, 215, 95), + (215, 215, 135), + (215, 215, 175), + (215, 215, 215), + (215, 215, 255), + (215, 255, 0), + (215, 255, 95), + (215, 255, 135), + (215, 255, 175), + (215, 255, 215), + (215, 255, 255), + (255, 0, 0), + (255, 0, 95), + (255, 0, 135), + (255, 0, 175), + (255, 0, 215), + (255, 0, 255), + (255, 95, 0), + (255, 95, 95), + (255, 95, 135), + (255, 95, 175), + (255, 95, 215), + (255, 95, 255), + (255, 135, 0), + (255, 135, 95), + (255, 135, 135), + (255, 135, 175), + (255, 135, 215), + (255, 135, 255), + (255, 175, 0), + (255, 175, 95), + (255, 175, 135), + (255, 175, 175), + (255, 175, 215), + (255, 175, 255), + (255, 215, 0), + (255, 215, 95), + (255, 215, 135), + (255, 215, 175), + (255, 215, 215), + (255, 215, 255), + (255, 255, 0), + (255, 255, 95), + (255, 255, 135), + (255, 255, 175), + (255, 255, 215), + (255, 255, 255), + (8, 8, 8), + (18, 18, 18), + (28, 28, 28), + (38, 38, 38), + (48, 48, 48), + (58, 58, 58), + (68, 68, 68), + (78, 78, 78), + (88, 88, 88), + (98, 98, 98), + (108, 108, 108), + (118, 118, 118), + (128, 128, 128), + (138, 138, 138), + (148, 148, 148), + (158, 158, 158), + (168, 168, 168), + (178, 178, 178), + (188, 188, 188), + (198, 198, 198), + (208, 208, 208), + (218, 218, 218), + (228, 228, 228), + (238, 238, 238), + ] +) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py new file mode 100644 index 0000000000000000000000000000000000000000..e8a3a674e0070159b956c29c5092b0f72abc969d --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_ratio.py @@ -0,0 +1,160 @@ +import sys +from fractions import Fraction +from math import ceil +from typing import cast, List, Optional, Sequence + +if sys.version_info >= (3, 8): + from typing import Protocol +else: + from pip._vendor.typing_extensions import Protocol # pragma: no cover + + +class Edge(Protocol): + """Any object that defines an edge (such as Layout).""" + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + +def ratio_resolve(total: int, edges: Sequence[Edge]) -> List[int]: + """Divide total space to satisfy size, ratio, and minimum_size, constraints. + + The returned list of integers should add up to total in most cases, unless it is + impossible to satisfy all the constraints. For instance, if there are two edges + with a minimum size of 20 each and `total` is 30 then the returned list will be + greater than total. In practice, this would mean that a Layout object would + clip the rows that would overflow the screen height. + + Args: + total (int): Total number of characters. + edges (List[Edge]): Edges within total space. + + Returns: + List[int]: Number of characters for each edge. + """ + # Size of edge or None for yet to be determined + sizes = [(edge.size or None) for edge in edges] + + _Fraction = Fraction + + # While any edges haven't been calculated + while None in sizes: + # Get flexible edges and index to map these back on to sizes list + flexible_edges = [ + (index, edge) + for index, (size, edge) in enumerate(zip(sizes, edges)) + if size is None + ] + # Remaining space in total + remaining = total - sum(size or 0 for size in sizes) + if remaining <= 0: + # No room for flexible edges + return [ + ((edge.minimum_size or 1) if size is None else size) + for size, edge in zip(sizes, edges) + ] + # Calculate number of characters in a ratio portion + portion = _Fraction( + remaining, sum((edge.ratio or 1) for _, edge in flexible_edges) + ) + + # If any edges will be less than their minimum, replace size with the minimum + for index, edge in flexible_edges: + if portion * edge.ratio <= edge.minimum_size: + sizes[index] = edge.minimum_size + # New fixed size will invalidate calculations, so we need to repeat the process + break + else: + # Distribute flexible space and compensate for rounding error + # Since edge sizes can only be integers we need to add the remainder + # to the following line + remainder = _Fraction(0) + for index, edge in flexible_edges: + size, remainder = divmod(portion * edge.ratio + remainder, 1) + sizes[index] = size + break + # Sizes now contains integers only + return cast(List[int], sizes) + + +def ratio_reduce( + total: int, ratios: List[int], maximums: List[int], values: List[int] +) -> List[int]: + """Divide an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + maximums (List[int]): List of maximums values for each slot. + values (List[int]): List of values + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + ratios = [ratio if _max else 0 for ratio, _max in zip(ratios, maximums)] + total_ratio = sum(ratios) + if not total_ratio: + return values[:] + total_remaining = total + result: List[int] = [] + append = result.append + for ratio, maximum, value in zip(ratios, maximums, values): + if ratio and total_ratio > 0: + distributed = min(maximum, round(ratio * total_remaining / total_ratio)) + append(value - distributed) + total_remaining -= distributed + total_ratio -= ratio + else: + append(value) + return result + + +def ratio_distribute( + total: int, ratios: List[int], minimums: Optional[List[int]] = None +) -> List[int]: + """Distribute an integer total in to parts based on ratios. + + Args: + total (int): The total to divide. + ratios (List[int]): A list of integer ratios. + minimums (List[int]): List of minimum values for each slot. + + Returns: + List[int]: A list of integers guaranteed to sum to total. + """ + if minimums: + ratios = [ratio if _min else 0 for ratio, _min in zip(ratios, minimums)] + total_ratio = sum(ratios) + assert total_ratio > 0, "Sum of ratios must be > 0" + + total_remaining = total + distributed_total: List[int] = [] + append = distributed_total.append + if minimums is None: + _minimums = [0] * len(ratios) + else: + _minimums = minimums + for ratio, minimum in zip(ratios, _minimums): + if total_ratio > 0: + distributed = max(minimum, ceil(ratio * total_remaining / total_ratio)) + else: + distributed = total_remaining + append(distributed) + total_ratio -= ratio + total_remaining -= distributed + return distributed_total + + +if __name__ == "__main__": + from dataclasses import dataclass + + @dataclass + class E: + + size: Optional[int] = None + ratio: int = 1 + minimum_size: int = 1 + + resolved = ratio_resolve(110, [E(None, 1, 1), E(None, 1, 1), E(None, 1, 1)]) + print(sum(resolved)) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py new file mode 100644 index 0000000000000000000000000000000000000000..d0bb1fe751677f0ee83fc6bb876ed72443fdcde7 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_spinners.py @@ -0,0 +1,482 @@ +""" +Spinners are from: +* cli-spinners: + MIT License + Copyright (c) Sindre Sorhus (sindresorhus.com) + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights to + use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + the Software, and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, + INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR + PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE + FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + IN THE SOFTWARE. +""" + +SPINNERS = { + "dots": { + "interval": 80, + "frames": "โ ‹โ ™โ นโ ธโ ผโ ดโ ฆโ งโ ‡โ ", + }, + "dots2": {"interval": 80, "frames": "โฃพโฃฝโฃปโขฟโกฟโฃŸโฃฏโฃท"}, + "dots3": { + "interval": 80, + "frames": "โ ‹โ ™โ šโ žโ –โ ฆโ ดโ ฒโ ณโ “", + }, + "dots4": { + "interval": 80, + "frames": "โ „โ †โ ‡โ ‹โ ™โ ธโ ฐโ  โ ฐโ ธโ ™โ ‹โ ‡โ †", + }, + "dots5": { + "interval": 80, + "frames": "โ ‹โ ™โ šโ ’โ ‚โ ‚โ ’โ ฒโ ดโ ฆโ –โ ’โ โ โ ’โ “โ ‹", + }, + "dots6": { + "interval": 80, + "frames": "โ โ ‰โ ™โ šโ ’โ ‚โ ‚โ ’โ ฒโ ดโ คโ „โ „โ คโ ดโ ฒโ ’โ ‚โ ‚โ ’โ šโ ™โ ‰โ ", + }, + "dots7": { + "interval": 80, + "frames": "โ ˆโ ‰โ ‹โ “โ ’โ โ โ ’โ –โ ฆโ คโ  โ  โ คโ ฆโ –โ ’โ โ โ ’โ “โ ‹โ ‰โ ˆ", + }, + "dots8": { + "interval": 80, + "frames": "โ โ โ ‰โ ™โ šโ ’โ ‚โ ‚โ ’โ ฒโ ดโ คโ „โ „โ คโ  โ  โ คโ ฆโ –โ ’โ โ โ ’โ “โ ‹โ ‰โ ˆโ ˆ", + }, + "dots9": {"interval": 80, "frames": "โขนโขบโขผโฃธโฃ‡โกงโก—โก"}, + "dots10": {"interval": 80, "frames": "โข„โข‚โขโกโกˆโกโก "}, + "dots11": {"interval": 100, "frames": "โ โ ‚โ „โก€โข€โ  โ โ ˆ"}, + "dots12": { + "interval": 80, + "frames": [ + "โข€โ €", + "โก€โ €", + "โ „โ €", + "โข‚โ €", + "โก‚โ €", + "โ …โ €", + "โขƒโ €", + "โกƒโ €", + "โ โ €", + "โข‹โ €", + "โก‹โ €", + "โ โ ", + "โข‹โ ", + "โก‹โ ", + "โ โ ‰", + "โ ‹โ ‰", + "โ ‹โ ‰", + "โ ‰โ ™", + "โ ‰โ ™", + "โ ‰โ ฉ", + "โ ˆโข™", + "โ ˆโก™", + "โขˆโ ฉ", + "โก€โข™", + "โ „โก™", + "โข‚โ ฉ", + "โก‚โข˜", + "โ …โก˜", + "โขƒโ จ", + "โกƒโข", + "โ โก", + "โข‹โ  ", + "โก‹โข€", + "โ โก", + "โข‹โ ", + "โก‹โ ", + "โ โ ‰", + "โ ‹โ ‰", + "โ ‹โ ‰", + "โ ‰โ ™", + "โ ‰โ ™", + "โ ‰โ ฉ", + "โ ˆโข™", + "โ ˆโก™", + "โ ˆโ ฉ", + "โ €โข™", + "โ €โก™", + "โ €โ ฉ", + "โ €โข˜", + "โ €โก˜", + "โ €โ จ", + "โ €โข", + "โ €โก", + "โ €โ  ", + "โ €โข€", + "โ €โก€", + ], + }, + "dots8Bit": { + "interval": 80, + "frames": "โ €โ โ ‚โ ƒโ „โ …โ †โ ‡โก€โกโก‚โกƒโก„โก…โก†โก‡โ ˆโ ‰โ Šโ ‹โ Œโ โ Žโ โกˆโก‰โกŠโก‹โกŒโกโกŽโกโ โ ‘โ ’โ “โ ”โ •โ –โ —โกโก‘โก’โก“โก”โก•โก–โก—โ ˜โ ™โ šโ ›โ œโ โ žโ Ÿโก˜โก™" + "โกšโก›โกœโกโกžโกŸโ  โ กโ ขโ ฃโ คโ ฅโ ฆโ งโก โกกโกขโกฃโกคโกฅโกฆโกงโ จโ ฉโ ชโ ซโ ฌโ ญโ ฎโ ฏโกจโกฉโกชโกซโกฌโกญโกฎโกฏโ ฐโ ฑโ ฒโ ณโ ดโ ตโ ถโ ทโกฐโกฑโกฒโกณโกดโกตโกถโกทโ ธโ นโ บโ ป" + "โ ผโ ฝโ พโ ฟโกธโกนโกบโกปโกผโกฝโกพโกฟโข€โขโข‚โขƒโข„โข…โข†โข‡โฃ€โฃโฃ‚โฃƒโฃ„โฃ…โฃ†โฃ‡โขˆโข‰โขŠโข‹โขŒโขโขŽโขโฃˆโฃ‰โฃŠโฃ‹โฃŒโฃโฃŽโฃโขโข‘โข’โข“โข”โข•โข–โข—โฃโฃ‘โฃ’โฃ“โฃ”โฃ•" + "โฃ–โฃ—โข˜โข™โขšโข›โขœโขโขžโขŸโฃ˜โฃ™โฃšโฃ›โฃœโฃโฃžโฃŸโข โขกโขขโขฃโขคโขฅโขฆโขงโฃ โฃกโฃขโฃฃโฃคโฃฅโฃฆโฃงโขจโขฉโขชโขซโขฌโขญโขฎโขฏโฃจโฃฉโฃชโฃซโฃฌโฃญโฃฎโฃฏโขฐโขฑโขฒโขณโขดโขตโขถโขท" + "โฃฐโฃฑโฃฒโฃณโฃดโฃตโฃถโฃทโขธโขนโขบโขปโขผโขฝโขพโขฟโฃธโฃนโฃบโฃปโฃผโฃฝโฃพโฃฟ", + }, + "line": {"interval": 130, "frames": ["-", "\\", "|", "/"]}, + "line2": {"interval": 100, "frames": "โ ‚-โ€“โ€”โ€“-"}, + "pipe": {"interval": 100, "frames": "โ”คโ”˜โ”ดโ””โ”œโ”Œโ”ฌโ”"}, + "simpleDots": {"interval": 400, "frames": [". ", ".. ", "...", " "]}, + "simpleDotsScrolling": { + "interval": 200, + "frames": [". ", ".. ", "...", " ..", " .", " "], + }, + "star": {"interval": 70, "frames": "โœถโœธโœนโœบโœนโœท"}, + "star2": {"interval": 80, "frames": "+x*"}, + "flip": { + "interval": 70, + "frames": "___-``'ยด-___", + }, + "hamburger": {"interval": 100, "frames": "โ˜ฑโ˜ฒโ˜ด"}, + "growVertical": { + "interval": 120, + "frames": "โ–โ–ƒโ–„โ–…โ–†โ–‡โ–†โ–…โ–„โ–ƒ", + }, + "growHorizontal": { + "interval": 120, + "frames": "โ–โ–Žโ–โ–Œโ–‹โ–Šโ–‰โ–Šโ–‹โ–Œโ–โ–Ž", + }, + "balloon": {"interval": 140, "frames": " .oO@* "}, + "balloon2": {"interval": 120, "frames": ".oOยฐOo."}, + "noise": {"interval": 100, "frames": "โ–“โ–’โ–‘"}, + "bounce": {"interval": 120, "frames": "โ โ ‚โ „โ ‚"}, + "boxBounce": {"interval": 120, "frames": "โ––โ–˜โ–โ–—"}, + "boxBounce2": {"interval": 100, "frames": "โ–Œโ–€โ–โ–„"}, + "triangle": {"interval": 50, "frames": "โ—ขโ—ฃโ—คโ—ฅ"}, + "arc": {"interval": 100, "frames": "โ—œโ— โ—โ—žโ—กโ—Ÿ"}, + "circle": {"interval": 120, "frames": "โ—กโŠ™โ— "}, + "squareCorners": {"interval": 180, "frames": "โ—ฐโ—ณโ—ฒโ—ฑ"}, + "circleQuarters": {"interval": 120, "frames": "โ—ดโ—ทโ—ถโ—ต"}, + "circleHalves": {"interval": 50, "frames": "โ—โ—“โ—‘โ—’"}, + "squish": {"interval": 100, "frames": "โ•ซโ•ช"}, + "toggle": {"interval": 250, "frames": "โŠถโŠท"}, + "toggle2": {"interval": 80, "frames": "โ–ซโ–ช"}, + "toggle3": {"interval": 120, "frames": "โ–กโ– "}, + "toggle4": {"interval": 100, "frames": "โ– โ–กโ–ชโ–ซ"}, + "toggle5": {"interval": 100, "frames": "โ–ฎโ–ฏ"}, + "toggle6": {"interval": 300, "frames": "แ€แ€"}, + "toggle7": {"interval": 80, "frames": "โฆพโฆฟ"}, + "toggle8": {"interval": 100, "frames": "โ—โ—Œ"}, + "toggle9": {"interval": 100, "frames": "โ—‰โ—Ž"}, + "toggle10": {"interval": 100, "frames": "ใŠ‚ใŠ€ใЁ"}, + "toggle11": {"interval": 50, "frames": "โง‡โง†"}, + "toggle12": {"interval": 120, "frames": "โ˜—โ˜–"}, + "toggle13": {"interval": 80, "frames": "=*-"}, + "arrow": {"interval": 100, "frames": "โ†โ†–โ†‘โ†—โ†’โ†˜โ†“โ†™"}, + "arrow2": { + "interval": 80, + "frames": ["โฌ†๏ธ ", "โ†—๏ธ ", "โžก๏ธ ", "โ†˜๏ธ ", "โฌ‡๏ธ ", "โ†™๏ธ ", "โฌ…๏ธ ", "โ†–๏ธ "], + }, + "arrow3": { + "interval": 120, + "frames": ["โ–นโ–นโ–นโ–นโ–น", "โ–ธโ–นโ–นโ–นโ–น", "โ–นโ–ธโ–นโ–นโ–น", "โ–นโ–นโ–ธโ–นโ–น", "โ–นโ–นโ–นโ–ธโ–น", "โ–นโ–นโ–นโ–นโ–ธ"], + }, + "bouncingBar": { + "interval": 80, + "frames": [ + "[ ]", + "[= ]", + "[== ]", + "[=== ]", + "[ ===]", + "[ ==]", + "[ =]", + "[ ]", + "[ =]", + "[ ==]", + "[ ===]", + "[====]", + "[=== ]", + "[== ]", + "[= ]", + ], + }, + "bouncingBall": { + "interval": 80, + "frames": [ + "( โ— )", + "( โ— )", + "( โ— )", + "( โ— )", + "( โ—)", + "( โ— )", + "( โ— )", + "( โ— )", + "( โ— )", + "(โ— )", + ], + }, + "smiley": {"interval": 200, "frames": ["๐Ÿ˜„ ", "๐Ÿ˜ "]}, + "monkey": {"interval": 300, "frames": ["๐Ÿ™ˆ ", "๐Ÿ™ˆ ", "๐Ÿ™‰ ", "๐Ÿ™Š "]}, + "hearts": {"interval": 100, "frames": ["๐Ÿ’› ", "๐Ÿ’™ ", "๐Ÿ’œ ", "๐Ÿ’š ", "โค๏ธ "]}, + "clock": { + "interval": 100, + "frames": [ + "๐Ÿ•› ", + "๐Ÿ• ", + "๐Ÿ•‘ ", + "๐Ÿ•’ ", + "๐Ÿ•“ ", + "๐Ÿ•” ", + "๐Ÿ•• ", + "๐Ÿ•– ", + "๐Ÿ•— ", + "๐Ÿ•˜ ", + "๐Ÿ•™ ", + "๐Ÿ•š ", + ], + }, + "earth": {"interval": 180, "frames": ["๐ŸŒ ", "๐ŸŒŽ ", "๐ŸŒ "]}, + "material": { + "interval": 17, + "frames": [ + "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", + "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–โ–", + "โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆโ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–ˆ", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + "โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–โ–", + ], + }, + "moon": { + "interval": 80, + "frames": ["๐ŸŒ‘ ", "๐ŸŒ’ ", "๐ŸŒ“ ", "๐ŸŒ” ", "๐ŸŒ• ", "๐ŸŒ– ", "๐ŸŒ— ", "๐ŸŒ˜ "], + }, + "runner": {"interval": 140, "frames": ["๐Ÿšถ ", "๐Ÿƒ "]}, + "pong": { + "interval": 80, + "frames": [ + "โ–โ ‚ โ–Œ", + "โ–โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚โ–Œ", + "โ– โ  โ–Œ", + "โ– โก€โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ– โ   โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ ˆ โ–Œ", + "โ– โ ‚ โ–Œ", + "โ– โ   โ–Œ", + "โ– โก€ โ–Œ", + "โ–โ   โ–Œ", + ], + }, + "shark": { + "interval": 120, + "frames": [ + "โ–|\\____________โ–Œ", + "โ–_|\\___________โ–Œ", + "โ–__|\\__________โ–Œ", + "โ–___|\\_________โ–Œ", + "โ–____|\\________โ–Œ", + "โ–_____|\\_______โ–Œ", + "โ–______|\\______โ–Œ", + "โ–_______|\\_____โ–Œ", + "โ–________|\\____โ–Œ", + "โ–_________|\\___โ–Œ", + "โ–__________|\\__โ–Œ", + "โ–___________|\\_โ–Œ", + "โ–____________|\\โ–Œ", + "โ–____________/|โ–Œ", + "โ–___________/|_โ–Œ", + "โ–__________/|__โ–Œ", + "โ–_________/|___โ–Œ", + "โ–________/|____โ–Œ", + "โ–_______/|_____โ–Œ", + "โ–______/|______โ–Œ", + "โ–_____/|_______โ–Œ", + "โ–____/|________โ–Œ", + "โ–___/|_________โ–Œ", + "โ–__/|__________โ–Œ", + "โ–_/|___________โ–Œ", + "โ–/|____________โ–Œ", + ], + }, + "dqpb": {"interval": 100, "frames": "dqpb"}, + "weather": { + "interval": 100, + "frames": [ + "โ˜€๏ธ ", + "โ˜€๏ธ ", + "โ˜€๏ธ ", + "๐ŸŒค ", + "โ›…๏ธ ", + "๐ŸŒฅ ", + "โ˜๏ธ ", + "๐ŸŒง ", + "๐ŸŒจ ", + "๐ŸŒง ", + "๐ŸŒจ ", + "๐ŸŒง ", + "๐ŸŒจ ", + "โ›ˆ ", + "๐ŸŒจ ", + "๐ŸŒง ", + "๐ŸŒจ ", + "โ˜๏ธ ", + "๐ŸŒฅ ", + "โ›…๏ธ ", + "๐ŸŒค ", + "โ˜€๏ธ ", + "โ˜€๏ธ ", + ], + }, + "christmas": {"interval": 400, "frames": "๐ŸŒฒ๐ŸŽ„"}, + "grenade": { + "interval": 80, + "frames": [ + "ุŒ ", + "โ€ฒ ", + " ยด ", + " โ€พ ", + " โธŒ", + " โธŠ", + " |", + " โŽ", + " โ•", + " เทด ", + " โ“", + " ", + " ", + " ", + ], + }, + "point": {"interval": 125, "frames": ["โˆ™โˆ™โˆ™", "โ—โˆ™โˆ™", "โˆ™โ—โˆ™", "โˆ™โˆ™โ—", "โˆ™โˆ™โˆ™"]}, + "layer": {"interval": 150, "frames": "-=โ‰ก"}, + "betaWave": { + "interval": 80, + "frames": [ + "ฯฮฒฮฒฮฒฮฒฮฒฮฒ", + "ฮฒฯฮฒฮฒฮฒฮฒฮฒ", + "ฮฒฮฒฯฮฒฮฒฮฒฮฒ", + "ฮฒฮฒฮฒฯฮฒฮฒฮฒ", + "ฮฒฮฒฮฒฮฒฯฮฒฮฒ", + "ฮฒฮฒฮฒฮฒฮฒฯฮฒ", + "ฮฒฮฒฮฒฮฒฮฒฮฒฯ", + ], + }, + "aesthetic": { + "interval": 80, + "frames": [ + "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฑ", + "โ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐโ–ฐ", + "โ–ฐโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑโ–ฑ", + ], + }, +} diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py new file mode 100644 index 0000000000000000000000000000000000000000..194564e761ddae165b39ef6598877e2e3820af0a --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_stack.py @@ -0,0 +1,16 @@ +from typing import List, TypeVar + +T = TypeVar("T") + + +class Stack(List[T]): + """A small shim over builtin list.""" + + @property + def top(self) -> T: + """Get top of stack.""" + return self[-1] + + def push(self, item: T) -> None: + """Push an item on to the stack (append in stack nomenclature).""" + self.append(item) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py new file mode 100644 index 0000000000000000000000000000000000000000..5ece05649e7268a75c82de6ced552619ffc093ab --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_windows_renderer.py @@ -0,0 +1,56 @@ +from typing import Iterable, Sequence, Tuple, cast + +from pip._vendor.rich._win32_console import LegacyWindowsTerm, WindowsCoordinates +from pip._vendor.rich.segment import ControlCode, ControlType, Segment + + +def legacy_windows_render(buffer: Iterable[Segment], term: LegacyWindowsTerm) -> None: + """Makes appropriate Windows Console API calls based on the segments in the buffer. + + Args: + buffer (Iterable[Segment]): Iterable of Segments to convert to Win32 API calls. + term (LegacyWindowsTerm): Used to call the Windows Console API. + """ + for text, style, control in buffer: + if not control: + if style: + term.write_styled(text, style) + else: + term.write_text(text) + else: + control_codes: Sequence[ControlCode] = control + for control_code in control_codes: + control_type = control_code[0] + if control_type == ControlType.CURSOR_MOVE_TO: + _, x, y = cast(Tuple[ControlType, int, int], control_code) + term.move_cursor_to(WindowsCoordinates(row=y - 1, col=x - 1)) + elif control_type == ControlType.CARRIAGE_RETURN: + term.write_text("\r") + elif control_type == ControlType.HOME: + term.move_cursor_to(WindowsCoordinates(0, 0)) + elif control_type == ControlType.CURSOR_UP: + term.move_cursor_up() + elif control_type == ControlType.CURSOR_DOWN: + term.move_cursor_down() + elif control_type == ControlType.CURSOR_FORWARD: + term.move_cursor_forward() + elif control_type == ControlType.CURSOR_BACKWARD: + term.move_cursor_backward() + elif control_type == ControlType.CURSOR_MOVE_TO_COLUMN: + _, column = cast(Tuple[ControlType, int], control_code) + term.move_cursor_to_column(column - 1) + elif control_type == ControlType.HIDE_CURSOR: + term.hide_cursor() + elif control_type == ControlType.SHOW_CURSOR: + term.show_cursor() + elif control_type == ControlType.ERASE_IN_LINE: + _, mode = cast(Tuple[ControlType, int], control_code) + if mode == 0: + term.erase_end_of_line() + elif mode == 1: + term.erase_start_of_line() + elif mode == 2: + term.erase_line() + elif control_type == ControlType.SET_WINDOW_TITLE: + _, title = cast(Tuple[ControlType, str], control_code) + term.set_title(title) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py new file mode 100644 index 0000000000000000000000000000000000000000..c45f193f74ad7385c84f3b935663198415cfaa4b --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/_wrap.py @@ -0,0 +1,56 @@ +import re +from typing import Iterable, List, Tuple + +from ._loop import loop_last +from .cells import cell_len, chop_cells + +re_word = re.compile(r"\s*\S+\s*") + + +def words(text: str) -> Iterable[Tuple[int, int, str]]: + position = 0 + word_match = re_word.match(text, position) + while word_match is not None: + start, end = word_match.span() + word = word_match.group(0) + yield start, end, word + word_match = re_word.match(text, end) + + +def divide_line(text: str, width: int, fold: bool = True) -> List[int]: + divides: List[int] = [] + append = divides.append + line_position = 0 + _cell_len = cell_len + for start, _end, word in words(text): + word_length = _cell_len(word.rstrip()) + if line_position + word_length > width: + if word_length > width: + if fold: + chopped_words = chop_cells(word, max_size=width, position=0) + for last, line in loop_last(chopped_words): + if start: + append(start) + + if last: + line_position = _cell_len(line) + else: + start += len(line) + else: + if start: + append(start) + line_position = _cell_len(word) + elif line_position and start: + append(start) + line_position = _cell_len(word) + else: + line_position += _cell_len(word) + return divides + + +if __name__ == "__main__": # pragma: no cover + from .console import Console + + console = Console(width=10) + console.print("12345 abcdefghijklmnopqrstuvwyxzABCDEFGHIJKLMNOPQRSTUVWXYZ 12345") + print(chop_cells("abcdefghijklmnopqrstuvwxyz", 10, position=2)) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py new file mode 100644 index 0000000000000000000000000000000000000000..66365e6536080bd9372d2a7a58b8ffa3447fec34 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/ansi.py @@ -0,0 +1,240 @@ +import re +import sys +from contextlib import suppress +from typing import Iterable, NamedTuple, Optional + +from .color import Color +from .style import Style +from .text import Text + +re_ansi = re.compile( + r""" +(?:\x1b\](.*?)\x1b\\)| +(?:\x1b([(@-Z\\-_]|\[[0-?]*[ -/]*[@-~])) +""", + re.VERBOSE, +) + + +class _AnsiToken(NamedTuple): + """Result of ansi tokenized string.""" + + plain: str = "" + sgr: Optional[str] = "" + osc: Optional[str] = "" + + +def _ansi_tokenize(ansi_text: str) -> Iterable[_AnsiToken]: + """Tokenize a string in to plain text and ANSI codes. + + Args: + ansi_text (str): A String containing ANSI codes. + + Yields: + AnsiToken: A named tuple of (plain, sgr, osc) + """ + + position = 0 + sgr: Optional[str] + osc: Optional[str] + for match in re_ansi.finditer(ansi_text): + start, end = match.span(0) + osc, sgr = match.groups() + if start > position: + yield _AnsiToken(ansi_text[position:start]) + if sgr: + if sgr == "(": + position = end + 1 + continue + if sgr.endswith("m"): + yield _AnsiToken("", sgr[1:-1], osc) + else: + yield _AnsiToken("", sgr, osc) + position = end + if position < len(ansi_text): + yield _AnsiToken(ansi_text[position:]) + + +SGR_STYLE_MAP = { + 1: "bold", + 2: "dim", + 3: "italic", + 4: "underline", + 5: "blink", + 6: "blink2", + 7: "reverse", + 8: "conceal", + 9: "strike", + 21: "underline2", + 22: "not dim not bold", + 23: "not italic", + 24: "not underline", + 25: "not blink", + 26: "not blink2", + 27: "not reverse", + 28: "not conceal", + 29: "not strike", + 30: "color(0)", + 31: "color(1)", + 32: "color(2)", + 33: "color(3)", + 34: "color(4)", + 35: "color(5)", + 36: "color(6)", + 37: "color(7)", + 39: "default", + 40: "on color(0)", + 41: "on color(1)", + 42: "on color(2)", + 43: "on color(3)", + 44: "on color(4)", + 45: "on color(5)", + 46: "on color(6)", + 47: "on color(7)", + 49: "on default", + 51: "frame", + 52: "encircle", + 53: "overline", + 54: "not frame not encircle", + 55: "not overline", + 90: "color(8)", + 91: "color(9)", + 92: "color(10)", + 93: "color(11)", + 94: "color(12)", + 95: "color(13)", + 96: "color(14)", + 97: "color(15)", + 100: "on color(8)", + 101: "on color(9)", + 102: "on color(10)", + 103: "on color(11)", + 104: "on color(12)", + 105: "on color(13)", + 106: "on color(14)", + 107: "on color(15)", +} + + +class AnsiDecoder: + """Translate ANSI code in to styled Text.""" + + def __init__(self) -> None: + self.style = Style.null() + + def decode(self, terminal_text: str) -> Iterable[Text]: + """Decode ANSI codes in an iterable of lines. + + Args: + lines (Iterable[str]): An iterable of lines of terminal output. + + Yields: + Text: Marked up Text. + """ + for line in terminal_text.splitlines(): + yield self.decode_line(line) + + def decode_line(self, line: str) -> Text: + """Decode a line containing ansi codes. + + Args: + line (str): A line of terminal output. + + Returns: + Text: A Text instance marked up according to ansi codes. + """ + from_ansi = Color.from_ansi + from_rgb = Color.from_rgb + _Style = Style + text = Text() + append = text.append + line = line.rsplit("\r", 1)[-1] + for plain_text, sgr, osc in _ansi_tokenize(line): + if plain_text: + append(plain_text, self.style or None) + elif osc is not None: + if osc.startswith("8;"): + _params, semicolon, link = osc[2:].partition(";") + if semicolon: + self.style = self.style.update_link(link or None) + elif sgr is not None: + # Translate in to semi-colon separated codes + # Ignore invalid codes, because we want to be lenient + codes = [ + min(255, int(_code) if _code else 0) + for _code in sgr.split(";") + if _code.isdigit() or _code == "" + ] + iter_codes = iter(codes) + for code in iter_codes: + if code == 0: + # reset + self.style = _Style.null() + elif code in SGR_STYLE_MAP: + # styles + self.style += _Style.parse(SGR_STYLE_MAP[code]) + elif code == 38: + # ย Foreground + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ) + ) + elif code == 48: + # Background + with suppress(StopIteration): + color_type = next(iter_codes) + if color_type == 5: + self.style += _Style.from_color( + None, from_ansi(next(iter_codes)) + ) + elif color_type == 2: + self.style += _Style.from_color( + None, + from_rgb( + next(iter_codes), + next(iter_codes), + next(iter_codes), + ), + ) + + return text + + +if sys.platform != "win32" and __name__ == "__main__": # pragma: no cover + import io + import os + import pty + import sys + + decoder = AnsiDecoder() + + stdout = io.BytesIO() + + def read(fd: int) -> bytes: + data = os.read(fd, 1024) + stdout.write(data) + return data + + pty.spawn(sys.argv[1:], read) + + from .console import Console + + console = Console(record=True) + + stdout_result = stdout.getvalue().decode("utf-8") + print(stdout_result) + + for line in decoder.decode(stdout_result): + console.print(line) + + console.save_html("stdout.html") diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py new file mode 100644 index 0000000000000000000000000000000000000000..dfe455937c86b5b7cc83f5506ae0f7010bece1b1 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/color.py @@ -0,0 +1,622 @@ +import platform +import re +from colorsys import rgb_to_hls +from enum import IntEnum +from functools import lru_cache +from typing import TYPE_CHECKING, NamedTuple, Optional, Tuple + +from ._palettes import EIGHT_BIT_PALETTE, STANDARD_PALETTE, WINDOWS_PALETTE +from .color_triplet import ColorTriplet +from .repr import Result, rich_repr +from .terminal_theme import DEFAULT_TERMINAL_THEME + +if TYPE_CHECKING: # pragma: no cover + from .terminal_theme import TerminalTheme + from .text import Text + + +WINDOWS = platform.system() == "Windows" + + +class ColorSystem(IntEnum): + """One of the 3 color system supported by terminals.""" + + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorSystem.{self.name}" + + def __str__(self) -> str: + return repr(self) + + +class ColorType(IntEnum): + """Type of color stored in Color class.""" + + DEFAULT = 0 + STANDARD = 1 + EIGHT_BIT = 2 + TRUECOLOR = 3 + WINDOWS = 4 + + def __repr__(self) -> str: + return f"ColorType.{self.name}" + + +ANSI_COLOR_NAMES = { + "black": 0, + "red": 1, + "green": 2, + "yellow": 3, + "blue": 4, + "magenta": 5, + "cyan": 6, + "white": 7, + "bright_black": 8, + "bright_red": 9, + "bright_green": 10, + "bright_yellow": 11, + "bright_blue": 12, + "bright_magenta": 13, + "bright_cyan": 14, + "bright_white": 15, + "grey0": 16, + "gray0": 16, + "navy_blue": 17, + "dark_blue": 18, + "blue3": 20, + "blue1": 21, + "dark_green": 22, + "deep_sky_blue4": 25, + "dodger_blue3": 26, + "dodger_blue2": 27, + "green4": 28, + "spring_green4": 29, + "turquoise4": 30, + "deep_sky_blue3": 32, + "dodger_blue1": 33, + "green3": 40, + "spring_green3": 41, + "dark_cyan": 36, + "light_sea_green": 37, + "deep_sky_blue2": 38, + "deep_sky_blue1": 39, + "spring_green2": 47, + "cyan3": 43, + "dark_turquoise": 44, + "turquoise2": 45, + "green1": 46, + "spring_green1": 48, + "medium_spring_green": 49, + "cyan2": 50, + "cyan1": 51, + "dark_red": 88, + "deep_pink4": 125, + "purple4": 55, + "purple3": 56, + "blue_violet": 57, + "orange4": 94, + "grey37": 59, + "gray37": 59, + "medium_purple4": 60, + "slate_blue3": 62, + "royal_blue1": 63, + "chartreuse4": 64, + "dark_sea_green4": 71, + "pale_turquoise4": 66, + "steel_blue": 67, + "steel_blue3": 68, + "cornflower_blue": 69, + "chartreuse3": 76, + "cadet_blue": 73, + "sky_blue3": 74, + "steel_blue1": 81, + "pale_green3": 114, + "sea_green3": 78, + "aquamarine3": 79, + "medium_turquoise": 80, + "chartreuse2": 112, + "sea_green2": 83, + "sea_green1": 85, + "aquamarine1": 122, + "dark_slate_gray2": 87, + "dark_magenta": 91, + "dark_violet": 128, + "purple": 129, + "light_pink4": 95, + "plum4": 96, + "medium_purple3": 98, + "slate_blue1": 99, + "yellow4": 106, + "wheat4": 101, + "grey53": 102, + "gray53": 102, + "light_slate_grey": 103, + "light_slate_gray": 103, + "medium_purple": 104, + "light_slate_blue": 105, + "dark_olive_green3": 149, + "dark_sea_green": 108, + "light_sky_blue3": 110, + "sky_blue2": 111, + "dark_sea_green3": 150, + "dark_slate_gray3": 116, + "sky_blue1": 117, + "chartreuse1": 118, + "light_green": 120, + "pale_green1": 156, + "dark_slate_gray1": 123, + "red3": 160, + "medium_violet_red": 126, + "magenta3": 164, + "dark_orange3": 166, + "indian_red": 167, + "hot_pink3": 168, + "medium_orchid3": 133, + "medium_orchid": 134, + "medium_purple2": 140, + "dark_goldenrod": 136, + "light_salmon3": 173, + "rosy_brown": 138, + "grey63": 139, + "gray63": 139, + "medium_purple1": 141, + "gold3": 178, + "dark_khaki": 143, + "navajo_white3": 144, + "grey69": 145, + "gray69": 145, + "light_steel_blue3": 146, + "light_steel_blue": 147, + "yellow3": 184, + "dark_sea_green2": 157, + "light_cyan3": 152, + "light_sky_blue1": 153, + "green_yellow": 154, + "dark_olive_green2": 155, + "dark_sea_green1": 193, + "pale_turquoise1": 159, + "deep_pink3": 162, + "magenta2": 200, + "hot_pink2": 169, + "orchid": 170, + "medium_orchid1": 207, + "orange3": 172, + "light_pink3": 174, + "pink3": 175, + "plum3": 176, + "violet": 177, + "light_goldenrod3": 179, + "tan": 180, + "misty_rose3": 181, + "thistle3": 182, + "plum2": 183, + "khaki3": 185, + "light_goldenrod2": 222, + "light_yellow3": 187, + "grey84": 188, + "gray84": 188, + "light_steel_blue1": 189, + "yellow2": 190, + "dark_olive_green1": 192, + "honeydew2": 194, + "light_cyan1": 195, + "red1": 196, + "deep_pink2": 197, + "deep_pink1": 199, + "magenta1": 201, + "orange_red1": 202, + "indian_red1": 204, + "hot_pink": 206, + "dark_orange": 208, + "salmon1": 209, + "light_coral": 210, + "pale_violet_red1": 211, + "orchid2": 212, + "orchid1": 213, + "orange1": 214, + "sandy_brown": 215, + "light_salmon1": 216, + "light_pink1": 217, + "pink1": 218, + "plum1": 219, + "gold1": 220, + "navajo_white1": 223, + "misty_rose1": 224, + "thistle1": 225, + "yellow1": 226, + "light_goldenrod1": 227, + "khaki1": 228, + "wheat1": 229, + "cornsilk1": 230, + "grey100": 231, + "gray100": 231, + "grey3": 232, + "gray3": 232, + "grey7": 233, + "gray7": 233, + "grey11": 234, + "gray11": 234, + "grey15": 235, + "gray15": 235, + "grey19": 236, + "gray19": 236, + "grey23": 237, + "gray23": 237, + "grey27": 238, + "gray27": 238, + "grey30": 239, + "gray30": 239, + "grey35": 240, + "gray35": 240, + "grey39": 241, + "gray39": 241, + "grey42": 242, + "gray42": 242, + "grey46": 243, + "gray46": 243, + "grey50": 244, + "gray50": 244, + "grey54": 245, + "gray54": 245, + "grey58": 246, + "gray58": 246, + "grey62": 247, + "gray62": 247, + "grey66": 248, + "gray66": 248, + "grey70": 249, + "gray70": 249, + "grey74": 250, + "gray74": 250, + "grey78": 251, + "gray78": 251, + "grey82": 252, + "gray82": 252, + "grey85": 253, + "gray85": 253, + "grey89": 254, + "gray89": 254, + "grey93": 255, + "gray93": 255, +} + + +class ColorParseError(Exception): + """The color could not be parsed.""" + + +RE_COLOR = re.compile( + r"""^ +\#([0-9a-f]{6})$| +color\(([0-9]{1,3})\)$| +rgb\(([\d\s,]+)\)$ +""", + re.VERBOSE, +) + + +@rich_repr +class Color(NamedTuple): + """Terminal color definition.""" + + name: str + """The name of the color (typically the input to Color.parse).""" + type: ColorType + """The type of the color.""" + number: Optional[int] = None + """The color number, if a standard color, or None.""" + triplet: Optional[ColorTriplet] = None + """A triplet of color components, if an RGB color.""" + + def __rich__(self) -> "Text": + """Displays the actual color if Rich printed.""" + from .style import Style + from .text import Text + + return Text.assemble( + f"", + ) + + def __rich_repr__(self) -> Result: + yield self.name + yield self.type + yield "number", self.number, None + yield "triplet", self.triplet, None + + @property + def system(self) -> ColorSystem: + """Get the native color system for this color.""" + if self.type == ColorType.DEFAULT: + return ColorSystem.STANDARD + return ColorSystem(int(self.type)) + + @property + def is_system_defined(self) -> bool: + """Check if the color is ultimately defined by the system.""" + return self.system not in (ColorSystem.EIGHT_BIT, ColorSystem.TRUECOLOR) + + @property + def is_default(self) -> bool: + """Check if the color is a default color.""" + return self.type == ColorType.DEFAULT + + def get_truecolor( + self, theme: Optional["TerminalTheme"] = None, foreground: bool = True + ) -> ColorTriplet: + """Get an equivalent color triplet for this color. + + Args: + theme (TerminalTheme, optional): Optional terminal theme, or None to use default. Defaults to None. + foreground (bool, optional): True for a foreground color, or False for background. Defaults to True. + + Returns: + ColorTriplet: A color triplet containing RGB components. + """ + + if theme is None: + theme = DEFAULT_TERMINAL_THEME + if self.type == ColorType.TRUECOLOR: + assert self.triplet is not None + return self.triplet + elif self.type == ColorType.EIGHT_BIT: + assert self.number is not None + return EIGHT_BIT_PALETTE[self.number] + elif self.type == ColorType.STANDARD: + assert self.number is not None + return theme.ansi_colors[self.number] + elif self.type == ColorType.WINDOWS: + assert self.number is not None + return WINDOWS_PALETTE[self.number] + else: # self.type == ColorType.DEFAULT: + assert self.number is None + return theme.foreground_color if foreground else theme.background_color + + @classmethod + def from_ansi(cls, number: int) -> "Color": + """Create a Color number from it's 8-bit ansi number. + + Args: + number (int): A number between 0-255 inclusive. + + Returns: + Color: A new Color instance. + """ + return cls( + name=f"color({number})", + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + @classmethod + def from_triplet(cls, triplet: "ColorTriplet") -> "Color": + """Create a truecolor RGB color from a triplet of values. + + Args: + triplet (ColorTriplet): A color triplet containing red, green and blue components. + + Returns: + Color: A new color object. + """ + return cls(name=triplet.hex, type=ColorType.TRUECOLOR, triplet=triplet) + + @classmethod + def from_rgb(cls, red: float, green: float, blue: float) -> "Color": + """Create a truecolor from three color components in the range(0->255). + + Args: + red (float): Red component in range 0-255. + green (float): Green component in range 0-255. + blue (float): Blue component in range 0-255. + + Returns: + Color: A new color object. + """ + return cls.from_triplet(ColorTriplet(int(red), int(green), int(blue))) + + @classmethod + def default(cls) -> "Color": + """Get a Color instance representing the default color. + + Returns: + Color: Default color. + """ + return cls(name="default", type=ColorType.DEFAULT) + + @classmethod + @lru_cache(maxsize=1024) + def parse(cls, color: str) -> "Color": + """Parse a color definition.""" + original_color = color + color = color.lower().strip() + + if color == "default": + return cls(color, type=ColorType.DEFAULT) + + color_number = ANSI_COLOR_NAMES.get(color) + if color_number is not None: + return cls( + color, + type=(ColorType.STANDARD if color_number < 16 else ColorType.EIGHT_BIT), + number=color_number, + ) + + color_match = RE_COLOR.match(color) + if color_match is None: + raise ColorParseError(f"{original_color!r} is not a valid color") + + color_24, color_8, color_rgb = color_match.groups() + if color_24: + triplet = ColorTriplet( + int(color_24[0:2], 16), int(color_24[2:4], 16), int(color_24[4:6], 16) + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + elif color_8: + number = int(color_8) + if number > 255: + raise ColorParseError(f"color number must be <= 255 in {color!r}") + return cls( + color, + type=(ColorType.STANDARD if number < 16 else ColorType.EIGHT_BIT), + number=number, + ) + + else: # color_rgb: + components = color_rgb.split(",") + if len(components) != 3: + raise ColorParseError( + f"expected three components in {original_color!r}" + ) + red, green, blue = components + triplet = ColorTriplet(int(red), int(green), int(blue)) + if not all(component <= 255 for component in triplet): + raise ColorParseError( + f"color components must be <= 255 in {original_color!r}" + ) + return cls(color, ColorType.TRUECOLOR, triplet=triplet) + + @lru_cache(maxsize=1024) + def get_ansi_codes(self, foreground: bool = True) -> Tuple[str, ...]: + """Get the ANSI escape codes for this color.""" + _type = self.type + if _type == ColorType.DEFAULT: + return ("39" if foreground else "49",) + + elif _type == ColorType.WINDOWS: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.STANDARD: + number = self.number + assert number is not None + fore, back = (30, 40) if number < 8 else (82, 92) + return (str(fore + number if foreground else back + number),) + + elif _type == ColorType.EIGHT_BIT: + assert self.number is not None + return ("38" if foreground else "48", "5", str(self.number)) + + else: # self.standard == ColorStandard.TRUECOLOR: + assert self.triplet is not None + red, green, blue = self.triplet + return ("38" if foreground else "48", "2", str(red), str(green), str(blue)) + + @lru_cache(maxsize=1024) + def downgrade(self, system: ColorSystem) -> "Color": + """Downgrade a color system to a system with fewer colors.""" + + if self.type in (ColorType.DEFAULT, system): + return self + # Convert to 8-bit color from truecolor color + if system == ColorSystem.EIGHT_BIT and self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + _h, l, s = rgb_to_hls(*self.triplet.normalized) + # If saturation is under 15% assume it is grayscale + if s < 0.15: + gray = round(l * 25.0) + if gray == 0: + color_number = 16 + elif gray == 25: + color_number = 231 + else: + color_number = 231 + gray + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + red, green, blue = self.triplet + six_red = red / 95 if red < 95 else 1 + (red - 95) / 40 + six_green = green / 95 if green < 95 else 1 + (green - 95) / 40 + six_blue = blue / 95 if blue < 95 else 1 + (blue - 95) / 40 + + color_number = ( + 16 + 36 * round(six_red) + 6 * round(six_green) + round(six_blue) + ) + return Color(self.name, ColorType.EIGHT_BIT, number=color_number) + + # Convert to standard from truecolor or 8-bit + elif system == ColorSystem.STANDARD: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = STANDARD_PALETTE.match(triplet) + return Color(self.name, ColorType.STANDARD, number=color_number) + + elif system == ColorSystem.WINDOWS: + if self.system == ColorSystem.TRUECOLOR: + assert self.triplet is not None + triplet = self.triplet + else: # self.system == ColorSystem.EIGHT_BIT + assert self.number is not None + if self.number < 16: + return Color(self.name, ColorType.WINDOWS, number=self.number) + triplet = ColorTriplet(*EIGHT_BIT_PALETTE[self.number]) + + color_number = WINDOWS_PALETTE.match(triplet) + return Color(self.name, ColorType.WINDOWS, number=color_number) + + return self + + +def parse_rgb_hex(hex_color: str) -> ColorTriplet: + """Parse six hex characters in to RGB triplet.""" + assert len(hex_color) == 6, "must be 6 characters" + color = ColorTriplet( + int(hex_color[0:2], 16), int(hex_color[2:4], 16), int(hex_color[4:6], 16) + ) + return color + + +def blend_rgb( + color1: ColorTriplet, color2: ColorTriplet, cross_fade: float = 0.5 +) -> ColorTriplet: + """Blend one RGB color in to another.""" + r1, g1, b1 = color1 + r2, g2, b2 = color2 + new_color = ColorTriplet( + int(r1 + (r2 - r1) * cross_fade), + int(g1 + (g2 - g1) * cross_fade), + int(b1 + (b2 - b1) * cross_fade), + ) + return new_color + + +if __name__ == "__main__": # pragma: no cover + + from .console import Console + from .table import Table + from .text import Text + + console = Console() + + table = Table(show_footer=False, show_edge=True) + table.add_column("Color", width=10, overflow="ellipsis") + table.add_column("Number", justify="right", style="yellow") + table.add_column("Name", style="green") + table.add_column("Hex", style="blue") + table.add_column("RGB", style="magenta") + + colors = sorted((v, k) for k, v in ANSI_COLOR_NAMES.items()) + for color_number, name in colors: + if "grey" in name: + continue + color_cell = Text(" " * 10, style=f"on {name}") + if color_number < 16: + table.add_row(color_cell, f"{color_number}", Text(f'"{name}"')) + else: + color = EIGHT_BIT_PALETTE[color_number] # type: ignore[has-type] + table.add_row( + color_cell, str(color_number), Text(f'"{name}"'), color.hex, color.rgb + ) + + console.print(table) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py new file mode 100644 index 0000000000000000000000000000000000000000..02cab328251af9bfa809981aaa44933c407e2cd7 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/color_triplet.py @@ -0,0 +1,38 @@ +from typing import NamedTuple, Tuple + + +class ColorTriplet(NamedTuple): + """The red, green, and blue components of a color.""" + + red: int + """Red component in 0 to 255 range.""" + green: int + """Green component in 0 to 255 range.""" + blue: int + """Blue component in 0 to 255 range.""" + + @property + def hex(self) -> str: + """get the color triplet in CSS style.""" + red, green, blue = self + return f"#{red:02x}{green:02x}{blue:02x}" + + @property + def rgb(self) -> str: + """The color in RGB format. + + Returns: + str: An rgb color, e.g. ``"rgb(100,23,255)"``. + """ + red, green, blue = self + return f"rgb({red},{green},{blue})" + + @property + def normalized(self) -> Tuple[float, float, float]: + """Convert components into floats between 0 and 1. + + Returns: + Tuple[float, float, float]: A tuple of three normalized colour components. + """ + red, green, blue = self + return red / 255.0, green / 255.0, blue / 255.0 diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py new file mode 100644 index 0000000000000000000000000000000000000000..e559cbb43c18392606d1212cfbde76339719a6a0 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/console.py @@ -0,0 +1,2633 @@ +import inspect +import os +import platform +import sys +import threading +import zlib +from abc import ABC, abstractmethod +from dataclasses import dataclass, field +from datetime import datetime +from functools import wraps +from getpass import getpass +from html import escape +from inspect import isclass +from itertools import islice +from math import ceil +from time import monotonic +from types import FrameType, ModuleType, TracebackType +from typing import ( + IO, + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterable, + List, + Mapping, + NamedTuple, + Optional, + TextIO, + Tuple, + Type, + Union, + cast, +) + +from pip._vendor.rich._null_file import NULL_FILE + +if sys.version_info >= (3, 8): + from typing import Literal, Protocol, runtime_checkable +else: + from pip._vendor.typing_extensions import ( + Literal, + Protocol, + runtime_checkable, + ) # pragma: no cover + +from . import errors, themes +from ._emoji_replace import _emoji_replace +from ._export_format import CONSOLE_HTML_FORMAT, CONSOLE_SVG_FORMAT +from ._fileno import get_fileno +from ._log_render import FormatTimeCallable, LogRender +from .align import Align, AlignMethod +from .color import ColorSystem, blend_rgb +from .control import Control +from .emoji import EmojiVariant +from .highlighter import NullHighlighter, ReprHighlighter +from .markup import render as render_markup +from .measure import Measurement, measure_renderables +from .pager import Pager, SystemPager +from .pretty import Pretty, is_expandable +from .protocol import rich_cast +from .region import Region +from .scope import render_scope +from .screen import Screen +from .segment import Segment +from .style import Style, StyleType +from .styled import Styled +from .terminal_theme import DEFAULT_TERMINAL_THEME, SVG_EXPORT_THEME, TerminalTheme +from .text import Text, TextType +from .theme import Theme, ThemeStack + +if TYPE_CHECKING: + from ._windows import WindowsConsoleFeatures + from .live import Live + from .status import Status + +JUPYTER_DEFAULT_COLUMNS = 115 +JUPYTER_DEFAULT_LINES = 100 +WINDOWS = platform.system() == "Windows" + +HighlighterType = Callable[[Union[str, "Text"]], "Text"] +JustifyMethod = Literal["default", "left", "center", "right", "full"] +OverflowMethod = Literal["fold", "crop", "ellipsis", "ignore"] + + +class NoChange: + pass + + +NO_CHANGE = NoChange() + +try: + _STDIN_FILENO = sys.__stdin__.fileno() +except Exception: + _STDIN_FILENO = 0 +try: + _STDOUT_FILENO = sys.__stdout__.fileno() +except Exception: + _STDOUT_FILENO = 1 +try: + _STDERR_FILENO = sys.__stderr__.fileno() +except Exception: + _STDERR_FILENO = 2 + +_STD_STREAMS = (_STDIN_FILENO, _STDOUT_FILENO, _STDERR_FILENO) +_STD_STREAMS_OUTPUT = (_STDOUT_FILENO, _STDERR_FILENO) + + +_TERM_COLORS = { + "kitty": ColorSystem.EIGHT_BIT, + "256color": ColorSystem.EIGHT_BIT, + "16color": ColorSystem.STANDARD, +} + + +class ConsoleDimensions(NamedTuple): + """Size of the terminal.""" + + width: int + """The width of the console in 'cells'.""" + height: int + """The height of the console in lines.""" + + +@dataclass +class ConsoleOptions: + """Options for __rich_console__ method.""" + + size: ConsoleDimensions + """Size of console.""" + legacy_windows: bool + """legacy_windows: flag for legacy windows.""" + min_width: int + """Minimum width of renderable.""" + max_width: int + """Maximum width of renderable.""" + is_terminal: bool + """True if the target is a terminal, otherwise False.""" + encoding: str + """Encoding of terminal.""" + max_height: int + """Height of container (starts as terminal)""" + justify: Optional[JustifyMethod] = None + """Justify value override for renderable.""" + overflow: Optional[OverflowMethod] = None + """Overflow value override for renderable.""" + no_wrap: Optional[bool] = False + """Disable wrapping for text.""" + highlight: Optional[bool] = None + """Highlight override for render_str.""" + markup: Optional[bool] = None + """Enable markup when rendering strings.""" + height: Optional[int] = None + + @property + def ascii_only(self) -> bool: + """Check if renderables should use ascii only.""" + return not self.encoding.startswith("utf") + + def copy(self) -> "ConsoleOptions": + """Return a copy of the options. + + Returns: + ConsoleOptions: a copy of self. + """ + options: ConsoleOptions = ConsoleOptions.__new__(ConsoleOptions) + options.__dict__ = self.__dict__.copy() + return options + + def update( + self, + *, + width: Union[int, NoChange] = NO_CHANGE, + min_width: Union[int, NoChange] = NO_CHANGE, + max_width: Union[int, NoChange] = NO_CHANGE, + justify: Union[Optional[JustifyMethod], NoChange] = NO_CHANGE, + overflow: Union[Optional[OverflowMethod], NoChange] = NO_CHANGE, + no_wrap: Union[Optional[bool], NoChange] = NO_CHANGE, + highlight: Union[Optional[bool], NoChange] = NO_CHANGE, + markup: Union[Optional[bool], NoChange] = NO_CHANGE, + height: Union[Optional[int], NoChange] = NO_CHANGE, + ) -> "ConsoleOptions": + """Update values, return a copy.""" + options = self.copy() + if not isinstance(width, NoChange): + options.min_width = options.max_width = max(0, width) + if not isinstance(min_width, NoChange): + options.min_width = min_width + if not isinstance(max_width, NoChange): + options.max_width = max_width + if not isinstance(justify, NoChange): + options.justify = justify + if not isinstance(overflow, NoChange): + options.overflow = overflow + if not isinstance(no_wrap, NoChange): + options.no_wrap = no_wrap + if not isinstance(highlight, NoChange): + options.highlight = highlight + if not isinstance(markup, NoChange): + options.markup = markup + if not isinstance(height, NoChange): + if height is not None: + options.max_height = height + options.height = None if height is None else max(0, height) + return options + + def update_width(self, width: int) -> "ConsoleOptions": + """Update just the width, return a copy. + + Args: + width (int): New width (sets both min_width and max_width) + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + return options + + def update_height(self, height: int) -> "ConsoleOptions": + """Update the height, and return a copy. + + Args: + height (int): New height + + Returns: + ~ConsoleOptions: New Console options instance. + """ + options = self.copy() + options.max_height = options.height = height + return options + + def reset_height(self) -> "ConsoleOptions": + """Return a copy of the options with height set to ``None``. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.height = None + return options + + def update_dimensions(self, width: int, height: int) -> "ConsoleOptions": + """Update the width and height, and return a copy. + + Args: + width (int): New width (sets both min_width and max_width). + height (int): New height. + + Returns: + ~ConsoleOptions: New console options instance. + """ + options = self.copy() + options.min_width = options.max_width = max(0, width) + options.height = options.max_height = height + return options + + +@runtime_checkable +class RichCast(Protocol): + """An object that may be 'cast' to a console renderable.""" + + def __rich__( + self, + ) -> Union["ConsoleRenderable", "RichCast", str]: # pragma: no cover + ... + + +@runtime_checkable +class ConsoleRenderable(Protocol): + """An object that supports the console protocol.""" + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": # pragma: no cover + ... + + +# A type that may be rendered by Console. +RenderableType = Union[ConsoleRenderable, RichCast, str] + +# The result of calling a __rich_console__ method. +RenderResult = Iterable[Union[RenderableType, Segment]] + +_null_highlighter = NullHighlighter() + + +class CaptureError(Exception): + """An error in the Capture context manager.""" + + +class NewLine: + """A renderable to generate new line(s)""" + + def __init__(self, count: int = 1) -> None: + self.count = count + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> Iterable[Segment]: + yield Segment("\n" * self.count) + + +class ScreenUpdate: + """Render a list of lines at a given offset.""" + + def __init__(self, lines: List[List[Segment]], x: int, y: int) -> None: + self._lines = lines + self.x = x + self.y = y + + def __rich_console__( + self, console: "Console", options: ConsoleOptions + ) -> RenderResult: + x = self.x + move_to = Control.move_to + for offset, line in enumerate(self._lines, self.y): + yield move_to(x, offset) + yield from line + + +class Capture: + """Context manager to capture the result of printing to the console. + See :meth:`~rich.console.Console.capture` for how to use. + + Args: + console (Console): A console instance to capture output. + """ + + def __init__(self, console: "Console") -> None: + self._console = console + self._result: Optional[str] = None + + def __enter__(self) -> "Capture": + self._console.begin_capture() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self._result = self._console.end_capture() + + def get(self) -> str: + """Get the result of the capture.""" + if self._result is None: + raise CaptureError( + "Capture result is not available until context manager exits." + ) + return self._result + + +class ThemeContext: + """A context manager to use a temporary theme. See :meth:`~rich.console.Console.use_theme` for usage.""" + + def __init__(self, console: "Console", theme: Theme, inherit: bool = True) -> None: + self.console = console + self.theme = theme + self.inherit = inherit + + def __enter__(self) -> "ThemeContext": + self.console.push_theme(self.theme) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + self.console.pop_theme() + + +class PagerContext: + """A context manager that 'pages' content. See :meth:`~rich.console.Console.pager` for usage.""" + + def __init__( + self, + console: "Console", + pager: Optional[Pager] = None, + styles: bool = False, + links: bool = False, + ) -> None: + self._console = console + self.pager = SystemPager() if pager is None else pager + self.styles = styles + self.links = links + + def __enter__(self) -> "PagerContext": + self._console._enter_buffer() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if exc_type is None: + with self._console._lock: + buffer: List[Segment] = self._console._buffer[:] + del self._console._buffer[:] + segments: Iterable[Segment] = buffer + if not self.styles: + segments = Segment.strip_styles(segments) + elif not self.links: + segments = Segment.strip_links(segments) + content = self._console._render_buffer(segments) + self.pager.show(content) + self._console._exit_buffer() + + +class ScreenContext: + """A context manager that enables an alternative screen. See :meth:`~rich.console.Console.screen` for usage.""" + + def __init__( + self, console: "Console", hide_cursor: bool, style: StyleType = "" + ) -> None: + self.console = console + self.hide_cursor = hide_cursor + self.screen = Screen(style=style) + self._changed = False + + def update( + self, *renderables: RenderableType, style: Optional[StyleType] = None + ) -> None: + """Update the screen. + + Args: + renderable (RenderableType, optional): Optional renderable to replace current renderable, + or None for no change. Defaults to None. + style: (Style, optional): Replacement style, or None for no change. Defaults to None. + """ + if renderables: + self.screen.renderable = ( + Group(*renderables) if len(renderables) > 1 else renderables[0] + ) + if style is not None: + self.screen.style = style + self.console.print(self.screen, end="") + + def __enter__(self) -> "ScreenContext": + self._changed = self.console.set_alt_screen(True) + if self._changed and self.hide_cursor: + self.console.show_cursor(False) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + if self._changed: + self.console.set_alt_screen(False) + if self.hide_cursor: + self.console.show_cursor(True) + + +class Group: + """Takes a group of renderables and returns a renderable object that renders the group. + + Args: + renderables (Iterable[RenderableType]): An iterable of renderable objects. + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def __init__(self, *renderables: "RenderableType", fit: bool = True) -> None: + self._renderables = renderables + self.fit = fit + self._render: Optional[List[RenderableType]] = None + + @property + def renderables(self) -> List["RenderableType"]: + if self._render is None: + self._render = list(self._renderables) + return self._render + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.fit: + return measure_renderables(console, options, self.renderables) + else: + return Measurement(options.max_width, options.max_width) + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> RenderResult: + yield from self.renderables + + +def group(fit: bool = True) -> Callable[..., Callable[..., Group]]: + """A decorator that turns an iterable of renderables in to a group. + + Args: + fit (bool, optional): Fit dimension of group to contents, or fill available space. Defaults to True. + """ + + def decorator( + method: Callable[..., Iterable[RenderableType]] + ) -> Callable[..., Group]: + """Convert a method that returns an iterable of renderables in to a Group.""" + + @wraps(method) + def _replace(*args: Any, **kwargs: Any) -> Group: + renderables = method(*args, **kwargs) + return Group(*renderables, fit=fit) + + return _replace + + return decorator + + +def _is_jupyter() -> bool: # pragma: no cover + """Check if we're running in a Jupyter notebook.""" + try: + get_ipython # type: ignore[name-defined] + except NameError: + return False + ipython = get_ipython() # type: ignore[name-defined] + shell = ipython.__class__.__name__ + if ( + "google.colab" in str(ipython.__class__) + or os.getenv("DATABRICKS_RUNTIME_VERSION") + or shell == "ZMQInteractiveShell" + ): + return True # Jupyter notebook or qtconsole + elif shell == "TerminalInteractiveShell": + return False # Terminal running IPython + else: + return False # Other type (?) + + +COLOR_SYSTEMS = { + "standard": ColorSystem.STANDARD, + "256": ColorSystem.EIGHT_BIT, + "truecolor": ColorSystem.TRUECOLOR, + "windows": ColorSystem.WINDOWS, +} + +_COLOR_SYSTEMS_NAMES = {system: name for name, system in COLOR_SYSTEMS.items()} + + +@dataclass +class ConsoleThreadLocals(threading.local): + """Thread local values for Console context.""" + + theme_stack: ThemeStack + buffer: List[Segment] = field(default_factory=list) + buffer_index: int = 0 + + +class RenderHook(ABC): + """Provides hooks in to the render process.""" + + @abstractmethod + def process_renderables( + self, renderables: List[ConsoleRenderable] + ) -> List[ConsoleRenderable]: + """Called with a list of objects to render. + + This method can return a new list of renderables, or modify and return the same list. + + Args: + renderables (List[ConsoleRenderable]): A number of renderable objects. + + Returns: + List[ConsoleRenderable]: A replacement list of renderables. + """ + + +_windows_console_features: Optional["WindowsConsoleFeatures"] = None + + +def get_windows_console_features() -> "WindowsConsoleFeatures": # pragma: no cover + global _windows_console_features + if _windows_console_features is not None: + return _windows_console_features + from ._windows import get_windows_console_features + + _windows_console_features = get_windows_console_features() + return _windows_console_features + + +def detect_legacy_windows() -> bool: + """Detect legacy Windows.""" + return WINDOWS and not get_windows_console_features().vt + + +class Console: + """A high level console interface. + + Args: + color_system (str, optional): The color system supported by your terminal, + either ``"standard"``, ``"256"`` or ``"truecolor"``. Leave as ``"auto"`` to autodetect. + force_terminal (Optional[bool], optional): Enable/disable terminal control codes, or None to auto-detect terminal. Defaults to None. + force_jupyter (Optional[bool], optional): Enable/disable Jupyter rendering, or None to auto-detect Jupyter. Defaults to None. + force_interactive (Optional[bool], optional): Enable/disable interactive mode, or None to auto detect. Defaults to None. + soft_wrap (Optional[bool], optional): Set soft wrap default on print method. Defaults to False. + theme (Theme, optional): An optional style theme object, or ``None`` for default theme. + stderr (bool, optional): Use stderr rather than stdout if ``file`` is not specified. Defaults to False. + file (IO, optional): A file object where the console should write to. Defaults to stdout. + quiet (bool, Optional): Boolean to suppress all output. Defaults to False. + width (int, optional): The width of the terminal. Leave as default to auto-detect width. + height (int, optional): The height of the terminal. Leave as default to auto-detect height. + style (StyleType, optional): Style to apply to all output, or None for no style. Defaults to None. + no_color (Optional[bool], optional): Enabled no color mode, or None to auto detect. Defaults to None. + tab_size (int, optional): Number of spaces used to replace a tab character. Defaults to 8. + record (bool, optional): Boolean to enable recording of terminal output, + required to call :meth:`export_html`, :meth:`export_svg`, and :meth:`export_text`. Defaults to False. + markup (bool, optional): Boolean to enable :ref:`console_markup`. Defaults to True. + emoji (bool, optional): Enable emoji code. Defaults to True. + emoji_variant (str, optional): Optional emoji variant, either "text" or "emoji". Defaults to None. + highlight (bool, optional): Enable automatic highlighting. Defaults to True. + log_time (bool, optional): Boolean to enable logging of time by :meth:`log` methods. Defaults to True. + log_path (bool, optional): Boolean to enable the logging of the caller by :meth:`log`. Defaults to True. + log_time_format (Union[str, TimeFormatterCallable], optional): If ``log_time`` is enabled, either string for strftime or callable that formats the time. Defaults to "[%X] ". + highlighter (HighlighterType, optional): Default highlighter. + legacy_windows (bool, optional): Enable legacy Windows mode, or ``None`` to auto detect. Defaults to ``None``. + safe_box (bool, optional): Restrict box options that don't render on legacy Windows. + get_datetime (Callable[[], datetime], optional): Callable that gets the current time as a datetime.datetime object (used by Console.log), + or None for datetime.now. + get_time (Callable[[], time], optional): Callable that gets the current time in seconds, default uses time.monotonic. + """ + + _environ: Mapping[str, str] = os.environ + + def __init__( + self, + *, + color_system: Optional[ + Literal["auto", "standard", "256", "truecolor", "windows"] + ] = "auto", + force_terminal: Optional[bool] = None, + force_jupyter: Optional[bool] = None, + force_interactive: Optional[bool] = None, + soft_wrap: bool = False, + theme: Optional[Theme] = None, + stderr: bool = False, + file: Optional[IO[str]] = None, + quiet: bool = False, + width: Optional[int] = None, + height: Optional[int] = None, + style: Optional[StyleType] = None, + no_color: Optional[bool] = None, + tab_size: int = 8, + record: bool = False, + markup: bool = True, + emoji: bool = True, + emoji_variant: Optional[EmojiVariant] = None, + highlight: bool = True, + log_time: bool = True, + log_path: bool = True, + log_time_format: Union[str, FormatTimeCallable] = "[%X]", + highlighter: Optional["HighlighterType"] = ReprHighlighter(), + legacy_windows: Optional[bool] = None, + safe_box: bool = True, + get_datetime: Optional[Callable[[], datetime]] = None, + get_time: Optional[Callable[[], float]] = None, + _environ: Optional[Mapping[str, str]] = None, + ): + # Copy of os.environ allows us to replace it for testing + if _environ is not None: + self._environ = _environ + + self.is_jupyter = _is_jupyter() if force_jupyter is None else force_jupyter + if self.is_jupyter: + if width is None: + jupyter_columns = self._environ.get("JUPYTER_COLUMNS") + if jupyter_columns is not None and jupyter_columns.isdigit(): + width = int(jupyter_columns) + else: + width = JUPYTER_DEFAULT_COLUMNS + if height is None: + jupyter_lines = self._environ.get("JUPYTER_LINES") + if jupyter_lines is not None and jupyter_lines.isdigit(): + height = int(jupyter_lines) + else: + height = JUPYTER_DEFAULT_LINES + + self.tab_size = tab_size + self.record = record + self._markup = markup + self._emoji = emoji + self._emoji_variant: Optional[EmojiVariant] = emoji_variant + self._highlight = highlight + self.legacy_windows: bool = ( + (detect_legacy_windows() and not self.is_jupyter) + if legacy_windows is None + else legacy_windows + ) + + if width is None: + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) - self.legacy_windows + if height is None: + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + self.soft_wrap = soft_wrap + self._width = width + self._height = height + + self._color_system: Optional[ColorSystem] + + self._force_terminal = None + if force_terminal is not None: + self._force_terminal = force_terminal + + self._file = file + self.quiet = quiet + self.stderr = stderr + + if color_system is None: + self._color_system = None + elif color_system == "auto": + self._color_system = self._detect_color_system() + else: + self._color_system = COLOR_SYSTEMS[color_system] + + self._lock = threading.RLock() + self._log_render = LogRender( + show_time=log_time, + show_path=log_path, + time_format=log_time_format, + ) + self.highlighter: HighlighterType = highlighter or _null_highlighter + self.safe_box = safe_box + self.get_datetime = get_datetime or datetime.now + self.get_time = get_time or monotonic + self.style = style + self.no_color = ( + no_color if no_color is not None else "NO_COLOR" in self._environ + ) + self.is_interactive = ( + (self.is_terminal and not self.is_dumb_terminal) + if force_interactive is None + else force_interactive + ) + + self._record_buffer_lock = threading.RLock() + self._thread_locals = ConsoleThreadLocals( + theme_stack=ThemeStack(themes.DEFAULT if theme is None else theme) + ) + self._record_buffer: List[Segment] = [] + self._render_hooks: List[RenderHook] = [] + self._live: Optional["Live"] = None + self._is_alt_screen = False + + def __repr__(self) -> str: + return f"" + + @property + def file(self) -> IO[str]: + """Get the file object to write to.""" + file = self._file or (sys.stderr if self.stderr else sys.stdout) + file = getattr(file, "rich_proxied_file", file) + if file is None: + file = NULL_FILE + return file + + @file.setter + def file(self, new_file: IO[str]) -> None: + """Set a new file object.""" + self._file = new_file + + @property + def _buffer(self) -> List[Segment]: + """Get a thread local buffer.""" + return self._thread_locals.buffer + + @property + def _buffer_index(self) -> int: + """Get a thread local buffer.""" + return self._thread_locals.buffer_index + + @_buffer_index.setter + def _buffer_index(self, value: int) -> None: + self._thread_locals.buffer_index = value + + @property + def _theme_stack(self) -> ThemeStack: + """Get the thread local theme stack.""" + return self._thread_locals.theme_stack + + def _detect_color_system(self) -> Optional[ColorSystem]: + """Detect color system from env vars.""" + if self.is_jupyter: + return ColorSystem.TRUECOLOR + if not self.is_terminal or self.is_dumb_terminal: + return None + if WINDOWS: # pragma: no cover + if self.legacy_windows: # pragma: no cover + return ColorSystem.WINDOWS + windows_console_features = get_windows_console_features() + return ( + ColorSystem.TRUECOLOR + if windows_console_features.truecolor + else ColorSystem.EIGHT_BIT + ) + else: + color_term = self._environ.get("COLORTERM", "").strip().lower() + if color_term in ("truecolor", "24bit"): + return ColorSystem.TRUECOLOR + term = self._environ.get("TERM", "").strip().lower() + _term_name, _hyphen, colors = term.rpartition("-") + color_system = _TERM_COLORS.get(colors, ColorSystem.STANDARD) + return color_system + + def _enter_buffer(self) -> None: + """Enter in to a buffer context, and buffer all output.""" + self._buffer_index += 1 + + def _exit_buffer(self) -> None: + """Leave buffer context, and render content if required.""" + self._buffer_index -= 1 + self._check_buffer() + + def set_live(self, live: "Live") -> None: + """Set Live instance. Used by Live context manager. + + Args: + live (Live): Live instance using this Console. + + Raises: + errors.LiveError: If this Console has a Live context currently active. + """ + with self._lock: + if self._live is not None: + raise errors.LiveError("Only one live display may be active at once") + self._live = live + + def clear_live(self) -> None: + """Clear the Live instance.""" + with self._lock: + self._live = None + + def push_render_hook(self, hook: RenderHook) -> None: + """Add a new render hook to the stack. + + Args: + hook (RenderHook): Render hook instance. + """ + with self._lock: + self._render_hooks.append(hook) + + def pop_render_hook(self) -> None: + """Pop the last renderhook from the stack.""" + with self._lock: + self._render_hooks.pop() + + def __enter__(self) -> "Console": + """Own context manager to enter buffer context.""" + self._enter_buffer() + return self + + def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None: + """Exit buffer context.""" + self._exit_buffer() + + def begin_capture(self) -> None: + """Begin capturing console output. Call :meth:`end_capture` to exit capture mode and return output.""" + self._enter_buffer() + + def end_capture(self) -> str: + """End capture mode and return captured string. + + Returns: + str: Console output. + """ + render_result = self._render_buffer(self._buffer) + del self._buffer[:] + self._exit_buffer() + return render_result + + def push_theme(self, theme: Theme, *, inherit: bool = True) -> None: + """Push a new theme on to the top of the stack, replacing the styles from the previous theme. + Generally speaking, you should call :meth:`~rich.console.Console.use_theme` to get a context manager, rather + than calling this method directly. + + Args: + theme (Theme): A theme instance. + inherit (bool, optional): Inherit existing styles. Defaults to True. + """ + self._theme_stack.push_theme(theme, inherit=inherit) + + def pop_theme(self) -> None: + """Remove theme from top of stack, restoring previous theme.""" + self._theme_stack.pop_theme() + + def use_theme(self, theme: Theme, *, inherit: bool = True) -> ThemeContext: + """Use a different theme for the duration of the context manager. + + Args: + theme (Theme): Theme instance to user. + inherit (bool, optional): Inherit existing console styles. Defaults to True. + + Returns: + ThemeContext: [description] + """ + return ThemeContext(self, theme, inherit) + + @property + def color_system(self) -> Optional[str]: + """Get color system string. + + Returns: + Optional[str]: "standard", "256" or "truecolor". + """ + + if self._color_system is not None: + return _COLOR_SYSTEMS_NAMES[self._color_system] + else: + return None + + @property + def encoding(self) -> str: + """Get the encoding of the console file, e.g. ``"utf-8"``. + + Returns: + str: A standard encoding string. + """ + return (getattr(self.file, "encoding", "utf-8") or "utf-8").lower() + + @property + def is_terminal(self) -> bool: + """Check if the console is writing to a terminal. + + Returns: + bool: True if the console writing to a device capable of + understanding terminal codes, otherwise False. + """ + if self._force_terminal is not None: + return self._force_terminal + + if hasattr(sys.stdin, "__module__") and sys.stdin.__module__.startswith( + "idlelib" + ): + # Return False for Idle which claims to be a tty but can't handle ansi codes + return False + + if self.is_jupyter: + # return False for Jupyter, which may have FORCE_COLOR set + return False + + # If FORCE_COLOR env var has any value at all, we assume a terminal. + force_color = self._environ.get("FORCE_COLOR") + if force_color is not None: + self._force_terminal = True + return True + + isatty: Optional[Callable[[], bool]] = getattr(self.file, "isatty", None) + try: + return False if isatty is None else isatty() + except ValueError: + # in some situation (at the end of a pytest run for example) isatty() can raise + # ValueError: I/O operation on closed file + # return False because we aren't in a terminal anymore + return False + + @property + def is_dumb_terminal(self) -> bool: + """Detect dumb terminal. + + Returns: + bool: True if writing to a dumb terminal, otherwise False. + + """ + _term = self._environ.get("TERM", "") + is_dumb = _term.lower() in ("dumb", "unknown") + return self.is_terminal and is_dumb + + @property + def options(self) -> ConsoleOptions: + """Get default console options.""" + return ConsoleOptions( + max_height=self.size.height, + size=self.size, + legacy_windows=self.legacy_windows, + min_width=1, + max_width=self.width, + encoding=self.encoding, + is_terminal=self.is_terminal, + ) + + @property + def size(self) -> ConsoleDimensions: + """Get the size of the console. + + Returns: + ConsoleDimensions: A named tuple containing the dimensions. + """ + + if self._width is not None and self._height is not None: + return ConsoleDimensions(self._width - self.legacy_windows, self._height) + + if self.is_dumb_terminal: + return ConsoleDimensions(80, 25) + + width: Optional[int] = None + height: Optional[int] = None + + if WINDOWS: # pragma: no cover + try: + width, height = os.get_terminal_size() + except (AttributeError, ValueError, OSError): # Probably not a terminal + pass + else: + for file_descriptor in _STD_STREAMS: + try: + width, height = os.get_terminal_size(file_descriptor) + except (AttributeError, ValueError, OSError): + pass + else: + break + + columns = self._environ.get("COLUMNS") + if columns is not None and columns.isdigit(): + width = int(columns) + lines = self._environ.get("LINES") + if lines is not None and lines.isdigit(): + height = int(lines) + + # get_terminal_size can report 0, 0 if run from pseudo-terminal + width = width or 80 + height = height or 25 + return ConsoleDimensions( + width - self.legacy_windows if self._width is None else self._width, + height if self._height is None else self._height, + ) + + @size.setter + def size(self, new_size: Tuple[int, int]) -> None: + """Set a new size for the terminal. + + Args: + new_size (Tuple[int, int]): New width and height. + """ + width, height = new_size + self._width = width + self._height = height + + @property + def width(self) -> int: + """Get the width of the console. + + Returns: + int: The width (in characters) of the console. + """ + return self.size.width + + @width.setter + def width(self, width: int) -> None: + """Set width. + + Args: + width (int): New width. + """ + self._width = width + + @property + def height(self) -> int: + """Get the height of the console. + + Returns: + int: The height (in lines) of the console. + """ + return self.size.height + + @height.setter + def height(self, height: int) -> None: + """Set height. + + Args: + height (int): new height. + """ + self._height = height + + def bell(self) -> None: + """Play a 'bell' sound (if supported by the terminal).""" + self.control(Control.bell()) + + def capture(self) -> Capture: + """A context manager to *capture* the result of print() or log() in a string, + rather than writing it to the console. + + Example: + >>> from rich.console import Console + >>> console = Console() + >>> with console.capture() as capture: + ... console.print("[bold magenta]Hello World[/]") + >>> print(capture.get()) + + Returns: + Capture: Context manager with disables writing to the terminal. + """ + capture = Capture(self) + return capture + + def pager( + self, pager: Optional[Pager] = None, styles: bool = False, links: bool = False + ) -> PagerContext: + """A context manager to display anything printed within a "pager". The pager application + is defined by the system and will typically support at least pressing a key to scroll. + + Args: + pager (Pager, optional): A pager object, or None to use :class:`~rich.pager.SystemPager`. Defaults to None. + styles (bool, optional): Show styles in pager. Defaults to False. + links (bool, optional): Show links in pager. Defaults to False. + + Example: + >>> from rich.console import Console + >>> from rich.__main__ import make_test_card + >>> console = Console() + >>> with console.pager(): + console.print(make_test_card()) + + Returns: + PagerContext: A context manager. + """ + return PagerContext(self, pager=pager, styles=styles, links=links) + + def line(self, count: int = 1) -> None: + """Write new line(s). + + Args: + count (int, optional): Number of new lines. Defaults to 1. + """ + + assert count >= 0, "count must be >= 0" + self.print(NewLine(count)) + + def clear(self, home: bool = True) -> None: + """Clear the screen. + + Args: + home (bool, optional): Also move the cursor to 'home' position. Defaults to True. + """ + if home: + self.control(Control.clear(), Control.home()) + else: + self.control(Control.clear()) + + def status( + self, + status: RenderableType, + *, + spinner: str = "dots", + spinner_style: StyleType = "status.spinner", + speed: float = 1.0, + refresh_per_second: float = 12.5, + ) -> "Status": + """Display a status and spinner. + + Args: + status (RenderableType): A status renderable (str or Text typically). + spinner (str, optional): Name of spinner animation (see python -m rich.spinner). Defaults to "dots". + spinner_style (StyleType, optional): Style of spinner. Defaults to "status.spinner". + speed (float, optional): Speed factor for spinner animation. Defaults to 1.0. + refresh_per_second (float, optional): Number of refreshes per second. Defaults to 12.5. + + Returns: + Status: A Status object that may be used as a context manager. + """ + from .status import Status + + status_renderable = Status( + status, + console=self, + spinner=spinner, + spinner_style=spinner_style, + speed=speed, + refresh_per_second=refresh_per_second, + ) + return status_renderable + + def show_cursor(self, show: bool = True) -> bool: + """Show or hide the cursor. + + Args: + show (bool, optional): Set visibility of the cursor. + """ + if self.is_terminal: + self.control(Control.show_cursor(show)) + return True + return False + + def set_alt_screen(self, enable: bool = True) -> bool: + """Enables alternative screen mode. + + Note, if you enable this mode, you should ensure that is disabled before + the application exits. See :meth:`~rich.Console.screen` for a context manager + that handles this for you. + + Args: + enable (bool, optional): Enable (True) or disable (False) alternate screen. Defaults to True. + + Returns: + bool: True if the control codes were written. + + """ + changed = False + if self.is_terminal and not self.legacy_windows: + self.control(Control.alt_screen(enable)) + changed = True + self._is_alt_screen = enable + return changed + + @property + def is_alt_screen(self) -> bool: + """Check if the alt screen was enabled. + + Returns: + bool: True if the alt screen was enabled, otherwise False. + """ + return self._is_alt_screen + + def set_window_title(self, title: str) -> bool: + """Set the title of the console terminal window. + + Warning: There is no means within Rich of "resetting" the window title to its + previous value, meaning the title you set will persist even after your application + exits. + + ``fish`` shell resets the window title before and after each command by default, + negating this issue. Windows Terminal and command prompt will also reset the title for you. + Most other shells and terminals, however, do not do this. + + Some terminals may require configuration changes before you can set the title. + Some terminals may not support setting the title at all. + + Other software (including the terminal itself, the shell, custom prompts, plugins, etc.) + may also set the terminal window title. This could result in whatever value you write + using this method being overwritten. + + Args: + title (str): The new title of the terminal window. + + Returns: + bool: True if the control code to change the terminal title was + written, otherwise False. Note that a return value of True + does not guarantee that the window title has actually changed, + since the feature may be unsupported/disabled in some terminals. + """ + if self.is_terminal: + self.control(Control.title(title)) + return True + return False + + def screen( + self, hide_cursor: bool = True, style: Optional[StyleType] = None + ) -> "ScreenContext": + """Context manager to enable and disable 'alternative screen' mode. + + Args: + hide_cursor (bool, optional): Also hide the cursor. Defaults to False. + style (Style, optional): Optional style for screen. Defaults to None. + + Returns: + ~ScreenContext: Context which enables alternate screen on enter, and disables it on exit. + """ + return ScreenContext(self, hide_cursor=hide_cursor, style=style or "") + + def measure( + self, renderable: RenderableType, *, options: Optional[ConsoleOptions] = None + ) -> Measurement: + """Measure a renderable. Returns a :class:`~rich.measure.Measurement` object which contains + information regarding the number of characters required to print the renderable. + + Args: + renderable (RenderableType): Any renderable or string. + options (Optional[ConsoleOptions], optional): Options to use when measuring, or None + to use default options. Defaults to None. + + Returns: + Measurement: A measurement of the renderable. + """ + measurement = Measurement.get(self, options or self.options, renderable) + return measurement + + def render( + self, renderable: RenderableType, options: Optional[ConsoleOptions] = None + ) -> Iterable[Segment]: + """Render an object in to an iterable of `Segment` instances. + + This method contains the logic for rendering objects with the console protocol. + You are unlikely to need to use it directly, unless you are extending the library. + + Args: + renderable (RenderableType): An object supporting the console protocol, or + an object that may be converted to a string. + options (ConsoleOptions, optional): An options object, or None to use self.options. Defaults to None. + + Returns: + Iterable[Segment]: An iterable of segments that may be rendered. + """ + + _options = options or self.options + if _options.max_width < 1: + # No space to render anything. This prevents potential recursion errors. + return + render_iterable: RenderResult + + renderable = rich_cast(renderable) + if hasattr(renderable, "__rich_console__") and not isclass(renderable): + render_iterable = renderable.__rich_console__(self, _options) # type: ignore[union-attr] + elif isinstance(renderable, str): + text_renderable = self.render_str( + renderable, highlight=_options.highlight, markup=_options.markup + ) + render_iterable = text_renderable.__rich_console__(self, _options) + else: + raise errors.NotRenderableError( + f"Unable to render {renderable!r}; " + "A str, Segment or object with __rich_console__ method is required" + ) + + try: + iter_render = iter(render_iterable) + except TypeError: + raise errors.NotRenderableError( + f"object {render_iterable!r} is not renderable" + ) + _Segment = Segment + _options = _options.reset_height() + for render_output in iter_render: + if isinstance(render_output, _Segment): + yield render_output + else: + yield from self.render(render_output, _options) + + def render_lines( + self, + renderable: RenderableType, + options: Optional[ConsoleOptions] = None, + *, + style: Optional[Style] = None, + pad: bool = True, + new_lines: bool = False, + ) -> List[List[Segment]]: + """Render objects in to a list of lines. + + The output of render_lines is useful when further formatting of rendered console text + is required, such as the Panel class which draws a border around any renderable object. + + Args: + renderable (RenderableType): Any object renderable in the console. + options (Optional[ConsoleOptions], optional): Console options, or None to use self.options. Default to ``None``. + style (Style, optional): Optional style to apply to renderables. Defaults to ``None``. + pad (bool, optional): Pad lines shorter than render width. Defaults to ``True``. + new_lines (bool, optional): Include "\n" characters at end of lines. + + Returns: + List[List[Segment]]: A list of lines, where a line is a list of Segment objects. + """ + with self._lock: + render_options = options or self.options + _rendered = self.render(renderable, render_options) + if style: + _rendered = Segment.apply_style(_rendered, style) + + render_height = render_options.height + if render_height is not None: + render_height = max(0, render_height) + + lines = list( + islice( + Segment.split_and_crop_lines( + _rendered, + render_options.max_width, + include_new_lines=new_lines, + pad=pad, + style=style, + ), + None, + render_height, + ) + ) + if render_options.height is not None: + extra_lines = render_options.height - len(lines) + if extra_lines > 0: + pad_line = [ + [Segment(" " * render_options.max_width, style), Segment("\n")] + if new_lines + else [Segment(" " * render_options.max_width, style)] + ] + lines.extend(pad_line * extra_lines) + + return lines + + def render_str( + self, + text: str, + *, + style: Union[str, Style] = "", + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + highlighter: Optional[HighlighterType] = None, + ) -> "Text": + """Convert a string to a Text instance. This is called automatically if + you print or log a string. + + Args: + text (str): Text to render. + style (Union[str, Style], optional): Style to apply to rendered text. + justify (str, optional): Justify method: "default", "left", "center", "full", or "right". Defaults to ``None``. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji, or ``None`` to use Console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use Console default. + highlight (Optional[bool], optional): Enable highlighting, or ``None`` to use Console default. + highlighter (HighlighterType, optional): Optional highlighter to apply. + Returns: + ConsoleRenderable: Renderable object. + + """ + emoji_enabled = emoji or (emoji is None and self._emoji) + markup_enabled = markup or (markup is None and self._markup) + highlight_enabled = highlight or (highlight is None and self._highlight) + + if markup_enabled: + rich_text = render_markup( + text, + style=style, + emoji=emoji_enabled, + emoji_variant=self._emoji_variant, + ) + rich_text.justify = justify + rich_text.overflow = overflow + else: + rich_text = Text( + _emoji_replace(text, default_variant=self._emoji_variant) + if emoji_enabled + else text, + justify=justify, + overflow=overflow, + style=style, + ) + + _highlighter = (highlighter or self.highlighter) if highlight_enabled else None + if _highlighter is not None: + highlight_text = _highlighter(str(rich_text)) + highlight_text.copy_styles(rich_text) + return highlight_text + + return rich_text + + def get_style( + self, name: Union[str, Style], *, default: Optional[Union[Style, str]] = None + ) -> Style: + """Get a Style instance by its theme name or parse a definition. + + Args: + name (str): The name of a style or a style definition. + + Returns: + Style: A Style object. + + Raises: + MissingStyle: If no style could be parsed from name. + + """ + if isinstance(name, Style): + return name + + try: + style = self._theme_stack.get(name) + if style is None: + style = Style.parse(name) + return style.copy() if style.link else style + except errors.StyleSyntaxError as error: + if default is not None: + return self.get_style(default) + raise errors.MissingStyle( + f"Failed to get style {name!r}; {error}" + ) from None + + def _collect_renderables( + self, + objects: Iterable[Any], + sep: str, + end: str, + *, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + ) -> List[ConsoleRenderable]: + """Combine a number of renderables and text into one renderable. + + Args: + objects (Iterable[Any]): Anything that Rich can render. + sep (str): String to write between print data. + end (str): String to write at end of print data. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. + + Returns: + List[ConsoleRenderable]: A list of things to render. + """ + renderables: List[ConsoleRenderable] = [] + _append = renderables.append + text: List[Text] = [] + append_text = text.append + + append = _append + if justify in ("left", "center", "right"): + + def align_append(renderable: RenderableType) -> None: + _append(Align(renderable, cast(AlignMethod, justify))) + + append = align_append + + _highlighter: HighlighterType = _null_highlighter + if highlight or (highlight is None and self._highlight): + _highlighter = self.highlighter + + def check_text() -> None: + if text: + sep_text = Text(sep, justify=justify, end=end) + append(sep_text.join(text)) + text.clear() + + for renderable in objects: + renderable = rich_cast(renderable) + if isinstance(renderable, str): + append_text( + self.render_str( + renderable, emoji=emoji, markup=markup, highlighter=_highlighter + ) + ) + elif isinstance(renderable, Text): + append_text(renderable) + elif isinstance(renderable, ConsoleRenderable): + check_text() + append(renderable) + elif is_expandable(renderable): + check_text() + append(Pretty(renderable, highlighter=_highlighter)) + else: + append_text(_highlighter(str(renderable))) + + check_text() + + if self.style is not None: + style = self.get_style(self.style) + renderables = [Styled(renderable, style) for renderable in renderables] + + return renderables + + def rule( + self, + title: TextType = "", + *, + characters: str = "โ”€", + style: Union[str, Style] = "rule.line", + align: AlignMethod = "center", + ) -> None: + """Draw a line with optional centered title. + + Args: + title (str, optional): Text to render over the rule. Defaults to "". + characters (str, optional): Character(s) to form the line. Defaults to "โ”€". + style (str, optional): Style of line. Defaults to "rule.line". + align (str, optional): How to align the title, one of "left", "center", or "right". Defaults to "center". + """ + from .rule import Rule + + rule = Rule(title=title, characters=characters, style=style, align=align) + self.print(rule) + + def control(self, *control: Control) -> None: + """Insert non-printing control codes. + + Args: + control_codes (str): Control codes, such as those that may move the cursor. + """ + if not self.is_dumb_terminal: + with self: + self._buffer.extend(_control.segment for _control in control) + + def out( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + highlight: Optional[bool] = None, + ) -> None: + """Output to the terminal. This is a low-level way of writing to the terminal which unlike + :meth:`~rich.console.Console.print` won't pretty print, wrap text, or apply markup, but will + optionally apply highlighting and a basic style. + + Args: + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use + console default. Defaults to ``None``. + """ + raw_output: str = sep.join(str(_object) for _object in objects) + self.print( + raw_output, + style=style, + highlight=highlight, + emoji=False, + markup=False, + no_wrap=True, + overflow="ignore", + crop=False, + end=end, + ) + + def print( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + overflow: Optional[OverflowMethod] = None, + no_wrap: Optional[bool] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + width: Optional[int] = None, + height: Optional[int] = None, + crop: bool = True, + soft_wrap: Optional[bool] = None, + new_line_start: bool = False, + ) -> None: + """Print to the console. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): Justify method: "default", "left", "right", "center", or "full". Defaults to ``None``. + overflow (str, optional): Overflow method: "ignore", "crop", "fold", or "ellipsis". Defaults to None. + no_wrap (Optional[bool], optional): Disable word wrapping. Defaults to None. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to ``None``. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to ``None``. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to ``None``. + width (Optional[int], optional): Width of output, or ``None`` to auto-detect. Defaults to ``None``. + crop (Optional[bool], optional): Crop output to width of terminal. Defaults to True. + soft_wrap (bool, optional): Enable soft wrap mode which disables word wrapping and cropping of text or ``None`` for + Console default. Defaults to ``None``. + new_line_start (bool, False): Insert a new line at the start if the output contains more than one line. Defaults to ``False``. + """ + if not objects: + objects = (NewLine(),) + + if soft_wrap is None: + soft_wrap = self.soft_wrap + if soft_wrap: + if no_wrap is None: + no_wrap = True + if overflow is None: + overflow = "ignore" + crop = False + render_hooks = self._render_hooks[:] + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + render_options = self.options.update( + justify=justify, + overflow=overflow, + width=min(width, self.width) if width is not None else NO_CHANGE, + height=height, + no_wrap=no_wrap, + markup=markup, + highlight=highlight, + ) + + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + if style is None: + for renderable in renderables: + extend(render(renderable, render_options)) + else: + for renderable in renderables: + extend( + Segment.apply_style( + render(renderable, render_options), self.get_style(style) + ) + ) + if new_line_start: + if ( + len("".join(segment.text for segment in new_segments).splitlines()) + > 1 + ): + new_segments.insert(0, Segment.line()) + if crop: + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + else: + self._buffer.extend(new_segments) + + def print_json( + self, + json: Optional[str] = None, + *, + data: Any = None, + indent: Union[None, int, str] = 2, + highlight: bool = True, + skip_keys: bool = False, + ensure_ascii: bool = False, + check_circular: bool = True, + allow_nan: bool = True, + default: Optional[Callable[[Any], Any]] = None, + sort_keys: bool = False, + ) -> None: + """Pretty prints JSON. Output will be valid JSON. + + Args: + json (Optional[str]): A string containing JSON. + data (Any): If json is not supplied, then encode this data. + indent (Union[None, int, str], optional): Number of spaces to indent. Defaults to 2. + highlight (bool, optional): Enable highlighting of output: Defaults to True. + skip_keys (bool, optional): Skip keys not of a basic type. Defaults to False. + ensure_ascii (bool, optional): Escape all non-ascii characters. Defaults to False. + check_circular (bool, optional): Check for circular references. Defaults to True. + allow_nan (bool, optional): Allow NaN and Infinity values. Defaults to True. + default (Callable, optional): A callable that converts values that can not be encoded + in to something that can be JSON encoded. Defaults to None. + sort_keys (bool, optional): Sort dictionary keys. Defaults to False. + """ + from pip._vendor.rich.json import JSON + + if json is None: + json_renderable = JSON.from_data( + data, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + else: + if not isinstance(json, str): + raise TypeError( + f"json must be str. Did you mean print_json(data={json!r}) ?" + ) + json_renderable = JSON( + json, + indent=indent, + highlight=highlight, + skip_keys=skip_keys, + ensure_ascii=ensure_ascii, + check_circular=check_circular, + allow_nan=allow_nan, + default=default, + sort_keys=sort_keys, + ) + self.print(json_renderable, soft_wrap=True) + + def update_screen( + self, + renderable: RenderableType, + *, + region: Optional[Region] = None, + options: Optional[ConsoleOptions] = None, + ) -> None: + """Update the screen at a given offset. + + Args: + renderable (RenderableType): A Rich renderable. + region (Region, optional): Region of screen to update, or None for entire screen. Defaults to None. + x (int, optional): x offset. Defaults to 0. + y (int, optional): y offset. Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + render_options = options or self.options + if region is None: + x = y = 0 + render_options = render_options.update_dimensions( + render_options.max_width, render_options.height or self.height + ) + else: + x, y, width, height = region + render_options = render_options.update_dimensions(width, height) + + lines = self.render_lines(renderable, options=render_options) + self.update_screen_lines(lines, x, y) + + def update_screen_lines( + self, lines: List[List[Segment]], x: int = 0, y: int = 0 + ) -> None: + """Update lines of the screen at a given offset. + + Args: + lines (List[List[Segment]]): Rendered lines (as produced by :meth:`~rich.Console.render_lines`). + x (int, optional): x offset (column no). Defaults to 0. + y (int, optional): y offset (column no). Defaults to 0. + + Raises: + errors.NoAltScreen: If the Console isn't in alt screen mode. + """ + if not self.is_alt_screen: + raise errors.NoAltScreen("Alt screen must be enabled to call update_screen") + screen_update = ScreenUpdate(lines, x, y) + segments = self.render(screen_update) + self._buffer.extend(segments) + self._check_buffer() + + def print_exception( + self, + *, + width: Optional[int] = 100, + extra_lines: int = 3, + theme: Optional[str] = None, + word_wrap: bool = False, + show_locals: bool = False, + suppress: Iterable[Union[str, ModuleType]] = (), + max_frames: int = 100, + ) -> None: + """Prints a rich render of the last exception and traceback. + + Args: + width (Optional[int], optional): Number of characters used to render code. Defaults to 100. + extra_lines (int, optional): Additional lines of code to render. Defaults to 3. + theme (str, optional): Override pygments theme used in traceback + word_wrap (bool, optional): Enable word wrapping of long lines. Defaults to False. + show_locals (bool, optional): Enable display of local variables. Defaults to False. + suppress (Iterable[Union[str, ModuleType]]): Optional sequence of modules or paths to exclude from traceback. + max_frames (int): Maximum number of frames to show in a traceback, 0 for no maximum. Defaults to 100. + """ + from .traceback import Traceback + + traceback = Traceback( + width=width, + extra_lines=extra_lines, + theme=theme, + word_wrap=word_wrap, + show_locals=show_locals, + suppress=suppress, + max_frames=max_frames, + ) + self.print(traceback) + + @staticmethod + def _caller_frame_info( + offset: int, + currentframe: Callable[[], Optional[FrameType]] = inspect.currentframe, + ) -> Tuple[str, int, Dict[str, Any]]: + """Get caller frame information. + + Args: + offset (int): the caller offset within the current frame stack. + currentframe (Callable[[], Optional[FrameType]], optional): the callable to use to + retrieve the current frame. Defaults to ``inspect.currentframe``. + + Returns: + Tuple[str, int, Dict[str, Any]]: A tuple containing the filename, the line number and + the dictionary of local variables associated with the caller frame. + + Raises: + RuntimeError: If the stack offset is invalid. + """ + # Ignore the frame of this local helper + offset += 1 + + frame = currentframe() + if frame is not None: + # Use the faster currentframe where implemented + while offset and frame is not None: + frame = frame.f_back + offset -= 1 + assert frame is not None + return frame.f_code.co_filename, frame.f_lineno, frame.f_locals + else: + # Fallback to the slower stack + frame_info = inspect.stack()[offset] + return frame_info.filename, frame_info.lineno, frame_info.frame.f_locals + + def log( + self, + *objects: Any, + sep: str = " ", + end: str = "\n", + style: Optional[Union[str, Style]] = None, + justify: Optional[JustifyMethod] = None, + emoji: Optional[bool] = None, + markup: Optional[bool] = None, + highlight: Optional[bool] = None, + log_locals: bool = False, + _stack_offset: int = 1, + ) -> None: + """Log rich content to the terminal. + + Args: + objects (positional args): Objects to log to the terminal. + sep (str, optional): String to write between print data. Defaults to " ". + end (str, optional): String to write at end of print data. Defaults to "\\\\n". + style (Union[str, Style], optional): A style to apply to output. Defaults to None. + justify (str, optional): One of "left", "right", "center", or "full". Defaults to ``None``. + overflow (str, optional): Overflow method: "crop", "fold", or "ellipsis". Defaults to None. + emoji (Optional[bool], optional): Enable emoji code, or ``None`` to use console default. Defaults to None. + markup (Optional[bool], optional): Enable markup, or ``None`` to use console default. Defaults to None. + highlight (Optional[bool], optional): Enable automatic highlighting, or ``None`` to use console default. Defaults to None. + log_locals (bool, optional): Boolean to enable logging of locals where ``log()`` + was called. Defaults to False. + _stack_offset (int, optional): Offset of caller from end of call stack. Defaults to 1. + """ + if not objects: + objects = (NewLine(),) + + render_hooks = self._render_hooks[:] + + with self: + renderables = self._collect_renderables( + objects, + sep, + end, + justify=justify, + emoji=emoji, + markup=markup, + highlight=highlight, + ) + if style is not None: + renderables = [Styled(renderable, style) for renderable in renderables] + + filename, line_no, locals = self._caller_frame_info(_stack_offset) + link_path = None if filename.startswith("<") else os.path.abspath(filename) + path = filename.rpartition(os.sep)[-1] + if log_locals: + locals_map = { + key: value + for key, value in locals.items() + if not key.startswith("__") + } + renderables.append(render_scope(locals_map, title="[i]locals")) + + renderables = [ + self._log_render( + self, + renderables, + log_time=self.get_datetime(), + path=path, + line_no=line_no, + link_path=link_path, + ) + ] + for hook in render_hooks: + renderables = hook.process_renderables(renderables) + new_segments: List[Segment] = [] + extend = new_segments.extend + render = self.render + render_options = self.options + for renderable in renderables: + extend(render(renderable, render_options)) + buffer_extend = self._buffer.extend + for line in Segment.split_and_crop_lines( + new_segments, self.width, pad=False + ): + buffer_extend(line) + + def _check_buffer(self) -> None: + """Check if the buffer may be rendered. Render it if it can (e.g. Console.quiet is False) + Rendering is supported on Windows, Unix and Jupyter environments. For + legacy Windows consoles, the win32 API is called directly. + This method will also record what it renders if recording is enabled via Console.record. + """ + if self.quiet: + del self._buffer[:] + return + with self._lock: + if self.record: + with self._record_buffer_lock: + self._record_buffer.extend(self._buffer[:]) + + if self._buffer_index == 0: + if self.is_jupyter: # pragma: no cover + from .jupyter import display + + display(self._buffer, self._render_buffer(self._buffer[:])) + del self._buffer[:] + else: + if WINDOWS: + use_legacy_windows_render = False + if self.legacy_windows: + fileno = get_fileno(self.file) + if fileno is not None: + use_legacy_windows_render = ( + fileno in _STD_STREAMS_OUTPUT + ) + + if use_legacy_windows_render: + from pip._vendor.rich._win32_console import LegacyWindowsTerm + from pip._vendor.rich._windows_renderer import legacy_windows_render + + buffer = self._buffer[:] + if self.no_color and self._color_system: + buffer = list(Segment.remove_color(buffer)) + + legacy_windows_render(buffer, LegacyWindowsTerm(self.file)) + else: + # Either a non-std stream on legacy Windows, or modern Windows. + text = self._render_buffer(self._buffer[:]) + # https://bugs.python.org/issue37871 + # https://github.com/python/cpython/issues/82052 + # We need to avoid writing more than 32Kb in a single write, due to the above bug + write = self.file.write + # Worse case scenario, every character is 4 bytes of utf-8 + MAX_WRITE = 32 * 1024 // 4 + try: + if len(text) <= MAX_WRITE: + write(text) + else: + batch: List[str] = [] + batch_append = batch.append + size = 0 + for line in text.splitlines(True): + if size + len(line) > MAX_WRITE and batch: + write("".join(batch)) + batch.clear() + size = 0 + batch_append(line) + size += len(line) + if batch: + write("".join(batch)) + batch.clear() + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + else: + text = self._render_buffer(self._buffer[:]) + try: + self.file.write(text) + except UnicodeEncodeError as error: + error.reason = f"{error.reason}\n*** You may need to add PYTHONIOENCODING=utf-8 to your environment ***" + raise + + self.file.flush() + del self._buffer[:] + + def _render_buffer(self, buffer: Iterable[Segment]) -> str: + """Render buffered output, and clear buffer.""" + output: List[str] = [] + append = output.append + color_system = self._color_system + legacy_windows = self.legacy_windows + not_terminal = not self.is_terminal + if self.no_color and color_system: + buffer = Segment.remove_color(buffer) + for text, style, control in buffer: + if style: + append( + style.render( + text, + color_system=color_system, + legacy_windows=legacy_windows, + ) + ) + elif not (not_terminal and control): + append(text) + + rendered = "".join(output) + return rendered + + def input( + self, + prompt: TextType = "", + *, + markup: bool = True, + emoji: bool = True, + password: bool = False, + stream: Optional[TextIO] = None, + ) -> str: + """Displays a prompt and waits for input from the user. The prompt may contain color / style. + + It works in the same way as Python's builtin :func:`input` function and provides elaborate line editing and history features if Python's builtin :mod:`readline` module is previously loaded. + + Args: + prompt (Union[str, Text]): Text to render in the prompt. + markup (bool, optional): Enable console markup (requires a str prompt). Defaults to True. + emoji (bool, optional): Enable emoji (requires a str prompt). Defaults to True. + password: (bool, optional): Hide typed text. Defaults to False. + stream: (TextIO, optional): Optional file to read input from (rather than stdin). Defaults to None. + + Returns: + str: Text read from stdin. + """ + if prompt: + self.print(prompt, markup=markup, emoji=emoji, end="") + if password: + result = getpass("", stream=stream) + else: + if stream: + result = stream.readline() + else: + result = input() + return result + + def export_text(self, *, clear: bool = True, styles: bool = False) -> str: + """Generate text from console contents (requires record=True argument in constructor). + + Args: + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi escape codes will be included. ``False`` for plain text. + Defaults to ``False``. + + Returns: + str: String containing console contents. + + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + + with self._record_buffer_lock: + if styles: + text = "".join( + (style.render(text) if style else text) + for text, style, _ in self._record_buffer + ) + else: + text = "".join( + segment.text + for segment in self._record_buffer + if not segment.control + ) + if clear: + del self._record_buffer[:] + return text + + def save_text(self, path: str, *, clear: bool = True, styles: bool = False) -> None: + """Generate text from console and save to a given location (requires record=True argument in constructor). + + Args: + path (str): Path to write text files. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + styles (bool, optional): If ``True``, ansi style codes will be included. ``False`` for plain text. + Defaults to ``False``. + + """ + text = self.export_text(clear=clear, styles=styles) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(text) + + def export_html( + self, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: Optional[str] = None, + inline_styles: bool = False, + ) -> str: + """Generate HTML from console contents (requires record=True argument in constructor). + + Args: + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + Returns: + str: String containing console contents as HTML. + """ + assert ( + self.record + ), "To export console contents set record=True in the constructor or instance" + fragments: List[str] = [] + append = fragments.append + _theme = theme or DEFAULT_TERMINAL_THEME + stylesheet = "" + + render_code_format = CONSOLE_HTML_FORMAT if code_format is None else code_format + + with self._record_buffer_lock: + if inline_styles: + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + if style.link: + text = f'{text}' + text = f'{text}' if rule else text + append(text) + else: + styles: Dict[str, int] = {} + for text, style, _ in Segment.filter_control( + Segment.simplify(self._record_buffer) + ): + text = escape(text) + if style: + rule = style.get_html_style(_theme) + style_number = styles.setdefault(rule, len(styles) + 1) + if style.link: + text = f'{text}' + else: + text = f'{text}' + append(text) + stylesheet_rules: List[str] = [] + stylesheet_append = stylesheet_rules.append + for style_rule, style_number in styles.items(): + if style_rule: + stylesheet_append(f".r{style_number} {{{style_rule}}}") + stylesheet = "\n".join(stylesheet_rules) + + rendered_code = render_code_format.format( + code="".join(fragments), + stylesheet=stylesheet, + foreground=_theme.foreground_color.hex, + background=_theme.background_color.hex, + ) + if clear: + del self._record_buffer[:] + return rendered_code + + def save_html( + self, + path: str, + *, + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_HTML_FORMAT, + inline_styles: bool = False, + ) -> None: + """Generate HTML from console contents and write to a file (requires record=True argument in constructor). + + Args: + path (str): Path to write html file. + theme (TerminalTheme, optional): TerminalTheme object containing console colors. + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True``. + code_format (str, optional): Format string to render HTML. In addition to '{foreground}', + '{background}', and '{code}', should contain '{stylesheet}' if inline_styles is ``False``. + inline_styles (bool, optional): If ``True`` styles will be inlined in to spans, which makes files + larger but easier to cut and paste markup. If ``False``, styles will be embedded in a style tag. + Defaults to False. + + """ + html = self.export_html( + theme=theme, + clear=clear, + code_format=code_format, + inline_styles=inline_styles, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(html) + + def export_svg( + self, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> str: + """ + Generate an SVG from the console contents (requires record=True in Console constructor). + + Args: + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + + from pip._vendor.rich.cells import cell_len + + style_cache: Dict[Style, str] = {} + + def get_svg_style(style: Style) -> str: + """Convert a Style to CSS rules for SVG.""" + if style in style_cache: + return style_cache[style] + css_rules = [] + color = ( + _theme.foreground_color + if (style.color is None or style.color.is_default) + else style.color.get_truecolor(_theme) + ) + bgcolor = ( + _theme.background_color + if (style.bgcolor is None or style.bgcolor.is_default) + else style.bgcolor.get_truecolor(_theme) + ) + if style.reverse: + color, bgcolor = bgcolor, color + if style.dim: + color = blend_rgb(color, bgcolor, 0.4) + css_rules.append(f"fill: {color.hex}") + if style.bold: + css_rules.append("font-weight: bold") + if style.italic: + css_rules.append("font-style: italic;") + if style.underline: + css_rules.append("text-decoration: underline;") + if style.strike: + css_rules.append("text-decoration: line-through;") + + css = ";".join(css_rules) + style_cache[style] = css + return css + + _theme = theme or SVG_EXPORT_THEME + + width = self.width + char_height = 20 + char_width = char_height * font_aspect_ratio + line_height = char_height * 1.22 + + margin_top = 1 + margin_right = 1 + margin_bottom = 1 + margin_left = 1 + + padding_top = 40 + padding_right = 8 + padding_bottom = 8 + padding_left = 8 + + padding_width = padding_left + padding_right + padding_height = padding_top + padding_bottom + margin_width = margin_left + margin_right + margin_height = margin_top + margin_bottom + + text_backgrounds: List[str] = [] + text_group: List[str] = [] + classes: Dict[str, int] = {} + style_no = 1 + + def escape_text(text: str) -> str: + """HTML escape text and replace spaces with nbsp.""" + return escape(text).replace(" ", " ") + + def make_tag( + name: str, content: Optional[str] = None, **attribs: object + ) -> str: + """Make a tag from name, content, and attributes.""" + + def stringify(value: object) -> str: + if isinstance(value, (float)): + return format(value, "g") + return str(value) + + tag_attribs = " ".join( + f'{k.lstrip("_").replace("_", "-")}="{stringify(v)}"' + for k, v in attribs.items() + ) + return ( + f"<{name} {tag_attribs}>{content}" + if content + else f"<{name} {tag_attribs}/>" + ) + + with self._record_buffer_lock: + segments = list(Segment.filter_control(self._record_buffer)) + if clear: + self._record_buffer.clear() + + if unique_id is None: + unique_id = "terminal-" + str( + zlib.adler32( + ("".join(repr(segment) for segment in segments)).encode( + "utf-8", + "ignore", + ) + + title.encode("utf-8", "ignore") + ) + ) + y = 0 + for y, line in enumerate(Segment.split_and_crop_lines(segments, length=width)): + x = 0 + for text, style, _control in line: + style = style or Style() + rules = get_svg_style(style) + if rules not in classes: + classes[rules] = style_no + style_no += 1 + class_name = f"r{classes[rules]}" + + if style.reverse: + has_background = True + background = ( + _theme.foreground_color.hex + if style.color is None + else style.color.get_truecolor(_theme).hex + ) + else: + bgcolor = style.bgcolor + has_background = bgcolor is not None and not bgcolor.is_default + background = ( + _theme.background_color.hex + if style.bgcolor is None + else style.bgcolor.get_truecolor(_theme).hex + ) + + text_length = cell_len(text) + if has_background: + text_backgrounds.append( + make_tag( + "rect", + fill=background, + x=x * char_width, + y=y * line_height + 1.5, + width=char_width * text_length, + height=line_height + 0.25, + shape_rendering="crispEdges", + ) + ) + + if text != " " * len(text): + text_group.append( + make_tag( + "text", + escape_text(text), + _class=f"{unique_id}-{class_name}", + x=x * char_width, + y=y * line_height + char_height, + textLength=char_width * len(text), + clip_path=f"url(#{unique_id}-line-{y})", + ) + ) + x += cell_len(text) + + line_offsets = [line_no * line_height + 1.5 for line_no in range(y)] + lines = "\n".join( + f""" + {make_tag("rect", x=0, y=offset, width=char_width * width, height=line_height + 0.25)} + """ + for line_no, offset in enumerate(line_offsets) + ) + + styles = "\n".join( + f".{unique_id}-r{rule_no} {{ {css} }}" for css, rule_no in classes.items() + ) + backgrounds = "".join(text_backgrounds) + matrix = "".join(text_group) + + terminal_width = ceil(width * char_width + padding_width) + terminal_height = (y + 1) * line_height + padding_height + chrome = make_tag( + "rect", + fill=_theme.background_color.hex, + stroke="rgba(255,255,255,0.35)", + stroke_width="1", + x=margin_left, + y=margin_top, + width=terminal_width, + height=terminal_height, + rx=8, + ) + + title_color = _theme.foreground_color.hex + if title: + chrome += make_tag( + "text", + escape_text(title), + _class=f"{unique_id}-title", + fill=title_color, + text_anchor="middle", + x=terminal_width // 2, + y=margin_top + char_height + 6, + ) + chrome += f""" + + + + + + """ + + svg = code_format.format( + unique_id=unique_id, + char_width=char_width, + char_height=char_height, + line_height=line_height, + terminal_width=char_width * width - 1, + terminal_height=(y + 1) * line_height - 1, + width=terminal_width + margin_width, + height=terminal_height + margin_height, + terminal_x=margin_left + padding_left, + terminal_y=margin_top + padding_top, + styles=styles, + chrome=chrome, + backgrounds=backgrounds, + matrix=matrix, + lines=lines, + ) + return svg + + def save_svg( + self, + path: str, + *, + title: str = "Rich", + theme: Optional[TerminalTheme] = None, + clear: bool = True, + code_format: str = CONSOLE_SVG_FORMAT, + font_aspect_ratio: float = 0.61, + unique_id: Optional[str] = None, + ) -> None: + """Generate an SVG file from the console contents (requires record=True in Console constructor). + + Args: + path (str): The path to write the SVG to. + title (str, optional): The title of the tab in the output image + theme (TerminalTheme, optional): The ``TerminalTheme`` object to use to style the terminal + clear (bool, optional): Clear record buffer after exporting. Defaults to ``True`` + code_format (str, optional): Format string used to generate the SVG. Rich will inject a number of variables + into the string in order to form the final SVG output. The default template used and the variables + injected by Rich can be found by inspecting the ``console.CONSOLE_SVG_FORMAT`` variable. + font_aspect_ratio (float, optional): The width to height ratio of the font used in the ``code_format`` + string. Defaults to 0.61, which is the width to height ratio of Fira Code (the default font). + If you aren't specifying a different font inside ``code_format``, you probably don't need this. + unique_id (str, optional): unique id that is used as the prefix for various elements (CSS styles, node + ids). If not set, this defaults to a computed value based on the recorded content. + """ + svg = self.export_svg( + title=title, + theme=theme, + clear=clear, + code_format=code_format, + font_aspect_ratio=font_aspect_ratio, + unique_id=unique_id, + ) + with open(path, "wt", encoding="utf-8") as write_file: + write_file.write(svg) + + +def _svg_hash(svg_main_code: str) -> str: + """Returns a unique hash for the given SVG main code. + + Args: + svg_main_code (str): The content we're going to inject in the SVG envelope. + + Returns: + str: a hash of the given content + """ + return str(zlib.adler32(svg_main_code.encode())) + + +if __name__ == "__main__": # pragma: no cover + console = Console(record=True) + + console.log( + "JSONRPC [i]request[/i]", + 5, + 1.3, + True, + False, + None, + { + "jsonrpc": "2.0", + "method": "subtract", + "params": {"minuend": 42, "subtrahend": 23}, + "id": 3, + }, + ) + + console.log("Hello, World!", "{'a': 1}", repr(console)) + + console.print( + { + "name": None, + "empty": [], + "quiz": { + "sport": { + "answered": True, + "q1": { + "question": "Which one is correct team name in NBA?", + "options": [ + "New York Bulls", + "Los Angeles Kings", + "Golden State Warriors", + "Huston Rocket", + ], + "answer": "Huston Rocket", + }, + }, + "maths": { + "answered": False, + "q1": { + "question": "5 + 7 = ?", + "options": [10, 11, 12, 13], + "answer": 12, + }, + "q2": { + "question": "12 - 8 = ?", + "options": [1, 2, 3, 4], + "answer": 4, + }, + }, + }, + } + ) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py new file mode 100644 index 0000000000000000000000000000000000000000..65fdf56342e8b5b8e181914881025231684e1871 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/constrain.py @@ -0,0 +1,37 @@ +from typing import Optional, TYPE_CHECKING + +from .jupyter import JupyterMixin +from .measure import Measurement + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderableType, RenderResult + + +class Constrain(JupyterMixin): + """Constrain the width of a renderable to a given number of characters. + + Args: + renderable (RenderableType): A renderable object. + width (int, optional): The maximum width (in characters) to render. Defaults to 80. + """ + + def __init__(self, renderable: "RenderableType", width: Optional[int] = 80) -> None: + self.renderable = renderable + self.width = width + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.width is None: + yield self.renderable + else: + child_options = options.update_width(min(self.width, options.max_width)) + yield from console.render(self.renderable, child_options) + + def __rich_measure__( + self, console: "Console", options: "ConsoleOptions" + ) -> "Measurement": + if self.width is not None: + options = options.update_width(self.width) + measurement = Measurement.get(console, options, self.renderable) + return measurement diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py new file mode 100644 index 0000000000000000000000000000000000000000..88fcb9295164f4e18827ef61fff6723e94ef7381 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/control.py @@ -0,0 +1,225 @@ +import sys +import time +from typing import TYPE_CHECKING, Callable, Dict, Iterable, List, Union + +if sys.version_info >= (3, 8): + from typing import Final +else: + from pip._vendor.typing_extensions import Final # pragma: no cover + +from .segment import ControlCode, ControlType, Segment + +if TYPE_CHECKING: + from .console import Console, ConsoleOptions, RenderResult + +STRIP_CONTROL_CODES: Final = [ + 7, # Bell + 8, # Backspace + 11, # Vertical tab + 12, # Form feed + 13, # Carriage return +] +_CONTROL_STRIP_TRANSLATE: Final = { + _codepoint: None for _codepoint in STRIP_CONTROL_CODES +} + +CONTROL_ESCAPE: Final = { + 7: "\\a", + 8: "\\b", + 11: "\\v", + 12: "\\f", + 13: "\\r", +} + +CONTROL_CODES_FORMAT: Dict[int, Callable[..., str]] = { + ControlType.BELL: lambda: "\x07", + ControlType.CARRIAGE_RETURN: lambda: "\r", + ControlType.HOME: lambda: "\x1b[H", + ControlType.CLEAR: lambda: "\x1b[2J", + ControlType.ENABLE_ALT_SCREEN: lambda: "\x1b[?1049h", + ControlType.DISABLE_ALT_SCREEN: lambda: "\x1b[?1049l", + ControlType.SHOW_CURSOR: lambda: "\x1b[?25h", + ControlType.HIDE_CURSOR: lambda: "\x1b[?25l", + ControlType.CURSOR_UP: lambda param: f"\x1b[{param}A", + ControlType.CURSOR_DOWN: lambda param: f"\x1b[{param}B", + ControlType.CURSOR_FORWARD: lambda param: f"\x1b[{param}C", + ControlType.CURSOR_BACKWARD: lambda param: f"\x1b[{param}D", + ControlType.CURSOR_MOVE_TO_COLUMN: lambda param: f"\x1b[{param+1}G", + ControlType.ERASE_IN_LINE: lambda param: f"\x1b[{param}K", + ControlType.CURSOR_MOVE_TO: lambda x, y: f"\x1b[{y+1};{x+1}H", + ControlType.SET_WINDOW_TITLE: lambda title: f"\x1b]0;{title}\x07", +} + + +class Control: + """A renderable that inserts a control code (non printable but may move cursor). + + Args: + *codes (str): Positional arguments are either a :class:`~rich.segment.ControlType` enum or a + tuple of ControlType and an integer parameter + """ + + __slots__ = ["segment"] + + def __init__(self, *codes: Union[ControlType, ControlCode]) -> None: + control_codes: List[ControlCode] = [ + (code,) if isinstance(code, ControlType) else code for code in codes + ] + _format_map = CONTROL_CODES_FORMAT + rendered_codes = "".join( + _format_map[code](*parameters) for code, *parameters in control_codes + ) + self.segment = Segment(rendered_codes, None, control_codes) + + @classmethod + def bell(cls) -> "Control": + """Ring the 'bell'.""" + return cls(ControlType.BELL) + + @classmethod + def home(cls) -> "Control": + """Move cursor to 'home' position.""" + return cls(ControlType.HOME) + + @classmethod + def move(cls, x: int = 0, y: int = 0) -> "Control": + """Move cursor relative to current position. + + Args: + x (int): X offset. + y (int): Y offset. + + Returns: + ~Control: Control object. + + """ + + def get_codes() -> Iterable[ControlCode]: + control = ControlType + if x: + yield ( + control.CURSOR_FORWARD if x > 0 else control.CURSOR_BACKWARD, + abs(x), + ) + if y: + yield ( + control.CURSOR_DOWN if y > 0 else control.CURSOR_UP, + abs(y), + ) + + control = cls(*get_codes()) + return control + + @classmethod + def move_to_column(cls, x: int, y: int = 0) -> "Control": + """Move to the given column, optionally add offset to row. + + Returns: + x (int): absolute x (column) + y (int): optional y offset (row) + + Returns: + ~Control: Control object. + """ + + return ( + cls( + (ControlType.CURSOR_MOVE_TO_COLUMN, x), + ( + ControlType.CURSOR_DOWN if y > 0 else ControlType.CURSOR_UP, + abs(y), + ), + ) + if y + else cls((ControlType.CURSOR_MOVE_TO_COLUMN, x)) + ) + + @classmethod + def move_to(cls, x: int, y: int) -> "Control": + """Move cursor to absolute position. + + Args: + x (int): x offset (column) + y (int): y offset (row) + + Returns: + ~Control: Control object. + """ + return cls((ControlType.CURSOR_MOVE_TO, x, y)) + + @classmethod + def clear(cls) -> "Control": + """Clear the screen.""" + return cls(ControlType.CLEAR) + + @classmethod + def show_cursor(cls, show: bool) -> "Control": + """Show or hide the cursor.""" + return cls(ControlType.SHOW_CURSOR if show else ControlType.HIDE_CURSOR) + + @classmethod + def alt_screen(cls, enable: bool) -> "Control": + """Enable or disable alt screen.""" + if enable: + return cls(ControlType.ENABLE_ALT_SCREEN, ControlType.HOME) + else: + return cls(ControlType.DISABLE_ALT_SCREEN) + + @classmethod + def title(cls, title: str) -> "Control": + """Set the terminal window title + + Args: + title (str): The new terminal window title + """ + return cls((ControlType.SET_WINDOW_TITLE, title)) + + def __str__(self) -> str: + return self.segment.text + + def __rich_console__( + self, console: "Console", options: "ConsoleOptions" + ) -> "RenderResult": + if self.segment.text: + yield self.segment + + +def strip_control_codes( + text: str, _translate_table: Dict[int, None] = _CONTROL_STRIP_TRANSLATE +) -> str: + """Remove control codes from text. + + Args: + text (str): A string possibly contain control codes. + + Returns: + str: String with control codes removed. + """ + return text.translate(_translate_table) + + +def escape_control_codes( + text: str, + _translate_table: Dict[int, str] = CONTROL_ESCAPE, +) -> str: + """Replace control codes with their "escaped" equivalent in the given text. + (e.g. "\b" becomes "\\b") + + Args: + text (str): A string possibly containing control codes. + + Returns: + str: String with control codes replaced with their escaped version. + """ + return text.translate(_translate_table) + + +if __name__ == "__main__": # pragma: no cover + from pip._vendor.rich.console import Console + + console = Console() + console.print("Look at the title of your terminal window ^") + # console.print(Control((ControlType.SET_WINDOW_TITLE, "Hello, world!"))) + for i in range(10): + console.set_window_title("๐Ÿš€ Loading" + "." * i) + time.sleep(0.5) diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py new file mode 100644 index 0000000000000000000000000000000000000000..4b0b0da6c2a62b2b1468c35ddd69f1bbb9b91aa8 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/file_proxy.py @@ -0,0 +1,57 @@ +import io +from typing import IO, TYPE_CHECKING, Any, List + +from .ansi import AnsiDecoder +from .text import Text + +if TYPE_CHECKING: + from .console import Console + + +class FileProxy(io.TextIOBase): + """Wraps a file (e.g. sys.stdout) and redirects writes to a console.""" + + def __init__(self, console: "Console", file: IO[str]) -> None: + self.__console = console + self.__file = file + self.__buffer: List[str] = [] + self.__ansi_decoder = AnsiDecoder() + + @property + def rich_proxied_file(self) -> IO[str]: + """Get proxied file.""" + return self.__file + + def __getattr__(self, name: str) -> Any: + return getattr(self.__file, name) + + def write(self, text: str) -> int: + if not isinstance(text, str): + raise TypeError(f"write() argument must be str, not {type(text).__name__}") + buffer = self.__buffer + lines: List[str] = [] + while text: + line, new_line, text = text.partition("\n") + if new_line: + lines.append("".join(buffer) + line) + buffer.clear() + else: + buffer.append(line) + break + if lines: + console = self.__console + with console: + output = Text("\n").join( + self.__ansi_decoder.decode_line(line) for line in lines + ) + console.print(output) + return len(text) + + def flush(self) -> None: + output = "".join(self.__buffer) + if output: + self.__console.print(output) + del self.__buffer[:] + + def fileno(self) -> int: + return self.__file.fileno() diff --git a/.venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py new file mode 100644 index 0000000000000000000000000000000000000000..c2646794a98578bdb735f5047dbc6b1d50b90230 --- /dev/null +++ b/.venv/lib/python3.11/site-packages/pip/_vendor/rich/highlighter.py @@ -0,0 +1,232 @@ +import re +from abc import ABC, abstractmethod +from typing import List, Union + +from .text import Span, Text + + +def _combine_regex(*regexes: str) -> str: + """Combine a number of regexes in to a single regex. + + Returns: + str: New regex with all regexes ORed together. + """ + return "|".join(regexes) + + +class Highlighter(ABC): + """Abstract base class for highlighters.""" + + def __call__(self, text: Union[str, Text]) -> Text: + """Highlight a str or Text instance. + + Args: + text (Union[str, ~Text]): Text to highlight. + + Raises: + TypeError: If not called with text or str. + + Returns: + Text: A test instance with highlighting applied. + """ + if isinstance(text, str): + highlight_text = Text(text) + elif isinstance(text, Text): + highlight_text = text.copy() + else: + raise TypeError(f"str or Text instance required, not {text!r}") + self.highlight(highlight_text) + return highlight_text + + @abstractmethod + def highlight(self, text: Text) -> None: + """Apply highlighting in place to text. + + Args: + text (~Text): A text object highlight. + """ + + +class NullHighlighter(Highlighter): + """A highlighter object that doesn't highlight. + + May be used to disable highlighting entirely. + + """ + + def highlight(self, text: Text) -> None: + """Nothing to do""" + + +class RegexHighlighter(Highlighter): + """Applies highlighting from a list of regular expressions.""" + + highlights: List[str] = [] + base_style: str = "" + + def highlight(self, text: Text) -> None: + """Highlight :class:`rich.text.Text` using regular expressions. + + Args: + text (~Text): Text to highlighted. + + """ + + highlight_regex = text.highlight_regex + for re_highlight in self.highlights: + highlight_regex(re_highlight, style_prefix=self.base_style) + + +class ReprHighlighter(RegexHighlighter): + """Highlights the text typically produced from ``__repr__`` methods.""" + + base_style = "repr." + highlights = [ + r"(?P<)(?P[-\w.:|]*)(?P[\w\W]*)(?P>)", + r'(?P[\w_]{1,50})=(?P"?[\w_]+"?)?', + r"(?P[][{}()])", + _combine_regex( + r"(?P[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})", + r"(?P([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){7}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){3}[0-9A-Fa-f]{4})", + r"(?P(?:[0-9A-Fa-f]{1,2}-){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{1,2}:){5}[0-9A-Fa-f]{1,2}|(?:[0-9A-Fa-f]{4}\.){2}[0-9A-Fa-f]{4})", + r"(?P[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})", + r"(?P[\w.]*?)\(", + r"\b(?PTrue)\b|\b(?PFalse)\b|\b(?PNone)\b", + r"(?P\.\.\.)", + r"(?P(?(?\B(/[-\w._+]+)*\/)(?P[-\w._+]*)?", + r"(?b?'''.*?(?(file|https|http|ws|wss)://[-0-9a-zA-Z$_+!`(),.?/;:&=%#]*)", + ), + ] + + +class JSONHighlighter(RegexHighlighter): + """Highlights JSON""" + + # Captures the start and end of JSON strings, handling escaped quotes + JSON_STR = r"(?b?\".*?(?[\{\[\(\)\]\}])", + r"\b(?Ptrue)\b|\b(?Pfalse)\b|\b(?Pnull)\b", + r"(?P(? None: + super().highlight(text) + + # Additional work to handle highlighting JSON keys + plain = text.plain + append = text.spans.append + whitespace = self.JSON_WHITESPACE + for match in re.finditer(self.JSON_STR, plain): + start, end = match.span() + cursor = end + while cursor < len(plain): + char = plain[cursor] + cursor += 1 + if char == ":": + append(Span(start, end, "json.key")) + elif char in whitespace: + continue + break + + +class ISO8601Highlighter(RegexHighlighter): + """Highlights the ISO8601 date time strings. + Regex reference: https://www.oreilly.com/library/view/regular-expressions-cookbook/9781449327453/ch04s07.html + """ + + base_style = "iso8601." + highlights = [ + # + # Dates + # + # Calendar month (e.g. 2008-08). The hyphen is required + r"^(?P[0-9]{4})-(?P1[0-2]|0[1-9])$", + # Calendar date w/o hyphens (e.g. 20080830) + r"^(?P(?P[0-9]{4})(?P1[0-2]|0[1-9])(?P3[01]|0[1-9]|[12][0-9]))$", + # Ordinal date (e.g. 2008-243). The hyphen is optional + r"^(?P(?P[0-9]{4})-?(?P36[0-6]|3[0-5][0-9]|[12][0-9]{2}|0[1-9][0-9]|00[1-9]))$", + # + # Weeks + # + # Week of the year (e.g., 2008-W35). The hyphen is optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9]))$", + # Week date (e.g., 2008-W35-6). The hyphens are optional + r"^(?P(?P[0-9]{4})-?W(?P5[0-3]|[1-4][0-9]|0[1-9])-?(?P[1-7]))$", + # + # Times + # + # Hours and minutes (e.g., 17:21). The colon is optional + r"^(?P