diff options
author | albert-github <albert.tests@gmail.com> | 2018-10-01 16:58:03 (GMT) |
---|---|---|
committer | albert-github <albert.tests@gmail.com> | 2018-10-01 16:58:03 (GMT) |
commit | 47fee387821113956e10fffa79ea22062de8c817 (patch) | |
tree | 7762308ebbeb2f3465b6515450e2314ab048eb6f /src | |
parent | d7d4d5c443887cc63211febe40d43f26dfe41bc0 (diff) | |
download | Doxygen-47fee387821113956e10fffa79ea22062de8c817.zip Doxygen-47fee387821113956e10fffa79ea22062de8c817.tar.gz Doxygen-47fee387821113956e10fffa79ea22062de8c817.tar.bz2 |
issue_6517: Emoji support
Added issue support for the different output types.
- Sources of the emoji
- based on the Unicode definition v11.0:
- https://unicode.org/emoji/charts/full-emoji-list.html
- http://www.unicode.org/emoji/charts/full-emoji-modifiers.html
- github definition list:
- https://api.github.com/emojis
- Input of emoji: :<test>: with the restriction that direct after the opening colon and direct before the closing colon no space is allowed
- doctokinizer.l, adding detection of emoji and new command `\:`
- doktokinizer.h, adding "word" type TK_EMOJI
- docparser.* handling of new "word" type TK_EMOJI (analogous to HTML Entities), handling of new command `\:`
- cmdmapper,cpp, cmdmapper.h, adding new command `\:`
- htmlentity.cpp, adding new definition required for new command `\:`
- Emoji
- emoji.cpp, emoji.h, class for handling emoji analogous to HTML Entities, including small directions on how to update the code when a new emoji is defined. Not everything is converted to lowercase for comparison and accents are removed.
- doxygen.cpp possibility to create list of supported emoji
- handling emoji for output types (analogous to HTML Entities), see documentation for different output types
- docparser.h, *docvisitor.*
- rtfdocvisitor.* converting output to UTF-16 (based on http://scruss.com/blog/2017/03/12/in-the-unlikely-event-you-need-to-represent-emoji-in-rtf-using-perl/)
- latexdocvisitor.*, handling arguments for emoji in output (see also latexgen.cpp for meaning of the arguments of doxygenemoji).
- latexgen.cpp, adding new latex command for doxygen (doxygenemoji) and prevent too many open file (code before documentclass)
- config.xml, definition of `LATEX_EMOJI_DIRECTORY` with path to images required for LaTeX output
- Documentation:
- emojisup.doc, user description
- commands.doc, description of new command `\:`
- index.doc, reference to emoji chapter
- xmlcmds.doc, adjust reference to next chapter as a new chapter is added
- Doxyfile*, adding emoji chapter
Build system
- CMakeLists.txt adding new files
Diffstat (limited to 'src')
-rw-r--r-- | src/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/cmdmapper.cpp | 1 | ||||
-rw-r--r-- | src/cmdmapper.h | 3 | ||||
-rw-r--r-- | src/config.xml | 10 | ||||
-rw-r--r-- | src/docbookvisitor.cpp | 16 | ||||
-rw-r--r-- | src/docbookvisitor.h | 1 | ||||
-rw-r--r-- | src/docparser.cpp | 123 | ||||
-rw-r--r-- | src/docparser.h | 20 | ||||
-rw-r--r-- | src/doctokenizer.h | 1 | ||||
-rw-r--r-- | src/doctokenizer.l | 20 | ||||
-rw-r--r-- | src/docvisitor.h | 2 | ||||
-rw-r--r-- | src/doxygen.cpp | 33 | ||||
-rw-r--r-- | src/emoji.cpp | 3187 | ||||
-rw-r--r-- | src/emoji.h | 50 | ||||
-rw-r--r-- | src/htmldocvisitor.cpp | 15 | ||||
-rw-r--r-- | src/htmldocvisitor.h | 1 | ||||
-rw-r--r-- | src/htmlentity.cpp | 3 | ||||
-rw-r--r-- | src/latexdocvisitor.h | 1 | ||||
-rw-r--r-- | src/latexgen.cpp | 16 | ||||
-rw-r--r-- | src/mandocvisitor.cpp | 17 | ||||
-rw-r--r-- | src/mandocvisitor.h | 1 | ||||
-rw-r--r-- | src/perlmodgen.cpp | 7 | ||||
-rw-r--r-- | src/printdocvisitor.h | 14 | ||||
-rw-r--r-- | src/rtfdocvisitor.cpp | 43 | ||||
-rw-r--r-- | src/rtfdocvisitor.h | 1 | ||||
-rw-r--r-- | src/textdocvisitor.cpp | 13 | ||||
-rw-r--r-- | src/textdocvisitor.h | 1 | ||||
-rw-r--r-- | src/xmldocvisitor.cpp | 15 |
28 files changed, 3610 insertions, 6 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index b57d360..4dc31fa 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -183,6 +183,7 @@ add_library(_doxygen STATIC dot.cpp doxygen.cpp eclipsehelp.cpp + emoji.cpp entry.cpp filedef.cpp filename.cpp diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 71da3f3..acbbe44 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -120,6 +120,7 @@ CommandMap cmdMap[] = { ".", CMD_PUNT }, { "+", CMD_PLUS }, { "-", CMD_MINUS }, + { ":", CMD_COLON }, { "::", CMD_DCOLON }, { "\"", CMD_QUOTE }, { "_internalref", CMD_INTERNALREF }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index d06de63..c1747ee 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -136,7 +136,8 @@ enum CommandType CMD_MINUS = 106, CMD_INCLUDEDOC = 107, CMD_SNIPPETDOC = 108, - CMD_SNIPWITHLINES= 109 + CMD_SNIPWITHLINES= 109, + CMD_COLON = 110 }; enum HtmlTagType diff --git a/src/config.xml b/src/config.xml index 08795dc..43144fc 100644 --- a/src/config.xml +++ b/src/config.xml @@ -2769,6 +2769,16 @@ or ]]> </docs> </option> + <option type='string' id='LATEX_EMOJI_DIRECTORY' format='dir' defval='' depends='GENERATE_LATEX'> + <docs> +<![CDATA[ + The \c LATEX_EMOJI_DIRECTORY tag is used to specify the (relative or absolute) + path from which the emoji images will be read. + If a relative path is entered, it will be relative to the \ref cfg_latex_output "LATEX_OUTPUT" + directory. If left blank the \ref cfg_latex_output "LATEX_OUTPUT" directory will be used. +]]> + </docs> + </option> </group> <group name='RTF' docs='Configuration options related to the RTF output'> <option type='bool' id='GENERATE_RTF' defval='0'> diff --git a/src/docbookvisitor.cpp b/src/docbookvisitor.cpp index da84931..fa6a7e8 100644 --- a/src/docbookvisitor.cpp +++ b/src/docbookvisitor.cpp @@ -34,6 +34,7 @@ #include "msc.h" #include "dia.h" #include "htmlentity.h" +#include "emoji.h" #include "plantuml.h" #if 0 @@ -168,6 +169,21 @@ DB_VIS_C } } +void DocbookDocVisitor::visit(DocEmoji *s) +{ +DB_VIS_C + if (m_hide) return; + const char *res = EmojiEntityMapper::instance()->docbook(s->emoji()); + if (res) + { + m_t << res; + } + else + { + err("DocBook: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } +} + void DocbookDocVisitor::visit(DocURL *u) { DB_VIS_C diff --git a/src/docbookvisitor.h b/src/docbookvisitor.h index 40f8a68..bf1c3b2 100644 --- a/src/docbookvisitor.h +++ b/src/docbookvisitor.h @@ -42,6 +42,7 @@ class DocbookDocVisitor : public DocVisitor void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); diff --git a/src/docparser.cpp b/src/docparser.cpp index b39b80e..633dc03 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -55,6 +55,7 @@ #include "growbuf.h" #include "markdown.h" #include "htmlentity.h" +#include "emoji.h" // debug off #define DBG(x) do {} while(0) @@ -909,6 +910,10 @@ static int handleStyleArgument(DocNode *parent,QList<DocNode> &children, warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found while handling command %s", qPrint(g_token->name),qPrint(cmdName)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found while handling command %s", + qPrint(g_token->name),qPrint(cmdName)); + break; case TK_HTMLTAG: if (insideLI(parent) && Mappers::htmlTagMapper->map(g_token->name) && g_token->endTag) { // ignore </li> as the end of a style command @@ -1307,6 +1312,10 @@ static void defaultHandleTitleAndSize(const int cmd, DocNode *parent, QList<DocN warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -1369,7 +1378,7 @@ static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children handleWord) { DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno)); - if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL || + if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_EMOJI|| tok==TK_URL || tok==TK_COMMAND || tok==TK_HTMLTAG ) { @@ -1404,6 +1413,9 @@ reparsetoken: case CMD_HASH: children.append(new DocSymbol(parent,DocSymbol::Sym_Hash)); break; + case CMD_COLON: + children.append(new DocSymbol(parent,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: children.append(new DocSymbol(parent,DocSymbol::Sym_DoubleColon)); break; @@ -1692,6 +1704,19 @@ reparsetoken: } } break; + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(tokenName); + if (s!=0) + { + children.append(new DocEmoji(parent,s)); + } + else + { + return FALSE; + } + } + break; case TK_WHITESPACE: case TK_NEWPARA: handlepara: @@ -1769,6 +1794,12 @@ DocSymbol::SymType DocSymbol::decodeSymbol(const QCString &symName) return HtmlEntityMapper::instance()->name2sym(symName); } +int DocEmoji::decodeEmoji(const QCString &symName) +{ + DBG(("decodeSymbol(%s)\n",qPrint(symName))); + return EmojiEntityMapper::instance()->name2sym(symName); +} + //--------------------------------------------------------------------------- static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children, @@ -2340,6 +2371,10 @@ void DocSecRefItem::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -2482,6 +2517,10 @@ void DocInternalRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -2638,6 +2677,10 @@ void DocRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: break; default: @@ -2772,6 +2815,10 @@ QCString DocLink::parse(bool isJavaLink,bool isXmlLink) warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: if (g_token->name!="see" || !isXmlLink) { @@ -2963,6 +3010,10 @@ void DocVhdlFlow::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -3099,6 +3150,10 @@ int DocHtmlHeader::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -3142,6 +3197,10 @@ int DocHRef::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { @@ -3292,6 +3351,19 @@ int DocIndexEntry::parse() } } break; + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(g_token->name); + if (s != 0) + { + m_entry+=g_token->name; + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected emoji found as argument of \\addindex"); + } + } + break; case TK_COMMAND: switch (Mappers::cmdMapper->map(g_token->name)) { @@ -3302,6 +3374,7 @@ int DocIndexEntry::parse() case CMD_AMP: m_entry+='&'; break; case CMD_DOLLAR: m_entry+='$'; break; case CMD_HASH: m_entry+='#'; break; + case CMD_COLON: m_entry+=":"; break; case CMD_DCOLON: m_entry+="::"; break; case CMD_PERCENT: m_entry+='%'; break; case CMD_NDASH: m_entry+="--"; break; @@ -3388,6 +3461,10 @@ int DocHtmlCaption::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { int tagId=Mappers::htmlTagMapper->map(g_token->name); @@ -3997,6 +4074,10 @@ int DocHtmlDescTitle::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; case TK_HTMLTAG: { int tagId=Mappers::htmlTagMapper->map(g_token->name); @@ -4550,6 +4631,10 @@ void DocTitle::parse() warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported symbol %s found", qPrint(g_token->name)); break; + case TK_EMOJI: + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + break; default: warn_doc_error(g_fileName,doctokenizerYYlineno,"Unexpected token %s", tokToString(tok)); @@ -5467,6 +5552,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_PIPE: m_children.append(new DocSymbol(this,DocSymbol::Sym_Pipe)); break; + case CMD_COLON: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon)); break; @@ -6524,7 +6612,7 @@ int DocPara::parse() { reparsetoken: DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno)); - if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL || + if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_EMOJI || tok==TK_URL || tok==TK_COMMAND || tok==TK_HTMLTAG ) { @@ -6780,6 +6868,20 @@ reparsetoken: } break; } + case TK_EMOJI: + { + int s = DocEmoji::decodeEmoji(g_token->name); + if (s!=0) + { + m_children.append(new DocEmoji(this,s)); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + } + break; + } case TK_NEWPARA: retval=TK_NEWPARA; goto endparagraph; @@ -6994,6 +7096,20 @@ void DocText::parse() } } break; + case TK_EMOJI: + { + int s = DocSymbol::decodeSymbol(g_token->name); + if (s!=0) + { + m_children.append(new DocEmoji(this,s)); + } + else + { + warn_doc_error(g_fileName,doctokenizerYYlineno,"Unsupported emoji '%s' found", + qPrint(g_token->name)); + } + } + break; case TK_COMMAND: switch (Mappers::cmdMapper->map(g_token->name)) { @@ -7018,6 +7134,9 @@ void DocText::parse() case CMD_HASH: m_children.append(new DocSymbol(this,DocSymbol::Sym_Hash)); break; + case CMD_COLON: + m_children.append(new DocSymbol(this,DocSymbol::Sym_Colon)); + break; case CMD_DCOLON: m_children.append(new DocSymbol(this,DocSymbol::Sym_DoubleColon)); break; diff --git a/src/docparser.h b/src/docparser.h index 68f9fc1..8aca82d 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -140,7 +140,8 @@ class DocNode Kind_HtmlBlockQuote = 49, Kind_VhdlFlow = 50, Kind_ParBlock = 51, - Kind_DiaFile = 52 + Kind_DiaFile = 52, + Kind_Emoji = 53 }; /*! Creates a new node */ DocNode() : m_parent(0), m_insidePre(FALSE) {} @@ -454,7 +455,7 @@ class DocSymbol : public DocNode /* doxygen commands mapped */ Sym_BSlash, Sym_At, Sym_Less, Sym_Greater, Sym_Amp, Sym_Dollar, Sym_Hash, Sym_DoubleColon, Sym_Percent, Sym_Pipe, - Sym_Quot, Sym_Minus, Sym_Plus, Sym_Dot + Sym_Quot, Sym_Minus, Sym_Plus, Sym_Dot, Sym_Colon }; enum PerlType { Perl_unknown = 0, Perl_string, Perl_char, Perl_symbol, Perl_umlaut, Perl_acute, Perl_grave, Perl_circ, Perl_slash, Perl_tilde, @@ -475,6 +476,21 @@ class DocSymbol : public DocNode SymType m_symbol; }; +/** Node representing a n emoji */ +class DocEmoji : public DocNode +{ + public: + DocEmoji(DocNode *parent,int s) : + m_symbol(s) { m_parent = parent; } + int emoji() const { return m_symbol; } + Kind kind() const { return Kind_Emoji; } + void accept(DocVisitor *v) { v->visit(this); } + static int decodeEmoji(const QCString &symName); + + private: + int m_symbol; +}; + /** Node representing some amount of white space */ class DocWhiteSpace : public DocNode { diff --git a/src/doctokenizer.h b/src/doctokenizer.h index b3b9fa5..50307ae 100644 --- a/src/doctokenizer.h +++ b/src/doctokenizer.h @@ -40,6 +40,7 @@ enum Tokens TK_NEWPARA = 9, TK_RCSTAG = 10, TK_URL = 11, + TK_EMOJI = 12, RetVal_OK = 0x10000, RetVal_SimpleSec = 0x10001, diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 3118cfd..7f6c98f 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -122,6 +122,7 @@ const char *tokToString(int token) case TK_NEWPARA: return "TK_NEWPARA"; case TK_RCSTAG: return "TK_RCSTAG"; case TK_URL: return "TK_URL"; + case TK_EMOJI: return "TK_EMOJI"; } return "ERROR"; } @@ -332,6 +333,7 @@ CMD ("\\"|"@") WS [ \t\r\n] NONWS [^ \t\r\n] BLANK [ \t\r] +EMOJI (":"[a-z_A-Z0-9\x80-\xFF"'+()&\*\.!,#-]":"|":"[a-z_A-Z0-9\x80-\xFF"'+()&\*\.!,#-][a-z_A-Z0-9\x80-\xFF "'+()&\*\.!,#-]*[a-z_A-Z0-9\x80-\xFF"'+()&\*\.!,#-]":") ID "$"?[a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]* LABELID [a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF\-]* PHPTYPE [\\:a-z_A-Z0-9\x80-\xFF\-]+ @@ -358,6 +360,7 @@ SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}|"--"|"---") SPCMD2 {CMD}[\\@<>&$#%~".+|-] SPCMD3 {CMD}form#[0-9]+ SPCMD4 {CMD}"::" +SPCMD5 {CMD}":" INOUT "inout"|"in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in") PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]" VARARGS "..." @@ -583,6 +586,7 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} } <St_Para>{SPCMD1} | <St_Para>{SPCMD2} | +<St_Para>{SPCMD5} | <St_Para>{SPCMD4} { /* special command */ g_token->name = yytext+1; g_token->name = g_token->name.stripWhiteSpace(); @@ -674,6 +678,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +<St_Para,St_Text>{EMOJI} { /* emoji symbol */ + g_token->name = yytext; + return TK_EMOJI; + } /********* patterns for linkable words ******************/ @@ -920,6 +928,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +<St_TitleN>{EMOJI} { /* emoji */ + g_token->name = yytext; + return TK_EMOJI; + } <St_TitleN>{HTMLTAG} { } <St_TitleN>{SPCMD1} | @@ -956,6 +968,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +<St_TitleQ>{EMOJI} { /* emoji */ + g_token->name = yytext; + return TK_EMOJI; + } <St_TitleQ>{SPCMD1} | <St_TitleQ>{SPCMD2} { /* special command */ g_token->name = yytext+1; @@ -1087,6 +1103,10 @@ REFWORD_NOCV {LABELID}|{REFWORD2_NOCV}|{REFWORD3}|{REFWORD4_NOCV} g_token->name = yytext; return TK_SYMBOL; } +<St_Ref2>{EMOJI} { /* emoji */ + g_token->name = yytext; + return TK_EMOJI; + } <St_Ref2>{SPCMD1} | <St_Ref2>{SPCMD2} { /* special command */ g_token->name = yytext+1; diff --git a/src/docvisitor.h b/src/docvisitor.h index 18fb743..d2318c9 100644 --- a/src/docvisitor.h +++ b/src/docvisitor.h @@ -37,6 +37,7 @@ class DocAutoListItem; class DocPara; class DocRoot; class DocSymbol; +class DocEmoji; class DocURL; class DocStyleChange; class DocSimpleSect; @@ -101,6 +102,7 @@ class DocVisitor virtual void visit(DocWord *) = 0; virtual void visit(DocWhiteSpace *) = 0; virtual void visit(DocSymbol *) = 0; + virtual void visit(DocEmoji *) = 0; virtual void visit(DocURL *) = 0; virtual void visit(DocStyleChange *) = 0; virtual void visit(DocVerbatim *) = 0; diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 9d8a914..cd2cc8d 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -103,6 +103,7 @@ #include "settings.h" #include "context.h" #include "fileparser.h" +#include "emoji.h" // provided by the generated file resources.cpp extern void initResources(); @@ -10029,6 +10030,9 @@ static void usage(const char *name) msg(" RTF: %s -e rtf extensionsFile\n\n",name); msg("7) Use doxygen to compare the used configuration file with the template configuration file\n"); msg(" %s -x [configFile]\n\n",name); + msg("8) Use doxygen to show a list of build in emoji.\n"); + msg(" %s -f emoji outputFileName\n\n",name); + msg(" If - is used for outputFileName doxygen will write to standard output.\n\n"); msg("If -s is specified the comments of the configuration items in the config file will be omitted.\n"); msg("If configName is omitted `Doxyfile' will be used as a default.\n\n"); msg("-v print version string\n"); @@ -10229,6 +10233,7 @@ void readConfiguration(int argc, char **argv) const char *layoutName=0; const char *debugLabel; const char *formatName; + const char *listName; bool genConfig=FALSE; bool shortList=FALSE; bool diffList=FALSE; @@ -10306,6 +10311,34 @@ void readConfiguration(int argc, char **argv) cleanUpDoxygen(); exit(1); break; + case 'f': + listName=getArg(argc,argv,optind); + if (!listName) + { + err("option \"-f\" is missing list specifier.\n"); + cleanUpDoxygen(); + exit(1); + } + if (qstricmp(listName,"emoji")==0) + { + if (optind+1>=argc) + { + err("option \"-f emoji\" is missing an output file name\n"); + cleanUpDoxygen(); + exit(1); + } + QFile f; + if (openOutputFile(argv[optind+1],f)) + { + EmojiEntityMapper::instance()->writeEmojiFile(f); + } + cleanUpDoxygen(); + exit(0); + } + err("option \"-f\" has invalid list specifier.\n"); + cleanUpDoxygen(); + exit(1); + break; case 'w': formatName=getArg(argc,argv,optind); if (!formatName) diff --git a/src/emoji.cpp b/src/emoji.cpp new file mode 100644 index 0000000..f27ae38 --- /dev/null +++ b/src/emoji.cpp @@ -0,0 +1,3187 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2015 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ + +#include "emoji.h" +#include "message.h" +#include "ftextstream.h" +#include "util.h" + +/* to generate the content of this table see the documentation at the end of this file */ +static struct emojiEntityInfo +{ + const char *githubName; + const char *unicodeName; + const char *code; +} g_emojiEntities[] = +{ + {":+1:", ":thumbs up:", "👍"}, + {":-1:", ":thumbs down:", "👎"}, + {":100:", ":hundred points:", "💯"}, + {":1234:", ":input numbers:", "🔢"}, + {":1st_place_medal:", ":1st place medal:", "🥇"}, + {":2nd_place_medal:", ":2nd place medal:", "🥈"}, + {":3rd_place_medal:", ":3rd place medal:", "🥉"}, + {":8ball:", ":pool 8 ball:", "🎱"}, + {":a:", ":a button (blood type):", "🅰"}, + {":ab:", ":ab button (blood type):", "🆎"}, + {":abc:", ":input latin letters:", "🔤"}, + {":abcd:", ":input latin lowercase:", "🔡"}, + {":accept:", ":japanese \"acceptable\" button:", "🉑"}, + {":aerial_tramway:", ":aerial tramway:", "🚡"}, + {":afghanistan:", ":flag afghanistan:", "🇦🇫"}, + {":airplane:", ":airplane:", "✈"}, + {":aland_islands:", ":flag Ă…land islands:", "🇦🇽"}, + {":alarm_clock:", ":alarm clock:", "⏰"}, + {":albania:", ":flag albania:", "🇦🇱"}, + {":alembic:", ":alembic:", "⚗"}, + {":algeria:", ":flag algeria:", "🇩🇿"}, + {":alien:", ":alien:", "👽"}, + {":ambulance:", ":ambulance:", "🚑"}, + {":american_samoa:", ":flag american samoa:", "🇦🇸"}, + {":amphora:", ":amphora:", "🏺"}, + {":anchor:", ":anchor:", "⚓"}, + {":andorra:", ":flag andorra:", "🇦🇩"}, + {":angel:", ":baby angel:", "👼"}, + {":anger:", ":anger symbol:", "💢"}, + {":angola:", ":flag angola:", "🇦🇴"}, + {":angry:", ":angry face:", "😠"}, + {":anguilla:", ":flag anguilla:", "🇦🇮"}, + {":anguished:", ":anguished face:", "😧"}, + {":ant:", ":ant:", "🐜"}, + {":antarctica:", ":flag antarctica:", "🇦🇶"}, + {":antigua_barbuda:", ":flag antigua & barbuda:", "🇦🇬"}, + {":apple:", ":red apple:", "🍎"}, + {":aquarius:", ":aquarius:", "♒"}, + {":argentina:", ":flag argentina:", "🇦🇷"}, + {":aries:", ":aries:", "♈"}, + {":armenia:", ":flag armenia:", "🇦🇲"}, + {":arrow_backward:", ":reverse button:", "◀"}, + {":arrow_double_down:", ":fast down button:", "⏬"}, + {":arrow_double_up:", ":fast up button:", "⏫"}, + {":arrow_down:", ":down arrow:", "⬇"}, + {":arrow_down_small:", ":downwards button:", "🔽"}, + {":arrow_forward:", ":play button:", "▶"}, + {":arrow_heading_down:", ":right arrow curving down:", "⤵"}, + {":arrow_heading_up:", ":right arrow curving up:", "⤴"}, + {":arrow_left:", ":left arrow:", "⬅"}, + {":arrow_lower_left:", ":down-left arrow:", "↙"}, + {":arrow_lower_right:", ":down-right arrow:", "↘"}, + {":arrow_right:", ":right arrow:", "➡"}, + {":arrow_right_hook:", ":left arrow curving right:", "↪"}, + {":arrow_up:", ":up arrow:", "⬆"}, + {":arrow_up_down:", ":up-down arrow:", "↕"}, + {":arrow_up_small:", ":upwards button:", "🔼"}, + {":arrow_upper_left:", ":up-left arrow:", "↖"}, + {":arrow_upper_right:", ":up-right arrow:", "↗"}, + {":arrows_clockwise:", ":clockwise vertical arrows:", "🔃"}, + {":arrows_counterclockwise:", ":counterclockwise arrows button:", "🔄"}, + {":art:", ":artist palette:", "🎨"}, + {":articulated_lorry:", ":articulated lorry:", "🚛"}, + {":artificial_satellite:", ":satellite:", "🛰"}, + {":aruba:", ":flag aruba:", "🇦🇼"}, + {":asterisk:", ":keycap *:", "*️⃣"}, + {":astonished:", ":astonished face:", "😲"}, + {":athletic_shoe:", ":running shoe:", "👟"}, + {":atm:", ":atm sign:", "🏧"}, + {":atom_symbol:", ":atom symbol:", "⚛"}, + {":australia:", ":flag australia:", "🇦🇺"}, + {":austria:", ":flag austria:", "🇦🇹"}, + {":avocado:", ":avocado:", "🥑"}, + {":azerbaijan:", ":flag azerbaijan:", "🇦🇿"}, + {":b:", ":b button (blood type):", "🅱"}, + {":baby:", ":baby:", "👶"}, + {":baby_bottle:", ":baby bottle:", "🍼"}, + {":baby_chick:", ":baby chick:", "🐤"}, + {":baby_symbol:", ":baby symbol:", "🚼"}, + {":back:", ":back arrow:", "🔙"}, + {":bacon:", ":bacon:", "🥓"}, + {":badminton:", ":badminton:", "🏸"}, + {":baggage_claim:", ":baggage claim:", "🛄"}, + {":baguette_bread:", ":baguette bread:", "🥖"}, + {":bahamas:", ":flag bahamas:", "🇧🇸"}, + {":bahrain:", ":flag bahrain:", "🇧🇭"}, + {":balance_scale:", ":balance scale:", "⚖"}, + {":balloon:", ":balloon:", "🎈"}, + {":ballot_box:", ":ballot box with ballot:", "🗳"}, + {":ballot_box_with_check:", ":ballot box with check:", "☑"}, + {":bamboo:", ":pine decoration:", "🎍"}, + {":banana:", ":banana:", "🍌"}, + {":bangbang:", ":double exclamation mark:", "‼"}, + {":bangladesh:", ":flag bangladesh:", "🇧🇩"}, + {":bank:", ":bank:", "🏦"}, + {":bar_chart:", ":bar chart:", "📊"}, + {":barbados:", ":flag barbados:", "🇧🇧"}, + {":barber:", ":barber pole:", "💈"}, + {":baseball:", ":baseball:", "⚾"}, + {":basketball:", ":basketball:", "🏀"}, + {":basketball_man:", ":person bouncing ball:", "⛹"}, + {":basketball_woman:", ":woman bouncing ball:", "⛹️‍♀️"}, + {":bat:", ":bat:", "🦇"}, + {":bath:", ":person taking bath:", "🛀"}, + {":bathtub:", ":bathtub:", "🛁"}, + {":battery:", ":battery:", "🔋"}, + {":beach_umbrella:", ":beach with umbrella:", "🏖"}, + {":bear:", ":bear face:", "🐻"}, + {":bed:", ":bed:", "🛏"}, + {":bee:", ":honeybee:", "🐝"}, + {":beer:", ":beer mug:", "🍺"}, + {":beers:", ":clinking beer mugs:", "🍻"}, + {":beetle:", ":lady beetle:", "🐞"}, + {":beginner:", ":japanese symbol for beginner:", "🔰"}, + {":belarus:", ":flag belarus:", "🇧🇾"}, + {":belgium:", ":flag belgium:", "🇧🇪"}, + {":belize:", ":flag belize:", "🇧🇿"}, + {":bell:", ":bell:", "🔔"}, + {":bellhop_bell:", ":bellhop bell:", "🛎"}, + {":benin:", ":flag benin:", "🇧🇯"}, + {":bento:", ":bento box:", "🍱"}, + {":bermuda:", ":flag bermuda:", "🇧🇲"}, + {":bhutan:", ":flag bhutan:", "🇧🇹"}, + {":bicyclist:", ":person biking:", "🚴"}, + {":bike:", ":bicycle:", "🚲"}, + {":biking_man:", ":person biking:", "🚴"}, + {":biking_woman:", ":woman biking:", "🚴‍♀️"}, + {":bikini:", ":bikini:", "👙"}, + {":biohazard:", ":biohazard:", "☣"}, + {":bird:", ":bird:", "🐦"}, + {":birthday:", ":birthday cake:", "🎂"}, + {":black_circle:", ":black circle:", "⚫"}, + {":black_flag:", ":black flag:", "🏴"}, + {":black_heart:", ":black heart:", "🖤"}, + {":black_joker:", ":joker:", "🃏"}, + {":black_large_square:", ":black large square:", "⬛"}, + {":black_medium_small_square:", ":black medium-small square:", "◾"}, + {":black_medium_square:", ":black medium square:", "◼"}, + {":black_nib:", ":black nib:", "✒"}, + {":black_small_square:", ":black small square:", "▪"}, + {":black_square_button:", ":black square button:", "🔲"}, + {":blonde_man:", ":person blond hair:", "👱"}, + {":blonde_woman:", ":woman blond hair:", "👱‍♀️"}, + {":blossom:", ":blossom:", "🌼"}, + {":blowfish:", ":blowfish:", "🐡"}, + {":blue_book:", ":blue book:", "📘"}, + {":blue_car:", ":sport utility vehicle:", "🚙"}, + {":blue_heart:", ":blue heart:", "💙"}, + {":blush:", ":smiling face with smiling eyes:", "😊"}, + {":boar:", ":boar:", "🐗"}, + {":boat:", ":sailboat:", "⛵"}, + {":bolivia:", ":flag bolivia:", "🇧🇴"}, + {":bomb:", ":bomb:", "💣"}, + {":book:", ":open book:", "📖"}, + {":bookmark:", ":bookmark:", "🔖"}, + {":bookmark_tabs:", ":bookmark tabs:", "📑"}, + {":books:", ":books:", "📚"}, + {":boom:", ":collision:", "💥"}, + {":boot:", ":woman's boot:", "👢"}, + {":bosnia_herzegovina:", ":flag bosnia & herzegovina:", "🇧🇦"}, + {":botswana:", ":flag botswana:", "🇧🇼"}, + {":bouquet:", ":bouquet:", "💐"}, + {":bow:", ":person bowing:", "🙇"}, + {":bow_and_arrow:", ":bow and arrow:", "🏹"}, + {":bowing_man:", ":person bowing:", "🙇"}, + {":bowing_woman:", ":woman bowing:", "🙇‍♀️"}, + {":bowling:", ":bowling:", "🎳"}, + {":boxing_glove:", ":boxing glove:", "🥊"}, + {":boy:", ":boy:", "👦"}, + {":brazil:", ":flag brazil:", "🇧🇷"}, + {":bread:", ":bread:", "🍞"}, + {":bride_with_veil:", ":bride with veil:", "👰"}, + {":bridge_at_night:", ":bridge at night:", "🌉"}, + {":briefcase:", ":briefcase:", "💼"}, + {":british_indian_ocean_territory:", ":flag british indian ocean territory:", "🇮🇴"}, + {":british_virgin_islands:", ":flag british virgin islands:", "🇻🇬"}, + {":broken_heart:", ":broken heart:", "💔"}, + {":brunei:", ":flag brunei:", "🇧🇳"}, + {":bug:", ":bug:", "🐛"}, + {":building_construction:", ":building construction:", "🏗"}, + {":bulb:", ":light bulb:", "💡"}, + {":bulgaria:", ":flag bulgaria:", "🇧🇬"}, + {":bullettrain_front:", ":bullet train:", "🚅"}, + {":bullettrain_side:", ":high-speed train:", "🚄"}, + {":burkina_faso:", ":flag burkina faso:", "🇧🇫"}, + {":burrito:", ":burrito:", "🌯"}, + {":burundi:", ":flag burundi:", "🇧🇮"}, + {":bus:", ":bus:", "🚌"}, + {":business_suit_levitating:", ":man in suit levitating:", "🕴"}, + {":busstop:", ":bus stop:", "🚏"}, + {":bust_in_silhouette:", ":bust in silhouette:", "👤"}, + {":busts_in_silhouette:", ":busts in silhouette:", "👥"}, + {":butterfly:", ":butterfly:", "🦋"}, + {":cactus:", ":cactus:", "🌵"}, + {":cake:", ":shortcake:", "🍰"}, + {":calendar:", ":tear-off calendar:", "📆"}, + {":call_me_hand:", ":call me hand:", "🤙"}, + {":calling:", ":mobile phone with arrow:", "📲"}, + {":cambodia:", ":flag cambodia:", "🇰🇭"}, + {":camel:", ":two-hump camel:", "🐫"}, + {":camera:", ":camera:", "📷"}, + {":camera_flash:", ":camera with flash:", "📸"}, + {":cameroon:", ":flag cameroon:", "🇨🇲"}, + {":camping:", ":camping:", "🏕"}, + {":canada:", ":flag canada:", "🇨🇦"}, + {":canary_islands:", ":flag canary islands:", "🇮🇨"}, + {":cancer:", ":cancer:", "♋"}, + {":candle:", ":candle:", "🕯"}, + {":candy:", ":candy:", "🍬"}, + {":canoe:", ":canoe:", "🛶"}, + {":cape_verde:", ":flag cape verde:", "🇨🇻"}, + {":capital_abcd:", ":input latin uppercase:", "🔠"}, + {":capricorn:", ":capricorn:", "♑"}, + {":car:", ":automobile:", "🚗"}, + {":card_file_box:", ":card file box:", "🗃"}, + {":card_index:", ":card index:", "📇"}, + {":card_index_dividers:", ":card index dividers:", "🗂"}, + {":caribbean_netherlands:", ":flag caribbean netherlands:", "🇧🇶"}, + {":carousel_horse:", ":carousel horse:", "🎠"}, + {":carrot:", ":carrot:", "🥕"}, + {":cat:", ":cat face:", "🐱"}, + {":cat2:", ":cat:", "🐈"}, + {":cayman_islands:", ":flag cayman islands:", "🇰🇾"}, + {":cd:", ":optical disk:", "💿"}, + {":central_african_republic:", ":flag central african republic:", "🇨🇫"}, + {":chad:", ":flag chad:", "🇹🇩"}, + {":chains:", ":chains:", "⛓"}, + {":champagne:", ":bottle with popping cork:", "🍾"}, + {":chart:", ":chart increasing with yen:", "💹"}, + {":chart_with_downwards_trend:", ":chart decreasing:", "📉"}, + {":chart_with_upwards_trend:", ":chart increasing:", "📈"}, + {":checkered_flag:", ":chequered flag:", "🏁"}, + {":cheese:", ":cheese wedge:", "🧀"}, + {":cherries:", ":cherries:", "🍒"}, + {":cherry_blossom:", ":cherry blossom:", "🌸"}, + {":chestnut:", ":chestnut:", "🌰"}, + {":chicken:", ":chicken:", "🐔"}, + {":children_crossing:", ":children crossing:", "🚸"}, + {":chile:", ":flag chile:", "🇨🇱"}, + {":chipmunk:", ":chipmunk:", "🐿"}, + {":chocolate_bar:", ":chocolate bar:", "🍫"}, + {":christmas_island:", ":flag christmas island:", "🇨🇽"}, + {":christmas_tree:", ":christmas tree:", "🎄"}, + {":church:", ":church:", "⛪"}, + {":cinema:", ":cinema:", "🎦"}, + {":circus_tent:", ":circus tent:", "🎪"}, + {":city_sunrise:", ":sunset:", "🌇"}, + {":city_sunset:", ":cityscape at dusk:", "🌆"}, + {":cityscape:", ":cityscape:", "🏙"}, + {":cl:", ":cl button:", "🆑"}, + {":clamp:", ":clamp:", "🗜"}, + {":clap:", ":clapping hands:", "👏"}, + {":clapper:", ":clapper board:", "🎬"}, + {":classical_building:", ":classical building:", "🏛"}, + {":clinking_glasses:", ":clinking glasses:", "🥂"}, + {":clipboard:", ":clipboard:", "📋"}, + {":clock1:", ":one o'clock:", "🕐"}, + {":clock10:", ":ten o'clock:", "🕙"}, + {":clock1030:", ":ten-thirty:", "🕥"}, + {":clock11:", ":eleven o'clock:", "🕚"}, + {":clock1130:", ":eleven-thirty:", "🕦"}, + {":clock12:", ":twelve o'clock:", "🕛"}, + {":clock1230:", ":twelve-thirty:", "🕧"}, + {":clock130:", ":one-thirty:", "🕜"}, + {":clock2:", ":two o'clock:", "🕑"}, + {":clock230:", ":two-thirty:", "🕝"}, + {":clock3:", ":three o'clock:", "🕒"}, + {":clock330:", ":three-thirty:", "🕞"}, + {":clock4:", ":four o'clock:", "🕓"}, + {":clock430:", ":four-thirty:", "🕟"}, + {":clock5:", ":five o'clock:", "🕔"}, + {":clock530:", ":five-thirty:", "🕠"}, + {":clock6:", ":six o'clock:", "🕕"}, + {":clock630:", ":six-thirty:", "🕡"}, + {":clock7:", ":seven o'clock:", "🕖"}, + {":clock730:", ":seven-thirty:", "🕢"}, + {":clock8:", ":eight o'clock:", "🕗"}, + {":clock830:", ":eight-thirty:", "🕣"}, + {":clock9:", ":nine o'clock:", "🕘"}, + {":clock930:", ":nine-thirty:", "🕤"}, + {":closed_book:", ":closed book:", "📕"}, + {":closed_lock_with_key:", ":locked with key:", "🔐"}, + {":closed_umbrella:", ":closed umbrella:", "🌂"}, + {":cloud:", ":cloud:", "☁"}, + {":cloud_with_lightning:", ":cloud with lightning:", "🌩"}, + {":cloud_with_lightning_and_rain:", ":cloud with lightning and rain:", "⛈"}, + {":cloud_with_rain:", ":cloud with rain:", "🌧"}, + {":cloud_with_snow:", ":cloud with snow:", "🌨"}, + {":clown_face:", ":clown face:", "🤡"}, + {":clubs:", ":club suit:", "♣"}, + {":cn:", ":flag china:", "🇨🇳"}, + {":cocktail:", ":cocktail glass:", "🍸"}, + {":cocos_islands:", ":flag cocos (keeling) islands:", "🇨🇨"}, + {":coffee:", ":hot beverage:", "☕"}, + {":coffin:", ":coffin:", "⚰"}, + {":cold_sweat:", ":anxious face with sweat:", "😰"}, + {":collision:", ":collision:", "💥"}, + {":colombia:", ":flag colombia:", "🇨🇴"}, + {":comet:", ":comet:", "☄"}, + {":comoros:", ":flag comoros:", "🇰🇲"}, + {":computer:", ":laptop computer:", "💻"}, + {":computer_mouse:", ":computer mouse:", "🖱"}, + {":confetti_ball:", ":confetti ball:", "🎊"}, + {":confounded:", ":confounded face:", "😖"}, + {":confused:", ":confused face:", "😕"}, + {":congo_brazzaville:", ":flag congo - brazzaville:", "🇨🇬"}, + {":congo_kinshasa:", ":flag congo - kinshasa:", "🇨🇩"}, + {":congratulations:", ":japanese \"congratulations\" button:", "㊗"}, + {":construction:", ":construction:", "🚧"}, + {":construction_worker:", ":construction worker:", "👷"}, + {":construction_worker_man:", ":construction worker:", "👷"}, + {":construction_worker_woman:", ":woman construction worker:", "👷‍♀️"}, + {":control_knobs:", ":control knobs:", "🎛"}, + {":convenience_store:", ":convenience store:", "🏪"}, + {":cook_islands:", ":flag cook islands:", "🇨🇰"}, + {":cookie:", ":cookie:", "🍪"}, + {":cool:", ":cool button:", "🆒"}, + {":cop:", ":police officer:", "👮"}, + {":copyright:", ":copyright:", "©"}, + {":corn:", ":ear of corn:", "🌽"}, + {":costa_rica:", ":flag costa rica:", "🇨🇷"}, + {":cote_divoire:", ":flag cĂ´te d'ivoire:", "🇨🇮"}, + {":couch_and_lamp:", ":couch and lamp:", "🛋"}, + {":couple:", ":man and woman holding hands:", "👫"}, + {":couple_with_heart:", ":couple with heart:", "💑"}, + {":couple_with_heart_man_man:", ":kiss man, man:", "👨‍❤️‍💋‍👨"}, + {":couple_with_heart_woman_man:", ":couple with heart:", "💑"}, + {":couple_with_heart_woman_woman:", ":kiss woman, woman:", "👩‍❤️‍💋‍👩"}, + {":couplekiss_man_man:", ":kiss man, man:", "👨‍❤️‍💋‍👨"}, + {":couplekiss_man_woman:", ":kiss:", "💏"}, + {":couplekiss_woman_woman:", ":kiss woman, woman:", "👩‍❤️‍💋‍👩"}, + {":cow:", ":cow face:", "🐮"}, + {":cow2:", ":cow:", "🐄"}, + {":cowboy_hat_face:", ":cowboy hat face:", "🤠"}, + {":crab:", ":crab:", "🦀"}, + {":crayon:", ":crayon:", "🖍"}, + {":credit_card:", ":credit card:", "💳"}, + {":crescent_moon:", ":crescent moon:", "🌙"}, + {":cricket:", ":cricket game:", "🏏"}, + {":croatia:", ":flag croatia:", "🇭🇷"}, + {":crocodile:", ":crocodile:", "🐊"}, + {":croissant:", ":croissant:", "🥐"}, + {":crossed_fingers:", ":crossed fingers:", "🤞"}, + {":crossed_flags:", ":crossed flags:", "🎌"}, + {":crossed_swords:", ":crossed swords:", "⚔"}, + {":crown:", ":crown:", "👑"}, + {":cry:", ":crying face:", "😢"}, + {":crying_cat_face:", ":crying cat face:", "😿"}, + {":crystal_ball:", ":crystal ball:", "🔮"}, + {":cuba:", ":flag cuba:", "🇨🇺"}, + {":cucumber:", ":cucumber:", "🥒"}, + {":cupid:", ":heart with arrow:", "💘"}, + {":curacao:", ":flag curaçao:", "🇨🇼"}, + {":curly_loop:", ":curly loop:", "➰"}, + {":currency_exchange:", ":currency exchange:", "💱"}, + {":curry:", ":curry rice:", "🍛"}, + {":custard:", ":custard:", "🍮"}, + {":customs:", ":customs:", "🛃"}, + {":cyclone:", ":cyclone:", "🌀"}, + {":cyprus:", ":flag cyprus:", "🇨🇾"}, + {":czech_republic:", ":flag czechia:", "🇨🇿"}, + {":dagger:", ":dagger:", "🗡"}, + {":dancer:", ":woman dancing:", "💃"}, + {":dancers:", ":people with bunny ears:", "👯"}, + {":dancing_men:", ":men with bunny ears:", "👯‍♂️"}, + {":dancing_women:", ":people with bunny ears:", "👯"}, + {":dango:", ":dango:", "🍡"}, + {":dark_sunglasses:", ":sunglasses:", "🕶"}, + {":dart:", ":direct hit:", "🎯"}, + {":dash:", ":dashing away:", "💨"}, + {":date:", ":calendar:", "📅"}, + {":de:", ":flag germany:", "🇩🇪"}, + {":deciduous_tree:", ":deciduous tree:", "🌳"}, + {":deer:", ":deer:", "🦌"}, + {":denmark:", ":flag denmark:", "🇩🇰"}, + {":department_store:", ":department store:", "🏬"}, + {":derelict_house:", ":derelict house:", "🏚"}, + {":desert:", ":desert:", "🏜"}, + {":desert_island:", ":desert island:", "🏝"}, + {":desktop_computer:", ":desktop computer:", "🖥"}, + {":detective:", ":detective:", "🕵"}, + {":diamond_shape_with_a_dot_inside:", ":diamond with a dot:", "💠"}, + {":diamonds:", ":diamond suit:", "♦"}, + {":disappointed:", ":disappointed face:", "😞"}, + {":disappointed_relieved:", ":sad but relieved face:", "😥"}, + {":dizzy:", ":dizzy:", "💫"}, + {":dizzy_face:", ":dizzy face:", "😵"}, + {":djibouti:", ":flag djibouti:", "🇩🇯"}, + {":do_not_litter:", ":no littering:", "🚯"}, + {":dog:", ":dog face:", "🐶"}, + {":dog2:", ":dog:", "🐕"}, + {":dollar:", ":dollar banknote:", "💵"}, + {":dolls:", ":japanese dolls:", "🎎"}, + {":dolphin:", ":dolphin:", "🐬"}, + {":dominica:", ":flag dominica:", "🇩🇲"}, + {":dominican_republic:", ":flag dominican republic:", "🇩🇴"}, + {":door:", ":door:", "🚪"}, + {":doughnut:", ":doughnut:", "🍩"}, + {":dove:", ":dove:", "🕊"}, + {":dragon:", ":dragon:", "🐉"}, + {":dragon_face:", ":dragon face:", "🐲"}, + {":dress:", ":dress:", "👗"}, + {":dromedary_camel:", ":camel:", "🐪"}, + {":drooling_face:", ":drooling face:", "🤤"}, + {":droplet:", ":droplet:", "💧"}, + {":drum:", ":drum:", "🥁"}, + {":duck:", ":duck:", "🦆"}, + {":dvd:", ":dvd:", "📀"}, + {":e-mail:", ":e-mail:", "📧"}, + {":eagle:", ":eagle:", "🦅"}, + {":ear:", ":ear:", "👂"}, + {":ear_of_rice:", ":sheaf of rice:", "🌾"}, + {":earth_africa:", ":globe showing europe-africa:", "🌍"}, + {":earth_americas:", ":globe showing americas:", "🌎"}, + {":earth_asia:", ":globe showing asia-australia:", "🌏"}, + {":ecuador:", ":flag ecuador:", "🇪🇨"}, + {":egg:", ":egg:", "🥚"}, + {":eggplant:", ":eggplant:", "🍆"}, + {":egypt:", ":flag egypt:", "🇪🇬"}, + {":eight:", ":keycap 8:", "8️⃣"}, + {":eight_pointed_black_star:", ":eight-pointed star:", "✴"}, + {":eight_spoked_asterisk:", ":eight-spoked asterisk:", "✳"}, + {":el_salvador:", ":flag el salvador:", "🇸🇻"}, + {":electric_plug:", ":electric plug:", "🔌"}, + {":elephant:", ":elephant:", "🐘"}, + {":email:", ":envelope:", "✉"}, + {":end:", ":end arrow:", "🔚"}, + {":envelope:", ":envelope:", "✉"}, + {":envelope_with_arrow:", ":envelope with arrow:", "📩"}, + {":equatorial_guinea:", ":flag equatorial guinea:", "🇬🇶"}, + {":eritrea:", ":flag eritrea:", "🇪🇷"}, + {":es:", ":flag spain:", "🇪🇸"}, + {":estonia:", ":flag estonia:", "🇪🇪"}, + {":ethiopia:", ":flag ethiopia:", "🇪🇹"}, + {":eu:", ":flag european union:", "🇪🇺"}, + {":euro:", ":euro banknote:", "💶"}, + {":european_castle:", ":castle:", "🏰"}, + {":european_post_office:", ":post office:", "🏤"}, + {":european_union:", ":flag european union:", "🇪🇺"}, + {":evergreen_tree:", ":evergreen tree:", "🌲"}, + {":exclamation:", ":exclamation mark:", "❗"}, + {":expressionless:", ":expressionless face:", "😑"}, + {":eye:", ":eye in speech bubble:", "👁️‍🗨️"}, + {":eye_speech_bubble:", ":eye in speech bubble:", "👁️‍🗨️"}, + {":eyeglasses:", ":glasses:", "👓"}, + {":eyes:", ":eyes:", "👀"}, + {":face_with_head_bandage:", ":face with head-bandage:", "🤕"}, + {":face_with_thermometer:", ":face with thermometer:", "🤒"}, + {":facepunch:", ":oncoming fist:", "👊"}, + {":factory:", ":factory:", "🏭"}, + {":falkland_islands:", ":flag falkland islands:", "🇫🇰"}, + {":fallen_leaf:", ":fallen leaf:", "🍂"}, + {":family:", ":family:", "👪"}, + {":family_man_boy:", ":family man, woman, boy:", "👨‍👩‍👦"}, + {":family_man_boy_boy:", ":family man, woman, boy, boy:", "👨‍👩‍👦‍👦"}, + {":family_man_girl:", ":family man, woman, girl:", "👨‍👩‍👧"}, + {":family_man_girl_boy:", ":family man, woman, girl, boy:", "👨‍👩‍👧‍👦"}, + {":family_man_girl_girl:", ":family man, woman, girl, girl:", "👨‍👩‍👧‍👧"}, + {":family_man_man_boy:", ":family man, man, boy:", "👨‍👨‍👦"}, + {":family_man_man_boy_boy:", ":family man, man, boy, boy:", "👨‍👨‍👦‍👦"}, + {":family_man_man_girl:", ":family man, man, girl:", "👨‍👨‍👧"}, + {":family_man_man_girl_boy:", ":family man, man, girl, boy:", "👨‍👨‍👧‍👦"}, + {":family_man_man_girl_girl:", ":family man, man, girl, girl:", "👨‍👨‍👧‍👧"}, + {":family_man_woman_boy:", ":family:", "👪"}, + {":family_man_woman_boy_boy:", ":family man, woman, boy, boy:", "👨‍👩‍👦‍👦"}, + {":family_man_woman_girl:", ":family man, woman, girl:", "👨‍👩‍👧"}, + {":family_man_woman_girl_boy:", ":family man, woman, girl, boy:", "👨‍👩‍👧‍👦"}, + {":family_man_woman_girl_girl:", ":family man, woman, girl, girl:", "👨‍👩‍👧‍👧"}, + {":family_woman_boy:", ":family woman, woman, boy:", "👩‍👩‍👦"}, + {":family_woman_boy_boy:", ":family woman, woman, boy, boy:", "👩‍👩‍👦‍👦"}, + {":family_woman_girl:", ":family woman, woman, girl:", "👩‍👩‍👧"}, + {":family_woman_girl_boy:", ":family woman, woman, girl, boy:", "👩‍👩‍👧‍👦"}, + {":family_woman_girl_girl:", ":family woman, woman, girl, girl:", "👩‍👩‍👧‍👧"}, + {":family_woman_woman_boy:", ":family woman, woman, boy:", "👩‍👩‍👦"}, + {":family_woman_woman_boy_boy:", ":family woman, woman, boy, boy:", "👩‍👩‍👦‍👦"}, + {":family_woman_woman_girl:", ":family woman, woman, girl:", "👩‍👩‍👧"}, + {":family_woman_woman_girl_boy:", ":family woman, woman, girl, boy:", "👩‍👩‍👧‍👦"}, + {":family_woman_woman_girl_girl:", ":family woman, woman, girl, girl:", "👩‍👩‍👧‍👧"}, + {":faroe_islands:", ":flag faroe islands:", "🇫🇴"}, + {":fast_forward:", ":fast-forward button:", "⏩"}, + {":fax:", ":fax machine:", "📠"}, + {":fearful:", ":fearful face:", "😨"}, + {":feet:", ":paw prints:", "🐾"}, + {":female_detective:", ":woman detective:", "🕵️‍♀️"}, + {":ferris_wheel:", ":ferris wheel:", "🎡"}, + {":ferry:", ":ferry:", "⛴"}, + {":field_hockey:", ":field hockey:", "🏑"}, + {":fiji:", ":flag fiji:", "🇫🇯"}, + {":file_cabinet:", ":file cabinet:", "🗄"}, + {":file_folder:", ":file folder:", "📁"}, + {":film_projector:", ":film projector:", "📽"}, + {":film_strip:", ":film frames:", "🎞"}, + {":finland:", ":flag finland:", "🇫🇮"}, + {":fire:", ":fire:", "🔥"}, + {":fire_engine:", ":fire engine:", "🚒"}, + {":fireworks:", ":fireworks:", "🎆"}, + {":first_quarter_moon:", ":first quarter moon:", "🌓"}, + {":first_quarter_moon_with_face:", ":first quarter moon face:", "🌛"}, + {":fish:", ":fish:", "🐟"}, + {":fish_cake:", ":fish cake with swirl:", "🍥"}, + {":fishing_pole_and_fish:", ":fishing pole:", "🎣"}, + {":fist:", ":raised fist:", "✊"}, + {":fist_left:", ":left-facing fist:", "🤛"}, + {":fist_oncoming:", ":oncoming fist:", "👊"}, + {":fist_raised:", ":raised fist:", "✊"}, + {":fist_right:", ":right-facing fist:", "🤜"}, + {":five:", ":keycap 5:", "5️⃣"}, + {":flags:", ":carp streamer:", "🎏"}, + {":flashlight:", ":flashlight:", "🔦"}, + {":fleur_de_lis:", ":fleur-de-lis:", "⚜"}, + {":flight_arrival:", ":airplane arrival:", "🛬"}, + {":flight_departure:", ":airplane departure:", "🛫"}, + {":flipper:", ":dolphin:", "🐬"}, + {":floppy_disk:", ":floppy disk:", "💾"}, + {":flower_playing_cards:", ":flower playing cards:", "🎴"}, + {":flushed:", ":flushed face:", "😳"}, + {":fog:", ":fog:", "🌫"}, + {":foggy:", ":foggy:", "🌁"}, + {":football:", ":american football:", "🏈"}, + {":footprints:", ":footprints:", "👣"}, + {":fork_and_knife:", ":fork and knife:", "🍴"}, + {":fountain:", ":fountain:", "⛲"}, + {":fountain_pen:", ":fountain pen:", "🖋"}, + {":four:", ":keycap 4:", "4️⃣"}, + {":four_leaf_clover:", ":four leaf clover:", "🍀"}, + {":fox_face:", ":fox face:", "🦊"}, + {":fr:", ":flag france:", "🇫🇷"}, + {":framed_picture:", ":framed picture:", "🖼"}, + {":free:", ":free button:", "🆓"}, + {":french_guiana:", ":flag french guiana:", "🇬🇫"}, + {":french_polynesia:", ":flag french polynesia:", "🇵🇫"}, + {":french_southern_territories:", ":flag french southern territories:", "🇹🇫"}, + {":fried_egg:", ":cooking:", "🍳"}, + {":fried_shrimp:", ":fried shrimp:", "🍤"}, + {":fries:", ":french fries:", "🍟"}, + {":frog:", ":frog face:", "🐸"}, + {":frowning:", ":frowning face with open mouth:", "😦"}, + {":frowning_face:", ":frowning face:", "☹"}, + {":frowning_man:", ":man frowning:", "🙍‍♂️"}, + {":frowning_woman:", ":person frowning:", "🙍"}, + {":fu:", ":middle finger:", "🖕"}, + {":fuelpump:", ":fuel pump:", "⛽"}, + {":full_moon:", ":full moon:", "🌕"}, + {":full_moon_with_face:", ":full moon face:", "🌝"}, + {":funeral_urn:", ":funeral urn:", "⚱"}, + {":gabon:", ":flag gabon:", "🇬🇦"}, + {":gambia:", ":flag gambia:", "🇬🇲"}, + {":game_die:", ":game die:", "🎲"}, + {":gb:", ":flag united kingdom:", "🇬🇧"}, + {":gear:", ":gear:", "⚙"}, + {":gem:", ":gem stone:", "💎"}, + {":gemini:", ":gemini:", "♊"}, + {":georgia:", ":flag georgia:", "🇬🇪"}, + {":ghana:", ":flag ghana:", "🇬🇭"}, + {":ghost:", ":ghost:", "👻"}, + {":gibraltar:", ":flag gibraltar:", "🇬🇮"}, + {":gift:", ":wrapped gift:", "🎁"}, + {":gift_heart:", ":heart with ribbon:", "💝"}, + {":girl:", ":girl:", "👧"}, + {":globe_with_meridians:", ":globe with meridians:", "🌐"}, + {":goal_net:", ":goal net:", "🥅"}, + {":goat:", ":goat:", "🐐"}, + {":golf:", ":flag in hole:", "⛳"}, + {":golfing_man:", ":person golfing:", "🏌"}, + {":golfing_woman:", ":woman golfing:", "🏌️‍♀️"}, + {":gorilla:", ":gorilla:", "🦍"}, + {":grapes:", ":grapes:", "🍇"}, + {":greece:", ":flag greece:", "🇬🇷"}, + {":green_apple:", ":green apple:", "🍏"}, + {":green_book:", ":green book:", "📗"}, + {":green_heart:", ":green heart:", "💚"}, + {":green_salad:", ":green salad:", "🥗"}, + {":greenland:", ":flag greenland:", "🇬🇱"}, + {":grenada:", ":flag grenada:", "🇬🇩"}, + {":grey_exclamation:", ":white exclamation mark:", "❕"}, + {":grey_question:", ":white question mark:", "❔"}, + {":grimacing:", ":grimacing face:", "😬"}, + {":grin:", ":beaming face with smiling eyes:", "😁"}, + {":grinning:", ":grinning face:", "😀"}, + {":guadeloupe:", ":flag guadeloupe:", "🇬🇵"}, + {":guam:", ":flag guam:", "🇬🇺"}, + {":guardsman:", ":guard:", "💂"}, + {":guardswoman:", ":woman guard:", "💂‍♀️"}, + {":guatemala:", ":flag guatemala:", "🇬🇹"}, + {":guernsey:", ":flag guernsey:", "🇬🇬"}, + {":guinea:", ":flag guinea:", "🇬🇳"}, + {":guinea_bissau:", ":flag guinea-bissau:", "🇬🇼"}, + {":guitar:", ":guitar:", "🎸"}, + {":gun:", ":pistol:", "🔫"}, + {":guyana:", ":flag guyana:", "🇬🇾"}, + {":haircut:", ":person getting haircut:", "💇"}, + {":haircut_man:", ":man getting haircut:", "💇‍♂️"}, + {":haircut_woman:", ":person getting haircut:", "💇"}, + {":haiti:", ":flag haiti:", "🇭🇹"}, + {":hamburger:", ":hamburger:", "🍔"}, + {":hammer:", ":hammer:", "🔨"}, + {":hammer_and_pick:", ":hammer and pick:", "⚒"}, + {":hammer_and_wrench:", ":hammer and wrench:", "🛠"}, + {":hamster:", ":hamster face:", "🐹"}, + {":hand:", ":raised hand:", "✋"}, + {":handbag:", ":handbag:", "👜"}, + {":handshake:", ":handshake:", "🤝"}, + {":hankey:", ":pile of poo:", "💩"}, + {":hash:", ":keycap #:", "#️⃣"}, + {":hatched_chick:", ":front-facing baby chick:", "🐥"}, + {":hatching_chick:", ":hatching chick:", "🐣"}, + {":headphones:", ":headphone:", "🎧"}, + {":hear_no_evil:", ":hear-no-evil monkey:", "🙉"}, + {":heart:", ":red heart:", "❤"}, + {":heart_decoration:", ":heart decoration:", "💟"}, + {":heart_eyes:", ":smiling face with heart-eyes:", "😍"}, + {":heart_eyes_cat:", ":smiling cat face with heart-eyes:", "😻"}, + {":heartbeat:", ":beating heart:", "💓"}, + {":heartpulse:", ":growing heart:", "💗"}, + {":hearts:", ":heart suit:", "♥"}, + {":heavy_check_mark:", ":heavy check mark:", "✔"}, + {":heavy_division_sign:", ":heavy division sign:", "➗"}, + {":heavy_dollar_sign:", ":heavy dollar sign:", "💲"}, + {":heavy_exclamation_mark:", ":exclamation mark:", "❗"}, + {":heavy_heart_exclamation:", ":heavy heart exclamation:", "❣"}, + {":heavy_minus_sign:", ":heavy minus sign:", "➖"}, + {":heavy_multiplication_x:", ":heavy multiplication x:", "✖"}, + {":heavy_plus_sign:", ":heavy plus sign:", "➕"}, + {":helicopter:", ":helicopter:", "🚁"}, + {":herb:", ":herb:", "🌿"}, + {":hibiscus:", ":hibiscus:", "🌺"}, + {":high_brightness:", ":bright button:", "🔆"}, + {":high_heel:", ":high-heeled shoe:", "👠"}, + {":hocho:", ":kitchen knife:", "🔪"}, + {":hole:", ":hole:", "🕳"}, + {":honduras:", ":flag honduras:", "🇭🇳"}, + {":honey_pot:", ":honey pot:", "🍯"}, + {":honeybee:", ":honeybee:", "🐝"}, + {":hong_kong:", ":flag hong kong sar china:", "🇭🇰"}, + {":horse:", ":horse face:", "🐴"}, + {":horse_racing:", ":horse racing:", "🏇"}, + {":hospital:", ":hospital:", "🏥"}, + {":hot_pepper:", ":hot pepper:", "🌶"}, + {":hotdog:", ":hot dog:", "🌭"}, + {":hotel:", ":hotel:", "🏨"}, + {":hotsprings:", ":hot springs:", "♨"}, + {":hourglass:", ":hourglass done:", "⌛"}, + {":hourglass_flowing_sand:", ":hourglass not done:", "⏳"}, + {":house:", ":house:", "🏠"}, + {":house_with_garden:", ":house with garden:", "🏡"}, + {":houses:", ":houses:", "🏘"}, + {":hugs:", ":hugging face:", "🤗"}, + {":hungary:", ":flag hungary:", "🇭🇺"}, + {":hushed:", ":hushed face:", "😯"}, + {":ice_cream:", ":ice cream:", "🍨"}, + {":ice_hockey:", ":ice hockey:", "🏒"}, + {":ice_skate:", ":ice skate:", "⛸"}, + {":icecream:", ":soft ice cream:", "🍦"}, + {":iceland:", ":flag iceland:", "🇮🇸"}, + {":id:", ":id button:", "🆔"}, + {":ideograph_advantage:", ":japanese \"bargain\" button:", "🉐"}, + {":imp:", ":angry face with horns:", "👿"}, + {":inbox_tray:", ":inbox tray:", "📥"}, + {":incoming_envelope:", ":incoming envelope:", "📨"}, + {":india:", ":flag india:", "🇮🇳"}, + {":indonesia:", ":flag indonesia:", "🇮🇩"}, + {":information_desk_person:", ":person tipping hand:", "💁"}, + {":information_source:", ":information:", "ℹ"}, + {":innocent:", ":smiling face with halo:", "😇"}, + {":interrobang:", ":exclamation question mark:", "⁉"}, + {":iphone:", ":mobile phone:", "📱"}, + {":iran:", ":flag iran:", "🇮🇷"}, + {":iraq:", ":flag iraq:", "🇮🇶"}, + {":ireland:", ":flag ireland:", "🇮🇪"}, + {":isle_of_man:", ":flag isle of man:", "🇮🇲"}, + {":israel:", ":flag israel:", "🇮🇱"}, + {":it:", ":flag italy:", "🇮🇹"}, + {":izakaya_lantern:", ":red paper lantern:", "🏮"}, + {":jack_o_lantern:", ":jack-o-lantern:", "🎃"}, + {":jamaica:", ":flag jamaica:", "🇯🇲"}, + {":japan:", ":map of japan:", "🗾"}, + {":japanese_castle:", ":japanese castle:", "🏯"}, + {":japanese_goblin:", ":goblin:", "👺"}, + {":japanese_ogre:", ":ogre:", "👹"}, + {":jeans:", ":jeans:", "👖"}, + {":jersey:", ":flag jersey:", "🇯🇪"}, + {":jordan:", ":flag jordan:", "🇯🇴"}, + {":joy:", ":face with tears of joy:", "😂"}, + {":joy_cat:", ":cat face with tears of joy:", "😹"}, + {":joystick:", ":joystick:", "🕹"}, + {":jp:", ":flag japan:", "🇯🇵"}, + {":kaaba:", ":kaaba:", "🕋"}, + {":kazakhstan:", ":flag kazakhstan:", "🇰🇿"}, + {":kenya:", ":flag kenya:", "🇰🇪"}, + {":key:", ":key:", "🔑"}, + {":keyboard:", ":keyboard:", "⌨"}, + {":keycap_ten:", ":keycap 10:", "🔟"}, + {":kick_scooter:", ":kick scooter:", "🛴"}, + {":kimono:", ":kimono:", "👘"}, + {":kiribati:", ":flag kiribati:", "🇰🇮"}, + {":kiss:", ":kiss mark:", "💋"}, + {":kissing:", ":kissing face:", "😗"}, + {":kissing_cat:", ":kissing cat face:", "😽"}, + {":kissing_closed_eyes:", ":kissing face with closed eyes:", "😚"}, + {":kissing_heart:", ":face blowing a kiss:", "😘"}, + {":kissing_smiling_eyes:", ":kissing face with smiling eyes:", "😙"}, + {":kiwi_fruit:", ":kiwi fruit:", "🥝"}, + {":knife:", ":kitchen knife:", "🔪"}, + {":koala:", ":koala:", "🐨"}, + {":koko:", ":japanese \"here\" button:", "🈁"}, + {":kosovo:", ":flag kosovo:", "🇽🇰"}, + {":kr:", ":flag south korea:", "🇰🇷"}, + {":kuwait:", ":flag kuwait:", "🇰🇼"}, + {":kyrgyzstan:", ":flag kyrgyzstan:", "🇰🇬"}, + {":label:", ":label:", "🏷"}, + {":lantern:", ":red paper lantern:", "🏮"}, + {":laos:", ":flag laos:", "🇱🇦"}, + {":large_blue_circle:", ":blue circle:", "🔵"}, + {":large_blue_diamond:", ":large blue diamond:", "🔷"}, + {":large_orange_diamond:", ":large orange diamond:", "🔶"}, + {":last_quarter_moon:", ":last quarter moon:", "🌗"}, + {":last_quarter_moon_with_face:", ":last quarter moon face:", "🌜"}, + {":latin_cross:", ":latin cross:", "✝"}, + {":latvia:", ":flag latvia:", "🇱🇻"}, + {":laughing:", ":grinning squinting face:", "😆"}, + {":leaves:", ":leaf fluttering in wind:", "🍃"}, + {":lebanon:", ":flag lebanon:", "🇱🇧"}, + {":ledger:", ":ledger:", "📒"}, + {":left_luggage:", ":left luggage:", "🛅"}, + {":left_right_arrow:", ":left-right arrow:", "↔"}, + {":leftwards_arrow_with_hook:", ":right arrow curving left:", "↩"}, + {":lemon:", ":lemon:", "🍋"}, + {":leo:", ":leo:", "♌"}, + {":leopard:", ":leopard:", "🐆"}, + {":lesotho:", ":flag lesotho:", "🇱🇸"}, + {":level_slider:", ":level slider:", "🎚"}, + {":liberia:", ":flag liberia:", "🇱🇷"}, + {":libra:", ":libra:", "♎"}, + {":libya:", ":flag libya:", "🇱🇾"}, + {":liechtenstein:", ":flag liechtenstein:", "🇱🇮"}, + {":light_rail:", ":light rail:", "🚈"}, + {":link:", ":link:", "🔗"}, + {":lion:", ":lion face:", "🦁"}, + {":lips:", ":mouth:", "👄"}, + {":lipstick:", ":lipstick:", "💄"}, + {":lithuania:", ":flag lithuania:", "🇱🇹"}, + {":lizard:", ":lizard:", "🦎"}, + {":lock:", ":locked:", "🔒"}, + {":lock_with_ink_pen:", ":locked with pen:", "🔏"}, + {":lollipop:", ":lollipop:", "🍭"}, + {":loop:", ":double curly loop:", "➿"}, + {":loud_sound:", ":speaker high volume:", "🔊"}, + {":loudspeaker:", ":loudspeaker:", "📢"}, + {":love_hotel:", ":love hotel:", "🏩"}, + {":love_letter:", ":love letter:", "💌"}, + {":low_brightness:", ":dim button:", "🔅"}, + {":luxembourg:", ":flag luxembourg:", "🇱🇺"}, + {":lying_face:", ":lying face:", "🤥"}, + {":m:", ":circled m:", "Ⓜ"}, + {":macau:", ":flag macau sar china:", "🇲🇴"}, + {":macedonia:", ":flag macedonia:", "🇲🇰"}, + {":madagascar:", ":flag madagascar:", "🇲🇬"}, + {":mag:", ":magnifying glass tilted left:", "🔍"}, + {":mag_right:", ":magnifying glass tilted right:", "🔎"}, + {":mahjong:", ":mahjong red dragon:", "🀄"}, + {":mailbox:", ":closed mailbox with raised flag:", "📫"}, + {":mailbox_closed:", ":closed mailbox with lowered flag:", "📪"}, + {":mailbox_with_mail:", ":open mailbox with raised flag:", "📬"}, + {":mailbox_with_no_mail:", ":open mailbox with lowered flag:", "📭"}, + {":malawi:", ":flag malawi:", "🇲🇼"}, + {":malaysia:", ":flag malaysia:", "🇲🇾"}, + {":maldives:", ":flag maldives:", "🇲🇻"}, + {":male_detective:", ":detective:", "🕵"}, + {":mali:", ":flag mali:", "🇲🇱"}, + {":malta:", ":flag malta:", "🇲🇹"}, + {":man:", ":man:", "👨"}, + {":man_artist:", ":man artist:", "👨‍🎨"}, + {":man_astronaut:", ":man astronaut:", "👨‍🚀"}, + {":man_cartwheeling:", ":man cartwheeling:", "🤸‍♂️"}, + {":man_cook:", ":man cook:", "👨‍🍳"}, + {":man_dancing:", ":man dancing:", "🕺"}, + {":man_facepalming:", ":man facepalming:", "🤦‍♂️"}, + {":man_factory_worker:", ":man factory worker:", "👨‍🏭"}, + {":man_farmer:", ":man farmer:", "👨‍🌾"}, + {":man_firefighter:", ":man firefighter:", "👨‍🚒"}, + {":man_health_worker:", ":man health worker:", "👨‍⚕️"}, + {":man_in_tuxedo:", ":man in tuxedo:", "🤵"}, + {":man_judge:", ":man judge:", "👨‍⚖️"}, + {":man_juggling:", ":man juggling:", "🤹‍♂️"}, + {":man_mechanic:", ":man mechanic:", "👨‍🔧"}, + {":man_office_worker:", ":man office worker:", "👨‍💼"}, + {":man_pilot:", ":man pilot:", "👨‍✈️"}, + {":man_playing_handball:", ":man playing handball:", "🤾‍♂️"}, + {":man_playing_water_polo:", ":man playing water polo:", "🤽‍♂️"}, + {":man_scientist:", ":man scientist:", "👨‍🔬"}, + {":man_shrugging:", ":man shrugging:", "🤷‍♂️"}, + {":man_singer:", ":man singer:", "👨‍🎤"}, + {":man_student:", ":man student:", "👨‍🎓"}, + {":man_teacher:", ":man teacher:", "👨‍🏫"}, + {":man_technologist:", ":man technologist:", "👨‍💻"}, + {":man_with_gua_pi_mao:", ":man with chinese cap:", "👲"}, + {":man_with_turban:", ":person wearing turban:", "👳"}, + {":mandarin:", ":tangerine:", "🍊"}, + {":mans_shoe:", ":man's shoe:", "👞"}, + {":mantelpiece_clock:", ":mantelpiece clock:", "🕰"}, + {":maple_leaf:", ":maple leaf:", "🍁"}, + {":marshall_islands:", ":flag marshall islands:", "🇲🇭"}, + {":martial_arts_uniform:", ":martial arts uniform:", "🥋"}, + {":martinique:", ":flag martinique:", "🇲🇶"}, + {":mask:", ":face with medical mask:", "😷"}, + {":massage:", ":person getting massage:", "💆"}, + {":massage_man:", ":man getting massage:", "💆‍♂️"}, + {":massage_woman:", ":person getting massage:", "💆"}, + {":mauritania:", ":flag mauritania:", "🇲🇷"}, + {":mauritius:", ":flag mauritius:", "🇲🇺"}, + {":mayotte:", ":flag mayotte:", "🇾🇹"}, + {":meat_on_bone:", ":meat on bone:", "🍖"}, + {":medal_military:", ":military medal:", "🎖"}, + {":medal_sports:", ":sports medal:", "🏅"}, + {":mega:", ":megaphone:", "📣"}, + {":melon:", ":melon:", "🍈"}, + {":memo:", ":memo:", "📝"}, + {":men_wrestling:", ":men wrestling:", "🤼‍♂️"}, + {":menorah:", ":menorah:", "🕎"}, + {":mens:", ":men's room:", "🚹"}, + {":metal:", ":sign of the horns:", "🤘"}, + {":metro:", ":metro:", "🚇"}, + {":mexico:", ":flag mexico:", "🇲🇽"}, + {":micronesia:", ":flag micronesia:", "🇫🇲"}, + {":microphone:", ":microphone:", "🎤"}, + {":microscope:", ":microscope:", "🔬"}, + {":middle_finger:", ":middle finger:", "🖕"}, + {":milk_glass:", ":glass of milk:", "🥛"}, + {":milky_way:", ":milky way:", "🌌"}, + {":minibus:", ":minibus:", "🚐"}, + {":minidisc:", ":computer disk:", "💽"}, + {":mobile_phone_off:", ":mobile phone off:", "📴"}, + {":moldova:", ":flag moldova:", "🇲🇩"}, + {":monaco:", ":flag monaco:", "🇲🇨"}, + {":money_mouth_face:", ":money-mouth face:", "🤑"}, + {":money_with_wings:", ":money with wings:", "💸"}, + {":moneybag:", ":money bag:", "💰"}, + {":mongolia:", ":flag mongolia:", "🇲🇳"}, + {":monkey:", ":monkey:", "🐒"}, + {":monkey_face:", ":monkey face:", "🐵"}, + {":monorail:", ":monorail:", "🚝"}, + {":montenegro:", ":flag montenegro:", "🇲🇪"}, + {":montserrat:", ":flag montserrat:", "🇲🇸"}, + {":moon:", ":waxing gibbous moon:", "🌔"}, + {":morocco:", ":flag morocco:", "🇲🇦"}, + {":mortar_board:", ":graduation cap:", "🎓"}, + {":mosque:", ":mosque:", "🕌"}, + {":motor_boat:", ":motor boat:", "🛥"}, + {":motor_scooter:", ":motor scooter:", "🛵"}, + {":motorcycle:", ":motorcycle:", "🏍"}, + {":motorway:", ":motorway:", "🛣"}, + {":mount_fuji:", ":mount fuji:", "🗻"}, + {":mountain:", ":mountain:", "⛰"}, + {":mountain_bicyclist:", ":person mountain biking:", "🚵"}, + {":mountain_biking_man:", ":person mountain biking:", "🚵"}, + {":mountain_biking_woman:", ":woman mountain biking:", "🚵‍♀️"}, + {":mountain_cableway:", ":mountain cableway:", "🚠"}, + {":mountain_railway:", ":mountain railway:", "🚞"}, + {":mountain_snow:", ":snow-capped mountain:", "🏔"}, + {":mouse:", ":mouse face:", "🐭"}, + {":mouse2:", ":mouse:", "🐁"}, + {":movie_camera:", ":movie camera:", "🎥"}, + {":moyai:", ":moai:", "🗿"}, + {":mozambique:", ":flag mozambique:", "🇲🇿"}, + {":mrs_claus:", ":mrs. claus:", "🤶"}, + {":muscle:", ":flexed biceps:", "💪"}, + {":mushroom:", ":mushroom:", "🍄"}, + {":musical_keyboard:", ":musical keyboard:", "🎹"}, + {":musical_note:", ":musical note:", "🎵"}, + {":musical_score:", ":musical score:", "🎼"}, + {":mute:", ":muted speaker:", "🔇"}, + {":myanmar:", ":flag myanmar (burma):", "🇲🇲"}, + {":nail_care:", ":nail polish:", "💅"}, + {":name_badge:", ":name badge:", "📛"}, + {":namibia:", ":flag namibia:", "🇳🇦"}, + {":national_park:", ":national park:", "🏞"}, + {":nauru:", ":flag nauru:", "🇳🇷"}, + {":nauseated_face:", ":nauseated face:", "🤢"}, + {":necktie:", ":necktie:", "👔"}, + {":negative_squared_cross_mark:", ":cross mark button:", "❎"}, + {":nepal:", ":flag nepal:", "🇳🇵"}, + {":nerd_face:", ":nerd face:", "🤓"}, + {":netherlands:", ":flag netherlands:", "🇳🇱"}, + {":neutral_face:", ":neutral face:", "😐"}, + {":new:", ":new button:", "🆕"}, + {":new_caledonia:", ":flag new caledonia:", "🇳🇨"}, + {":new_moon:", ":new moon:", "🌑"}, + {":new_moon_with_face:", ":new moon face:", "🌚"}, + {":new_zealand:", ":flag new zealand:", "🇳🇿"}, + {":newspaper:", ":newspaper:", "📰"}, + {":newspaper_roll:", ":rolled-up newspaper:", "🗞"}, + {":next_track_button:", ":next track button:", "⏭"}, + {":ng:", ":ng button:", "🆖"}, + {":ng_man:", ":man gesturing no:", "🙅‍♂️"}, + {":ng_woman:", ":person gesturing no:", "🙅"}, + {":nicaragua:", ":flag nicaragua:", "🇳🇮"}, + {":niger:", ":flag niger:", "🇳🇪"}, + {":nigeria:", ":flag nigeria:", "🇳🇬"}, + {":night_with_stars:", ":night with stars:", "🌃"}, + {":nine:", ":keycap 9:", "9️⃣"}, + {":niue:", ":flag niue:", "🇳🇺"}, + {":no_bell:", ":bell with slash:", "🔕"}, + {":no_bicycles:", ":no bicycles:", "🚳"}, + {":no_entry:", ":no entry:", "⛔"}, + {":no_entry_sign:", ":prohibited:", "🚫"}, + {":no_good:", ":person gesturing no:", "🙅"}, + {":no_good_man:", ":man gesturing no:", "🙅‍♂️"}, + {":no_good_woman:", ":person gesturing no:", "🙅"}, + {":no_mobile_phones:", ":no mobile phones:", "📵"}, + {":no_mouth:", ":face without mouth:", "😶"}, + {":no_pedestrians:", ":no pedestrians:", "🚷"}, + {":no_smoking:", ":no smoking:", "🚭"}, + {":non-potable_water:", ":non-potable water:", "🚱"}, + {":norfolk_island:", ":flag norfolk island:", "🇳🇫"}, + {":north_korea:", ":flag north korea:", "🇰🇵"}, + {":northern_mariana_islands:", ":flag northern mariana islands:", "🇲🇵"}, + {":norway:", ":flag norway:", "🇳🇴"}, + {":nose:", ":nose:", "👃"}, + {":notebook:", ":notebook:", "📓"}, + {":notebook_with_decorative_cover:", ":notebook with decorative cover:", "📔"}, + {":notes:", ":musical notes:", "🎶"}, + {":nut_and_bolt:", ":nut and bolt:", "🔩"}, + {":o:", ":heavy large circle:", "⭕"}, + {":o2:", ":o button (blood type):", "🅾"}, + {":ocean:", ":water wave:", "🌊"}, + {":octopus:", ":octopus:", "🐙"}, + {":oden:", ":oden:", "🍢"}, + {":office:", ":office building:", "🏢"}, + {":oil_drum:", ":oil drum:", "🛢"}, + {":ok:", ":ok button:", "🆗"}, + {":ok_hand:", ":ok hand:", "👌"}, + {":ok_man:", ":man gesturing ok:", "🙆‍♂️"}, + {":ok_woman:", ":person gesturing ok:", "🙆"}, + {":old_key:", ":old key:", "🗝"}, + {":older_man:", ":old man:", "👴"}, + {":older_woman:", ":old woman:", "👵"}, + {":om:", ":om:", "🕉"}, + {":oman:", ":flag oman:", "🇴🇲"}, + {":on:", ":on! arrow:", "🔛"}, + {":oncoming_automobile:", ":oncoming automobile:", "🚘"}, + {":oncoming_bus:", ":oncoming bus:", "🚍"}, + {":oncoming_police_car:", ":oncoming police car:", "🚔"}, + {":oncoming_taxi:", ":oncoming taxi:", "🚖"}, + {":one:", ":keycap 1:", "1️⃣"}, + {":open_book:", ":open book:", "📖"}, + {":open_file_folder:", ":open file folder:", "📂"}, + {":open_hands:", ":open hands:", "👐"}, + {":open_mouth:", ":face with open mouth:", "😮"}, + {":open_umbrella:", ":umbrella:", "☂"}, + {":ophiuchus:", ":ophiuchus:", "⛎"}, + {":orange:", ":tangerine:", "🍊"}, + {":orange_book:", ":orange book:", "📙"}, + {":orthodox_cross:", ":orthodox cross:", "☦"}, + {":outbox_tray:", ":outbox tray:", "📤"}, + {":owl:", ":owl:", "🦉"}, + {":ox:", ":ox:", "🐂"}, + {":package:", ":package:", "📦"}, + {":page_facing_up:", ":page facing up:", "📄"}, + {":page_with_curl:", ":page with curl:", "📃"}, + {":pager:", ":pager:", "📟"}, + {":paintbrush:", ":paintbrush:", "🖌"}, + {":pakistan:", ":flag pakistan:", "🇵🇰"}, + {":palau:", ":flag palau:", "🇵🇼"}, + {":palestinian_territories:", ":flag palestinian territories:", "🇵🇸"}, + {":palm_tree:", ":palm tree:", "🌴"}, + {":panama:", ":flag panama:", "🇵🇦"}, + {":pancakes:", ":pancakes:", "🥞"}, + {":panda_face:", ":panda face:", "🐼"}, + {":paperclip:", ":paperclip:", "📎"}, + {":paperclips:", ":linked paperclips:", "🖇"}, + {":papua_new_guinea:", ":flag papua new guinea:", "🇵🇬"}, + {":paraguay:", ":flag paraguay:", "🇵🇾"}, + {":parasol_on_ground:", ":umbrella on ground:", "⛱"}, + {":parking:", ":p button:", "🅿"}, + {":part_alternation_mark:", ":part alternation mark:", "〽"}, + {":partly_sunny:", ":sun behind cloud:", "⛅"}, + {":passenger_ship:", ":passenger ship:", "🛳"}, + {":passport_control:", ":passport control:", "🛂"}, + {":pause_button:", ":pause button:", "⏸"}, + {":paw_prints:", ":paw prints:", "🐾"}, + {":peace_symbol:", ":peace symbol:", "☮"}, + {":peach:", ":peach:", "🍑"}, + {":peanuts:", ":peanuts:", "🥜"}, + {":pear:", ":pear:", "🍐"}, + {":pen:", ":pen:", "🖊"}, + {":pencil:", ":memo:", "📝"}, + {":pencil2:", ":pencil:", "✏"}, + {":penguin:", ":penguin:", "🐧"}, + {":pensive:", ":pensive face:", "😔"}, + {":performing_arts:", ":performing arts:", "🎭"}, + {":persevere:", ":persevering face:", "😣"}, + {":person_fencing:", ":person fencing:", "🤺"}, + {":person_frowning:", ":person frowning:", "🙍"}, + {":person_with_blond_hair:", ":person blond hair:", "👱"}, + {":person_with_pouting_face:", ":person pouting:", "🙎"}, + {":peru:", ":flag peru:", "🇵🇪"}, + {":philippines:", ":flag philippines:", "🇵🇭"}, + {":phone:", ":telephone:", "☎"}, + {":pick:", ":pick:", "⛏"}, + {":pig:", ":pig face:", "🐷"}, + {":pig2:", ":pig:", "🐖"}, + {":pig_nose:", ":pig nose:", "🐽"}, + {":pill:", ":pill:", "💊"}, + {":pineapple:", ":pineapple:", "🍍"}, + {":ping_pong:", ":ping pong:", "🏓"}, + {":pisces:", ":pisces:", "♓"}, + {":pitcairn_islands:", ":flag pitcairn islands:", "🇵🇳"}, + {":pizza:", ":pizza:", "🍕"}, + {":place_of_worship:", ":place of worship:", "🛐"}, + {":plate_with_cutlery:", ":fork and knife with plate:", "🍽"}, + {":play_or_pause_button:", ":play or pause button:", "⏯"}, + {":point_down:", ":backhand index pointing down:", "👇"}, + {":point_left:", ":backhand index pointing left:", "👈"}, + {":point_right:", ":backhand index pointing right:", "👉"}, + {":point_up:", ":index pointing up:", "☝"}, + {":point_up_2:", ":backhand index pointing up:", "👆"}, + {":poland:", ":flag poland:", "🇵🇱"}, + {":police_car:", ":police car:", "🚓"}, + {":policeman:", ":police officer:", "👮"}, + {":policewoman:", ":woman police officer:", "👮‍♀️"}, + {":poodle:", ":poodle:", "🐩"}, + {":poop:", ":pile of poo:", "💩"}, + {":popcorn:", ":popcorn:", "🍿"}, + {":portugal:", ":flag portugal:", "🇵🇹"}, + {":post_office:", ":japanese post office:", "🏣"}, + {":postal_horn:", ":postal horn:", "📯"}, + {":postbox:", ":postbox:", "📮"}, + {":potable_water:", ":potable water:", "🚰"}, + {":potato:", ":potato:", "🥔"}, + {":pouch:", ":clutch bag:", "👝"}, + {":poultry_leg:", ":poultry leg:", "🍗"}, + {":pound:", ":pound banknote:", "💷"}, + {":pout:", ":pouting face:", "😡"}, + {":pouting_cat:", ":pouting cat face:", "😾"}, + {":pouting_man:", ":man pouting:", "🙎‍♂️"}, + {":pouting_woman:", ":person pouting:", "🙎"}, + {":pray:", ":folded hands:", "🙏"}, + {":prayer_beads:", ":prayer beads:", "📿"}, + {":pregnant_woman:", ":pregnant woman:", "🤰"}, + {":previous_track_button:", ":last track button:", "⏮"}, + {":prince:", ":prince:", "🤴"}, + {":princess:", ":princess:", "👸"}, + {":printer:", ":printer:", "🖨"}, + {":puerto_rico:", ":flag puerto rico:", "🇵🇷"}, + {":punch:", ":oncoming fist:", "👊"}, + {":purple_heart:", ":purple heart:", "💜"}, + {":purse:", ":purse:", "👛"}, + {":pushpin:", ":pushpin:", "📌"}, + {":put_litter_in_its_place:", ":litter in bin sign:", "🚮"}, + {":qatar:", ":flag qatar:", "🇶🇦"}, + {":question:", ":question mark:", "❓"}, + {":rabbit:", ":rabbit face:", "🐰"}, + {":rabbit2:", ":rabbit:", "🐇"}, + {":racehorse:", ":horse:", "🐎"}, + {":racing_car:", ":racing car:", "🏎"}, + {":radio:", ":radio:", "📻"}, + {":radio_button:", ":radio button:", "🔘"}, + {":radioactive:", ":radioactive:", "☢"}, + {":rage:", ":pouting face:", "😡"}, + {":railway_car:", ":railway car:", "🚃"}, + {":railway_track:", ":railway track:", "🛤"}, + {":rainbow:", ":rainbow:", "🌈"}, + {":rainbow_flag:", ":rainbow flag:", "🏳️‍🌈"}, + {":raised_back_of_hand:", ":raised back of hand:", "🤚"}, + {":raised_hand:", ":raised hand:", "✋"}, + {":raised_hand_with_fingers_splayed:", ":hand with fingers splayed:", "🖐"}, + {":raised_hands:", ":raising hands:", "🙌"}, + {":raising_hand:", ":person raising hand:", "🙋"}, + {":raising_hand_man:", ":man raising hand:", "🙋‍♂️"}, + {":raising_hand_woman:", ":person raising hand:", "🙋"}, + {":ram:", ":ram:", "🐏"}, + {":ramen:", ":steaming bowl:", "🍜"}, + {":rat:", ":rat:", "🐀"}, + {":record_button:", ":record button:", "⏺"}, + {":recycle:", ":recycling symbol:", "♻"}, + {":red_car:", ":automobile:", "🚗"}, + {":red_circle:", ":red circle:", "🔴"}, + {":registered:", ":registered:", "®"}, + {":relaxed:", ":smiling face:", "☺"}, + {":relieved:", ":relieved face:", "😌"}, + {":reminder_ribbon:", ":reminder ribbon:", "🎗"}, + {":repeat:", ":repeat button:", "🔁"}, + {":repeat_one:", ":repeat single button:", "🔂"}, + {":rescue_worker_helmet:", ":rescue worker's helmet:", "⛑"}, + {":restroom:", ":restroom:", "🚻"}, + {":reunion:", ":flag rĂ©union:", "🇷🇪"}, + {":revolving_hearts:", ":revolving hearts:", "💞"}, + {":rewind:", ":fast reverse button:", "⏪"}, + {":rhinoceros:", ":rhinoceros:", "🦏"}, + {":ribbon:", ":ribbon:", "🎀"}, + {":rice:", ":cooked rice:", "🍚"}, + {":rice_ball:", ":rice ball:", "🍙"}, + {":rice_cracker:", ":rice cracker:", "🍘"}, + {":rice_scene:", ":moon viewing ceremony:", "🎑"}, + {":right_anger_bubble:", ":right anger bubble:", "🗯"}, + {":ring:", ":ring:", "💍"}, + {":robot:", ":robot face:", "🤖"}, + {":rocket:", ":rocket:", "🚀"}, + {":rofl:", ":rolling on the floor laughing:", "🤣"}, + {":roll_eyes:", ":face with rolling eyes:", "🙄"}, + {":roller_coaster:", ":roller coaster:", "🎢"}, + {":romania:", ":flag romania:", "🇷🇴"}, + {":rooster:", ":rooster:", "🐓"}, + {":rose:", ":rose:", "🌹"}, + {":rosette:", ":rosette:", "🏵"}, + {":rotating_light:", ":police car light:", "🚨"}, + {":round_pushpin:", ":round pushpin:", "📍"}, + {":rowboat:", ":person rowing boat:", "🚣"}, + {":rowing_man:", ":person rowing boat:", "🚣"}, + {":rowing_woman:", ":woman rowing boat:", "🚣‍♀️"}, + {":ru:", ":flag russia:", "🇷🇺"}, + {":rugby_football:", ":rugby football:", "🏉"}, + {":runner:", ":person running:", "🏃"}, + {":running:", ":person running:", "🏃"}, + {":running_man:", ":person running:", "🏃"}, + {":running_shirt_with_sash:", ":running shirt:", "🎽"}, + {":running_woman:", ":woman running:", "🏃‍♀️"}, + {":rwanda:", ":flag rwanda:", "🇷🇼"}, + {":sa:", ":japanese \"service charge\" button:", "🈂"}, + {":sagittarius:", ":sagittarius:", "♐"}, + {":sailboat:", ":sailboat:", "⛵"}, + {":sake:", ":sake:", "🍶"}, + {":samoa:", ":flag samoa:", "🇼🇸"}, + {":san_marino:", ":flag san marino:", "🇸🇲"}, + {":sandal:", ":woman's sandal:", "👡"}, + {":santa:", ":santa claus:", "🎅"}, + {":sao_tome_principe:", ":flag sĂ£o tomĂ© & prĂncipe:", "🇸🇹"}, + {":satellite:", ":satellite antenna:", "📡"}, + {":satisfied:", ":grinning squinting face:", "😆"}, + {":saudi_arabia:", ":flag saudi arabia:", "🇸🇦"}, + {":saxophone:", ":saxophone:", "🎷"}, + {":school:", ":school:", "🏫"}, + {":school_satchel:", ":backpack:", "🎒"}, + {":scissors:", ":scissors:", "✂"}, + {":scorpion:", ":scorpion:", "🦂"}, + {":scorpius:", ":scorpio:", "♏"}, + {":scream:", ":face screaming in fear:", "😱"}, + {":scream_cat:", ":weary cat face:", "🙀"}, + {":scroll:", ":scroll:", "📜"}, + {":seat:", ":seat:", "💺"}, + {":secret:", ":japanese \"secret\" button:", "㊙"}, + {":see_no_evil:", ":see-no-evil monkey:", "🙈"}, + {":seedling:", ":seedling:", "🌱"}, + {":selfie:", ":selfie:", "🤳"}, + {":senegal:", ":flag senegal:", "🇸🇳"}, + {":serbia:", ":flag serbia:", "🇷🇸"}, + {":seven:", ":keycap 7:", "7️⃣"}, + {":seychelles:", ":flag seychelles:", "🇸🇨"}, + {":shallow_pan_of_food:", ":shallow pan of food:", "🥘"}, + {":shamrock:", ":shamrock:", "☘"}, + {":shark:", ":shark:", "🦈"}, + {":shaved_ice:", ":shaved ice:", "🍧"}, + {":sheep:", ":ewe:", "🐑"}, + {":shell:", ":spiral shell:", "🐚"}, + {":shield:", ":shield:", "🛡"}, + {":shinto_shrine:", ":shinto shrine:", "⛩"}, + {":ship:", ":ship:", "🚢"}, + {":shirt:", ":t-shirt:", "👕"}, + {":shit:", ":pile of poo:", "💩"}, + {":shoe:", ":man's shoe:", "👞"}, + {":shopping:", ":shopping bags:", "🛍"}, + {":shopping_cart:", ":shopping cart:", "🛒"}, + {":shower:", ":shower:", "🚿"}, + {":shrimp:", ":shrimp:", "🦐"}, + {":sierra_leone:", ":flag sierra leone:", "🇸🇱"}, + {":signal_strength:", ":antenna bars:", "📶"}, + {":singapore:", ":flag singapore:", "🇸🇬"}, + {":sint_maarten:", ":flag sint maarten:", "🇸🇽"}, + {":six:", ":keycap 6:", "6️⃣"}, + {":six_pointed_star:", ":dotted six-pointed star:", "🔯"}, + {":ski:", ":skis:", "🎿"}, + {":skier:", ":skier:", "⛷"}, + {":skull:", ":skull:", "💀"}, + {":skull_and_crossbones:", ":skull and crossbones:", "☠"}, + {":sleeping:", ":sleeping face:", "😴"}, + {":sleeping_bed:", ":person in bed:", "🛌"}, + {":sleepy:", ":sleepy face:", "😪"}, + {":slightly_frowning_face:", ":slightly frowning face:", "🙁"}, + {":slightly_smiling_face:", ":slightly smiling face:", "🙂"}, + {":slot_machine:", ":slot machine:", "🎰"}, + {":slovakia:", ":flag slovakia:", "🇸🇰"}, + {":slovenia:", ":flag slovenia:", "🇸🇮"}, + {":small_airplane:", ":small airplane:", "🛩"}, + {":small_blue_diamond:", ":small blue diamond:", "🔹"}, + {":small_orange_diamond:", ":small orange diamond:", "🔸"}, + {":small_red_triangle:", ":red triangle pointed up:", "🔺"}, + {":small_red_triangle_down:", ":red triangle pointed down:", "🔻"}, + {":smile:", ":grinning face with smiling eyes:", "😄"}, + {":smile_cat:", ":grinning cat face with smiling eyes:", "😸"}, + {":smiley:", ":grinning face with big eyes:", "😃"}, + {":smiley_cat:", ":grinning cat face:", "😺"}, + {":smiling_imp:", ":smiling face with horns:", "😈"}, + {":smirk:", ":smirking face:", "😏"}, + {":smirk_cat:", ":cat face with wry smile:", "😼"}, + {":smoking:", ":cigarette:", "🚬"}, + {":snail:", ":snail:", "🐌"}, + {":snake:", ":snake:", "🐍"}, + {":sneezing_face:", ":sneezing face:", "🤧"}, + {":snowboarder:", ":snowboarder:", "🏂"}, + {":snowflake:", ":snowflake:", "❄"}, + {":snowman:", ":snowman without snow:", "⛄"}, + {":snowman_with_snow:", ":snowman:", "☃"}, + {":sob:", ":loudly crying face:", "😭"}, + {":soccer:", ":soccer ball:", "⚽"}, + {":solomon_islands:", ":flag solomon islands:", "🇸🇧"}, + {":somalia:", ":flag somalia:", "🇸🇴"}, + {":soon:", ":soon arrow:", "🔜"}, + {":sos:", ":sos button:", "🆘"}, + {":sound:", ":speaker medium volume:", "🔉"}, + {":south_africa:", ":flag south africa:", "🇿🇦"}, + {":south_georgia_south_sandwich_islands:", ":flag south georgia & south sandwich islands:", "🇬🇸"}, + {":south_sudan:", ":flag south sudan:", "🇸🇸"}, + {":space_invader:", ":alien monster:", "👾"}, + {":spades:", ":spade suit:", "♠"}, + {":spaghetti:", ":spaghetti:", "🍝"}, + {":sparkle:", ":sparkle:", "❇"}, + {":sparkler:", ":sparkler:", "🎇"}, + {":sparkles:", ":sparkles:", "✨"}, + {":sparkling_heart:", ":sparkling heart:", "💖"}, + {":speak_no_evil:", ":speak-no-evil monkey:", "🙊"}, + {":speaker:", ":speaker low volume:", "🔈"}, + {":speaking_head:", ":speaking head:", "🗣"}, + {":speech_balloon:", ":speech balloon:", "💬"}, + {":speedboat:", ":speedboat:", "🚤"}, + {":spider:", ":spider:", "🕷"}, + {":spider_web:", ":spider web:", "🕸"}, + {":spiral_calendar:", ":spiral calendar:", "🗓"}, + {":spiral_notepad:", ":spiral notepad:", "🗒"}, + {":spoon:", ":spoon:", "🥄"}, + {":squid:", ":squid:", "🦑"}, + {":sri_lanka:", ":flag sri lanka:", "🇱🇰"}, + {":st_barthelemy:", ":flag st. barthĂ©lemy:", "🇧🇱"}, + {":st_helena:", ":flag st. helena:", "🇸🇭"}, + {":st_kitts_nevis:", ":flag st. kitts & nevis:", "🇰🇳"}, + {":st_lucia:", ":flag st. lucia:", "🇱🇨"}, + {":st_pierre_miquelon:", ":flag st. pierre & miquelon:", "🇵🇲"}, + {":st_vincent_grenadines:", ":flag st. vincent & grenadines:", "🇻🇨"}, + {":stadium:", ":stadium:", "🏟"}, + {":star:", ":star:", "⭐"}, + {":star2:", ":glowing star:", "🌟"}, + {":star_and_crescent:", ":star and crescent:", "☪"}, + {":star_of_david:", ":star of david:", "✡"}, + {":stars:", ":shooting star:", "🌠"}, + {":station:", ":station:", "🚉"}, + {":statue_of_liberty:", ":statue of liberty:", "🗽"}, + {":steam_locomotive:", ":locomotive:", "🚂"}, + {":stew:", ":pot of food:", "🍲"}, + {":stop_button:", ":stop button:", "⏹"}, + {":stop_sign:", ":stop sign:", "🛑"}, + {":stopwatch:", ":stopwatch:", "⏱"}, + {":straight_ruler:", ":straight ruler:", "📏"}, + {":strawberry:", ":strawberry:", "🍓"}, + {":stuck_out_tongue:", ":face with tongue:", "😛"}, + {":stuck_out_tongue_closed_eyes:", ":squinting face with tongue:", "😝"}, + {":stuck_out_tongue_winking_eye:", ":winking face with tongue:", "😜"}, + {":studio_microphone:", ":studio microphone:", "🎙"}, + {":stuffed_flatbread:", ":stuffed flatbread:", "🥙"}, + {":sudan:", ":flag sudan:", "🇸🇩"}, + {":sun_behind_large_cloud:", ":sun behind large cloud:", "🌥"}, + {":sun_behind_rain_cloud:", ":sun behind rain cloud:", "🌦"}, + {":sun_behind_small_cloud:", ":sun behind small cloud:", "🌤"}, + {":sun_with_face:", ":sun with face:", "🌞"}, + {":sunflower:", ":sunflower:", "🌻"}, + {":sunglasses:", ":smiling face with sunglasses:", "😎"}, + {":sunny:", ":sun:", "☀"}, + {":sunrise:", ":sunrise:", "🌅"}, + {":sunrise_over_mountains:", ":sunrise over mountains:", "🌄"}, + {":surfer:", ":person surfing:", "🏄"}, + {":surfing_man:", ":person surfing:", "🏄"}, + {":surfing_woman:", ":woman surfing:", "🏄‍♀️"}, + {":suriname:", ":flag suriname:", "🇸🇷"}, + {":sushi:", ":sushi:", "🍣"}, + {":suspension_railway:", ":suspension railway:", "🚟"}, + {":swaziland:", ":flag swaziland:", "🇸🇿"}, + {":sweat:", ":downcast face with sweat:", "😓"}, + {":sweat_drops:", ":sweat droplets:", "💦"}, + {":sweat_smile:", ":grinning face with sweat:", "😅"}, + {":sweden:", ":flag sweden:", "🇸🇪"}, + {":sweet_potato:", ":roasted sweet potato:", "🍠"}, + {":swimmer:", ":person swimming:", "🏊"}, + {":swimming_man:", ":person swimming:", "🏊"}, + {":swimming_woman:", ":woman swimming:", "🏊‍♀️"}, + {":switzerland:", ":flag switzerland:", "🇨🇭"}, + {":symbols:", ":input symbols:", "🔣"}, + {":synagogue:", ":synagogue:", "🕍"}, + {":syria:", ":flag syria:", "🇸🇾"}, + {":syringe:", ":syringe:", "💉"}, + {":taco:", ":taco:", "🌮"}, + {":tada:", ":party popper:", "🎉"}, + {":taiwan:", ":flag taiwan:", "🇹🇼"}, + {":tajikistan:", ":flag tajikistan:", "🇹🇯"}, + {":tanabata_tree:", ":tanabata tree:", "🎋"}, + {":tangerine:", ":tangerine:", "🍊"}, + {":tanzania:", ":flag tanzania:", "🇹🇿"}, + {":taurus:", ":taurus:", "♉"}, + {":taxi:", ":taxi:", "🚕"}, + {":tea:", ":teacup without handle:", "🍵"}, + {":telephone:", ":telephone:", "☎"}, + {":telephone_receiver:", ":telephone receiver:", "📞"}, + {":telescope:", ":telescope:", "🔭"}, + {":tennis:", ":tennis:", "🎾"}, + {":tent:", ":tent:", "⛺"}, + {":thailand:", ":flag thailand:", "🇹🇭"}, + {":thermometer:", ":thermometer:", "🌡"}, + {":thinking:", ":thinking face:", "🤔"}, + {":thought_balloon:", ":thought balloon:", "💭"}, + {":three:", ":keycap 3:", "3️⃣"}, + {":thumbsdown:", ":thumbs down:", "👎"}, + {":thumbsup:", ":thumbs up:", "👍"}, + {":ticket:", ":ticket:", "🎫"}, + {":tickets:", ":admission tickets:", "🎟"}, + {":tiger:", ":tiger face:", "🐯"}, + {":tiger2:", ":tiger:", "🐅"}, + {":timer_clock:", ":timer clock:", "⏲"}, + {":timor_leste:", ":flag timor-leste:", "🇹🇱"}, + {":tipping_hand_man:", ":man tipping hand:", "💁‍♂️"}, + {":tipping_hand_woman:", ":person tipping hand:", "💁"}, + {":tired_face:", ":tired face:", "😫"}, + {":tm:", ":trade mark:", "™"}, + {":togo:", ":flag togo:", "🇹🇬"}, + {":toilet:", ":toilet:", "🚽"}, + {":tokelau:", ":flag tokelau:", "🇹🇰"}, + {":tokyo_tower:", ":tokyo tower:", "🗼"}, + {":tomato:", ":tomato:", "🍅"}, + {":tonga:", ":flag tonga:", "🇹🇴"}, + {":tongue:", ":tongue:", "👅"}, + {":top:", ":top arrow:", "🔝"}, + {":tophat:", ":top hat:", "🎩"}, + {":tornado:", ":tornado:", "🌪"}, + {":tr:", ":flag turkey:", "🇹🇷"}, + {":trackball:", ":trackball:", "🖲"}, + {":tractor:", ":tractor:", "🚜"}, + {":traffic_light:", ":horizontal traffic light:", "🚥"}, + {":train:", ":tram car:", "🚋"}, + {":train2:", ":train:", "🚆"}, + {":tram:", ":tram:", "🚊"}, + {":triangular_flag_on_post:", ":triangular flag:", "🚩"}, + {":triangular_ruler:", ":triangular ruler:", "📐"}, + {":trident:", ":trident emblem:", "🔱"}, + {":trinidad_tobago:", ":flag trinidad & tobago:", "🇹🇹"}, + {":triumph:", ":face with steam from nose:", "😤"}, + {":trolleybus:", ":trolleybus:", "🚎"}, + {":trophy:", ":trophy:", "🏆"}, + {":tropical_drink:", ":tropical drink:", "🍹"}, + {":tropical_fish:", ":tropical fish:", "🐠"}, + {":truck:", ":delivery truck:", "🚚"}, + {":trumpet:", ":trumpet:", "🎺"}, + {":tshirt:", ":t-shirt:", "👕"}, + {":tulip:", ":tulip:", "🌷"}, + {":tumbler_glass:", ":tumbler glass:", "🥃"}, + {":tunisia:", ":flag tunisia:", "🇹🇳"}, + {":turkey:", ":turkey:", "🦃"}, + {":turkmenistan:", ":flag turkmenistan:", "🇹🇲"}, + {":turks_caicos_islands:", ":flag turks & caicos islands:", "🇹🇨"}, + {":turtle:", ":turtle:", "🐢"}, + {":tuvalu:", ":flag tuvalu:", "🇹🇻"}, + {":tv:", ":television:", "📺"}, + {":twisted_rightwards_arrows:", ":shuffle tracks button:", "🔀"}, + {":two:", ":keycap 2:", "2️⃣"}, + {":two_hearts:", ":two hearts:", "💕"}, + {":two_men_holding_hands:", ":two men holding hands:", "👬"}, + {":two_women_holding_hands:", ":two women holding hands:", "👭"}, + {":u5272:", ":japanese \"discount\" button:", "🈹"}, + {":u5408:", ":japanese \"passing grade\" button:", "🈴"}, + {":u55b6:", ":japanese \"open for business\" button:", "🈺"}, + {":u6307:", ":japanese \"reserved\" button:", "🈯"}, + {":u6708:", ":japanese \"monthly amount\" button:", "🈷"}, + {":u6709:", ":japanese \"not free of charge\" button:", "🈶"}, + {":u6e80:", ":japanese \"no vacancy\" button:", "🈵"}, + {":u7121:", ":japanese \"free of charge\" button:", "🈚"}, + {":u7533:", ":japanese \"application\" button:", "🈸"}, + {":u7981:", ":japanese \"prohibited\" button:", "🈲"}, + {":u7a7a:", ":japanese \"vacancy\" button:", "🈳"}, + {":uganda:", ":flag uganda:", "🇺🇬"}, + {":uk:", ":flag united kingdom:", "🇬🇧"}, + {":ukraine:", ":flag ukraine:", "🇺🇦"}, + {":umbrella:", ":umbrella with rain drops:", "☔"}, + {":unamused:", ":unamused face:", "😒"}, + {":underage:", ":no one under eighteen:", "🔞"}, + {":unicorn:", ":unicorn face:", "🦄"}, + {":united_arab_emirates:", ":flag united arab emirates:", "🇦🇪"}, + {":unlock:", ":unlocked:", "🔓"}, + {":up:", ":up! button:", "🆙"}, + {":upside_down_face:", ":upside-down face:", "🙃"}, + {":uruguay:", ":flag uruguay:", "🇺🇾"}, + {":us:", ":flag united states:", "🇺🇸"}, + {":us_virgin_islands:", ":flag u.s. virgin islands:", "🇻🇮"}, + {":uzbekistan:", ":flag uzbekistan:", "🇺🇿"}, + {":v:", ":victory hand:", "✌"}, + {":vanuatu:", ":flag vanuatu:", "🇻🇺"}, + {":vatican_city:", ":flag vatican city:", "🇻🇦"}, + {":venezuela:", ":flag venezuela:", "🇻🇪"}, + {":vertical_traffic_light:", ":vertical traffic light:", "🚦"}, + {":vhs:", ":videocassette:", "📼"}, + {":vibration_mode:", ":vibration mode:", "📳"}, + {":video_camera:", ":video camera:", "📹"}, + {":video_game:", ":video game:", "🎮"}, + {":vietnam:", ":flag vietnam:", "🇻🇳"}, + {":violin:", ":violin:", "🎻"}, + {":virgo:", ":virgo:", "♍"}, + {":volcano:", ":volcano:", "🌋"}, + {":volleyball:", ":volleyball:", "🏐"}, + {":vs:", ":vs button:", "🆚"}, + {":vulcan_salute:", ":vulcan salute:", "🖖"}, + {":walking:", ":person walking:", "🚶"}, + {":walking_man:", ":person walking:", "🚶"}, + {":walking_woman:", ":woman walking:", "🚶‍♀️"}, + {":wallis_futuna:", ":flag wallis & futuna:", "🇼🇫"}, + {":waning_crescent_moon:", ":waning crescent moon:", "🌘"}, + {":waning_gibbous_moon:", ":waning gibbous moon:", "🌖"}, + {":warning:", ":warning:", "⚠"}, + {":wastebasket:", ":wastebasket:", "🗑"}, + {":watch:", ":watch:", "⌚"}, + {":water_buffalo:", ":water buffalo:", "🐃"}, + {":watermelon:", ":watermelon:", "🍉"}, + {":wave:", ":waving hand:", "👋"}, + {":wavy_dash:", ":wavy dash:", "〰"}, + {":waxing_crescent_moon:", ":waxing crescent moon:", "🌒"}, + {":waxing_gibbous_moon:", ":waxing gibbous moon:", "🌔"}, + {":wc:", ":water closet:", "🚾"}, + {":weary:", ":weary face:", "😩"}, + {":wedding:", ":wedding:", "💒"}, + {":weight_lifting_man:", ":person lifting weights:", "🏋"}, + {":weight_lifting_woman:", ":woman lifting weights:", "🏋️‍♀️"}, + {":western_sahara:", ":flag western sahara:", "🇪🇭"}, + {":whale:", ":spouting whale:", "🐳"}, + {":whale2:", ":whale:", "🐋"}, + {":wheel_of_dharma:", ":wheel of dharma:", "☸"}, + {":wheelchair:", ":wheelchair symbol:", "♿"}, + {":white_check_mark:", ":white heavy check mark:", "✅"}, + {":white_circle:", ":white circle:", "⚪"}, + {":white_flag:", ":white flag:", "🏳"}, + {":white_flower:", ":white flower:", "💮"}, + {":white_large_square:", ":white large square:", "⬜"}, + {":white_medium_small_square:", ":white medium-small square:", "◽"}, + {":white_medium_square:", ":white medium square:", "◻"}, + {":white_small_square:", ":white small square:", "▫"}, + {":white_square_button:", ":white square button:", "🔳"}, + {":wilted_flower:", ":wilted flower:", "🥀"}, + {":wind_chime:", ":wind chime:", "🎐"}, + {":wind_face:", ":wind face:", "🌬"}, + {":wine_glass:", ":wine glass:", "🍷"}, + {":wink:", ":winking face:", "😉"}, + {":wolf:", ":wolf face:", "🐺"}, + {":woman:", ":woman:", "👩"}, + {":woman_artist:", ":woman artist:", "👩‍🎨"}, + {":woman_astronaut:", ":woman astronaut:", "👩‍🚀"}, + {":woman_cartwheeling:", ":woman cartwheeling:", "🤸‍♀️"}, + {":woman_cook:", ":woman cook:", "👩‍🍳"}, + {":woman_facepalming:", ":woman facepalming:", "🤦‍♀️"}, + {":woman_factory_worker:", ":woman factory worker:", "👩‍🏭"}, + {":woman_farmer:", ":woman farmer:", "👩‍🌾"}, + {":woman_firefighter:", ":woman firefighter:", "👩‍🚒"}, + {":woman_health_worker:", ":woman health worker:", "👩‍⚕️"}, + {":woman_judge:", ":woman judge:", "👩‍⚖️"}, + {":woman_juggling:", ":woman juggling:", "🤹‍♀️"}, + {":woman_mechanic:", ":woman mechanic:", "👩‍🔧"}, + {":woman_office_worker:", ":woman office worker:", "👩‍💼"}, + {":woman_pilot:", ":woman pilot:", "👩‍✈️"}, + {":woman_playing_handball:", ":woman playing handball:", "🤾‍♀️"}, + {":woman_playing_water_polo:", ":woman playing water polo:", "🤽‍♀️"}, + {":woman_scientist:", ":woman scientist:", "👩‍🔬"}, + {":woman_shrugging:", ":woman shrugging:", "🤷‍♀️"}, + {":woman_singer:", ":woman singer:", "👩‍🎤"}, + {":woman_student:", ":woman student:", "👩‍🎓"}, + {":woman_teacher:", ":woman teacher:", "👩‍🏫"}, + {":woman_technologist:", ":woman technologist:", "👩‍💻"}, + {":woman_with_turban:", ":woman wearing turban:", "👳‍♀️"}, + {":womans_clothes:", ":woman's clothes:", "👚"}, + {":womans_hat:", ":woman's hat:", "👒"}, + {":women_wrestling:", ":women wrestling:", "🤼‍♀️"}, + {":womens:", ":women's room:", "🚺"}, + {":world_map:", ":world map:", "🗺"}, + {":worried:", ":worried face:", "😟"}, + {":wrench:", ":wrench:", "🔧"}, + {":writing_hand:", ":writing hand:", "✍"}, + {":x:", ":cross mark:", "❌"}, + {":yellow_heart:", ":yellow heart:", "💛"}, + {":yemen:", ":flag yemen:", "🇾🇪"}, + {":yen:", ":yen banknote:", "💴"}, + {":yin_yang:", ":yin yang:", "☯"}, + {":yum:", ":face savoring food:", "😋"}, + {":zambia:", ":flag zambia:", "🇿🇲"}, + {":zap:", ":high voltage:", "⚡"}, + {":zero:", ":keycap 0:", "0️⃣"}, + {":zimbabwe:", ":flag zimbabwe:", "🇿🇼"}, + {":zipper_mouth_face:", ":zipper-mouth face:", "🤐"}, + {":zzz:", ":zzz:", "💤"}, + {"", ":smiling face with 3 hearts:", "🥰"}, + {"", ":star-struck:", "🤩"}, + {"", ":zany face:", "🤪"}, + {"", ":face with hand over mouth:", "🤭"}, + {"", ":shushing face:", "🤫"}, + {"", ":face with raised eyebrow:", "🤨"}, + {"", ":face vomiting:", "🤮"}, + {"", ":hot face:", "🥵"}, + {"", ":cold face:", "🥶"}, + {"", ":woozy face:", "🥴"}, + {"", ":exploding head:", "🤯"}, + {"", ":partying face:", "🥳"}, + {"", ":face with monocle:", "🧐"}, + {"", ":pleading face:", "🥺"}, + {"", ":face with symbols on mouth:", "🤬"}, + {"", ":orange heart:", "🧡"}, + {"", ":left speech bubble:", "🗨"}, + {"", ":love-you gesture:", "🤟"}, + {"", ":palms up together:", "🤲"}, + {"", ":leg:", "🦵"}, + {"", ":foot:", "🦶"}, + {"", ":brain:", "🧠"}, + {"", ":tooth:", "🦷"}, + {"", ":bone:", "🦴"}, + {"", ":eye:", "👁"}, + {"", ":child:", "🧒"}, + {"", ":person:", "🧑"}, + {"", ":man blond hair:", "👱‍♂️"}, + {"", ":man red hair:", "👨‍🦰"}, + {"", ":man curly hair:", "👨‍🦱"}, + {"", ":man white hair:", "👨‍🦳"}, + {"", ":man bald:", "👨‍🦲"}, + {"", ":man beard:", "🧔"}, + {"", ":woman red hair:", "👩‍🦰"}, + {"", ":woman curly hair:", "👩‍🦱"}, + {"", ":woman white hair:", "👩‍🦳"}, + {"", ":woman bald:", "👩‍🦲"}, + {"", ":older person:", "🧓"}, + {"", ":woman frowning:", "🙍‍♀️"}, + {"", ":woman pouting:", "🙎‍♀️"}, + {"", ":woman gesturing no:", "🙅‍♀️"}, + {"", ":woman gesturing ok:", "🙆‍♀️"}, + {"", ":woman tipping hand:", "💁‍♀️"}, + {"", ":woman raising hand:", "🙋‍♀️"}, + {"", ":man bowing:", "🙇‍♂️"}, + {"", ":person facepalming:", "🤦"}, + {"", ":person shrugging:", "🤷"}, + {"", ":man police officer:", "👮‍♂️"}, + {"", ":man detective:", "🕵️‍♂️"}, + {"", ":man guard:", "💂‍♂️"}, + {"", ":man construction worker:", "👷‍♂️"}, + {"", ":man wearing turban:", "👳‍♂️"}, + {"", ":woman with headscarf:", "🧕"}, + {"", ":breast-feeding:", "🤱"}, + {"", ":superhero:", "🦸"}, + {"", ":man superhero:", "🦸‍♂️"}, + {"", ":woman superhero:", "🦸‍♀️"}, + {"", ":supervillain:", "🦹"}, + {"", ":man supervillain:", "🦹‍♂️"}, + {"", ":woman supervillain:", "🦹‍♀️"}, + {"", ":mage:", "🧙"}, + {"", ":man mage:", "🧙‍♂️"}, + {"", ":woman mage:", "🧙‍♀️"}, + {"", ":fairy:", "🧚"}, + {"", ":man fairy:", "🧚‍♂️"}, + {"", ":woman fairy:", "🧚‍♀️"}, + {"", ":vampire:", "🧛"}, + {"", ":man vampire:", "🧛‍♂️"}, + {"", ":woman vampire:", "🧛‍♀️"}, + {"", ":merperson:", "🧜"}, + {"", ":merman:", "🧜‍♂️"}, + {"", ":mermaid:", "🧜‍♀️"}, + {"", ":elf:", "🧝"}, + {"", ":man elf:", "🧝‍♂️"}, + {"", ":woman elf:", "🧝‍♀️"}, + {"", ":genie:", "🧞"}, + {"", ":man genie:", "🧞‍♂️"}, + {"", ":woman genie:", "🧞‍♀️"}, + {"", ":zombie:", "🧟"}, + {"", ":man zombie:", "🧟‍♂️"}, + {"", ":woman zombie:", "🧟‍♀️"}, + {"", ":woman getting massage:", "💆‍♀️"}, + {"", ":woman getting haircut:", "💇‍♀️"}, + {"", ":man walking:", "🚶‍♂️"}, + {"", ":man running:", "🏃‍♂️"}, + {"", ":women with bunny ears:", "👯‍♀️"}, + {"", ":person in steamy room:", "🧖"}, + {"", ":man in steamy room:", "🧖‍♂️"}, + {"", ":woman in steamy room:", "🧖‍♀️"}, + {"", ":person climbing:", "🧗"}, + {"", ":man climbing:", "🧗‍♂️"}, + {"", ":woman climbing:", "🧗‍♀️"}, + {"", ":man golfing:", "🏌️‍♂️"}, + {"", ":man surfing:", "🏄‍♂️"}, + {"", ":man rowing boat:", "🚣‍♂️"}, + {"", ":man swimming:", "🏊‍♂️"}, + {"", ":man bouncing ball:", "⛹️‍♂️"}, + {"", ":man lifting weights:", "🏋️‍♂️"}, + {"", ":man biking:", "🚴‍♂️"}, + {"", ":man mountain biking:", "🚵‍♂️"}, + {"", ":person cartwheeling:", "🤸"}, + {"", ":people wrestling:", "🤼"}, + {"", ":person playing water polo:", "🤽"}, + {"", ":person playing handball:", "🤾"}, + {"", ":person juggling:", "🤹"}, + {"", ":person in lotus position:", "🧘"}, + {"", ":man in lotus position:", "🧘‍♂️"}, + {"", ":woman in lotus position:", "🧘‍♀️"}, + {"", ":kiss woman, man:", "👩‍❤️‍💋‍👨"}, + {"", ":couple with heart woman, man:", "👩‍❤️‍👨"}, + {"", ":couple with heart man, man:", "👨‍❤️‍👨"}, + {"", ":couple with heart woman, woman:", "👩‍❤️‍👩"}, + {"", ":family man, boy:", "👨‍👦"}, + {"", ":family man, boy, boy:", "👨‍👦‍👦"}, + {"", ":family man, girl:", "👨‍👧"}, + {"", ":family man, girl, boy:", "👨‍👧‍👦"}, + {"", ":family man, girl, girl:", "👨‍👧‍👧"}, + {"", ":family woman, boy:", "👩‍👦"}, + {"", ":family woman, boy, boy:", "👩‍👦‍👦"}, + {"", ":family woman, girl:", "👩‍👧"}, + {"", ":family woman, girl, boy:", "👩‍👧‍👦"}, + {"", ":family woman, girl, girl:", "👩‍👧‍👧"}, + {"", ":red hair:", "🦰"}, + {"", ":curly hair:", "🦱"}, + {"", ":white hair:", "🦳"}, + {"", ":bald:", "🦲"}, + {"", ":female sign:", "♀"}, + {"", ":male sign:", "♂"}, + {"", ":raccoon:", "🦝"}, + {"", ":zebra:", "🦓"}, + {"", ":llama:", "🦙"}, + {"", ":giraffe:", "🦒"}, + {"", ":hippopotamus:", "🦛"}, + {"", ":hedgehog:", "🦔"}, + {"", ":kangaroo:", "🦘"}, + {"", ":badger:", "🦡"}, + {"", ":swan:", "🦢"}, + {"", ":peacock:", "🦚"}, + {"", ":parrot:", "🦜"}, + {"", ":sauropod:", "🦕"}, + {"", ":t-rex:", "🦖"}, + {"", ":cricket:", "🦗"}, + {"", ":mosquito:", "🦟"}, + {"", ":microbe:", "🦠"}, + {"", ":mango:", "🥭"}, + {"", ":coconut:", "🥥"}, + {"", ":leafy green:", "🥬"}, + {"", ":broccoli:", "🥦"}, + {"", ":pretzel:", "🥨"}, + {"", ":bagel:", "🥯"}, + {"", ":cut of meat:", "🥩"}, + {"", ":sandwich:", "🥪"}, + {"", ":bowl with spoon:", "🥣"}, + {"", ":salt:", "🧂"}, + {"", ":canned food:", "🥫"}, + {"", ":moon cake:", "🥮"}, + {"", ":dumpling:", "🥟"}, + {"", ":fortune cookie:", "🥠"}, + {"", ":takeout box:", "🥡"}, + {"", ":lobster:", "🦞"}, + {"", ":cupcake:", "🧁"}, + {"", ":pie:", "🥧"}, + {"", ":cup with straw:", "🥤"}, + {"", ":chopsticks:", "🥢"}, + {"", ":compass:", "🧭"}, + {"", ":brick:", "🧱"}, + {"", ":skateboard:", "🛹"}, + {"", ":flying saucer:", "🛸"}, + {"", ":luggage:", "🧳"}, + {"", ":firecracker:", "🧨"}, + {"", ":red envelope:", "🧧"}, + {"", ":softball:", "🥎"}, + {"", ":flying disc:", "🥏"}, + {"", ":lacrosse:", "🥍"}, + {"", ":sled:", "🛷"}, + {"", ":curling stone:", "🥌"}, + {"", ":nazar amulet:", "🧿"}, + {"", ":jigsaw:", "🧩"}, + {"", ":teddy bear:", "🧸"}, + {"", ":chess pawn:", "♟"}, + {"", ":thread:", "🧵"}, + {"", ":yarn:", "🧶"}, + {"", ":goggles:", "🥽"}, + {"", ":lab coat:", "🥼"}, + {"", ":scarf:", "🧣"}, + {"", ":gloves:", "🧤"}, + {"", ":coat:", "🧥"}, + {"", ":socks:", "🧦"}, + {"", ":hiking boot:", "🥾"}, + {"", ":flat shoe:", "🥿"}, + {"", ":billed cap:", "🧢"}, + {"", ":abacus:", "🧮"}, + {"", ":receipt:", "🧾"}, + {"", ":toolbox:", "🧰"}, + {"", ":magnet:", "🧲"}, + {"", ":test tube:", "🧪"}, + {"", ":petri dish:", "🧫"}, + {"", ":dna:", "🧬"}, + {"", ":lotion bottle:", "🧴"}, + {"", ":safety pin:", "🧷"}, + {"", ":broom:", "🧹"}, + {"", ":basket:", "🧺"}, + {"", ":roll of paper:", "🧻"}, + {"", ":soap:", "🧼"}, + {"", ":sponge:", "🧽"}, + {"", ":fire extinguisher:", "🧯"}, + {"", ":eject button:", "⏏"}, + {"", ":medical symbol:", "⚕"}, + {"", ":infinity:", "♾"}, + {"", ":pirate flag:", "🏴‍☠️"}, + {"", ":flag ascension island:", "🇦🇨"}, + {"", ":flag bouvet island:", "🇧🇻"}, + {"", ":flag clipperton island:", "🇨🇵"}, + {"", ":flag diego garcia:", "🇩🇬"}, + {"", ":flag ceuta & melilla:", "🇪🇦"}, + {"", ":flag heard & mcdonald islands:", "🇭🇲"}, + {"", ":flag st. martin:", "🇲🇫"}, + {"", ":flag svalbard & jan mayen:", "🇸🇯"}, + {"", ":flag tristan da cunha:", "🇹🇦"}, + {"", ":flag u.s. outlying islands:", "🇺🇲"}, + {"", ":flag united nations:", "🇺🇳"}, + {"", ":flag england:", "🏴󠁧󠁢󠁥󠁮󠁧󠁿"}, + {"", ":flag scotland:", "🏴󠁧󠁢󠁳󠁣󠁴󠁿"}, + {"", ":flag wales:", "🏴󠁧󠁢󠁷󠁬󠁳󠁿"}, + {"", ":waving hand light skin tone:", "👋🏻"}, + {"", ":waving hand medium-light skin tone:", "👋🏼"}, + {"", ":waving hand medium skin tone:", "👋🏽"}, + {"", ":waving hand medium-dark skin tone:", "👋🏾"}, + {"", ":waving hand dark skin tone:", "👋🏿"}, + {"", ":raised back of hand light skin tone:", "🤚🏻"}, + {"", ":raised back of hand medium-light skin tone:", "🤚🏼"}, + {"", ":raised back of hand medium skin tone:", "🤚🏽"}, + {"", ":raised back of hand medium-dark skin tone:", "🤚🏾"}, + {"", ":raised back of hand dark skin tone:", "🤚🏿"}, + {"", ":hand with fingers splayed light skin tone:", "🖐🏻"}, + {"", ":hand with fingers splayed medium-light skin tone:", "🖐🏼"}, + {"", ":hand with fingers splayed medium skin tone:", "🖐🏽"}, + {"", ":hand with fingers splayed medium-dark skin tone:", "🖐🏾"}, + {"", ":hand with fingers splayed dark skin tone:", "🖐🏿"}, + {"", ":raised hand light skin tone:", "✋🏻"}, + {"", ":raised hand medium-light skin tone:", "✋🏼"}, + {"", ":raised hand medium skin tone:", "✋🏽"}, + {"", ":raised hand medium-dark skin tone:", "✋🏾"}, + {"", ":raised hand dark skin tone:", "✋🏿"}, + {"", ":vulcan salute light skin tone:", "🖖🏻"}, + {"", ":vulcan salute medium-light skin tone:", "🖖🏼"}, + {"", ":vulcan salute medium skin tone:", "🖖🏽"}, + {"", ":vulcan salute medium-dark skin tone:", "🖖🏾"}, + {"", ":vulcan salute dark skin tone:", "🖖🏿"}, + {"", ":ok hand light skin tone:", "👌🏻"}, + {"", ":ok hand medium-light skin tone:", "👌🏼"}, + {"", ":ok hand medium skin tone:", "👌🏽"}, + {"", ":ok hand medium-dark skin tone:", "👌🏾"}, + {"", ":ok hand dark skin tone:", "👌🏿"}, + {"", ":victory hand light skin tone:", "✌🏻"}, + {"", ":victory hand medium-light skin tone:", "✌🏼"}, + {"", ":victory hand medium skin tone:", "✌🏽"}, + {"", ":victory hand medium-dark skin tone:", "✌🏾"}, + {"", ":victory hand dark skin tone:", "✌🏿"}, + {"", ":crossed fingers light skin tone:", "🤞🏻"}, + {"", ":crossed fingers medium-light skin tone:", "🤞🏼"}, + {"", ":crossed fingers medium skin tone:", "🤞🏽"}, + {"", ":crossed fingers medium-dark skin tone:", "🤞🏾"}, + {"", ":crossed fingers dark skin tone:", "🤞🏿"}, + {"", ":love-you gesture light skin tone:", "🤟🏻"}, + {"", ":love-you gesture medium-light skin tone:", "🤟🏼"}, + {"", ":love-you gesture medium skin tone:", "🤟🏽"}, + {"", ":love-you gesture medium-dark skin tone:", "🤟🏾"}, + {"", ":love-you gesture dark skin tone:", "🤟🏿"}, + {"", ":sign of the horns light skin tone:", "🤘🏻"}, + {"", ":sign of the horns medium-light skin tone:", "🤘🏼"}, + {"", ":sign of the horns medium skin tone:", "🤘🏽"}, + {"", ":sign of the horns medium-dark skin tone:", "🤘🏾"}, + {"", ":sign of the horns dark skin tone:", "🤘🏿"}, + {"", ":call me hand light skin tone:", "🤙🏻"}, + {"", ":call me hand medium-light skin tone:", "🤙🏼"}, + {"", ":call me hand medium skin tone:", "🤙🏽"}, + {"", ":call me hand medium-dark skin tone:", "🤙🏾"}, + {"", ":call me hand dark skin tone:", "🤙🏿"}, + {"", ":backhand index pointing left light skin tone:", "👈🏻"}, + {"", ":backhand index pointing left medium-light skin tone:", "👈🏼"}, + {"", ":backhand index pointing left medium skin tone:", "👈🏽"}, + {"", ":backhand index pointing left medium-dark skin tone:", "👈🏾"}, + {"", ":backhand index pointing left dark skin tone:", "👈🏿"}, + {"", ":backhand index pointing right light skin tone:", "👉🏻"}, + {"", ":backhand index pointing right medium-light skin tone:", "👉🏼"}, + {"", ":backhand index pointing right medium skin tone:", "👉🏽"}, + {"", ":backhand index pointing right medium-dark skin tone:", "👉🏾"}, + {"", ":backhand index pointing right dark skin tone:", "👉🏿"}, + {"", ":backhand index pointing up light skin tone:", "👆🏻"}, + {"", ":backhand index pointing up medium-light skin tone:", "👆🏼"}, + {"", ":backhand index pointing up medium skin tone:", "👆🏽"}, + {"", ":backhand index pointing up medium-dark skin tone:", "👆🏾"}, + {"", ":backhand index pointing up dark skin tone:", "👆🏿"}, + {"", ":middle finger light skin tone:", "🖕🏻"}, + {"", ":middle finger medium-light skin tone:", "🖕🏼"}, + {"", ":middle finger medium skin tone:", "🖕🏽"}, + {"", ":middle finger medium-dark skin tone:", "🖕🏾"}, + {"", ":middle finger dark skin tone:", "🖕🏿"}, + {"", ":backhand index pointing down light skin tone:", "👇🏻"}, + {"", ":backhand index pointing down medium-light skin tone:", "👇🏼"}, + {"", ":backhand index pointing down medium skin tone:", "👇🏽"}, + {"", ":backhand index pointing down medium-dark skin tone:", "👇🏾"}, + {"", ":backhand index pointing down dark skin tone:", "👇🏿"}, + {"", ":index pointing up light skin tone:", "☝🏻"}, + {"", ":index pointing up medium-light skin tone:", "☝🏼"}, + {"", ":index pointing up medium skin tone:", "☝🏽"}, + {"", ":index pointing up medium-dark skin tone:", "☝🏾"}, + {"", ":index pointing up dark skin tone:", "☝🏿"}, + {"", ":thumbs up light skin tone:", "👍🏻"}, + {"", ":thumbs up medium-light skin tone:", "👍🏼"}, + {"", ":thumbs up medium skin tone:", "👍🏽"}, + {"", ":thumbs up medium-dark skin tone:", "👍🏾"}, + {"", ":thumbs up dark skin tone:", "👍🏿"}, + {"", ":thumbs down light skin tone:", "👎🏻"}, + {"", ":thumbs down medium-light skin tone:", "👎🏼"}, + {"", ":thumbs down medium skin tone:", "👎🏽"}, + {"", ":thumbs down medium-dark skin tone:", "👎🏾"}, + {"", ":thumbs down dark skin tone:", "👎🏿"}, + {"", ":raised fist light skin tone:", "✊🏻"}, + {"", ":raised fist medium-light skin tone:", "✊🏼"}, + {"", ":raised fist medium skin tone:", "✊🏽"}, + {"", ":raised fist medium-dark skin tone:", "✊🏾"}, + {"", ":raised fist dark skin tone:", "✊🏿"}, + {"", ":oncoming fist light skin tone:", "👊🏻"}, + {"", ":oncoming fist medium-light skin tone:", "👊🏼"}, + {"", ":oncoming fist medium skin tone:", "👊🏽"}, + {"", ":oncoming fist medium-dark skin tone:", "👊🏾"}, + {"", ":oncoming fist dark skin tone:", "👊🏿"}, + {"", ":left-facing fist light skin tone:", "🤛🏻"}, + {"", ":left-facing fist medium-light skin tone:", "🤛🏼"}, + {"", ":left-facing fist medium skin tone:", "🤛🏽"}, + {"", ":left-facing fist medium-dark skin tone:", "🤛🏾"}, + {"", ":left-facing fist dark skin tone:", "🤛🏿"}, + {"", ":right-facing fist light skin tone:", "🤜🏻"}, + {"", ":right-facing fist medium-light skin tone:", "🤜🏼"}, + {"", ":right-facing fist medium skin tone:", "🤜🏽"}, + {"", ":right-facing fist medium-dark skin tone:", "🤜🏾"}, + {"", ":right-facing fist dark skin tone:", "🤜🏿"}, + {"", ":clapping hands light skin tone:", "👏🏻"}, + {"", ":clapping hands medium-light skin tone:", "👏🏼"}, + {"", ":clapping hands medium skin tone:", "👏🏽"}, + {"", ":clapping hands medium-dark skin tone:", "👏🏾"}, + {"", ":clapping hands dark skin tone:", "👏🏿"}, + {"", ":raising hands light skin tone:", "🙌🏻"}, + {"", ":raising hands medium-light skin tone:", "🙌🏼"}, + {"", ":raising hands medium skin tone:", "🙌🏽"}, + {"", ":raising hands medium-dark skin tone:", "🙌🏾"}, + {"", ":raising hands dark skin tone:", "🙌🏿"}, + {"", ":open hands light skin tone:", "👐🏻"}, + {"", ":open hands medium-light skin tone:", "👐🏼"}, + {"", ":open hands medium skin tone:", "👐🏽"}, + {"", ":open hands medium-dark skin tone:", "👐🏾"}, + {"", ":open hands dark skin tone:", "👐🏿"}, + {"", ":palms up together light skin tone:", "🤲🏻"}, + {"", ":palms up together medium-light skin tone:", "🤲🏼"}, + {"", ":palms up together medium skin tone:", "🤲🏽"}, + {"", ":palms up together medium-dark skin tone:", "🤲🏾"}, + {"", ":palms up together dark skin tone:", "🤲🏿"}, + {"", ":folded hands light skin tone:", "🙏🏻"}, + {"", ":folded hands medium-light skin tone:", "🙏🏼"}, + {"", ":folded hands medium skin tone:", "🙏🏽"}, + {"", ":folded hands medium-dark skin tone:", "🙏🏾"}, + {"", ":folded hands dark skin tone:", "🙏🏿"}, + {"", ":writing hand light skin tone:", "✍🏻"}, + {"", ":writing hand medium-light skin tone:", "✍🏼"}, + {"", ":writing hand medium skin tone:", "✍🏽"}, + {"", ":writing hand medium-dark skin tone:", "✍🏾"}, + {"", ":writing hand dark skin tone:", "✍🏿"}, + {"", ":nail polish light skin tone:", "💅🏻"}, + {"", ":nail polish medium-light skin tone:", "💅🏼"}, + {"", ":nail polish medium skin tone:", "💅🏽"}, + {"", ":nail polish medium-dark skin tone:", "💅🏾"}, + {"", ":nail polish dark skin tone:", "💅🏿"}, + {"", ":selfie light skin tone:", "🤳🏻"}, + {"", ":selfie medium-light skin tone:", "🤳🏼"}, + {"", ":selfie medium skin tone:", "🤳🏽"}, + {"", ":selfie medium-dark skin tone:", "🤳🏾"}, + {"", ":selfie dark skin tone:", "🤳🏿"}, + {"", ":flexed biceps light skin tone:", "💪🏻"}, + {"", ":flexed biceps medium-light skin tone:", "💪🏼"}, + {"", ":flexed biceps medium skin tone:", "💪🏽"}, + {"", ":flexed biceps medium-dark skin tone:", "💪🏾"}, + {"", ":flexed biceps dark skin tone:", "💪🏿"}, + {"", ":leg light skin tone:", "🦵🏻"}, + {"", ":leg medium-light skin tone:", "🦵🏼"}, + {"", ":leg medium skin tone:", "🦵🏽"}, + {"", ":leg medium-dark skin tone:", "🦵🏾"}, + {"", ":leg dark skin tone:", "🦵🏿"}, + {"", ":foot light skin tone:", "🦶🏻"}, + {"", ":foot medium-light skin tone:", "🦶🏼"}, + {"", ":foot medium skin tone:", "🦶🏽"}, + {"", ":foot medium-dark skin tone:", "🦶🏾"}, + {"", ":foot dark skin tone:", "🦶🏿"}, + {"", ":ear light skin tone:", "👂🏻"}, + {"", ":ear medium-light skin tone:", "👂🏼"}, + {"", ":ear medium skin tone:", "👂🏽"}, + {"", ":ear medium-dark skin tone:", "👂🏾"}, + {"", ":ear dark skin tone:", "👂🏿"}, + {"", ":nose light skin tone:", "👃🏻"}, + {"", ":nose medium-light skin tone:", "👃🏼"}, + {"", ":nose medium skin tone:", "👃🏽"}, + {"", ":nose medium-dark skin tone:", "👃🏾"}, + {"", ":nose dark skin tone:", "👃🏿"}, + {"", ":baby light skin tone:", "👶🏻"}, + {"", ":baby medium-light skin tone:", "👶🏼"}, + {"", ":baby medium skin tone:", "👶🏽"}, + {"", ":baby medium-dark skin tone:", "👶🏾"}, + {"", ":baby dark skin tone:", "👶🏿"}, + {"", ":child light skin tone:", "🧒🏻"}, + {"", ":child medium-light skin tone:", "🧒🏼"}, + {"", ":child medium skin tone:", "🧒🏽"}, + {"", ":child medium-dark skin tone:", "🧒🏾"}, + {"", ":child dark skin tone:", "🧒🏿"}, + {"", ":boy light skin tone:", "👦🏻"}, + {"", ":boy medium-light skin tone:", "👦🏼"}, + {"", ":boy medium skin tone:", "👦🏽"}, + {"", ":boy medium-dark skin tone:", "👦🏾"}, + {"", ":boy dark skin tone:", "👦🏿"}, + {"", ":girl light skin tone:", "👧🏻"}, + {"", ":girl medium-light skin tone:", "👧🏼"}, + {"", ":girl medium skin tone:", "👧🏽"}, + {"", ":girl medium-dark skin tone:", "👧🏾"}, + {"", ":girl dark skin tone:", "👧🏿"}, + {"", ":person light skin tone:", "🧑🏻"}, + {"", ":person medium-light skin tone:", "🧑🏼"}, + {"", ":person medium skin tone:", "🧑🏽"}, + {"", ":person medium-dark skin tone:", "🧑🏾"}, + {"", ":person dark skin tone:", "🧑🏿"}, + {"", ":person light skin tone, blond hair:", "👱🏻"}, + {"", ":person medium-light skin tone, blond hair:", "👱🏼"}, + {"", ":person medium skin tone, blond hair:", "👱🏽"}, + {"", ":person medium-dark skin tone, blond hair:", "👱🏾"}, + {"", ":person dark skin tone, blond hair:", "👱🏿"}, + {"", ":man light skin tone:", "👨🏻"}, + {"", ":man medium-light skin tone:", "👨🏼"}, + {"", ":man medium skin tone:", "👨🏽"}, + {"", ":man medium-dark skin tone:", "👨🏾"}, + {"", ":man dark skin tone:", "👨🏿"}, + {"", ":man light skin tone, blond hair:", "👱🏻‍♂️"}, + {"", ":man medium-light skin tone, blond hair:", "👱🏼‍♂️"}, + {"", ":man medium skin tone, blond hair:", "👱🏽‍♂️"}, + {"", ":man medium-dark skin tone, blond hair:", "👱🏾‍♂️"}, + {"", ":man dark skin tone, blond hair:", "👱🏿‍♂️"}, + {"", ":man light skin tone, red hair:", "👨🏻‍🦰"}, + {"", ":man medium-light skin tone, red hair:", "👨🏼‍🦰"}, + {"", ":man medium skin tone, red hair:", "👨🏽‍🦰"}, + {"", ":man medium-dark skin tone, red hair:", "👨🏾‍🦰"}, + {"", ":man dark skin tone, red hair:", "👨🏿‍🦰"}, + {"", ":man light skin tone, curly hair:", "👨🏻‍🦱"}, + {"", ":man medium-light skin tone, curly hair:", "👨🏼‍🦱"}, + {"", ":man medium skin tone, curly hair:", "👨🏽‍🦱"}, + {"", ":man medium-dark skin tone, curly hair:", "👨🏾‍🦱"}, + {"", ":man dark skin tone, curly hair:", "👨🏿‍🦱"}, + {"", ":man light skin tone, white hair:", "👨🏻‍🦳"}, + {"", ":man medium-light skin tone, white hair:", "👨🏼‍🦳"}, + {"", ":man medium skin tone, white hair:", "👨🏽‍🦳"}, + {"", ":man medium-dark skin tone, white hair:", "👨🏾‍🦳"}, + {"", ":man dark skin tone, white hair:", "👨🏿‍🦳"}, + {"", ":man light skin tone, bald:", "👨🏻‍🦲"}, + {"", ":man medium-light skin tone, bald:", "👨🏼‍🦲"}, + {"", ":man medium skin tone, bald:", "👨🏽‍🦲"}, + {"", ":man medium-dark skin tone, bald:", "👨🏾‍🦲"}, + {"", ":man dark skin tone, bald:", "👨🏿‍🦲"}, + {"", ":man light skin tone, beard:", "🧔🏻"}, + {"", ":man medium-light skin tone, beard:", "🧔🏼"}, + {"", ":man medium skin tone, beard:", "🧔🏽"}, + {"", ":man medium-dark skin tone, beard:", "🧔🏾"}, + {"", ":man dark skin tone, beard:", "🧔🏿"}, + {"", ":woman light skin tone:", "👩🏻"}, + {"", ":woman medium-light skin tone:", "👩🏼"}, + {"", ":woman medium skin tone:", "👩🏽"}, + {"", ":woman medium-dark skin tone:", "👩🏾"}, + {"", ":woman dark skin tone:", "👩🏿"}, + {"", ":woman light skin tone, blond hair:", "👱🏻‍♀️"}, + {"", ":woman medium-light skin tone, blond hair:", "👱🏼‍♀️"}, + {"", ":woman medium skin tone, blond hair:", "👱🏽‍♀️"}, + {"", ":woman medium-dark skin tone, blond hair:", "👱🏾‍♀️"}, + {"", ":woman dark skin tone, blond hair:", "👱🏿‍♀️"}, + {"", ":woman light skin tone, red hair:", "👩🏻‍🦰"}, + {"", ":woman medium-light skin tone, red hair:", "👩🏼‍🦰"}, + {"", ":woman medium skin tone, red hair:", "👩🏽‍🦰"}, + {"", ":woman medium-dark skin tone, red hair:", "👩🏾‍🦰"}, + {"", ":woman dark skin tone, red hair:", "👩🏿‍🦰"}, + {"", ":woman light skin tone, curly hair:", "👩🏻‍🦱"}, + {"", ":woman medium-light skin tone, curly hair:", "👩🏼‍🦱"}, + {"", ":woman medium skin tone, curly hair:", "👩🏽‍🦱"}, + {"", ":woman medium-dark skin tone, curly hair:", "👩🏾‍🦱"}, + {"", ":woman dark skin tone, curly hair:", "👩🏿‍🦱"}, + {"", ":woman light skin tone, white hair:", "👩🏻‍🦳"}, + {"", ":woman medium-light skin tone, white hair:", "👩🏼‍🦳"}, + {"", ":woman medium skin tone, white hair:", "👩🏽‍🦳"}, + {"", ":woman medium-dark skin tone, white hair:", "👩🏾‍🦳"}, + {"", ":woman dark skin tone, white hair:", "👩🏿‍🦳"}, + {"", ":woman light skin tone, bald:", "👩🏻‍🦲"}, + {"", ":woman medium-light skin tone, bald:", "👩🏼‍🦲"}, + {"", ":woman medium skin tone, bald:", "👩🏽‍🦲"}, + {"", ":woman medium-dark skin tone, bald:", "👩🏾‍🦲"}, + {"", ":woman dark skin tone, bald:", "👩🏿‍🦲"}, + {"", ":older person light skin tone:", "🧓🏻"}, + {"", ":older person medium-light skin tone:", "🧓🏼"}, + {"", ":older person medium skin tone:", "🧓🏽"}, + {"", ":older person medium-dark skin tone:", "🧓🏾"}, + {"", ":older person dark skin tone:", "🧓🏿"}, + {"", ":old man light skin tone:", "👴🏻"}, + {"", ":old man medium-light skin tone:", "👴🏼"}, + {"", ":old man medium skin tone:", "👴🏽"}, + {"", ":old man medium-dark skin tone:", "👴🏾"}, + {"", ":old man dark skin tone:", "👴🏿"}, + {"", ":old woman light skin tone:", "👵🏻"}, + {"", ":old woman medium-light skin tone:", "👵🏼"}, + {"", ":old woman medium skin tone:", "👵🏽"}, + {"", ":old woman medium-dark skin tone:", "👵🏾"}, + {"", ":old woman dark skin tone:", "👵🏿"}, + {"", ":person frowning light skin tone:", "🙍🏻"}, + {"", ":person frowning medium-light skin tone:", "🙍🏼"}, + {"", ":person frowning medium skin tone:", "🙍🏽"}, + {"", ":person frowning medium-dark skin tone:", "🙍🏾"}, + {"", ":person frowning dark skin tone:", "🙍🏿"}, + {"", ":man frowning light skin tone:", "🙍🏻‍♂️"}, + {"", ":man frowning medium-light skin tone:", "🙍🏼‍♂️"}, + {"", ":man frowning medium skin tone:", "🙍🏽‍♂️"}, + {"", ":man frowning medium-dark skin tone:", "🙍🏾‍♂️"}, + {"", ":man frowning dark skin tone:", "🙍🏿‍♂️"}, + {"", ":woman frowning light skin tone:", "🙍🏻‍♀️"}, + {"", ":woman frowning medium-light skin tone:", "🙍🏼‍♀️"}, + {"", ":woman frowning medium skin tone:", "🙍🏽‍♀️"}, + {"", ":woman frowning medium-dark skin tone:", "🙍🏾‍♀️"}, + {"", ":woman frowning dark skin tone:", "🙍🏿‍♀️"}, + {"", ":person pouting light skin tone:", "🙎🏻"}, + {"", ":person pouting medium-light skin tone:", "🙎🏼"}, + {"", ":person pouting medium skin tone:", "🙎🏽"}, + {"", ":person pouting medium-dark skin tone:", "🙎🏾"}, + {"", ":person pouting dark skin tone:", "🙎🏿"}, + {"", ":man pouting light skin tone:", "🙎🏻‍♂️"}, + {"", ":man pouting medium-light skin tone:", "🙎🏼‍♂️"}, + {"", ":man pouting medium skin tone:", "🙎🏽‍♂️"}, + {"", ":man pouting medium-dark skin tone:", "🙎🏾‍♂️"}, + {"", ":man pouting dark skin tone:", "🙎🏿‍♂️"}, + {"", ":woman pouting light skin tone:", "🙎🏻‍♀️"}, + {"", ":woman pouting medium-light skin tone:", "🙎🏼‍♀️"}, + {"", ":woman pouting medium skin tone:", "🙎🏽‍♀️"}, + {"", ":woman pouting medium-dark skin tone:", "🙎🏾‍♀️"}, + {"", ":woman pouting dark skin tone:", "🙎🏿‍♀️"}, + {"", ":person gesturing no light skin tone:", "🙅🏻"}, + {"", ":person gesturing no medium-light skin tone:", "🙅🏼"}, + {"", ":person gesturing no medium skin tone:", "🙅🏽"}, + {"", ":person gesturing no medium-dark skin tone:", "🙅🏾"}, + {"", ":person gesturing no dark skin tone:", "🙅🏿"}, + {"", ":man gesturing no light skin tone:", "🙅🏻‍♂️"}, + {"", ":man gesturing no medium-light skin tone:", "🙅🏼‍♂️"}, + {"", ":man gesturing no medium skin tone:", "🙅🏽‍♂️"}, + {"", ":man gesturing no medium-dark skin tone:", "🙅🏾‍♂️"}, + {"", ":man gesturing no dark skin tone:", "🙅🏿‍♂️"}, + {"", ":woman gesturing no light skin tone:", "🙅🏻‍♀️"}, + {"", ":woman gesturing no medium-light skin tone:", "🙅🏼‍♀️"}, + {"", ":woman gesturing no medium skin tone:", "🙅🏽‍♀️"}, + {"", ":woman gesturing no medium-dark skin tone:", "🙅🏾‍♀️"}, + {"", ":woman gesturing no dark skin tone:", "🙅🏿‍♀️"}, + {"", ":person gesturing ok light skin tone:", "🙆🏻"}, + {"", ":person gesturing ok medium-light skin tone:", "🙆🏼"}, + {"", ":person gesturing ok medium skin tone:", "🙆🏽"}, + {"", ":person gesturing ok medium-dark skin tone:", "🙆🏾"}, + {"", ":person gesturing ok dark skin tone:", "🙆🏿"}, + {"", ":man gesturing ok light skin tone:", "🙆🏻‍♂️"}, + {"", ":man gesturing ok medium-light skin tone:", "🙆🏼‍♂️"}, + {"", ":man gesturing ok medium skin tone:", "🙆🏽‍♂️"}, + {"", ":man gesturing ok medium-dark skin tone:", "🙆🏾‍♂️"}, + {"", ":man gesturing ok dark skin tone:", "🙆🏿‍♂️"}, + {"", ":woman gesturing ok light skin tone:", "🙆🏻‍♀️"}, + {"", ":woman gesturing ok medium-light skin tone:", "🙆🏼‍♀️"}, + {"", ":woman gesturing ok medium skin tone:", "🙆🏽‍♀️"}, + {"", ":woman gesturing ok medium-dark skin tone:", "🙆🏾‍♀️"}, + {"", ":woman gesturing ok dark skin tone:", "🙆🏿‍♀️"}, + {"", ":person tipping hand light skin tone:", "💁🏻"}, + {"", ":person tipping hand medium-light skin tone:", "💁🏼"}, + {"", ":person tipping hand medium skin tone:", "💁🏽"}, + {"", ":person tipping hand medium-dark skin tone:", "💁🏾"}, + {"", ":person tipping hand dark skin tone:", "💁🏿"}, + {"", ":man tipping hand light skin tone:", "💁🏻‍♂️"}, + {"", ":man tipping hand medium-light skin tone:", "💁🏼‍♂️"}, + {"", ":man tipping hand medium skin tone:", "💁🏽‍♂️"}, + {"", ":man tipping hand medium-dark skin tone:", "💁🏾‍♂️"}, + {"", ":man tipping hand dark skin tone:", "💁🏿‍♂️"}, + {"", ":woman tipping hand light skin tone:", "💁🏻‍♀️"}, + {"", ":woman tipping hand medium-light skin tone:", "💁🏼‍♀️"}, + {"", ":woman tipping hand medium skin tone:", "💁🏽‍♀️"}, + {"", ":woman tipping hand medium-dark skin tone:", "💁🏾‍♀️"}, + {"", ":woman tipping hand dark skin tone:", "💁🏿‍♀️"}, + {"", ":person raising hand light skin tone:", "🙋🏻"}, + {"", ":person raising hand medium-light skin tone:", "🙋🏼"}, + {"", ":person raising hand medium skin tone:", "🙋🏽"}, + {"", ":person raising hand medium-dark skin tone:", "🙋🏾"}, + {"", ":person raising hand dark skin tone:", "🙋🏿"}, + {"", ":man raising hand light skin tone:", "🙋🏻‍♂️"}, + {"", ":man raising hand medium-light skin tone:", "🙋🏼‍♂️"}, + {"", ":man raising hand medium skin tone:", "🙋🏽‍♂️"}, + {"", ":man raising hand medium-dark skin tone:", "🙋🏾‍♂️"}, + {"", ":man raising hand dark skin tone:", "🙋🏿‍♂️"}, + {"", ":woman raising hand light skin tone:", "🙋🏻‍♀️"}, + {"", ":woman raising hand medium-light skin tone:", "🙋🏼‍♀️"}, + {"", ":woman raising hand medium skin tone:", "🙋🏽‍♀️"}, + {"", ":woman raising hand medium-dark skin tone:", "🙋🏾‍♀️"}, + {"", ":woman raising hand dark skin tone:", "🙋🏿‍♀️"}, + {"", ":person bowing light skin tone:", "🙇🏻"}, + {"", ":person bowing medium-light skin tone:", "🙇🏼"}, + {"", ":person bowing medium skin tone:", "🙇🏽"}, + {"", ":person bowing medium-dark skin tone:", "🙇🏾"}, + {"", ":person bowing dark skin tone:", "🙇🏿"}, + {"", ":man bowing light skin tone:", "🙇🏻‍♂️"}, + {"", ":man bowing medium-light skin tone:", "🙇🏼‍♂️"}, + {"", ":man bowing medium skin tone:", "🙇🏽‍♂️"}, + {"", ":man bowing medium-dark skin tone:", "🙇🏾‍♂️"}, + {"", ":man bowing dark skin tone:", "🙇🏿‍♂️"}, + {"", ":woman bowing light skin tone:", "🙇🏻‍♀️"}, + {"", ":woman bowing medium-light skin tone:", "🙇🏼‍♀️"}, + {"", ":woman bowing medium skin tone:", "🙇🏽‍♀️"}, + {"", ":woman bowing medium-dark skin tone:", "🙇🏾‍♀️"}, + {"", ":woman bowing dark skin tone:", "🙇🏿‍♀️"}, + {"", ":person facepalming light skin tone:", "🤦🏻"}, + {"", ":person facepalming medium-light skin tone:", "🤦🏼"}, + {"", ":person facepalming medium skin tone:", "🤦🏽"}, + {"", ":person facepalming medium-dark skin tone:", "🤦🏾"}, + {"", ":person facepalming dark skin tone:", "🤦🏿"}, + {"", ":man facepalming light skin tone:", "🤦🏻‍♂️"}, + {"", ":man facepalming medium-light skin tone:", "🤦🏼‍♂️"}, + {"", ":man facepalming medium skin tone:", "🤦🏽‍♂️"}, + {"", ":man facepalming medium-dark skin tone:", "🤦🏾‍♂️"}, + {"", ":man facepalming dark skin tone:", "🤦🏿‍♂️"}, + {"", ":woman facepalming light skin tone:", "🤦🏻‍♀️"}, + {"", ":woman facepalming medium-light skin tone:", "🤦🏼‍♀️"}, + {"", ":woman facepalming medium skin tone:", "🤦🏽‍♀️"}, + {"", ":woman facepalming medium-dark skin tone:", "🤦🏾‍♀️"}, + {"", ":woman facepalming dark skin tone:", "🤦🏿‍♀️"}, + {"", ":person shrugging light skin tone:", "🤷🏻"}, + {"", ":person shrugging medium-light skin tone:", "🤷🏼"}, + {"", ":person shrugging medium skin tone:", "🤷🏽"}, + {"", ":person shrugging medium-dark skin tone:", "🤷🏾"}, + {"", ":person shrugging dark skin tone:", "🤷🏿"}, + {"", ":man shrugging light skin tone:", "🤷🏻‍♂️"}, + {"", ":man shrugging medium-light skin tone:", "🤷🏼‍♂️"}, + {"", ":man shrugging medium skin tone:", "🤷🏽‍♂️"}, + {"", ":man shrugging medium-dark skin tone:", "🤷🏾‍♂️"}, + {"", ":man shrugging dark skin tone:", "🤷🏿‍♂️"}, + {"", ":woman shrugging light skin tone:", "🤷🏻‍♀️"}, + {"", ":woman shrugging medium-light skin tone:", "🤷🏼‍♀️"}, + {"", ":woman shrugging medium skin tone:", "🤷🏽‍♀️"}, + {"", ":woman shrugging medium-dark skin tone:", "🤷🏾‍♀️"}, + {"", ":woman shrugging dark skin tone:", "🤷🏿‍♀️"}, + {"", ":man health worker light skin tone:", "👨🏻‍⚕️"}, + {"", ":man health worker medium-light skin tone:", "👨🏼‍⚕️"}, + {"", ":man health worker medium skin tone:", "👨🏽‍⚕️"}, + {"", ":man health worker medium-dark skin tone:", "👨🏾‍⚕️"}, + {"", ":man health worker dark skin tone:", "👨🏿‍⚕️"}, + {"", ":woman health worker light skin tone:", "👩🏻‍⚕️"}, + {"", ":woman health worker medium-light skin tone:", "👩🏼‍⚕️"}, + {"", ":woman health worker medium skin tone:", "👩🏽‍⚕️"}, + {"", ":woman health worker medium-dark skin tone:", "👩🏾‍⚕️"}, + {"", ":woman health worker dark skin tone:", "👩🏿‍⚕️"}, + {"", ":man student light skin tone:", "👨🏻‍🎓"}, + {"", ":man student medium-light skin tone:", "👨🏼‍🎓"}, + {"", ":man student medium skin tone:", "👨🏽‍🎓"}, + {"", ":man student medium-dark skin tone:", "👨🏾‍🎓"}, + {"", ":man student dark skin tone:", "👨🏿‍🎓"}, + {"", ":woman student light skin tone:", "👩🏻‍🎓"}, + {"", ":woman student medium-light skin tone:", "👩🏼‍🎓"}, + {"", ":woman student medium skin tone:", "👩🏽‍🎓"}, + {"", ":woman student medium-dark skin tone:", "👩🏾‍🎓"}, + {"", ":woman student dark skin tone:", "👩🏿‍🎓"}, + {"", ":man teacher light skin tone:", "👨🏻‍🏫"}, + {"", ":man teacher medium-light skin tone:", "👨🏼‍🏫"}, + {"", ":man teacher medium skin tone:", "👨🏽‍🏫"}, + {"", ":man teacher medium-dark skin tone:", "👨🏾‍🏫"}, + {"", ":man teacher dark skin tone:", "👨🏿‍🏫"}, + {"", ":woman teacher light skin tone:", "👩🏻‍🏫"}, + {"", ":woman teacher medium-light skin tone:", "👩🏼‍🏫"}, + {"", ":woman teacher medium skin tone:", "👩🏽‍🏫"}, + {"", ":woman teacher medium-dark skin tone:", "👩🏾‍🏫"}, + {"", ":woman teacher dark skin tone:", "👩🏿‍🏫"}, + {"", ":man judge light skin tone:", "👨🏻‍⚖️"}, + {"", ":man judge medium-light skin tone:", "👨🏼‍⚖️"}, + {"", ":man judge medium skin tone:", "👨🏽‍⚖️"}, + {"", ":man judge medium-dark skin tone:", "👨🏾‍⚖️"}, + {"", ":man judge dark skin tone:", "👨🏿‍⚖️"}, + {"", ":woman judge light skin tone:", "👩🏻‍⚖️"}, + {"", ":woman judge medium-light skin tone:", "👩🏼‍⚖️"}, + {"", ":woman judge medium skin tone:", "👩🏽‍⚖️"}, + {"", ":woman judge medium-dark skin tone:", "👩🏾‍⚖️"}, + {"", ":woman judge dark skin tone:", "👩🏿‍⚖️"}, + {"", ":man farmer light skin tone:", "👨🏻‍🌾"}, + {"", ":man farmer medium-light skin tone:", "👨🏼‍🌾"}, + {"", ":man farmer medium skin tone:", "👨🏽‍🌾"}, + {"", ":man farmer medium-dark skin tone:", "👨🏾‍🌾"}, + {"", ":man farmer dark skin tone:", "👨🏿‍🌾"}, + {"", ":woman farmer light skin tone:", "👩🏻‍🌾"}, + {"", ":woman farmer medium-light skin tone:", "👩🏼‍🌾"}, + {"", ":woman farmer medium skin tone:", "👩🏽‍🌾"}, + {"", ":woman farmer medium-dark skin tone:", "👩🏾‍🌾"}, + {"", ":woman farmer dark skin tone:", "👩🏿‍🌾"}, + {"", ":man cook light skin tone:", "👨🏻‍🍳"}, + {"", ":man cook medium-light skin tone:", "👨🏼‍🍳"}, + {"", ":man cook medium skin tone:", "👨🏽‍🍳"}, + {"", ":man cook medium-dark skin tone:", "👨🏾‍🍳"}, + {"", ":man cook dark skin tone:", "👨🏿‍🍳"}, + {"", ":woman cook light skin tone:", "👩🏻‍🍳"}, + {"", ":woman cook medium-light skin tone:", "👩🏼‍🍳"}, + {"", ":woman cook medium skin tone:", "👩🏽‍🍳"}, + {"", ":woman cook medium-dark skin tone:", "👩🏾‍🍳"}, + {"", ":woman cook dark skin tone:", "👩🏿‍🍳"}, + {"", ":man mechanic light skin tone:", "👨🏻‍🔧"}, + {"", ":man mechanic medium-light skin tone:", "👨🏼‍🔧"}, + {"", ":man mechanic medium skin tone:", "👨🏽‍🔧"}, + {"", ":man mechanic medium-dark skin tone:", "👨🏾‍🔧"}, + {"", ":man mechanic dark skin tone:", "👨🏿‍🔧"}, + {"", ":woman mechanic light skin tone:", "👩🏻‍🔧"}, + {"", ":woman mechanic medium-light skin tone:", "👩🏼‍🔧"}, + {"", ":woman mechanic medium skin tone:", "👩🏽‍🔧"}, + {"", ":woman mechanic medium-dark skin tone:", "👩🏾‍🔧"}, + {"", ":woman mechanic dark skin tone:", "👩🏿‍🔧"}, + {"", ":man factory worker light skin tone:", "👨🏻‍🏭"}, + {"", ":man factory worker medium-light skin tone:", "👨🏼‍🏭"}, + {"", ":man factory worker medium skin tone:", "👨🏽‍🏭"}, + {"", ":man factory worker medium-dark skin tone:", "👨🏾‍🏭"}, + {"", ":man factory worker dark skin tone:", "👨🏿‍🏭"}, + {"", ":woman factory worker light skin tone:", "👩🏻‍🏭"}, + {"", ":woman factory worker medium-light skin tone:", "👩🏼‍🏭"}, + {"", ":woman factory worker medium skin tone:", "👩🏽‍🏭"}, + {"", ":woman factory worker medium-dark skin tone:", "👩🏾‍🏭"}, + {"", ":woman factory worker dark skin tone:", "👩🏿‍🏭"}, + {"", ":man office worker light skin tone:", "👨🏻‍💼"}, + {"", ":man office worker medium-light skin tone:", "👨🏼‍💼"}, + {"", ":man office worker medium skin tone:", "👨🏽‍💼"}, + {"", ":man office worker medium-dark skin tone:", "👨🏾‍💼"}, + {"", ":man office worker dark skin tone:", "👨🏿‍💼"}, + {"", ":woman office worker light skin tone:", "👩🏻‍💼"}, + {"", ":woman office worker medium-light skin tone:", "👩🏼‍💼"}, + {"", ":woman office worker medium skin tone:", "👩🏽‍💼"}, + {"", ":woman office worker medium-dark skin tone:", "👩🏾‍💼"}, + {"", ":woman office worker dark skin tone:", "👩🏿‍💼"}, + {"", ":man scientist light skin tone:", "👨🏻‍🔬"}, + {"", ":man scientist medium-light skin tone:", "👨🏼‍🔬"}, + {"", ":man scientist medium skin tone:", "👨🏽‍🔬"}, + {"", ":man scientist medium-dark skin tone:", "👨🏾‍🔬"}, + {"", ":man scientist dark skin tone:", "👨🏿‍🔬"}, + {"", ":woman scientist light skin tone:", "👩🏻‍🔬"}, + {"", ":woman scientist medium-light skin tone:", "👩🏼‍🔬"}, + {"", ":woman scientist medium skin tone:", "👩🏽‍🔬"}, + {"", ":woman scientist medium-dark skin tone:", "👩🏾‍🔬"}, + {"", ":woman scientist dark skin tone:", "👩🏿‍🔬"}, + {"", ":man technologist light skin tone:", "👨🏻‍💻"}, + {"", ":man technologist medium-light skin tone:", "👨🏼‍💻"}, + {"", ":man technologist medium skin tone:", "👨🏽‍💻"}, + {"", ":man technologist medium-dark skin tone:", "👨🏾‍💻"}, + {"", ":man technologist dark skin tone:", "👨🏿‍💻"}, + {"", ":woman technologist light skin tone:", "👩🏻‍💻"}, + {"", ":woman technologist medium-light skin tone:", "👩🏼‍💻"}, + {"", ":woman technologist medium skin tone:", "👩🏽‍💻"}, + {"", ":woman technologist medium-dark skin tone:", "👩🏾‍💻"}, + {"", ":woman technologist dark skin tone:", "👩🏿‍💻"}, + {"", ":man singer light skin tone:", "👨🏻‍🎤"}, + {"", ":man singer medium-light skin tone:", "👨🏼‍🎤"}, + {"", ":man singer medium skin tone:", "👨🏽‍🎤"}, + {"", ":man singer medium-dark skin tone:", "👨🏾‍🎤"}, + {"", ":man singer dark skin tone:", "👨🏿‍🎤"}, + {"", ":woman singer light skin tone:", "👩🏻‍🎤"}, + {"", ":woman singer medium-light skin tone:", "👩🏼‍🎤"}, + {"", ":woman singer medium skin tone:", "👩🏽‍🎤"}, + {"", ":woman singer medium-dark skin tone:", "👩🏾‍🎤"}, + {"", ":woman singer dark skin tone:", "👩🏿‍🎤"}, + {"", ":man artist light skin tone:", "👨🏻‍🎨"}, + {"", ":man artist medium-light skin tone:", "👨🏼‍🎨"}, + {"", ":man artist medium skin tone:", "👨🏽‍🎨"}, + {"", ":man artist medium-dark skin tone:", "👨🏾‍🎨"}, + {"", ":man artist dark skin tone:", "👨🏿‍🎨"}, + {"", ":woman artist light skin tone:", "👩🏻‍🎨"}, + {"", ":woman artist medium-light skin tone:", "👩🏼‍🎨"}, + {"", ":woman artist medium skin tone:", "👩🏽‍🎨"}, + {"", ":woman artist medium-dark skin tone:", "👩🏾‍🎨"}, + {"", ":woman artist dark skin tone:", "👩🏿‍🎨"}, + {"", ":man pilot light skin tone:", "👨🏻‍✈️"}, + {"", ":man pilot medium-light skin tone:", "👨🏼‍✈️"}, + {"", ":man pilot medium skin tone:", "👨🏽‍✈️"}, + {"", ":man pilot medium-dark skin tone:", "👨🏾‍✈️"}, + {"", ":man pilot dark skin tone:", "👨🏿‍✈️"}, + {"", ":woman pilot light skin tone:", "👩🏻‍✈️"}, + {"", ":woman pilot medium-light skin tone:", "👩🏼‍✈️"}, + {"", ":woman pilot medium skin tone:", "👩🏽‍✈️"}, + {"", ":woman pilot medium-dark skin tone:", "👩🏾‍✈️"}, + {"", ":woman pilot dark skin tone:", "👩🏿‍✈️"}, + {"", ":man astronaut light skin tone:", "👨🏻‍🚀"}, + {"", ":man astronaut medium-light skin tone:", "👨🏼‍🚀"}, + {"", ":man astronaut medium skin tone:", "👨🏽‍🚀"}, + {"", ":man astronaut medium-dark skin tone:", "👨🏾‍🚀"}, + {"", ":man astronaut dark skin tone:", "👨🏿‍🚀"}, + {"", ":woman astronaut light skin tone:", "👩🏻‍🚀"}, + {"", ":woman astronaut medium-light skin tone:", "👩🏼‍🚀"}, + {"", ":woman astronaut medium skin tone:", "👩🏽‍🚀"}, + {"", ":woman astronaut medium-dark skin tone:", "👩🏾‍🚀"}, + {"", ":woman astronaut dark skin tone:", "👩🏿‍🚀"}, + {"", ":man firefighter light skin tone:", "👨🏻‍🚒"}, + {"", ":man firefighter medium-light skin tone:", "👨🏼‍🚒"}, + {"", ":man firefighter medium skin tone:", "👨🏽‍🚒"}, + {"", ":man firefighter medium-dark skin tone:", "👨🏾‍🚒"}, + {"", ":man firefighter dark skin tone:", "👨🏿‍🚒"}, + {"", ":woman firefighter light skin tone:", "👩🏻‍🚒"}, + {"", ":woman firefighter medium-light skin tone:", "👩🏼‍🚒"}, + {"", ":woman firefighter medium skin tone:", "👩🏽‍🚒"}, + {"", ":woman firefighter medium-dark skin tone:", "👩🏾‍🚒"}, + {"", ":woman firefighter dark skin tone:", "👩🏿‍🚒"}, + {"", ":police officer light skin tone:", "👮🏻"}, + {"", ":police officer medium-light skin tone:", "👮🏼"}, + {"", ":police officer medium skin tone:", "👮🏽"}, + {"", ":police officer medium-dark skin tone:", "👮🏾"}, + {"", ":police officer dark skin tone:", "👮🏿"}, + {"", ":man police officer light skin tone:", "👮🏻‍♂️"}, + {"", ":man police officer medium-light skin tone:", "👮🏼‍♂️"}, + {"", ":man police officer medium skin tone:", "👮🏽‍♂️"}, + {"", ":man police officer medium-dark skin tone:", "👮🏾‍♂️"}, + {"", ":man police officer dark skin tone:", "👮🏿‍♂️"}, + {"", ":woman police officer light skin tone:", "👮🏻‍♀️"}, + {"", ":woman police officer medium-light skin tone:", "👮🏼‍♀️"}, + {"", ":woman police officer medium skin tone:", "👮🏽‍♀️"}, + {"", ":woman police officer medium-dark skin tone:", "👮🏾‍♀️"}, + {"", ":woman police officer dark skin tone:", "👮🏿‍♀️"}, + {"", ":detective light skin tone:", "🕵🏻"}, + {"", ":detective medium-light skin tone:", "🕵🏼"}, + {"", ":detective medium skin tone:", "🕵🏽"}, + {"", ":detective medium-dark skin tone:", "🕵🏾"}, + {"", ":detective dark skin tone:", "🕵🏿"}, + {"", ":man detective light skin tone:", "🕵🏻‍♂️"}, + {"", ":man detective medium-light skin tone:", "🕵🏼‍♂️"}, + {"", ":man detective medium skin tone:", "🕵🏽‍♂️"}, + {"", ":man detective medium-dark skin tone:", "🕵🏾‍♂️"}, + {"", ":man detective dark skin tone:", "🕵🏿‍♂️"}, + {"", ":woman detective light skin tone:", "🕵🏻‍♀️"}, + {"", ":woman detective medium-light skin tone:", "🕵🏼‍♀️"}, + {"", ":woman detective medium skin tone:", "🕵🏽‍♀️"}, + {"", ":woman detective medium-dark skin tone:", "🕵🏾‍♀️"}, + {"", ":woman detective dark skin tone:", "🕵🏿‍♀️"}, + {"", ":guard light skin tone:", "💂🏻"}, + {"", ":guard medium-light skin tone:", "💂🏼"}, + {"", ":guard medium skin tone:", "💂🏽"}, + {"", ":guard medium-dark skin tone:", "💂🏾"}, + {"", ":guard dark skin tone:", "💂🏿"}, + {"", ":man guard light skin tone:", "💂🏻‍♂️"}, + {"", ":man guard medium-light skin tone:", "💂🏼‍♂️"}, + {"", ":man guard medium skin tone:", "💂🏽‍♂️"}, + {"", ":man guard medium-dark skin tone:", "💂🏾‍♂️"}, + {"", ":man guard dark skin tone:", "💂🏿‍♂️"}, + {"", ":woman guard light skin tone:", "💂🏻‍♀️"}, + {"", ":woman guard medium-light skin tone:", "💂🏼‍♀️"}, + {"", ":woman guard medium skin tone:", "💂🏽‍♀️"}, + {"", ":woman guard medium-dark skin tone:", "💂🏾‍♀️"}, + {"", ":woman guard dark skin tone:", "💂🏿‍♀️"}, + {"", ":construction worker light skin tone:", "👷🏻"}, + {"", ":construction worker medium-light skin tone:", "👷🏼"}, + {"", ":construction worker medium skin tone:", "👷🏽"}, + {"", ":construction worker medium-dark skin tone:", "👷🏾"}, + {"", ":construction worker dark skin tone:", "👷🏿"}, + {"", ":man construction worker light skin tone:", "👷🏻‍♂️"}, + {"", ":man construction worker medium-light skin tone:", "👷🏼‍♂️"}, + {"", ":man construction worker medium skin tone:", "👷🏽‍♂️"}, + {"", ":man construction worker medium-dark skin tone:", "👷🏾‍♂️"}, + {"", ":man construction worker dark skin tone:", "👷🏿‍♂️"}, + {"", ":woman construction worker light skin tone:", "👷🏻‍♀️"}, + {"", ":woman construction worker medium-light skin tone:", "👷🏼‍♀️"}, + {"", ":woman construction worker medium skin tone:", "👷🏽‍♀️"}, + {"", ":woman construction worker medium-dark skin tone:", "👷🏾‍♀️"}, + {"", ":woman construction worker dark skin tone:", "👷🏿‍♀️"}, + {"", ":prince light skin tone:", "🤴🏻"}, + {"", ":prince medium-light skin tone:", "🤴🏼"}, + {"", ":prince medium skin tone:", "🤴🏽"}, + {"", ":prince medium-dark skin tone:", "🤴🏾"}, + {"", ":prince dark skin tone:", "🤴🏿"}, + {"", ":princess light skin tone:", "👸🏻"}, + {"", ":princess medium-light skin tone:", "👸🏼"}, + {"", ":princess medium skin tone:", "👸🏽"}, + {"", ":princess medium-dark skin tone:", "👸🏾"}, + {"", ":princess dark skin tone:", "👸🏿"}, + {"", ":person wearing turban light skin tone:", "👳🏻"}, + {"", ":person wearing turban medium-light skin tone:", "👳🏼"}, + {"", ":person wearing turban medium skin tone:", "👳🏽"}, + {"", ":person wearing turban medium-dark skin tone:", "👳🏾"}, + {"", ":person wearing turban dark skin tone:", "👳🏿"}, + {"", ":man wearing turban light skin tone:", "👳🏻‍♂️"}, + {"", ":man wearing turban medium-light skin tone:", "👳🏼‍♂️"}, + {"", ":man wearing turban medium skin tone:", "👳🏽‍♂️"}, + {"", ":man wearing turban medium-dark skin tone:", "👳🏾‍♂️"}, + {"", ":man wearing turban dark skin tone:", "👳🏿‍♂️"}, + {"", ":woman wearing turban light skin tone:", "👳🏻‍♀️"}, + {"", ":woman wearing turban medium-light skin tone:", "👳🏼‍♀️"}, + {"", ":woman wearing turban medium skin tone:", "👳🏽‍♀️"}, + {"", ":woman wearing turban medium-dark skin tone:", "👳🏾‍♀️"}, + {"", ":woman wearing turban dark skin tone:", "👳🏿‍♀️"}, + {"", ":man with chinese cap light skin tone:", "👲🏻"}, + {"", ":man with chinese cap medium-light skin tone:", "👲🏼"}, + {"", ":man with chinese cap medium skin tone:", "👲🏽"}, + {"", ":man with chinese cap medium-dark skin tone:", "👲🏾"}, + {"", ":man with chinese cap dark skin tone:", "👲🏿"}, + {"", ":woman with headscarf light skin tone:", "🧕🏻"}, + {"", ":woman with headscarf medium-light skin tone:", "🧕🏼"}, + {"", ":woman with headscarf medium skin tone:", "🧕🏽"}, + {"", ":woman with headscarf medium-dark skin tone:", "🧕🏾"}, + {"", ":woman with headscarf dark skin tone:", "🧕🏿"}, + {"", ":man in tuxedo light skin tone:", "🤵🏻"}, + {"", ":man in tuxedo medium-light skin tone:", "🤵🏼"}, + {"", ":man in tuxedo medium skin tone:", "🤵🏽"}, + {"", ":man in tuxedo medium-dark skin tone:", "🤵🏾"}, + {"", ":man in tuxedo dark skin tone:", "🤵🏿"}, + {"", ":bride with veil light skin tone:", "👰🏻"}, + {"", ":bride with veil medium-light skin tone:", "👰🏼"}, + {"", ":bride with veil medium skin tone:", "👰🏽"}, + {"", ":bride with veil medium-dark skin tone:", "👰🏾"}, + {"", ":bride with veil dark skin tone:", "👰🏿"}, + {"", ":pregnant woman light skin tone:", "🤰🏻"}, + {"", ":pregnant woman medium-light skin tone:", "🤰🏼"}, + {"", ":pregnant woman medium skin tone:", "🤰🏽"}, + {"", ":pregnant woman medium-dark skin tone:", "🤰🏾"}, + {"", ":pregnant woman dark skin tone:", "🤰🏿"}, + {"", ":breast-feeding light skin tone:", "🤱🏻"}, + {"", ":breast-feeding medium-light skin tone:", "🤱🏼"}, + {"", ":breast-feeding medium skin tone:", "🤱🏽"}, + {"", ":breast-feeding medium-dark skin tone:", "🤱🏾"}, + {"", ":breast-feeding dark skin tone:", "🤱🏿"}, + {"", ":baby angel light skin tone:", "👼🏻"}, + {"", ":baby angel medium-light skin tone:", "👼🏼"}, + {"", ":baby angel medium skin tone:", "👼🏽"}, + {"", ":baby angel medium-dark skin tone:", "👼🏾"}, + {"", ":baby angel dark skin tone:", "👼🏿"}, + {"", ":santa claus light skin tone:", "🎅🏻"}, + {"", ":santa claus medium-light skin tone:", "🎅🏼"}, + {"", ":santa claus medium skin tone:", "🎅🏽"}, + {"", ":santa claus medium-dark skin tone:", "🎅🏾"}, + {"", ":santa claus dark skin tone:", "🎅🏿"}, + {"", ":mrs. claus light skin tone:", "🤶🏻"}, + {"", ":mrs. claus medium-light skin tone:", "🤶🏼"}, + {"", ":mrs. claus medium skin tone:", "🤶🏽"}, + {"", ":mrs. claus medium-dark skin tone:", "🤶🏾"}, + {"", ":mrs. claus dark skin tone:", "🤶🏿"}, + {"", ":superhero light skin tone:", "🦸🏻"}, + {"", ":superhero medium-light skin tone:", "🦸🏼"}, + {"", ":superhero medium skin tone:", "🦸🏽"}, + {"", ":superhero medium-dark skin tone:", "🦸🏾"}, + {"", ":superhero dark skin tone:", "🦸🏿"}, + {"", ":man superhero light skin tone:", "🦸🏻‍♂️"}, + {"", ":man superhero medium-light skin tone:", "🦸🏼‍♂️"}, + {"", ":man superhero medium skin tone:", "🦸🏽‍♂️"}, + {"", ":man superhero medium-dark skin tone:", "🦸🏾‍♂️"}, + {"", ":man superhero dark skin tone:", "🦸🏿‍♂️"}, + {"", ":woman superhero light skin tone:", "🦸🏻‍♀️"}, + {"", ":woman superhero medium-light skin tone:", "🦸🏼‍♀️"}, + {"", ":woman superhero medium skin tone:", "🦸🏽‍♀️"}, + {"", ":woman superhero medium-dark skin tone:", "🦸🏾‍♀️"}, + {"", ":woman superhero dark skin tone:", "🦸🏿‍♀️"}, + {"", ":supervillain light skin tone:", "🦹🏻"}, + {"", ":supervillain medium-light skin tone:", "🦹🏼"}, + {"", ":supervillain medium skin tone:", "🦹🏽"}, + {"", ":supervillain medium-dark skin tone:", "🦹🏾"}, + {"", ":supervillain dark skin tone:", "🦹🏿"}, + {"", ":man supervillain light skin tone:", "🦹🏻‍♂️"}, + {"", ":man supervillain medium-light skin tone:", "🦹🏼‍♂️"}, + {"", ":man supervillain medium skin tone:", "🦹🏽‍♂️"}, + {"", ":man supervillain medium-dark skin tone:", "🦹🏾‍♂️"}, + {"", ":man supervillain dark skin tone:", "🦹🏿‍♂️"}, + {"", ":woman supervillain light skin tone:", "🦹🏻‍♀️"}, + {"", ":woman supervillain medium-light skin tone:", "🦹🏼‍♀️"}, + {"", ":woman supervillain medium skin tone:", "🦹🏽‍♀️"}, + {"", ":woman supervillain medium-dark skin tone:", "🦹🏾‍♀️"}, + {"", ":woman supervillain dark skin tone:", "🦹🏿‍♀️"}, + {"", ":mage light skin tone:", "🧙🏻"}, + {"", ":mage medium-light skin tone:", "🧙🏼"}, + {"", ":mage medium skin tone:", "🧙🏽"}, + {"", ":mage medium-dark skin tone:", "🧙🏾"}, + {"", ":mage dark skin tone:", "🧙🏿"}, + {"", ":man mage light skin tone:", "🧙🏻‍♂️"}, + {"", ":man mage medium-light skin tone:", "🧙🏼‍♂️"}, + {"", ":man mage medium skin tone:", "🧙🏽‍♂️"}, + {"", ":man mage medium-dark skin tone:", "🧙🏾‍♂️"}, + {"", ":man mage dark skin tone:", "🧙🏿‍♂️"}, + {"", ":woman mage light skin tone:", "🧙🏻‍♀️"}, + {"", ":woman mage medium-light skin tone:", "🧙🏼‍♀️"}, + {"", ":woman mage medium skin tone:", "🧙🏽‍♀️"}, + {"", ":woman mage medium-dark skin tone:", "🧙🏾‍♀️"}, + {"", ":woman mage dark skin tone:", "🧙🏿‍♀️"}, + {"", ":fairy light skin tone:", "🧚🏻"}, + {"", ":fairy medium-light skin tone:", "🧚🏼"}, + {"", ":fairy medium skin tone:", "🧚🏽"}, + {"", ":fairy medium-dark skin tone:", "🧚🏾"}, + {"", ":fairy dark skin tone:", "🧚🏿"}, + {"", ":man fairy light skin tone:", "🧚🏻‍♂️"}, + {"", ":man fairy medium-light skin tone:", "🧚🏼‍♂️"}, + {"", ":man fairy medium skin tone:", "🧚🏽‍♂️"}, + {"", ":man fairy medium-dark skin tone:", "🧚🏾‍♂️"}, + {"", ":man fairy dark skin tone:", "🧚🏿‍♂️"}, + {"", ":woman fairy light skin tone:", "🧚🏻‍♀️"}, + {"", ":woman fairy medium-light skin tone:", "🧚🏼‍♀️"}, + {"", ":woman fairy medium skin tone:", "🧚🏽‍♀️"}, + {"", ":woman fairy medium-dark skin tone:", "🧚🏾‍♀️"}, + {"", ":woman fairy dark skin tone:", "🧚🏿‍♀️"}, + {"", ":vampire light skin tone:", "🧛🏻"}, + {"", ":vampire medium-light skin tone:", "🧛🏼"}, + {"", ":vampire medium skin tone:", "🧛🏽"}, + {"", ":vampire medium-dark skin tone:", "🧛🏾"}, + {"", ":vampire dark skin tone:", "🧛🏿"}, + {"", ":man vampire light skin tone:", "🧛🏻‍♂️"}, + {"", ":man vampire medium-light skin tone:", "🧛🏼‍♂️"}, + {"", ":man vampire medium skin tone:", "🧛🏽‍♂️"}, + {"", ":man vampire medium-dark skin tone:", "🧛🏾‍♂️"}, + {"", ":man vampire dark skin tone:", "🧛🏿‍♂️"}, + {"", ":woman vampire light skin tone:", "🧛🏻‍♀️"}, + {"", ":woman vampire medium-light skin tone:", "🧛🏼‍♀️"}, + {"", ":woman vampire medium skin tone:", "🧛🏽‍♀️"}, + {"", ":woman vampire medium-dark skin tone:", "🧛🏾‍♀️"}, + {"", ":woman vampire dark skin tone:", "🧛🏿‍♀️"}, + {"", ":merperson light skin tone:", "🧜🏻"}, + {"", ":merperson medium-light skin tone:", "🧜🏼"}, + {"", ":merperson medium skin tone:", "🧜🏽"}, + {"", ":merperson medium-dark skin tone:", "🧜🏾"}, + {"", ":merperson dark skin tone:", "🧜🏿"}, + {"", ":merman light skin tone:", "🧜🏻‍♂️"}, + {"", ":merman medium-light skin tone:", "🧜🏼‍♂️"}, + {"", ":merman medium skin tone:", "🧜🏽‍♂️"}, + {"", ":merman medium-dark skin tone:", "🧜🏾‍♂️"}, + {"", ":merman dark skin tone:", "🧜🏿‍♂️"}, + {"", ":mermaid light skin tone:", "🧜🏻‍♀️"}, + {"", ":mermaid medium-light skin tone:", "🧜🏼‍♀️"}, + {"", ":mermaid medium skin tone:", "🧜🏽‍♀️"}, + {"", ":mermaid medium-dark skin tone:", "🧜🏾‍♀️"}, + {"", ":mermaid dark skin tone:", "🧜🏿‍♀️"}, + {"", ":elf light skin tone:", "🧝🏻"}, + {"", ":elf medium-light skin tone:", "🧝🏼"}, + {"", ":elf medium skin tone:", "🧝🏽"}, + {"", ":elf medium-dark skin tone:", "🧝🏾"}, + {"", ":elf dark skin tone:", "🧝🏿"}, + {"", ":man elf light skin tone:", "🧝🏻‍♂️"}, + {"", ":man elf medium-light skin tone:", "🧝🏼‍♂️"}, + {"", ":man elf medium skin tone:", "🧝🏽‍♂️"}, + {"", ":man elf medium-dark skin tone:", "🧝🏾‍♂️"}, + {"", ":man elf dark skin tone:", "🧝🏿‍♂️"}, + {"", ":woman elf light skin tone:", "🧝🏻‍♀️"}, + {"", ":woman elf medium-light skin tone:", "🧝🏼‍♀️"}, + {"", ":woman elf medium skin tone:", "🧝🏽‍♀️"}, + {"", ":woman elf medium-dark skin tone:", "🧝🏾‍♀️"}, + {"", ":woman elf dark skin tone:", "🧝🏿‍♀️"}, + {"", ":person getting massage light skin tone:", "💆🏻"}, + {"", ":person getting massage medium-light skin tone:", "💆🏼"}, + {"", ":person getting massage medium skin tone:", "💆🏽"}, + {"", ":person getting massage medium-dark skin tone:", "💆🏾"}, + {"", ":person getting massage dark skin tone:", "💆🏿"}, + {"", ":man getting massage light skin tone:", "💆🏻‍♂️"}, + {"", ":man getting massage medium-light skin tone:", "💆🏼‍♂️"}, + {"", ":man getting massage medium skin tone:", "💆🏽‍♂️"}, + {"", ":man getting massage medium-dark skin tone:", "💆🏾‍♂️"}, + {"", ":man getting massage dark skin tone:", "💆🏿‍♂️"}, + {"", ":woman getting massage light skin tone:", "💆🏻‍♀️"}, + {"", ":woman getting massage medium-light skin tone:", "💆🏼‍♀️"}, + {"", ":woman getting massage medium skin tone:", "💆🏽‍♀️"}, + {"", ":woman getting massage medium-dark skin tone:", "💆🏾‍♀️"}, + {"", ":woman getting massage dark skin tone:", "💆🏿‍♀️"}, + {"", ":person getting haircut light skin tone:", "💇🏻"}, + {"", ":person getting haircut medium-light skin tone:", "💇🏼"}, + {"", ":person getting haircut medium skin tone:", "💇🏽"}, + {"", ":person getting haircut medium-dark skin tone:", "💇🏾"}, + {"", ":person getting haircut dark skin tone:", "💇🏿"}, + {"", ":man getting haircut light skin tone:", "💇🏻‍♂️"}, + {"", ":man getting haircut medium-light skin tone:", "💇🏼‍♂️"}, + {"", ":man getting haircut medium skin tone:", "💇🏽‍♂️"}, + {"", ":man getting haircut medium-dark skin tone:", "💇🏾‍♂️"}, + {"", ":man getting haircut dark skin tone:", "💇🏿‍♂️"}, + {"", ":woman getting haircut light skin tone:", "💇🏻‍♀️"}, + {"", ":woman getting haircut medium-light skin tone:", "💇🏼‍♀️"}, + {"", ":woman getting haircut medium skin tone:", "💇🏽‍♀️"}, + {"", ":woman getting haircut medium-dark skin tone:", "💇🏾‍♀️"}, + {"", ":woman getting haircut dark skin tone:", "💇🏿‍♀️"}, + {"", ":person walking light skin tone:", "🚶🏻"}, + {"", ":person walking medium-light skin tone:", "🚶🏼"}, + {"", ":person walking medium skin tone:", "🚶🏽"}, + {"", ":person walking medium-dark skin tone:", "🚶🏾"}, + {"", ":person walking dark skin tone:", "🚶🏿"}, + {"", ":man walking light skin tone:", "🚶🏻‍♂️"}, + {"", ":man walking medium-light skin tone:", "🚶🏼‍♂️"}, + {"", ":man walking medium skin tone:", "🚶🏽‍♂️"}, + {"", ":man walking medium-dark skin tone:", "🚶🏾‍♂️"}, + {"", ":man walking dark skin tone:", "🚶🏿‍♂️"}, + {"", ":woman walking light skin tone:", "🚶🏻‍♀️"}, + {"", ":woman walking medium-light skin tone:", "🚶🏼‍♀️"}, + {"", ":woman walking medium skin tone:", "🚶🏽‍♀️"}, + {"", ":woman walking medium-dark skin tone:", "🚶🏾‍♀️"}, + {"", ":woman walking dark skin tone:", "🚶🏿‍♀️"}, + {"", ":person running light skin tone:", "🏃🏻"}, + {"", ":person running medium-light skin tone:", "🏃🏼"}, + {"", ":person running medium skin tone:", "🏃🏽"}, + {"", ":person running medium-dark skin tone:", "🏃🏾"}, + {"", ":person running dark skin tone:", "🏃🏿"}, + {"", ":man running light skin tone:", "🏃🏻‍♂️"}, + {"", ":man running medium-light skin tone:", "🏃🏼‍♂️"}, + {"", ":man running medium skin tone:", "🏃🏽‍♂️"}, + {"", ":man running medium-dark skin tone:", "🏃🏾‍♂️"}, + {"", ":man running dark skin tone:", "🏃🏿‍♂️"}, + {"", ":woman running light skin tone:", "🏃🏻‍♀️"}, + {"", ":woman running medium-light skin tone:", "🏃🏼‍♀️"}, + {"", ":woman running medium skin tone:", "🏃🏽‍♀️"}, + {"", ":woman running medium-dark skin tone:", "🏃🏾‍♀️"}, + {"", ":woman running dark skin tone:", "🏃🏿‍♀️"}, + {"", ":woman dancing light skin tone:", "💃🏻"}, + {"", ":woman dancing medium-light skin tone:", "💃🏼"}, + {"", ":woman dancing medium skin tone:", "💃🏽"}, + {"", ":woman dancing medium-dark skin tone:", "💃🏾"}, + {"", ":woman dancing dark skin tone:", "💃🏿"}, + {"", ":man dancing light skin tone:", "🕺🏻"}, + {"", ":man dancing medium-light skin tone:", "🕺🏼"}, + {"", ":man dancing medium skin tone:", "🕺🏽"}, + {"", ":man dancing medium-dark skin tone:", "🕺🏾"}, + {"", ":man dancing dark skin tone:", "🕺🏿"}, + {"", ":man in suit levitating light skin tone:", "🕴🏻"}, + {"", ":man in suit levitating medium-light skin tone:", "🕴🏼"}, + {"", ":man in suit levitating medium skin tone:", "🕴🏽"}, + {"", ":man in suit levitating medium-dark skin tone:", "🕴🏾"}, + {"", ":man in suit levitating dark skin tone:", "🕴🏿"}, + {"", ":person in steamy room light skin tone:", "🧖🏻"}, + {"", ":person in steamy room medium-light skin tone:", "🧖🏼"}, + {"", ":person in steamy room medium skin tone:", "🧖🏽"}, + {"", ":person in steamy room medium-dark skin tone:", "🧖🏾"}, + {"", ":person in steamy room dark skin tone:", "🧖🏿"}, + {"", ":man in steamy room light skin tone:", "🧖🏻‍♂️"}, + {"", ":man in steamy room medium-light skin tone:", "🧖🏼‍♂️"}, + {"", ":man in steamy room medium skin tone:", "🧖🏽‍♂️"}, + {"", ":man in steamy room medium-dark skin tone:", "🧖🏾‍♂️"}, + {"", ":man in steamy room dark skin tone:", "🧖🏿‍♂️"}, + {"", ":woman in steamy room light skin tone:", "🧖🏻‍♀️"}, + {"", ":woman in steamy room medium-light skin tone:", "🧖🏼‍♀️"}, + {"", ":woman in steamy room medium skin tone:", "🧖🏽‍♀️"}, + {"", ":woman in steamy room medium-dark skin tone:", "🧖🏾‍♀️"}, + {"", ":woman in steamy room dark skin tone:", "🧖🏿‍♀️"}, + {"", ":person climbing light skin tone:", "🧗🏻"}, + {"", ":person climbing medium-light skin tone:", "🧗🏼"}, + {"", ":person climbing medium skin tone:", "🧗🏽"}, + {"", ":person climbing medium-dark skin tone:", "🧗🏾"}, + {"", ":person climbing dark skin tone:", "🧗🏿"}, + {"", ":man climbing light skin tone:", "🧗🏻‍♂️"}, + {"", ":man climbing medium-light skin tone:", "🧗🏼‍♂️"}, + {"", ":man climbing medium skin tone:", "🧗🏽‍♂️"}, + {"", ":man climbing medium-dark skin tone:", "🧗🏾‍♂️"}, + {"", ":man climbing dark skin tone:", "🧗🏿‍♂️"}, + {"", ":woman climbing light skin tone:", "🧗🏻‍♀️"}, + {"", ":woman climbing medium-light skin tone:", "🧗🏼‍♀️"}, + {"", ":woman climbing medium skin tone:", "🧗🏽‍♀️"}, + {"", ":woman climbing medium-dark skin tone:", "🧗🏾‍♀️"}, + {"", ":woman climbing dark skin tone:", "🧗🏿‍♀️"}, + {"", ":horse racing light skin tone:", "🏇🏻"}, + {"", ":horse racing medium-light skin tone:", "🏇🏼"}, + {"", ":horse racing medium skin tone:", "🏇🏽"}, + {"", ":horse racing medium-dark skin tone:", "🏇🏾"}, + {"", ":horse racing dark skin tone:", "🏇🏿"}, + {"", ":snowboarder light skin tone:", "🏂🏻"}, + {"", ":snowboarder medium-light skin tone:", "🏂🏼"}, + {"", ":snowboarder medium skin tone:", "🏂🏽"}, + {"", ":snowboarder medium-dark skin tone:", "🏂🏾"}, + {"", ":snowboarder dark skin tone:", "🏂🏿"}, + {"", ":person golfing light skin tone:", "🏌🏻"}, + {"", ":person golfing medium-light skin tone:", "🏌🏼"}, + {"", ":person golfing medium skin tone:", "🏌🏽"}, + {"", ":person golfing medium-dark skin tone:", "🏌🏾"}, + {"", ":person golfing dark skin tone:", "🏌🏿"}, + {"", ":man golfing light skin tone:", "🏌🏻‍♂️"}, + {"", ":man golfing medium-light skin tone:", "🏌🏼‍♂️"}, + {"", ":man golfing medium skin tone:", "🏌🏽‍♂️"}, + {"", ":man golfing medium-dark skin tone:", "🏌🏾‍♂️"}, + {"", ":man golfing dark skin tone:", "🏌🏿‍♂️"}, + {"", ":woman golfing light skin tone:", "🏌🏻‍♀️"}, + {"", ":woman golfing medium-light skin tone:", "🏌🏼‍♀️"}, + {"", ":woman golfing medium skin tone:", "🏌🏽‍♀️"}, + {"", ":woman golfing medium-dark skin tone:", "🏌🏾‍♀️"}, + {"", ":woman golfing dark skin tone:", "🏌🏿‍♀️"}, + {"", ":person surfing light skin tone:", "🏄🏻"}, + {"", ":person surfing medium-light skin tone:", "🏄🏼"}, + {"", ":person surfing medium skin tone:", "🏄🏽"}, + {"", ":person surfing medium-dark skin tone:", "🏄🏾"}, + {"", ":person surfing dark skin tone:", "🏄🏿"}, + {"", ":man surfing light skin tone:", "🏄🏻‍♂️"}, + {"", ":man surfing medium-light skin tone:", "🏄🏼‍♂️"}, + {"", ":man surfing medium skin tone:", "🏄🏽‍♂️"}, + {"", ":man surfing medium-dark skin tone:", "🏄🏾‍♂️"}, + {"", ":man surfing dark skin tone:", "🏄🏿‍♂️"}, + {"", ":woman surfing light skin tone:", "🏄🏻‍♀️"}, + {"", ":woman surfing medium-light skin tone:", "🏄🏼‍♀️"}, + {"", ":woman surfing medium skin tone:", "🏄🏽‍♀️"}, + {"", ":woman surfing medium-dark skin tone:", "🏄🏾‍♀️"}, + {"", ":woman surfing dark skin tone:", "🏄🏿‍♀️"}, + {"", ":person rowing boat light skin tone:", "🚣🏻"}, + {"", ":person rowing boat medium-light skin tone:", "🚣🏼"}, + {"", ":person rowing boat medium skin tone:", "🚣🏽"}, + {"", ":person rowing boat medium-dark skin tone:", "🚣🏾"}, + {"", ":person rowing boat dark skin tone:", "🚣🏿"}, + {"", ":man rowing boat light skin tone:", "🚣🏻‍♂️"}, + {"", ":man rowing boat medium-light skin tone:", "🚣🏼‍♂️"}, + {"", ":man rowing boat medium skin tone:", "🚣🏽‍♂️"}, + {"", ":man rowing boat medium-dark skin tone:", "🚣🏾‍♂️"}, + {"", ":man rowing boat dark skin tone:", "🚣🏿‍♂️"}, + {"", ":woman rowing boat light skin tone:", "🚣🏻‍♀️"}, + {"", ":woman rowing boat medium-light skin tone:", "🚣🏼‍♀️"}, + {"", ":woman rowing boat medium skin tone:", "🚣🏽‍♀️"}, + {"", ":woman rowing boat medium-dark skin tone:", "🚣🏾‍♀️"}, + {"", ":woman rowing boat dark skin tone:", "🚣🏿‍♀️"}, + {"", ":person swimming light skin tone:", "🏊🏻"}, + {"", ":person swimming medium-light skin tone:", "🏊🏼"}, + {"", ":person swimming medium skin tone:", "🏊🏽"}, + {"", ":person swimming medium-dark skin tone:", "🏊🏾"}, + {"", ":person swimming dark skin tone:", "🏊🏿"}, + {"", ":man swimming light skin tone:", "🏊🏻‍♂️"}, + {"", ":man swimming medium-light skin tone:", "🏊🏼‍♂️"}, + {"", ":man swimming medium skin tone:", "🏊🏽‍♂️"}, + {"", ":man swimming medium-dark skin tone:", "🏊🏾‍♂️"}, + {"", ":man swimming dark skin tone:", "🏊🏿‍♂️"}, + {"", ":woman swimming light skin tone:", "🏊🏻‍♀️"}, + {"", ":woman swimming medium-light skin tone:", "🏊🏼‍♀️"}, + {"", ":woman swimming medium skin tone:", "🏊🏽‍♀️"}, + {"", ":woman swimming medium-dark skin tone:", "🏊🏾‍♀️"}, + {"", ":woman swimming dark skin tone:", "🏊🏿‍♀️"}, + {"", ":person bouncing ball light skin tone:", "⛹🏻"}, + {"", ":person bouncing ball medium-light skin tone:", "⛹🏼"}, + {"", ":person bouncing ball medium skin tone:", "⛹🏽"}, + {"", ":person bouncing ball medium-dark skin tone:", "⛹🏾"}, + {"", ":person bouncing ball dark skin tone:", "⛹🏿"}, + {"", ":man bouncing ball light skin tone:", "⛹🏻‍♂️"}, + {"", ":man bouncing ball medium-light skin tone:", "⛹🏼‍♂️"}, + {"", ":man bouncing ball medium skin tone:", "⛹🏽‍♂️"}, + {"", ":man bouncing ball medium-dark skin tone:", "⛹🏾‍♂️"}, + {"", ":man bouncing ball dark skin tone:", "⛹🏿‍♂️"}, + {"", ":woman bouncing ball light skin tone:", "⛹🏻‍♀️"}, + {"", ":woman bouncing ball medium-light skin tone:", "⛹🏼‍♀️"}, + {"", ":woman bouncing ball medium skin tone:", "⛹🏽‍♀️"}, + {"", ":woman bouncing ball medium-dark skin tone:", "⛹🏾‍♀️"}, + {"", ":woman bouncing ball dark skin tone:", "⛹🏿‍♀️"}, + {"", ":person lifting weights light skin tone:", "🏋🏻"}, + {"", ":person lifting weights medium-light skin tone:", "🏋🏼"}, + {"", ":person lifting weights medium skin tone:", "🏋🏽"}, + {"", ":person lifting weights medium-dark skin tone:", "🏋🏾"}, + {"", ":person lifting weights dark skin tone:", "🏋🏿"}, + {"", ":man lifting weights light skin tone:", "🏋🏻‍♂️"}, + {"", ":man lifting weights medium-light skin tone:", "🏋🏼‍♂️"}, + {"", ":man lifting weights medium skin tone:", "🏋🏽‍♂️"}, + {"", ":man lifting weights medium-dark skin tone:", "🏋🏾‍♂️"}, + {"", ":man lifting weights dark skin tone:", "🏋🏿‍♂️"}, + {"", ":woman lifting weights light skin tone:", "🏋🏻‍♀️"}, + {"", ":woman lifting weights medium-light skin tone:", "🏋🏼‍♀️"}, + {"", ":woman lifting weights medium skin tone:", "🏋🏽‍♀️"}, + {"", ":woman lifting weights medium-dark skin tone:", "🏋🏾‍♀️"}, + {"", ":woman lifting weights dark skin tone:", "🏋🏿‍♀️"}, + {"", ":person biking light skin tone:", "🚴🏻"}, + {"", ":person biking medium-light skin tone:", "🚴🏼"}, + {"", ":person biking medium skin tone:", "🚴🏽"}, + {"", ":person biking medium-dark skin tone:", "🚴🏾"}, + {"", ":person biking dark skin tone:", "🚴🏿"}, + {"", ":man biking light skin tone:", "🚴🏻‍♂️"}, + {"", ":man biking medium-light skin tone:", "🚴🏼‍♂️"}, + {"", ":man biking medium skin tone:", "🚴🏽‍♂️"}, + {"", ":man biking medium-dark skin tone:", "🚴🏾‍♂️"}, + {"", ":man biking dark skin tone:", "🚴🏿‍♂️"}, + {"", ":woman biking light skin tone:", "🚴🏻‍♀️"}, + {"", ":woman biking medium-light skin tone:", "🚴🏼‍♀️"}, + {"", ":woman biking medium skin tone:", "🚴🏽‍♀️"}, + {"", ":woman biking medium-dark skin tone:", "🚴🏾‍♀️"}, + {"", ":woman biking dark skin tone:", "🚴🏿‍♀️"}, + {"", ":person mountain biking light skin tone:", "🚵🏻"}, + {"", ":person mountain biking medium-light skin tone:", "🚵🏼"}, + {"", ":person mountain biking medium skin tone:", "🚵🏽"}, + {"", ":person mountain biking medium-dark skin tone:", "🚵🏾"}, + {"", ":person mountain biking dark skin tone:", "🚵🏿"}, + {"", ":man mountain biking light skin tone:", "🚵🏻‍♂️"}, + {"", ":man mountain biking medium-light skin tone:", "🚵🏼‍♂️"}, + {"", ":man mountain biking medium skin tone:", "🚵🏽‍♂️"}, + {"", ":man mountain biking medium-dark skin tone:", "🚵🏾‍♂️"}, + {"", ":man mountain biking dark skin tone:", "🚵🏿‍♂️"}, + {"", ":woman mountain biking light skin tone:", "🚵🏻‍♀️"}, + {"", ":woman mountain biking medium-light skin tone:", "🚵🏼‍♀️"}, + {"", ":woman mountain biking medium skin tone:", "🚵🏽‍♀️"}, + {"", ":woman mountain biking medium-dark skin tone:", "🚵🏾‍♀️"}, + {"", ":woman mountain biking dark skin tone:", "🚵🏿‍♀️"}, + {"", ":person cartwheeling light skin tone:", "🤸🏻"}, + {"", ":person cartwheeling medium-light skin tone:", "🤸🏼"}, + {"", ":person cartwheeling medium skin tone:", "🤸🏽"}, + {"", ":person cartwheeling medium-dark skin tone:", "🤸🏾"}, + {"", ":person cartwheeling dark skin tone:", "🤸🏿"}, + {"", ":man cartwheeling light skin tone:", "🤸🏻‍♂️"}, + {"", ":man cartwheeling medium-light skin tone:", "🤸🏼‍♂️"}, + {"", ":man cartwheeling medium skin tone:", "🤸🏽‍♂️"}, + {"", ":man cartwheeling medium-dark skin tone:", "🤸🏾‍♂️"}, + {"", ":man cartwheeling dark skin tone:", "🤸🏿‍♂️"}, + {"", ":woman cartwheeling light skin tone:", "🤸🏻‍♀️"}, + {"", ":woman cartwheeling medium-light skin tone:", "🤸🏼‍♀️"}, + {"", ":woman cartwheeling medium skin tone:", "🤸🏽‍♀️"}, + {"", ":woman cartwheeling medium-dark skin tone:", "🤸🏾‍♀️"}, + {"", ":woman cartwheeling dark skin tone:", "🤸🏿‍♀️"}, + {"", ":person playing water polo light skin tone:", "🤽🏻"}, + {"", ":person playing water polo medium-light skin tone:", "🤽🏼"}, + {"", ":person playing water polo medium skin tone:", "🤽🏽"}, + {"", ":person playing water polo medium-dark skin tone:", "🤽🏾"}, + {"", ":person playing water polo dark skin tone:", "🤽🏿"}, + {"", ":man playing water polo light skin tone:", "🤽🏻‍♂️"}, + {"", ":man playing water polo medium-light skin tone:", "🤽🏼‍♂️"}, + {"", ":man playing water polo medium skin tone:", "🤽🏽‍♂️"}, + {"", ":man playing water polo medium-dark skin tone:", "🤽🏾‍♂️"}, + {"", ":man playing water polo dark skin tone:", "🤽🏿‍♂️"}, + {"", ":woman playing water polo light skin tone:", "🤽🏻‍♀️"}, + {"", ":woman playing water polo medium-light skin tone:", "🤽🏼‍♀️"}, + {"", ":woman playing water polo medium skin tone:", "🤽🏽‍♀️"}, + {"", ":woman playing water polo medium-dark skin tone:", "🤽🏾‍♀️"}, + {"", ":woman playing water polo dark skin tone:", "🤽🏿‍♀️"}, + {"", ":person playing handball light skin tone:", "🤾🏻"}, + {"", ":person playing handball medium-light skin tone:", "🤾🏼"}, + {"", ":person playing handball medium skin tone:", "🤾🏽"}, + {"", ":person playing handball medium-dark skin tone:", "🤾🏾"}, + {"", ":person playing handball dark skin tone:", "🤾🏿"}, + {"", ":man playing handball light skin tone:", "🤾🏻‍♂️"}, + {"", ":man playing handball medium-light skin tone:", "🤾🏼‍♂️"}, + {"", ":man playing handball medium skin tone:", "🤾🏽‍♂️"}, + {"", ":man playing handball medium-dark skin tone:", "🤾🏾‍♂️"}, + {"", ":man playing handball dark skin tone:", "🤾🏿‍♂️"}, + {"", ":woman playing handball light skin tone:", "🤾🏻‍♀️"}, + {"", ":woman playing handball medium-light skin tone:", "🤾🏼‍♀️"}, + {"", ":woman playing handball medium skin tone:", "🤾🏽‍♀️"}, + {"", ":woman playing handball medium-dark skin tone:", "🤾🏾‍♀️"}, + {"", ":woman playing handball dark skin tone:", "🤾🏿‍♀️"}, + {"", ":person juggling light skin tone:", "🤹🏻"}, + {"", ":person juggling medium-light skin tone:", "🤹🏼"}, + {"", ":person juggling medium skin tone:", "🤹🏽"}, + {"", ":person juggling medium-dark skin tone:", "🤹🏾"}, + {"", ":person juggling dark skin tone:", "🤹🏿"}, + {"", ":man juggling light skin tone:", "🤹🏻‍♂️"}, + {"", ":man juggling medium-light skin tone:", "🤹🏼‍♂️"}, + {"", ":man juggling medium skin tone:", "🤹🏽‍♂️"}, + {"", ":man juggling medium-dark skin tone:", "🤹🏾‍♂️"}, + {"", ":man juggling dark skin tone:", "🤹🏿‍♂️"}, + {"", ":woman juggling light skin tone:", "🤹🏻‍♀️"}, + {"", ":woman juggling medium-light skin tone:", "🤹🏼‍♀️"}, + {"", ":woman juggling medium skin tone:", "🤹🏽‍♀️"}, + {"", ":woman juggling medium-dark skin tone:", "🤹🏾‍♀️"}, + {"", ":woman juggling dark skin tone:", "🤹🏿‍♀️"}, + {"", ":person in lotus position light skin tone:", "🧘🏻"}, + {"", ":person in lotus position medium-light skin tone:", "🧘🏼"}, + {"", ":person in lotus position medium skin tone:", "🧘🏽"}, + {"", ":person in lotus position medium-dark skin tone:", "🧘🏾"}, + {"", ":person in lotus position dark skin tone:", "🧘🏿"}, + {"", ":man in lotus position light skin tone:", "🧘🏻‍♂️"}, + {"", ":man in lotus position medium-light skin tone:", "🧘🏼‍♂️"}, + {"", ":man in lotus position medium skin tone:", "🧘🏽‍♂️"}, + {"", ":man in lotus position medium-dark skin tone:", "🧘🏾‍♂️"}, + {"", ":man in lotus position dark skin tone:", "🧘🏿‍♂️"}, + {"", ":woman in lotus position light skin tone:", "🧘🏻‍♀️"}, + {"", ":woman in lotus position medium-light skin tone:", "🧘🏼‍♀️"}, + {"", ":woman in lotus position medium skin tone:", "🧘🏽‍♀️"}, + {"", ":woman in lotus position medium-dark skin tone:", "🧘🏾‍♀️"}, + {"", ":woman in lotus position dark skin tone:", "🧘🏿‍♀️"}, + {"", ":person taking bath light skin tone:", "🛀🏻"}, + {"", ":person taking bath medium-light skin tone:", "🛀🏼"}, + {"", ":person taking bath medium skin tone:", "🛀🏽"}, + {"", ":person taking bath medium-dark skin tone:", "🛀🏾"}, + {"", ":person taking bath dark skin tone:", "🛀🏿"}, + {"", ":person in bed light skin tone:", "🛌🏻"}, + {"", ":person in bed medium-light skin tone:", "🛌🏼"}, + {"", ":person in bed medium skin tone:", "🛌🏽"}, + {"", ":person in bed medium-dark skin tone:", "🛌🏾"}, + {"", ":person in bed dark skin tone:", "🛌🏿"}, + {"", ":light skin tone:", "🏻"}, + {"", ":medium-light skin tone:", "🏼"}, + {"", ":medium skin tone:", "🏽"}, + {"", ":medium-dark skin tone:", "🏾"}, + {"", ":dark skin tone:", "🏿"}, +} +; + +static const int g_numEmojiEntities = (int)(sizeof(g_emojiEntities)/ sizeof(*g_emojiEntities)); + +EmojiEntityMapper *EmojiEntityMapper::s_instance = 0; + +EmojiEntityMapper::EmojiEntityMapper() +{ + m_name2symGh = new QDict<int>(1009); + m_name2symUni = new QDict<int>(1009); + m_name2symStripUni = new QDict<int>(10); + m_name2symGh->setAutoDelete(TRUE); + m_name2symUni->setAutoDelete(TRUE); + m_name2symStripUni->setAutoDelete(TRUE); + // 2 loops to be able to give precedence to the unicodeName (CLDR) + for (int i = 0; i < g_numEmojiEntities; i++) + { + if (strlen(g_emojiEntities[i].githubName)) m_name2symGh->insert(g_emojiEntities[i].githubName, new int(i+1)); + } + for (int i = 0; i < g_numEmojiEntities; i++) + { + m_name2symUni->insert(g_emojiEntities[i].unicodeName, new int(-(i+1))); + QCString strippedUnicodeName = g_emojiEntities[i].unicodeName; + // A ring -> a ring + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\x85","\xc3\xa5"); + if (strippedUnicodeName != g_emojiEntities[i].unicodeName) + { + m_name2symStripUni->insert(strippedUnicodeName, new int(-(i+1))); + } + // a ring -> a + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa5","a"); + // c cedille -> c + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa7","c"); + // o circumflex -> o + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xb4","o"); + // e acute -> e + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa9","e"); + // a tilde -> a + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xa3","a"); + // i acute -> i + strippedUnicodeName = substitute(strippedUnicodeName,"\xc3\xad","i"); + if (strippedUnicodeName != g_emojiEntities[i].unicodeName) + { + m_name2symStripUni->insert(strippedUnicodeName, new int(-(i+1))); + } + } +} + +EmojiEntityMapper::~EmojiEntityMapper() +{ + delete m_name2symGh; + delete m_name2symUni; + delete m_name2symStripUni; +} + +/** Returns the one and only instance of the Emoji entity mapper */ +EmojiEntityMapper *EmojiEntityMapper::instance() +{ + if (s_instance==0) + { + s_instance = new EmojiEntityMapper; + } + return s_instance; +} + +/** Deletes the one and only instance of the Emoji entity mapper */ +void EmojiEntityMapper::deleteInstance() +{ + delete s_instance; + s_instance=0; +} + + +/*! @brief Access routine to the UTF8 code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @param useInPrintf If TRUE the result will be escaped such that it can be + * used in a printf string pattern + * @return the UTF8 code of the Emoji entity, + * in case the UTF code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::utf8(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! @brief Access routine to the html code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @param useInPrintf If TRUE the result will be escaped such that it can be + * used in a printf string pattern + * @return the html representation of the Emoji entity, + * in case the html code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::html(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the XML code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the XML code of the Emoji entity, + * in case the XML code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::xml(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} +/*! @brief Access routine to the docbook code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the docbook code of the Emoji entity, + * in case the docbook code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::docbook(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the LaTeX code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the LaTeX code of the Emoji entity, + * in case the LaTeX code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::latex(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! @brief Access routine to the man code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the man of the Emoji entity, + * in case the man code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::man(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! @brief Access routine to the RTF code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the RTF of the Emoji entity, + * in case the RTF code is unknown \c NULL is returned. + */ +const char *EmojiEntityMapper::rtf(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the perl struct with the perl code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the pointer to perl struct with the perl code of the Emoji entity, + * in case the perl code does not exists the NULL pointer is entered in the + * \c symb field and in the `DocSymbol::Perl_unknown` in the \c type field. + */ +const char *EmojiEntityMapper::perl(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} + +/*! + * @brief Give code of the requested Emoji entity name + * @param symName Emoji entity name + * @return the code for the requested Emoji entity name, + * in case the requested Emoji item does not exist `0` is returned. + */ +int EmojiEntityMapper::name2sym(const QCString &symName) const +{ + QCString locSymName = symName.lower(); + int *pSymb = m_name2symUni->find(locSymName); + if (!pSymb) pSymb = m_name2symStripUni->find(locSymName); + if (!pSymb) pSymb = m_name2symGh->find(locSymName); + return pSymb ? (*pSymb) : 0; +} +void EmojiEntityMapper::writeEmojiFile(QFile &file) +{ + FTextStream t(&file); + + for (int i = 0; i < g_numEmojiEntities; i++) + { + t << g_emojiEntities[i].unicodeName << endl; + } + for (int i = 0; i < g_numEmojiEntities; i++) + { + if (strlen(g_emojiEntities[i].githubName)) t << g_emojiEntities[i].githubName << endl; + } +} +/*! @brief Access routine to the code of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the code of the Emoji entity, + */ +const char *EmojiEntityMapper::code(int symb) const +{ + return g_emojiEntities[abs(symb) - 1].code; +} + +/*! @brief Access routine to the text of the Emoji entity + * + * @param symb Code of the requested Emoji entity + * @return the text of the Emoji entity, + */ +const char *EmojiEntityMapper::text(int symb) const +{ + if (symb > 0) return g_emojiEntities[symb-1].githubName; + else if (symb < 0) return g_emojiEntities[abs(symb)-1].unicodeName; + else return NULL; +} +/// \file +/// to generate the content of the table with the emoji definitions and code the following procedure has been used: +/// +/// <pre> +/// wget https://api.github.com/emojis +/// wget https://www.unicode.org/emoji/charts/full-emoji-list.html +/// wget http://www.unicode.org/emoji/charts/full-emoji-modifiers.html +/// +/// grep -v "[{}]" emojis | sed -e "s/https:.*\///" | sed -e "s%.png.*%%" | sed -e "s/ //" | sed -e "s/://" | tr ' ' '\n' | tr '\042' ' ' | sed -e "s/ //g" > emojis.res +/// +/// grep -A 14 "<tr><td class='rchars'>[0-9]" full-emoji-list.html | grep -v "class='andr" | grep -v "class='[r]*chars'" | sed -e "s/<[^>]*>//g" | sed -e "s/://" | tr [A-Z] [a-z] | sed -e "s/^[^a-z][^a-z][^a-z] //" | grep -v "\-\-" | sed -e "s/&/\&/" | sed -e "s/ u+/;\&#x/g" | sed -e "s/^u+\(.*\)/\&#x\1;/" > full.res +/// grep -A 14 "<tr><td class='rchars'>[0-9]" full-emoji-modifiers.html | grep -v "class='andr" | grep -v "class='[r]*chars'" | sed -e "s/<[^>]*>//g" | sed -e "s/://" | tr [A-Z] [a-z] | sed -e "s/^[^a-z][^a-z][^a-z] //" | grep -v "\-\-" | sed -e "s/&/\&/" | sed -e "s/ u+/;\&#x/g" | sed -e "s/^u+\(.*\)/\&#x\1;/" >> full.res +/// +/// +/// python transform.py full.res emojis.res > transform.res +/// </pre> +/// where the contents of `transform.py` is: +/// \code{.py} +///import sys +/// +///# read first file (unicode names) +///# read second files (github names) +/// +///uniFile = open(sys.argv[1]) +///emoFile = open(sys.argv[2]) +/// +///uniLines = uniFile.readlines() +///emoLines = emoFile.readlines() +/// +///uniFile.close() +///emoFile.close() +/// +///uniMaxLen = 0 +///emoMaxLen = 0 +/// +///for i in range(0, len(uniLines), 2): +/// if (len(uniLines[i]) > uniMaxLen): +/// uniMaxLen = len(uniLines[i]) +/// +///for i in range(0, len(emoLines), 2): +/// if (len(emoLines[i]) > emoMaxLen): +/// emoMaxLen = len(emoLines[i]) +/// +///uniProcessed = [False]*(len(uniLines) / 2) +/// +///# replace "strange" single and double quotes. +///for i in range(0, len(uniLines), 2): +/// uniLines[i+1] = uniLines[i+1].replace("\342\200\234",'\\"').replace("\342\200\235",'\\"') +/// uniLines[i+1] = uniLines[i+1].replace("\342\200\231","'").replace("\342\200\231","'") +/// +///for i in range(0, len(emoLines), 2): +/// emoCode = emoLines[i+1].split('-') +/// found = False +/// emoCode = [e.replace('\n', '') for e in emoCode] +/// for u in range(0, len(uniLines), 2): +/// cnt = 0 +/// beg = 0 +/// for j in emoCode: +/// pos = uniLines[u].find(j, beg) +/// if pos != -1: +/// # in case of 'u+': 2, '&#x': 3 +/// if (beg == 0 and j == emoCode[0] and pos != 3): +/// break +/// cnt += 1 +/// beg = pos + 1 +/// if (cnt == len(emoCode)): +/// uniProcessed[u/2] = True +/// found = True +/// print ' {":'+emoLines[i].replace('\n','')+':",'+(emoMaxLen-len(emoLines[i].replace('\n',''))+1)*' '+'":'+uniLines[u+1].replace('\n','')+':",'+(uniMaxLen-len(uniLines[u+1].replace('\n',''))+1)*' '+'"'+uniLines[u].replace('\n','')+'"},' +/// break +/// if not found: +/// # github name but no unicode version +/// # print ' ONLY_GITHUB_NAME "'+emoLines[i].replace('\n','')+'" "'+emoLines[i+1].replace('\n','')+'"' +/// pass +/// +///for u in range(0, len(uniProcessed)): +/// if not uniProcessed[u]: +/// print ' {"",'+(emoMaxLen+1)*' '+'":'+uniLines[u*2+1].replace('\n','')+':",'+(uniMaxLen-len(uniLines[u*2+1].replace('\n',''))+1)*' '+'"'+uniLines[u*2].replace('\n','')+'"},' +/// +/// \endcode diff --git a/src/emoji.h b/src/emoji.h new file mode 100644 index 0000000..daa63e8 --- /dev/null +++ b/src/emoji.h @@ -0,0 +1,50 @@ +/****************************************************************************** + * + * Copyright (C) 1997-2015 by Dimitri van Heesch. + * + * Permission to use, copy, modify, and distribute this software and its + * documentation under the terms of the GNU General Public License is hereby + * granted. No representations are made about the suitability of this software + * for any purpose. It is provided "as is" without express or implied warranty. + * See the GNU General Public License for more details. + * + * Documents produced by Doxygen are derivative works derived from the + * input used in their production; they are not affected by this license. + * + */ +#ifndef EMOJIENTITY_H +#define EMOJIENTITY_H + +#include <qdict.h> +#include <qfile.h> + +class FTextStream; + +/** @brief Singleton helper class to map emoji entities to other formats */ +class EmojiEntityMapper +{ + public: + static EmojiEntityMapper *instance(); + static void deleteInstance(); + int name2sym(const QCString &symName) const; + const char *utf8(int symb) const; + const char *html(int symb) const; + const char *xml(int symb) const; + const char *docbook(int symb) const; + const char *latex(int symb) const; + const char *man(int symb) const; + const char *rtf(int symb) const; + const char *perl(int symb) const; + const char *code(int symb) const; + const char *text(int symb) const; + void writeEmojiFile(QFile &file); + private: + EmojiEntityMapper(); + ~EmojiEntityMapper(); + static EmojiEntityMapper *s_instance; + QDict<int> *m_name2symGh; + QDict<int> *m_name2symUni; + QDict<int> *m_name2symStripUni; +}; + +#endif diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 6e0c62d..0af5b16 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -34,6 +34,7 @@ #include "filedef.h" #include "memberdef.h" #include "htmlentity.h" +#include "emoji.h" #include "plantuml.h" static const int NUM_HTML_LIST_TYPES = 4; @@ -234,6 +235,20 @@ void HtmlDocVisitor::visit(DocSymbol *s) } } +void HtmlDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + const char *res = EmojiEntityMapper::instance()->html(s->emoji()); + if (res) + { + m_t << res; + } + else + { + err("HTML: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } +} + void HtmlDocVisitor::writeObfuscatedMailAddress(const QCString &url) { m_t << "<a href=\"#\" onclick=\"location.href='mai'+'lto:'"; diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h index 2ff9f75..7184f0f 100644 --- a/src/htmldocvisitor.h +++ b/src/htmldocvisitor.h @@ -43,6 +43,7 @@ class HtmlDocVisitor : public DocVisitor void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); diff --git a/src/htmlentity.cpp b/src/htmlentity.cpp index 3d95705..e95b817 100644 --- a/src/htmlentity.cpp +++ b/src/htmlentity.cpp @@ -314,7 +314,8 @@ static struct htmlEntityInfo { SYM(Quot), "\"", "\"", "\"", """, "\"", "\"", "\"", { "\"", DocSymbol::Perl_char }}, { SYM(Minus), "-", "-", "-", "-", "-\\/", "-", "-", { "-", DocSymbol::Perl_char }}, { SYM(Plus), "+", "+", "+", "+", "+", "+", "+", { "+", DocSymbol::Perl_char }}, - { SYM(Dot), ".", ".", ".", ".", ".", ".", ".", { ".", DocSymbol::Perl_char }} + { SYM(Dot), ".", ".", ".", ".", ".", ".", ".", { ".", DocSymbol::Perl_char }}, + { SYM(Colon), ":", ":", ":", ":", ":", ":", ":", { ":", DocSymbol::Perl_char }} }; static const int g_numHtmlEntities = (int)(sizeof(g_htmlEntities)/ sizeof(*g_htmlEntities)); diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h index 881863a..7ea8ae1 100644 --- a/src/latexdocvisitor.h +++ b/src/latexdocvisitor.h @@ -42,6 +42,7 @@ class LatexDocVisitor : public DocVisitor void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); diff --git a/src/latexgen.cpp b/src/latexgen.cpp index 50d4242..06f2baf 100644 --- a/src/latexgen.cpp +++ b/src/latexgen.cpp @@ -485,6 +485,10 @@ static void writeDefaultHeaderPart1(FTextStream &t) if (Config_getBool(LATEX_BATCHMODE)) t << "\\batchmode\n"; + // to overcome problems wit too many open files + t << "\\let\\mypdfximage\\pdfximage" + "\\def\\pdfximage{\\immediate\\mypdfximage}"; + // Set document class depending on configuration QCString documentClass; if (Config_getBool(COMPACT_LATEX)) @@ -564,6 +568,18 @@ static void writeDefaultHeaderPart1(FTextStream &t) "\\newcommand{\\+}{\\discretionary{\\mbox{\\scriptsize$\\hookleftarrow$}}{}{}}\n" "\n"; + QCString emojiDir=Config_getString(LATEX_EMOJI_DIRECTORY); + if (emojiDir.isEmpty()) emojiDir = "."; + emojiDir = substitute(emojiDir,"\\","/"); + t << "% Arguments of doxygenemoji:\n" + "% 1) ':<text>:' form of the emoji, already \"LaTeX\"-escaped\n" + "% 2) unicode of the emoji inlorm like: 'U+1F603' or 'U+0031U+FE0FU+20E3' depending on the emoji\n" + "% 3) file name in form like: '1F603' or '0031-FE0F-20E3' depending on the emoji\n" + "% in case image exist use this otherwise use the ':<text>:' form\n"; + t << "\\newcommand{\\doxygenemoji}[3]{%\n" + " \\IfFileExists{" << emojiDir << "/#3.png}{\\raisebox{-0.1em}{\\includegraphics[height=0.9em]{" << emojiDir << "/#3.png}}}{#1}%\n" + "}\n"; + // Define page & text layout QCString paperName=Config_getEnum(PAPER_TYPE); // "a4wide" package is obsolete (see bug 563698) diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index e09cc8e..8a9e6c1 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -30,6 +30,7 @@ #include "parserintf.h" #include "filedef.h" #include "htmlentity.h" +#include "emoji.h" ManDocVisitor::ManDocVisitor(FTextStream &t,CodeOutputInterface &ci, const char *langExt) @@ -89,6 +90,22 @@ void ManDocVisitor::visit(DocSymbol *s) m_firstCol=FALSE; } +void ManDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + const char *res = EmojiEntityMapper::instance()->man(s->emoji()); + if (res) + { + m_t << res; + } + else + { + // no error or warning to be supplied + // err("man: non supported HTML-entity found: &%s;\n",get_symbol_item(s->emoji())); + } + m_firstCol=FALSE; +} + void ManDocVisitor::visit(DocURL *u) { if (m_hide) return; diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h index d248c87..8efc223 100644 --- a/src/mandocvisitor.h +++ b/src/mandocvisitor.h @@ -40,6 +40,7 @@ class ManDocVisitor : public DocVisitor void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 5b4b6ea..27c2fa8 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -43,6 +43,7 @@ #include "section.h" #include "util.h" #include "htmlentity.h" +#include "emoji.h" #define PERLOUTPUT_MAX_INDENTATION 40 @@ -299,6 +300,7 @@ public: void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); @@ -609,6 +611,11 @@ void PerlModDocVisitor::visit(DocSymbol *sy) err("perl: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(sy->symbol(),TRUE)); } } +void PerlModDocVisitor::visit(DocEmoji *sy) +{ + enterText(); + m_output.add(EmojiEntityMapper::instance()->perl(sy->emoji())); +} void PerlModDocVisitor::visit(DocURL *u) { diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h index 8d9a2b9..44dd884 100644 --- a/src/printdocvisitor.h +++ b/src/printdocvisitor.h @@ -22,6 +22,7 @@ #include <qglobal.h> #include "docvisitor.h" #include "htmlentity.h" +#include "emoji.h" #include "message.h" /*! Concrete visitor implementation for pretty printing */ @@ -68,6 +69,19 @@ class PrintDocVisitor : public DocVisitor printf("print: non supported HTML-entity found: %s\n",HtmlEntityMapper::instance()->html(s->symbol(),TRUE)); } } + void visit(DocEmoji *s) + { + indent_leaf(); + const char *res = EmojiEntityMapper::instance()->utf8(s->emoji()); + if (res) + { + printf("%s",res); + } + else + { + printf("print: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } + } void visit(DocURL *u) { indent_leaf(); diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 7fbfdc8..941b937 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -34,6 +34,7 @@ #include "filedef.h" #include "config.h" #include "htmlentity.h" +#include "emoji.h" #include "plantuml.h" //#define DBG_RTF(x) m_t << x @@ -136,6 +137,48 @@ void RTFDocVisitor::visit(DocSymbol *s) m_lastIsPara=FALSE; } +void RTFDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + DBG_RTF("{\\comment RTFDocVisitor::visit(DocEmoji)}\n"); + const char *res = EmojiEntityMapper::instance()->rtf(s->emoji()); + if (res) + { + const char *p = res; + int val = 0; + int val1 = 0; + while (*p) + { + switch(*p) + { + case '&': case '#': case 'x': + break; + case ';': + val1 = val; + val = 0xd800 + ( ( val1 - 0x10000 ) & 0xffc00 ) / 0x400 - 0x10000; + m_t << "\\u" << val << "?"; + val = 0xdC00 + ( ( val1 - 0x10000 ) & 0x3ff ) - 0x10000 ; + m_t << "\\u" << val << "?"; + val = 0; + break; + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + val = val * 16 + *p - '0'; + break; + case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': + val = val * 16 + *p - 'a' + 10; + break; + } + p++; + } + } + else + { + err("RTF: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } + m_lastIsPara=FALSE; +} + void RTFDocVisitor::visit(DocURL *u) { if (m_hide) return; diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h index 1e927e7..ac78a85 100644 --- a/src/rtfdocvisitor.h +++ b/src/rtfdocvisitor.h @@ -40,6 +40,7 @@ class RTFDocVisitor : public DocVisitor void visit(DocLinkedWord *); void visit(DocWhiteSpace *); void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *); void visit(DocLineBreak *); void visit(DocHorRuler *); diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp index c899232..691e426 100644 --- a/src/textdocvisitor.cpp +++ b/src/textdocvisitor.cpp @@ -21,6 +21,7 @@ #include "message.h" #include "util.h" #include "htmlentity.h" +#include "emoji.h" //------------------------------------------------------------------------- @@ -37,6 +38,18 @@ void TextDocVisitor::visit(DocSymbol *s) } } +void TextDocVisitor::visit(DocEmoji *s) +{ + const char *res = EmojiEntityMapper::instance()->html(s->emoji()); + if (res) + { + filter(res); + } + else + { + err("text: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } +} void TextDocVisitor::filter(const char *str) { diff --git a/src/textdocvisitor.h b/src/textdocvisitor.h index 1bbc357..bbc70e8 100644 --- a/src/textdocvisitor.h +++ b/src/textdocvisitor.h @@ -40,6 +40,7 @@ class TextDocVisitor : public DocVisitor void visit(DocLinkedWord *w) { filter(w->word()); } void visit(DocWhiteSpace *) { m_t << " "; } void visit(DocSymbol *); + void visit(DocEmoji *); void visit(DocURL *u) { filter(u->url()); } void visit(DocLineBreak *) { m_t << " "; } void visit(DocHorRuler *) {} diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 525dbf5..cd72c7d 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -31,6 +31,7 @@ #include "filename.h" #include "config.h" #include "htmlentity.h" +#include "emoji.h" static void visitCaption(XmlDocVisitor *parent, QList<DocNode> children) { @@ -133,6 +134,20 @@ void XmlDocVisitor::visit(DocSymbol *s) } } +void XmlDocVisitor::visit(DocEmoji *s) +{ + if (m_hide) return; + const char *res = EmojiEntityMapper::instance()->xml(s->emoji()); + if (res) + { + m_t << res; + } + else + { + err("XML: non supported Emoji-entity found: %s\n",EmojiEntityMapper::instance()->html(s->emoji())); + } +} + void XmlDocVisitor::visit(DocURL *u) { if (m_hide) return; |