diff --git a/CMakeLists.txt b/CMakeLists.txt
index c045f0c5721b4bcd3b6e594822c89e6ad3e78e56..1540e2c828d35965cb1cf7b4bf95ae909c1fa795 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -72,7 +72,8 @@ set(COMMON_SOURCES
     ${SRC_DIR}/conversationlistmodelbase.cpp
     ${SRC_DIR}/conversationlistmodel.cpp
     ${SRC_DIR}/searchresultslistmodel.cpp
-    ${SRC_DIR}/calloverlaymodel.cpp)
+    ${SRC_DIR}/calloverlaymodel.cpp
+    ${SRC_DIR}/filestosendlistmodel.cpp)
 
 set(COMMON_HEADERS
     ${SRC_DIR}/avatarimageprovider.h
@@ -128,7 +129,8 @@ set(COMMON_HEADERS
     ${SRC_DIR}/conversationlistmodelbase.h
     ${SRC_DIR}/conversationlistmodel.h
     ${SRC_DIR}/searchresultslistmodel.h
-    ${SRC_DIR}/calloverlaymodel.h)
+    ${SRC_DIR}/calloverlaymodel.h
+    ${SRC_DIR}/filestosendlistmodel.h)
 
 set(QML_LIBS
     Qt5::Quick
diff --git a/images/icons/emoji_black-24dp.svg b/images/icons/emoji_black-24dp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..a32d5c88b9a3d21a5ab5059cecf5bb25f9d35188
--- /dev/null
+++ b/images/icons/emoji_black-24dp.svg
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g>
+	<g>
+		<path d="M12,2.1c-5.4,0-9.9,4.4-9.9,9.9s4.4,9.9,9.9,9.9s9.9-4.4,9.9-9.9S17.4,2.1,12,2.1z M12,20.7c-4.8,0-8.7-3.9-8.7-8.7
+			S7.2,3.3,12,3.3s8.7,3.9,8.7,8.7S16.8,20.7,12,20.7z"/>
+	</g>
+	<g>
+		<path d="M7.4,13.3c-0.2,0-0.4,0.1-0.5,0.2c-0.1,0.1-0.1,0.3-0.1,0.5c0,0.1,0.1,0.3,0.2,0.4c1.4,1,3.1,1.5,4.9,1.5s3.4-0.5,4.9-1.5
+			c0.1-0.1,0.2-0.2,0.3-0.4c0-0.2,0-0.3-0.1-0.4c-0.2-0.3-0.5-0.3-0.8-0.1c-1.2,0.8-2.7,1.3-4.2,1.3s-3-0.4-4.2-1.3
+			C7.7,13.3,7.5,13.3,7.4,13.3z"/>
+	</g>
+	<g>
+		<path d="M8,8.9c-0.4,0-0.8,0.3-0.8,0.8c0,0.4,0.3,0.8,0.8,0.8s0.8-0.3,0.8-0.8C8.8,9.2,8.5,8.9,8,8.9z"/>
+	</g>
+	<g>
+		<path d="M16,8.9c-0.4,0-0.8,0.4-0.8,0.8c0,0.5,0.3,0.8,0.8,0.8c0.4,0,0.8-0.3,0.8-0.8C16.8,9.2,16.4,8.9,16,8.9z"/>
+	</g>
+</g>
+</svg>
diff --git a/images/icons/file_black-24dp.svg b/images/icons/file_black-24dp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..666492ab748aed29d81d71d5bc79dbc554a28c5d
--- /dev/null
+++ b/images/icons/file_black-24dp.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<path d="M14.2,2.3C14,2.1,13.7,2,13.4,2H5.5C4.8,2,4.3,2.5,4.3,3.2v6.3v1.6v9.7c0,0.7,0.5,1.2,1.2,1.2h13.1c0.7,0,1.2-0.5,1.2-1.2
+	V18V8.4c0-0.3-0.1-0.6-0.3-0.8L14.2,2.3z M18,7.7H14c0,0,0,0,0,0V3.7L18,7.7z M18.6,20.9C18.6,20.9,18.6,20.9,18.6,20.9l-13.1,0
+	c0,0,0,0,0,0v-9.7V9.5V3.2c0,0,0,0,0,0h7.4v4.5c0,0.7,0.5,1.2,1.2,1.2h4.5v9.2V20.9z"/>
+</svg>
diff --git a/images/icons/ic_voicemail_black_24dp_2x_.png b/images/icons/ic_voicemail_black_24dp_2x_.png
deleted file mode 100644
index dfd0ea061893b6b5015bf8cd0717ce219c0842e6..0000000000000000000000000000000000000000
Binary files a/images/icons/ic_voicemail_black_24dp_2x_.png and /dev/null differ
diff --git a/images/icons/ic_voicemail_white_24dp_2x.png b/images/icons/ic_voicemail_white_24dp_2x.png
deleted file mode 100644
index 59126d7066f7b20a94c169f329275153accfbe7d..0000000000000000000000000000000000000000
Binary files a/images/icons/ic_voicemail_white_24dp_2x.png and /dev/null differ
diff --git a/images/icons/insert_drive_file-24dp.svg b/images/icons/insert_drive_file-24dp.svg
deleted file mode 100644
index 91a279fa1eb80919a21f7d016813ac43c18430a0..0000000000000000000000000000000000000000
--- a/images/icons/insert_drive_file-24dp.svg
+++ /dev/null
@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px"><path d="M0 0h24v24H0z" fill="none"/><path d="M6 2c-1.1 0-1.99.9-1.99 2L4 20c0 1.1.89 2 1.99 2H18c1.1 0 2-.9 2-2V8l-6-6H6zm7 7V3.5L18.5 9H13z"/></svg>
\ No newline at end of file
diff --git a/images/icons/link_black-24dp.svg b/images/icons/link_black-24dp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..59ba8aeb7b280925ab126982c7e248c08ba3e0c7
--- /dev/null
+++ b/images/icons/link_black-24dp.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<path d="M16,5.6c-0.4,0-0.7,0.4-0.7,0.7v11.1c0,1.8-1.5,3.3-3.3,3.3s-3.3-1.5-3.3-3.3V5.6c0-1.2,1-2.1,2.1-2.1C12,3.4,13,4.4,13,5.6
+	V16c0,0.5-0.4,0.9-0.9,0.9c-0.4,0-0.9-0.4-0.9-0.9V6.8c0-0.4-0.4-0.7-0.7-0.7c-0.4,0-0.7,0.3-0.7,0.7V16c0,1.2,1.1,2.3,2.3,2.3
+	s2.3-1.1,2.3-2.3V5.6c0-1.9-1.6-3.6-3.6-3.6S7.2,3.6,7.2,5.6v11.7c0,2.6,2.1,4.8,4.8,4.8s4.8-2.1,4.8-4.8v-11
+	C16.8,5.8,16.4,5.6,16,5.6z"/>
+</svg>
diff --git a/images/icons/message_audio-24px.svg b/images/icons/message_audio-24px.svg
deleted file mode 100644
index 934491fce030420f910b716bb299ae56f043d0f5..0000000000000000000000000000000000000000
--- a/images/icons/message_audio-24px.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <title>Message audio</title>
-    <g id="Icones_Outline" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="Message-audio" stroke="#000000">
-            <path d="M12,2.875 C14.5197992,2.875 16.8010492,3.89635041 18.4523494,5.54765062 C20.1036496,7.19895083 21.125,9.48020083 21.125,12 L21.125,12 L21.125,21.125 L12,21.125 C9.48020083,21.125 7.19895083,20.1036496 5.54765062,18.4523494 C3.89635041,16.8010492 2.875,14.5197992 2.875,12 C2.875,9.48020083 3.89635041,7.19895083 5.54765062,5.54765062 C7.19895083,3.89635041 9.48020083,2.875 12,2.875 Z" id="Rectangle-Copy-3" stroke-width="1.75"></path>
-            <g id="Group" transform="translate(9.000000, 7.000000)" fill-rule="nonzero">
-                <path d="M3.2826376,0.724537696 C3.66238148,0.724537696 4.00643194,0.87901528 4.25561937,1.12820271 C4.5048068,1.37739014 4.65928439,1.7214406 4.65928439,2.10118448 L4.65928439,2.10118448 L4.65928439,5.11026918 C4.65928439,5.49001273 4.50480658,5.83406323 4.25561904,6.08325078 C4.00643165,6.33243816 3.66238135,6.48691596 3.2826376,6.48691596 C2.90289382,6.48691596 2.55884347,6.33243814 2.30965606,6.08325074 C2.0604685,5.8340632 1.90599067,5.49001272 1.90599067,5.11026918 L1.90599067,5.11026918 L1.90599067,2.10118448 C1.90599067,1.72144061 2.06046828,1.37739017 2.30965572,1.12820274 C2.55884318,0.879015295 2.90289369,0.724537696 3.2826376,0.724537696 Z" id="Path" stroke-width="1.35"></path>
-                <path d="M0.277829768,3.46892297 C0.131747046,3.46666758 -0.00228293577,3.60069619 -2.6215198e-05,3.74677891 L-2.6215198e-05,5.1145366 C-2.6215198e-05,6.83681201 1.32262269,8.24623865 3.00908469,8.38435551 L3.00908469,9.35033921 L1.91487307,9.35033921 C1.76379391,9.35033921 1.64132017,9.47280884 1.64132017,9.62389211 C1.64132017,9.77497538 1.76379391,9.89744502 1.91487307,9.89744502 L4.65040212,9.89744502 C4.80148129,9.89744502 4.92395503,9.77497538 4.92395503,9.62389211 C4.92395503,9.47280884 4.80148129,9.35064011 4.65040212,9.35033921 L3.5561905,9.35033921 L3.5561905,8.38435551 C5.24265237,8.24623865 6.56529592,6.83681201 6.56529592,5.1145366 L6.56529592,3.74677891 C6.56731043,3.60225818 6.43625533,3.46933062 6.29171955,3.46933062 C6.14718377,3.46933062 6.01612321,3.60225818 6.01816665,3.74677891 L6.01816665,5.1145366 C6.01816665,6.63475216 4.80285179,7.85006565 3.2826376,7.85006565 C1.76242204,7.85006565 0.547108409,6.63475216 0.547108409,5.1145366 L0.547108409,3.74677891 C0.549351543,3.60354661 0.421062069,3.47118667 0.277829768,3.46892297 Z" id="Path" stroke-width="0.75" fill="#000000"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/images/icons/message_audio_black-24dp.svg b/images/icons/message_audio_black-24dp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ef42be05238965756fdb934a2d0302565fe9a21c
--- /dev/null
+++ b/images/icons/message_audio_black-24dp.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g>
+	<path d="M19.1,4.9C17.2,3,14.7,2,12,2S6.8,3,4.9,4.9S2,9.3,2,12s1,5.2,2.9,7.1S9.3,22,12,22h10V12C22,9.3,21,6.8,19.1,4.9z
+		 M20.6,20.6H12c-2.3,0-4.4-0.9-6.1-2.5c-1.6-1.6-2.5-3.8-2.5-6.1s0.9-4.4,2.5-6.1C7.6,4.3,9.7,3.4,12,3.4s4.4,0.9,6.1,2.5
+		c1.6,1.6,2.5,3.8,2.5,6.1V20.6z"/>
+	<path d="M15,10.3c-0.1,0.1-0.2,0.2-0.2,0.4v1.4c0,1.4-1.1,2.5-2.5,2.5s-2.5-1.1-2.5-2.5v-1.4c0-0.1-0.1-0.3-0.2-0.4
+		c-0.1-0.1-0.2-0.2-0.4-0.2l0,0c-0.2,0-0.3,0.1-0.4,0.2c-0.1,0.1-0.2,0.2-0.2,0.4v1.4c0,1.8,1.3,3.3,3.1,3.6v0.5h-0.9
+		c-0.3,0-0.5,0.2-0.5,0.5s0.2,0.5,0.5,0.5h2.8c0.3,0,0.5-0.2,0.5-0.5s-0.2-0.5-0.5-0.5h-0.9v-0.5c1.7-0.3,3.1-1.8,3.1-3.6v-1.4
+		c0-0.1-0.1-0.3-0.2-0.4C15.5,10.2,15.2,10.1,15,10.3z M9.2,10.4L9.2,10.4L9.2,10.4L9.2,10.4L9.2,10.4z"/>
+</g>
+<g>
+	<path d="M12.3,13.9c-1,0-1.8-0.8-1.8-1.8V9c0-1,0.8-1.8,1.8-1.8S14.1,8,14.1,9v3.2C14.1,13.2,13.3,13.9,12.3,13.9z M12.3,8.4
+		c-0.3,0-0.6,0.2-0.6,0.6v3.2c0,0.3,0.2,0.6,0.6,0.6c0.3,0,0.6-0.2,0.6-0.6V9C12.9,8.7,12.6,8.4,12.3,8.4z"/>
+</g>
+</svg>
diff --git a/images/icons/message_video-24px.svg b/images/icons/message_video-24px.svg
deleted file mode 100644
index e5a06171fb4905b17e09fabadb0744de6c68485c..0000000000000000000000000000000000000000
--- a/images/icons/message_video-24px.svg
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <title>Message video</title>
-    <g id="Icones_Outline" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="Message-video" stroke="#000000">
-            <path d="M12,2.875 C14.5197992,2.875 16.8010492,3.89635041 18.4523494,5.54765062 C20.1036496,7.19895083 21.125,9.48020083 21.125,12 L21.125,12 L21.125,21.125 L12,21.125 C9.48020083,21.125 7.19895083,20.1036496 5.54765062,18.4523494 C3.89635041,16.8010492 2.875,14.5197992 2.875,12 C2.875,9.48020083 3.89635041,7.19895083 5.54765062,5.54765062 C7.19895083,3.89635041 9.48020083,2.875 12,2.875 Z" id="Rectangle-Copy-3" stroke-width="1.75"></path>
-            <g id="Ico_Camera" transform="translate(7.000000, 8.000000)" stroke-width="1.5">
-                <path d="M4.6832026,4.0582026 C5.29164453,3.875 5.4463271,3.94580015 5.55869578,4.05817556 C5.67108489,4.17057139 5.74188438,4.32529267 5.74188438,4.49598322 C5.74188438,4.66664052 5.67108115,4.8213337 5.55870252,4.93371234 C5.44633138,5.04608348 5.29164686,5.11688438 5.12098322,5.11688438 C4.95029879,5.11688438 4.7955881,5.04607082 4.68319586,4.93368531 C4.57081655,4.82131272 4.5,4.66663207 4.5,4.49598322 C4.5,4.32530112 4.57081281,4.17059238 4.6832026,4.0582026 Z" id="Path"></path>
-                <path d="M5.8691951,0.75 L6.46662157,1.94485294 L8.96139706,1.94485294 L9.04779412,7.28860294 L0.836397059,7.375 L0.75,2.03125 L3.33117255,1.94485294 L3.92859902,0.75 L5.8691951,0.75 Z" id="Path"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/images/icons/message_video_black-24dp.svg b/images/icons/message_video_black-24dp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..2560ea6ebf5f16205e4f7005ed5dc53a391d4963
--- /dev/null
+++ b/images/icons/message_video_black-24dp.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g>
+	<g id="Rectangle-Copy-3">
+		<path d="M22,22H12c-2.7,0-5.2-1-7.1-2.9C3,17.2,2,14.7,2,12c0-2.7,1-5.2,2.9-7.1S9.3,2,12,2c2.7,0,5.2,1,7.1,2.9
+			C21,6.8,22,9.3,22,12V22z M12,3.4c-2.3,0-4.4,0.9-6.1,2.5C4.3,7.6,3.4,9.7,3.4,12c0,2.3,0.9,4.4,2.5,6.1c1.6,1.6,3.8,2.5,6.1,2.5
+			h8.6V12c0-2.3-0.9-4.4-2.5-6.1C16.4,4.3,14.3,3.4,12,3.4z"/>
+	</g>
+	<g id="Ico_Camera" transform="translate(7.000000, 9.000000)">
+		<g id="Path">
+			<path d="M7.1,7.7H0.4c-0.8,0-1.2-0.5-1.2-1V0.3c0-0.4,0.4-0.9,1.1-1l6.7,0c0.7,0,1.1,0.5,1.1,1v0.6l1.1-0.6C9.6,0,10,0,10.3,0.2
+				c0.2,0.1,0.5,0.3,0.5,0.8v5c0,0.5-0.3,0.8-0.5,0.9C10,7,9.6,7,9.3,6.8L8.2,6.2v0.6C8.2,7.2,7.8,7.7,7.1,7.7z M0.5,6.4l6.4,0V5.1
+				c0-0.2,0.1-0.4,0.3-0.6c0.2-0.1,0.4-0.1,0.6,0l1.6,0.9V1.6L7.9,2.5c-0.2,0.1-0.4,0.1-0.6,0C7,2.4,6.9,2.2,6.9,1.9V0.6l-6.4,0V6.4
+				z M10,5.7L10,5.7C10,5.7,10,5.7,10,5.7z"/>
+		</g>
+	</g>
+</g>
+</svg>
diff --git a/images/icons/send-24px.svg b/images/icons/send-24px.svg
deleted file mode 100644
index 9a4937b1ab74bd7c420a7af75c31acdf763d8447..0000000000000000000000000000000000000000
--- a/images/icons/send-24px.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <title>Send</title>
-    <g id="Icones_Outline" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="Send" fill-rule="nonzero" stroke="#000000" stroke-width="1.75">
-            <g id="noun_send_3383765" transform="translate(2.000000, 4.000000)">
-                <path d="M1.04917102,1.91025133 L18.2901355,8.17133814 L0.960533446,15.103179 L1.66342176,9.48007246 L7.92572464,9.48007246 C8.2924137,9.48007246 8.62438833,9.33144236 8.86469071,9.09113998 C9.10499308,8.85083761 9.25362319,8.51886297 9.25362319,8.15217391 C9.25362319,7.78548485 9.10499308,7.45351022 8.86469071,7.21320784 C8.62438833,6.97290547 8.2924137,6.82427536 7.92572464,6.82427536 L7.92572464,6.82427536 L1.66342207,6.82427536 L1.04917102,1.91025133 Z" id="Path"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/images/icons/send_black-24dp.svg b/images/icons/send_black-24dp.svg
new file mode 100644
index 0000000000000000000000000000000000000000..6a2f1279cbbc153cde1213bc9078666dfdbfe7d9
--- /dev/null
+++ b/images/icons/send_black-24dp.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+	 viewBox="0 0 24 24" style="enable-background:new 0 0 24 24;" xml:space="preserve">
+<g id="Send_Black_24dp">
+	<g id="noun_send_1433498" transform="translate(2.000000, 3.000000)">
+		<path id="Shape" d="M20,9c0-0.3-0.2-0.5-0.4-0.6L1.1-0.2C0.8-0.3,0.4-0.2,0.2,0s-0.3,0.6-0.1,0.9L4,9l-3.9,8.1
+			C-0.1,17.4,0,17.8,0.2,18c0.2,0.2,0.6,0.3,0.9,0.2l18.5-8.5C19.8,9.6,20,9.3,20,9L20,9z M17.4,9l-15,6.9l3.2-6.5
+			c0.1-0.2,0.1-0.5,0-0.7L2.4,2.1L17.4,9z"/>
+	</g>
+</g>
+</svg>
diff --git a/images/icons/send_file-24px.svg b/images/icons/send_file-24px.svg
deleted file mode 100644
index 46e3041241f180ce44464ab5e15c803a2a7bdb72..0000000000000000000000000000000000000000
--- a/images/icons/send_file-24px.svg
+++ /dev/null
@@ -1,11 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <title>Link</title>
-    <g id="Icones" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="Link" fill="#000000" fill-rule="nonzero" stroke="#000000" stroke-width="0.5">
-            <g id="noun_attach_998912" transform="translate(11.981262, 12.084524) rotate(25.000000) translate(-11.981262, -12.084524) translate(6.981262, 2.084524)">
-                <path d="M4.58333333,20 C2.05607096,20 0,17.943929 0,15.4166667 L0,3.33333333 C0,1.49536133 1.49536133,0 3.33333333,0 C5.17130533,0 6.66666667,1.49536133 6.66666667,3.33333333 L6.66666667,14.1666667 C6.66666667,15.3153483 5.73201496,16.25 4.58333333,16.25 C3.43465171,16.25 2.5,15.3153483 2.5,14.1666667 L2.5,4.56075033 C2.5,4.33064779 2.68636067,4.14408367 2.91666667,4.14408367 C3.14697267,4.14408367 3.33333333,4.33064779 3.33333333,4.56075033 L3.33333333,14.1666667 C3.33333333,14.855957 3.89404296,15.4166667 4.58333333,15.4166667 C5.27262371,15.4166667 5.83333333,14.855957 5.83333333,14.1666667 L5.83333333,3.33333333 C5.83333333,1.95475258 4.71191404,0.833333333 3.33333333,0.833333333 C1.95475262,0.833333333 0.833333333,1.95475263 0.833333333,3.33333333 L0.833333333,15.4166667 C0.833333333,17.4843343 2.51546225,19.1666667 4.58333333,19.1666667 C6.65120442,19.1666667 8.33333333,17.4843343 8.33333333,15.4166667 L8.33333333,4.04276529 C8.33333333,3.81266275 8.519694,3.62609863 8.75,3.62609863 C8.980306,3.62609863 9.16666667,3.81266275 9.16666667,4.04276529 L9.16666667,15.4166667 C9.16666667,17.943929 7.11059571,20 4.58333333,20 Z" id="Path"></path>
-            </g>
-        </g>
-    </g>
-</svg>
\ No newline at end of file
diff --git a/qml.qrc b/qml.qrc
index f0cf552c3f5a99be69e2adafb5fc2517d6e5a45f..a48688326ea03e5fbf378927c73fd30d5fdf7b4a 100644
--- a/qml.qrc
+++ b/qml.qrc
@@ -146,5 +146,14 @@
         <file>src/commoncomponents/contextmenu/GeneralMenuSeparator.qml</file>
         <file>src/mainview/components/ParticipantOverlayButton.qml</file>
         <file>src/mainview/components/ParticipantControlLayout.qml</file>
+        <file>src/mainview/components/MessageWebViewFooter.qml</file>
+        <file>src/commoncomponents/emojipicker/EmojiPicker.qml</file>
+        <file>src/commoncomponents/emojipicker/emojiPickerLoader.js</file>
+        <file>src/commoncomponents/emojipicker/emojiPickerLoader.html</file>
+        <file>src/commoncomponents/emojipicker/emoji.js</file>
+        <file>src/commoncomponents/JamiTextArea.qml</file>
+        <file>src/mainview/components/FilesToSendDelegate.qml</file>
+        <file>src/mainview/components/MessageBar.qml</file>
+        <file>src/mainview/components/FilesToSendContainer.qml</file>
     </qresource>
 </RCC>
diff --git a/resources.qrc b/resources.qrc
index c551f33b9b0576cf9dad29608d576c07d430fb5e..d54f4bfe8c2595206c27a8fcda88df31c0b288c3 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -60,7 +60,6 @@
         <file>images/icons/ic_video_call_24px.svg</file>
         <file>images/icons/ic_videocam_off_white_24dp.png</file>
         <file>images/icons/ic_videocam_white.png</file>
-        <file>images/icons/ic_voicemail_white_24dp_2x.png</file>
         <file>images/icons/ic_call_end_white_24px.svg</file>
         <file>images/icons/round-add-24px.svg</file>
         <file>images/icons/round-arrow_drop_down-24px.svg</file>
@@ -84,7 +83,6 @@
         <file>images/icons/round-add_a_photo-24px.svg</file>
         <file>images/icons/ic_mic_white_24dp.png</file>
         <file>images/icons/ic_play_white_24dp.png</file>
-        <file>images/icons/ic_voicemail_black_24dp_2x_.png</file>
         <file>images/icons/av_icons/delete-24px.svg</file>
         <file>images/icons/av_icons/fiber_manual_record-24px.svg</file>
         <file>images/icons/av_icons/play_circle_outline-24px.svg</file>
@@ -99,7 +97,6 @@
         <file>images/icons/person-24px.svg</file>
         <file>images/icons/drafts-24px.svg</file>
         <file>images/icons/router-24px.svg</file>
-        <file>images/icons/insert_drive_file-24dp.svg</file>
         <file>images/icons/arrow_back-white-24dp.svg</file>
         <file>images/icons/videocam-24px.svg</file>
         <file>images/icons/qr_code-24px.svg</file>
@@ -122,10 +119,9 @@
         <file>images/logo-jami-standard-coul-white.svg</file>
         <file>images/icons/moderator.svg</file>
         <file>images/icons/star_outline-24px.svg</file>
-        <file>images/icons/send_file-24px.svg</file>
-        <file>images/icons/message_video-24px.svg</file>
-        <file>images/icons/message_audio-24px.svg</file>
-        <file>images/icons/send-24px.svg</file>
+        <file>images/icons/message_audio_black-24dp.svg</file>
+        <file>images/icons/message_video_black-24dp.svg</file>
+        <file>images/icons/send_black-24dp.svg</file>
         <file>images/icons/back-24px.svg</file>
         <file>images/icons/place_audiocall-24px.svg</file>
         <file>images/icons/add_people-24px.svg</file>
@@ -146,5 +142,8 @@
         <file>images/icons/spk_none_black_24dp.svg</file>
         <file>images/icons/more_vert-24dp.svg</file>
         <file>images/icons/chevron_left_black_24dp.svg</file>
+        <file>images/icons/emoji_black-24dp.svg</file>
+        <file>images/icons/link_black-24dp.svg</file>
+        <file>images/icons/file_black-24dp.svg</file>
     </qresource>
 </RCC>
diff --git a/src/commoncomponents/JamiTextArea.qml b/src/commoncomponents/JamiTextArea.qml
new file mode 100644
index 0000000000000000000000000000000000000000..c4ea34ff4290a3ad6aa68434b4a6a169b83b1da8
--- /dev/null
+++ b/src/commoncomponents/JamiTextArea.qml
@@ -0,0 +1,110 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+
+import net.jami.Constants 1.0
+
+import "../commoncomponents/contextmenu"
+
+Flickable {
+    id: root
+
+    property alias text: textArea.text
+
+    function insertText(text) {
+        textArea.insert(textArea.cursorPosition, text)
+    }
+
+    LineEditContextMenu {
+        id: textAreaContextMenu
+
+        lineEditObj: textArea
+    }
+
+    ScrollBar.vertical: ScrollBar {
+        policy: contentHeight > height ? ScrollBar.AlwaysOn : ScrollBar.AsNeeded
+    }
+
+    contentWidth: width
+    contentHeight: textArea.implicitHeight
+
+    interactive: true
+    clip: true
+
+    function ensureVisible(r) {
+        if (contentY >= r.y)
+            contentY = r.y
+        else if (contentY + height <= r.y + r.height)
+            contentY = r.y + r.height - height
+    }
+
+    TextArea.flickable: TextArea {
+        id: textArea
+
+        padding: 0
+
+        verticalAlignment: TextEdit.AlignVCenter
+
+        font.pointSize: JamiTheme.textFontSize + 2
+        font.hintingPreference: Font.PreferNoHinting
+
+        color: JamiTheme.textColor
+        renderType: Text.NativeRendering
+        wrapMode: TextEdit.Wrap
+        overwriteMode: true
+        selectByMouse: true
+        selectionColor: JamiTheme.placeHolderTextFontColor
+        textFormat: TextEdit.PlainText
+        placeholderTextColor: JamiTheme.placeHolderTextFontColor
+
+        cursorDelegate: Rectangle {
+            visible: textArea.cursorVisible
+            color: JamiTheme.textColor
+            width: 1
+
+            SequentialAnimation on opacity {
+                loops: Animation.Infinite
+                running: visible
+
+                NumberAnimation {
+                    from: 1
+                    to: 0
+                    duration: JamiTheme.recordBlinkDuration
+                }
+                NumberAnimation {
+                    from: 0
+                    to: 1
+                    duration: JamiTheme.recordBlinkDuration
+                }
+            }
+        }
+        background: Rectangle {
+            border.width: 0
+            color: JamiTheme.transparentColor
+        }
+
+        onReleased: {
+            if (event.button == Qt.RightButton)
+                textAreaContextMenu.openMenuAt(event)
+        }
+
+        onCursorRectangleChanged: root.ensureVisible(cursorRectangle)
+    }
+}
diff --git a/src/commoncomponents/ModalPopup.qml b/src/commoncomponents/ModalPopup.qml
index 53d4753b3d70e380c4dc46700acb0cef2d83ef98..673c15ce3dffc2f01357e8601156b8db6f1a430e 100644
--- a/src/commoncomponents/ModalPopup.qml
+++ b/src/commoncomponents/ModalPopup.qml
@@ -27,6 +27,7 @@ Popup {
 
     // convient access to closePolicy
     property bool autoClose: true
+    property alias backgroundColor: container.color
 
     onContentItemChanged: {
         if(root.contentItem !== null)
@@ -52,9 +53,7 @@ Popup {
     background: Rectangle {
         id: container
 
-        // TODO: this is the MaterialButton radius and should be part of
-        // a theme.
-        radius: 4
+        radius: JamiTheme.modalPopupRadius
         width: root.width
         height: root.height
     }
@@ -66,7 +65,7 @@ Popup {
         horizontalOffset: 3.0
         verticalOffset: 3.0
         radius: container.radius * 4
-        samples: 16
+        samples: JamiTheme.modalPopupDropShadowSamples
         color: JamiTheme.shadowColor
         source: container
     }
diff --git a/src/commoncomponents/PreferenceItemDelegate.qml b/src/commoncomponents/PreferenceItemDelegate.qml
index 879906e3f35b003f695df53bf8d41a5e4ab70a5d..d9af39b3e7be8cd461970e32c6a4b25f6e72b579 100644
--- a/src/commoncomponents/PreferenceItemDelegate.qml
+++ b/src/commoncomponents/PreferenceItemDelegate.qml
@@ -89,7 +89,7 @@ ItemDelegate {
         id: preferenceFilePathDialog
 
         title: JamiStrings.selectFile
-        folder: "file:///" + currentPath
+        folder: JamiQmlUtils.qmlFilePrefix + currentPath
 
         onAccepted: {
             var url = UtilsAdapter.getAbsPath(file.toString())
diff --git a/src/commoncomponents/PushButton.qml b/src/commoncomponents/PushButton.qml
index 0cd0bdb68ee018b27485487cb4f1d8309af6b7fb..4bf762c744f686d93fa4e99abf24467aa116dbd5 100644
--- a/src/commoncomponents/PushButton.qml
+++ b/src/commoncomponents/PushButton.qml
@@ -50,7 +50,7 @@ AbstractButton {
     property alias textHAlign: textContent.horizontalAlignment
     property bool buttonTextEnableElide: false
 
-    property string toolTipText: ""
+    property alias toolTipText: toolTip.text
 
     // State colors
     property string pressedColor: JamiTheme.pressedButtonColor
@@ -80,9 +80,14 @@ AbstractButton {
     hoverEnabled: true
     focusPolicy: Qt.TabFocus
 
-    ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
-    ToolTip.visible: hovered && (toolTipText.length > 0)
-    ToolTip.text: toolTipText
+
+    MaterialToolTip {
+        id: toolTip
+
+        parent: root
+        visible: hovered && (toolTipText.length > 0)
+        delay: Qt.styleHints.mousePressAndHoldInterval
+    }
 
     ResponsiveImage {
         id: image
diff --git a/src/commoncomponents/emojipicker/EmojiPicker.qml b/src/commoncomponents/emojipicker/EmojiPicker.qml
new file mode 100644
index 0000000000000000000000000000000000000000..93b4cda51aec6ec71a7bb08c4829abb89b2a0d1e
--- /dev/null
+++ b/src/commoncomponents/emojipicker/EmojiPicker.qml
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtWebEngine 1.10
+import QtWebChannel 1.14
+
+import net.jami.Constants 1.0
+import net.jami.Adapters 1.0
+
+import "../"
+
+ModalPopup {
+    id: root
+
+    signal emojiIsPicked(string content)
+
+    backgroundColor: JamiTheme.transparentColor
+
+    function openEmojiPicker() {
+        open()
+        emojiPickerWebView.runJavaScript(
+                    "prepare_to_show(" + JamiTheme.darkTheme + ");")
+    }
+
+    onClosed: {
+        emojiPickerWebView.runJavaScript("prepare_to_hide();")
+    }
+
+    contentItem: Rectangle {
+        id: contentRect
+
+        implicitWidth: 400
+        implicitHeight: 425
+
+        color: JamiTheme.transparentColor
+
+        QtObject {
+            id: jsBridgeObject
+
+            // ID, under which this object will be known at chatview.js side.
+            WebChannel.id: "jsbridge"
+
+            // Functions that are exposed, return code can be derived from js side
+            // by setting callback function.
+            function emojiIsPicked(arg) {
+                root.emojiIsPicked(arg)
+            }
+        }
+
+        WebEngineView {
+            id: emojiPickerWebView
+
+            anchors.fill: contentRect
+
+            backgroundColor: JamiTheme.transparentColor
+
+            settings.javascriptEnabled: true
+            settings.javascriptCanOpenWindows: false
+            settings.javascriptCanAccessClipboard: true
+            settings.javascriptCanPaste: true
+            settings.fullScreenSupportEnabled: true
+            settings.allowRunningInsecureContent: true
+            settings.localContentCanAccessRemoteUrls: false
+            settings.localContentCanAccessFileUrls: false
+            settings.errorPageEnabled: false
+            settings.pluginsEnabled: false
+            settings.screenCaptureEnabled: false
+            settings.linksIncludedInFocusChain: false
+            settings.localStorageEnabled: true
+
+            webChannel: emojiPickerWebViewChannel
+
+            onLoadingChanged: {
+                if (loadRequest.status == WebEngineView.LoadSucceededStatus) {
+                    emojiPickerWebView.runJavaScript(
+                                UtilsAdapter.qStringFromFile(
+                                    ":qwebchannel.js"))
+                    emojiPickerWebView.runJavaScript(
+                                UtilsAdapter.qStringFromFile(
+                                    ":/src/commoncomponents/emojipicker/emoji.js"))
+                    emojiPickerWebView.runJavaScript(
+                                UtilsAdapter.qStringFromFile(
+                                    ":/src/commoncomponents/emojipicker/emojiPickerLoader.js"))
+                    emojiPickerWebView.runJavaScript(
+                                "init_emoji_picker(" + JamiTheme.darkTheme + ");")
+                }
+            }
+
+            Component.onCompleted: {
+                profile.cachePath = UtilsAdapter.getCachePath()
+                profile.persistentStoragePath = UtilsAdapter.getCachePath()
+                profile.persistentCookiesPolicy = WebEngineProfile.NoPersistentCookies
+                profile.httpCacheType = WebEngineProfile.NoCache
+                profile.httpUserAgent = JamiStrings.httpUserAgentName
+
+                emojiPickerWebView.loadHtml(
+                            UtilsAdapter.qStringFromFile(
+                                ":/src/commoncomponents/emojipicker/emojiPickerLoader.html"),
+                            ":/src/commoncomponents/emojipicker/emojiPickerLoader.html")
+                emojiPickerWebView.url
+                        = "qrc:/src/commoncomponents/emojipicker/emojiPickerLoader.html"
+            }
+        }
+
+        // Provide WebChannel by registering jsBridgeObject.
+        WebChannel {
+            id: emojiPickerWebViewChannel
+            registeredObjects: [jsBridgeObject]
+        }
+    }
+}
diff --git a/src/commoncomponents/emojipicker/emoji.js b/src/commoncomponents/emojipicker/emoji.js
new file mode 100644
index 0000000000000000000000000000000000000000..c3a2e34f51513633471d30a744b5f34da665405f
--- /dev/null
+++ b/src/commoncomponents/emojipicker/emoji.js
@@ -0,0 +1,19 @@
+/**
+ * Skipped minification because the original files appears to be already minified.
+ * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
+ */
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+function e(e, o, n, i) { return new (n || (n = Promise))((function (a, r) { function t(e) { try { m(i.next(e)) } catch (e) { r(e) } } function s(e) { try { m(i.throw(e)) } catch (e) { r(e) } } function m(e) { var o; e.done ? a(e.value) : (o = e.value, o instanceof n ? o : new n((function (e) { e(o) }))).then(t, s) } m((i = i.apply(e, o || [])).next()) })) } !function (e, o) { void 0 === o && (o = {}); var n = o.insertAt; if (e && "undefined" != typeof document) { var i = document.head || document.getElementsByTagName("head")[0], a = document.createElement("style"); a.type = "text/css", "top" === n && i.firstChild ? i.insertBefore(a, i.firstChild) : i.appendChild(a), a.styleSheet ? a.styleSheet.cssText = e : a.appendChild(document.createTextNode(e)) } }('@keyframes show {\n  0% {\n    opacity: 0;\n    transform: scale3d(0.8, 0.8, 0.8);\n  }\n\n  50% {\n    transform: scale3d(1.05, 1.05, 1.05);\n  }\n\n  100% {\n    transform: scale3d(1, 1, 1);\n  }\n}\n\n@keyframes hide {\n  0% {\n    opacity: 1;\n    transform: scale3d(1, 1, 1);\n  }\n\n  100% {\n    opacity: 0;\n    transform: scale3d(0.8, 0.8, 0.8);\n  }\n}\n\n@keyframes grow {\n  0% {\n    opacity: 0;\n    transform: scale3d(0.8, 0.8, 0.8); \n  }\n\n  100% { \n    opacity: 1;\n    transform: scale3d(1, 1, 1); \n  }\n}\n\n@keyframes shrink {\n  0% { \n    opacity: 1;\n    transform: scale3d(1, 1, 1);\n  }\n\n  100% { \n    opacity: 0;\n    transform: scale3d(0.8, 0.8, 0.8); \n  }\n}\n\n@keyframes fade-in {\n  0% { opacity: 0; }\n  100% { opacity: 1; }\n}\n\n@keyframes fade-out {\n  0% { opacity: 1; }\n  100% { opacity: 0; }\n}\n\n.emoji-picker {\n  --animation-duration: 0.2s;\n  --animation-easing: ease-in-out;\n\n  --emoji-size: 1.8em;\n  --emoji-size-multiplier: 1.5;\n  --emoji-preview-size: 2em;\n  --emoji-per-row: 8;\n  --row-count: 6;\n\n  --content-height: calc((var(--emoji-size) * var(--emoji-size-multiplier)) * var(--row-count) + var(--category-name-size) + var(--category-button-height) + 0.5em);\n\n  --category-name-size: 0.85em;\n\n  --category-button-height: 2em;\n  --category-button-size: 1.1em;\n  --category-border-bottom-size: 4px;\n\n  --focus-indicator-color: #999999;\n\n  --search-height: 2em;\n\n  --blue-color: #4F81E5;\n\n  --border-color: #CCCCCC;\n  --background-color: #FFFFFF;\n  --text-color: #000000;\n  --secondary-text-color: #666666;\n  --hover-color: #E8F4F9;\n  --search-focus-border-color: var(--blue-color);\n  --search-icon-color: #CCCCCC;\n  --overlay-background-color: rgba(0, 0, 0, 0.8);\n  --popup-background-color: #FFFFFF;\n  --category-button-color: #666666;\n  --category-button-active-color: var(--blue-color);\n\n  --dark-border-color: #666666;\n  --dark-background-color: #333333;\n  --dark-text-color: #FFFFFF;\n  --dark-secondary-text-color: #999999;\n  --dark-hover-color: #666666;\n  --dark-search-background-color: #666666;\n  --dark-search-border-color: #999999;\n  --dark-search-placeholder-color: #999999;\n  --dark-search-focus-border-color: #DBE5F9;\n  --dark-popup-background-color: #333333;\n  --dark-category-button-color: #FFFFFF;\n\n  --font: Arial, Helvetica, sans-serif;\n  --font-size: 16px;\n}\n\n.emoji-picker {\n  font-size: var(--font-size);\n  border: 0px solid var(--border-color);\n  border-radius: 5px;\n  background: var(--background-color);\n  height: 100%;\n  font-family: var(--font);\n  overflow: hidden;\n  animation: show var(--animation-duration) var(--animation-easing);\n}\n\n.emoji-picker * {\n  font-family: var(--font);\n  box-sizing: content-box;\n}\n\n.emoji-picker__overlay {\n  background: rgba(0, 0, 0, 0.75);\n  z-index: 1000;\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.emoji-picker.hiding {\n  animation: hide var(--animation-duration) var(--animation-easing);\n}\n\n.emoji-picker.dark {\n  background: var(--dark-background-color);\n  color: var(--dark-text-color);\n  border-color: var(--dark-border-color);\n}\n\n.emoji-picker__content {\n  padding: 0.5em;\n  height: var(--content-height);\n  position: relative;\n}\n\n.emoji-picker__preview {\n  height: var(--emoji-preview-size);\n  padding: 0.5em;\n  border-top: 1px solid var(--border-color);\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n}\n\n.emoji-picker.dark .emoji-picker__preview {\n  border-top-color: var(--dark-border-color);\n}\n\n.emoji-picker__preview-emoji {\n  font-size: var(--emoji-preview-size);\n  margin-right: 0.25em;\n  font-family: "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "Apple Color Emoji", "Twemoji Mozilla", "Noto Color Emoji", "EmojiOne Color", "Android Emoji";\n}\n\n.emoji-picker__preview-emoji img.emoji {\n  height: 1em;\n  width: 1em;\n  margin: 0 .05em 0 .1em;\n  vertical-align: -0.1em;\n}\n\n.emoji-picker__preview-name {\n  color: var(--text-color);\n  font-size: 0.85em;\n  overflow-wrap: break-word;\n  word-break: break-all;\n}\n\n.emoji-picker.dark .emoji-picker__preview-name {\n  color: var(--dark-text-color);\n}\n\n.emoji-picker__container {\n  display: grid;\n  justify-content: center;\n  grid-template-columns: repeat(var(--emoji-per-row), calc(var(--emoji-size) * var(--emoji-size-multiplier)));\n  grid-auto-rows: calc(var(--emoji-size) * var(--emoji-size-multiplier));\n}\n\n.emoji-picker__container.search-results {\n  height: var(--content-height);\n  overflow-y: auto;\n}\n\n.emoji-picker__custom-emoji {\n  width: 1em;\n  height: 1em;\n}\n\n.emoji-picker__emoji {\n  background: transparent;\n  border: none;\n  cursor: pointer;\n  overflow: hidden;\n  font-size: var(--emoji-size);\n  width: 1.5em;\n  height: 1.5em;\n  padding: 0;\n  margin: 0;\n  outline: none;\n  font-family: "Segoe UI Emoji", "Segoe UI Symbol", "Segoe UI", "Apple Color Emoji", "Twemoji Mozilla", "Noto Color Emoji", "EmojiOne Color", "Android Emoji";\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.emoji-picker__emoji img.emoji {\n  height: 1em;\n  width: 1em;\n  margin: 0 .05em 0 .1em;\n  vertical-align: -0.1em;\n}\n\n.emoji-picker__emoji:focus, .emoji-picker__emoji:hover {\n  background: var(--hover-color);\n}\n\n.emoji-picker__emoji:focus {\n  outline: 1px dotted var(--focus-indicator-color);\n}\n\n.emoji-picker.dark .emoji-picker__emoji:focus, .emoji-picker.dark .emoji-picker__emoji:hover {\n  background: var(--dark-hover-color);\n}\n\n.emoji-picker__plugin-container {\n  margin: 0.5em;\n  display: flex;\n  flex-direction: row;\n}\n\n.emoji-picker__search-container {\n  margin: 0.5em;\n  position: relative;\n  height: var(--search-height);\n  display: flex;\n}\n\n.emoji-picker__search {\n  box-sizing: border-box;\n  width: 100%;\n  border-radius: 3px;\n  border: 1px solid var(--border-color);\n  padding-right: 2em;\n  padding: 0.5em 2.25em 0.5em 0.5em;\n  font-size: 0.85em;\n  outline: none;\n}\n\n.emoji-picker.dark .emoji-picker__search {\n  background: var(--dark-search-background-color);\n  color: var(--dark-text-color);\n  border-color: var(--dark-search-border-color);\n}\n\n.emoji-picker.dark .emoji-picker__search::placeholder {\n  color: var(--dark-search-placeholder-color);\n}\n\n.emoji-picker__search:focus {\n  border: 1px solid var(--search-focus-border-color);\n}\n\n.emoji-picker.dark .emoji-picker__search:focus {\n  border-color: var(--dark-search-focus-border-color);\n}\n\n.emoji-picker__search-icon {\n  position: absolute;\n  color: var(--search-icon-color);\n  width: 1em;\n  height: 1em;\n  right: 0.75em;\n  top: calc(50% - 0.5em);\n}\n\n.emoji-picker__search-icon img {\n  width: 1em;\n  height: 1em;\n}\n\n.emoji-picker__search-not-found {\n  color: var(--secondary-text-color);\n  text-align: center;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n}\n\n.emoji-picker__search-not-found h2 {\n  color: var(--secondary-text-color);\n}\n\n.emoji-picker.dark .emoji-picker__search-not-found {\n  color: var(--dark-secondary-text-color);\n}\n\n.emoji-picker.dark .emoji-picker__search-not-found h2 {\n  color: var(--dark-secondary-text-color);\n}\n\n.emoji-picker__search-not-found-icon {\n  font-size: 3em;\n}\n\n.emoji-picker__search-not-found-icon img {\n  width: 1em;\n  height: 1em;\n}\n\n.emoji-picker__search-not-found h2 {\n  margin: 0.5em 0;\n  font-size: 1em;\n}\n\n.emoji-picker__variant-overlay {\n  background: var(--overlay-background-color);\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border-radius: 5px;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  animation: fade-in var(--animation-duration) var(--animation-easing);\n}\n\n.emoji-picker__variant-overlay.hiding {\n  animation: fade-out var(--animation-duration) var(--animation-easing);\n}\n\n.emoji-picker__variant-popup {\n  background: var(--popup-background-color);\n  margin: 0.5em;\n  padding: 0.5em;\n  text-align: center;\n  border-radius: 5px;\n  animation: grow var(--animation-duration) var(--animation-easing);\n  user-select: none;\n}\n\n.emoji-picker__variant-overlay.hiding .emoji-picker__variant-popup {\n  animation: shrink var(--animation-duration) var(--animation-easing);\n}\n\n.emoji-picker.dark .emoji-picker__variant-popup {\n  background: var(--dark-popup-background-color);\n}\n\n.emoji-picker__emojis {\n  overflow-y: auto;\n  position: relative;\n  height: calc((var(--emoji-size) * var(--emoji-size-multiplier)) * var(--row-count) + var(--category-name-size));\n}\n\n.emoji-picker__emojis.hiding {\n  animation: fade-out 0.05s var(--animation-easing);\n}\n\n.emoji-picker__emojis h2.emoji-picker__category-name {\n  font-size: 0.85em;\n  color: var(--secondary-text-color);\n  text-transform: uppercase;\n  margin: 0.25em 0;\n  text-align: left;\n}\n\n.emoji-picker.dark h2.emoji-picker__category-name {\n  color: var(--dark-secondary-text-color);\n}\n\n.emoji-picker__category-buttons {\n  display: flex;\n  flex-direction: row;\n  justify-content: space-around;\n  height: var(--category-button-height);\n  margin-bottom: 0.5em;\n}\n\nbutton.emoji-picker__category-button {\n  flex-grow: 1;\n  background: transparent;\n  padding: 0;\n  border: none;\n  cursor: pointer;\n  font-size: var(--category-button-size);\n  vertical-align: middle;\n  color: var(--category-button-color);\n  border-bottom: var(--category-border-bottom-size) solid transparent;\n  outline: none;\n}\n\nbutton.emoji-picker__category-button img {\n  width: var(--category-button-size);\n  height: var(--category-button-size);\n}\n\n.emoji-picker.keyboard button.emoji-picker__category-button:focus {\n  outline: 1px dotted var(--focus-indicator-color);\n}\n\n.emoji-picker.dark button.emoji-picker__category-button.active {\n  color: var(--category-button-active-color);\n}\n\n.emoji-picker.dark button.emoji-picker__category-button {\n  color: var(--dark-category-button-color);\n}\n\nbutton.emoji-picker__category-button.active {\n  color: var(--category-button-active-color);\n  border-bottom: var(--category-border-bottom-size) solid var(--category-button-active-color);\n}\n\n@media (prefers-color-scheme: dark) {\n  .emoji-picker.auto {\n    background: var(--dark-background-color);\n    color: var(--dark-text-color);\n    border-color: var(--dark-border-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__preview {\n    border-top-color: var(--dark-border-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__preview-name {\n    color: var(--dark-text-color);\n  }\n\n  .emoji-picker.auto button.emoji-picker__category-button {\n    color: var(--dark-category-button-color);\n  }\n\n  .emoji-picker.auto button.emoji-picker__category-button.active {\n    color: var(--category-button-active-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__emoji:focus, .emoji-picker.auto .emoji-picker__emoji:hover {\n    background: var(--dark-hover-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__search {\n    background: var(--dark-search-background-color);\n    color: var(--dark-text-color);\n    border-color: var(--dark-search-border-color);\n  }\n \n  .emoji-picker.auto h2.emoji-picker__category-name {\n    color: var(--dark-secondary-text-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__search::placeholder {\n    color: var(--dark-search-placeholder-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__search:focus {\n    border-color: var(--dark-search-focus-border-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__search-not-found {\n    color: var(--dark-secondary-text-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__search-not-found h2 {\n    color: var(--dark-secondary-text-color);\n  }\n\n  .emoji-picker.auto .emoji-picker__variant-popup {\n    background: var(--dark-popup-background-color);\n  }\n}'); var o = ["input", "select", "textarea", "a[href]", "button", "[tabindex]", "audio[controls]", "video[controls]", '[contenteditable]:not([contenteditable="false"])'], n = o.join(","), i = "undefined" == typeof Element ? function () { } : Element.prototype.matches || Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector; function a(e, o) { o = o || {}; var a, t, s, d = [], g = [], u = e.querySelectorAll(n); for (o.includeContainer && i.call(e, n) && (u = Array.prototype.slice.apply(u)).unshift(e), a = 0; a < u.length; a++)r(t = u[a]) && (0 === (s = m(t)) ? d.push(t) : g.push({ documentOrder: a, tabIndex: s, node: t })); return g.sort(c).map((function (e) { return e.node })).concat(d) } function r(e) { return !(!t(e) || function (e) { return function (e) { return d(e) && "radio" === e.type }(e) && !function (e) { if (!e.name) return !0; var o = function (e) { for (var o = 0; o < e.length; o++)if (e[o].checked) return e[o] }(e.ownerDocument.querySelectorAll('input[type="radio"][name="' + e.name + '"]')); return !o || o === e }(e) }(e) || m(e) < 0) } function t(e) { return !(e.disabled || function (e) { return d(e) && "hidden" === e.type }(e) || function (e) { return null === e.offsetParent || "hidden" === getComputedStyle(e).visibility }(e)) } a.isTabbable = function (e) { if (!e) throw new Error("No node provided"); return !1 !== i.call(e, n) && r(e) }, a.isFocusable = function (e) { if (!e) throw new Error("No node provided"); return !1 !== i.call(e, s) && t(e) }; var s = o.concat("iframe").join(","); function m(e) { var o = parseInt(e.getAttribute("tabindex"), 10); return isNaN(o) ? function (e) { return "true" === e.contentEditable }(e) ? 0 : e.tabIndex : o } function c(e, o) { return e.tabIndex === o.tabIndex ? e.documentOrder - o.documentOrder : e.tabIndex - o.tabIndex } function d(e) { return "INPUT" === e.tagName } var g, u = a, l = function () { for (var e = {}, o = 0; o < arguments.length; o++) { var n = arguments[o]; for (var i in n) v.call(n, i) && (e[i] = n[i]) } return e }, v = Object.prototype.hasOwnProperty; var f, y = (f = [], { activateTrap: function (e) { if (f.length > 0) { var o = f[f.length - 1]; o !== e && o.pause() } var n = f.indexOf(e); -1 === n || f.splice(n, 1), f.push(e) }, deactivateTrap: function (e) { var o = f.indexOf(e); -1 !== o && f.splice(o, 1), f.length > 0 && f[f.length - 1].unpause() } }); function j(e) { return setTimeout(e, 0) } var h = function (e, o) { var n = document, i = "string" == typeof e ? n.querySelector(e) : e, a = l({ returnFocusOnDeactivate: !0, escapeDeactivates: !0 }, o), r = { firstTabbableNode: null, lastTabbableNode: null, nodeFocusedBeforeActivation: null, mostRecentlyFocusedNode: null, active: !1, paused: !1 }, t = { activate: function (e) { if (r.active) return; w(), r.active = !0, r.paused = !1, r.nodeFocusedBeforeActivation = n.activeElement; var o = e && e.onActivate ? e.onActivate : a.onActivate; o && o(); return m(), t }, deactivate: s, pause: function () { if (r.paused || !r.active) return; r.paused = !0, c() }, unpause: function () { if (!r.paused || !r.active) return; r.paused = !1, w(), m() } }; return t; function s(e) { if (r.active) { clearTimeout(g), c(), r.active = !1, r.paused = !1, y.deactivateTrap(t); var o = e && void 0 !== e.onDeactivate ? e.onDeactivate : a.onDeactivate; return o && o(), (e && void 0 !== e.returnFocus ? e.returnFocus : a.returnFocusOnDeactivate) && j((function () { var e; k((e = r.nodeFocusedBeforeActivation, d("setReturnFocus") || e)) })), t } } function m() { if (r.active) return y.activateTrap(t), g = j((function () { k(v()) })), n.addEventListener("focusin", h, !0), n.addEventListener("mousedown", f, { capture: !0, passive: !1 }), n.addEventListener("touchstart", f, { capture: !0, passive: !1 }), n.addEventListener("click", b, { capture: !0, passive: !1 }), n.addEventListener("keydown", p, { capture: !0, passive: !1 }), t } function c() { if (r.active) return n.removeEventListener("focusin", h, !0), n.removeEventListener("mousedown", f, !0), n.removeEventListener("touchstart", f, !0), n.removeEventListener("click", b, !0), n.removeEventListener("keydown", p, !0), t } function d(e) { var o = a[e], i = o; if (!o) return null; if ("string" == typeof o && !(i = n.querySelector(o))) throw new Error("`" + e + "` refers to no known node"); if ("function" == typeof o && !(i = o())) throw new Error("`" + e + "` did not return a node"); return i } function v() { var e; if (!(e = null !== d("initialFocus") ? d("initialFocus") : i.contains(n.activeElement) ? n.activeElement : r.firstTabbableNode || d("fallbackFocus"))) throw new Error("Your focus-trap needs to have at least one focusable element"); return e } function f(e) { i.contains(e.target) || (a.clickOutsideDeactivates ? s({ returnFocus: !u.isFocusable(e.target) }) : a.allowOutsideClick && a.allowOutsideClick(e) || e.preventDefault()) } function h(e) { i.contains(e.target) || e.target instanceof Document || (e.stopImmediatePropagation(), k(r.mostRecentlyFocusedNode || v())) } function p(e) { if (!1 !== a.escapeDeactivates && function (e) { return "Escape" === e.key || "Esc" === e.key || 27 === e.keyCode }(e)) return e.preventDefault(), void s(); (function (e) { return "Tab" === e.key || 9 === e.keyCode })(e) && function (e) { if (w(), e.shiftKey && e.target === r.firstTabbableNode) return e.preventDefault(), void k(r.lastTabbableNode); if (!e.shiftKey && e.target === r.lastTabbableNode) e.preventDefault(), k(r.firstTabbableNode) }(e) } function b(e) { a.clickOutsideDeactivates || i.contains(e.target) || a.allowOutsideClick && a.allowOutsideClick(e) || (e.preventDefault(), e.stopImmediatePropagation()) } function w() { var e = u(i); r.firstTabbableNode = e[0] || v(), r.lastTabbableNode = e[e.length - 1] || v() } function k(e) { e !== n.activeElement && (e && e.focus ? (e.focus(), r.mostRecentlyFocusedNode = e, function (e) { return e.tagName && "input" === e.tagName.toLowerCase() && "function" == typeof e.select }(e) && e.select()) : k(v())) } }; function p() { } p.prototype = { on: function (e, o, n) { var i = this.e || (this.e = {}); return (i[e] || (i[e] = [])).push({ fn: o, ctx: n }), this }, once: function (e, o, n) { var i = this; function a() { i.off(e, a), o.apply(n, arguments) } return a._ = o, this.on(e, a, n) }, emit: function (e) { for (var o = [].slice.call(arguments, 1), n = ((this.e || (this.e = {}))[e] || []).slice(), i = 0, a = n.length; i < a; i++)n[i].fn.apply(n[i].ctx, o); return this }, off: function (e, o) { var n = this.e || (this.e = {}), i = n[e], a = []; if (i && o) for (var r = 0, t = i.length; r < t; r++)i[r].fn !== o && i[r].fn._ !== o && a.push(i[r]); return a.length ? n[e] = a : delete n[e], this } }; var b = p; function w(e) { var o = e.getBoundingClientRect(); return { width: o.width, height: o.height, top: o.top, right: o.right, bottom: o.bottom, left: o.left, x: o.left, y: o.top } } function k(e) { if ("[object Window]" !== e.toString()) { var o = e.ownerDocument; return o ? o.defaultView : window } return e } function x(e) { var o = k(e); return { scrollLeft: o.pageXOffset, scrollTop: o.pageYOffset } } function C(e) { return e instanceof k(e).Element || e instanceof Element } function E(e) { return e instanceof k(e).HTMLElement || e instanceof HTMLElement } function _(e) { return e ? (e.nodeName || "").toLowerCase() : null } function z(e) { return (C(e) ? e.ownerDocument : e.document).documentElement } function O(e) { return w(z(e)).left + x(e).scrollLeft } function I(e) { return k(e).getComputedStyle(e) } function S(e) { var o = I(e), n = o.overflow, i = o.overflowX, a = o.overflowY; return /auto|scroll|overlay|hidden/.test(n + a + i) } function P(e, o, n) { void 0 === n && (n = !1); var i, a, r = z(o), t = w(e), s = { scrollLeft: 0, scrollTop: 0 }, m = { x: 0, y: 0 }; return n || (("body" !== _(o) || S(r)) && (s = (i = o) !== k(i) && E(i) ? { scrollLeft: (a = i).scrollLeft, scrollTop: a.scrollTop } : x(i)), E(o) ? ((m = w(o)).x += o.clientLeft, m.y += o.clientTop) : r && (m.x = O(r))), { x: t.left + s.scrollLeft - m.x, y: t.top + s.scrollTop - m.y, width: t.width, height: t.height } } function M(e) { return { x: e.offsetLeft, y: e.offsetTop, width: e.offsetWidth, height: e.offsetHeight } } function A(e) { return "html" === _(e) ? e : e.assignedSlot || e.parentNode || e.host || z(e) } function L(e) { return ["html", "body", "#document"].indexOf(_(e)) >= 0 ? e.ownerDocument.body : E(e) && S(e) ? e : L(A(e)) } function T(e, o) { void 0 === o && (o = []); var n = L(e), i = "body" === _(n), a = k(n), r = i ? [a].concat(a.visualViewport || [], S(n) ? n : []) : n, t = o.concat(r); return i ? t : t.concat(T(A(r))) } function N(e) { return ["table", "td", "th"].indexOf(_(e)) >= 0 } function F(e) { return E(e) && "fixed" !== I(e).position ? e.offsetParent : null } function B(e) { for (var o = k(e), n = F(e); n && N(n);)n = F(n); return n && "body" === _(n) && "static" === I(n).position ? o : n || o } p.TinyEmitter = b; var D = "top", R = "bottom", q = "right", V = "left", H = [D, R, q, V], U = H.reduce((function (e, o) { return e.concat([o + "-start", o + "-end"]) }), []), W = [].concat(H, ["auto"]).reduce((function (e, o) { return e.concat([o, o + "-start", o + "-end"]) }), []), K = ["beforeRead", "read", "afterRead", "beforeMain", "main", "afterMain", "beforeWrite", "write", "afterWrite"]; function J(e) { var o = new Map, n = new Set, i = []; function a(e) { n.add(e.name), [].concat(e.requires || [], e.requiresIfExists || []).forEach((function (e) { if (!n.has(e)) { var i = o.get(e); i && a(i) } })), i.push(e) } return e.forEach((function (e) { o.set(e.name, e) })), e.forEach((function (e) { n.has(e.name) || a(e) })), i } function G(e) { return e.split("-")[0] } var X = { placement: "bottom", modifiers: [], strategy: "absolute" }; function Y() { for (var e = arguments.length, o = new Array(e), n = 0; n < e; n++)o[n] = arguments[n]; return !o.some((function (e) { return !(e && "function" == typeof e.getBoundingClientRect) })) } function $(e) { void 0 === e && (e = {}); var o = e, n = o.defaultModifiers, i = void 0 === n ? [] : n, a = o.defaultOptions, r = void 0 === a ? X : a; return function (e, o, n) { void 0 === n && (n = r); var a, t, s = { placement: "bottom", orderedModifiers: [], options: Object.assign({}, X, {}, r), modifiersData: {}, elements: { reference: e, popper: o }, attributes: {}, styles: {} }, m = [], c = !1, d = { state: s, setOptions: function (n) { g(), s.options = Object.assign({}, r, {}, s.options, {}, n), s.scrollParents = { reference: C(e) ? T(e) : e.contextElement ? T(e.contextElement) : [], popper: T(o) }; var a, t, c = function (e) { var o = J(e); return K.reduce((function (e, n) { return e.concat(o.filter((function (e) { return e.phase === n }))) }), []) }((a = [].concat(i, s.options.modifiers), t = a.reduce((function (e, o) { var n = e[o.name]; return e[o.name] = n ? Object.assign({}, n, {}, o, { options: Object.assign({}, n.options, {}, o.options), data: Object.assign({}, n.data, {}, o.data) }) : o, e }), {}), Object.keys(t).map((function (e) { return t[e] })))); return s.orderedModifiers = c.filter((function (e) { return e.enabled })), s.orderedModifiers.forEach((function (e) { var o = e.name, n = e.options, i = void 0 === n ? {} : n, a = e.effect; if ("function" == typeof a) { var r = a({ state: s, name: o, instance: d, options: i }), t = function () { }; m.push(r || t) } })), d.update() }, forceUpdate: function () { if (!c) { var e = s.elements, o = e.reference, n = e.popper; if (Y(o, n)) { s.rects = { reference: P(o, B(n), "fixed" === s.options.strategy), popper: M(n) }, s.reset = !1, s.placement = s.options.placement, s.orderedModifiers.forEach((function (e) { return s.modifiersData[e.name] = Object.assign({}, e.data) })); for (var i = 0; i < s.orderedModifiers.length; i++)if (!0 !== s.reset) { var a = s.orderedModifiers[i], r = a.fn, t = a.options, m = void 0 === t ? {} : t, g = a.name; "function" == typeof r && (s = r({ state: s, options: m, name: g, instance: d }) || s) } else s.reset = !1, i = -1 } } }, update: (a = function () { return new Promise((function (e) { d.forceUpdate(), e(s) })) }, function () { return t || (t = new Promise((function (e) { Promise.resolve().then((function () { t = void 0, e(a()) })) }))), t }), destroy: function () { g(), c = !0 } }; if (!Y(e, o)) return d; function g() { m.forEach((function (e) { return e() })), m = [] } return d.setOptions(n).then((function (e) { !c && n.onFirstUpdate && n.onFirstUpdate(e) })), d } } var Z = { passive: !0 }; function Q(e) { return e.split("-")[1] } function ee(e) { return ["top", "bottom"].indexOf(e) >= 0 ? "x" : "y" } function oe(e) { var o, n = e.reference, i = e.element, a = e.placement, r = a ? G(a) : null, t = a ? Q(a) : null, s = n.x + n.width / 2 - i.width / 2, m = n.y + n.height / 2 - i.height / 2; switch (r) { case D: o = { x: s, y: n.y - i.height }; break; case R: o = { x: s, y: n.y + n.height }; break; case q: o = { x: n.x + n.width, y: m }; break; case V: o = { x: n.x - i.width, y: m }; break; default: o = { x: n.x, y: n.y } }var c = r ? ee(r) : null; if (null != c) { var d = "y" === c ? "height" : "width"; switch (t) { case "start": o[c] = Math.floor(o[c]) - Math.floor(n[d] / 2 - i[d] / 2); break; case "end": o[c] = Math.floor(o[c]) + Math.ceil(n[d] / 2 - i[d] / 2) } } return o } var ne = { top: "auto", right: "auto", bottom: "auto", left: "auto" }; function ie(e) { var o, n = e.popper, i = e.popperRect, a = e.placement, r = e.offsets, t = e.position, s = e.gpuAcceleration, m = e.adaptive, c = function (e) { var o = e.x, n = e.y, i = window.devicePixelRatio || 1; return { x: Math.round(o * i) / i || 0, y: Math.round(n * i) / i || 0 } }(r), d = c.x, g = c.y, u = r.hasOwnProperty("x"), l = r.hasOwnProperty("y"), v = V, f = D, y = window; if (m) { var j = B(n); j === k(n) && (j = z(n)), a === D && (f = R, g -= j.clientHeight - i.height, g *= s ? 1 : -1), a === V && (v = q, d -= j.clientWidth - i.width, d *= s ? 1 : -1) } var h, p = Object.assign({ position: t }, m && ne); return s ? Object.assign({}, p, ((h = {})[f] = l ? "0" : "", h[v] = u ? "0" : "", h.transform = (y.devicePixelRatio || 1) < 2 ? "translate(" + d + "px, " + g + "px)" : "translate3d(" + d + "px, " + g + "px, 0)", h)) : Object.assign({}, p, ((o = {})[f] = l ? g + "px" : "", o[v] = u ? d + "px" : "", o.transform = "", o)) } var ae = { left: "right", right: "left", bottom: "top", top: "bottom" }; function re(e) { return e.replace(/left|right|bottom|top/g, (function (e) { return ae[e] })) } var te = { start: "end", end: "start" }; function se(e) { return e.replace(/start|end/g, (function (e) { return te[e] })) } function me(e) { return parseFloat(e) || 0 } function ce(e) { var o = k(e), n = function (e) { var o = E(e) ? I(e) : {}; return { top: me(o.borderTopWidth), right: me(o.borderRightWidth), bottom: me(o.borderBottomWidth), left: me(o.borderLeftWidth) } }(e), i = "html" === _(e), a = O(e), r = e.clientWidth + n.right, t = e.clientHeight + n.bottom; return i && o.innerHeight - e.clientHeight > 50 && (t = o.innerHeight - n.bottom), { top: i ? 0 : e.clientTop, right: e.clientLeft > n.left ? n.right : i ? o.innerWidth - r - a : e.offsetWidth - r, bottom: i ? o.innerHeight - t : e.offsetHeight - t, left: i ? a : e.clientLeft } } function de(e, o) { var n = Boolean(o.getRootNode && o.getRootNode().host); if (e.contains(o)) return !0; if (n) { var i = o; do { if (i && e.isSameNode(i)) return !0; i = i.parentNode || i.host } while (i) } return !1 } function ge(e) { return Object.assign({}, e, { left: e.x, top: e.y, right: e.x + e.width, bottom: e.y + e.height }) } function ue(e, o) { return "viewport" === o ? ge(function (e) { var o = k(e), n = o.visualViewport, i = o.innerWidth, a = o.innerHeight; return n && /iPhone|iPod|iPad/.test(navigator.platform) && (i = n.width, a = n.height), { width: i, height: a, x: 0, y: 0 } }(e)) : E(o) ? w(o) : ge(function (e) { var o = k(e), n = x(e), i = P(z(e), o); return i.height = Math.max(i.height, o.innerHeight), i.width = Math.max(i.width, o.innerWidth), i.x = -n.scrollLeft, i.y = -n.scrollTop, i }(z(e))) } function le(e, o, n) { var i = "clippingParents" === o ? function (e) { var o = T(e), n = ["absolute", "fixed"].indexOf(I(e).position) >= 0 && E(e) ? B(e) : e; return C(n) ? o.filter((function (e) { return C(e) && de(e, n) })) : [] }(e) : [].concat(o), a = [].concat(i, [n]), r = a[0], t = a.reduce((function (o, n) { var i = ue(e, n), a = ce(E(n) ? n : z(e)); return o.top = Math.max(i.top + a.top, o.top), o.right = Math.min(i.right - a.right, o.right), o.bottom = Math.min(i.bottom - a.bottom, o.bottom), o.left = Math.max(i.left + a.left, o.left), o }), ue(e, r)); return t.width = t.right - t.left, t.height = t.bottom - t.top, t.x = t.left, t.y = t.top, t } function ve(e) { return Object.assign({}, { top: 0, right: 0, bottom: 0, left: 0 }, {}, e) } function fe(e, o) { return o.reduce((function (o, n) { return o[n] = e, o }), {}) } function ye(e, o) { void 0 === o && (o = {}); var n = o, i = n.placement, a = void 0 === i ? e.placement : i, r = n.boundary, t = void 0 === r ? "clippingParents" : r, s = n.rootBoundary, m = void 0 === s ? "viewport" : s, c = n.elementContext, d = void 0 === c ? "popper" : c, g = n.altBoundary, u = void 0 !== g && g, l = n.padding, v = void 0 === l ? 0 : l, f = ve("number" != typeof v ? v : fe(v, H)), y = "popper" === d ? "reference" : "popper", j = e.elements.reference, h = e.rects.popper, p = e.elements[u ? y : d], b = le(C(p) ? p : p.contextElement || z(e.elements.popper), t, m), k = w(j), x = oe({ reference: k, element: h, strategy: "absolute", placement: a }), E = ge(Object.assign({}, h, {}, x)), _ = "popper" === d ? E : k, O = { top: b.top - _.top + f.top, bottom: _.bottom - b.bottom + f.bottom, left: b.left - _.left + f.left, right: _.right - b.right + f.right }, I = e.modifiersData.offset; if ("popper" === d && I) { var S = I[a]; Object.keys(O).forEach((function (e) { var o = [q, R].indexOf(e) >= 0 ? 1 : -1, n = [D, R].indexOf(e) >= 0 ? "y" : "x"; O[e] += S[n] * o })) } return O } function je(e, o) { void 0 === o && (o = {}); var n = o, i = n.placement, a = n.boundary, r = n.rootBoundary, t = n.padding, s = n.flipVariations, m = n.allowedAutoPlacements, c = void 0 === m ? W : m, d = Q(i), g = (d ? s ? U : U.filter((function (e) { return Q(e) === d })) : H).filter((function (e) { return c.indexOf(e) >= 0 })).reduce((function (o, n) { return o[n] = ye(e, { placement: n, boundary: a, rootBoundary: r, padding: t })[G(n)], o }), {}); return Object.keys(g).sort((function (e, o) { return g[e] - g[o] })) } function he(e, o, n) { return Math.max(e, Math.min(o, n)) } function pe(e, o, n) { return void 0 === n && (n = { x: 0, y: 0 }), { top: e.top - o.height - n.y, right: e.right - o.width + n.x, bottom: e.bottom - o.height + n.y, left: e.left - o.width - n.x } } function be(e) { return [D, q, R, V].some((function (o) { return e[o] >= 0 })) } var we = $({ defaultModifiers: [{ name: "eventListeners", enabled: !0, phase: "write", fn: function () { }, effect: function (e) { var o = e.state, n = e.instance, i = e.options, a = i.scroll, r = void 0 === a || a, t = i.resize, s = void 0 === t || t, m = k(o.elements.popper), c = [].concat(o.scrollParents.reference, o.scrollParents.popper); return r && c.forEach((function (e) { e.addEventListener("scroll", n.update, Z) })), s && m.addEventListener("resize", n.update, Z), function () { r && c.forEach((function (e) { e.removeEventListener("scroll", n.update, Z) })), s && m.removeEventListener("resize", n.update, Z) } }, data: {} }, { name: "popperOffsets", enabled: !0, phase: "read", fn: function (e) { var o = e.state, n = e.name; o.modifiersData[n] = oe({ reference: o.rects.reference, element: o.rects.popper, strategy: "absolute", placement: o.placement }) }, data: {} }, { name: "computeStyles", enabled: !0, phase: "beforeWrite", fn: function (e) { var o = e.state, n = e.options, i = n.gpuAcceleration, a = void 0 === i || i, r = n.adaptive, t = void 0 === r || r, s = { placement: G(o.placement), popper: o.elements.popper, popperRect: o.rects.popper, gpuAcceleration: a }; null != o.modifiersData.popperOffsets && (o.styles.popper = Object.assign({}, o.styles.popper, {}, ie(Object.assign({}, s, { offsets: o.modifiersData.popperOffsets, position: o.options.strategy, adaptive: t })))), null != o.modifiersData.arrow && (o.styles.arrow = Object.assign({}, o.styles.arrow, {}, ie(Object.assign({}, s, { offsets: o.modifiersData.arrow, position: "absolute", adaptive: !1 })))), o.attributes.popper = Object.assign({}, o.attributes.popper, { "data-popper-placement": o.placement }) }, data: {} }, { name: "applyStyles", enabled: !0, phase: "write", fn: function (e) { var o = e.state; Object.keys(o.elements).forEach((function (e) { var n = o.styles[e] || {}, i = o.attributes[e] || {}, a = o.elements[e]; E(a) && _(a) && (Object.assign(a.style, n), Object.keys(i).forEach((function (e) { var o = i[e]; !1 === o ? a.removeAttribute(e) : a.setAttribute(e, !0 === o ? "" : o) }))) })) }, effect: function (e) { var o = e.state, n = { popper: { position: o.options.strategy, left: "0", top: "0", margin: "0" }, arrow: { position: "absolute" }, reference: {} }; return Object.assign(o.elements.popper.style, n.popper), o.elements.arrow && Object.assign(o.elements.arrow.style, n.arrow), function () { Object.keys(o.elements).forEach((function (e) { var i = o.elements[e], a = o.attributes[e] || {}, r = Object.keys(o.styles.hasOwnProperty(e) ? o.styles[e] : n[e]).reduce((function (e, o) { return e[o] = "", e }), {}); E(i) && _(i) && (Object.assign(i.style, r), Object.keys(a).forEach((function (e) { i.removeAttribute(e) }))) })) } }, requires: ["computeStyles"] }, { name: "offset", enabled: !0, phase: "main", requires: ["popperOffsets"], fn: function (e) { var o = e.state, n = e.options, i = e.name, a = n.offset, r = void 0 === a ? [0, 0] : a, t = W.reduce((function (e, n) { return e[n] = function (e, o, n) { var i = G(e), a = [V, D].indexOf(i) >= 0 ? -1 : 1, r = "function" == typeof n ? n(Object.assign({}, o, { placement: e })) : n, t = r[0], s = r[1]; return t = t || 0, s = (s || 0) * a, [V, q].indexOf(i) >= 0 ? { x: s, y: t } : { x: t, y: s } }(n, o.rects, r), e }), {}), s = t[o.placement], m = s.x, c = s.y; null != o.modifiersData.popperOffsets && (o.modifiersData.popperOffsets.x += m, o.modifiersData.popperOffsets.y += c), o.modifiersData[i] = t } }, { name: "flip", enabled: !0, phase: "main", fn: function (e) { var o = e.state, n = e.options, i = e.name; if (!o.modifiersData[i]._skip) { for (var a = n.mainAxis, r = void 0 === a || a, t = n.altAxis, s = void 0 === t || t, m = n.fallbackPlacements, c = n.padding, d = n.boundary, g = n.rootBoundary, u = n.altBoundary, l = n.flipVariations, v = void 0 === l || l, f = n.allowedAutoPlacements, y = o.options.placement, j = G(y), h = m || (j === y || !v ? [re(y)] : function (e) { if ("auto" === G(e)) return []; var o = re(e); return [se(e), o, se(o)] }(y)), p = [y].concat(h).reduce((function (e, n) { return e.concat("auto" === G(n) ? je(o, { placement: n, boundary: d, rootBoundary: g, padding: c, flipVariations: v, allowedAutoPlacements: f }) : n) }), []), b = o.rects.reference, w = o.rects.popper, k = new Map, x = !0, C = p[0], E = 0; E < p.length; E++) { var _ = p[E], z = G(_), O = "start" === Q(_), I = [D, R].indexOf(z) >= 0, S = I ? "width" : "height", P = ye(o, { placement: _, boundary: d, rootBoundary: g, altBoundary: u, padding: c }), M = I ? O ? q : V : O ? R : D; b[S] > w[S] && (M = re(M)); var A = re(M), L = []; if (r && L.push(P[z] <= 0), s && L.push(P[M] <= 0, P[A] <= 0), L.every((function (e) { return e }))) { C = _, x = !1; break } k.set(_, L) } if (x) for (var T = function (e) { var o = p.find((function (o) { var n = k.get(o); if (n) return n.slice(0, e).every((function (e) { return e })) })); if (o) return C = o, "break" }, N = v ? 3 : 1; N > 0; N--) { if ("break" === T(N)) break } o.placement !== C && (o.modifiersData[i]._skip = !0, o.placement = C, o.reset = !0) } }, requiresIfExists: ["offset"], data: { _skip: !1 } }, { name: "preventOverflow", enabled: !0, phase: "main", fn: function (e) { var o = e.state, n = e.options, i = e.name, a = n.mainAxis, r = void 0 === a || a, t = n.altAxis, s = void 0 !== t && t, m = n.boundary, c = n.rootBoundary, d = n.altBoundary, g = n.padding, u = n.tether, l = void 0 === u || u, v = n.tetherOffset, f = void 0 === v ? 0 : v, y = ye(o, { boundary: m, rootBoundary: c, padding: g, altBoundary: d }), j = G(o.placement), h = Q(o.placement), p = !h, b = ee(j), w = "x" === b ? "y" : "x", k = o.modifiersData.popperOffsets, x = o.rects.reference, C = o.rects.popper, E = "function" == typeof f ? f(Object.assign({}, o.rects, { placement: o.placement })) : f, _ = { x: 0, y: 0 }; if (k) { if (r) { var z = "y" === b ? D : V, O = "y" === b ? R : q, I = "y" === b ? "height" : "width", S = k[b], P = k[b] + y[z], A = k[b] - y[O], L = l ? -C[I] / 2 : 0, T = "start" === h ? x[I] : C[I], N = "start" === h ? -C[I] : -x[I], F = o.elements.arrow, H = l && F ? M(F) : { width: 0, height: 0 }, U = o.modifiersData["arrow#persistent"] ? o.modifiersData["arrow#persistent"].padding : { top: 0, right: 0, bottom: 0, left: 0 }, W = U[z], K = U[O], J = he(0, x[I], H[I]), X = p ? x[I] / 2 - L - J - W - E : T - J - W - E, Y = p ? -x[I] / 2 + L + J + K + E : N + J + K + E, $ = o.elements.arrow && B(o.elements.arrow), Z = $ ? "y" === b ? $.clientTop || 0 : $.clientLeft || 0 : 0, oe = o.modifiersData.offset ? o.modifiersData.offset[o.placement][b] : 0, ne = k[b] + X - oe - Z, ie = k[b] + Y - oe, ae = he(l ? Math.min(P, ne) : P, S, l ? Math.max(A, ie) : A); k[b] = ae, _[b] = ae - S } if (s) { var re = "x" === b ? D : V, te = "x" === b ? R : q, se = k[w], me = he(se + y[re], se, se - y[te]); k[w] = me, _[w] = me - se } o.modifiersData[i] = _ } }, requiresIfExists: ["offset"] }, { name: "arrow", enabled: !0, phase: "main", fn: function (e) { var o, n = e.state, i = e.name, a = n.elements.arrow, r = n.modifiersData.popperOffsets, t = G(n.placement), s = ee(t), m = [V, q].indexOf(t) >= 0 ? "height" : "width"; if (a && r) { var c = n.modifiersData[i + "#persistent"].padding, d = M(a), g = "y" === s ? D : V, u = "y" === s ? R : q, l = n.rects.reference[m] + n.rects.reference[s] - r[s] - n.rects.popper[m], v = r[s] - n.rects.reference[s], f = B(a), y = f ? "y" === s ? f.clientHeight || 0 : f.clientWidth || 0 : 0, j = l / 2 - v / 2, h = c[g], p = y - d[m] - c[u], b = y / 2 - d[m] / 2 + j, w = he(h, b, p), k = s; n.modifiersData[i] = ((o = {})[k] = w, o.centerOffset = w - b, o) } }, effect: function (e) { var o = e.state, n = e.options, i = e.name, a = n.element, r = void 0 === a ? "[data-popper-arrow]" : a, t = n.padding, s = void 0 === t ? 0 : t; null != r && ("string" != typeof r || (r = o.elements.popper.querySelector(r))) && de(o.elements.popper, r) && (o.elements.arrow = r, o.modifiersData[i + "#persistent"] = { padding: ve("number" != typeof s ? s : fe(s, H)) }) }, requires: ["popperOffsets"], requiresIfExists: ["preventOverflow"] }, { name: "hide", enabled: !0, phase: "main", requiresIfExists: ["preventOverflow"], fn: function (e) { var o = e.state, n = e.name, i = o.rects.reference, a = o.rects.popper, r = o.modifiersData.preventOverflow, t = ye(o, { elementContext: "reference" }), s = ye(o, { altBoundary: !0 }), m = pe(t, i), c = pe(s, a, r), d = be(m), g = be(c); o.modifiersData[n] = { referenceClippingOffsets: m, popperEscapeOffsets: c, isReferenceHidden: d, hasPopperEscaped: g }, o.attributes.popper = Object.assign({}, o.attributes.popper, { "data-popper-reference-hidden": d, "data-popper-escaped": g }) } }] }), ke = function () { var e = { base: "https://twemoji.maxcdn.com/v/13.0.0/", ext: ".png", size: "72x72", className: "emoji", convert: { fromCodePoint: function (e) { var o = "string" == typeof e ? parseInt(e, 16) : e; if (o < 65536) return s(o); return s(55296 + ((o -= 65536) >> 10), 56320 + (1023 & o)) }, toCodePoint: j }, onerror: function () { this.parentNode && this.parentNode.replaceChild(m(this.alt, !1), this) }, parse: function (o, n) { n && "function" != typeof n || (n = { callback: n }); return ("string" == typeof o ? l : u)(o, { callback: n.callback || c, attributes: "function" == typeof n.attributes ? n.attributes : f, base: "string" == typeof n.base ? n.base : e.base, ext: n.ext || e.ext, size: n.folder || (i = n.size || e.size, "number" == typeof i ? i + "x" + i : i), className: n.className || e.className, onerror: n.onerror || e.onerror }); var i }, replace: y, test: function (e) { n.lastIndex = 0; var o = n.test(e); return n.lastIndex = 0, o } }, o = { "&": "&amp;", "<": "&lt;", ">": "&gt;", "'": "&#39;", '"': "&quot;" }, n = /(?:\ud83d\udc68\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc68\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc68\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc68\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc68\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffc-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffd-\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb\udffc\udffe\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffd\udfff]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc68\ud83c[\udffb-\udffe]|\ud83d\udc69\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83d\udc69\ud83c[\udffb-\udffe]|\ud83e\uddd1\ud83c\udffb\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffc\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffd\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udffe\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\ud83c\udfff\u200d\ud83e\udd1d\u200d\ud83e\uddd1\ud83c[\udffb-\udfff]|\ud83e\uddd1\u200d\ud83e\udd1d\u200d\ud83e\uddd1|\ud83d\udc6b\ud83c[\udffb-\udfff]|\ud83d\udc6c\ud83c[\udffb-\udfff]|\ud83d\udc6d\ud83c[\udffb-\udfff]|\ud83d[\udc6b-\udc6d])|(?:\ud83d[\udc68\udc69]|\ud83e\uddd1)(?:\ud83c[\udffb-\udfff])?\u200d(?:\u2695\ufe0f|\u2696\ufe0f|\u2708\ufe0f|\ud83c[\udf3e\udf73\udf7c\udf84\udf93\udfa4\udfa8\udfeb\udfed]|\ud83d[\udcbb\udcbc\udd27\udd2c\ude80\ude92]|\ud83e[\uddaf-\uddb3\uddbc\uddbd])|(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75]|\u26f9)((?:\ud83c[\udffb-\udfff]|\ufe0f)\u200d[\u2640\u2642]\ufe0f)|(?:\ud83c[\udfc3\udfc4\udfca]|\ud83d[\udc6e\udc70\udc71\udc73\udc77\udc81\udc82\udc86\udc87\ude45-\ude47\ude4b\ude4d\ude4e\udea3\udeb4-\udeb6]|\ud83e[\udd26\udd35\udd37-\udd39\udd3d\udd3e\uddb8\uddb9\uddcd-\uddcf\uddd6-\udddd])(?:\ud83c[\udffb-\udfff])?\u200d[\u2640\u2642]\ufe0f|(?:\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d\udc8b\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\u2764\ufe0f\u200d\ud83d\udc68|\ud83d\udc68\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc68\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc68\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\u2764\ufe0f\u200d\ud83d[\udc68\udc69]|\ud83d\udc69\u200d\ud83d\udc66\u200d\ud83d\udc66|\ud83d\udc69\u200d\ud83d\udc67\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83c\udff3\ufe0f\u200d\u26a7\ufe0f|\ud83c\udff3\ufe0f\u200d\ud83c\udf08|\ud83c\udff4\u200d\u2620\ufe0f|\ud83d\udc15\u200d\ud83e\uddba|\ud83d\udc3b\u200d\u2744\ufe0f|\ud83d\udc41\u200d\ud83d\udde8|\ud83d\udc68\u200d\ud83d[\udc66\udc67]|\ud83d\udc69\u200d\ud83d[\udc66\udc67]|\ud83d\udc6f\u200d\u2640\ufe0f|\ud83d\udc6f\u200d\u2642\ufe0f|\ud83e\udd3c\u200d\u2640\ufe0f|\ud83e\udd3c\u200d\u2642\ufe0f|\ud83e\uddde\u200d\u2640\ufe0f|\ud83e\uddde\u200d\u2642\ufe0f|\ud83e\udddf\u200d\u2640\ufe0f|\ud83e\udddf\u200d\u2642\ufe0f|\ud83d\udc08\u200d\u2b1b)|[#*0-9]\ufe0f?\u20e3|(?:[©®\u2122\u265f]\ufe0f)|(?:\ud83c[\udc04\udd70\udd71\udd7e\udd7f\ude02\ude1a\ude2f\ude37\udf21\udf24-\udf2c\udf36\udf7d\udf96\udf97\udf99-\udf9b\udf9e\udf9f\udfcd\udfce\udfd4-\udfdf\udff3\udff5\udff7]|\ud83d[\udc3f\udc41\udcfd\udd49\udd4a\udd6f\udd70\udd73\udd76-\udd79\udd87\udd8a-\udd8d\udda5\udda8\uddb1\uddb2\uddbc\uddc2-\uddc4\uddd1-\uddd3\udddc-\uddde\udde1\udde3\udde8\uddef\uddf3\uddfa\udecb\udecd-\udecf\udee0-\udee5\udee9\udef0\udef3]|[\u203c\u2049\u2139\u2194-\u2199\u21a9\u21aa\u231a\u231b\u2328\u23cf\u23ed-\u23ef\u23f1\u23f2\u23f8-\u23fa\u24c2\u25aa\u25ab\u25b6\u25c0\u25fb-\u25fe\u2600-\u2604\u260e\u2611\u2614\u2615\u2618\u2620\u2622\u2623\u2626\u262a\u262e\u262f\u2638-\u263a\u2640\u2642\u2648-\u2653\u2660\u2663\u2665\u2666\u2668\u267b\u267f\u2692-\u2697\u2699\u269b\u269c\u26a0\u26a1\u26a7\u26aa\u26ab\u26b0\u26b1\u26bd\u26be\u26c4\u26c5\u26c8\u26cf\u26d1\u26d3\u26d4\u26e9\u26ea\u26f0-\u26f5\u26f8\u26fa\u26fd\u2702\u2708\u2709\u270f\u2712\u2714\u2716\u271d\u2721\u2733\u2734\u2744\u2747\u2757\u2763\u2764\u27a1\u2934\u2935\u2b05-\u2b07\u2b1b\u2b1c\u2b50\u2b55\u3030\u303d\u3297\u3299])(?:\ufe0f|(?!\ufe0e))|(?:(?:\ud83c[\udfcb\udfcc]|\ud83d[\udd74\udd75\udd90]|[\u261d\u26f7\u26f9\u270c\u270d])(?:\ufe0f|(?!\ufe0e))|(?:\ud83c[\udf85\udfc2-\udfc4\udfc7\udfca]|\ud83d[\udc42\udc43\udc46-\udc50\udc66-\udc69\udc6e\udc70-\udc78\udc7c\udc81-\udc83\udc85-\udc87\udcaa\udd7a\udd95\udd96\ude45-\ude47\ude4b-\ude4f\udea3\udeb4-\udeb6\udec0\udecc]|\ud83e[\udd0c\udd0f\udd18-\udd1c\udd1e\udd1f\udd26\udd30-\udd39\udd3d\udd3e\udd77\uddb5\uddb6\uddb8\uddb9\uddbb\uddcd-\uddcf\uddd1-\udddd]|[\u270a\u270b]))(?:\ud83c[\udffb-\udfff])?|(?:\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc65\udb40\udc6e\udb40\udc67\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc73\udb40\udc63\udb40\udc74\udb40\udc7f|\ud83c\udff4\udb40\udc67\udb40\udc62\udb40\udc77\udb40\udc6c\udb40\udc73\udb40\udc7f|\ud83c\udde6\ud83c[\udde8-\uddec\uddee\uddf1\uddf2\uddf4\uddf6-\uddfa\uddfc\uddfd\uddff]|\ud83c\udde7\ud83c[\udde6\udde7\udde9-\uddef\uddf1-\uddf4\uddf6-\uddf9\uddfb\uddfc\uddfe\uddff]|\ud83c\udde8\ud83c[\udde6\udde8\udde9\uddeb-\uddee\uddf0-\uddf5\uddf7\uddfa-\uddff]|\ud83c\udde9\ud83c[\uddea\uddec\uddef\uddf0\uddf2\uddf4\uddff]|\ud83c\uddea\ud83c[\udde6\udde8\uddea\uddec\udded\uddf7-\uddfa]|\ud83c\uddeb\ud83c[\uddee-\uddf0\uddf2\uddf4\uddf7]|\ud83c\uddec\ud83c[\udde6\udde7\udde9-\uddee\uddf1-\uddf3\uddf5-\uddfa\uddfc\uddfe]|\ud83c\udded\ud83c[\uddf0\uddf2\uddf3\uddf7\uddf9\uddfa]|\ud83c\uddee\ud83c[\udde8-\uddea\uddf1-\uddf4\uddf6-\uddf9]|\ud83c\uddef\ud83c[\uddea\uddf2\uddf4\uddf5]|\ud83c\uddf0\ud83c[\uddea\uddec-\uddee\uddf2\uddf3\uddf5\uddf7\uddfc\uddfe\uddff]|\ud83c\uddf1\ud83c[\udde6-\udde8\uddee\uddf0\uddf7-\uddfb\uddfe]|\ud83c\uddf2\ud83c[\udde6\udde8-\udded\uddf0-\uddff]|\ud83c\uddf3\ud83c[\udde6\udde8\uddea-\uddec\uddee\uddf1\uddf4\uddf5\uddf7\uddfa\uddff]|\ud83c\uddf4\ud83c\uddf2|\ud83c\uddf5\ud83c[\udde6\uddea-\udded\uddf0-\uddf3\uddf7-\uddf9\uddfc\uddfe]|\ud83c\uddf6\ud83c\udde6|\ud83c\uddf7\ud83c[\uddea\uddf4\uddf8\uddfa\uddfc]|\ud83c\uddf8\ud83c[\udde6-\uddea\uddec-\uddf4\uddf7-\uddf9\uddfb\uddfd-\uddff]|\ud83c\uddf9\ud83c[\udde6\udde8\udde9\uddeb-\udded\uddef-\uddf4\uddf7\uddf9\uddfb\uddfc\uddff]|\ud83c\uddfa\ud83c[\udde6\uddec\uddf2\uddf3\uddf8\uddfe\uddff]|\ud83c\uddfb\ud83c[\udde6\udde8\uddea\uddec\uddee\uddf3\uddfa]|\ud83c\uddfc\ud83c[\uddeb\uddf8]|\ud83c\uddfd\ud83c\uddf0|\ud83c\uddfe\ud83c[\uddea\uddf9]|\ud83c\uddff\ud83c[\udde6\uddf2\uddfc]|\ud83c[\udccf\udd8e\udd91-\udd9a\udde6-\uddff\ude01\ude32-\ude36\ude38-\ude3a\ude50\ude51\udf00-\udf20\udf2d-\udf35\udf37-\udf7c\udf7e-\udf84\udf86-\udf93\udfa0-\udfc1\udfc5\udfc6\udfc8\udfc9\udfcf-\udfd3\udfe0-\udff0\udff4\udff8-\udfff]|\ud83d[\udc00-\udc3e\udc40\udc44\udc45\udc51-\udc65\udc6a\udc6f\udc79-\udc7b\udc7d-\udc80\udc84\udc88-\udca9\udcab-\udcfc\udcff-\udd3d\udd4b-\udd4e\udd50-\udd67\udda4\uddfb-\ude44\ude48-\ude4a\ude80-\udea2\udea4-\udeb3\udeb7-\udebf\udec1-\udec5\uded0-\uded2\uded5-\uded7\udeeb\udeec\udef4-\udefc\udfe0-\udfeb]|\ud83e[\udd0d\udd0e\udd10-\udd17\udd1d\udd20-\udd25\udd27-\udd2f\udd3a\udd3c\udd3f-\udd45\udd47-\udd76\udd78\udd7a-\uddb4\uddb7\uddba\uddbc-\uddcb\uddd0\uddde-\uddff\ude70-\ude74\ude78-\ude7a\ude80-\ude86\ude90-\udea8\udeb0-\udeb6\udec0-\udec2\uded0-\uded6]|[\u23e9-\u23ec\u23f0\u23f3\u267e\u26ce\u2705\u2728\u274c\u274e\u2753-\u2755\u2795-\u2797\u27b0\u27bf\ue50a])|\ufe0f/g, i = /\uFE0F/g, a = String.fromCharCode(8205), r = /[&<>'"]/g, t = /^(?:iframe|noframes|noscript|script|select|style|textarea)$/, s = String.fromCharCode; return e; function m(e, o) { return document.createTextNode(o ? e.replace(i, "") : e) } function c(e, o) { return "".concat(o.base, o.size, "/", e, o.ext) } function d(e, o) { for (var n, i, a = e.childNodes, r = a.length; r--;)3 === (i = (n = a[r]).nodeType) ? o.push(n) : 1 !== i || "ownerSVGElement" in n || t.test(n.nodeName.toLowerCase()) || d(n, o); return o } function g(e) { return j(e.indexOf(a) < 0 ? e.replace(i, "") : e) } function u(e, o) { for (var i, a, r, t, s, c, u, l, v, f, y, j, h, p = d(e, []), b = p.length; b--;) { for (r = !1, t = document.createDocumentFragment(), c = (s = p[b]).nodeValue, l = 0; u = n.exec(c);) { if ((v = u.index) !== l && t.appendChild(m(c.slice(l, v), !0)), j = g(y = u[0]), l = v + y.length, h = o.callback(j, o), j && h) { for (a in (f = new Image).onerror = o.onerror, f.setAttribute("draggable", "false"), i = o.attributes(y, j)) i.hasOwnProperty(a) && 0 !== a.indexOf("on") && !f.hasAttribute(a) && f.setAttribute(a, i[a]); f.className = o.className, f.alt = y, f.src = h, r = !0, t.appendChild(f) } f || t.appendChild(m(y, !1)), f = null } r && (l < c.length && t.appendChild(m(c.slice(l), !0)), s.parentNode.replaceChild(t, s)) } return e } function l(e, o) { return y(e, (function (e) { var n, i, a = e, t = g(e), s = o.callback(t, o); if (t && s) { for (i in a = "<img ".concat('class="', o.className, '" ', 'draggable="false" ', 'alt="', e, '"', ' src="', s, '"'), n = o.attributes(e, t)) n.hasOwnProperty(i) && 0 !== i.indexOf("on") && -1 === a.indexOf(" " + i + "=") && (a = a.concat(" ", i, '="', n[i].replace(r, v), '"')); a = a.concat("/>") } return a })) } function v(e) { return o[e] } function f() { return null } function y(e, o) { return String(e).replace(n, o) } function j(e, o) { for (var n = [], i = 0, a = 0, r = 0; r < e.length;)i = e.charCodeAt(r++), a ? (n.push((65536 + (a - 55296 << 10) + (i - 56320)).toString(16)), a = 0) : 55296 <= i && i <= 56319 ? a = i : n.push(i.toString(16)); return n.join(o || "-") } }(), xe = { categories: ["smileys", "people", "animals", "food", "travel", "activities", "objects", "symbols", "flags"], emoji: [{ emoji: "😀", category: 0, name: "grinning face", version: "1.0" }, { emoji: "😃", category: 0, name: "grinning face with big eyes", version: "1.0" }, { emoji: "😄", category: 0, name: "grinning face with smiling eyes", version: "1.0" }, { emoji: "😁", category: 0, name: "beaming face with smiling eyes", version: "1.0" }, { emoji: "😆", category: 0, name: "grinning squinting face", version: "1.0" }, { emoji: "😅", category: 0, name: "grinning face with sweat", version: "1.0" }, { emoji: "🤣", category: 0, name: "rolling on the floor laughing", version: "3.0" }, { emoji: "😂", category: 0, name: "face with tears of joy", version: "1.0" }, { emoji: "🙂", category: 0, name: "slightly smiling face", version: "1.0" }, { emoji: "🙃", category: 0, name: "upside-down face", version: "1.0" }, { emoji: "😉", category: 0, name: "winking face", version: "1.0" }, { emoji: "😊", category: 0, name: "smiling face with smiling eyes", version: "1.0" }, { emoji: "😇", category: 0, name: "smiling face with halo", version: "1.0" }, { emoji: "🥰", category: 0, name: "smiling face with hearts", version: "11.0" }, { emoji: "😍", category: 0, name: "smiling face with heart-eyes", version: "1.0" }, { emoji: "🤩", category: 0, name: "star-struck", version: "5.0" }, { emoji: "😘", category: 0, name: "face blowing a kiss", version: "1.0" }, { emoji: "😗", category: 0, name: "kissing face", version: "1.0" }, { emoji: "☺️", category: 0, name: "smiling face", version: "1.0" }, { emoji: "😚", category: 0, name: "kissing face with closed eyes", version: "1.0" }, { emoji: "😙", category: 0, name: "kissing face with smiling eyes", version: "1.0" }, { emoji: "🥲", category: 0, name: "smiling face with tear", version: "13.0" }, { emoji: "😋", category: 0, name: "face savoring food", version: "1.0" }, { emoji: "😛", category: 0, name: "face with tongue", version: "1.0" }, { emoji: "😜", category: 0, name: "winking face with tongue", version: "1.0" }, { emoji: "🤪", category: 0, name: "zany face", version: "5.0" }, { emoji: "😝", category: 0, name: "squinting face with tongue", version: "1.0" }, { emoji: "🤑", category: 0, name: "money-mouth face", version: "1.0" }, { emoji: "🤗", category: 0, name: "hugging face", version: "1.0" }, { emoji: "🤭", category: 0, name: "face with hand over mouth", version: "5.0" }, { emoji: "🤫", category: 0, name: "shushing face", version: "5.0" }, { emoji: "🤔", category: 0, name: "thinking face", version: "1.0" }, { emoji: "🤐", category: 0, name: "zipper-mouth face", version: "1.0" }, { emoji: "🤨", category: 0, name: "face with raised eyebrow", version: "5.0" }, { emoji: "😐", category: 0, name: "neutral face", version: "1.0" }, { emoji: "😑", category: 0, name: "expressionless face", version: "1.0" }, { emoji: "😶", category: 0, name: "face without mouth", version: "1.0" }, { emoji: "😏", category: 0, name: "smirking face", version: "1.0" }, { emoji: "😒", category: 0, name: "unamused face", version: "1.0" }, { emoji: "🙄", category: 0, name: "face with rolling eyes", version: "1.0" }, { emoji: "😬", category: 0, name: "grimacing face", version: "1.0" }, { emoji: "🤥", category: 0, name: "lying face", version: "3.0" }, { emoji: "😌", category: 0, name: "relieved face", version: "1.0" }, { emoji: "😔", category: 0, name: "pensive face", version: "1.0" }, { emoji: "😪", category: 0, name: "sleepy face", version: "1.0" }, { emoji: "🤤", category: 0, name: "drooling face", version: "3.0" }, { emoji: "😴", category: 0, name: "sleeping face", version: "1.0" }, { emoji: "😷", category: 0, name: "face with medical mask", version: "1.0" }, { emoji: "🤒", category: 0, name: "face with thermometer", version: "1.0" }, { emoji: "🤕", category: 0, name: "face with head-bandage", version: "1.0" }, { emoji: "🤢", category: 0, name: "nauseated face", version: "3.0" }, { emoji: "🤮", category: 0, name: "face vomiting", version: "5.0" }, { emoji: "🤧", category: 0, name: "sneezing face", version: "3.0" }, { emoji: "🥵", category: 0, name: "hot face", version: "11.0" }, { emoji: "🥶", category: 0, name: "cold face", version: "11.0" }, { emoji: "🥴", category: 0, name: "woozy face", version: "11.0" }, { emoji: "😵", category: 0, name: "dizzy face", version: "1.0" }, { emoji: "🤯", category: 0, name: "exploding head", version: "5.0" }, { emoji: "🤠", category: 0, name: "cowboy hat face", version: "3.0" }, { emoji: "🥳", category: 0, name: "partying face", version: "11.0" }, { emoji: "🥸", category: 0, name: "disguised face", version: "13.0" }, { emoji: "😎", category: 0, name: "smiling face with sunglasses", version: "1.0" }, { emoji: "🤓", category: 0, name: "nerd face", version: "1.0" }, { emoji: "🧐", category: 0, name: "face with monocle", version: "5.0" }, { emoji: "😕", category: 0, name: "confused face", version: "1.0" }, { emoji: "😟", category: 0, name: "worried face", version: "1.0" }, { emoji: "🙁", category: 0, name: "slightly frowning face", version: "1.0" }, { emoji: "☹️", category: 0, name: "frowning face", version: "1.0" }, { emoji: "😮", category: 0, name: "face with open mouth", version: "1.0" }, { emoji: "😯", category: 0, name: "hushed face", version: "1.0" }, { emoji: "😲", category: 0, name: "astonished face", version: "1.0" }, { emoji: "😳", category: 0, name: "flushed face", version: "1.0" }, { emoji: "🥺", category: 0, name: "pleading face", version: "11.0" }, { emoji: "😦", category: 0, name: "frowning face with open mouth", version: "1.0" }, { emoji: "😧", category: 0, name: "anguished face", version: "1.0" }, { emoji: "😨", category: 0, name: "fearful face", version: "1.0" }, { emoji: "😰", category: 0, name: "anxious face with sweat", version: "1.0" }, { emoji: "😥", category: 0, name: "sad but relieved face", version: "1.0" }, { emoji: "😢", category: 0, name: "crying face", version: "1.0" }, { emoji: "😭", category: 0, name: "loudly crying face", version: "1.0" }, { emoji: "😱", category: 0, name: "face screaming in fear", version: "1.0" }, { emoji: "😖", category: 0, name: "confounded face", version: "1.0" }, { emoji: "😣", category: 0, name: "persevering face", version: "1.0" }, { emoji: "😞", category: 0, name: "disappointed face", version: "1.0" }, { emoji: "😓", category: 0, name: "downcast face with sweat", version: "1.0" }, { emoji: "😩", category: 0, name: "weary face", version: "1.0" }, { emoji: "😫", category: 0, name: "tired face", version: "1.0" }, { emoji: "🥱", category: 0, name: "yawning face", version: "12.0" }, { emoji: "😤", category: 0, name: "face with steam from nose", version: "1.0" }, { emoji: "😡", category: 0, name: "pouting face", version: "1.0" }, { emoji: "😠", category: 0, name: "angry face", version: "1.0" }, { emoji: "🤬", category: 0, name: "face with symbols on mouth", version: "5.0" }, { emoji: "😈", category: 0, name: "smiling face with horns", version: "1.0" }, { emoji: "👿", category: 0, name: "angry face with horns", version: "1.0" }, { emoji: "💀", category: 0, name: "skull", version: "1.0" }, { emoji: "☠️", category: 0, name: "skull and crossbones", version: "1.0" }, { emoji: "💩", category: 0, name: "pile of poo", version: "1.0" }, { emoji: "🤡", category: 0, name: "clown face", version: "3.0" }, { emoji: "👹", category: 0, name: "ogre", version: "1.0" }, { emoji: "👺", category: 0, name: "goblin", version: "1.0" }, { emoji: "👻", category: 0, name: "ghost", version: "1.0" }, { emoji: "👽", category: 0, name: "alien", version: "1.0" }, { emoji: "👾", category: 0, name: "alien monster", version: "1.0" }, { emoji: "🤖", category: 0, name: "robot", version: "1.0" }, { emoji: "😺", category: 0, name: "grinning cat", version: "1.0" }, { emoji: "😸", category: 0, name: "grinning cat with smiling eyes", version: "1.0" }, { emoji: "😹", category: 0, name: "cat with tears of joy", version: "1.0" }, { emoji: "😻", category: 0, name: "smiling cat with heart-eyes", version: "1.0" }, { emoji: "😼", category: 0, name: "cat with wry smile", version: "1.0" }, { emoji: "😽", category: 0, name: "kissing cat", version: "1.0" }, { emoji: "🙀", category: 0, name: "weary cat", version: "1.0" }, { emoji: "😿", category: 0, name: "crying cat", version: "1.0" }, { emoji: "😾", category: 0, name: "pouting cat", version: "1.0" }, { emoji: "🙈", category: 0, name: "see-no-evil monkey", version: "1.0" }, { emoji: "🙉", category: 0, name: "hear-no-evil monkey", version: "1.0" }, { emoji: "🙊", category: 0, name: "speak-no-evil monkey", version: "1.0" }, { emoji: "💋", category: 0, name: "kiss mark", version: "1.0" }, { emoji: "💌", category: 0, name: "love letter", version: "1.0" }, { emoji: "💘", category: 0, name: "heart with arrow", version: "1.0" }, { emoji: "💝", category: 0, name: "heart with ribbon", version: "1.0" }, { emoji: "💖", category: 0, name: "sparkling heart", version: "1.0" }, { emoji: "💗", category: 0, name: "growing heart", version: "1.0" }, { emoji: "💓", category: 0, name: "beating heart", version: "1.0" }, { emoji: "💞", category: 0, name: "revolving hearts", version: "1.0" }, { emoji: "💕", category: 0, name: "two hearts", version: "1.0" }, { emoji: "💟", category: 0, name: "heart decoration", version: "1.0" }, { emoji: "❣️", category: 0, name: "heart exclamation", version: "1.0" }, { emoji: "💔", category: 0, name: "broken heart", version: "1.0" }, { emoji: "❤️", category: 0, name: "red heart", version: "1.0" }, { emoji: "🧡", category: 0, name: "orange heart", version: "5.0" }, { emoji: "💛", category: 0, name: "yellow heart", version: "1.0" }, { emoji: "💚", category: 0, name: "green heart", version: "1.0" }, { emoji: "💙", category: 0, name: "blue heart", version: "1.0" }, { emoji: "💜", category: 0, name: "purple heart", version: "1.0" }, { emoji: "🤎", category: 0, name: "brown heart", version: "12.0" }, { emoji: "🖤", category: 0, name: "black heart", version: "3.0" }, { emoji: "🤍", category: 0, name: "white heart", version: "12.0" }, { emoji: "💯", category: 0, name: "hundred points", version: "1.0" }, { emoji: "💢", category: 0, name: "anger symbol", version: "1.0" }, { emoji: "💥", category: 0, name: "collision", version: "1.0" }, { emoji: "💫", category: 0, name: "dizzy", version: "1.0" }, { emoji: "💦", category: 0, name: "sweat droplets", version: "1.0" }, { emoji: "💨", category: 0, name: "dashing away", version: "1.0" }, { emoji: "🕳️", category: 0, name: "hole", version: "1.0" }, { emoji: "💣", category: 0, name: "bomb", version: "1.0" }, { emoji: "💬", category: 0, name: "speech balloon", version: "1.0" }, { emoji: "👁️‍🗨️", category: 0, name: "eye in speech bubble", version: "2.0" }, { emoji: "🗨️", category: 0, name: "left speech bubble", version: "2.0" }, { emoji: "🗯️", category: 0, name: "right anger bubble", version: "1.0" }, { emoji: "💭", category: 0, name: "thought balloon", version: "1.0" }, { emoji: "💤", category: 0, name: "zzz", version: "1.0" }, { emoji: "👋", category: 1, name: "waving hand", variations: ["👋🏻", "👋🏼", "👋🏽", "👋🏾", "👋🏿"], version: "1.0" }, { emoji: "🤚", category: 1, name: "raised back of hand", variations: ["🤚🏻", "🤚🏼", "🤚🏽", "🤚🏾", "🤚🏿"], version: "3.0" }, { emoji: "🖐️", category: 1, name: "hand with fingers splayed", variations: ["🖐🏻", "🖐🏼", "🖐🏽", "🖐🏾", "🖐🏿"], version: "1.0" }, { emoji: "✋", category: 1, name: "raised hand", variations: ["✋🏻", "✋🏼", "✋🏽", "✋🏾", "✋🏿"], version: "1.0" }, { emoji: "🖖", category: 1, name: "vulcan salute", variations: ["🖖🏻", "🖖🏼", "🖖🏽", "🖖🏾", "🖖🏿"], version: "1.0" }, { emoji: "👌", category: 1, name: "OK hand", variations: ["👌🏻", "👌🏼", "👌🏽", "👌🏾", "👌🏿"], version: "1.0" }, { emoji: "🤌", category: 1, name: "pinched fingers", variations: ["🤌🏻", "🤌🏼", "🤌🏽", "🤌🏾", "🤌🏿"], version: "13.0" }, { emoji: "🤏", category: 1, name: "pinching hand", variations: ["🤏🏻", "🤏🏼", "🤏🏽", "🤏🏾", "🤏🏿"], version: "12.0" }, { emoji: "✌️", category: 1, name: "victory hand", variations: ["✌🏻", "✌🏼", "✌🏽", "✌🏾", "✌🏿"], version: "1.0" }, { emoji: "🤞", category: 1, name: "crossed fingers", variations: ["🤞🏻", "🤞🏼", "🤞🏽", "🤞🏾", "🤞🏿"], version: "3.0" }, { emoji: "🤟", category: 1, name: "love-you gesture", variations: ["🤟🏻", "🤟🏼", "🤟🏽", "🤟🏾", "🤟🏿"], version: "5.0" }, { emoji: "🤘", category: 1, name: "sign of the horns", variations: ["🤘🏻", "🤘🏼", "🤘🏽", "🤘🏾", "🤘🏿"], version: "1.0" }, { emoji: "🤙", category: 1, name: "call me hand", variations: ["🤙🏻", "🤙🏼", "🤙🏽", "🤙🏾", "🤙🏿"], version: "3.0" }, { emoji: "👈", category: 1, name: "backhand index pointing left", variations: ["👈🏻", "👈🏼", "👈🏽", "👈🏾", "👈🏿"], version: "1.0" }, { emoji: "👉", category: 1, name: "backhand index pointing right", variations: ["👉🏻", "👉🏼", "👉🏽", "👉🏾", "👉🏿"], version: "1.0" }, { emoji: "👆", category: 1, name: "backhand index pointing up", variations: ["👆🏻", "👆🏼", "👆🏽", "👆🏾", "👆🏿"], version: "1.0" }, { emoji: "🖕", category: 1, name: "middle finger", variations: ["🖕🏻", "🖕🏼", "🖕🏽", "🖕🏾", "🖕🏿"], version: "1.0" }, { emoji: "👇", category: 1, name: "backhand index pointing down", variations: ["👇🏻", "👇🏼", "👇🏽", "👇🏾", "👇🏿"], version: "1.0" }, { emoji: "☝️", category: 1, name: "index pointing up", variations: ["☝🏻", "☝🏼", "☝🏽", "☝🏾", "☝🏿"], version: "1.0" }, { emoji: "👍", category: 1, name: "thumbs up", variations: ["👍🏻", "👍🏼", "👍🏽", "👍🏾", "👍🏿"], version: "1.0" }, { emoji: "👎", category: 1, name: "thumbs down", variations: ["👎🏻", "👎🏼", "👎🏽", "👎🏾", "👎🏿"], version: "1.0" }, { emoji: "✊", category: 1, name: "raised fist", variations: ["✊🏻", "✊🏼", "✊🏽", "✊🏾", "✊🏿"], version: "1.0" }, { emoji: "👊", category: 1, name: "oncoming fist", variations: ["👊🏻", "👊🏼", "👊🏽", "👊🏾", "👊🏿"], version: "1.0" }, { emoji: "🤛", category: 1, name: "left-facing fist", variations: ["🤛🏻", "🤛🏼", "🤛🏽", "🤛🏾", "🤛🏿"], version: "3.0" }, { emoji: "🤜", category: 1, name: "right-facing fist", variations: ["🤜🏻", "🤜🏼", "🤜🏽", "🤜🏾", "🤜🏿"], version: "3.0" }, { emoji: "👏", category: 1, name: "clapping hands", variations: ["👏🏻", "👏🏼", "👏🏽", "👏🏾", "👏🏿"], version: "1.0" }, { emoji: "🙌", category: 1, name: "raising hands", variations: ["🙌🏻", "🙌🏼", "🙌🏽", "🙌🏾", "🙌🏿"], version: "1.0" }, { emoji: "👐", category: 1, name: "open hands", variations: ["👐🏻", "👐🏼", "👐🏽", "👐🏾", "👐🏿"], version: "1.0" }, { emoji: "🤲", category: 1, name: "palms up together", variations: ["🤲🏻", "🤲🏼", "🤲🏽", "🤲🏾", "🤲🏿"], version: "5.0" }, { emoji: "🤝", category: 1, name: "handshake", version: "3.0" }, { emoji: "🙏", category: 1, name: "folded hands", variations: ["🙏🏻", "🙏🏼", "🙏🏽", "🙏🏾", "🙏🏿"], version: "1.0" }, { emoji: "✍️", category: 1, name: "writing hand", variations: ["✍🏻", "✍🏼", "✍🏽", "✍🏾", "✍🏿"], version: "1.0" }, { emoji: "💅", category: 1, name: "nail polish", variations: ["💅🏻", "💅🏼", "💅🏽", "💅🏾", "💅🏿"], version: "1.0" }, { emoji: "🤳", category: 1, name: "selfie", variations: ["🤳🏻", "🤳🏼", "🤳🏽", "🤳🏾", "🤳🏿"], version: "3.0" }, { emoji: "💪", category: 1, name: "flexed biceps", variations: ["💪🏻", "💪🏼", "💪🏽", "💪🏾", "💪🏿"], version: "1.0" }, { emoji: "🦾", category: 1, name: "mechanical arm", version: "12.0" }, { emoji: "🦿", category: 1, name: "mechanical leg", version: "12.0" }, { emoji: "🦵", category: 1, name: "leg", variations: ["🦵🏻", "🦵🏼", "🦵🏽", "🦵🏾", "🦵🏿"], version: "11.0" }, { emoji: "🦶", category: 1, name: "foot", variations: ["🦶🏻", "🦶🏼", "🦶🏽", "🦶🏾", "🦶🏿"], version: "11.0" }, { emoji: "👂", category: 1, name: "ear", variations: ["👂🏻", "👂🏼", "👂🏽", "👂🏾", "👂🏿"], version: "1.0" }, { emoji: "🦻", category: 1, name: "ear with hearing aid", variations: ["🦻🏻", "🦻🏼", "🦻🏽", "🦻🏾", "🦻🏿"], version: "12.0" }, { emoji: "👃", category: 1, name: "nose", variations: ["👃🏻", "👃🏼", "👃🏽", "👃🏾", "👃🏿"], version: "1.0" }, { emoji: "🧠", category: 1, name: "brain", version: "5.0" }, { emoji: "🫀", category: 1, name: "anatomical heart", version: "13.0" }, { emoji: "🫁", category: 1, name: "lungs", version: "13.0" }, { emoji: "🦷", category: 1, name: "tooth", version: "11.0" }, { emoji: "🦴", category: 1, name: "bone", version: "11.0" }, { emoji: "👀", category: 1, name: "eyes", version: "1.0" }, { emoji: "👁️", category: 1, name: "eye", version: "1.0" }, { emoji: "👅", category: 1, name: "tongue", version: "1.0" }, { emoji: "👄", category: 1, name: "mouth", version: "1.0" }, { emoji: "👶", category: 1, name: "baby", variations: ["👶🏻", "👶🏼", "👶🏽", "👶🏾", "👶🏿"], version: "1.0" }, { emoji: "🧒", category: 1, name: "child", variations: ["🧒🏻", "🧒🏼", "🧒🏽", "🧒🏾", "🧒🏿"], version: "5.0" }, { emoji: "👦", category: 1, name: "boy", variations: ["👦🏻", "👦🏼", "👦🏽", "👦🏾", "👦🏿"], version: "1.0" }, { emoji: "👧", category: 1, name: "girl", variations: ["👧🏻", "👧🏼", "👧🏽", "👧🏾", "👧🏿"], version: "1.0" }, { emoji: "🧑", category: 1, name: "person", variations: ["🧑🏻", "🧑🏼", "🧑🏽", "🧑🏾", "🧑🏿"], version: "5.0" }, { emoji: "👱", category: 1, name: "person with blond hair", variations: ["👱🏻", "👱🏼", "👱🏽", "👱🏾", "👱🏿"], version: "1.0" }, { emoji: "👨", category: 1, name: "man", variations: ["👨🏻", "👨🏼", "👨🏽", "👨🏾", "👨🏿"], version: "1.0" }, { emoji: "🧔", category: 1, name: "man with beard", variations: ["🧔🏻", "🧔🏼", "🧔🏽", "🧔🏾", "🧔🏿"], version: "5.0" }, { emoji: "👨‍🦰", category: 1, name: "man with red hair", variations: ["👨🏻‍🦰", "👨🏼‍🦰", "👨🏽‍🦰", "👨🏾‍🦰", "👨🏿‍🦰"], version: "11.0" }, { emoji: "👨‍🦱", category: 1, name: "man with curly hair", variations: ["👨🏻‍🦱", "👨🏼‍🦱", "👨🏽‍🦱", "👨🏾‍🦱", "👨🏿‍🦱"], version: "11.0" }, { emoji: "👨‍🦳", category: 1, name: "man with white hair", variations: ["👨🏻‍🦳", "👨🏼‍🦳", "👨🏽‍🦳", "👨🏾‍🦳", "👨🏿‍🦳"], version: "11.0" }, { emoji: "👨‍🦲", category: 1, name: "man with no hair", variations: ["👨🏻‍🦲", "👨🏼‍🦲", "👨🏽‍🦲", "👨🏾‍🦲", "👨🏿‍🦲"], version: "11.0" }, { emoji: "👩", category: 1, name: "woman", variations: ["👩🏻", "👩🏼", "👩🏽", "👩🏾", "👩🏿"], version: "1.0" }, { emoji: "👩‍🦰", category: 1, name: "woman with red hair", variations: ["👩🏻‍🦰", "👩🏼‍🦰", "👩🏽‍🦰", "👩🏾‍🦰", "👩🏿‍🦰"], version: "11.0" }, { emoji: "🧑‍🦰", category: 1, name: "person with red hair", variations: ["🧑🏻‍🦰", "🧑🏼‍🦰", "🧑🏽‍🦰", "🧑🏾‍🦰", "🧑🏿‍🦰"], version: "12.1" }, { emoji: "👩‍🦱", category: 1, name: "woman with curly hair", variations: ["👩🏻‍🦱", "👩🏼‍🦱", "👩🏽‍🦱", "👩🏾‍🦱", "👩🏿‍🦱"], version: "11.0" }, { emoji: "🧑‍🦱", category: 1, name: "person with curly hair", variations: ["🧑🏻‍🦱", "🧑🏼‍🦱", "🧑🏽‍🦱", "🧑🏾‍🦱", "🧑🏿‍🦱"], version: "12.1" }, { emoji: "👩‍🦳", category: 1, name: "woman with white hair", variations: ["👩🏻‍🦳", "👩🏼‍🦳", "👩🏽‍🦳", "👩🏾‍🦳", "👩🏿‍🦳"], version: "11.0" }, { emoji: "🧑‍🦳", category: 1, name: "person with white hair", variations: ["🧑🏻‍🦳", "🧑🏼‍🦳", "🧑🏽‍🦳", "🧑🏾‍🦳", "🧑🏿‍🦳"], version: "12.1" }, { emoji: "👩‍🦲", category: 1, name: "woman with no hair", variations: ["👩🏻‍🦲", "👩🏼‍🦲", "👩🏽‍🦲", "👩🏾‍🦲", "👩🏿‍🦲"], version: "11.0" }, { emoji: "🧑‍🦲", category: 1, name: "person with no hair", variations: ["🧑🏻‍🦲", "🧑🏼‍🦲", "🧑🏽‍🦲", "🧑🏾‍🦲", "🧑🏿‍🦲"], version: "12.1" }, { emoji: "👱‍♀️", category: 1, name: "woman with blond hair", variations: ["👱🏻‍♀️", "👱🏼‍♀️", "👱🏽‍♀️", "👱🏾‍♀️", "👱🏿‍♀️"], version: "4.0" }, { emoji: "👱‍♂️", category: 1, name: "man with blond hair", variations: ["👱🏻‍♂️", "👱🏼‍♂️", "👱🏽‍♂️", "👱🏾‍♂️", "👱🏿‍♂️"], version: "4.0" }, { emoji: "🧓", category: 1, name: "older person", variations: ["🧓🏻", "🧓🏼", "🧓🏽", "🧓🏾", "🧓🏿"], version: "5.0" }, { emoji: "👴", category: 1, name: "old man", variations: ["👴🏻", "👴🏼", "👴🏽", "👴🏾", "👴🏿"], version: "1.0" }, { emoji: "👵", category: 1, name: "old woman", variations: ["👵🏻", "👵🏼", "👵🏽", "👵🏾", "👵🏿"], version: "1.0" }, { emoji: "🙍", category: 1, name: "person frowning", variations: ["🙍🏻", "🙍🏼", "🙍🏽", "🙍🏾", "🙍🏿"], version: "1.0" }, { emoji: "🙍‍♂️", category: 1, name: "man frowning", variations: ["🙍🏻‍♂️", "🙍🏼‍♂️", "🙍🏽‍♂️", "🙍🏾‍♂️", "🙍🏿‍♂️"], version: "4.0" }, { emoji: "🙍‍♀️", category: 1, name: "woman frowning", variations: ["🙍🏻‍♀️", "🙍🏼‍♀️", "🙍🏽‍♀️", "🙍🏾‍♀️", "🙍🏿‍♀️"], version: "4.0" }, { emoji: "🙎", category: 1, name: "person pouting", variations: ["🙎🏻", "🙎🏼", "🙎🏽", "🙎🏾", "🙎🏿"], version: "1.0" }, { emoji: "🙎‍♂️", category: 1, name: "man pouting", variations: ["🙎🏻‍♂️", "🙎🏼‍♂️", "🙎🏽‍♂️", "🙎🏾‍♂️", "🙎🏿‍♂️"], version: "4.0" }, { emoji: "🙎‍♀️", category: 1, name: "woman pouting", variations: ["🙎🏻‍♀️", "🙎🏼‍♀️", "🙎🏽‍♀️", "🙎🏾‍♀️", "🙎🏿‍♀️"], version: "4.0" }, { emoji: "🙅", category: 1, name: "person gesturing NO", variations: ["🙅🏻", "🙅🏼", "🙅🏽", "🙅🏾", "🙅🏿"], version: "1.0" }, { emoji: "🙅‍♂️", category: 1, name: "man gesturing NO", variations: ["🙅🏻‍♂️", "🙅🏼‍♂️", "🙅🏽‍♂️", "🙅🏾‍♂️", "🙅🏿‍♂️"], version: "4.0" }, { emoji: "🙅‍♀️", category: 1, name: "woman gesturing NO", variations: ["🙅🏻‍♀️", "🙅🏼‍♀️", "🙅🏽‍♀️", "🙅🏾‍♀️", "🙅🏿‍♀️"], version: "4.0" }, { emoji: "🙆", category: 1, name: "person gesturing OK", variations: ["🙆🏻", "🙆🏼", "🙆🏽", "🙆🏾", "🙆🏿"], version: "1.0" }, { emoji: "🙆‍♂️", category: 1, name: "man gesturing OK", variations: ["🙆🏻‍♂️", "🙆🏼‍♂️", "🙆🏽‍♂️", "🙆🏾‍♂️", "🙆🏿‍♂️"], version: "4.0" }, { emoji: "🙆‍♀️", category: 1, name: "woman gesturing OK", variations: ["🙆🏻‍♀️", "🙆🏼‍♀️", "🙆🏽‍♀️", "🙆🏾‍♀️", "🙆🏿‍♀️"], version: "4.0" }, { emoji: "💁", category: 1, name: "person tipping hand", variations: ["💁🏻", "💁🏼", "💁🏽", "💁🏾", "💁🏿"], version: "1.0" }, { emoji: "💁‍♂️", category: 1, name: "man tipping hand", variations: ["💁🏻‍♂️", "💁🏼‍♂️", "💁🏽‍♂️", "💁🏾‍♂️", "💁🏿‍♂️"], version: "4.0" }, { emoji: "💁‍♀️", category: 1, name: "woman tipping hand", variations: ["💁🏻‍♀️", "💁🏼‍♀️", "💁🏽‍♀️", "💁🏾‍♀️", "💁🏿‍♀️"], version: "4.0" }, { emoji: "🙋", category: 1, name: "person raising hand", variations: ["🙋🏻", "🙋🏼", "🙋🏽", "🙋🏾", "🙋🏿"], version: "1.0" }, { emoji: "🙋‍♂️", category: 1, name: "man raising hand", variations: ["🙋🏻‍♂️", "🙋🏼‍♂️", "🙋🏽‍♂️", "🙋🏾‍♂️", "🙋🏿‍♂️"], version: "4.0" }, { emoji: "🙋‍♀️", category: 1, name: "woman raising hand", variations: ["🙋🏻‍♀️", "🙋🏼‍♀️", "🙋🏽‍♀️", "🙋🏾‍♀️", "🙋🏿‍♀️"], version: "4.0" }, { emoji: "🧏", category: 1, name: "deaf person", variations: ["🧏🏻", "🧏🏼", "🧏🏽", "🧏🏾", "🧏🏿"], version: "12.0" }, { emoji: "🧏‍♂️", category: 1, name: "deaf man", variations: ["🧏🏻‍♂️", "🧏🏼‍♂️", "🧏🏽‍♂️", "🧏🏾‍♂️", "🧏🏿‍♂️"], version: "12.0" }, { emoji: "🧏‍♀️", category: 1, name: "deaf woman", variations: ["🧏🏻‍♀️", "🧏🏼‍♀️", "🧏🏽‍♀️", "🧏🏾‍♀️", "🧏🏿‍♀️"], version: "12.0" }, { emoji: "🙇", category: 1, name: "person bowing", variations: ["🙇🏻", "🙇🏼", "🙇🏽", "🙇🏾", "🙇🏿"], version: "1.0" }, { emoji: "🙇‍♂️", category: 1, name: "man bowing", variations: ["🙇🏻‍♂️", "🙇🏼‍♂️", "🙇🏽‍♂️", "🙇🏾‍♂️", "🙇🏿‍♂️"], version: "4.0" }, { emoji: "🙇‍♀️", category: 1, name: "woman bowing", variations: ["🙇🏻‍♀️", "🙇🏼‍♀️", "🙇🏽‍♀️", "🙇🏾‍♀️", "🙇🏿‍♀️"], version: "4.0" }, { emoji: "🤦", category: 1, name: "person facepalming", variations: ["🤦🏻", "🤦🏼", "🤦🏽", "🤦🏾", "🤦🏿"], version: "3.0" }, { emoji: "🤦‍♂️", category: 1, name: "man facepalming", variations: ["🤦🏻‍♂️", "🤦🏼‍♂️", "🤦🏽‍♂️", "🤦🏾‍♂️", "🤦🏿‍♂️"], version: "4.0" }, { emoji: "🤦‍♀️", category: 1, name: "woman facepalming", variations: ["🤦🏻‍♀️", "🤦🏼‍♀️", "🤦🏽‍♀️", "🤦🏾‍♀️", "🤦🏿‍♀️"], version: "4.0" }, { emoji: "🤷", category: 1, name: "person shrugging", variations: ["🤷🏻", "🤷🏼", "🤷🏽", "🤷🏾", "🤷🏿"], version: "3.0" }, { emoji: "🤷‍♂️", category: 1, name: "man shrugging", variations: ["🤷🏻‍♂️", "🤷🏼‍♂️", "🤷🏽‍♂️", "🤷🏾‍♂️", "🤷🏿‍♂️"], version: "4.0" }, { emoji: "🤷‍♀️", category: 1, name: "woman shrugging", variations: ["🤷🏻‍♀️", "🤷🏼‍♀️", "🤷🏽‍♀️", "🤷🏾‍♀️", "🤷🏿‍♀️"], version: "4.0" }, { emoji: "🧑‍⚕️", category: 1, name: "health worker", variations: ["🧑🏻‍⚕️", "🧑🏼‍⚕️", "🧑🏽‍⚕️", "🧑🏾‍⚕️", "🧑🏿‍⚕️"], version: "12.1" }, { emoji: "👨‍⚕️", category: 1, name: "man health worker", variations: ["👨🏻‍⚕️", "👨🏼‍⚕️", "👨🏽‍⚕️", "👨🏾‍⚕️", "👨🏿‍⚕️"], version: "4.0" }, { emoji: "👩‍⚕️", category: 1, name: "woman health worker", variations: ["👩🏻‍⚕️", "👩🏼‍⚕️", "👩🏽‍⚕️", "👩🏾‍⚕️", "👩🏿‍⚕️"], version: "4.0" }, { emoji: "🧑‍🎓", category: 1, name: "student", variations: ["🧑🏻‍🎓", "🧑🏼‍🎓", "🧑🏽‍🎓", "🧑🏾‍🎓", "🧑🏿‍🎓"], version: "12.1" }, { emoji: "👨‍🎓", category: 1, name: "man student", variations: ["👨🏻‍🎓", "👨🏼‍🎓", "👨🏽‍🎓", "👨🏾‍🎓", "👨🏿‍🎓"], version: "4.0" }, { emoji: "👩‍🎓", category: 1, name: "woman student", variations: ["👩🏻‍🎓", "👩🏼‍🎓", "👩🏽‍🎓", "👩🏾‍🎓", "👩🏿‍🎓"], version: "4.0" }, { emoji: "🧑‍🏫", category: 1, name: "teacher", variations: ["🧑🏻‍🏫", "🧑🏼‍🏫", "🧑🏽‍🏫", "🧑🏾‍🏫", "🧑🏿‍🏫"], version: "12.1" }, { emoji: "👨‍🏫", category: 1, name: "man teacher", variations: ["👨🏻‍🏫", "👨🏼‍🏫", "👨🏽‍🏫", "👨🏾‍🏫", "👨🏿‍🏫"], version: "4.0" }, { emoji: "👩‍🏫", category: 1, name: "woman teacher", variations: ["👩🏻‍🏫", "👩🏼‍🏫", "👩🏽‍🏫", "👩🏾‍🏫", "👩🏿‍🏫"], version: "4.0" }, { emoji: "🧑‍⚖️", category: 1, name: "judge", variations: ["🧑🏻‍⚖️", "🧑🏼‍⚖️", "🧑🏽‍⚖️", "🧑🏾‍⚖️", "🧑🏿‍⚖️"], version: "12.1" }, { emoji: "👨‍⚖️", category: 1, name: "man judge", variations: ["👨🏻‍⚖️", "👨🏼‍⚖️", "👨🏽‍⚖️", "👨🏾‍⚖️", "👨🏿‍⚖️"], version: "4.0" }, { emoji: "👩‍⚖️", category: 1, name: "woman judge", variations: ["👩🏻‍⚖️", "👩🏼‍⚖️", "👩🏽‍⚖️", "👩🏾‍⚖️", "👩🏿‍⚖️"], version: "4.0" }, { emoji: "🧑‍🌾", category: 1, name: "farmer", variations: ["🧑🏻‍🌾", "🧑🏼‍🌾", "🧑🏽‍🌾", "🧑🏾‍🌾", "🧑🏿‍🌾"], version: "12.1" }, { emoji: "👨‍🌾", category: 1, name: "man farmer", variations: ["👨🏻‍🌾", "👨🏼‍🌾", "👨🏽‍🌾", "👨🏾‍🌾", "👨🏿‍🌾"], version: "4.0" }, { emoji: "👩‍🌾", category: 1, name: "woman farmer", variations: ["👩🏻‍🌾", "👩🏼‍🌾", "👩🏽‍🌾", "👩🏾‍🌾", "👩🏿‍🌾"], version: "4.0" }, { emoji: "🧑‍🍳", category: 1, name: "cook", variations: ["🧑🏻‍🍳", "🧑🏼‍🍳", "🧑🏽‍🍳", "🧑🏾‍🍳", "🧑🏿‍🍳"], version: "12.1" }, { emoji: "👨‍🍳", category: 1, name: "man cook", variations: ["👨🏻‍🍳", "👨🏼‍🍳", "👨🏽‍🍳", "👨🏾‍🍳", "👨🏿‍🍳"], version: "4.0" }, { emoji: "👩‍🍳", category: 1, name: "woman cook", variations: ["👩🏻‍🍳", "👩🏼‍🍳", "👩🏽‍🍳", "👩🏾‍🍳", "👩🏿‍🍳"], version: "4.0" }, { emoji: "🧑‍🔧", category: 1, name: "mechanic", variations: ["🧑🏻‍🔧", "🧑🏼‍🔧", "🧑🏽‍🔧", "🧑🏾‍🔧", "🧑🏿‍🔧"], version: "12.1" }, { emoji: "👨‍🔧", category: 1, name: "man mechanic", variations: ["👨🏻‍🔧", "👨🏼‍🔧", "👨🏽‍🔧", "👨🏾‍🔧", "👨🏿‍🔧"], version: "4.0" }, { emoji: "👩‍🔧", category: 1, name: "woman mechanic", variations: ["👩🏻‍🔧", "👩🏼‍🔧", "👩🏽‍🔧", "👩🏾‍🔧", "👩🏿‍🔧"], version: "4.0" }, { emoji: "🧑‍🏭", category: 1, name: "factory worker", variations: ["🧑🏻‍🏭", "🧑🏼‍🏭", "🧑🏽‍🏭", "🧑🏾‍🏭", "🧑🏿‍🏭"], version: "12.1" }, { emoji: "👨‍🏭", category: 1, name: "man factory worker", variations: ["👨🏻‍🏭", "👨🏼‍🏭", "👨🏽‍🏭", "👨🏾‍🏭", "👨🏿‍🏭"], version: "4.0" }, { emoji: "👩‍🏭", category: 1, name: "woman factory worker", variations: ["👩🏻‍🏭", "👩🏼‍🏭", "👩🏽‍🏭", "👩🏾‍🏭", "👩🏿‍🏭"], version: "4.0" }, { emoji: "🧑‍💼", category: 1, name: "office worker", variations: ["🧑🏻‍💼", "🧑🏼‍💼", "🧑🏽‍💼", "🧑🏾‍💼", "🧑🏿‍💼"], version: "12.1" }, { emoji: "👨‍💼", category: 1, name: "man office worker", variations: ["👨🏻‍💼", "👨🏼‍💼", "👨🏽‍💼", "👨🏾‍💼", "👨🏿‍💼"], version: "4.0" }, { emoji: "👩‍💼", category: 1, name: "woman office worker", variations: ["👩🏻‍💼", "👩🏼‍💼", "👩🏽‍💼", "👩🏾‍💼", "👩🏿‍💼"], version: "4.0" }, { emoji: "🧑‍🔬", category: 1, name: "scientist", variations: ["🧑🏻‍🔬", "🧑🏼‍🔬", "🧑🏽‍🔬", "🧑🏾‍🔬", "🧑🏿‍🔬"], version: "12.1" }, { emoji: "👨‍🔬", category: 1, name: "man scientist", variations: ["👨🏻‍🔬", "👨🏼‍🔬", "👨🏽‍🔬", "👨🏾‍🔬", "👨🏿‍🔬"], version: "4.0" }, { emoji: "👩‍🔬", category: 1, name: "woman scientist", variations: ["👩🏻‍🔬", "👩🏼‍🔬", "👩🏽‍🔬", "👩🏾‍🔬", "👩🏿‍🔬"], version: "4.0" }, { emoji: "🧑‍💻", category: 1, name: "technologist", variations: ["🧑🏻‍💻", "🧑🏼‍💻", "🧑🏽‍💻", "🧑🏾‍💻", "🧑🏿‍💻"], version: "12.1" }, { emoji: "👨‍💻", category: 1, name: "man technologist", variations: ["👨🏻‍💻", "👨🏼‍💻", "👨🏽‍💻", "👨🏾‍💻", "👨🏿‍💻"], version: "4.0" }, { emoji: "👩‍💻", category: 1, name: "woman technologist", variations: ["👩🏻‍💻", "👩🏼‍💻", "👩🏽‍💻", "👩🏾‍💻", "👩🏿‍💻"], version: "4.0" }, { emoji: "🧑‍🎤", category: 1, name: "singer", variations: ["🧑🏻‍🎤", "🧑🏼‍🎤", "🧑🏽‍🎤", "🧑🏾‍🎤", "🧑🏿‍🎤"], version: "12.1" }, { emoji: "👨‍🎤", category: 1, name: "man singer", variations: ["👨🏻‍🎤", "👨🏼‍🎤", "👨🏽‍🎤", "👨🏾‍🎤", "👨🏿‍🎤"], version: "4.0" }, { emoji: "👩‍🎤", category: 1, name: "woman singer", variations: ["👩🏻‍🎤", "👩🏼‍🎤", "👩🏽‍🎤", "👩🏾‍🎤", "👩🏿‍🎤"], version: "4.0" }, { emoji: "🧑‍🎨", category: 1, name: "artist", variations: ["🧑🏻‍🎨", "🧑🏼‍🎨", "🧑🏽‍🎨", "🧑🏾‍🎨", "🧑🏿‍🎨"], version: "12.1" }, { emoji: "👨‍🎨", category: 1, name: "man artist", variations: ["👨🏻‍🎨", "👨🏼‍🎨", "👨🏽‍🎨", "👨🏾‍🎨", "👨🏿‍🎨"], version: "4.0" }, { emoji: "👩‍🎨", category: 1, name: "woman artist", variations: ["👩🏻‍🎨", "👩🏼‍🎨", "👩🏽‍🎨", "👩🏾‍🎨", "👩🏿‍🎨"], version: "4.0" }, { emoji: "🧑‍✈️", category: 1, name: "pilot", variations: ["🧑🏻‍✈️", "🧑🏼‍✈️", "🧑🏽‍✈️", "🧑🏾‍✈️", "🧑🏿‍✈️"], version: "12.1" }, { emoji: "👨‍✈️", category: 1, name: "man pilot", variations: ["👨🏻‍✈️", "👨🏼‍✈️", "👨🏽‍✈️", "👨🏾‍✈️", "👨🏿‍✈️"], version: "4.0" }, { emoji: "👩‍✈️", category: 1, name: "woman pilot", variations: ["👩🏻‍✈️", "👩🏼‍✈️", "👩🏽‍✈️", "👩🏾‍✈️", "👩🏿‍✈️"], version: "4.0" }, { emoji: "🧑‍🚀", category: 1, name: "astronaut", variations: ["🧑🏻‍🚀", "🧑🏼‍🚀", "🧑🏽‍🚀", "🧑🏾‍🚀", "🧑🏿‍🚀"], version: "12.1" }, { emoji: "👨‍🚀", category: 1, name: "man astronaut", variations: ["👨🏻‍🚀", "👨🏼‍🚀", "👨🏽‍🚀", "👨🏾‍🚀", "👨🏿‍🚀"], version: "4.0" }, { emoji: "👩‍🚀", category: 1, name: "woman astronaut", variations: ["👩🏻‍🚀", "👩🏼‍🚀", "👩🏽‍🚀", "👩🏾‍🚀", "👩🏿‍🚀"], version: "4.0" }, { emoji: "🧑‍🚒", category: 1, name: "firefighter", variations: ["🧑🏻‍🚒", "🧑🏼‍🚒", "🧑🏽‍🚒", "🧑🏾‍🚒", "🧑🏿‍🚒"], version: "12.1" }, { emoji: "👨‍🚒", category: 1, name: "man firefighter", variations: ["👨🏻‍🚒", "👨🏼‍🚒", "👨🏽‍🚒", "👨🏾‍🚒", "👨🏿‍🚒"], version: "4.0" }, { emoji: "👩‍🚒", category: 1, name: "woman firefighter", variations: ["👩🏻‍🚒", "👩🏼‍🚒", "👩🏽‍🚒", "👩🏾‍🚒", "👩🏿‍🚒"], version: "4.0" }, { emoji: "👮", category: 1, name: "police officer", variations: ["👮🏻", "👮🏼", "👮🏽", "👮🏾", "👮🏿"], version: "1.0" }, { emoji: "👮‍♂️", category: 1, name: "man police officer", variations: ["👮🏻‍♂️", "👮🏼‍♂️", "👮🏽‍♂️", "👮🏾‍♂️", "👮🏿‍♂️"], version: "4.0" }, { emoji: "👮‍♀️", category: 1, name: "woman police officer", variations: ["👮🏻‍♀️", "👮🏼‍♀️", "👮🏽‍♀️", "👮🏾‍♀️", "👮🏿‍♀️"], version: "4.0" }, { emoji: "🕵️", category: 1, name: "detective", variations: ["🕵🏻", "🕵🏼", "🕵🏽", "🕵🏾", "🕵🏿"], version: "1.0" }, { emoji: "🕵️‍♂️", category: 1, name: "man detective", variations: ["🕵🏻‍♂️", "🕵🏼‍♂️", "🕵🏽‍♂️", "🕵🏾‍♂️", "🕵🏿‍♂️"], version: "4.0" }, { emoji: "🕵️‍♀️", category: 1, name: "woman detective", variations: ["🕵🏻‍♀️", "🕵🏼‍♀️", "🕵🏽‍♀️", "🕵🏾‍♀️", "🕵🏿‍♀️"], version: "4.0" }, { emoji: "💂", category: 1, name: "guard", variations: ["💂🏻", "💂🏼", "💂🏽", "💂🏾", "💂🏿"], version: "1.0" }, { emoji: "💂‍♂️", category: 1, name: "man guard", variations: ["💂🏻‍♂️", "💂🏼‍♂️", "💂🏽‍♂️", "💂🏾‍♂️", "💂🏿‍♂️"], version: "4.0" }, { emoji: "💂‍♀️", category: 1, name: "woman guard", variations: ["💂🏻‍♀️", "💂🏼‍♀️", "💂🏽‍♀️", "💂🏾‍♀️", "💂🏿‍♀️"], version: "4.0" }, { emoji: "🥷", category: 1, name: "ninja", variations: ["🥷🏻", "🥷🏼", "🥷🏽", "🥷🏾", "🥷🏿"], version: "13.0" }, { emoji: "👷", category: 1, name: "construction worker", variations: ["👷🏻", "👷🏼", "👷🏽", "👷🏾", "👷🏿"], version: "1.0" }, { emoji: "👷‍♂️", category: 1, name: "man construction worker", variations: ["👷🏻‍♂️", "👷🏼‍♂️", "👷🏽‍♂️", "👷🏾‍♂️", "👷🏿‍♂️"], version: "4.0" }, { emoji: "👷‍♀️", category: 1, name: "woman construction worker", variations: ["👷🏻‍♀️", "👷🏼‍♀️", "👷🏽‍♀️", "👷🏾‍♀️", "👷🏿‍♀️"], version: "4.0" }, { emoji: "🤴", category: 1, name: "prince", variations: ["🤴🏻", "🤴🏼", "🤴🏽", "🤴🏾", "🤴🏿"], version: "3.0" }, { emoji: "👸", category: 1, name: "princess", variations: ["👸🏻", "👸🏼", "👸🏽", "👸🏾", "👸🏿"], version: "1.0" }, { emoji: "👳", category: 1, name: "person wearing turban", variations: ["👳🏻", "👳🏼", "👳🏽", "👳🏾", "👳🏿"], version: "1.0" }, { emoji: "👳‍♂️", category: 1, name: "man wearing turban", variations: ["👳🏻‍♂️", "👳🏼‍♂️", "👳🏽‍♂️", "👳🏾‍♂️", "👳🏿‍♂️"], version: "4.0" }, { emoji: "👳‍♀️", category: 1, name: "woman wearing turban", variations: ["👳🏻‍♀️", "👳🏼‍♀️", "👳🏽‍♀️", "👳🏾‍♀️", "👳🏿‍♀️"], version: "4.0" }, { emoji: "👲", category: 1, name: "person with skullcap", variations: ["👲🏻", "👲🏼", "👲🏽", "👲🏾", "👲🏿"], version: "1.0" }, { emoji: "🧕", category: 1, name: "woman with headscarf", variations: ["🧕🏻", "🧕🏼", "🧕🏽", "🧕🏾", "🧕🏿"], version: "5.0" }, { emoji: "🤵", category: 1, name: "person in tuxedo", variations: ["🤵🏻", "🤵🏼", "🤵🏽", "🤵🏾", "🤵🏿"], version: "3.0" }, { emoji: "🤵‍♂️", category: 1, name: "man in tuxedo", variations: ["🤵🏻‍♂️", "🤵🏼‍♂️", "🤵🏽‍♂️", "🤵🏾‍♂️", "🤵🏿‍♂️"], version: "13.0" }, { emoji: "🤵‍♀️", category: 1, name: "woman in tuxedo", variations: ["🤵🏻‍♀️", "🤵🏼‍♀️", "🤵🏽‍♀️", "🤵🏾‍♀️", "🤵🏿‍♀️"], version: "13.0" }, { emoji: "👰", category: 1, name: "person with veil", variations: ["👰🏻", "👰🏼", "👰🏽", "👰🏾", "👰🏿"], version: "1.0" }, { emoji: "👰‍♂️", category: 1, name: "man with veil", variations: ["👰🏻‍♂️", "👰🏼‍♂️", "👰🏽‍♂️", "👰🏾‍♂️", "👰🏿‍♂️"], version: "13.0" }, { emoji: "👰‍♀️", category: 1, name: "woman with veil", variations: ["👰🏻‍♀️", "👰🏼‍♀️", "👰🏽‍♀️", "👰🏾‍♀️", "👰🏿‍♀️"], version: "13.0" }, { emoji: "🤰", category: 1, name: "pregnant woman", variations: ["🤰🏻", "🤰🏼", "🤰🏽", "🤰🏾", "🤰🏿"], version: "3.0" }, { emoji: "🤱", category: 1, name: "breast-feeding", variations: ["🤱🏻", "🤱🏼", "🤱🏽", "🤱🏾", "🤱🏿"], version: "5.0" }, { emoji: "👩‍🍼", category: 1, name: "woman feeding baby", variations: ["👩🏻‍🍼", "👩🏼‍🍼", "👩🏽‍🍼", "👩🏾‍🍼", "👩🏿‍🍼"], version: "13.0" }, { emoji: "👨‍🍼", category: 1, name: "man feeding baby", variations: ["👨🏻‍🍼", "👨🏼‍🍼", "👨🏽‍🍼", "👨🏾‍🍼", "👨🏿‍🍼"], version: "13.0" }, { emoji: "🧑‍🍼", category: 1, name: "person feeding baby", variations: ["🧑🏻‍🍼", "🧑🏼‍🍼", "🧑🏽‍🍼", "🧑🏾‍🍼", "🧑🏿‍🍼"], version: "13.0" }, { emoji: "👼", category: 1, name: "baby angel", variations: ["👼🏻", "👼🏼", "👼🏽", "👼🏾", "👼🏿"], version: "1.0" }, { emoji: "🎅", category: 1, name: "Santa Claus", variations: ["🎅🏻", "🎅🏼", "🎅🏽", "🎅🏾", "🎅🏿"], version: "1.0" }, { emoji: "🤶", category: 1, name: "Mrs. Claus", variations: ["🤶🏻", "🤶🏼", "🤶🏽", "🤶🏾", "🤶🏿"], version: "3.0" }, { emoji: "🧑‍🎄", category: 1, name: "mx claus", variations: ["🧑🏻‍🎄", "🧑🏼‍🎄", "🧑🏽‍🎄", "🧑🏾‍🎄", "🧑🏿‍🎄"], version: "13.0" }, { emoji: "🦸", category: 1, name: "superhero", variations: ["🦸🏻", "🦸🏼", "🦸🏽", "🦸🏾", "🦸🏿"], version: "11.0" }, { emoji: "🦸‍♂️", category: 1, name: "man superhero", variations: ["🦸🏻‍♂️", "🦸🏼‍♂️", "🦸🏽‍♂️", "🦸🏾‍♂️", "🦸🏿‍♂️"], version: "11.0" }, { emoji: "🦸‍♀️", category: 1, name: "woman superhero", variations: ["🦸🏻‍♀️", "🦸🏼‍♀️", "🦸🏽‍♀️", "🦸🏾‍♀️", "🦸🏿‍♀️"], version: "11.0" }, { emoji: "🦹", category: 1, name: "supervillain", variations: ["🦹🏻", "🦹🏼", "🦹🏽", "🦹🏾", "🦹🏿"], version: "11.0" }, { emoji: "🦹‍♂️", category: 1, name: "man supervillain", variations: ["🦹🏻‍♂️", "🦹🏼‍♂️", "🦹🏽‍♂️", "🦹🏾‍♂️", "🦹🏿‍♂️"], version: "11.0" }, { emoji: "🦹‍♀️", category: 1, name: "woman supervillain", variations: ["🦹🏻‍♀️", "🦹🏼‍♀️", "🦹🏽‍♀️", "🦹🏾‍♀️", "🦹🏿‍♀️"], version: "11.0" }, { emoji: "🧙", category: 1, name: "mage", variations: ["🧙🏻", "🧙🏼", "🧙🏽", "🧙🏾", "🧙🏿"], version: "5.0" }, { emoji: "🧙‍♂️", category: 1, name: "man mage", variations: ["🧙🏻‍♂️", "🧙🏼‍♂️", "🧙🏽‍♂️", "🧙🏾‍♂️", "🧙🏿‍♂️"], version: "5.0" }, { emoji: "🧙‍♀️", category: 1, name: "woman mage", variations: ["🧙🏻‍♀️", "🧙🏼‍♀️", "🧙🏽‍♀️", "🧙🏾‍♀️", "🧙🏿‍♀️"], version: "5.0" }, { emoji: "🧚", category: 1, name: "fairy", variations: ["🧚🏻", "🧚🏼", "🧚🏽", "🧚🏾", "🧚🏿"], version: "5.0" }, { emoji: "🧚‍♂️", category: 1, name: "man fairy", variations: ["🧚🏻‍♂️", "🧚🏼‍♂️", "🧚🏽‍♂️", "🧚🏾‍♂️", "🧚🏿‍♂️"], version: "5.0" }, { emoji: "🧚‍♀️", category: 1, name: "woman fairy", variations: ["🧚🏻‍♀️", "🧚🏼‍♀️", "🧚🏽‍♀️", "🧚🏾‍♀️", "🧚🏿‍♀️"], version: "5.0" }, { emoji: "🧛", category: 1, name: "vampire", variations: ["🧛🏻", "🧛🏼", "🧛🏽", "🧛🏾", "🧛🏿"], version: "5.0" }, { emoji: "🧛‍♂️", category: 1, name: "man vampire", variations: ["🧛🏻‍♂️", "🧛🏼‍♂️", "🧛🏽‍♂️", "🧛🏾‍♂️", "🧛🏿‍♂️"], version: "5.0" }, { emoji: "🧛‍♀️", category: 1, name: "woman vampire", variations: ["🧛🏻‍♀️", "🧛🏼‍♀️", "🧛🏽‍♀️", "🧛🏾‍♀️", "🧛🏿‍♀️"], version: "5.0" }, { emoji: "🧜", category: 1, name: "merperson", variations: ["🧜🏻", "🧜🏼", "🧜🏽", "🧜🏾", "🧜🏿"], version: "5.0" }, { emoji: "🧜‍♂️", category: 1, name: "merman", variations: ["🧜🏻‍♂️", "🧜🏼‍♂️", "🧜🏽‍♂️", "🧜🏾‍♂️", "🧜🏿‍♂️"], version: "5.0" }, { emoji: "🧜‍♀️", category: 1, name: "mermaid", variations: ["🧜🏻‍♀️", "🧜🏼‍♀️", "🧜🏽‍♀️", "🧜🏾‍♀️", "🧜🏿‍♀️"], version: "5.0" }, { emoji: "🧝", category: 1, name: "elf", variations: ["🧝🏻", "🧝🏼", "🧝🏽", "🧝🏾", "🧝🏿"], version: "5.0" }, { emoji: "🧝‍♂️", category: 1, name: "man elf", variations: ["🧝🏻‍♂️", "🧝🏼‍♂️", "🧝🏽‍♂️", "🧝🏾‍♂️", "🧝🏿‍♂️"], version: "5.0" }, { emoji: "🧝‍♀️", category: 1, name: "woman elf", variations: ["🧝🏻‍♀️", "🧝🏼‍♀️", "🧝🏽‍♀️", "🧝🏾‍♀️", "🧝🏿‍♀️"], version: "5.0" }, { emoji: "🧞", category: 1, name: "genie", version: "5.0" }, { emoji: "🧞‍♂️", category: 1, name: "man genie", version: "5.0" }, { emoji: "🧞‍♀️", category: 1, name: "woman genie", version: "5.0" }, { emoji: "🧟", category: 1, name: "zombie", version: "5.0" }, { emoji: "🧟‍♂️", category: 1, name: "man zombie", version: "5.0" }, { emoji: "🧟‍♀️", category: 1, name: "woman zombie", version: "5.0" }, { emoji: "💆", category: 1, name: "person getting massage", variations: ["💆🏻", "💆🏼", "💆🏽", "💆🏾", "💆🏿"], version: "1.0" }, { emoji: "💆‍♂️", category: 1, name: "man getting massage", variations: ["💆🏻‍♂️", "💆🏼‍♂️", "💆🏽‍♂️", "💆🏾‍♂️", "💆🏿‍♂️"], version: "4.0" }, { emoji: "💆‍♀️", category: 1, name: "woman getting massage", variations: ["💆🏻‍♀️", "💆🏼‍♀️", "💆🏽‍♀️", "💆🏾‍♀️", "💆🏿‍♀️"], version: "4.0" }, { emoji: "💇", category: 1, name: "person getting haircut", variations: ["💇🏻", "💇🏼", "💇🏽", "💇🏾", "💇🏿"], version: "1.0" }, { emoji: "💇‍♂️", category: 1, name: "man getting haircut", variations: ["💇🏻‍♂️", "💇🏼‍♂️", "💇🏽‍♂️", "💇🏾‍♂️", "💇🏿‍♂️"], version: "4.0" }, { emoji: "💇‍♀️", category: 1, name: "woman getting haircut", variations: ["💇🏻‍♀️", "💇🏼‍♀️", "💇🏽‍♀️", "💇🏾‍♀️", "💇🏿‍♀️"], version: "4.0" }, { emoji: "🚶", category: 1, name: "person walking", variations: ["🚶🏻", "🚶🏼", "🚶🏽", "🚶🏾", "🚶🏿"], version: "1.0" }, { emoji: "🚶‍♂️", category: 1, name: "man walking", variations: ["🚶🏻‍♂️", "🚶🏼‍♂️", "🚶🏽‍♂️", "🚶🏾‍♂️", "🚶🏿‍♂️"], version: "4.0" }, { emoji: "🚶‍♀️", category: 1, name: "woman walking", variations: ["🚶🏻‍♀️", "🚶🏼‍♀️", "🚶🏽‍♀️", "🚶🏾‍♀️", "🚶🏿‍♀️"], version: "4.0" }, { emoji: "🧍", category: 1, name: "person standing", variations: ["🧍🏻", "🧍🏼", "🧍🏽", "🧍🏾", "🧍🏿"], version: "12.0" }, { emoji: "🧍‍♂️", category: 1, name: "man standing", variations: ["🧍🏻‍♂️", "🧍🏼‍♂️", "🧍🏽‍♂️", "🧍🏾‍♂️", "🧍🏿‍♂️"], version: "12.0" }, { emoji: "🧍‍♀️", category: 1, name: "woman standing", variations: ["🧍🏻‍♀️", "🧍🏼‍♀️", "🧍🏽‍♀️", "🧍🏾‍♀️", "🧍🏿‍♀️"], version: "12.0" }, { emoji: "🧎", category: 1, name: "person kneeling", variations: ["🧎🏻", "🧎🏼", "🧎🏽", "🧎🏾", "🧎🏿"], version: "12.0" }, { emoji: "🧎‍♂️", category: 1, name: "man kneeling", variations: ["🧎🏻‍♂️", "🧎🏼‍♂️", "🧎🏽‍♂️", "🧎🏾‍♂️", "🧎🏿‍♂️"], version: "12.0" }, { emoji: "🧎‍♀️", category: 1, name: "woman kneeling", variations: ["🧎🏻‍♀️", "🧎🏼‍♀️", "🧎🏽‍♀️", "🧎🏾‍♀️", "🧎🏿‍♀️"], version: "12.0" }, { emoji: "🧑‍🦯", category: 1, name: "person with white cane", variations: ["🧑🏻‍🦯", "🧑🏼‍🦯", "🧑🏽‍🦯", "🧑🏾‍🦯", "🧑🏿‍🦯"], version: "12.1" }, { emoji: "👨‍🦯", category: 1, name: "man with white cane", variations: ["👨🏻‍🦯", "👨🏼‍🦯", "👨🏽‍🦯", "👨🏾‍🦯", "👨🏿‍🦯"], version: "12.0" }, { emoji: "👩‍🦯", category: 1, name: "woman with white cane", variations: ["👩🏻‍🦯", "👩🏼‍🦯", "👩🏽‍🦯", "👩🏾‍🦯", "👩🏿‍🦯"], version: "12.0" }, { emoji: "🧑‍🦼", category: 1, name: "person in motorized wheelchair", variations: ["🧑🏻‍🦼", "🧑🏼‍🦼", "🧑🏽‍🦼", "🧑🏾‍🦼", "🧑🏿‍🦼"], version: "12.1" }, { emoji: "👨‍🦼", category: 1, name: "man in motorized wheelchair", variations: ["👨🏻‍🦼", "👨🏼‍🦼", "👨🏽‍🦼", "👨🏾‍🦼", "👨🏿‍🦼"], version: "12.0" }, { emoji: "👩‍🦼", category: 1, name: "woman in motorized wheelchair", variations: ["👩🏻‍🦼", "👩🏼‍🦼", "👩🏽‍🦼", "👩🏾‍🦼", "👩🏿‍🦼"], version: "12.0" }, { emoji: "🧑‍🦽", category: 1, name: "person in manual wheelchair", variations: ["🧑🏻‍🦽", "🧑🏼‍🦽", "🧑🏽‍🦽", "🧑🏾‍🦽", "🧑🏿‍🦽"], version: "12.1" }, { emoji: "👨‍🦽", category: 1, name: "man in manual wheelchair", variations: ["👨🏻‍🦽", "👨🏼‍🦽", "👨🏽‍🦽", "👨🏾‍🦽", "👨🏿‍🦽"], version: "12.0" }, { emoji: "👩‍🦽", category: 1, name: "woman in manual wheelchair", variations: ["👩🏻‍🦽", "👩🏼‍🦽", "👩🏽‍🦽", "👩🏾‍🦽", "👩🏿‍🦽"], version: "12.0" }, { emoji: "🏃", category: 1, name: "person running", variations: ["🏃🏻", "🏃🏼", "🏃🏽", "🏃🏾", "🏃🏿"], version: "1.0" }, { emoji: "🏃‍♂️", category: 1, name: "man running", variations: ["🏃🏻‍♂️", "🏃🏼‍♂️", "🏃🏽‍♂️", "🏃🏾‍♂️", "🏃🏿‍♂️"], version: "4.0" }, { emoji: "🏃‍♀️", category: 1, name: "woman running", variations: ["🏃🏻‍♀️", "🏃🏼‍♀️", "🏃🏽‍♀️", "🏃🏾‍♀️", "🏃🏿‍♀️"], version: "4.0" }, { emoji: "💃", category: 1, name: "woman dancing", variations: ["💃🏻", "💃🏼", "💃🏽", "💃🏾", "💃🏿"], version: "1.0" }, { emoji: "🕺", category: 1, name: "man dancing", variations: ["🕺🏻", "🕺🏼", "🕺🏽", "🕺🏾", "🕺🏿"], version: "3.0" }, { emoji: "🕴️", category: 1, name: "person in suit levitating", variations: ["🕴🏻", "🕴🏼", "🕴🏽", "🕴🏾", "🕴🏿"], version: "1.0" }, { emoji: "👯", category: 1, name: "people with bunny ears", version: "1.0" }, { emoji: "👯‍♂️", category: 1, name: "men with bunny ears", version: "4.0" }, { emoji: "👯‍♀️", category: 1, name: "women with bunny ears", version: "4.0" }, { emoji: "🧖", category: 1, name: "person in steamy room", variations: ["🧖🏻", "🧖🏼", "🧖🏽", "🧖🏾", "🧖🏿"], version: "5.0" }, { emoji: "🧖‍♂️", category: 1, name: "man in steamy room", variations: ["🧖🏻‍♂️", "🧖🏼‍♂️", "🧖🏽‍♂️", "🧖🏾‍♂️", "🧖🏿‍♂️"], version: "5.0" }, { emoji: "🧖‍♀️", category: 1, name: "woman in steamy room", variations: ["🧖🏻‍♀️", "🧖🏼‍♀️", "🧖🏽‍♀️", "🧖🏾‍♀️", "🧖🏿‍♀️"], version: "5.0" }, { emoji: "🧗", category: 1, name: "person climbing", variations: ["🧗🏻", "🧗🏼", "🧗🏽", "🧗🏾", "🧗🏿"], version: "5.0" }, { emoji: "🧗‍♂️", category: 1, name: "man climbing", variations: ["🧗🏻‍♂️", "🧗🏼‍♂️", "🧗🏽‍♂️", "🧗🏾‍♂️", "🧗🏿‍♂️"], version: "5.0" }, { emoji: "🧗‍♀️", category: 1, name: "woman climbing", variations: ["🧗🏻‍♀️", "🧗🏼‍♀️", "🧗🏽‍♀️", "🧗🏾‍♀️", "🧗🏿‍♀️"], version: "5.0" }, { emoji: "🤺", category: 1, name: "person fencing", version: "3.0" }, { emoji: "🏇", category: 1, name: "horse racing", variations: ["🏇🏻", "🏇🏼", "🏇🏽", "🏇🏾", "🏇🏿"], version: "1.0" }, { emoji: "⛷️", category: 1, name: "skier", version: "1.0" }, { emoji: "🏂", category: 1, name: "snowboarder", variations: ["🏂🏻", "🏂🏼", "🏂🏽", "🏂🏾", "🏂🏿"], version: "1.0" }, { emoji: "🏌️", category: 1, name: "person golfing", variations: ["🏌🏻", "🏌🏼", "🏌🏽", "🏌🏾", "🏌🏿"], version: "1.0" }, { emoji: "🏌️‍♂️", category: 1, name: "man golfing", variations: ["🏌🏻‍♂️", "🏌🏼‍♂️", "🏌🏽‍♂️", "🏌🏾‍♂️", "🏌🏿‍♂️"], version: "4.0" }, { emoji: "🏌️‍♀️", category: 1, name: "woman golfing", variations: ["🏌🏻‍♀️", "🏌🏼‍♀️", "🏌🏽‍♀️", "🏌🏾‍♀️", "🏌🏿‍♀️"], version: "4.0" }, { emoji: "🏄", category: 1, name: "person surfing", variations: ["🏄🏻", "🏄🏼", "🏄🏽", "🏄🏾", "🏄🏿"], version: "1.0" }, { emoji: "🏄‍♂️", category: 1, name: "man surfing", variations: ["🏄🏻‍♂️", "🏄🏼‍♂️", "🏄🏽‍♂️", "🏄🏾‍♂️", "🏄🏿‍♂️"], version: "4.0" }, { emoji: "🏄‍♀️", category: 1, name: "woman surfing", variations: ["🏄🏻‍♀️", "🏄🏼‍♀️", "🏄🏽‍♀️", "🏄🏾‍♀️", "🏄🏿‍♀️"], version: "4.0" }, { emoji: "🚣", category: 1, name: "person rowing boat", variations: ["🚣🏻", "🚣🏼", "🚣🏽", "🚣🏾", "🚣🏿"], version: "1.0" }, { emoji: "🚣‍♂️", category: 1, name: "man rowing boat", variations: ["🚣🏻‍♂️", "🚣🏼‍♂️", "🚣🏽‍♂️", "🚣🏾‍♂️", "🚣🏿‍♂️"], version: "4.0" }, { emoji: "🚣‍♀️", category: 1, name: "woman rowing boat", variations: ["🚣🏻‍♀️", "🚣🏼‍♀️", "🚣🏽‍♀️", "🚣🏾‍♀️", "🚣🏿‍♀️"], version: "4.0" }, { emoji: "🏊", category: 1, name: "person swimming", variations: ["🏊🏻", "🏊🏼", "🏊🏽", "🏊🏾", "🏊🏿"], version: "1.0" }, { emoji: "🏊‍♂️", category: 1, name: "man swimming", variations: ["🏊🏻‍♂️", "🏊🏼‍♂️", "🏊🏽‍♂️", "🏊🏾‍♂️", "🏊🏿‍♂️"], version: "4.0" }, { emoji: "🏊‍♀️", category: 1, name: "woman swimming", variations: ["🏊🏻‍♀️", "🏊🏼‍♀️", "🏊🏽‍♀️", "🏊🏾‍♀️", "🏊🏿‍♀️"], version: "4.0" }, { emoji: "⛹️", category: 1, name: "person bouncing ball", variations: ["⛹🏻", "⛹🏼", "⛹🏽", "⛹🏾", "⛹🏿"], version: "1.0" }, { emoji: "⛹️‍♂️", category: 1, name: "man bouncing ball", variations: ["⛹🏻‍♂️", "⛹🏼‍♂️", "⛹🏽‍♂️", "⛹🏾‍♂️", "⛹🏿‍♂️"], version: "4.0" }, { emoji: "⛹️‍♀️", category: 1, name: "woman bouncing ball", variations: ["⛹🏻‍♀️", "⛹🏼‍♀️", "⛹🏽‍♀️", "⛹🏾‍♀️", "⛹🏿‍♀️"], version: "4.0" }, { emoji: "🏋️", category: 1, name: "person lifting weights", variations: ["🏋🏻", "🏋🏼", "🏋🏽", "🏋🏾", "🏋🏿"], version: "1.0" }, { emoji: "🏋️‍♂️", category: 1, name: "man lifting weights", variations: ["🏋🏻‍♂️", "🏋🏼‍♂️", "🏋🏽‍♂️", "🏋🏾‍♂️", "🏋🏿‍♂️"], version: "4.0" }, { emoji: "🏋️‍♀️", category: 1, name: "woman lifting weights", variations: ["🏋🏻‍♀️", "🏋🏼‍♀️", "🏋🏽‍♀️", "🏋🏾‍♀️", "🏋🏿‍♀️"], version: "4.0" }, { emoji: "🚴", category: 1, name: "person biking", variations: ["🚴🏻", "🚴🏼", "🚴🏽", "🚴🏾", "🚴🏿"], version: "1.0" }, { emoji: "🚴‍♂️", category: 1, name: "man biking", variations: ["🚴🏻‍♂️", "🚴🏼‍♂️", "🚴🏽‍♂️", "🚴🏾‍♂️", "🚴🏿‍♂️"], version: "4.0" }, { emoji: "🚴‍♀️", category: 1, name: "woman biking", variations: ["🚴🏻‍♀️", "🚴🏼‍♀️", "🚴🏽‍♀️", "🚴🏾‍♀️", "🚴🏿‍♀️"], version: "4.0" }, { emoji: "🚵", category: 1, name: "person mountain biking", variations: ["🚵🏻", "🚵🏼", "🚵🏽", "🚵🏾", "🚵🏿"], version: "1.0" }, { emoji: "🚵‍♂️", category: 1, name: "man mountain biking", variations: ["🚵🏻‍♂️", "🚵🏼‍♂️", "🚵🏽‍♂️", "🚵🏾‍♂️", "🚵🏿‍♂️"], version: "4.0" }, { emoji: "🚵‍♀️", category: 1, name: "woman mountain biking", variations: ["🚵🏻‍♀️", "🚵🏼‍♀️", "🚵🏽‍♀️", "🚵🏾‍♀️", "🚵🏿‍♀️"], version: "4.0" }, { emoji: "🤸", category: 1, name: "person cartwheeling", variations: ["🤸🏻", "🤸🏼", "🤸🏽", "🤸🏾", "🤸🏿"], version: "3.0" }, { emoji: "🤸‍♂️", category: 1, name: "man cartwheeling", variations: ["🤸🏻‍♂️", "🤸🏼‍♂️", "🤸🏽‍♂️", "🤸🏾‍♂️", "🤸🏿‍♂️"], version: "4.0" }, { emoji: "🤸‍♀️", category: 1, name: "woman cartwheeling", variations: ["🤸🏻‍♀️", "🤸🏼‍♀️", "🤸🏽‍♀️", "🤸🏾‍♀️", "🤸🏿‍♀️"], version: "4.0" }, { emoji: "🤼", category: 1, name: "people wrestling", version: "3.0" }, { emoji: "🤼‍♂️", category: 1, name: "men wrestling", version: "4.0" }, { emoji: "🤼‍♀️", category: 1, name: "women wrestling", version: "4.0" }, { emoji: "🤽", category: 1, name: "person playing water polo", variations: ["🤽🏻", "🤽🏼", "🤽🏽", "🤽🏾", "🤽🏿"], version: "3.0" }, { emoji: "🤽‍♂️", category: 1, name: "man playing water polo", variations: ["🤽🏻‍♂️", "🤽🏼‍♂️", "🤽🏽‍♂️", "🤽🏾‍♂️", "🤽🏿‍♂️"], version: "4.0" }, { emoji: "🤽‍♀️", category: 1, name: "woman playing water polo", variations: ["🤽🏻‍♀️", "🤽🏼‍♀️", "🤽🏽‍♀️", "🤽🏾‍♀️", "🤽🏿‍♀️"], version: "4.0" }, { emoji: "🤾", category: 1, name: "person playing handball", variations: ["🤾🏻", "🤾🏼", "🤾🏽", "🤾🏾", "🤾🏿"], version: "3.0" }, { emoji: "🤾‍♂️", category: 1, name: "man playing handball", variations: ["🤾🏻‍♂️", "🤾🏼‍♂️", "🤾🏽‍♂️", "🤾🏾‍♂️", "🤾🏿‍♂️"], version: "4.0" }, { emoji: "🤾‍♀️", category: 1, name: "woman playing handball", variations: ["🤾🏻‍♀️", "🤾🏼‍♀️", "🤾🏽‍♀️", "🤾🏾‍♀️", "🤾🏿‍♀️"], version: "4.0" }, { emoji: "🤹", category: 1, name: "person juggling", variations: ["🤹🏻", "🤹🏼", "🤹🏽", "🤹🏾", "🤹🏿"], version: "3.0" }, { emoji: "🤹‍♂️", category: 1, name: "man juggling", variations: ["🤹🏻‍♂️", "🤹🏼‍♂️", "🤹🏽‍♂️", "🤹🏾‍♂️", "🤹🏿‍♂️"], version: "4.0" }, { emoji: "🤹‍♀️", category: 1, name: "woman juggling", variations: ["🤹🏻‍♀️", "🤹🏼‍♀️", "🤹🏽‍♀️", "🤹🏾‍♀️", "🤹🏿‍♀️"], version: "4.0" }, { emoji: "🧘", category: 1, name: "person in lotus position", variations: ["🧘🏻", "🧘🏼", "🧘🏽", "🧘🏾", "🧘🏿"], version: "5.0" }, { emoji: "🧘‍♂️", category: 1, name: "man in lotus position", variations: ["🧘🏻‍♂️", "🧘🏼‍♂️", "🧘🏽‍♂️", "🧘🏾‍♂️", "🧘🏿‍♂️"], version: "5.0" }, { emoji: "🧘‍♀️", category: 1, name: "woman in lotus position", variations: ["🧘🏻‍♀️", "🧘🏼‍♀️", "🧘🏽‍♀️", "🧘🏾‍♀️", "🧘🏿‍♀️"], version: "5.0" }, { emoji: "🛀", category: 1, name: "person taking bath", variations: ["🛀🏻", "🛀🏼", "🛀🏽", "🛀🏾", "🛀🏿"], version: "1.0" }, { emoji: "🛌", category: 1, name: "person in bed", variations: ["🛌🏻", "🛌🏼", "🛌🏽", "🛌🏾", "🛌🏿"], version: "1.0" }, { emoji: "🧑‍🤝‍🧑", category: 1, name: "people holding hands", variations: ["🧑🏻‍🤝‍🧑🏻", "🧑🏻‍🤝‍🧑🏼", "🧑🏻‍🤝‍🧑🏽", "🧑🏻‍🤝‍🧑🏾", "🧑🏻‍🤝‍🧑🏿", "🧑🏼‍🤝‍🧑🏻", "🧑🏼‍🤝‍🧑🏼", "🧑🏼‍🤝‍🧑🏽", "🧑🏼‍🤝‍🧑🏾", "🧑🏼‍🤝‍🧑🏿", "🧑🏽‍🤝‍🧑🏻", "🧑🏽‍🤝‍🧑🏼", "🧑🏽‍🤝‍🧑🏽", "🧑🏽‍🤝‍🧑🏾", "🧑🏽‍🤝‍🧑🏿", "🧑🏾‍🤝‍🧑🏻", "🧑🏾‍🤝‍🧑🏼", "🧑🏾‍🤝‍🧑🏽", "🧑🏾‍🤝‍🧑🏾", "🧑🏾‍🤝‍🧑🏿", "🧑🏿‍🤝‍🧑🏻", "🧑🏿‍🤝‍🧑🏼", "🧑🏿‍🤝‍🧑🏽", "🧑🏿‍🤝‍🧑🏾", "🧑🏿‍🤝‍🧑🏿"], version: "12.0" }, { emoji: "👭", category: 1, name: "women holding hands", variations: ["👭🏻", "👩🏻‍🤝‍👩🏼", "👩🏻‍🤝‍👩🏽", "👩🏻‍🤝‍👩🏾", "👩🏻‍🤝‍👩🏿", "👩🏼‍🤝‍👩🏻", "👭🏼", "👩🏼‍🤝‍👩🏽", "👩🏼‍🤝‍👩🏾", "👩🏼‍🤝‍👩🏿", "👩🏽‍🤝‍👩🏻", "👩🏽‍🤝‍👩🏼", "👭🏽", "👩🏽‍🤝‍👩🏾", "👩🏽‍🤝‍👩🏿", "👩🏾‍🤝‍👩🏻", "👩🏾‍🤝‍👩🏼", "👩🏾‍🤝‍👩🏽", "👭🏾", "👩🏾‍🤝‍👩🏿", "👩🏿‍🤝‍👩🏻", "👩🏿‍🤝‍👩🏼", "👩🏿‍🤝‍👩🏽", "👩🏿‍🤝‍👩🏾", "👭🏿"], version: "1.0" }, { emoji: "👫", category: 1, name: "woman and man holding hands", variations: ["👫🏻", "👩🏻‍🤝‍👨🏼", "👩🏻‍🤝‍👨🏽", "👩🏻‍🤝‍👨🏾", "👩🏻‍🤝‍👨🏿", "👩🏼‍🤝‍👨🏻", "👫🏼", "👩🏼‍🤝‍👨🏽", "👩🏼‍🤝‍👨🏾", "👩🏼‍🤝‍👨🏿", "👩🏽‍🤝‍👨🏻", "👩🏽‍🤝‍👨🏼", "👫🏽", "👩🏽‍🤝‍👨🏾", "👩🏽‍🤝‍👨🏿", "👩🏾‍🤝‍👨🏻", "👩🏾‍🤝‍👨🏼", "👩🏾‍🤝‍👨🏽", "👫🏾", "👩🏾‍🤝‍👨🏿", "👩🏿‍🤝‍👨🏻", "👩🏿‍🤝‍👨🏼", "👩🏿‍🤝‍👨🏽", "👩🏿‍🤝‍👨🏾", "👫🏿"], version: "1.0" }, { emoji: "👬", category: 1, name: "men holding hands", variations: ["👬🏻", "👨🏻‍🤝‍👨🏼", "👨🏻‍🤝‍👨🏽", "👨🏻‍🤝‍👨🏾", "👨🏻‍🤝‍👨🏿", "👨🏼‍🤝‍👨🏻", "👬🏼", "👨🏼‍🤝‍👨🏽", "👨🏼‍🤝‍👨🏾", "👨🏼‍🤝‍👨🏿", "👨🏽‍🤝‍👨🏻", "👨🏽‍🤝‍👨🏼", "👬🏽", "👨🏽‍🤝‍👨🏾", "👨🏽‍🤝‍👨🏿", "👨🏾‍🤝‍👨🏻", "👨🏾‍🤝‍👨🏼", "👨🏾‍🤝‍👨🏽", "👬🏾", "👨🏾‍🤝‍👨🏿", "👨🏿‍🤝‍👨🏻", "👨🏿‍🤝‍👨🏼", "👨🏿‍🤝‍👨🏽", "👨🏿‍🤝‍👨🏾", "👬🏿"], version: "1.0" }, { emoji: "💏", category: 1, name: "kiss", variations: ["👩‍❤️‍💋‍👨", "👨‍❤️‍💋‍👨", "👩‍❤️‍💋‍👩"], version: "1.0" }, { emoji: "💑", category: 1, name: "couple with heart", variations: ["👩‍❤️‍👨", "👨‍❤️‍👨", "👩‍❤️‍👩"], version: "1.0" }, { emoji: "👪", category: 1, name: "family", version: "1.0" }, { emoji: "👨‍👩‍👦", category: 1, name: "family: man, woman, boy", version: "2.0" }, { emoji: "👨‍👩‍👧", category: 1, name: "family: man, woman, girl", version: "2.0" }, { emoji: "👨‍👩‍👧‍👦", category: 1, name: "family: man, woman, girl, boy", version: "2.0" }, { emoji: "👨‍👩‍👦‍👦", category: 1, name: "family: man, woman, boy, boy", version: "2.0" }, { emoji: "👨‍👩‍👧‍👧", category: 1, name: "family: man, woman, girl, girl", version: "2.0" }, { emoji: "👨‍👨‍👦", category: 1, name: "family: man, man, boy", version: "2.0" }, { emoji: "👨‍👨‍👧", category: 1, name: "family: man, man, girl", version: "2.0" }, { emoji: "👨‍👨‍👧‍👦", category: 1, name: "family: man, man, girl, boy", version: "2.0" }, { emoji: "👨‍👨‍👦‍👦", category: 1, name: "family: man, man, boy, boy", version: "2.0" }, { emoji: "👨‍👨‍👧‍👧", category: 1, name: "family: man, man, girl, girl", version: "2.0" }, { emoji: "👩‍👩‍👦", category: 1, name: "family: woman, woman, boy", version: "2.0" }, { emoji: "👩‍👩‍👧", category: 1, name: "family: woman, woman, girl", version: "2.0" }, { emoji: "👩‍👩‍👧‍👦", category: 1, name: "family: woman, woman, girl, boy", version: "2.0" }, { emoji: "👩‍👩‍👦‍👦", category: 1, name: "family: woman, woman, boy, boy", version: "2.0" }, { emoji: "👩‍👩‍👧‍👧", category: 1, name: "family: woman, woman, girl, girl", version: "2.0" }, { emoji: "👨‍👦", category: 1, name: "family: man, boy", version: "4.0" }, { emoji: "👨‍👦‍👦", category: 1, name: "family: man, boy, boy", version: "4.0" }, { emoji: "👨‍👧", category: 1, name: "family: man, girl", version: "4.0" }, { emoji: "👨‍👧‍👦", category: 1, name: "family: man, girl, boy", version: "4.0" }, { emoji: "👨‍👧‍👧", category: 1, name: "family: man, girl, girl", version: "4.0" }, { emoji: "👩‍👦", category: 1, name: "family: woman, boy", version: "4.0" }, { emoji: "👩‍👦‍👦", category: 1, name: "family: woman, boy, boy", version: "4.0" }, { emoji: "👩‍👧", category: 1, name: "family: woman, girl", version: "4.0" }, { emoji: "👩‍👧‍👦", category: 1, name: "family: woman, girl, boy", version: "4.0" }, { emoji: "👩‍👧‍👧", category: 1, name: "family: woman, girl, girl", version: "4.0" }, { emoji: "🗣️", category: 1, name: "speaking head", version: "1.0" }, { emoji: "👤", category: 1, name: "bust in silhouette", version: "1.0" }, { emoji: "👥", category: 1, name: "busts in silhouette", version: "1.0" }, { emoji: "🫂", category: 1, name: "people hugging", version: "13.0" }, { emoji: "👣", category: 1, name: "footprints", version: "1.0" }, { emoji: "🐵", category: 2, name: "monkey face", version: "1.0" }, { emoji: "🐒", category: 2, name: "monkey", version: "1.0" }, { emoji: "🦍", category: 2, name: "gorilla", version: "3.0" }, { emoji: "🦧", category: 2, name: "orangutan", version: "12.0" }, { emoji: "🐶", category: 2, name: "dog face", version: "1.0" }, { emoji: "🐕", category: 2, name: "dog", version: "1.0" }, { emoji: "🦮", category: 2, name: "guide dog", version: "12.0" }, { emoji: "🐕‍🦺", category: 2, name: "service dog", version: "12.0" }, { emoji: "🐩", category: 2, name: "poodle", version: "1.0" }, { emoji: "🐺", category: 2, name: "wolf", version: "1.0" }, { emoji: "🦊", category: 2, name: "fox", version: "3.0" }, { emoji: "🦝", category: 2, name: "raccoon", version: "11.0" }, { emoji: "🐱", category: 2, name: "cat face", version: "1.0" }, { emoji: "🐈", category: 2, name: "cat", version: "1.0" }, { emoji: "🐈‍⬛", category: 2, name: "black cat", version: "13.0" }, { emoji: "🦁", category: 2, name: "lion", version: "1.0" }, { emoji: "🐯", category: 2, name: "tiger face", version: "1.0" }, { emoji: "🐅", category: 2, name: "tiger", version: "1.0" }, { emoji: "🐆", category: 2, name: "leopard", version: "1.0" }, { emoji: "🐴", category: 2, name: "horse face", version: "1.0" }, { emoji: "🐎", category: 2, name: "horse", version: "1.0" }, { emoji: "🦄", category: 2, name: "unicorn", version: "1.0" }, { emoji: "🦓", category: 2, name: "zebra", version: "5.0" }, { emoji: "🦌", category: 2, name: "deer", version: "3.0" }, { emoji: "🦬", category: 2, name: "bison", version: "13.0" }, { emoji: "🐮", category: 2, name: "cow face", version: "1.0" }, { emoji: "🐂", category: 2, name: "ox", version: "1.0" }, { emoji: "🐃", category: 2, name: "water buffalo", version: "1.0" }, { emoji: "🐄", category: 2, name: "cow", version: "1.0" }, { emoji: "🐷", category: 2, name: "pig face", version: "1.0" }, { emoji: "🐖", category: 2, name: "pig", version: "1.0" }, { emoji: "🐗", category: 2, name: "boar", version: "1.0" }, { emoji: "🐽", category: 2, name: "pig nose", version: "1.0" }, { emoji: "🐏", category: 2, name: "ram", version: "1.0" }, { emoji: "🐑", category: 2, name: "ewe", version: "1.0" }, { emoji: "🐐", category: 2, name: "goat", version: "1.0" }, { emoji: "🐪", category: 2, name: "camel", version: "1.0" }, { emoji: "🐫", category: 2, name: "two-hump camel", version: "1.0" }, { emoji: "🦙", category: 2, name: "llama", version: "11.0" }, { emoji: "🦒", category: 2, name: "giraffe", version: "5.0" }, { emoji: "🐘", category: 2, name: "elephant", version: "1.0" }, { emoji: "🦣", category: 2, name: "mammoth", version: "13.0" }, { emoji: "🦏", category: 2, name: "rhinoceros", version: "3.0" }, { emoji: "🦛", category: 2, name: "hippopotamus", version: "11.0" }, { emoji: "🐭", category: 2, name: "mouse face", version: "1.0" }, { emoji: "🐁", category: 2, name: "mouse", version: "1.0" }, { emoji: "🐀", category: 2, name: "rat", version: "1.0" }, { emoji: "🐹", category: 2, name: "hamster", version: "1.0" }, { emoji: "🐰", category: 2, name: "rabbit face", version: "1.0" }, { emoji: "🐇", category: 2, name: "rabbit", version: "1.0" }, { emoji: "🐿️", category: 2, name: "chipmunk", version: "1.0" }, { emoji: "🦫", category: 2, name: "beaver", version: "13.0" }, { emoji: "🦔", category: 2, name: "hedgehog", version: "5.0" }, { emoji: "🦇", category: 2, name: "bat", version: "3.0" }, { emoji: "🐻", category: 2, name: "bear", version: "1.0" }, { emoji: "🐻‍❄️", category: 2, name: "polar bear", version: "13.0" }, { emoji: "🐨", category: 2, name: "koala", version: "1.0" }, { emoji: "🐼", category: 2, name: "panda", version: "1.0" }, { emoji: "🦥", category: 2, name: "sloth", version: "12.0" }, { emoji: "🦦", category: 2, name: "otter", version: "12.0" }, { emoji: "🦨", category: 2, name: "skunk", version: "12.0" }, { emoji: "🦘", category: 2, name: "kangaroo", version: "11.0" }, { emoji: "🦡", category: 2, name: "badger", version: "11.0" }, { emoji: "🐾", category: 2, name: "paw prints", version: "1.0" }, { emoji: "🦃", category: 2, name: "turkey", version: "1.0" }, { emoji: "🐔", category: 2, name: "chicken", version: "1.0" }, { emoji: "🐓", category: 2, name: "rooster", version: "1.0" }, { emoji: "🐣", category: 2, name: "hatching chick", version: "1.0" }, { emoji: "🐤", category: 2, name: "baby chick", version: "1.0" }, { emoji: "🐥", category: 2, name: "front-facing baby chick", version: "1.0" }, { emoji: "🐦", category: 2, name: "bird", version: "1.0" }, { emoji: "🐧", category: 2, name: "penguin", version: "1.0" }, { emoji: "🕊️", category: 2, name: "dove", version: "1.0" }, { emoji: "🦅", category: 2, name: "eagle", version: "3.0" }, { emoji: "🦆", category: 2, name: "duck", version: "3.0" }, { emoji: "🦢", category: 2, name: "swan", version: "11.0" }, { emoji: "🦉", category: 2, name: "owl", version: "3.0" }, { emoji: "🦤", category: 2, name: "dodo", version: "13.0" }, { emoji: "🪶", category: 2, name: "feather", version: "13.0" }, { emoji: "🦩", category: 2, name: "flamingo", version: "12.0" }, { emoji: "🦚", category: 2, name: "peacock", version: "11.0" }, { emoji: "🦜", category: 2, name: "parrot", version: "11.0" }, { emoji: "🐸", category: 2, name: "frog", version: "1.0" }, { emoji: "🐊", category: 2, name: "crocodile", version: "1.0" }, { emoji: "🐢", category: 2, name: "turtle", version: "1.0" }, { emoji: "🦎", category: 2, name: "lizard", version: "3.0" }, { emoji: "🐍", category: 2, name: "snake", version: "1.0" }, { emoji: "🐲", category: 2, name: "dragon face", version: "1.0" }, { emoji: "🐉", category: 2, name: "dragon", version: "1.0" }, { emoji: "🦕", category: 2, name: "sauropod", version: "5.0" }, { emoji: "🦖", category: 2, name: "T-Rex", version: "5.0" }, { emoji: "🐳", category: 2, name: "spouting whale", version: "1.0" }, { emoji: "🐋", category: 2, name: "whale", version: "1.0" }, { emoji: "🐬", category: 2, name: "dolphin", version: "1.0" }, { emoji: "🦭", category: 2, name: "seal", version: "13.0" }, { emoji: "🐟", category: 2, name: "fish", version: "1.0" }, { emoji: "🐠", category: 2, name: "tropical fish", version: "1.0" }, { emoji: "🐡", category: 2, name: "blowfish", version: "1.0" }, { emoji: "🦈", category: 2, name: "shark", version: "3.0" }, { emoji: "🐙", category: 2, name: "octopus", version: "1.0" }, { emoji: "🐚", category: 2, name: "spiral shell", version: "1.0" }, { emoji: "🐌", category: 2, name: "snail", version: "1.0" }, { emoji: "🦋", category: 2, name: "butterfly", version: "3.0" }, { emoji: "🐛", category: 2, name: "bug", version: "1.0" }, { emoji: "🐜", category: 2, name: "ant", version: "1.0" }, { emoji: "🐝", category: 2, name: "honeybee", version: "1.0" }, { emoji: "🪲", category: 2, name: "beetle", version: "13.0" }, { emoji: "🐞", category: 2, name: "lady beetle", version: "1.0" }, { emoji: "🦗", category: 2, name: "cricket", version: "5.0" }, { emoji: "🪳", category: 2, name: "cockroach", version: "13.0" }, { emoji: "🕷️", category: 2, name: "spider", version: "1.0" }, { emoji: "🕸️", category: 2, name: "spider web", version: "1.0" }, { emoji: "🦂", category: 2, name: "scorpion", version: "1.0" }, { emoji: "🦟", category: 2, name: "mosquito", version: "11.0" }, { emoji: "🪰", category: 2, name: "fly", version: "13.0" }, { emoji: "🪱", category: 2, name: "worm", version: "13.0" }, { emoji: "🦠", category: 2, name: "microbe", version: "11.0" }, { emoji: "💐", category: 2, name: "bouquet", version: "1.0" }, { emoji: "🌸", category: 2, name: "cherry blossom", version: "1.0" }, { emoji: "💮", category: 2, name: "white flower", version: "1.0" }, { emoji: "🏵️", category: 2, name: "rosette", version: "1.0" }, { emoji: "🌹", category: 2, name: "rose", version: "1.0" }, { emoji: "🥀", category: 2, name: "wilted flower", version: "3.0" }, { emoji: "🌺", category: 2, name: "hibiscus", version: "1.0" }, { emoji: "🌻", category: 2, name: "sunflower", version: "1.0" }, { emoji: "🌼", category: 2, name: "blossom", version: "1.0" }, { emoji: "🌷", category: 2, name: "tulip", version: "1.0" }, { emoji: "🌱", category: 2, name: "seedling", version: "1.0" }, { emoji: "🪴", category: 2, name: "potted plant", version: "13.0" }, { emoji: "🌲", category: 2, name: "evergreen tree", version: "1.0" }, { emoji: "🌳", category: 2, name: "deciduous tree", version: "1.0" }, { emoji: "🌴", category: 2, name: "palm tree", version: "1.0" }, { emoji: "🌵", category: 2, name: "cactus", version: "1.0" }, { emoji: "🌾", category: 2, name: "sheaf of rice", version: "1.0" }, { emoji: "🌿", category: 2, name: "herb", version: "1.0" }, { emoji: "☘️", category: 2, name: "shamrock", version: "1.0" }, { emoji: "🍀", category: 2, name: "four leaf clover", version: "1.0" }, { emoji: "🍁", category: 2, name: "maple leaf", version: "1.0" }, { emoji: "🍂", category: 2, name: "fallen leaf", version: "1.0" }, { emoji: "🍃", category: 2, name: "leaf fluttering in wind", version: "1.0" }, { emoji: "🍇", category: 3, name: "grapes", version: "1.0" }, { emoji: "🍈", category: 3, name: "melon", version: "1.0" }, { emoji: "🍉", category: 3, name: "watermelon", version: "1.0" }, { emoji: "🍊", category: 3, name: "tangerine", version: "1.0" }, { emoji: "🍋", category: 3, name: "lemon", version: "1.0" }, { emoji: "🍌", category: 3, name: "banana", version: "1.0" }, { emoji: "🍍", category: 3, name: "pineapple", version: "1.0" }, { emoji: "🥭", category: 3, name: "mango", version: "11.0" }, { emoji: "🍎", category: 3, name: "red apple", version: "1.0" }, { emoji: "🍏", category: 3, name: "green apple", version: "1.0" }, { emoji: "🍐", category: 3, name: "pear", version: "1.0" }, { emoji: "🍑", category: 3, name: "peach", version: "1.0" }, { emoji: "🍒", category: 3, name: "cherries", version: "1.0" }, { emoji: "🍓", category: 3, name: "strawberry", version: "1.0" }, { emoji: "🫐", category: 3, name: "blueberries", version: "13.0" }, { emoji: "🥝", category: 3, name: "kiwi fruit", version: "3.0" }, { emoji: "🍅", category: 3, name: "tomato", version: "1.0" }, { emoji: "🫒", category: 3, name: "olive", version: "13.0" }, { emoji: "🥥", category: 3, name: "coconut", version: "5.0" }, { emoji: "🥑", category: 3, name: "avocado", version: "3.0" }, { emoji: "🍆", category: 3, name: "eggplant", version: "1.0" }, { emoji: "🥔", category: 3, name: "potato", version: "3.0" }, { emoji: "🥕", category: 3, name: "carrot", version: "3.0" }, { emoji: "🌽", category: 3, name: "ear of corn", version: "1.0" }, { emoji: "🌶️", category: 3, name: "hot pepper", version: "1.0" }, { emoji: "🫑", category: 3, name: "bell pepper", version: "13.0" }, { emoji: "🥒", category: 3, name: "cucumber", version: "3.0" }, { emoji: "🥬", category: 3, name: "leafy green", version: "11.0" }, { emoji: "🥦", category: 3, name: "broccoli", version: "5.0" }, { emoji: "🧄", category: 3, name: "garlic", version: "12.0" }, { emoji: "🧅", category: 3, name: "onion", version: "12.0" }, { emoji: "🍄", category: 3, name: "mushroom", version: "1.0" }, { emoji: "🥜", category: 3, name: "peanuts", version: "3.0" }, { emoji: "🌰", category: 3, name: "chestnut", version: "1.0" }, { emoji: "🍞", category: 3, name: "bread", version: "1.0" }, { emoji: "🥐", category: 3, name: "croissant", version: "3.0" }, { emoji: "🥖", category: 3, name: "baguette bread", version: "3.0" }, { emoji: "🫓", category: 3, name: "flatbread", version: "13.0" }, { emoji: "🥨", category: 3, name: "pretzel", version: "5.0" }, { emoji: "🥯", category: 3, name: "bagel", version: "11.0" }, { emoji: "🥞", category: 3, name: "pancakes", version: "3.0" }, { emoji: "🧇", category: 3, name: "waffle", version: "12.0" }, { emoji: "🧀", category: 3, name: "cheese wedge", version: "1.0" }, { emoji: "🍖", category: 3, name: "meat on bone", version: "1.0" }, { emoji: "🍗", category: 3, name: "poultry leg", version: "1.0" }, { emoji: "🥩", category: 3, name: "cut of meat", version: "5.0" }, { emoji: "🥓", category: 3, name: "bacon", version: "3.0" }, { emoji: "🍔", category: 3, name: "hamburger", version: "1.0" }, { emoji: "🍟", category: 3, name: "french fries", version: "1.0" }, { emoji: "🍕", category: 3, name: "pizza", version: "1.0" }, { emoji: "🌭", category: 3, name: "hot dog", version: "1.0" }, { emoji: "🥪", category: 3, name: "sandwich", version: "5.0" }, { emoji: "🌮", category: 3, name: "taco", version: "1.0" }, { emoji: "🌯", category: 3, name: "burrito", version: "1.0" }, { emoji: "🫔", category: 3, name: "tamale", version: "13.0" }, { emoji: "🥙", category: 3, name: "stuffed flatbread", version: "3.0" }, { emoji: "🧆", category: 3, name: "falafel", version: "12.0" }, { emoji: "🥚", category: 3, name: "egg", version: "3.0" }, { emoji: "🍳", category: 3, name: "cooking", version: "1.0" }, { emoji: "🥘", category: 3, name: "shallow pan of food", version: "3.0" }, { emoji: "🍲", category: 3, name: "pot of food", version: "1.0" }, { emoji: "🫕", category: 3, name: "fondue", version: "13.0" }, { emoji: "🥣", category: 3, name: "bowl with spoon", version: "5.0" }, { emoji: "🥗", category: 3, name: "green salad", version: "3.0" }, { emoji: "🍿", category: 3, name: "popcorn", version: "1.0" }, { emoji: "🧈", category: 3, name: "butter", version: "12.0" }, { emoji: "🧂", category: 3, name: "salt", version: "11.0" }, { emoji: "🥫", category: 3, name: "canned food", version: "5.0" }, { emoji: "🍱", category: 3, name: "bento box", version: "1.0" }, { emoji: "🍘", category: 3, name: "rice cracker", version: "1.0" }, { emoji: "🍙", category: 3, name: "rice ball", version: "1.0" }, { emoji: "🍚", category: 3, name: "cooked rice", version: "1.0" }, { emoji: "🍛", category: 3, name: "curry rice", version: "1.0" }, { emoji: "🍜", category: 3, name: "steaming bowl", version: "1.0" }, { emoji: "🍝", category: 3, name: "spaghetti", version: "1.0" }, { emoji: "🍠", category: 3, name: "roasted sweet potato", version: "1.0" }, { emoji: "🍢", category: 3, name: "oden", version: "1.0" }, { emoji: "🍣", category: 3, name: "sushi", version: "1.0" }, { emoji: "🍤", category: 3, name: "fried shrimp", version: "1.0" }, { emoji: "🍥", category: 3, name: "fish cake with swirl", version: "1.0" }, { emoji: "🥮", category: 3, name: "moon cake", version: "11.0" }, { emoji: "🍡", category: 3, name: "dango", version: "1.0" }, { emoji: "🥟", category: 3, name: "dumpling", version: "5.0" }, { emoji: "🥠", category: 3, name: "fortune cookie", version: "5.0" }, { emoji: "🥡", category: 3, name: "takeout box", version: "5.0" }, { emoji: "🦀", category: 3, name: "crab", version: "1.0" }, { emoji: "🦞", category: 3, name: "lobster", version: "11.0" }, { emoji: "🦐", category: 3, name: "shrimp", version: "3.0" }, { emoji: "🦑", category: 3, name: "squid", version: "3.0" }, { emoji: "🦪", category: 3, name: "oyster", version: "12.0" }, { emoji: "🍦", category: 3, name: "soft ice cream", version: "1.0" }, { emoji: "🍧", category: 3, name: "shaved ice", version: "1.0" }, { emoji: "🍨", category: 3, name: "ice cream", version: "1.0" }, { emoji: "🍩", category: 3, name: "doughnut", version: "1.0" }, { emoji: "🍪", category: 3, name: "cookie", version: "1.0" }, { emoji: "🎂", category: 3, name: "birthday cake", version: "1.0" }, { emoji: "🍰", category: 3, name: "shortcake", version: "1.0" }, { emoji: "🧁", category: 3, name: "cupcake", version: "11.0" }, { emoji: "🥧", category: 3, name: "pie", version: "5.0" }, { emoji: "🍫", category: 3, name: "chocolate bar", version: "1.0" }, { emoji: "🍬", category: 3, name: "candy", version: "1.0" }, { emoji: "🍭", category: 3, name: "lollipop", version: "1.0" }, { emoji: "🍮", category: 3, name: "custard", version: "1.0" }, { emoji: "🍯", category: 3, name: "honey pot", version: "1.0" }, { emoji: "🍼", category: 3, name: "baby bottle", version: "1.0" }, { emoji: "🥛", category: 3, name: "glass of milk", version: "3.0" }, { emoji: "☕", category: 3, name: "hot beverage", version: "1.0" }, { emoji: "🫖", category: 3, name: "teapot", version: "13.0" }, { emoji: "🍵", category: 3, name: "teacup without handle", version: "1.0" }, { emoji: "🍶", category: 3, name: "sake", version: "1.0" }, { emoji: "🍾", category: 3, name: "bottle with popping cork", version: "1.0" }, { emoji: "🍷", category: 3, name: "wine glass", version: "1.0" }, { emoji: "🍸", category: 3, name: "cocktail glass", version: "1.0" }, { emoji: "🍹", category: 3, name: "tropical drink", version: "1.0" }, { emoji: "🍺", category: 3, name: "beer mug", version: "1.0" }, { emoji: "🍻", category: 3, name: "clinking beer mugs", version: "1.0" }, { emoji: "🥂", category: 3, name: "clinking glasses", version: "3.0" }, { emoji: "🥃", category: 3, name: "tumbler glass", version: "3.0" }, { emoji: "🥤", category: 3, name: "cup with straw", version: "5.0" }, { emoji: "🧋", category: 3, name: "bubble tea", version: "13.0" }, { emoji: "🧃", category: 3, name: "beverage box", version: "12.0" }, { emoji: "🧉", category: 3, name: "mate", version: "12.0" }, { emoji: "🧊", category: 3, name: "ice", version: "12.0" }, { emoji: "🥢", category: 3, name: "chopsticks", version: "5.0" }, { emoji: "🍽️", category: 3, name: "fork and knife with plate", version: "1.0" }, { emoji: "🍴", category: 3, name: "fork and knife", version: "1.0" }, { emoji: "🥄", category: 3, name: "spoon", version: "3.0" }, { emoji: "🔪", category: 3, name: "kitchen knife", version: "1.0" }, { emoji: "🏺", category: 3, name: "amphora", version: "1.0" }, { emoji: "🌍", category: 4, name: "globe showing Europe-Africa", version: "1.0" }, { emoji: "🌎", category: 4, name: "globe showing Americas", version: "1.0" }, { emoji: "🌏", category: 4, name: "globe showing Asia-Australia", version: "1.0" }, { emoji: "🌐", category: 4, name: "globe with meridians", version: "1.0" }, { emoji: "🗺️", category: 4, name: "world map", version: "1.0" }, { emoji: "🗾", category: 4, name: "map of Japan", version: "1.0" }, { emoji: "🧭", category: 4, name: "compass", version: "11.0" }, { emoji: "🏔️", category: 4, name: "snow-capped mountain", version: "1.0" }, { emoji: "⛰️", category: 4, name: "mountain", version: "1.0" }, { emoji: "🌋", category: 4, name: "volcano", version: "1.0" }, { emoji: "🗻", category: 4, name: "mount fuji", version: "1.0" }, { emoji: "🏕️", category: 4, name: "camping", version: "1.0" }, { emoji: "🏖️", category: 4, name: "beach with umbrella", version: "1.0" }, { emoji: "🏜️", category: 4, name: "desert", version: "1.0" }, { emoji: "🏝️", category: 4, name: "desert island", version: "1.0" }, { emoji: "🏞️", category: 4, name: "national park", version: "1.0" }, { emoji: "🏟️", category: 4, name: "stadium", version: "1.0" }, { emoji: "🏛️", category: 4, name: "classical building", version: "1.0" }, { emoji: "🏗️", category: 4, name: "building construction", version: "1.0" }, { emoji: "🧱", category: 4, name: "brick", version: "11.0" }, { emoji: "🪨", category: 4, name: "rock", version: "13.0" }, { emoji: "🪵", category: 4, name: "wood", version: "13.0" }, { emoji: "🛖", category: 4, name: "hut", version: "13.0" }, { emoji: "🏘️", category: 4, name: "houses", version: "1.0" }, { emoji: "🏚️", category: 4, name: "derelict house", version: "1.0" }, { emoji: "🏠", category: 4, name: "house", version: "1.0" }, { emoji: "🏡", category: 4, name: "house with garden", version: "1.0" }, { emoji: "🏢", category: 4, name: "office building", version: "1.0" }, { emoji: "🏣", category: 4, name: "Japanese post office", version: "1.0" }, { emoji: "🏤", category: 4, name: "post office", version: "1.0" }, { emoji: "🏥", category: 4, name: "hospital", version: "1.0" }, { emoji: "🏦", category: 4, name: "bank", version: "1.0" }, { emoji: "🏨", category: 4, name: "hotel", version: "1.0" }, { emoji: "🏩", category: 4, name: "love hotel", version: "1.0" }, { emoji: "🏪", category: 4, name: "convenience store", version: "1.0" }, { emoji: "🏫", category: 4, name: "school", version: "1.0" }, { emoji: "🏬", category: 4, name: "department store", version: "1.0" }, { emoji: "🏭", category: 4, name: "factory", version: "1.0" }, { emoji: "🏯", category: 4, name: "Japanese castle", version: "1.0" }, { emoji: "🏰", category: 4, name: "castle", version: "1.0" }, { emoji: "💒", category: 4, name: "wedding", version: "1.0" }, { emoji: "🗼", category: 4, name: "Tokyo tower", version: "1.0" }, { emoji: "🗽", category: 4, name: "Statue of Liberty", version: "1.0" }, { emoji: "⛪", category: 4, name: "church", version: "1.0" }, { emoji: "🕌", category: 4, name: "mosque", version: "1.0" }, { emoji: "🛕", category: 4, name: "hindu temple", version: "12.0" }, { emoji: "🕍", category: 4, name: "synagogue", version: "1.0" }, { emoji: "⛩️", category: 4, name: "shinto shrine", version: "1.0" }, { emoji: "🕋", category: 4, name: "kaaba", version: "1.0" }, { emoji: "⛲", category: 4, name: "fountain", version: "1.0" }, { emoji: "⛺", category: 4, name: "tent", version: "1.0" }, { emoji: "🌁", category: 4, name: "foggy", version: "1.0" }, { emoji: "🌃", category: 4, name: "night with stars", version: "1.0" }, { emoji: "🏙️", category: 4, name: "cityscape", version: "1.0" }, { emoji: "🌄", category: 4, name: "sunrise over mountains", version: "1.0" }, { emoji: "🌅", category: 4, name: "sunrise", version: "1.0" }, { emoji: "🌆", category: 4, name: "cityscape at dusk", version: "1.0" }, { emoji: "🌇", category: 4, name: "sunset", version: "1.0" }, { emoji: "🌉", category: 4, name: "bridge at night", version: "1.0" }, { emoji: "♨️", category: 4, name: "hot springs", version: "1.0" }, { emoji: "🎠", category: 4, name: "carousel horse", version: "1.0" }, { emoji: "🎡", category: 4, name: "ferris wheel", version: "1.0" }, { emoji: "🎢", category: 4, name: "roller coaster", version: "1.0" }, { emoji: "💈", category: 4, name: "barber pole", version: "1.0" }, { emoji: "🎪", category: 4, name: "circus tent", version: "1.0" }, { emoji: "🚂", category: 4, name: "locomotive", version: "1.0" }, { emoji: "🚃", category: 4, name: "railway car", version: "1.0" }, { emoji: "🚄", category: 4, name: "high-speed train", version: "1.0" }, { emoji: "🚅", category: 4, name: "bullet train", version: "1.0" }, { emoji: "🚆", category: 4, name: "train", version: "1.0" }, { emoji: "🚇", category: 4, name: "metro", version: "1.0" }, { emoji: "🚈", category: 4, name: "light rail", version: "1.0" }, { emoji: "🚉", category: 4, name: "station", version: "1.0" }, { emoji: "🚊", category: 4, name: "tram", version: "1.0" }, { emoji: "🚝", category: 4, name: "monorail", version: "1.0" }, { emoji: "🚞", category: 4, name: "mountain railway", version: "1.0" }, { emoji: "🚋", category: 4, name: "tram car", version: "1.0" }, { emoji: "🚌", category: 4, name: "bus", version: "1.0" }, { emoji: "🚍", category: 4, name: "oncoming bus", version: "1.0" }, { emoji: "🚎", category: 4, name: "trolleybus", version: "1.0" }, { emoji: "🚐", category: 4, name: "minibus", version: "1.0" }, { emoji: "🚑", category: 4, name: "ambulance", version: "1.0" }, { emoji: "🚒", category: 4, name: "fire engine", version: "1.0" }, { emoji: "🚓", category: 4, name: "police car", version: "1.0" }, { emoji: "🚔", category: 4, name: "oncoming police car", version: "1.0" }, { emoji: "🚕", category: 4, name: "taxi", version: "1.0" }, { emoji: "🚖", category: 4, name: "oncoming taxi", version: "1.0" }, { emoji: "🚗", category: 4, name: "automobile", version: "1.0" }, { emoji: "🚘", category: 4, name: "oncoming automobile", version: "1.0" }, { emoji: "🚙", category: 4, name: "sport utility vehicle", version: "1.0" }, { emoji: "🛻", category: 4, name: "pickup truck", version: "13.0" }, { emoji: "🚚", category: 4, name: "delivery truck", version: "1.0" }, { emoji: "🚛", category: 4, name: "articulated lorry", version: "1.0" }, { emoji: "🚜", category: 4, name: "tractor", version: "1.0" }, { emoji: "🏎️", category: 4, name: "racing car", version: "1.0" }, { emoji: "🏍️", category: 4, name: "motorcycle", version: "1.0" }, { emoji: "🛵", category: 4, name: "motor scooter", version: "3.0" }, { emoji: "🦽", category: 4, name: "manual wheelchair", version: "12.0" }, { emoji: "🦼", category: 4, name: "motorized wheelchair", version: "12.0" }, { emoji: "🛺", category: 4, name: "auto rickshaw", version: "12.0" }, { emoji: "🚲", category: 4, name: "bicycle", version: "1.0" }, { emoji: "🛴", category: 4, name: "kick scooter", version: "3.0" }, { emoji: "🛹", category: 4, name: "skateboard", version: "11.0" }, { emoji: "🛼", category: 4, name: "roller skate", version: "13.0" }, { emoji: "🚏", category: 4, name: "bus stop", version: "1.0" }, { emoji: "🛣️", category: 4, name: "motorway", version: "1.0" }, { emoji: "🛤️", category: 4, name: "railway track", version: "1.0" }, { emoji: "🛢️", category: 4, name: "oil drum", version: "1.0" }, { emoji: "⛽", category: 4, name: "fuel pump", version: "1.0" }, { emoji: "🚨", category: 4, name: "police car light", version: "1.0" }, { emoji: "🚥", category: 4, name: "horizontal traffic light", version: "1.0" }, { emoji: "🚦", category: 4, name: "vertical traffic light", version: "1.0" }, { emoji: "🛑", category: 4, name: "stop sign", version: "3.0" }, { emoji: "🚧", category: 4, name: "construction", version: "1.0" }, { emoji: "⚓", category: 4, name: "anchor", version: "1.0" }, { emoji: "⛵", category: 4, name: "sailboat", version: "1.0" }, { emoji: "🛶", category: 4, name: "canoe", version: "3.0" }, { emoji: "🚤", category: 4, name: "speedboat", version: "1.0" }, { emoji: "🛳️", category: 4, name: "passenger ship", version: "1.0" }, { emoji: "⛴️", category: 4, name: "ferry", version: "1.0" }, { emoji: "🛥️", category: 4, name: "motor boat", version: "1.0" }, { emoji: "🚢", category: 4, name: "ship", version: "1.0" }, { emoji: "✈️", category: 4, name: "airplane", version: "1.0" }, { emoji: "🛩️", category: 4, name: "small airplane", version: "1.0" }, { emoji: "🛫", category: 4, name: "airplane departure", version: "1.0" }, { emoji: "🛬", category: 4, name: "airplane arrival", version: "1.0" }, { emoji: "🪂", category: 4, name: "parachute", version: "12.0" }, { emoji: "💺", category: 4, name: "seat", version: "1.0" }, { emoji: "🚁", category: 4, name: "helicopter", version: "1.0" }, { emoji: "🚟", category: 4, name: "suspension railway", version: "1.0" }, { emoji: "🚠", category: 4, name: "mountain cableway", version: "1.0" }, { emoji: "🚡", category: 4, name: "aerial tramway", version: "1.0" }, { emoji: "🛰️", category: 4, name: "satellite", version: "1.0" }, { emoji: "🚀", category: 4, name: "rocket", version: "1.0" }, { emoji: "🛸", category: 4, name: "flying saucer", version: "5.0" }, { emoji: "🛎️", category: 4, name: "bellhop bell", version: "1.0" }, { emoji: "🧳", category: 4, name: "luggage", version: "11.0" }, { emoji: "⌛", category: 4, name: "hourglass done", version: "1.0" }, { emoji: "⏳", category: 4, name: "hourglass not done", version: "1.0" }, { emoji: "⌚", category: 4, name: "watch", version: "1.0" }, { emoji: "⏰", category: 4, name: "alarm clock", version: "1.0" }, { emoji: "⏱️", category: 4, name: "stopwatch", version: "1.0" }, { emoji: "⏲️", category: 4, name: "timer clock", version: "1.0" }, { emoji: "🕰️", category: 4, name: "mantelpiece clock", version: "1.0" }, { emoji: "🕛", category: 4, name: "twelve o’clock", version: "1.0" }, { emoji: "🕧", category: 4, name: "twelve-thirty", version: "1.0" }, { emoji: "🕐", category: 4, name: "one o’clock", version: "1.0" }, { emoji: "🕜", category: 4, name: "one-thirty", version: "1.0" }, { emoji: "🕑", category: 4, name: "two o’clock", version: "1.0" }, { emoji: "🕝", category: 4, name: "two-thirty", version: "1.0" }, { emoji: "🕒", category: 4, name: "three o’clock", version: "1.0" }, { emoji: "🕞", category: 4, name: "three-thirty", version: "1.0" }, { emoji: "🕓", category: 4, name: "four o’clock", version: "1.0" }, { emoji: "🕟", category: 4, name: "four-thirty", version: "1.0" }, { emoji: "🕔", category: 4, name: "five o’clock", version: "1.0" }, { emoji: "🕠", category: 4, name: "five-thirty", version: "1.0" }, { emoji: "🕕", category: 4, name: "six o’clock", version: "1.0" }, { emoji: "🕡", category: 4, name: "six-thirty", version: "1.0" }, { emoji: "🕖", category: 4, name: "seven o’clock", version: "1.0" }, { emoji: "🕢", category: 4, name: "seven-thirty", version: "1.0" }, { emoji: "🕗", category: 4, name: "eight o’clock", version: "1.0" }, { emoji: "🕣", category: 4, name: "eight-thirty", version: "1.0" }, { emoji: "🕘", category: 4, name: "nine o’clock", version: "1.0" }, { emoji: "🕤", category: 4, name: "nine-thirty", version: "1.0" }, { emoji: "🕙", category: 4, name: "ten o’clock", version: "1.0" }, { emoji: "🕥", category: 4, name: "ten-thirty", version: "1.0" }, { emoji: "🕚", category: 4, name: "eleven o’clock", version: "1.0" }, { emoji: "🕦", category: 4, name: "eleven-thirty", version: "1.0" }, { emoji: "🌑", category: 4, name: "new moon", version: "1.0" }, { emoji: "🌒", category: 4, name: "waxing crescent moon", version: "1.0" }, { emoji: "🌓", category: 4, name: "first quarter moon", version: "1.0" }, { emoji: "🌔", category: 4, name: "waxing gibbous moon", version: "1.0" }, { emoji: "🌕", category: 4, name: "full moon", version: "1.0" }, { emoji: "🌖", category: 4, name: "waning gibbous moon", version: "1.0" }, { emoji: "🌗", category: 4, name: "last quarter moon", version: "1.0" }, { emoji: "🌘", category: 4, name: "waning crescent moon", version: "1.0" }, { emoji: "🌙", category: 4, name: "crescent moon", version: "1.0" }, { emoji: "🌚", category: 4, name: "new moon face", version: "1.0" }, { emoji: "🌛", category: 4, name: "first quarter moon face", version: "1.0" }, { emoji: "🌜", category: 4, name: "last quarter moon face", version: "1.0" }, { emoji: "🌡️", category: 4, name: "thermometer", version: "1.0" }, { emoji: "☀️", category: 4, name: "sun", version: "1.0" }, { emoji: "🌝", category: 4, name: "full moon face", version: "1.0" }, { emoji: "🌞", category: 4, name: "sun with face", version: "1.0" }, { emoji: "🪐", category: 4, name: "ringed planet", version: "12.0" }, { emoji: "⭐", category: 4, name: "star", version: "1.0" }, { emoji: "🌟", category: 4, name: "glowing star", version: "1.0" }, { emoji: "🌠", category: 4, name: "shooting star", version: "1.0" }, { emoji: "🌌", category: 4, name: "milky way", version: "1.0" }, { emoji: "☁️", category: 4, name: "cloud", version: "1.0" }, { emoji: "⛅", category: 4, name: "sun behind cloud", version: "1.0" }, { emoji: "⛈️", category: 4, name: "cloud with lightning and rain", version: "1.0" }, { emoji: "🌤️", category: 4, name: "sun behind small cloud", version: "1.0" }, { emoji: "🌥️", category: 4, name: "sun behind large cloud", version: "1.0" }, { emoji: "🌦️", category: 4, name: "sun behind rain cloud", version: "1.0" }, { emoji: "🌧️", category: 4, name: "cloud with rain", version: "1.0" }, { emoji: "🌨️", category: 4, name: "cloud with snow", version: "1.0" }, { emoji: "🌩️", category: 4, name: "cloud with lightning", version: "1.0" }, { emoji: "🌪️", category: 4, name: "tornado", version: "1.0" }, { emoji: "🌫️", category: 4, name: "fog", version: "1.0" }, { emoji: "🌬️", category: 4, name: "wind face", version: "1.0" }, { emoji: "🌀", category: 4, name: "cyclone", version: "1.0" }, { emoji: "🌈", category: 4, name: "rainbow", version: "1.0" }, { emoji: "🌂", category: 4, name: "closed umbrella", version: "1.0" }, { emoji: "☂️", category: 4, name: "umbrella", version: "1.0" }, { emoji: "☔", category: 4, name: "umbrella with rain drops", version: "1.0" }, { emoji: "⛱️", category: 4, name: "umbrella on ground", version: "1.0" }, { emoji: "⚡", category: 4, name: "high voltage", version: "1.0" }, { emoji: "❄️", category: 4, name: "snowflake", version: "1.0" }, { emoji: "☃️", category: 4, name: "snowman", version: "1.0" }, { emoji: "⛄", category: 4, name: "snowman without snow", version: "1.0" }, { emoji: "☄️", category: 4, name: "comet", version: "1.0" }, { emoji: "🔥", category: 4, name: "fire", version: "1.0" }, { emoji: "💧", category: 4, name: "droplet", version: "1.0" }, { emoji: "🌊", category: 4, name: "water wave", version: "1.0" }, { emoji: "🎃", category: 5, name: "jack-o-lantern", version: "1.0" }, { emoji: "🎄", category: 5, name: "Christmas tree", version: "1.0" }, { emoji: "🎆", category: 5, name: "fireworks", version: "1.0" }, { emoji: "🎇", category: 5, name: "sparkler", version: "1.0" }, { emoji: "🧨", category: 5, name: "firecracker", version: "11.0" }, { emoji: "✨", category: 5, name: "sparkles", version: "1.0" }, { emoji: "🎈", category: 5, name: "balloon", version: "1.0" }, { emoji: "🎉", category: 5, name: "party popper", version: "1.0" }, { emoji: "🎊", category: 5, name: "confetti ball", version: "1.0" }, { emoji: "🎋", category: 5, name: "tanabata tree", version: "1.0" }, { emoji: "🎍", category: 5, name: "pine decoration", version: "1.0" }, { emoji: "🎎", category: 5, name: "Japanese dolls", version: "1.0" }, { emoji: "🎏", category: 5, name: "carp streamer", version: "1.0" }, { emoji: "🎐", category: 5, name: "wind chime", version: "1.0" }, { emoji: "🎑", category: 5, name: "moon viewing ceremony", version: "1.0" }, { emoji: "🧧", category: 5, name: "red envelope", version: "11.0" }, { emoji: "🎀", category: 5, name: "ribbon", version: "1.0" }, { emoji: "🎁", category: 5, name: "wrapped gift", version: "1.0" }, { emoji: "🎗️", category: 5, name: "reminder ribbon", version: "1.0" }, { emoji: "🎟️", category: 5, name: "admission tickets", version: "1.0" }, { emoji: "🎫", category: 5, name: "ticket", version: "1.0" }, { emoji: "🎖️", category: 5, name: "military medal", version: "1.0" }, { emoji: "🏆", category: 5, name: "trophy", version: "1.0" }, { emoji: "🏅", category: 5, name: "sports medal", version: "1.0" }, { emoji: "🥇", category: 5, name: "1st place medal", version: "3.0" }, { emoji: "🥈", category: 5, name: "2nd place medal", version: "3.0" }, { emoji: "🥉", category: 5, name: "3rd place medal", version: "3.0" }, { emoji: "⚽", category: 5, name: "soccer ball", version: "1.0" }, { emoji: "⚾", category: 5, name: "baseball", version: "1.0" }, { emoji: "🥎", category: 5, name: "softball", version: "11.0" }, { emoji: "🏀", category: 5, name: "basketball", version: "1.0" }, { emoji: "🏐", category: 5, name: "volleyball", version: "1.0" }, { emoji: "🏈", category: 5, name: "american football", version: "1.0" }, { emoji: "🏉", category: 5, name: "rugby football", version: "1.0" }, { emoji: "🎾", category: 5, name: "tennis", version: "1.0" }, { emoji: "🥏", category: 5, name: "flying disc", version: "11.0" }, { emoji: "🎳", category: 5, name: "bowling", version: "1.0" }, { emoji: "🏏", category: 5, name: "cricket game", version: "1.0" }, { emoji: "🏑", category: 5, name: "field hockey", version: "1.0" }, { emoji: "🏒", category: 5, name: "ice hockey", version: "1.0" }, { emoji: "🥍", category: 5, name: "lacrosse", version: "11.0" }, { emoji: "🏓", category: 5, name: "ping pong", version: "1.0" }, { emoji: "🏸", category: 5, name: "badminton", version: "1.0" }, { emoji: "🥊", category: 5, name: "boxing glove", version: "3.0" }, { emoji: "🥋", category: 5, name: "martial arts uniform", version: "3.0" }, { emoji: "🥅", category: 5, name: "goal net", version: "3.0" }, { emoji: "⛳", category: 5, name: "flag in hole", version: "1.0" }, { emoji: "⛸️", category: 5, name: "ice skate", version: "1.0" }, { emoji: "🎣", category: 5, name: "fishing pole", version: "1.0" }, { emoji: "🤿", category: 5, name: "diving mask", version: "12.0" }, { emoji: "🎽", category: 5, name: "running shirt", version: "1.0" }, { emoji: "🎿", category: 5, name: "skis", version: "1.0" }, { emoji: "🛷", category: 5, name: "sled", version: "5.0" }, { emoji: "🥌", category: 5, name: "curling stone", version: "5.0" }, { emoji: "🎯", category: 5, name: "direct hit", version: "1.0" }, { emoji: "🪀", category: 5, name: "yo-yo", version: "12.0" }, { emoji: "🪁", category: 5, name: "kite", version: "12.0" }, { emoji: "🎱", category: 5, name: "pool 8 ball", version: "1.0" }, { emoji: "🔮", category: 5, name: "crystal ball", version: "1.0" }, { emoji: "🪄", category: 5, name: "magic wand", version: "13.0" }, { emoji: "🧿", category: 5, name: "nazar amulet", version: "11.0" }, { emoji: "🎮", category: 5, name: "video game", version: "1.0" }, { emoji: "🕹️", category: 5, name: "joystick", version: "1.0" }, { emoji: "🎰", category: 5, name: "slot machine", version: "1.0" }, { emoji: "🎲", category: 5, name: "game die", version: "1.0" }, { emoji: "🧩", category: 5, name: "puzzle piece", version: "11.0" }, { emoji: "🧸", category: 5, name: "teddy bear", version: "11.0" }, { emoji: "🪅", category: 5, name: "piñata", version: "13.0" }, { emoji: "🪆", category: 5, name: "nesting dolls", version: "13.0" }, { emoji: "♠️", category: 5, name: "spade suit", version: "1.0" }, { emoji: "♥️", category: 5, name: "heart suit", version: "1.0" }, { emoji: "♦️", category: 5, name: "diamond suit", version: "1.0" }, { emoji: "♣️", category: 5, name: "club suit", version: "1.0" }, { emoji: "♟️", category: 5, name: "chess pawn", version: "11.0" }, { emoji: "🃏", category: 5, name: "joker", version: "1.0" }, { emoji: "🀄", category: 5, name: "mahjong red dragon", version: "1.0" }, { emoji: "🎴", category: 5, name: "flower playing cards", version: "1.0" }, { emoji: "🎭", category: 5, name: "performing arts", version: "1.0" }, { emoji: "🖼️", category: 5, name: "framed picture", version: "1.0" }, { emoji: "🎨", category: 5, name: "artist palette", version: "1.0" }, { emoji: "🧵", category: 5, name: "thread", version: "11.0" }, { emoji: "🪡", category: 5, name: "sewing needle", version: "13.0" }, { emoji: "🧶", category: 5, name: "yarn", version: "11.0" }, { emoji: "🪢", category: 5, name: "knot", version: "13.0" }, { emoji: "👓", category: 6, name: "glasses", version: "1.0" }, { emoji: "🕶️", category: 6, name: "sunglasses", version: "1.0" }, { emoji: "🥽", category: 6, name: "goggles", version: "11.0" }, { emoji: "🥼", category: 6, name: "lab coat", version: "11.0" }, { emoji: "🦺", category: 6, name: "safety vest", version: "12.0" }, { emoji: "👔", category: 6, name: "necktie", version: "1.0" }, { emoji: "👕", category: 6, name: "t-shirt", version: "1.0" }, { emoji: "👖", category: 6, name: "jeans", version: "1.0" }, { emoji: "🧣", category: 6, name: "scarf", version: "5.0" }, { emoji: "🧤", category: 6, name: "gloves", version: "5.0" }, { emoji: "🧥", category: 6, name: "coat", version: "5.0" }, { emoji: "🧦", category: 6, name: "socks", version: "5.0" }, { emoji: "👗", category: 6, name: "dress", version: "1.0" }, { emoji: "👘", category: 6, name: "kimono", version: "1.0" }, { emoji: "🥻", category: 6, name: "sari", version: "12.0" }, { emoji: "🩱", category: 6, name: "one-piece swimsuit", version: "12.0" }, { emoji: "🩲", category: 6, name: "briefs", version: "12.0" }, { emoji: "🩳", category: 6, name: "shorts", version: "12.0" }, { emoji: "👙", category: 6, name: "bikini", version: "1.0" }, { emoji: "👚", category: 6, name: "woman’s clothes", version: "1.0" }, { emoji: "👛", category: 6, name: "purse", version: "1.0" }, { emoji: "👜", category: 6, name: "handbag", version: "1.0" }, { emoji: "👝", category: 6, name: "clutch bag", version: "1.0" }, { emoji: "🛍️", category: 6, name: "shopping bags", version: "1.0" }, { emoji: "🎒", category: 6, name: "backpack", version: "1.0" }, { emoji: "🩴", category: 6, name: "thong sandal", version: "13.0" }, { emoji: "👞", category: 6, name: "man’s shoe", version: "1.0" }, { emoji: "👟", category: 6, name: "running shoe", version: "1.0" }, { emoji: "🥾", category: 6, name: "hiking boot", version: "11.0" }, { emoji: "🥿", category: 6, name: "flat shoe", version: "11.0" }, { emoji: "👠", category: 6, name: "high-heeled shoe", version: "1.0" }, { emoji: "👡", category: 6, name: "woman’s sandal", version: "1.0" }, { emoji: "🩰", category: 6, name: "ballet shoes", version: "12.0" }, { emoji: "👢", category: 6, name: "woman’s boot", version: "1.0" }, { emoji: "👑", category: 6, name: "crown", version: "1.0" }, { emoji: "👒", category: 6, name: "woman’s hat", version: "1.0" }, { emoji: "🎩", category: 6, name: "top hat", version: "1.0" }, { emoji: "🎓", category: 6, name: "graduation cap", version: "1.0" }, { emoji: "🧢", category: 6, name: "billed cap", version: "5.0" }, { emoji: "🪖", category: 6, name: "military helmet", version: "13.0" }, { emoji: "⛑️", category: 6, name: "rescue worker’s helmet", version: "1.0" }, { emoji: "📿", category: 6, name: "prayer beads", version: "1.0" }, { emoji: "💄", category: 6, name: "lipstick", version: "1.0" }, { emoji: "💍", category: 6, name: "ring", version: "1.0" }, { emoji: "💎", category: 6, name: "gem stone", version: "1.0" }, { emoji: "🔇", category: 6, name: "muted speaker", version: "1.0" }, { emoji: "🔈", category: 6, name: "speaker low volume", version: "1.0" }, { emoji: "🔉", category: 6, name: "speaker medium volume", version: "1.0" }, { emoji: "🔊", category: 6, name: "speaker high volume", version: "1.0" }, { emoji: "📢", category: 6, name: "loudspeaker", version: "1.0" }, { emoji: "📣", category: 6, name: "megaphone", version: "1.0" }, { emoji: "📯", category: 6, name: "postal horn", version: "1.0" }, { emoji: "🔔", category: 6, name: "bell", version: "1.0" }, { emoji: "🔕", category: 6, name: "bell with slash", version: "1.0" }, { emoji: "🎼", category: 6, name: "musical score", version: "1.0" }, { emoji: "🎵", category: 6, name: "musical note", version: "1.0" }, { emoji: "🎶", category: 6, name: "musical notes", version: "1.0" }, { emoji: "🎙️", category: 6, name: "studio microphone", version: "1.0" }, { emoji: "🎚️", category: 6, name: "level slider", version: "1.0" }, { emoji: "🎛️", category: 6, name: "control knobs", version: "1.0" }, { emoji: "🎤", category: 6, name: "microphone", version: "1.0" }, { emoji: "🎧", category: 6, name: "headphone", version: "1.0" }, { emoji: "📻", category: 6, name: "radio", version: "1.0" }, { emoji: "🎷", category: 6, name: "saxophone", version: "1.0" }, { emoji: "🪗", category: 6, name: "accordion", version: "13.0" }, { emoji: "🎸", category: 6, name: "guitar", version: "1.0" }, { emoji: "🎹", category: 6, name: "musical keyboard", version: "1.0" }, { emoji: "🎺", category: 6, name: "trumpet", version: "1.0" }, { emoji: "🎻", category: 6, name: "violin", version: "1.0" }, { emoji: "🪕", category: 6, name: "banjo", version: "12.0" }, { emoji: "🥁", category: 6, name: "drum", version: "3.0" }, { emoji: "🪘", category: 6, name: "long drum", version: "13.0" }, { emoji: "📱", category: 6, name: "mobile phone", version: "1.0" }, { emoji: "📲", category: 6, name: "mobile phone with arrow", version: "1.0" }, { emoji: "☎️", category: 6, name: "telephone", version: "1.0" }, { emoji: "📞", category: 6, name: "telephone receiver", version: "1.0" }, { emoji: "📟", category: 6, name: "pager", version: "1.0" }, { emoji: "📠", category: 6, name: "fax machine", version: "1.0" }, { emoji: "🔋", category: 6, name: "battery", version: "1.0" }, { emoji: "🔌", category: 6, name: "electric plug", version: "1.0" }, { emoji: "💻", category: 6, name: "laptop", version: "1.0" }, { emoji: "🖥️", category: 6, name: "desktop computer", version: "1.0" }, { emoji: "🖨️", category: 6, name: "printer", version: "1.0" }, { emoji: "⌨️", category: 6, name: "keyboard", version: "1.0" }, { emoji: "🖱️", category: 6, name: "computer mouse", version: "1.0" }, { emoji: "🖲️", category: 6, name: "trackball", version: "1.0" }, { emoji: "💽", category: 6, name: "computer disk", version: "1.0" }, { emoji: "💾", category: 6, name: "floppy disk", version: "1.0" }, { emoji: "💿", category: 6, name: "optical disk", version: "1.0" }, { emoji: "📀", category: 6, name: "dvd", version: "1.0" }, { emoji: "🧮", category: 6, name: "abacus", version: "11.0" }, { emoji: "🎥", category: 6, name: "movie camera", version: "1.0" }, { emoji: "🎞️", category: 6, name: "film frames", version: "1.0" }, { emoji: "📽️", category: 6, name: "film projector", version: "1.0" }, { emoji: "🎬", category: 6, name: "clapper board", version: "1.0" }, { emoji: "📺", category: 6, name: "television", version: "1.0" }, { emoji: "📷", category: 6, name: "camera", version: "1.0" }, { emoji: "📸", category: 6, name: "camera with flash", version: "1.0" }, { emoji: "📹", category: 6, name: "video camera", version: "1.0" }, { emoji: "📼", category: 6, name: "videocassette", version: "1.0" }, { emoji: "🔍", category: 6, name: "magnifying glass tilted left", version: "1.0" }, { emoji: "🔎", category: 6, name: "magnifying glass tilted right", version: "1.0" }, { emoji: "🕯️", category: 6, name: "candle", version: "1.0" }, { emoji: "💡", category: 6, name: "light bulb", version: "1.0" }, { emoji: "🔦", category: 6, name: "flashlight", version: "1.0" }, { emoji: "🏮", category: 6, name: "red paper lantern", version: "1.0" }, { emoji: "🪔", category: 6, name: "diya lamp", version: "12.0" }, { emoji: "📔", category: 6, name: "notebook with decorative cover", version: "1.0" }, { emoji: "📕", category: 6, name: "closed book", version: "1.0" }, { emoji: "📖", category: 6, name: "open book", version: "1.0" }, { emoji: "📗", category: 6, name: "green book", version: "1.0" }, { emoji: "📘", category: 6, name: "blue book", version: "1.0" }, { emoji: "📙", category: 6, name: "orange book", version: "1.0" }, { emoji: "📚", category: 6, name: "books", version: "1.0" }, { emoji: "📓", category: 6, name: "notebook", version: "1.0" }, { emoji: "📒", category: 6, name: "ledger", version: "1.0" }, { emoji: "📃", category: 6, name: "page with curl", version: "1.0" }, { emoji: "📜", category: 6, name: "scroll", version: "1.0" }, { emoji: "📄", category: 6, name: "page facing up", version: "1.0" }, { emoji: "📰", category: 6, name: "newspaper", version: "1.0" }, { emoji: "🗞️", category: 6, name: "rolled-up newspaper", version: "1.0" }, { emoji: "📑", category: 6, name: "bookmark tabs", version: "1.0" }, { emoji: "🔖", category: 6, name: "bookmark", version: "1.0" }, { emoji: "🏷️", category: 6, name: "label", version: "1.0" }, { emoji: "💰", category: 6, name: "money bag", version: "1.0" }, { emoji: "🪙", category: 6, name: "coin", version: "13.0" }, { emoji: "💴", category: 6, name: "yen banknote", version: "1.0" }, { emoji: "💵", category: 6, name: "dollar banknote", version: "1.0" }, { emoji: "💶", category: 6, name: "euro banknote", version: "1.0" }, { emoji: "💷", category: 6, name: "pound banknote", version: "1.0" }, { emoji: "💸", category: 6, name: "money with wings", version: "1.0" }, { emoji: "💳", category: 6, name: "credit card", version: "1.0" }, { emoji: "🧾", category: 6, name: "receipt", version: "11.0" }, { emoji: "💹", category: 6, name: "chart increasing with yen", version: "1.0" }, { emoji: "✉️", category: 6, name: "envelope", version: "1.0" }, { emoji: "📧", category: 6, name: "e-mail", version: "1.0" }, { emoji: "📨", category: 6, name: "incoming envelope", version: "1.0" }, { emoji: "📩", category: 6, name: "envelope with arrow", version: "1.0" }, { emoji: "📤", category: 6, name: "outbox tray", version: "1.0" }, { emoji: "📥", category: 6, name: "inbox tray", version: "1.0" }, { emoji: "📦", category: 6, name: "package", version: "1.0" }, { emoji: "📫", category: 6, name: "closed mailbox with raised flag", version: "1.0" }, { emoji: "📪", category: 6, name: "closed mailbox with lowered flag", version: "1.0" }, { emoji: "📬", category: 6, name: "open mailbox with raised flag", version: "1.0" }, { emoji: "📭", category: 6, name: "open mailbox with lowered flag", version: "1.0" }, { emoji: "📮", category: 6, name: "postbox", version: "1.0" }, { emoji: "🗳️", category: 6, name: "ballot box with ballot", version: "1.0" }, { emoji: "✏️", category: 6, name: "pencil", version: "1.0" }, { emoji: "✒️", category: 6, name: "black nib", version: "1.0" }, { emoji: "🖋️", category: 6, name: "fountain pen", version: "1.0" }, { emoji: "🖊️", category: 6, name: "pen", version: "1.0" }, { emoji: "🖌️", category: 6, name: "paintbrush", version: "1.0" }, { emoji: "🖍️", category: 6, name: "crayon", version: "1.0" }, { emoji: "📝", category: 6, name: "memo", version: "1.0" }, { emoji: "💼", category: 6, name: "briefcase", version: "1.0" }, { emoji: "📁", category: 6, name: "file folder", version: "1.0" }, { emoji: "📂", category: 6, name: "open file folder", version: "1.0" }, { emoji: "🗂️", category: 6, name: "card index dividers", version: "1.0" }, { emoji: "📅", category: 6, name: "calendar", version: "1.0" }, { emoji: "📆", category: 6, name: "tear-off calendar", version: "1.0" }, { emoji: "🗒️", category: 6, name: "spiral notepad", version: "1.0" }, { emoji: "🗓️", category: 6, name: "spiral calendar", version: "1.0" }, { emoji: "📇", category: 6, name: "card index", version: "1.0" }, { emoji: "📈", category: 6, name: "chart increasing", version: "1.0" }, { emoji: "📉", category: 6, name: "chart decreasing", version: "1.0" }, { emoji: "📊", category: 6, name: "bar chart", version: "1.0" }, { emoji: "📋", category: 6, name: "clipboard", version: "1.0" }, { emoji: "📌", category: 6, name: "pushpin", version: "1.0" }, { emoji: "📍", category: 6, name: "round pushpin", version: "1.0" }, { emoji: "📎", category: 6, name: "paperclip", version: "1.0" }, { emoji: "🖇️", category: 6, name: "linked paperclips", version: "1.0" }, { emoji: "📏", category: 6, name: "straight ruler", version: "1.0" }, { emoji: "📐", category: 6, name: "triangular ruler", version: "1.0" }, { emoji: "✂️", category: 6, name: "scissors", version: "1.0" }, { emoji: "🗃️", category: 6, name: "card file box", version: "1.0" }, { emoji: "🗄️", category: 6, name: "file cabinet", version: "1.0" }, { emoji: "🗑️", category: 6, name: "wastebasket", version: "1.0" }, { emoji: "🔒", category: 6, name: "locked", version: "1.0" }, { emoji: "🔓", category: 6, name: "unlocked", version: "1.0" }, { emoji: "🔏", category: 6, name: "locked with pen", version: "1.0" }, { emoji: "🔐", category: 6, name: "locked with key", version: "1.0" }, { emoji: "🔑", category: 6, name: "key", version: "1.0" }, { emoji: "🗝️", category: 6, name: "old key", version: "1.0" }, { emoji: "🔨", category: 6, name: "hammer", version: "1.0" }, { emoji: "🪓", category: 6, name: "axe", version: "12.0" }, { emoji: "⛏️", category: 6, name: "pick", version: "1.0" }, { emoji: "⚒️", category: 6, name: "hammer and pick", version: "1.0" }, { emoji: "🛠️", category: 6, name: "hammer and wrench", version: "1.0" }, { emoji: "🗡️", category: 6, name: "dagger", version: "1.0" }, { emoji: "⚔️", category: 6, name: "crossed swords", version: "1.0" }, { emoji: "🔫", category: 6, name: "pistol", version: "1.0" }, { emoji: "🪃", category: 6, name: "boomerang", version: "13.0" }, { emoji: "🏹", category: 6, name: "bow and arrow", version: "1.0" }, { emoji: "🛡️", category: 6, name: "shield", version: "1.0" }, { emoji: "🪚", category: 6, name: "carpentry saw", version: "13.0" }, { emoji: "🔧", category: 6, name: "wrench", version: "1.0" }, { emoji: "🪛", category: 6, name: "screwdriver", version: "13.0" }, { emoji: "🔩", category: 6, name: "nut and bolt", version: "1.0" }, { emoji: "⚙️", category: 6, name: "gear", version: "1.0" }, { emoji: "🗜️", category: 6, name: "clamp", version: "1.0" }, { emoji: "⚖️", category: 6, name: "balance scale", version: "1.0" }, { emoji: "🦯", category: 6, name: "white cane", version: "12.0" }, { emoji: "🔗", category: 6, name: "link", version: "1.0" }, { emoji: "⛓️", category: 6, name: "chains", version: "1.0" }, { emoji: "🪝", category: 6, name: "hook", version: "13.0" }, { emoji: "🧰", category: 6, name: "toolbox", version: "11.0" }, { emoji: "🧲", category: 6, name: "magnet", version: "11.0" }, { emoji: "🪜", category: 6, name: "ladder", version: "13.0" }, { emoji: "⚗️", category: 6, name: "alembic", version: "1.0" }, { emoji: "🧪", category: 6, name: "test tube", version: "11.0" }, { emoji: "🧫", category: 6, name: "petri dish", version: "11.0" }, { emoji: "🧬", category: 6, name: "dna", version: "11.0" }, { emoji: "🔬", category: 6, name: "microscope", version: "1.0" }, { emoji: "🔭", category: 6, name: "telescope", version: "1.0" }, { emoji: "📡", category: 6, name: "satellite antenna", version: "1.0" }, { emoji: "💉", category: 6, name: "syringe", version: "1.0" }, { emoji: "🩸", category: 6, name: "drop of blood", version: "12.0" }, { emoji: "💊", category: 6, name: "pill", version: "1.0" }, { emoji: "🩹", category: 6, name: "adhesive bandage", version: "12.0" }, { emoji: "🩺", category: 6, name: "stethoscope", version: "12.0" }, { emoji: "🚪", category: 6, name: "door", version: "1.0" }, { emoji: "🛗", category: 6, name: "elevator", version: "13.0" }, { emoji: "🪞", category: 6, name: "mirror", version: "13.0" }, { emoji: "🪟", category: 6, name: "window", version: "13.0" }, { emoji: "🛏️", category: 6, name: "bed", version: "1.0" }, { emoji: "🛋️", category: 6, name: "couch and lamp", version: "1.0" }, { emoji: "🪑", category: 6, name: "chair", version: "12.0" }, { emoji: "🚽", category: 6, name: "toilet", version: "1.0" }, { emoji: "🪠", category: 6, name: "plunger", version: "13.0" }, { emoji: "🚿", category: 6, name: "shower", version: "1.0" }, { emoji: "🛁", category: 6, name: "bathtub", version: "1.0" }, { emoji: "🪤", category: 6, name: "mouse trap", version: "13.0" }, { emoji: "🪒", category: 6, name: "razor", version: "12.0" }, { emoji: "🧴", category: 6, name: "lotion bottle", version: "11.0" }, { emoji: "🧷", category: 6, name: "safety pin", version: "11.0" }, { emoji: "🧹", category: 6, name: "broom", version: "11.0" }, { emoji: "🧺", category: 6, name: "basket", version: "11.0" }, { emoji: "🧻", category: 6, name: "roll of paper", version: "11.0" }, { emoji: "🪣", category: 6, name: "bucket", version: "13.0" }, { emoji: "🧼", category: 6, name: "soap", version: "11.0" }, { emoji: "🪥", category: 6, name: "toothbrush", version: "13.0" }, { emoji: "🧽", category: 6, name: "sponge", version: "11.0" }, { emoji: "🧯", category: 6, name: "fire extinguisher", version: "11.0" }, { emoji: "🛒", category: 6, name: "shopping cart", version: "3.0" }, { emoji: "🚬", category: 6, name: "cigarette", version: "1.0" }, { emoji: "⚰️", category: 6, name: "coffin", version: "1.0" }, { emoji: "🪦", category: 6, name: "headstone", version: "13.0" }, { emoji: "⚱️", category: 6, name: "funeral urn", version: "1.0" }, { emoji: "🗿", category: 6, name: "moai", version: "1.0" }, { emoji: "🪧", category: 6, name: "placard", version: "13.0" }, { emoji: "🏧", category: 7, name: "ATM sign", version: "1.0" }, { emoji: "🚮", category: 7, name: "litter in bin sign", version: "1.0" }, { emoji: "🚰", category: 7, name: "potable water", version: "1.0" }, { emoji: "♿", category: 7, name: "wheelchair symbol", version: "1.0" }, { emoji: "🚹", category: 7, name: "men’s room", version: "1.0" }, { emoji: "🚺", category: 7, name: "women’s room", version: "1.0" }, { emoji: "🚻", category: 7, name: "restroom", version: "1.0" }, { emoji: "🚼", category: 7, name: "baby symbol", version: "1.0" }, { emoji: "🚾", category: 7, name: "water closet", version: "1.0" }, { emoji: "🛂", category: 7, name: "passport control", version: "1.0" }, { emoji: "🛃", category: 7, name: "customs", version: "1.0" }, { emoji: "🛄", category: 7, name: "baggage claim", version: "1.0" }, { emoji: "🛅", category: 7, name: "left luggage", version: "1.0" }, { emoji: "⚠️", category: 7, name: "warning", version: "1.0" }, { emoji: "🚸", category: 7, name: "children crossing", version: "1.0" }, { emoji: "⛔", category: 7, name: "no entry", version: "1.0" }, { emoji: "🚫", category: 7, name: "prohibited", version: "1.0" }, { emoji: "🚳", category: 7, name: "no bicycles", version: "1.0" }, { emoji: "🚭", category: 7, name: "no smoking", version: "1.0" }, { emoji: "🚯", category: 7, name: "no littering", version: "1.0" }, { emoji: "🚱", category: 7, name: "non-potable water", version: "1.0" }, { emoji: "🚷", category: 7, name: "no pedestrians", version: "1.0" }, { emoji: "📵", category: 7, name: "no mobile phones", version: "1.0" }, { emoji: "🔞", category: 7, name: "no one under eighteen", version: "1.0" }, { emoji: "☢️", category: 7, name: "radioactive", version: "1.0" }, { emoji: "☣️", category: 7, name: "biohazard", version: "1.0" }, { emoji: "⬆️", category: 7, name: "up arrow", version: "1.0" }, { emoji: "↗️", category: 7, name: "up-right arrow", version: "1.0" }, { emoji: "➡️", category: 7, name: "right arrow", version: "1.0" }, { emoji: "↘️", category: 7, name: "down-right arrow", version: "1.0" }, { emoji: "⬇️", category: 7, name: "down arrow", version: "1.0" }, { emoji: "↙️", category: 7, name: "down-left arrow", version: "1.0" }, { emoji: "⬅️", category: 7, name: "left arrow", version: "1.0" }, { emoji: "↖️", category: 7, name: "up-left arrow", version: "1.0" }, { emoji: "↕️", category: 7, name: "up-down arrow", version: "1.0" }, { emoji: "↔️", category: 7, name: "left-right arrow", version: "1.0" }, { emoji: "↩️", category: 7, name: "right arrow curving left", version: "1.0" }, { emoji: "↪️", category: 7, name: "left arrow curving right", version: "1.0" }, { emoji: "⤴️", category: 7, name: "right arrow curving up", version: "1.0" }, { emoji: "⤵️", category: 7, name: "right arrow curving down", version: "1.0" }, { emoji: "🔃", category: 7, name: "clockwise vertical arrows", version: "1.0" }, { emoji: "🔄", category: 7, name: "counterclockwise arrows button", version: "1.0" }, { emoji: "🔙", category: 7, name: "BACK arrow", version: "1.0" }, { emoji: "🔚", category: 7, name: "END arrow", version: "1.0" }, { emoji: "🔛", category: 7, name: "ON! arrow", version: "1.0" }, { emoji: "🔜", category: 7, name: "SOON arrow", version: "1.0" }, { emoji: "🔝", category: 7, name: "TOP arrow", version: "1.0" }, { emoji: "🛐", category: 7, name: "place of worship", version: "1.0" }, { emoji: "⚛️", category: 7, name: "atom symbol", version: "1.0" }, { emoji: "🕉️", category: 7, name: "om", version: "1.0" }, { emoji: "✡️", category: 7, name: "star of David", version: "1.0" }, { emoji: "☸️", category: 7, name: "wheel of dharma", version: "1.0" }, { emoji: "☯️", category: 7, name: "yin yang", version: "1.0" }, { emoji: "✝️", category: 7, name: "latin cross", version: "1.0" }, { emoji: "☦️", category: 7, name: "orthodox cross", version: "1.0" }, { emoji: "☪️", category: 7, name: "star and crescent", version: "1.0" }, { emoji: "☮️", category: 7, name: "peace symbol", version: "1.0" }, { emoji: "🕎", category: 7, name: "menorah", version: "1.0" }, { emoji: "🔯", category: 7, name: "dotted six-pointed star", version: "1.0" }, { emoji: "♈", category: 7, name: "Aries", version: "1.0" }, { emoji: "♉", category: 7, name: "Taurus", version: "1.0" }, { emoji: "♊", category: 7, name: "Gemini", version: "1.0" }, { emoji: "♋", category: 7, name: "Cancer", version: "1.0" }, { emoji: "♌", category: 7, name: "Leo", version: "1.0" }, { emoji: "♍", category: 7, name: "Virgo", version: "1.0" }, { emoji: "♎", category: 7, name: "Libra", version: "1.0" }, { emoji: "♏", category: 7, name: "Scorpio", version: "1.0" }, { emoji: "♐", category: 7, name: "Sagittarius", version: "1.0" }, { emoji: "♑", category: 7, name: "Capricorn", version: "1.0" }, { emoji: "♒", category: 7, name: "Aquarius", version: "1.0" }, { emoji: "♓", category: 7, name: "Pisces", version: "1.0" }, { emoji: "⛎", category: 7, name: "Ophiuchus", version: "1.0" }, { emoji: "🔀", category: 7, name: "shuffle tracks button", version: "1.0" }, { emoji: "🔁", category: 7, name: "repeat button", version: "1.0" }, { emoji: "🔂", category: 7, name: "repeat single button", version: "1.0" }, { emoji: "▶️", category: 7, name: "play button", version: "1.0" }, { emoji: "⏩", category: 7, name: "fast-forward button", version: "1.0" }, { emoji: "⏭️", category: 7, name: "next track button", version: "1.0" }, { emoji: "⏯️", category: 7, name: "play or pause button", version: "1.0" }, { emoji: "◀️", category: 7, name: "reverse button", version: "1.0" }, { emoji: "⏪", category: 7, name: "fast reverse button", version: "1.0" }, { emoji: "⏮️", category: 7, name: "last track button", version: "1.0" }, { emoji: "🔼", category: 7, name: "upwards button", version: "1.0" }, { emoji: "⏫", category: 7, name: "fast up button", version: "1.0" }, { emoji: "🔽", category: 7, name: "downwards button", version: "1.0" }, { emoji: "⏬", category: 7, name: "fast down button", version: "1.0" }, { emoji: "⏸️", category: 7, name: "pause button", version: "1.0" }, { emoji: "⏹️", category: 7, name: "stop button", version: "1.0" }, { emoji: "⏺️", category: 7, name: "record button", version: "1.0" }, { emoji: "⏏️", category: 7, name: "eject button", version: "1.0" }, { emoji: "🎦", category: 7, name: "cinema", version: "1.0" }, { emoji: "🔅", category: 7, name: "dim button", version: "1.0" }, { emoji: "🔆", category: 7, name: "bright button", version: "1.0" }, { emoji: "📶", category: 7, name: "antenna bars", version: "1.0" }, { emoji: "📳", category: 7, name: "vibration mode", version: "1.0" }, { emoji: "📴", category: 7, name: "mobile phone off", version: "1.0" }, { emoji: "♀️", category: 7, name: "female sign", version: "4.0" }, { emoji: "♂️", category: 7, name: "male sign", version: "4.0" }, { emoji: "⚧️", category: 7, name: "transgender symbol", version: "13.0" }, { emoji: "✖️", category: 7, name: "multiply", version: "1.0" }, { emoji: "➕", category: 7, name: "plus", version: "1.0" }, { emoji: "➖", category: 7, name: "minus", version: "1.0" }, { emoji: "➗", category: 7, name: "divide", version: "1.0" }, { emoji: "♾️", category: 7, name: "infinity", version: "11.0" }, { emoji: "‼️", category: 7, name: "double exclamation mark", version: "1.0" }, { emoji: "⁉️", category: 7, name: "exclamation question mark", version: "1.0" }, { emoji: "❓", category: 7, name: "question mark", version: "1.0" }, { emoji: "❔", category: 7, name: "white question mark", version: "1.0" }, { emoji: "❕", category: 7, name: "white exclamation mark", version: "1.0" }, { emoji: "❗", category: 7, name: "exclamation mark", version: "1.0" }, { emoji: "〰️", category: 7, name: "wavy dash", version: "1.0" }, { emoji: "💱", category: 7, name: "currency exchange", version: "1.0" }, { emoji: "💲", category: 7, name: "heavy dollar sign", version: "1.0" }, { emoji: "⚕️", category: 7, name: "medical symbol", version: "4.0" }, { emoji: "♻️", category: 7, name: "recycling symbol", version: "1.0" }, { emoji: "⚜️", category: 7, name: "fleur-de-lis", version: "1.0" }, { emoji: "🔱", category: 7, name: "trident emblem", version: "1.0" }, { emoji: "📛", category: 7, name: "name badge", version: "1.0" }, { emoji: "🔰", category: 7, name: "Japanese symbol for beginner", version: "1.0" }, { emoji: "⭕", category: 7, name: "hollow red circle", version: "1.0" }, { emoji: "✅", category: 7, name: "check mark button", version: "1.0" }, { emoji: "☑️", category: 7, name: "check box with check", version: "1.0" }, { emoji: "✔️", category: 7, name: "check mark", version: "1.0" }, { emoji: "❌", category: 7, name: "cross mark", version: "1.0" }, { emoji: "❎", category: 7, name: "cross mark button", version: "1.0" }, { emoji: "➰", category: 7, name: "curly loop", version: "1.0" }, { emoji: "➿", category: 7, name: "double curly loop", version: "1.0" }, { emoji: "〽️", category: 7, name: "part alternation mark", version: "1.0" }, { emoji: "✳️", category: 7, name: "eight-spoked asterisk", version: "1.0" }, { emoji: "✴️", category: 7, name: "eight-pointed star", version: "1.0" }, { emoji: "❇️", category: 7, name: "sparkle", version: "1.0" }, { emoji: "©️", category: 7, name: "copyright", version: "1.0" }, { emoji: "®️", category: 7, name: "registered", version: "1.0" }, { emoji: "™️", category: 7, name: "trade mark", version: "1.0" }, { emoji: "#️⃣", category: 7, name: "keycap: #", version: "1.0" }, { emoji: "*️⃣", category: 7, name: "keycap: *", version: "2.0" }, { emoji: "0️⃣", category: 7, name: "keycap: 0", version: "1.0" }, { emoji: "1️⃣", category: 7, name: "keycap: 1", version: "1.0" }, { emoji: "2️⃣", category: 7, name: "keycap: 2", version: "1.0" }, { emoji: "3️⃣", category: 7, name: "keycap: 3", version: "1.0" }, { emoji: "4️⃣", category: 7, name: "keycap: 4", version: "1.0" }, { emoji: "5️⃣", category: 7, name: "keycap: 5", version: "1.0" }, { emoji: "6️⃣", category: 7, name: "keycap: 6", version: "1.0" }, { emoji: "7️⃣", category: 7, name: "keycap: 7", version: "1.0" }, { emoji: "8️⃣", category: 7, name: "keycap: 8", version: "1.0" }, { emoji: "9️⃣", category: 7, name: "keycap: 9", version: "1.0" }, { emoji: "🔟", category: 7, name: "keycap: 10", version: "1.0" }, { emoji: "🔠", category: 7, name: "input latin uppercase", version: "1.0" }, { emoji: "🔡", category: 7, name: "input latin lowercase", version: "1.0" }, { emoji: "🔢", category: 7, name: "input numbers", version: "1.0" }, { emoji: "🔣", category: 7, name: "input symbols", version: "1.0" }, { emoji: "🔤", category: 7, name: "input latin letters", version: "1.0" }, { emoji: "🅰️", category: 7, name: "A button (blood type)", version: "1.0" }, { emoji: "🆎", category: 7, name: "AB button (blood type)", version: "1.0" }, { emoji: "🅱️", category: 7, name: "B button (blood type)", version: "1.0" }, { emoji: "🆑", category: 7, name: "CL button", version: "1.0" }, { emoji: "🆒", category: 7, name: "COOL button", version: "1.0" }, { emoji: "🆓", category: 7, name: "FREE button", version: "1.0" }, { emoji: "ℹ️", category: 7, name: "information", version: "1.0" }, { emoji: "🆔", category: 7, name: "ID button", version: "1.0" }, { emoji: "Ⓜ️", category: 7, name: "circled M", version: "1.0" }, { emoji: "🆕", category: 7, name: "NEW button", version: "1.0" }, { emoji: "🆖", category: 7, name: "NG button", version: "1.0" }, { emoji: "🅾️", category: 7, name: "O button (blood type)", version: "1.0" }, { emoji: "🆗", category: 7, name: "OK button", version: "1.0" }, { emoji: "🅿️", category: 7, name: "P button", version: "1.0" }, { emoji: "🆘", category: 7, name: "SOS button", version: "1.0" }, { emoji: "🆙", category: 7, name: "UP! button", version: "1.0" }, { emoji: "🆚", category: 7, name: "VS button", version: "1.0" }, { emoji: "🈁", category: 7, name: "Japanese “here” button", version: "1.0" }, { emoji: "🈂️", category: 7, name: "Japanese “service charge” button", version: "1.0" }, { emoji: "🈷️", category: 7, name: "Japanese “monthly amount” button", version: "1.0" }, { emoji: "🈶", category: 7, name: "Japanese “not free of charge” button", version: "1.0" }, { emoji: "🈯", category: 7, name: "Japanese “reserved” button", version: "1.0" }, { emoji: "🉐", category: 7, name: "Japanese “bargain” button", version: "1.0" }, { emoji: "🈹", category: 7, name: "Japanese “discount” button", version: "1.0" }, { emoji: "🈚", category: 7, name: "Japanese “free of charge” button", version: "1.0" }, { emoji: "🈲", category: 7, name: "Japanese “prohibited” button", version: "1.0" }, { emoji: "🉑", category: 7, name: "Japanese “acceptable” button", version: "1.0" }, { emoji: "🈸", category: 7, name: "Japanese “application” button", version: "1.0" }, { emoji: "🈴", category: 7, name: "Japanese “passing grade” button", version: "1.0" }, { emoji: "🈳", category: 7, name: "Japanese “vacancy” button", version: "1.0" }, { emoji: "㊗️", category: 7, name: "Japanese “congratulations” button", version: "1.0" }, { emoji: "㊙️", category: 7, name: "Japanese “secret” button", version: "1.0" }, { emoji: "🈺", category: 7, name: "Japanese “open for business” button", version: "1.0" }, { emoji: "🈵", category: 7, name: "Japanese “no vacancy” button", version: "1.0" }, { emoji: "🔴", category: 7, name: "red circle", version: "1.0" }, { emoji: "🟠", category: 7, name: "orange circle", version: "12.0" }, { emoji: "🟡", category: 7, name: "yellow circle", version: "12.0" }, { emoji: "🟢", category: 7, name: "green circle", version: "12.0" }, { emoji: "🔵", category: 7, name: "blue circle", version: "1.0" }, { emoji: "🟣", category: 7, name: "purple circle", version: "12.0" }, { emoji: "🟤", category: 7, name: "brown circle", version: "12.0" }, { emoji: "⚫", category: 7, name: "black circle", version: "1.0" }, { emoji: "⚪", category: 7, name: "white circle", version: "1.0" }, { emoji: "🟥", category: 7, name: "red square", version: "12.0" }, { emoji: "🟧", category: 7, name: "orange square", version: "12.0" }, { emoji: "🟨", category: 7, name: "yellow square", version: "12.0" }, { emoji: "🟩", category: 7, name: "green square", version: "12.0" }, { emoji: "🟦", category: 7, name: "blue square", version: "12.0" }, { emoji: "🟪", category: 7, name: "purple square", version: "12.0" }, { emoji: "🟫", category: 7, name: "brown square", version: "12.0" }, { emoji: "⬛", category: 7, name: "black large square", version: "1.0" }, { emoji: "⬜", category: 7, name: "white large square", version: "1.0" }, { emoji: "◼️", category: 7, name: "black medium square", version: "1.0" }, { emoji: "◻️", category: 7, name: "white medium square", version: "1.0" }, { emoji: "◾", category: 7, name: "black medium-small square", version: "1.0" }, { emoji: "◽", category: 7, name: "white medium-small square", version: "1.0" }, { emoji: "▪️", category: 7, name: "black small square", version: "1.0" }, { emoji: "▫️", category: 7, name: "white small square", version: "1.0" }, { emoji: "🔶", category: 7, name: "large orange diamond", version: "1.0" }, { emoji: "🔷", category: 7, name: "large blue diamond", version: "1.0" }, { emoji: "🔸", category: 7, name: "small orange diamond", version: "1.0" }, { emoji: "🔹", category: 7, name: "small blue diamond", version: "1.0" }, { emoji: "🔺", category: 7, name: "red triangle pointed up", version: "1.0" }, { emoji: "🔻", category: 7, name: "red triangle pointed down", version: "1.0" }, { emoji: "💠", category: 7, name: "diamond with a dot", version: "1.0" }, { emoji: "🔘", category: 7, name: "radio button", version: "1.0" }, { emoji: "🔳", category: 7, name: "white square button", version: "1.0" }, { emoji: "🔲", category: 7, name: "black square button", version: "1.0" }, { emoji: "🏁", category: 8, name: "chequered flag", version: "1.0" }, { emoji: "🚩", category: 8, name: "triangular flag", version: "1.0" }, { emoji: "🎌", category: 8, name: "crossed flags", version: "1.0" }, { emoji: "🏴", category: 8, name: "black flag", version: "1.0" }, { emoji: "🏳️", category: 8, name: "white flag", version: "1.0" }, { emoji: "🏳️‍🌈", category: 8, name: "rainbow flag", version: "4.0" }, { emoji: "🏳️‍⚧️", category: 8, name: "transgender flag", version: "13.0" }, { emoji: "🏴‍☠️", category: 8, name: "pirate flag", version: "11.0" }, { emoji: "🇦🇨", category: 8, name: "flag: Ascension Island", version: "2.0" }, { emoji: "🇦🇩", category: 8, name: "flag: Andorra", version: "2.0" }, { emoji: "🇦🇪", category: 8, name: "flag: United Arab Emirates", version: "2.0" }, { emoji: "🇦🇫", category: 8, name: "flag: Afghanistan", version: "2.0" }, { emoji: "🇦🇬", category: 8, name: "flag: Antigua & Barbuda", version: "2.0" }, { emoji: "🇦🇮", category: 8, name: "flag: Anguilla", version: "2.0" }, { emoji: "🇦🇱", category: 8, name: "flag: Albania", version: "2.0" }, { emoji: "🇦🇲", category: 8, name: "flag: Armenia", version: "2.0" }, { emoji: "🇦🇴", category: 8, name: "flag: Angola", version: "2.0" }, { emoji: "🇦🇶", category: 8, name: "flag: Antarctica", version: "2.0" }, { emoji: "🇦🇷", category: 8, name: "flag: Argentina", version: "2.0" }, { emoji: "🇦🇸", category: 8, name: "flag: American Samoa", version: "2.0" }, { emoji: "🇦🇹", category: 8, name: "flag: Austria", version: "2.0" }, { emoji: "🇦🇺", category: 8, name: "flag: Australia", version: "2.0" }, { emoji: "🇦🇼", category: 8, name: "flag: Aruba", version: "2.0" }, { emoji: "🇦🇽", category: 8, name: "flag: Åland Islands", version: "2.0" }, { emoji: "🇦🇿", category: 8, name: "flag: Azerbaijan", version: "2.0" }, { emoji: "🇧🇦", category: 8, name: "flag: Bosnia & Herzegovina", version: "2.0" }, { emoji: "🇧🇧", category: 8, name: "flag: Barbados", version: "2.0" }, { emoji: "🇧🇩", category: 8, name: "flag: Bangladesh", version: "2.0" }, { emoji: "🇧🇪", category: 8, name: "flag: Belgium", version: "2.0" }, { emoji: "🇧🇫", category: 8, name: "flag: Burkina Faso", version: "2.0" }, { emoji: "🇧🇬", category: 8, name: "flag: Bulgaria", version: "2.0" }, { emoji: "🇧🇭", category: 8, name: "flag: Bahrain", version: "2.0" }, { emoji: "🇧🇮", category: 8, name: "flag: Burundi", version: "2.0" }, { emoji: "🇧🇯", category: 8, name: "flag: Benin", version: "2.0" }, { emoji: "🇧🇱", category: 8, name: "flag: St. Barthélemy", version: "2.0" }, { emoji: "🇧🇲", category: 8, name: "flag: Bermuda", version: "2.0" }, { emoji: "🇧🇳", category: 8, name: "flag: Brunei", version: "2.0" }, { emoji: "🇧🇴", category: 8, name: "flag: Bolivia", version: "2.0" }, { emoji: "🇧🇶", category: 8, name: "flag: Caribbean Netherlands", version: "2.0" }, { emoji: "🇧🇷", category: 8, name: "flag: Brazil", version: "2.0" }, { emoji: "🇧🇸", category: 8, name: "flag: Bahamas", version: "2.0" }, { emoji: "🇧🇹", category: 8, name: "flag: Bhutan", version: "2.0" }, { emoji: "🇧🇻", category: 8, name: "flag: Bouvet Island", version: "2.0" }, { emoji: "🇧🇼", category: 8, name: "flag: Botswana", version: "2.0" }, { emoji: "🇧🇾", category: 8, name: "flag: Belarus", version: "2.0" }, { emoji: "🇧🇿", category: 8, name: "flag: Belize", version: "2.0" }, { emoji: "🇨🇦", category: 8, name: "flag: Canada", version: "2.0" }, { emoji: "🇨🇨", category: 8, name: "flag: Cocos (Keeling) Islands", version: "2.0" }, { emoji: "🇨🇩", category: 8, name: "flag: Congo - Kinshasa", version: "2.0" }, { emoji: "🇨🇫", category: 8, name: "flag: Central African Republic", version: "2.0" }, { emoji: "🇨🇬", category: 8, name: "flag: Congo - Brazzaville", version: "2.0" }, { emoji: "🇨🇭", category: 8, name: "flag: Switzerland", version: "2.0" }, { emoji: "🇨🇮", category: 8, name: "flag: Côte d’Ivoire", version: "2.0" }, { emoji: "🇨🇰", category: 8, name: "flag: Cook Islands", version: "2.0" }, { emoji: "🇨🇱", category: 8, name: "flag: Chile", version: "2.0" }, { emoji: "🇨🇲", category: 8, name: "flag: Cameroon", version: "2.0" }, { emoji: "🇨🇳", category: 8, name: "flag: China", version: "1.0" }, { emoji: "🇨🇴", category: 8, name: "flag: Colombia", version: "2.0" }, { emoji: "🇨🇵", category: 8, name: "flag: Clipperton Island", version: "2.0" }, { emoji: "🇨🇷", category: 8, name: "flag: Costa Rica", version: "2.0" }, { emoji: "🇨🇺", category: 8, name: "flag: Cuba", version: "2.0" }, { emoji: "🇨🇻", category: 8, name: "flag: Cape Verde", version: "2.0" }, { emoji: "🇨🇼", category: 8, name: "flag: Curaçao", version: "2.0" }, { emoji: "🇨🇽", category: 8, name: "flag: Christmas Island", version: "2.0" }, { emoji: "🇨🇾", category: 8, name: "flag: Cyprus", version: "2.0" }, { emoji: "🇨🇿", category: 8, name: "flag: Czechia", version: "2.0" }, { emoji: "🇩🇪", category: 8, name: "flag: Germany", version: "1.0" }, { emoji: "🇩🇬", category: 8, name: "flag: Diego Garcia", version: "2.0" }, { emoji: "🇩🇯", category: 8, name: "flag: Djibouti", version: "2.0" }, { emoji: "🇩🇰", category: 8, name: "flag: Denmark", version: "2.0" }, { emoji: "🇩🇲", category: 8, name: "flag: Dominica", version: "2.0" }, { emoji: "🇩🇴", category: 8, name: "flag: Dominican Republic", version: "2.0" }, { emoji: "🇩🇿", category: 8, name: "flag: Algeria", version: "2.0" }, { emoji: "🇪🇦", category: 8, name: "flag: Ceuta & Melilla", version: "2.0" }, { emoji: "🇪🇨", category: 8, name: "flag: Ecuador", version: "2.0" }, { emoji: "🇪🇪", category: 8, name: "flag: Estonia", version: "2.0" }, { emoji: "🇪🇬", category: 8, name: "flag: Egypt", version: "2.0" }, { emoji: "🇪🇭", category: 8, name: "flag: Western Sahara", version: "2.0" }, { emoji: "🇪🇷", category: 8, name: "flag: Eritrea", version: "2.0" }, { emoji: "🇪🇸", category: 8, name: "flag: Spain", version: "1.0" }, { emoji: "🇪🇹", category: 8, name: "flag: Ethiopia", version: "2.0" }, { emoji: "🇪🇺", category: 8, name: "flag: European Union", version: "2.0" }, { emoji: "🇫🇮", category: 8, name: "flag: Finland", version: "2.0" }, { emoji: "🇫🇯", category: 8, name: "flag: Fiji", version: "2.0" }, { emoji: "🇫🇰", category: 8, name: "flag: Falkland Islands", version: "2.0" }, { emoji: "🇫🇲", category: 8, name: "flag: Micronesia", version: "2.0" }, { emoji: "🇫🇴", category: 8, name: "flag: Faroe Islands", version: "2.0" }, { emoji: "🇫🇷", category: 8, name: "flag: France", version: "1.0" }, { emoji: "🇬🇦", category: 8, name: "flag: Gabon", version: "2.0" }, { emoji: "🇬🇧", category: 8, name: "flag: United Kingdom", version: "1.0" }, { emoji: "🇬🇩", category: 8, name: "flag: Grenada", version: "2.0" }, { emoji: "🇬🇪", category: 8, name: "flag: Georgia", version: "2.0" }, { emoji: "🇬🇫", category: 8, name: "flag: French Guiana", version: "2.0" }, { emoji: "🇬🇬", category: 8, name: "flag: Guernsey", version: "2.0" }, { emoji: "🇬🇭", category: 8, name: "flag: Ghana", version: "2.0" }, { emoji: "🇬🇮", category: 8, name: "flag: Gibraltar", version: "2.0" }, { emoji: "🇬🇱", category: 8, name: "flag: Greenland", version: "2.0" }, { emoji: "🇬🇲", category: 8, name: "flag: Gambia", version: "2.0" }, { emoji: "🇬🇳", category: 8, name: "flag: Guinea", version: "2.0" }, { emoji: "🇬🇵", category: 8, name: "flag: Guadeloupe", version: "2.0" }, { emoji: "🇬🇶", category: 8, name: "flag: Equatorial Guinea", version: "2.0" }, { emoji: "🇬🇷", category: 8, name: "flag: Greece", version: "2.0" }, { emoji: "🇬🇸", category: 8, name: "flag: South Georgia & South Sandwich Islands", version: "2.0" }, { emoji: "🇬🇹", category: 8, name: "flag: Guatemala", version: "2.0" }, { emoji: "🇬🇺", category: 8, name: "flag: Guam", version: "2.0" }, { emoji: "🇬🇼", category: 8, name: "flag: Guinea-Bissau", version: "2.0" }, { emoji: "🇬🇾", category: 8, name: "flag: Guyana", version: "2.0" }, { emoji: "🇭🇰", category: 8, name: "flag: Hong Kong SAR China", version: "2.0" }, { emoji: "🇭🇲", category: 8, name: "flag: Heard & McDonald Islands", version: "2.0" }, { emoji: "🇭🇳", category: 8, name: "flag: Honduras", version: "2.0" }, { emoji: "🇭🇷", category: 8, name: "flag: Croatia", version: "2.0" }, { emoji: "🇭🇹", category: 8, name: "flag: Haiti", version: "2.0" }, { emoji: "🇭🇺", category: 8, name: "flag: Hungary", version: "2.0" }, { emoji: "🇮🇨", category: 8, name: "flag: Canary Islands", version: "2.0" }, { emoji: "🇮🇩", category: 8, name: "flag: Indonesia", version: "2.0" }, { emoji: "🇮🇪", category: 8, name: "flag: Ireland", version: "2.0" }, { emoji: "🇮🇱", category: 8, name: "flag: Israel", version: "2.0" }, { emoji: "🇮🇲", category: 8, name: "flag: Isle of Man", version: "2.0" }, { emoji: "🇮🇳", category: 8, name: "flag: India", version: "2.0" }, { emoji: "🇮🇴", category: 8, name: "flag: British Indian Ocean Territory", version: "2.0" }, { emoji: "🇮🇶", category: 8, name: "flag: Iraq", version: "2.0" }, { emoji: "🇮🇷", category: 8, name: "flag: Iran", version: "2.0" }, { emoji: "🇮🇸", category: 8, name: "flag: Iceland", version: "2.0" }, { emoji: "🇮🇹", category: 8, name: "flag: Italy", version: "1.0" }, { emoji: "🇯🇪", category: 8, name: "flag: Jersey", version: "2.0" }, { emoji: "🇯🇲", category: 8, name: "flag: Jamaica", version: "2.0" }, { emoji: "🇯🇴", category: 8, name: "flag: Jordan", version: "2.0" }, { emoji: "🇯🇵", category: 8, name: "flag: Japan", version: "1.0" }, { emoji: "🇰🇪", category: 8, name: "flag: Kenya", version: "2.0" }, { emoji: "🇰🇬", category: 8, name: "flag: Kyrgyzstan", version: "2.0" }, { emoji: "🇰🇭", category: 8, name: "flag: Cambodia", version: "2.0" }, { emoji: "🇰🇮", category: 8, name: "flag: Kiribati", version: "2.0" }, { emoji: "🇰🇲", category: 8, name: "flag: Comoros", version: "2.0" }, { emoji: "🇰🇳", category: 8, name: "flag: St. Kitts & Nevis", version: "2.0" }, { emoji: "🇰🇵", category: 8, name: "flag: North Korea", version: "2.0" }, { emoji: "🇰🇷", category: 8, name: "flag: South Korea", version: "1.0" }, { emoji: "🇰🇼", category: 8, name: "flag: Kuwait", version: "2.0" }, { emoji: "🇰🇾", category: 8, name: "flag: Cayman Islands", version: "2.0" }, { emoji: "🇰🇿", category: 8, name: "flag: Kazakhstan", version: "2.0" }, { emoji: "🇱🇦", category: 8, name: "flag: Laos", version: "2.0" }, { emoji: "🇱🇧", category: 8, name: "flag: Lebanon", version: "2.0" }, { emoji: "🇱🇨", category: 8, name: "flag: St. Lucia", version: "2.0" }, { emoji: "🇱🇮", category: 8, name: "flag: Liechtenstein", version: "2.0" }, { emoji: "🇱🇰", category: 8, name: "flag: Sri Lanka", version: "2.0" }, { emoji: "🇱🇷", category: 8, name: "flag: Liberia", version: "2.0" }, { emoji: "🇱🇸", category: 8, name: "flag: Lesotho", version: "2.0" }, { emoji: "🇱🇹", category: 8, name: "flag: Lithuania", version: "2.0" }, { emoji: "🇱🇺", category: 8, name: "flag: Luxembourg", version: "2.0" }, { emoji: "🇱🇻", category: 8, name: "flag: Latvia", version: "2.0" }, { emoji: "🇱🇾", category: 8, name: "flag: Libya", version: "2.0" }, { emoji: "🇲🇦", category: 8, name: "flag: Morocco", version: "2.0" }, { emoji: "🇲🇨", category: 8, name: "flag: Monaco", version: "2.0" }, { emoji: "🇲🇩", category: 8, name: "flag: Moldova", version: "2.0" }, { emoji: "🇲🇪", category: 8, name: "flag: Montenegro", version: "2.0" }, { emoji: "🇲🇫", category: 8, name: "flag: St. Martin", version: "2.0" }, { emoji: "🇲🇬", category: 8, name: "flag: Madagascar", version: "2.0" }, { emoji: "🇲🇭", category: 8, name: "flag: Marshall Islands", version: "2.0" }, { emoji: "🇲🇰", category: 8, name: "flag: North Macedonia", version: "2.0" }, { emoji: "🇲🇱", category: 8, name: "flag: Mali", version: "2.0" }, { emoji: "🇲🇲", category: 8, name: "flag: Myanmar (Burma)", version: "2.0" }, { emoji: "🇲🇳", category: 8, name: "flag: Mongolia", version: "2.0" }, { emoji: "🇲🇴", category: 8, name: "flag: Macao SAR China", version: "2.0" }, { emoji: "🇲🇵", category: 8, name: "flag: Northern Mariana Islands", version: "2.0" }, { emoji: "🇲🇶", category: 8, name: "flag: Martinique", version: "2.0" }, { emoji: "🇲🇷", category: 8, name: "flag: Mauritania", version: "2.0" }, { emoji: "🇲🇸", category: 8, name: "flag: Montserrat", version: "2.0" }, { emoji: "🇲🇹", category: 8, name: "flag: Malta", version: "2.0" }, { emoji: "🇲🇺", category: 8, name: "flag: Mauritius", version: "2.0" }, { emoji: "🇲🇻", category: 8, name: "flag: Maldives", version: "2.0" }, { emoji: "🇲🇼", category: 8, name: "flag: Malawi", version: "2.0" }, { emoji: "🇲🇽", category: 8, name: "flag: Mexico", version: "2.0" }, { emoji: "🇲🇾", category: 8, name: "flag: Malaysia", version: "2.0" }, { emoji: "🇲🇿", category: 8, name: "flag: Mozambique", version: "2.0" }, { emoji: "🇳🇦", category: 8, name: "flag: Namibia", version: "2.0" }, { emoji: "🇳🇨", category: 8, name: "flag: New Caledonia", version: "2.0" }, { emoji: "🇳🇪", category: 8, name: "flag: Niger", version: "2.0" }, { emoji: "🇳🇫", category: 8, name: "flag: Norfolk Island", version: "2.0" }, { emoji: "🇳🇬", category: 8, name: "flag: Nigeria", version: "2.0" }, { emoji: "🇳🇮", category: 8, name: "flag: Nicaragua", version: "2.0" }, { emoji: "🇳🇱", category: 8, name: "flag: Netherlands", version: "2.0" }, { emoji: "🇳🇴", category: 8, name: "flag: Norway", version: "2.0" }, { emoji: "🇳🇵", category: 8, name: "flag: Nepal", version: "2.0" }, { emoji: "🇳🇷", category: 8, name: "flag: Nauru", version: "2.0" }, { emoji: "🇳🇺", category: 8, name: "flag: Niue", version: "2.0" }, { emoji: "🇳🇿", category: 8, name: "flag: New Zealand", version: "2.0" }, { emoji: "🇴🇲", category: 8, name: "flag: Oman", version: "2.0" }, { emoji: "🇵🇦", category: 8, name: "flag: Panama", version: "2.0" }, { emoji: "🇵🇪", category: 8, name: "flag: Peru", version: "2.0" }, { emoji: "🇵🇫", category: 8, name: "flag: French Polynesia", version: "2.0" }, { emoji: "🇵🇬", category: 8, name: "flag: Papua New Guinea", version: "2.0" }, { emoji: "🇵🇭", category: 8, name: "flag: Philippines", version: "2.0" }, { emoji: "🇵🇰", category: 8, name: "flag: Pakistan", version: "2.0" }, { emoji: "🇵🇱", category: 8, name: "flag: Poland", version: "2.0" }, { emoji: "🇵🇲", category: 8, name: "flag: St. Pierre & Miquelon", version: "2.0" }, { emoji: "🇵🇳", category: 8, name: "flag: Pitcairn Islands", version: "2.0" }, { emoji: "🇵🇷", category: 8, name: "flag: Puerto Rico", version: "2.0" }, { emoji: "🇵🇸", category: 8, name: "flag: Palestinian Territories", version: "2.0" }, { emoji: "🇵🇹", category: 8, name: "flag: Portugal", version: "2.0" }, { emoji: "🇵🇼", category: 8, name: "flag: Palau", version: "2.0" }, { emoji: "🇵🇾", category: 8, name: "flag: Paraguay", version: "2.0" }, { emoji: "🇶🇦", category: 8, name: "flag: Qatar", version: "2.0" }, { emoji: "🇷🇪", category: 8, name: "flag: Réunion", version: "2.0" }, { emoji: "🇷🇴", category: 8, name: "flag: Romania", version: "2.0" }, { emoji: "🇷🇸", category: 8, name: "flag: Serbia", version: "2.0" }, { emoji: "🇷🇺", category: 8, name: "flag: Russia", version: "1.0" }, { emoji: "🇷🇼", category: 8, name: "flag: Rwanda", version: "2.0" }, { emoji: "🇸🇦", category: 8, name: "flag: Saudi Arabia", version: "2.0" }, { emoji: "🇸🇧", category: 8, name: "flag: Solomon Islands", version: "2.0" }, { emoji: "🇸🇨", category: 8, name: "flag: Seychelles", version: "2.0" }, { emoji: "🇸🇩", category: 8, name: "flag: Sudan", version: "2.0" }, { emoji: "🇸🇪", category: 8, name: "flag: Sweden", version: "2.0" }, { emoji: "🇸🇬", category: 8, name: "flag: Singapore", version: "2.0" }, { emoji: "🇸🇭", category: 8, name: "flag: St. Helena", version: "2.0" }, { emoji: "🇸🇮", category: 8, name: "flag: Slovenia", version: "2.0" }, { emoji: "🇸🇯", category: 8, name: "flag: Svalbard & Jan Mayen", version: "2.0" }, { emoji: "🇸🇰", category: 8, name: "flag: Slovakia", version: "2.0" }, { emoji: "🇸🇱", category: 8, name: "flag: Sierra Leone", version: "2.0" }, { emoji: "🇸🇲", category: 8, name: "flag: San Marino", version: "2.0" }, { emoji: "🇸🇳", category: 8, name: "flag: Senegal", version: "2.0" }, { emoji: "🇸🇴", category: 8, name: "flag: Somalia", version: "2.0" }, { emoji: "🇸🇷", category: 8, name: "flag: Suriname", version: "2.0" }, { emoji: "🇸🇸", category: 8, name: "flag: South Sudan", version: "2.0" }, { emoji: "🇸🇹", category: 8, name: "flag: São Tomé & Príncipe", version: "2.0" }, { emoji: "🇸🇻", category: 8, name: "flag: El Salvador", version: "2.0" }, { emoji: "🇸🇽", category: 8, name: "flag: Sint Maarten", version: "2.0" }, { emoji: "🇸🇾", category: 8, name: "flag: Syria", version: "2.0" }, { emoji: "🇸🇿", category: 8, name: "flag: Eswatini", version: "2.0" }, { emoji: "🇹🇦", category: 8, name: "flag: Tristan da Cunha", version: "2.0" }, { emoji: "🇹🇨", category: 8, name: "flag: Turks & Caicos Islands", version: "2.0" }, { emoji: "🇹🇩", category: 8, name: "flag: Chad", version: "2.0" }, { emoji: "🇹🇫", category: 8, name: "flag: French Southern Territories", version: "2.0" }, { emoji: "🇹🇬", category: 8, name: "flag: Togo", version: "2.0" }, { emoji: "🇹🇭", category: 8, name: "flag: Thailand", version: "2.0" }, { emoji: "🇹🇯", category: 8, name: "flag: Tajikistan", version: "2.0" }, { emoji: "🇹🇰", category: 8, name: "flag: Tokelau", version: "2.0" }, { emoji: "🇹🇱", category: 8, name: "flag: Timor-Leste", version: "2.0" }, { emoji: "🇹🇲", category: 8, name: "flag: Turkmenistan", version: "2.0" }, { emoji: "🇹🇳", category: 8, name: "flag: Tunisia", version: "2.0" }, { emoji: "🇹🇴", category: 8, name: "flag: Tonga", version: "2.0" }, { emoji: "🇹🇷", category: 8, name: "flag: Turkey", version: "2.0" }, { emoji: "🇹🇹", category: 8, name: "flag: Trinidad & Tobago", version: "2.0" }, { emoji: "🇹🇻", category: 8, name: "flag: Tuvalu", version: "2.0" }, { emoji: "🇹🇼", category: 8, name: "flag: Taiwan", version: "2.0" }, { emoji: "🇹🇿", category: 8, name: "flag: Tanzania", version: "2.0" }, { emoji: "🇺🇦", category: 8, name: "flag: Ukraine", version: "2.0" }, { emoji: "🇺🇬", category: 8, name: "flag: Uganda", version: "2.0" }, { emoji: "🇺🇲", category: 8, name: "flag: U.S. Outlying Islands", version: "2.0" }, { emoji: "🇺🇳", category: 8, name: "flag: United Nations", version: "4.0" }, { emoji: "🇺🇸", category: 8, name: "flag: United States", version: "1.0" }, { emoji: "🇺🇾", category: 8, name: "flag: Uruguay", version: "2.0" }, { emoji: "🇺🇿", category: 8, name: "flag: Uzbekistan", version: "2.0" }, { emoji: "🇻🇦", category: 8, name: "flag: Vatican City", version: "2.0" }, { emoji: "🇻🇨", category: 8, name: "flag: St. Vincent & Grenadines", version: "2.0" }, { emoji: "🇻🇪", category: 8, name: "flag: Venezuela", version: "2.0" }, { emoji: "🇻🇬", category: 8, name: "flag: British Virgin Islands", version: "2.0" }, { emoji: "🇻🇮", category: 8, name: "flag: U.S. Virgin Islands", version: "2.0" }, { emoji: "🇻🇳", category: 8, name: "flag: Vietnam", version: "2.0" }, { emoji: "🇻🇺", category: 8, name: "flag: Vanuatu", version: "2.0" }, { emoji: "🇼🇫", category: 8, name: "flag: Wallis & Futuna", version: "2.0" }, { emoji: "🇼🇸", category: 8, name: "flag: Samoa", version: "2.0" }, { emoji: "🇽🇰", category: 8, name: "flag: Kosovo", version: "2.0" }, { emoji: "🇾🇪", category: 8, name: "flag: Yemen", version: "2.0" }, { emoji: "🇾🇹", category: 8, name: "flag: Mayotte", version: "2.0" }, { emoji: "🇿🇦", category: 8, name: "flag: South Africa", version: "2.0" }, { emoji: "🇿🇲", category: 8, name: "flag: Zambia", version: "2.0" }, { emoji: "🇿🇼", category: 8, name: "flag: Zimbabwe", version: "2.0" }, { emoji: "🏴󠁧󠁢󠁥󠁮󠁧󠁿", category: 8, name: "flag: England", version: "5.0" }, { emoji: "🏴󠁧󠁢󠁳󠁣󠁴󠁿", category: 8, name: "flag: Scotland", version: "5.0" }, { emoji: "🏴󠁧󠁢󠁷󠁬󠁳󠁿", category: 8, name: "flag: Wales", version: "5.0" }] }; const Ce = "emoji-picker__emoji"; function Ee(e, o) { const n = document.createElement(e); return o && (n.className = o), n } function _e(e) { for (; e.firstChild;)e.removeChild(e.firstChild) } function ze(e, o) { e.dataset.loaded || (e.dataset.custom ? function (e) { const o = Ee("img", "emoji-picker__custom-emoji"); e.dataset.emoji && (o.src = e.dataset.emoji, e.innerText = "", e.appendChild(o)) }(e) : "twemoji" === o.style && function (e, o) { e.dataset.emoji && (e.innerHTML = ke.parse(e.dataset.emoji, o.twemojiOptions)) }(e, o), e.dataset.loaded = "true", e.style.opacity = "1") } class Oe { constructor(e, o) { this.events = e, this.options = o } render() { const e = Ee("div", "emoji-picker__preview"); return this.emoji = Ee("div", "emoji-picker__preview-emoji"), e.appendChild(this.emoji), this.name = Ee("div", "emoji-picker__preview-name"), e.appendChild(this.name), this.events.on("showPreview", (e => this.showPreview(e))), this.events.on("hidePreview", (() => this.hidePreview())), e } showPreview(e) { let o = e.emoji; e.custom ? o = `<img class="emoji-picker__custom-emoji" src="${e.emoji}">` : "twemoji" === this.options.style && (o = ke.parse(e.emoji, this.options.twemojiOptions)), this.emoji.innerHTML = o, this.name.innerHTML = e.name } hidePreview() { this.emoji.innerHTML = "", this.name.innerHTML = "" } } function Ie(e, o) { for (var n = 0; n < o.length; n++) { var i = o[n]; i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), Object.defineProperty(e, i.key, i) } } function Se(e, o, n) { return o in e ? Object.defineProperty(e, o, { value: n, enumerable: !0, configurable: !0, writable: !0 }) : e[o] = n, e } function Pe(e) { for (var o = 1; o < arguments.length; o++) { var n = null != arguments[o] ? arguments[o] : {}, i = Object.keys(n); "function" == typeof Object.getOwnPropertySymbols && (i = i.concat(Object.getOwnPropertySymbols(n).filter((function (e) { return Object.getOwnPropertyDescriptor(n, e).enumerable })))), i.forEach((function (o) { Se(e, o, n[o]) })) } return e } function Me(e, o) { return function (e) { if (Array.isArray(e)) return e }(e) || function (e, o) { var n = [], i = !0, a = !1, r = void 0; try { for (var t, s = e[Symbol.iterator](); !(i = (t = s.next()).done) && (n.push(t.value), !o || n.length !== o); i = !0); } catch (e) { a = !0, r = e } finally { try { i || null == s.return || s.return() } finally { if (a) throw r } } return n }(e, o) || function () { throw new TypeError("Invalid attempt to destructure non-iterable instance") }() } var Ae = function () { }, Le = {}, Te = {}, Ne = { mark: Ae, measure: Ae }; try { "undefined" != typeof window && (Le = window), "undefined" != typeof document && (Te = document), "undefined" != typeof MutationObserver && MutationObserver, "undefined" != typeof performance && (Ne = performance) } catch (e) { } var Fe = (Le.navigator || {}).userAgent, Be = void 0 === Fe ? "" : Fe, De = Le, Re = Te, qe = Ne, Ve = (De.document, !!Re.documentElement && !!Re.head && "function" == typeof Re.addEventListener && "function" == typeof Re.createElement), He = (~Be.indexOf("MSIE") || Be.indexOf("Trident/"), function () { try { } catch (e) { return !1 } }(), "group"), Ue = "primary", We = "secondary", Ke = De.FontAwesomeConfig || {}; if (Re && "function" == typeof Re.querySelector) { [["data-family-prefix", "familyPrefix"], ["data-replacement-class", "replacementClass"], ["data-auto-replace-svg", "autoReplaceSvg"], ["data-auto-add-css", "autoAddCss"], ["data-auto-a11y", "autoA11y"], ["data-search-pseudo-elements", "searchPseudoElements"], ["data-observe-mutations", "observeMutations"], ["data-mutate-approach", "mutateApproach"], ["data-keep-original-source", "keepOriginalSource"], ["data-measure-performance", "measurePerformance"], ["data-show-missing-icons", "showMissingIcons"]].forEach((function (e) { var o = Me(e, 2), n = o[0], i = o[1], a = function (e) { return "" === e || "false" !== e && ("true" === e || e) }(function (e) { var o = Re.querySelector("script[" + e + "]"); if (o) return o.getAttribute(e) }(n)); null != a && (Ke[i] = a) })) } var Je = Pe({}, { familyPrefix: "fa", replacementClass: "svg-inline--fa", autoReplaceSvg: !0, autoAddCss: !0, autoA11y: !0, searchPseudoElements: !1, observeMutations: !0, mutateApproach: "async", keepOriginalSource: !0, measurePerformance: !1, showMissingIcons: !0 }, Ke); Je.autoReplaceSvg || (Je.observeMutations = !1); var Ge = Pe({}, Je); De.FontAwesomeConfig = Ge; var Xe = De || {}; Xe.___FONT_AWESOME___ || (Xe.___FONT_AWESOME___ = {}), Xe.___FONT_AWESOME___.styles || (Xe.___FONT_AWESOME___.styles = {}), Xe.___FONT_AWESOME___.hooks || (Xe.___FONT_AWESOME___.hooks = {}), Xe.___FONT_AWESOME___.shims || (Xe.___FONT_AWESOME___.shims = []); var Ye = Xe.___FONT_AWESOME___, $e = []; Ve && ((Re.documentElement.doScroll ? /^loaded|^c/ : /^loaded|^i|^c/).test(Re.readyState) || Re.addEventListener("DOMContentLoaded", (function e() { Re.removeEventListener("DOMContentLoaded", e), 1, $e.map((function (e) { return e() })) }))); "undefined" != typeof global && void 0 !== global.process && global.process.emit, "undefined" == typeof setImmediate ? setTimeout : setImmediate; var Ze = { size: 16, x: 0, y: 0, rotate: 0, flipX: !1, flipY: !1 }; function Qe() { for (var e = 12, o = ""; e-- > 0;)o += "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"[62 * Math.random() | 0]; return o } function eo(e) { return "".concat(e).replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/'/g, "&#39;").replace(/</g, "&lt;").replace(/>/g, "&gt;") } function oo(e) { return Object.keys(e || {}).reduce((function (o, n) { return o + "".concat(n, ": ").concat(e[n], ";") }), "") } function no(e) { return e.size !== Ze.size || e.x !== Ze.x || e.y !== Ze.y || e.rotate !== Ze.rotate || e.flipX || e.flipY } function io(e) { var o = e.transform, n = e.containerWidth, i = e.iconWidth, a = { transform: "translate(".concat(n / 2, " 256)") }, r = "translate(".concat(32 * o.x, ", ").concat(32 * o.y, ") "), t = "scale(".concat(o.size / 16 * (o.flipX ? -1 : 1), ", ").concat(o.size / 16 * (o.flipY ? -1 : 1), ") "), s = "rotate(".concat(o.rotate, " 0 0)"); return { outer: a, inner: { transform: "".concat(r, " ").concat(t, " ").concat(s) }, path: { transform: "translate(".concat(i / 2 * -1, " -256)") } } } var ao = { x: 0, y: 0, width: "100%", height: "100%" }; function ro(e) { var o = !(arguments.length > 1 && void 0 !== arguments[1]) || arguments[1]; return e.attributes && (e.attributes.fill || o) && (e.attributes.fill = "black"), e } function to(e) { var o = e.icons, n = o.main, i = o.mask, a = e.prefix, r = e.iconName, t = e.transform, s = e.symbol, m = e.title, c = e.maskId, d = e.titleId, g = e.extra, u = e.watchable, l = void 0 !== u && u, v = i.found ? i : n, f = v.width, y = v.height, j = "fa-w-".concat(Math.ceil(f / y * 16)), h = [Ge.replacementClass, r ? "".concat(Ge.familyPrefix, "-").concat(r) : "", j].filter((function (e) { return -1 === g.classes.indexOf(e) })).concat(g.classes).join(" "), p = { children: [], attributes: Pe({}, g.attributes, { "data-prefix": a, "data-icon": r, class: h, role: g.attributes.role || "img", xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 ".concat(f, " ").concat(y) }) }; l && (p.attributes["data-fa-i2svg"] = ""), m && p.children.push({ tag: "title", attributes: { id: p.attributes["aria-labelledby"] || "title-".concat(d || Qe()) }, children: [m] }); var b = Pe({}, p, { prefix: a, iconName: r, main: n, mask: i, maskId: c, transform: t, symbol: s, styles: g.styles }), w = i.found && n.found ? function (e) { var o, n = e.children, i = e.attributes, a = e.main, r = e.mask, t = e.maskId, s = e.transform, m = a.width, c = a.icon, d = r.width, g = r.icon, u = io({ transform: s, containerWidth: d, iconWidth: m }), l = { tag: "rect", attributes: Pe({}, ao, { fill: "white" }) }, v = c.children ? { children: c.children.map(ro) } : {}, f = { tag: "g", attributes: Pe({}, u.inner), children: [ro(Pe({ tag: c.tag, attributes: Pe({}, c.attributes, u.path) }, v))] }, y = { tag: "g", attributes: Pe({}, u.outer), children: [f] }, j = "mask-".concat(t || Qe()), h = "clip-".concat(t || Qe()), p = { tag: "mask", attributes: Pe({}, ao, { id: j, maskUnits: "userSpaceOnUse", maskContentUnits: "userSpaceOnUse" }), children: [l, y] }, b = { tag: "defs", children: [{ tag: "clipPath", attributes: { id: h }, children: (o = g, "g" === o.tag ? o.children : [o]) }, p] }; return n.push(b, { tag: "rect", attributes: Pe({ fill: "currentColor", "clip-path": "url(#".concat(h, ")"), mask: "url(#".concat(j, ")") }, ao) }), { children: n, attributes: i } }(b) : function (e) { var o = e.children, n = e.attributes, i = e.main, a = e.transform, r = oo(e.styles); if (r.length > 0 && (n.style = r), no(a)) { var t = io({ transform: a, containerWidth: i.width, iconWidth: i.width }); o.push({ tag: "g", attributes: Pe({}, t.outer), children: [{ tag: "g", attributes: Pe({}, t.inner), children: [{ tag: i.icon.tag, children: i.icon.children, attributes: Pe({}, i.icon.attributes, t.path) }] }] }) } else o.push(i.icon); return { children: o, attributes: n } }(b), k = w.children, x = w.attributes; return b.children = k, b.attributes = x, s ? function (e) { var o = e.prefix, n = e.iconName, i = e.children, a = e.attributes, r = e.symbol; return [{ tag: "svg", attributes: { style: "display: none;" }, children: [{ tag: "symbol", attributes: Pe({}, a, { id: !0 === r ? "".concat(o, "-").concat(Ge.familyPrefix, "-").concat(n) : r }), children: i }] }] }(b) : function (e) { var o = e.children, n = e.main, i = e.mask, a = e.attributes, r = e.styles, t = e.transform; if (no(t) && n.found && !i.found) { var s = { x: n.width / n.height / 2, y: .5 }; a.style = oo(Pe({}, r, { "transform-origin": "".concat(s.x + t.x / 16, "em ").concat(s.y + t.y / 16, "em") })) } return [{ tag: "svg", attributes: a, children: o }] }(b) } var so = function () { }, mo = (Ge.measurePerformance && qe && qe.mark && qe.measure, function (e, o, n, i) { var a, r, t, s = Object.keys(e), m = s.length, c = void 0 !== i ? function (e, o) { return function (n, i, a, r) { return e.call(o, n, i, a, r) } }(o, i) : o; for (void 0 === n ? (a = 1, t = e[s[0]]) : (a = 0, t = n); a < m; a++)t = c(t, e[r = s[a]], r, e); return t }); function co(e, o) { var n = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : {}, i = n.skipHooks, a = void 0 !== i && i, r = Object.keys(o).reduce((function (e, n) { var i = o[n]; return !!i.icon ? e[i.iconName] = i.icon : e[n] = i, e }), {}); "function" != typeof Ye.hooks.addPack || a ? Ye.styles[e] = Pe({}, Ye.styles[e] || {}, r) : Ye.hooks.addPack(e, r), "fas" === e && co("fa", o) } var go = Ye.styles, uo = Ye.shims, lo = function () { var e = function (e) { return mo(go, (function (o, n, i) { return o[i] = mo(n, e, {}), o }), {}) }; e((function (e, o, n) { return o[3] && (e[o[3]] = n), e })), e((function (e, o, n) { var i = o[2]; return e[n] = n, i.forEach((function (o) { e[o] = n })), e })); var o = "far" in go; mo(uo, (function (e, n) { var i = n[0], a = n[1], r = n[2]; return "far" !== a || o || (a = "fas"), e[i] = { prefix: a, iconName: r }, e }), {}) }; lo(); Ye.styles; function vo(e, o, n) { if (e && e[o] && e[o][n]) return { prefix: o, iconName: n, icon: e[o][n] } } function fo(e) { var o = e.tag, n = e.attributes, i = void 0 === n ? {} : n, a = e.children, r = void 0 === a ? [] : a; return "string" == typeof e ? eo(e) : "<".concat(o, " ").concat(function (e) { return Object.keys(e || {}).reduce((function (o, n) { return o + "".concat(n, '="').concat(eo(e[n]), '" ') }), "").trim() }(i), ">").concat(r.map(fo).join(""), "</").concat(o, ">") } function yo(e) { this.name = "MissingIcon", this.message = e || "Icon unavailable", this.stack = (new Error).stack } yo.prototype = Object.create(Error.prototype), yo.prototype.constructor = yo; var jo = { fill: "currentColor" }, ho = { attributeType: "XML", repeatCount: "indefinite", dur: "2s" }, po = (Pe({}, jo, { d: "M156.5,447.7l-12.6,29.5c-18.7-9.5-35.9-21.2-51.5-34.9l22.7-22.7C127.6,430.5,141.5,440,156.5,447.7z M40.6,272H8.5 c1.4,21.2,5.4,41.7,11.7,61.1L50,321.2C45.1,305.5,41.8,289,40.6,272z M40.6,240c1.4-18.8,5.2-37,11.1-54.1l-29.5-12.6 C14.7,194.3,10,216.7,8.5,240H40.6z M64.3,156.5c7.8-14.9,17.2-28.8,28.1-41.5L69.7,92.3c-13.7,15.6-25.5,32.8-34.9,51.5 L64.3,156.5z M397,419.6c-13.9,12-29.4,22.3-46.1,30.4l11.9,29.8c20.7-9.9,39.8-22.6,56.9-37.6L397,419.6z M115,92.4 c13.9-12,29.4-22.3,46.1-30.4l-11.9-29.8c-20.7,9.9-39.8,22.6-56.8,37.6L115,92.4z M447.7,355.5c-7.8,14.9-17.2,28.8-28.1,41.5 l22.7,22.7c13.7-15.6,25.5-32.9,34.9-51.5L447.7,355.5z M471.4,272c-1.4,18.8-5.2,37-11.1,54.1l29.5,12.6 c7.5-21.1,12.2-43.5,13.6-66.8H471.4z M321.2,462c-15.7,5-32.2,8.2-49.2,9.4v32.1c21.2-1.4,41.7-5.4,61.1-11.7L321.2,462z M240,471.4c-18.8-1.4-37-5.2-54.1-11.1l-12.6,29.5c21.1,7.5,43.5,12.2,66.8,13.6V471.4z M462,190.8c5,15.7,8.2,32.2,9.4,49.2h32.1 c-1.4-21.2-5.4-41.7-11.7-61.1L462,190.8z M92.4,397c-12-13.9-22.3-29.4-30.4-46.1l-29.8,11.9c9.9,20.7,22.6,39.8,37.6,56.9 L92.4,397z M272,40.6c18.8,1.4,36.9,5.2,54.1,11.1l12.6-29.5C317.7,14.7,295.3,10,272,8.5V40.6z M190.8,50 c15.7-5,32.2-8.2,49.2-9.4V8.5c-21.2,1.4-41.7,5.4-61.1,11.7L190.8,50z M442.3,92.3L419.6,115c12,13.9,22.3,29.4,30.5,46.1 l29.8-11.9C470,128.5,457.3,109.4,442.3,92.3z M397,92.4l22.7-22.7c-15.6-13.7-32.8-25.5-51.5-34.9l-12.6,29.5 C370.4,72.1,384.4,81.5,397,92.4z" }), Pe({}, ho, { attributeName: "opacity" })); Pe({}, jo, { cx: "256", cy: "364", r: "28" }), Pe({}, ho, { attributeName: "r", values: "28;14;28;28;14;28;" }), Pe({}, po, { values: "1;0;1;1;0;1;" }), Pe({}, jo, { opacity: "1", d: "M263.7,312h-16c-6.6,0-12-5.4-12-12c0-71,77.4-63.9,77.4-107.8c0-20-17.8-40.2-57.4-40.2c-29.1,0-44.3,9.6-59.2,28.7 c-3.9,5-11.1,6-16.2,2.4l-13.1-9.2c-5.6-3.9-6.9-11.8-2.6-17.2c21.2-27.2,46.4-44.7,91.2-44.7c52.3,0,97.4,29.8,97.4,80.2 c0,67.6-77.4,63.5-77.4,107.8C275.7,306.6,270.3,312,263.7,312z" }), Pe({}, po, { values: "1;0;0;0;0;1;" }), Pe({}, jo, { opacity: "0", d: "M232.5,134.5l7,168c0.3,6.4,5.6,11.5,12,11.5h9c6.4,0,11.7-5.1,12-11.5l7-168c0.3-6.8-5.2-12.5-12-12.5h-23 C237.7,122,232.2,127.7,232.5,134.5z" }), Pe({}, po, { values: "0;0;1;1;0;0;" }), Ye.styles; function bo(e) { var o = e[0], n = e[1], i = Me(e.slice(4), 1)[0]; return { found: !0, width: o, height: n, icon: Array.isArray(i) ? { tag: "g", attributes: { class: "".concat(Ge.familyPrefix, "-").concat(He) }, children: [{ tag: "path", attributes: { class: "".concat(Ge.familyPrefix, "-").concat(We), fill: "currentColor", d: i[0] } }, { tag: "path", attributes: { class: "".concat(Ge.familyPrefix, "-").concat(Ue), fill: "currentColor", d: i[1] } }] } : { tag: "path", attributes: { fill: "currentColor", d: i } } } } Ye.styles; function wo() { Ge.autoAddCss && !_o && (!function (e) { if (e && Ve) { var o = Re.createElement("style"); o.setAttribute("type", "text/css"), o.innerHTML = e; for (var n = Re.head.childNodes, i = null, a = n.length - 1; a > -1; a--) { var r = n[a], t = (r.tagName || "").toUpperCase();["STYLE", "LINK"].indexOf(t) > -1 && (i = r) } Re.head.insertBefore(o, i) } }(function () { var e = "fa", o = "svg-inline--fa", n = Ge.familyPrefix, i = Ge.replacementClass, a = 'svg:not(:root).svg-inline--fa {\n  overflow: visible;\n}\n\n.svg-inline--fa {\n  display: inline-block;\n  font-size: inherit;\n  height: 1em;\n  overflow: visible;\n  vertical-align: -0.125em;\n}\n.svg-inline--fa.fa-lg {\n  vertical-align: -0.225em;\n}\n.svg-inline--fa.fa-w-1 {\n  width: 0.0625em;\n}\n.svg-inline--fa.fa-w-2 {\n  width: 0.125em;\n}\n.svg-inline--fa.fa-w-3 {\n  width: 0.1875em;\n}\n.svg-inline--fa.fa-w-4 {\n  width: 0.25em;\n}\n.svg-inline--fa.fa-w-5 {\n  width: 0.3125em;\n}\n.svg-inline--fa.fa-w-6 {\n  width: 0.375em;\n}\n.svg-inline--fa.fa-w-7 {\n  width: 0.4375em;\n}\n.svg-inline--fa.fa-w-8 {\n  width: 0.5em;\n}\n.svg-inline--fa.fa-w-9 {\n  width: 0.5625em;\n}\n.svg-inline--fa.fa-w-10 {\n  width: 0.625em;\n}\n.svg-inline--fa.fa-w-11 {\n  width: 0.6875em;\n}\n.svg-inline--fa.fa-w-12 {\n  width: 0.75em;\n}\n.svg-inline--fa.fa-w-13 {\n  width: 0.8125em;\n}\n.svg-inline--fa.fa-w-14 {\n  width: 0.875em;\n}\n.svg-inline--fa.fa-w-15 {\n  width: 0.9375em;\n}\n.svg-inline--fa.fa-w-16 {\n  width: 1em;\n}\n.svg-inline--fa.fa-w-17 {\n  width: 1.0625em;\n}\n.svg-inline--fa.fa-w-18 {\n  width: 1.125em;\n}\n.svg-inline--fa.fa-w-19 {\n  width: 1.1875em;\n}\n.svg-inline--fa.fa-w-20 {\n  width: 1.25em;\n}\n.svg-inline--fa.fa-pull-left {\n  margin-right: 0.3em;\n  width: auto;\n}\n.svg-inline--fa.fa-pull-right {\n  margin-left: 0.3em;\n  width: auto;\n}\n.svg-inline--fa.fa-border {\n  height: 1.5em;\n}\n.svg-inline--fa.fa-li {\n  width: 2em;\n}\n.svg-inline--fa.fa-fw {\n  width: 1.25em;\n}\n\n.fa-layers svg.svg-inline--fa {\n  bottom: 0;\n  left: 0;\n  margin: auto;\n  position: absolute;\n  right: 0;\n  top: 0;\n}\n\n.fa-layers {\n  display: inline-block;\n  height: 1em;\n  position: relative;\n  text-align: center;\n  vertical-align: -0.125em;\n  width: 1em;\n}\n.fa-layers svg.svg-inline--fa {\n  -webkit-transform-origin: center center;\n          transform-origin: center center;\n}\n\n.fa-layers-counter, .fa-layers-text {\n  display: inline-block;\n  position: absolute;\n  text-align: center;\n}\n\n.fa-layers-text {\n  left: 50%;\n  top: 50%;\n  -webkit-transform: translate(-50%, -50%);\n          transform: translate(-50%, -50%);\n  -webkit-transform-origin: center center;\n          transform-origin: center center;\n}\n\n.fa-layers-counter {\n  background-color: #ff253a;\n  border-radius: 1em;\n  -webkit-box-sizing: border-box;\n          box-sizing: border-box;\n  color: #fff;\n  height: 1.5em;\n  line-height: 1;\n  max-width: 5em;\n  min-width: 1.5em;\n  overflow: hidden;\n  padding: 0.25em;\n  right: 0;\n  text-overflow: ellipsis;\n  top: 0;\n  -webkit-transform: scale(0.25);\n          transform: scale(0.25);\n  -webkit-transform-origin: top right;\n          transform-origin: top right;\n}\n\n.fa-layers-bottom-right {\n  bottom: 0;\n  right: 0;\n  top: auto;\n  -webkit-transform: scale(0.25);\n          transform: scale(0.25);\n  -webkit-transform-origin: bottom right;\n          transform-origin: bottom right;\n}\n\n.fa-layers-bottom-left {\n  bottom: 0;\n  left: 0;\n  right: auto;\n  top: auto;\n  -webkit-transform: scale(0.25);\n          transform: scale(0.25);\n  -webkit-transform-origin: bottom left;\n          transform-origin: bottom left;\n}\n\n.fa-layers-top-right {\n  right: 0;\n  top: 0;\n  -webkit-transform: scale(0.25);\n          transform: scale(0.25);\n  -webkit-transform-origin: top right;\n          transform-origin: top right;\n}\n\n.fa-layers-top-left {\n  left: 0;\n  right: auto;\n  top: 0;\n  -webkit-transform: scale(0.25);\n          transform: scale(0.25);\n  -webkit-transform-origin: top left;\n          transform-origin: top left;\n}\n\n.fa-lg {\n  font-size: 1.3333333333em;\n  line-height: 0.75em;\n  vertical-align: -0.0667em;\n}\n\n.fa-xs {\n  font-size: 0.75em;\n}\n\n.fa-sm {\n  font-size: 0.875em;\n}\n\n.fa-1x {\n  font-size: 1em;\n}\n\n.fa-2x {\n  font-size: 2em;\n}\n\n.fa-3x {\n  font-size: 3em;\n}\n\n.fa-4x {\n  font-size: 4em;\n}\n\n.fa-5x {\n  font-size: 5em;\n}\n\n.fa-6x {\n  font-size: 6em;\n}\n\n.fa-7x {\n  font-size: 7em;\n}\n\n.fa-8x {\n  font-size: 8em;\n}\n\n.fa-9x {\n  font-size: 9em;\n}\n\n.fa-10x {\n  font-size: 10em;\n}\n\n.fa-fw {\n  text-align: center;\n  width: 1.25em;\n}\n\n.fa-ul {\n  list-style-type: none;\n  margin-left: 2.5em;\n  padding-left: 0;\n}\n.fa-ul > li {\n  position: relative;\n}\n\n.fa-li {\n  left: -2em;\n  position: absolute;\n  text-align: center;\n  width: 2em;\n  line-height: inherit;\n}\n\n.fa-border {\n  border: solid 0.08em #eee;\n  border-radius: 0.1em;\n  padding: 0.2em 0.25em 0.15em;\n}\n\n.fa-pull-left {\n  float: left;\n}\n\n.fa-pull-right {\n  float: right;\n}\n\n.fa.fa-pull-left,\n.fas.fa-pull-left,\n.far.fa-pull-left,\n.fal.fa-pull-left,\n.fab.fa-pull-left {\n  margin-right: 0.3em;\n}\n.fa.fa-pull-right,\n.fas.fa-pull-right,\n.far.fa-pull-right,\n.fal.fa-pull-right,\n.fab.fa-pull-right {\n  margin-left: 0.3em;\n}\n\n.fa-spin {\n  -webkit-animation: fa-spin 2s infinite linear;\n          animation: fa-spin 2s infinite linear;\n}\n\n.fa-pulse {\n  -webkit-animation: fa-spin 1s infinite steps(8);\n          animation: fa-spin 1s infinite steps(8);\n}\n\n@-webkit-keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n  }\n}\n\n@keyframes fa-spin {\n  0% {\n    -webkit-transform: rotate(0deg);\n            transform: rotate(0deg);\n  }\n  100% {\n    -webkit-transform: rotate(360deg);\n            transform: rotate(360deg);\n  }\n}\n.fa-rotate-90 {\n  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";\n  -webkit-transform: rotate(90deg);\n          transform: rotate(90deg);\n}\n\n.fa-rotate-180 {\n  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";\n  -webkit-transform: rotate(180deg);\n          transform: rotate(180deg);\n}\n\n.fa-rotate-270 {\n  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";\n  -webkit-transform: rotate(270deg);\n          transform: rotate(270deg);\n}\n\n.fa-flip-horizontal {\n  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";\n  -webkit-transform: scale(-1, 1);\n          transform: scale(-1, 1);\n}\n\n.fa-flip-vertical {\n  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n  -webkit-transform: scale(1, -1);\n          transform: scale(1, -1);\n}\n\n.fa-flip-both, .fa-flip-horizontal.fa-flip-vertical {\n  -ms-filter: "progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";\n  -webkit-transform: scale(-1, -1);\n          transform: scale(-1, -1);\n}\n\n:root .fa-rotate-90,\n:root .fa-rotate-180,\n:root .fa-rotate-270,\n:root .fa-flip-horizontal,\n:root .fa-flip-vertical,\n:root .fa-flip-both {\n  -webkit-filter: none;\n          filter: none;\n}\n\n.fa-stack {\n  display: inline-block;\n  height: 2em;\n  position: relative;\n  width: 2.5em;\n}\n\n.fa-stack-1x,\n.fa-stack-2x {\n  bottom: 0;\n  left: 0;\n  margin: auto;\n  position: absolute;\n  right: 0;\n  top: 0;\n}\n\n.svg-inline--fa.fa-stack-1x {\n  height: 1em;\n  width: 1.25em;\n}\n.svg-inline--fa.fa-stack-2x {\n  height: 2em;\n  width: 2.5em;\n}\n\n.fa-inverse {\n  color: #fff;\n}\n\n.sr-only {\n  border: 0;\n  clip: rect(0, 0, 0, 0);\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\n.sr-only-focusable:active, .sr-only-focusable:focus {\n  clip: auto;\n  height: auto;\n  margin: 0;\n  overflow: visible;\n  position: static;\n  width: auto;\n}\n\n.svg-inline--fa .fa-primary {\n  fill: var(--fa-primary-color, currentColor);\n  opacity: 1;\n  opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa .fa-secondary {\n  fill: var(--fa-secondary-color, currentColor);\n  opacity: 0.4;\n  opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-primary {\n  opacity: 0.4;\n  opacity: var(--fa-secondary-opacity, 0.4);\n}\n\n.svg-inline--fa.fa-swap-opacity .fa-secondary {\n  opacity: 1;\n  opacity: var(--fa-primary-opacity, 1);\n}\n\n.svg-inline--fa mask .fa-primary,\n.svg-inline--fa mask .fa-secondary {\n  fill: black;\n}\n\n.fad.fa-inverse {\n  color: #fff;\n}'; if (n !== e || i !== o) { var r = new RegExp("\\.".concat(e, "\\-"), "g"), t = new RegExp("\\--".concat(e, "\\-"), "g"), s = new RegExp("\\.".concat(o), "g"); a = a.replace(r, ".".concat(n, "-")).replace(t, "--".concat(n, "-")).replace(s, ".".concat(i)) } return a }()), _o = !0) } function ko(e, o) { return Object.defineProperty(e, "abstract", { get: o }), Object.defineProperty(e, "html", { get: function () { return e.abstract.map((function (e) { return fo(e) })) } }), Object.defineProperty(e, "node", { get: function () { if (Ve) { var o = Re.createElement("div"); return o.innerHTML = e.html, o.children } } }), e } function xo(e) { var o = e.prefix, n = void 0 === o ? "fa" : o, i = e.iconName; if (i) return vo(Eo.definitions, n, i) || vo(Ye.styles, n, i) } var Co, Eo = new (function () { function e() { !function (e, o) { if (!(e instanceof o)) throw new TypeError("Cannot call a class as a function") }(this, e), this.definitions = {} } var o, n, i; return o = e, (n = [{ key: "add", value: function () { for (var e = this, o = arguments.length, n = new Array(o), i = 0; i < o; i++)n[i] = arguments[i]; var a = n.reduce(this._pullDefinitions, {}); Object.keys(a).forEach((function (o) { e.definitions[o] = Pe({}, e.definitions[o] || {}, a[o]), co(o, a[o]), lo() })) } }, { key: "reset", value: function () { this.definitions = {} } }, { key: "_pullDefinitions", value: function (e, o) { var n = o.prefix && o.iconName && o.icon ? { 0: o } : o; return Object.keys(n).map((function (o) { var i = n[o], a = i.prefix, r = i.iconName, t = i.icon; e[a] || (e[a] = {}), e[a][r] = t })), e } }]) && Ie(o.prototype, n), i && Ie(o, i), e }()), _o = !1, zo = (Co = function (e) { var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = o.transform, i = void 0 === n ? Ze : n, a = o.symbol, r = void 0 !== a && a, t = o.mask, s = void 0 === t ? null : t, m = o.maskId, c = void 0 === m ? null : m, d = o.title, g = void 0 === d ? null : d, u = o.titleId, l = void 0 === u ? null : u, v = o.classes, f = void 0 === v ? [] : v, y = o.attributes, j = void 0 === y ? {} : y, h = o.styles, p = void 0 === h ? {} : h; if (e) { var b = e.prefix, w = e.iconName, k = e.icon; return ko(Pe({ type: "icon" }, e), (function () { return wo(), Ge.autoA11y && (g ? j["aria-labelledby"] = "".concat(Ge.replacementClass, "-title-").concat(l || Qe()) : (j["aria-hidden"] = "true", j.focusable = "false")), to({ icons: { main: bo(k), mask: s ? bo(s.icon) : { found: !1, width: null, height: null, icon: {} } }, prefix: b, iconName: w, transform: Pe({}, Ze, i), symbol: r, title: g, maskId: c, titleId: l, extra: { attributes: j, styles: p, classes: f } }) })) } }, function (e) { var o = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {}, n = (e || {}).icon ? e : xo(e || {}), i = o.mask; return i && (i = (i || {}).icon ? i : xo(i || {})), Co(n, Pe({}, o, { mask: i })) }); Eo.add({ prefix: "far", iconName: "building", icon: [448, 512, [], "f1ad", "M128 148v-40c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v40c0 6.6-5.4 12-12 12h-40c-6.6 0-12-5.4-12-12zm140 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-128 96h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm128 0h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm-76 84v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12h40c6.6 0 12-5.4 12-12zm76 12h40c6.6 0 12-5.4 12-12v-40c0-6.6-5.4-12-12-12h-40c-6.6 0-12 5.4-12 12v40c0 6.6 5.4 12 12 12zm180 124v36H0v-36c0-6.6 5.4-12 12-12h19.5V24c0-13.3 10.7-24 24-24h337c13.3 0 24 10.7 24 24v440H436c6.6 0 12 5.4 12 12zM79.5 463H192v-67c0-6.6 5.4-12 12-12h40c6.6 0 12 5.4 12 12v67h112.5V49L80 48l-.5 415z"] }, { prefix: "fas", iconName: "cat", icon: [512, 512, [], "f6be", "M290.59 192c-20.18 0-106.82 1.98-162.59 85.95V192c0-52.94-43.06-96-96-96-17.67 0-32 14.33-32 32s14.33 32 32 32c17.64 0 32 14.36 32 32v256c0 35.3 28.7 64 64 64h176c8.84 0 16-7.16 16-16v-16c0-17.67-14.33-32-32-32h-32l128-96v144c0 8.84 7.16 16 16 16h32c8.84 0 16-7.16 16-16V289.86c-10.29 2.67-20.89 4.54-32 4.54-61.81 0-113.52-44.05-125.41-102.4zM448 96h-64l-64-64v134.4c0 53.02 42.98 96 96 96s96-42.98 96-96V32l-64 64zm-72 80c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16zm80 0c-8.84 0-16-7.16-16-16s7.16-16 16-16 16 7.16 16 16-7.16 16-16 16z"] }, { prefix: "fas", iconName: "coffee", icon: [640, 512, [], "f0f4", "M192 384h192c53 0 96-43 96-96h32c70.6 0 128-57.4 128-128S582.6 32 512 32H120c-13.3 0-24 10.7-24 24v232c0 53 43 96 96 96zM512 96c35.3 0 64 28.7 64 64s-28.7 64-64 64h-32V96h32zm47.7 384H48.3c-47.6 0-61-64-36-64h583.3c25 0 11.8 64-35.9 64z"] }, { prefix: "far", iconName: "flag", icon: [512, 512, [], "f024", "M336.174 80c-49.132 0-93.305-32-161.913-32-31.301 0-58.303 6.482-80.721 15.168a48.04 48.04 0 0 0 2.142-20.727C93.067 19.575 74.167 1.594 51.201.104 23.242-1.71 0 20.431 0 48c0 17.764 9.657 33.262 24 41.562V496c0 8.837 7.163 16 16 16h16c8.837 0 16-7.163 16-16v-83.443C109.869 395.28 143.259 384 199.826 384c49.132 0 93.305 32 161.913 32 58.479 0 101.972-22.617 128.548-39.981C503.846 367.161 512 352.051 512 335.855V95.937c0-34.459-35.264-57.768-66.904-44.117C409.193 67.309 371.641 80 336.174 80zM464 336c-21.783 15.412-60.824 32-102.261 32-59.945 0-102.002-32-161.913-32-43.361 0-96.379 9.403-127.826 24V128c21.784-15.412 60.824-32 102.261-32 59.945 0 102.002 32 161.913 32 43.271 0 96.32-17.366 127.826-32v240z"] }, { prefix: "far", iconName: "frown", icon: [496, 512, [], "f119", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160-64c-17.7 0-32 14.3-32 32s14.3 32 32 32 32-14.3 32-32-14.3-32-32-32zm-80 128c-40.2 0-78 17.7-103.8 48.6-8.5 10.2-7.1 25.3 3.1 33.8 10.2 8.4 25.3 7.1 33.8-3.1 16.6-19.9 41-31.4 66.9-31.4s50.3 11.4 66.9 31.4c8.1 9.7 23.1 11.9 33.8 3.1 10.2-8.5 11.5-23.6 3.1-33.8C326 321.7 288.2 304 248 304z"] }, { prefix: "fas", iconName: "futbol", icon: [512, 512, [], "f1e3", "M504 256c0 136.967-111.033 248-248 248S8 392.967 8 256 119.033 8 256 8s248 111.033 248 248zm-48 0l-.003-.282-26.064 22.741-62.679-58.5 16.454-84.355 34.303 3.072c-24.889-34.216-60.004-60.089-100.709-73.141l13.651 31.939L256 139l-74.953-41.525 13.651-31.939c-40.631 13.028-75.78 38.87-100.709 73.141l34.565-3.073 16.192 84.355-62.678 58.5-26.064-22.741-.003.282c0 43.015 13.497 83.952 38.472 117.991l7.704-33.897 85.138 10.447 36.301 77.826-29.902 17.786c40.202 13.122 84.29 13.148 124.572 0l-29.902-17.786 36.301-77.826 85.138-10.447 7.704 33.897C442.503 339.952 456 299.015 456 256zm-248.102 69.571l-29.894-91.312L256 177.732l77.996 56.527-29.622 91.312h-96.476z"] }, { prefix: "fas", iconName: "history", icon: [512, 512, [], "f1da", "M504 255.531c.253 136.64-111.18 248.372-247.82 248.468-59.015.042-113.223-20.53-155.822-54.911-11.077-8.94-11.905-25.541-1.839-35.607l11.267-11.267c8.609-8.609 22.353-9.551 31.891-1.984C173.062 425.135 212.781 440 256 440c101.705 0 184-82.311 184-184 0-101.705-82.311-184-184-184-48.814 0-93.149 18.969-126.068 49.932l50.754 50.754c10.08 10.08 2.941 27.314-11.313 27.314H24c-8.837 0-16-7.163-16-16V38.627c0-14.254 17.234-21.393 27.314-11.314l49.372 49.372C129.209 34.136 189.552 8 256 8c136.81 0 247.747 110.78 248 247.531zm-180.912 78.784l9.823-12.63c8.138-10.463 6.253-25.542-4.21-33.679L288 256.349V152c0-13.255-10.745-24-24-24h-16c-13.255 0-24 10.745-24 24v135.651l65.409 50.874c10.463 8.137 25.541 6.253 33.679-4.21z"] }, { prefix: "fas", iconName: "icons", icon: [512, 512, [], "f86d", "M116.65 219.35a15.68 15.68 0 0 0 22.65 0l96.75-99.83c28.15-29 26.5-77.1-4.91-103.88C203.75-7.7 163-3.5 137.86 22.44L128 32.58l-9.85-10.14C93.05-3.5 52.25-7.7 24.86 15.64c-31.41 26.78-33 74.85-5 103.88zm143.92 100.49h-48l-7.08-14.24a27.39 27.39 0 0 0-25.66-17.78h-71.71a27.39 27.39 0 0 0-25.66 17.78l-7 14.24h-48A27.45 27.45 0 0 0 0 347.3v137.25A27.44 27.44 0 0 0 27.43 512h233.14A27.45 27.45 0 0 0 288 484.55V347.3a27.45 27.45 0 0 0-27.43-27.46zM144 468a52 52 0 1 1 52-52 52 52 0 0 1-52 52zm355.4-115.9h-60.58l22.36-50.75c2.1-6.65-3.93-13.21-12.18-13.21h-75.59c-6.3 0-11.66 3.9-12.5 9.1l-16.8 106.93c-1 6.3 4.88 11.89 12.5 11.89h62.31l-24.2 83c-1.89 6.65 4.2 12.9 12.23 12.9a13.26 13.26 0 0 0 10.92-5.25l92.4-138.91c4.88-6.91-1.16-15.7-10.87-15.7zM478.08.33L329.51 23.17C314.87 25.42 304 38.92 304 54.83V161.6a83.25 83.25 0 0 0-16-1.7c-35.35 0-64 21.48-64 48s28.65 48 64 48c35.2 0 63.73-21.32 64-47.66V99.66l112-17.22v47.18a83.25 83.25 0 0 0-16-1.7c-35.35 0-64 21.48-64 48s28.65 48 64 48c35.2 0 63.73-21.32 64-47.66V32c0-19.48-16-34.42-33.92-31.67z"] }, { prefix: "far", iconName: "lightbulb", icon: [352, 512, [], "f0eb", "M176 80c-52.94 0-96 43.06-96 96 0 8.84 7.16 16 16 16s16-7.16 16-16c0-35.3 28.72-64 64-64 8.84 0 16-7.16 16-16s-7.16-16-16-16zM96.06 459.17c0 3.15.93 6.22 2.68 8.84l24.51 36.84c2.97 4.46 7.97 7.14 13.32 7.14h78.85c5.36 0 10.36-2.68 13.32-7.14l24.51-36.84c1.74-2.62 2.67-5.7 2.68-8.84l.05-43.18H96.02l.04 43.18zM176 0C73.72 0 0 82.97 0 176c0 44.37 16.45 84.85 43.56 115.78 16.64 18.99 42.74 58.8 52.42 92.16v.06h48v-.12c-.01-4.77-.72-9.51-2.15-14.07-5.59-17.81-22.82-64.77-62.17-109.67-20.54-23.43-31.52-53.15-31.61-84.14-.2-73.64 59.67-128 127.95-128 70.58 0 128 57.42 128 128 0 30.97-11.24 60.85-31.65 84.14-39.11 44.61-56.42 91.47-62.1 109.46a47.507 47.507 0 0 0-2.22 14.3v.1h48v-.05c9.68-33.37 35.78-73.18 52.42-92.16C335.55 260.85 352 220.37 352 176 352 78.8 273.2 0 176 0z"] }, { prefix: "fas", iconName: "music", icon: [512, 512, [], "f001", "M470.38 1.51L150.41 96A32 32 0 0 0 128 126.51v261.41A139 139 0 0 0 96 384c-53 0-96 28.66-96 64s43 64 96 64 96-28.66 96-64V214.32l256-75v184.61a138.4 138.4 0 0 0-32-3.93c-53 0-96 28.66-96 64s43 64 96 64 96-28.65 96-64V32a32 32 0 0 0-41.62-30.49z"] }, { prefix: "fas", iconName: "search", icon: [512, 512, [], "f002", "M505 442.7L405.3 343c-4.5-4.5-10.6-7-17-7H372c27.6-35.3 44-79.7 44-128C416 93.1 322.9 0 208 0S0 93.1 0 208s93.1 208 208 208c48.3 0 92.7-16.4 128-44v16.3c0 6.4 2.5 12.5 7 17l99.7 99.7c9.4 9.4 24.6 9.4 33.9 0l28.3-28.3c9.4-9.4 9.4-24.6.1-34zM208 336c-70.7 0-128-57.2-128-128 0-70.7 57.2-128 128-128 70.7 0 128 57.2 128 128 0 70.7-57.2 128-128 128z"] }, { prefix: "far", iconName: "smile", icon: [496, 512, [], "f118", "M248 8C111 8 0 119 0 256s111 248 248 248 248-111 248-248S385 8 248 8zm0 448c-110.3 0-200-89.7-200-200S137.7 56 248 56s200 89.7 200 200-89.7 200-200 200zm-80-216c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm160 0c17.7 0 32-14.3 32-32s-14.3-32-32-32-32 14.3-32 32 14.3 32 32 32zm4 72.6c-20.8 25-51.5 39.4-84 39.4s-63.2-14.3-84-39.4c-8.5-10.2-23.7-11.5-33.8-3.1-10.2 8.5-11.5 23.6-3.1 33.8 30 36 74.1 56.6 120.9 56.6s90.9-20.6 120.9-56.6c8.5-10.2 7.1-25.3-3.1-33.8-10.1-8.4-25.3-7.1-33.8 3.1z"] }, { prefix: "fas", iconName: "times", icon: [352, 512, [], "f00d", "M242.72 256l100.07-100.07c12.28-12.28 12.28-32.19 0-44.48l-22.24-22.24c-12.28-12.28-32.19-12.28-44.48 0L176 189.28 75.93 89.21c-12.28-12.28-32.19-12.28-44.48 0L9.21 111.45c-12.28 12.28-12.28 32.19 0 44.48L109.28 256 9.21 356.07c-12.28 12.28-12.28 32.19 0 44.48l22.24 22.24c12.28 12.28 32.2 12.28 44.48 0L176 322.72l100.07 100.07c12.28 12.28 32.2 12.28 44.48 0l22.24-22.24c12.28-12.28 12.28-32.19 0-44.48L242.72 256z"] }, { prefix: "fas", iconName: "user", icon: [448, 512, [], "f007", "M224 256c70.7 0 128-57.3 128-128S294.7 0 224 0 96 57.3 96 128s57.3 128 128 128zm89.6 32h-16.7c-22.2 10.2-46.9 16-72.9 16s-50.6-5.8-72.9-16h-16.7C60.2 288 0 348.2 0 422.4V464c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-41.6c0-74.2-60.2-134.4-134.4-134.4z"] }); const Oo = zo({ prefix: "far", iconName: "building" }).html[0], Io = zo({ prefix: "fas", iconName: "cat" }).html[0], So = zo({ prefix: "fas", iconName: "coffee" }).html[0], Po = zo({ prefix: "far", iconName: "flag" }).html[0], Mo = zo({ prefix: "fas", iconName: "futbol" }).html[0], Ao = zo({ prefix: "far", iconName: "frown" }).html[0], Lo = zo({ prefix: "fas", iconName: "history" }).html[0], To = zo({ prefix: "fas", iconName: "icons" }).html[0], No = zo({ prefix: "far", iconName: "lightbulb" }).html[0], Fo = zo({ prefix: "fas", iconName: "music" }).html[0], Bo = zo({ prefix: "fas", iconName: "search" }).html[0], Do = zo({ prefix: "far", iconName: "smile" }).html[0], Ro = zo({ prefix: "fas", iconName: "times" }).html[0], qo = zo({ prefix: "fas", iconName: "user" }).html[0]; function Vo(e) { const o = document.createElement("img"); return o.src = e, o } function Ho() { const e = localStorage.getItem("emojiPicker.recent"); return (e ? JSON.parse(e) : []).filter((e => !!e.emoji)) } class Uo { constructor(e, o, n, i, a, r = !0) { this.emoji = e, this.showVariants = o, this.showPreview = n, this.events = i, this.options = a, this.lazy = r } render() { this.emojiButton = Ee("button", Ce); let e = this.emoji.emoji; return this.emoji.custom ? e = this.lazy ? Do : `<img class="emoji-picker__custom-emoji" src="${this.emoji.emoji}">` : "twemoji" === this.options.style && (e = this.lazy ? Do : ke.parse(this.emoji.emoji, this.options.twemojiOptions)), this.emojiButton.innerHTML = e, this.emojiButton.tabIndex = -1, this.emojiButton.dataset.emoji = this.emoji.emoji, this.emoji.custom && (this.emojiButton.dataset.custom = "true"), this.emojiButton.title = this.emoji.name, this.emojiButton.addEventListener("focus", (() => this.onEmojiHover())), this.emojiButton.addEventListener("blur", (() => this.onEmojiLeave())), this.emojiButton.addEventListener("click", (() => this.onEmojiClick())), this.emojiButton.addEventListener("mouseover", (() => this.onEmojiHover())), this.emojiButton.addEventListener("mouseout", (() => this.onEmojiLeave())), "twemoji" === this.options.style && this.lazy && (this.emojiButton.style.opacity = "0.25"), this.emojiButton } onEmojiClick() { this.emoji.variations && this.showVariants && this.options.showVariants || !this.options.showRecents || function (e, o) { const n = Ho(), i = { emoji: e.emoji, name: e.name, key: e.key || e.name, custom: e.custom }; localStorage.setItem("emojiPicker.recent", JSON.stringify([i, ...n.filter((e => !!e.emoji && e.key !== i.key))].slice(0, o.recentsCount))) }(this.emoji, this.options), this.events.emit("emoji", { emoji: this.emoji, showVariants: this.showVariants, button: this.emojiButton }) } onEmojiHover() { this.showPreview && this.events.emit("showPreview", this.emoji) } onEmojiLeave() { this.showPreview && this.events.emit("hidePreview") } } class Wo { constructor(e, o, n, i, a = !0) { this.showVariants = o, this.events = n, this.options = i, this.lazy = a, this.emojis = e.filter((e => !e.version || parseFloat(e.version) <= parseFloat(i.emojiVersion))) } render() { const e = Ee("div", "emoji-picker__container"); return this.emojis.forEach((o => e.appendChild(new Uo(o, this.showVariants, !0, this.events, this.options, this.lazy).render()))), e } } var Ko = "undefined" != typeof globalThis ? globalThis : "undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : {}; var Jo, Go = (function (e) { var o, n; o = Ko, n = function () { var e = "undefined" == typeof window, o = new Map, n = new Map, i = []; i.total = 0; var a = [], r = []; function t() { o.clear(), n.clear(), a = [], r = [] } function s(e) { for (var o = -9007199254740991, n = e.length - 1; n >= 0; --n) { var i = e[n]; if (null !== i) { var a = i.score; a > o && (o = a) } } return -9007199254740991 === o ? null : o } function m(e, o) { var n = e[o]; if (void 0 !== n) return n; var i = o; Array.isArray(o) || (i = o.split(".")); for (var a = i.length, r = -1; e && ++r < a;)e = e[i[r]]; return e } function c(e) { return "object" == typeof e } var d = function () { var e = [], o = 0, n = {}; function i() { for (var n = 0, i = e[n], a = 1; a < o;) { var r = a + 1; n = a, r < o && e[r].score < e[a].score && (n = r), e[n - 1 >> 1] = e[n], a = 1 + (n << 1) } for (var t = n - 1 >> 1; n > 0 && i.score < e[t].score; t = (n = t) - 1 >> 1)e[n] = e[t]; e[n] = i } return n.add = function (n) { var i = o; e[o++] = n; for (var a = i - 1 >> 1; i > 0 && n.score < e[a].score; a = (i = a) - 1 >> 1)e[i] = e[a]; e[i] = n }, n.poll = function () { if (0 !== o) { var n = e[0]; return e[0] = e[--o], i(), n } }, n.peek = function (n) { if (0 !== o) return e[0] }, n.replaceTop = function (o) { e[0] = o, i() }, n }, g = d(); return function u(l) { var v = { single: function (e, o, n) { return e ? (c(e) || (e = v.getPreparedSearch(e)), o ? (c(o) || (o = v.getPrepared(o)), ((n && void 0 !== n.allowTypo ? n.allowTypo : !l || void 0 === l.allowTypo || l.allowTypo) ? v.algorithm : v.algorithmNoTypo)(e, o, e[0])) : null) : null }, go: function (e, o, n) { if (!e) return i; var a = (e = v.prepareSearch(e))[0], r = n && n.threshold || l && l.threshold || -9007199254740991, t = n && n.limit || l && l.limit || 9007199254740991, d = (n && void 0 !== n.allowTypo ? n.allowTypo : !l || void 0 === l.allowTypo || l.allowTypo) ? v.algorithm : v.algorithmNoTypo, u = 0, f = 0, y = o.length; if (n && n.keys) for (var j = n.scoreFn || s, h = n.keys, p = h.length, b = y - 1; b >= 0; --b) { for (var w = o[b], k = new Array(p), x = p - 1; x >= 0; --x)(_ = m(w, E = h[x])) ? (c(_) || (_ = v.getPrepared(_)), k[x] = d(e, _, a)) : k[x] = null; k.obj = w; var C = j(k); null !== C && (C < r || (k.score = C, u < t ? (g.add(k), ++u) : (++f, C > g.peek().score && g.replaceTop(k)))) } else if (n && n.key) { var E = n.key; for (b = y - 1; b >= 0; --b)(_ = m(w = o[b], E)) && (c(_) || (_ = v.getPrepared(_)), null !== (z = d(e, _, a)) && (z.score < r || (z = { target: z.target, _targetLowerCodes: null, _nextBeginningIndexes: null, score: z.score, indexes: z.indexes, obj: w }, u < t ? (g.add(z), ++u) : (++f, z.score > g.peek().score && g.replaceTop(z))))) } else for (b = y - 1; b >= 0; --b) { var _, z; (_ = o[b]) && (c(_) || (_ = v.getPrepared(_)), null !== (z = d(e, _, a)) && (z.score < r || (u < t ? (g.add(z), ++u) : (++f, z.score > g.peek().score && g.replaceTop(z))))) } if (0 === u) return i; var O = new Array(u); for (b = u - 1; b >= 0; --b)O[b] = g.poll(); return O.total = u + f, O }, goAsync: function (o, n, a) { var r = !1, t = new Promise((function (t, g) { if (!o) return t(i); var u = (o = v.prepareSearch(o))[0], f = d(), y = n.length - 1, j = a && a.threshold || l && l.threshold || -9007199254740991, h = a && a.limit || l && l.limit || 9007199254740991, p = (a && void 0 !== a.allowTypo ? a.allowTypo : !l || void 0 === l.allowTypo || l.allowTypo) ? v.algorithm : v.algorithmNoTypo, b = 0, w = 0; function k() { if (r) return g("canceled"); var d = Date.now(); if (a && a.keys) for (var l = a.scoreFn || s, x = a.keys, C = x.length; y >= 0; --y) { for (var E = n[y], _ = new Array(C), z = C - 1; z >= 0; --z)(S = m(E, I = x[z])) ? (c(S) || (S = v.getPrepared(S)), _[z] = p(o, S, u)) : _[z] = null; _.obj = E; var O = l(_); if (null !== O && !(O < j) && (_.score = O, b < h ? (f.add(_), ++b) : (++w, O > f.peek().score && f.replaceTop(_)), y % 1e3 == 0 && Date.now() - d >= 10)) return void (e ? setImmediate(k) : setTimeout(k)) } else if (a && a.key) { for (var I = a.key; y >= 0; --y)if ((S = m(E = n[y], I)) && (c(S) || (S = v.getPrepared(S)), null !== (P = p(o, S, u)) && !(P.score < j) && (P = { target: P.target, _targetLowerCodes: null, _nextBeginningIndexes: null, score: P.score, indexes: P.indexes, obj: E }, b < h ? (f.add(P), ++b) : (++w, P.score > f.peek().score && f.replaceTop(P)), y % 1e3 == 0 && Date.now() - d >= 10))) return void (e ? setImmediate(k) : setTimeout(k)) } else for (; y >= 0; --y) { var S, P; if ((S = n[y]) && (c(S) || (S = v.getPrepared(S)), null !== (P = p(o, S, u)) && !(P.score < j) && (b < h ? (f.add(P), ++b) : (++w, P.score > f.peek().score && f.replaceTop(P)), y % 1e3 == 0 && Date.now() - d >= 10))) return void (e ? setImmediate(k) : setTimeout(k)) } if (0 === b) return t(i); for (var M = new Array(b), A = b - 1; A >= 0; --A)M[A] = f.poll(); M.total = b + w, t(M) } e ? setImmediate(k) : k() })); return t.cancel = function () { r = !0 }, t }, highlight: function (e, o, n) { if (null === e) return null; void 0 === o && (o = "<b>"), void 0 === n && (n = "</b>"); for (var i = "", a = 0, r = !1, t = e.target, s = t.length, m = e.indexes, c = 0; c < s; ++c) { var d = t[c]; if (m[a] === c) { if (r || (r = !0, i += o), ++a === m.length) { i += d + n + t.substr(c + 1); break } } else r && (r = !1, i += n); i += d } return i }, prepare: function (e) { if (e) return { target: e, _targetLowerCodes: v.prepareLowerCodes(e), _nextBeginningIndexes: null, score: null, indexes: null, obj: null } }, prepareSlow: function (e) { if (e) return { target: e, _targetLowerCodes: v.prepareLowerCodes(e), _nextBeginningIndexes: v.prepareNextBeginningIndexes(e), score: null, indexes: null, obj: null } }, prepareSearch: function (e) { if (e) return v.prepareLowerCodes(e) }, getPrepared: function (e) { if (e.length > 999) return v.prepare(e); var n = o.get(e); return void 0 !== n || (n = v.prepare(e), o.set(e, n)), n }, getPreparedSearch: function (e) { if (e.length > 999) return v.prepareSearch(e); var o = n.get(e); return void 0 !== o || (o = v.prepareSearch(e), n.set(e, o)), o }, algorithm: function (e, o, n) { for (var i = o._targetLowerCodes, t = e.length, s = i.length, m = 0, c = 0, d = 0, g = 0; ;) { if (n === i[c]) { if (a[g++] = c, ++m === t) break; n = e[0 === d ? m : d === m ? m + 1 : d === m - 1 ? m - 1 : m] } if (++c >= s) for (; ;) { if (m <= 1) return null; if (0 === d) { if (n === e[--m]) continue; d = m } else { if (1 === d) return null; if ((n = e[1 + (m = --d)]) === e[m]) continue } c = a[(g = m) - 1] + 1; break } } m = 0; var u = 0, l = !1, f = 0, y = o._nextBeginningIndexes; null === y && (y = o._nextBeginningIndexes = v.prepareNextBeginningIndexes(o.target)); var j = c = 0 === a[0] ? 0 : y[a[0] - 1]; if (c !== s) for (; ;)if (c >= s) { if (m <= 0) { if (++u > t - 2) break; if (e[u] === e[u + 1]) continue; c = j; continue } --m, c = y[r[--f]] } else if (e[0 === u ? m : u === m ? m + 1 : u === m - 1 ? m - 1 : m] === i[c]) { if (r[f++] = c, ++m === t) { l = !0; break } ++c } else c = y[c]; if (l) var h = r, p = f; else h = a, p = g; for (var b = 0, w = -1, k = 0; k < t; ++k)w !== (c = h[k]) - 1 && (b -= c), w = c; for (l ? 0 !== u && (b += -20) : (b *= 1e3, 0 !== d && (b += -20)), b -= s - t, o.score = b, o.indexes = new Array(p), k = p - 1; k >= 0; --k)o.indexes[k] = h[k]; return o }, algorithmNoTypo: function (e, o, n) { for (var i = o._targetLowerCodes, t = e.length, s = i.length, m = 0, c = 0, d = 0; ;) { if (n === i[c]) { if (a[d++] = c, ++m === t) break; n = e[m] } if (++c >= s) return null } m = 0; var g = !1, u = 0, l = o._nextBeginningIndexes; if (null === l && (l = o._nextBeginningIndexes = v.prepareNextBeginningIndexes(o.target)), (c = 0 === a[0] ? 0 : l[a[0] - 1]) !== s) for (; ;)if (c >= s) { if (m <= 0) break; --m, c = l[r[--u]] } else if (e[m] === i[c]) { if (r[u++] = c, ++m === t) { g = !0; break } ++c } else c = l[c]; if (g) var f = r, y = u; else f = a, y = d; for (var j = 0, h = -1, p = 0; p < t; ++p)h !== (c = f[p]) - 1 && (j -= c), h = c; for (g || (j *= 1e3), j -= s - t, o.score = j, o.indexes = new Array(y), p = y - 1; p >= 0; --p)o.indexes[p] = f[p]; return o }, prepareLowerCodes: function (e) { for (var o = e.length, n = [], i = e.toLowerCase(), a = 0; a < o; ++a)n[a] = i.charCodeAt(a); return n }, prepareBeginningIndexes: function (e) { for (var o = e.length, n = [], i = 0, a = !1, r = !1, t = 0; t < o; ++t) { var s = e.charCodeAt(t), m = s >= 65 && s <= 90, c = m || s >= 97 && s <= 122 || s >= 48 && s <= 57, d = m && !a || !r || !c; a = m, r = c, d && (n[i++] = t) } return n }, prepareNextBeginningIndexes: function (e) { for (var o = e.length, n = v.prepareBeginningIndexes(e), i = [], a = n[0], r = 0, t = 0; t < o; ++t)a > t ? i[t] = a : (a = n[++r], i[t] = void 0 === a ? o : a); return i }, cleanup: t, new: u }; return v }() }, e.exports ? e.exports = n() : o.fuzzysort = n() }(Jo = { exports: {} }, Jo.exports), Jo.exports); class Xo { constructor(e, o) { this.message = e, this.iconUrl = o } render() { const e = Ee("div", "emoji-picker__search-not-found"), o = Ee("div", "emoji-picker__search-not-found-icon"); this.iconUrl ? o.appendChild(Vo(this.iconUrl)) : o.innerHTML = Ao, e.appendChild(o); const n = Ee("h2"); return n.innerHTML = this.message, e.appendChild(n), e } } class Yo { constructor(e, o, n, i, a) { if (this.events = e, this.i18n = o, this.options = n, this.focusedEmojiIndex = 0, this.emojisPerRow = this.options.emojisPerRow || 8, this.emojiData = i.filter((e => e.version && parseFloat(e.version) <= parseFloat(n.emojiVersion) && void 0 !== e.category && a.indexOf(e.category) >= 0)), this.options.custom) { const e = this.options.custom.map((e => Object.assign(Object.assign({}, e), { custom: !0 }))); this.emojiData = [...this.emojiData, ...e] } this.events.on("hideVariantPopup", (() => { setTimeout((() => this.setFocusedEmoji(this.focusedEmojiIndex))) })) } render() { return this.searchContainer = Ee("div", "emoji-picker__search-container"), this.searchField = Ee("input", "emoji-picker__search"), this.searchField.placeholder = this.i18n.search, this.searchContainer.appendChild(this.searchField), this.searchIcon = Ee("span", "emoji-picker__search-icon"), this.options.icons && this.options.icons.search ? this.searchIcon.appendChild(Vo(this.options.icons.search)) : this.searchIcon.innerHTML = Bo, this.searchIcon.addEventListener("click", (e => this.onClearSearch(e))), this.searchContainer.appendChild(this.searchIcon), this.searchField.addEventListener("keydown", (e => this.onKeyDown(e))), this.searchField.addEventListener("keyup", (e => this.onKeyUp(e))), this.searchContainer } clear() { this.searchField.value = "" } focus() { this.searchField.focus() } onClearSearch(e) { e.stopPropagation(), this.searchField.value && (this.searchField.value = "", this.resultsContainer = null, this.options.icons && this.options.icons.search ? (_e(this.searchIcon), this.searchIcon.appendChild(Vo(this.options.icons.search))) : this.searchIcon.innerHTML = Bo, this.searchIcon.style.cursor = "default", this.events.emit("hideSearchResults"), setTimeout((() => this.searchField.focus()))) } setFocusedEmoji(e) { if (this.resultsContainer) { const o = this.resultsContainer.querySelectorAll("." + Ce); o[this.focusedEmojiIndex].tabIndex = -1, this.focusedEmojiIndex = e; const n = o[this.focusedEmojiIndex]; n.tabIndex = 0, n.focus() } } handleResultsKeydown(e) { if (this.resultsContainer) { const o = this.resultsContainer.querySelectorAll("." + Ce); "ArrowRight" === e.key ? this.setFocusedEmoji(Math.min(this.focusedEmojiIndex + 1, o.length - 1)) : "ArrowLeft" === e.key ? this.setFocusedEmoji(Math.max(0, this.focusedEmojiIndex - 1)) : "ArrowDown" === e.key ? (e.preventDefault(), this.focusedEmojiIndex < o.length - this.emojisPerRow && this.setFocusedEmoji(this.focusedEmojiIndex + this.emojisPerRow)) : "ArrowUp" === e.key ? (e.preventDefault(), this.focusedEmojiIndex >= this.emojisPerRow && this.setFocusedEmoji(this.focusedEmojiIndex - this.emojisPerRow)) : "Escape" === e.key && this.onClearSearch(e) } } onKeyDown(e) { "Escape" === e.key && this.searchField.value && this.onClearSearch(e) } onKeyUp(e) { if ("Tab" !== e.key && "Shift" !== e.key) if (this.searchField.value) { this.options.icons && this.options.icons.clearSearch ? (_e(this.searchIcon), this.searchIcon.appendChild(Vo(this.options.icons.clearSearch))) : this.searchIcon.innerHTML = Ro, this.searchIcon.style.cursor = "pointer"; const e = Go.go(this.searchField.value, this.emojiData, { allowTypo: !0, limit: 100, key: "name" }).map((e => e.obj)); this.events.emit("hidePreview"), e.length ? (this.resultsContainer = new Wo(e, !0, this.events, this.options, !1).render(), this.resultsContainer && (this.resultsContainer.querySelector("." + Ce).tabIndex = 0, this.focusedEmojiIndex = 0, this.resultsContainer.addEventListener("keydown", (e => this.handleResultsKeydown(e))), this.events.emit("showSearchResults", this.resultsContainer))) : this.events.emit("showSearchResults", new Xo(this.i18n.notFound, this.options.icons && this.options.icons.notFound).render()) } else this.options.icons && this.options.icons.search ? (_e(this.searchIcon), this.searchIcon.appendChild(Vo(this.options.icons.search))) : this.searchIcon.innerHTML = Bo, this.searchIcon.style.cursor = "default", this.events.emit("hideSearchResults") } } class $o { constructor(e, o, n) { this.events = e, this.emoji = o, this.options = n, this.focusedEmojiIndex = 0 } getEmoji(e) { return this.popup.querySelectorAll("." + Ce)[e] } setFocusedEmoji(e) { this.getEmoji(this.focusedEmojiIndex).tabIndex = -1, this.focusedEmojiIndex = e; const o = this.getEmoji(this.focusedEmojiIndex); o.tabIndex = 0, o.focus() } render() { this.popup = Ee("div", "emoji-picker__variant-popup"); const e = Ee("div", "emoji-picker__variant-overlay"); e.addEventListener("click", (e => { e.stopPropagation(), this.popup.contains(e.target) || this.events.emit("hideVariantPopup") })), this.popup.appendChild(new Uo(this.emoji, !1, !1, this.events, this.options, !1).render()), (this.emoji.variations || []).forEach(((e, o) => this.popup.appendChild(new Uo({ name: this.emoji.name, emoji: e, key: this.emoji.name + o }, !1, !1, this.events, this.options, !1).render()))); const o = this.popup.querySelector("." + Ce); return this.focusedEmojiIndex = 0, o.tabIndex = 0, setTimeout((() => o.focus())), this.popup.addEventListener("keydown", (e => { "ArrowRight" === e.key ? this.setFocusedEmoji(Math.min(this.focusedEmojiIndex + 1, this.popup.querySelectorAll("." + Ce).length - 1)) : "ArrowLeft" === e.key ? this.setFocusedEmoji(Math.max(this.focusedEmojiIndex - 1, 0)) : "Escape" === e.key && (e.stopPropagation(), this.events.emit("hideVariantPopup")) })), e.appendChild(this.popup), e } } const Zo = { search: "Search emojis...", categories: { recents: "Recent Emojis", smileys: "Smileys & Emotion", people: "People & Body", animals: "Animals & Nature", food: "Food & Drink", activities: "Activities", travel: "Travel & Places", objects: "Objects", symbols: "Symbols", flags: "Flags", custom: "Custom" }, notFound: "No emojis found" }, Qo = { recents: Lo, smileys: Do, people: qo, animals: Io, food: So, activities: Mo, travel: Oo, objects: No, symbols: Fo, flags: Po, custom: To }; class en { constructor(e, o, n) { this.options = e, this.events = o, this.i18n = n, this.activeButton = 0, this.buttons = [] } render() { var e; const o = Ee("div", "emoji-picker__category-buttons"), n = this.options.categories || (null === (e = this.options.emojiData) || void 0 === e ? void 0 : e.categories) || xe.categories; let i = this.options.showRecents ? ["recents", ...n] : n; return this.options.custom && (i = [...i, "custom"]), i.forEach((e => { const n = Ee("button", "emoji-picker__category-button"); this.options.icons && this.options.icons.categories && this.options.icons.categories[e] ? n.appendChild(Vo(this.options.icons.categories[e])) : n.innerHTML = Qo[e], n.tabIndex = -1, n.title = this.i18n.categories[e], o.appendChild(n), this.buttons.push(n), n.addEventListener("click", (() => { this.events.emit("categoryClicked", e) })) })), o.addEventListener("keydown", (e => { switch (e.key) { case "ArrowRight": this.events.emit("categoryClicked", i[(this.activeButton + 1) % this.buttons.length]); break; case "ArrowLeft": this.events.emit("categoryClicked", i[0 === this.activeButton ? this.buttons.length - 1 : this.activeButton - 1]); break; case "ArrowUp": case "ArrowDown": e.stopPropagation(), e.preventDefault() } })), o } setActiveButton(e, o = !0) { let n = this.buttons[this.activeButton]; n.classList.remove("active"), n.tabIndex = -1, this.activeButton = e, n = this.buttons[this.activeButton], n.classList.add("active"), n.tabIndex = 0, o && n.focus() } } const on = ["recents", "smileys", "people", "animals", "food", "activities", "travel", "objects", "symbols", "flags", "custom"]; class nn { constructor(e, o, n, i) { var a; this.events = e, this.i18n = o, this.options = n, this.emojiCategories = i, this.currentCategory = 0, this.headers = [], this.focusedIndex = 0, this.handleKeyDown = e => { switch (this.emojis.removeEventListener("scroll", this.highlightCategory), e.key) { case "ArrowRight": this.focusedEmoji.tabIndex = -1, this.focusedIndex === this.currentEmojiCount - 1 && this.currentCategory < this.categories.length - 1 ? (this.options.showCategoryButtons && this.categoryButtons.setActiveButton(++this.currentCategory), this.setFocusedEmoji(0)) : this.focusedIndex < this.currentEmojiCount - 1 && this.setFocusedEmoji(this.focusedIndex + 1); break; case "ArrowLeft": this.focusedEmoji.tabIndex = -1, 0 === this.focusedIndex && this.currentCategory > 0 ? (this.options.showCategoryButtons && this.categoryButtons.setActiveButton(--this.currentCategory), this.setFocusedEmoji(this.currentEmojiCount - 1)) : this.setFocusedEmoji(Math.max(0, this.focusedIndex - 1)); break; case "ArrowDown": e.preventDefault(), this.focusedEmoji.tabIndex = -1, this.focusedIndex + this.emojisPerRow >= this.currentEmojiCount && this.currentCategory < this.categories.length - 1 ? (this.currentCategory++ , this.options.showCategoryButtons && this.categoryButtons.setActiveButton(this.currentCategory), this.setFocusedEmoji(Math.min(this.focusedIndex % this.emojisPerRow, this.currentEmojiCount - 1))) : this.currentEmojiCount - this.focusedIndex > this.emojisPerRow && this.setFocusedEmoji(this.focusedIndex + this.emojisPerRow); break; case "ArrowUp": if (e.preventDefault(), this.focusedEmoji.tabIndex = -1, this.focusedIndex < this.emojisPerRow && this.currentCategory > 0) { const e = this.getEmojiCount(this.currentCategory - 1); let o = e % this.emojisPerRow; 0 === o && (o = this.emojisPerRow); const n = this.focusedIndex, i = n > o - 1 ? e - 1 : e - o + n; this.currentCategory-- , this.options.showCategoryButtons && this.categoryButtons.setActiveButton(this.currentCategory), this.setFocusedEmoji(i) } else this.setFocusedEmoji(this.focusedIndex >= this.emojisPerRow ? this.focusedIndex - this.emojisPerRow : this.focusedIndex) }requestAnimationFrame((() => this.emojis.addEventListener("scroll", this.highlightCategory))) }, this.addCategory = (e, o) => { const n = Ee("h2", "emoji-picker__category-name"); n.innerHTML = this.i18n.categories[e] || Zo.categories[e], this.emojis.appendChild(n), this.headers.push(n), this.emojis.appendChild(new Wo(o, !0, this.events, this.options, "recents" !== e).render()) }, this.selectCategory = (e, o = !0) => { this.emojis.removeEventListener("scroll", this.highlightCategory), this.focusedEmoji && (this.focusedEmoji.tabIndex = -1); const n = this.categories.indexOf(e); this.currentCategory = n, this.setFocusedEmoji(0, !1), this.options.showCategoryButtons && this.categoryButtons.setActiveButton(this.currentCategory, o); const i = this.headerOffsets[n]; this.emojis.scrollTop = i, requestAnimationFrame((() => this.emojis.addEventListener("scroll", this.highlightCategory))) }, this.highlightCategory = () => { if (document.activeElement && document.activeElement.classList.contains("emoji-picker__emoji")) return; let e = this.headerOffsets.findIndex((e => e >= Math.round(this.emojis.scrollTop))); this.emojis.scrollTop + this.emojis.offsetHeight === this.emojis.scrollHeight && (e = -1), 0 === e ? e = 1 : e < 0 && (e = this.headerOffsets.length), this.headerOffsets[e] === this.emojis.scrollTop && e++ , this.currentCategory = e - 1, this.options.showCategoryButtons && this.categoryButtons.setActiveButton(this.currentCategory) }, this.emojisPerRow = n.emojisPerRow || 8, this.categories = (null === (a = n.emojiData) || void 0 === a ? void 0 : a.categories) || n.categories || xe.categories, n.showRecents && (this.categories = ["recents", ...this.categories]), n.custom && (this.categories = [...this.categories, "custom"]), this.categories.sort(((e, o) => on.indexOf(e) - on.indexOf(o))) } updateRecents() { if (this.options.showRecents) { this.emojiCategories.recents = Ho(); const e = this.emojis.querySelector(".emoji-picker__container"); e && e.parentNode && e.parentNode.replaceChild(new Wo(this.emojiCategories.recents, !0, this.events, this.options, !1).render(), e) } } render() { this.container = Ee("div", "emoji-picker__emoji-area"), this.options.showCategoryButtons && (this.categoryButtons = new en(this.options, this.events, this.i18n), this.container.appendChild(this.categoryButtons.render())), this.emojis = Ee("div", "emoji-picker__emojis"), this.options.showRecents && (this.emojiCategories.recents = Ho()), this.options.custom && (this.emojiCategories.custom = this.options.custom.map((e => Object.assign(Object.assign({}, e), { custom: !0 })))), this.categories.forEach((e => this.addCategory(e, this.emojiCategories[e]))), requestAnimationFrame((() => { setTimeout((() => { setTimeout((() => this.emojis.addEventListener("scroll", this.highlightCategory))) })) })), this.emojis.addEventListener("keydown", this.handleKeyDown), this.events.on("categoryClicked", this.selectCategory), this.container.appendChild(this.emojis); return this.container.querySelectorAll("." + Ce)[0].tabIndex = 0, this.container } reset() { this.headerOffsets = Array.prototype.map.call(this.headers, (e => e.offsetTop)), this.selectCategory(this.options.initialCategory || "smileys", !1), this.currentCategory = this.categories.indexOf(this.options.initialCategory || "smileys"), this.options.showCategoryButtons && this.categoryButtons.setActiveButton(this.currentCategory, !1) } get currentCategoryEl() { return this.emojis.querySelectorAll(".emoji-picker__container")[this.currentCategory] } get focusedEmoji() { return this.currentCategoryEl.querySelectorAll("." + Ce)[this.focusedIndex] } get currentEmojiCount() { return this.currentCategoryEl.querySelectorAll("." + Ce).length } getEmojiCount(e) { return this.emojis.querySelectorAll(".emoji-picker__container")[e].querySelectorAll("." + Ce).length } setFocusedEmoji(e, o = !0) { this.focusedIndex = e, this.focusedEmoji && (this.focusedEmoji.tabIndex = 0, o && this.focusedEmoji.focus()) } } const an = { position: "auto", autoHide: !1, autoFocusSearch: !0, showAnimation: !0, showPreview: !0, showSearch: !0, showRecents: !0, showVariants: !0, showCategoryButtons: !0, recentsCount: 50, emojiData: xe, emojiVersion: "12.1", theme: "light", categories: ["smileys", "people", "animals", "food", "activities", "travel", "objects", "symbols", "flags"], style: "native", twemojiOptions: { ext: ".svg", folder: "svg" }, emojisPerRow: 8, rows: 6, emojiSize: "1.8em", initialCategory: "smileys" }; class EmojiButton { constructor(e = {}) { this.events = new b, this.publicEvents = new b, this.pickerVisible = !1, this.options = Object.assign(Object.assign({}, an), e), this.options.rootElement || (this.options.rootElement = document.body), this.i18n = Object.assign(Object.assign({}, Zo), e.i18n), this.onDocumentClick = this.onDocumentClick.bind(this), this.onDocumentKeydown = this.onDocumentKeydown.bind(this), this.theme = this.options.theme || "light", this.emojiCategories = function (e) { const o = {}; return e.emoji.forEach((n => { let i = o[e.categories[n.category || 0]]; i || (i = o[e.categories[n.category || 0]] = []), i.push(n) })), o }(this.options.emojiData || xe), this.buildPicker() } on(e, o) { this.publicEvents.on(e, o) } off(e, o) { this.publicEvents.off(e, o) } setStyleProperties() { this.options.showAnimation || this.pickerEl.style.setProperty("--animation-duration", "0s"), this.options.emojisPerRow && this.pickerEl.style.setProperty("--emoji-per-row", this.options.emojisPerRow.toString()), this.options.rows && this.pickerEl.style.setProperty("--row-count", this.options.rows.toString()), this.options.emojiSize && this.pickerEl.style.setProperty("--emoji-size", this.options.emojiSize), this.options.showCategoryButtons || this.pickerEl.style.setProperty("--category-button-height", "0"), this.options.styleProperties && Object.keys(this.options.styleProperties).forEach((e => { this.options.styleProperties && this.pickerEl.style.setProperty(e, this.options.styleProperties[e]) })) } showSearchResults(e) { _e(this.pickerContent), e.classList.add("search-results"), this.pickerContent.appendChild(e) } hideSearchResults() { this.pickerContent.firstChild !== this.emojiArea.container && (_e(this.pickerContent), this.pickerContent.appendChild(this.emojiArea.container)), this.emojiArea.reset() } emitEmoji({ emoji: o, showVariants: n }) { return e(this, void 0, void 0, (function* () { if (o.variations && n && this.options.showVariants) this.showVariantPopup(o); else { let e; setTimeout((() => this.emojiArea.updateRecents())), e = o.custom ? this.emitCustomEmoji(o) : "twemoji" === this.options.style ? yield this.emitTwemoji(o) : this.emitNativeEmoji(o), this.publicEvents.emit("emoji", e), this.options.autoHide && this.hidePicker() } })) } emitNativeEmoji(e) { return { emoji: e.emoji, name: e.name } } emitCustomEmoji(e) { return { url: e.emoji, name: e.name, custom: !0 } } emitTwemoji(e) { return new Promise((o => { ke.parse(e.emoji, Object.assign(Object.assign({}, this.options.twemojiOptions), { callback: (n, { base: i, size: a, ext: r }) => { const t = `${i}${a}/${n}${r}`; return o({ url: t, emoji: e.emoji, name: e.name }), t } })) })) } buildSearch() { var e; this.options.showSearch && (this.search = new Yo(this.events, this.i18n, this.options, (null === (e = this.options.emojiData) || void 0 === e ? void 0 : e.emoji) || xe.emoji, (this.options.categories || []).map((e => (this.options.emojiData || xe).categories.indexOf(e)))), this.pickerEl.appendChild(this.search.render())) } buildPreview() { this.options.showPreview && this.pickerEl.appendChild(new Oe(this.events, this.options).render()) } initPlugins() { if (this.options.plugins) { const e = Ee("div", "emoji-picker__plugin-container"); this.options.plugins.forEach((o => { if (!o.render) throw new Error('Emoji Button plugins must have a "render" function.'); e.appendChild(o.render(this)) })), this.pickerEl.appendChild(e) } } initFocusTrap() { this.focusTrap = h(this.pickerEl, { clickOutsideDeactivates: !0, initialFocus: this.options.showSearch && this.options.autoFocusSearch ? ".emoji-picker__search" : '.emoji-picker__emoji[tabindex="0"]' }) } buildPicker() { this.pickerEl = Ee("div", "emoji-picker"), this.pickerEl.classList.add(this.theme), this.setStyleProperties(), this.initFocusTrap(), this.pickerContent = Ee("div", "emoji-picker__content"), this.initPlugins(), this.buildSearch(), this.pickerEl.appendChild(this.pickerContent), this.emojiArea = new nn(this.events, this.i18n, this.options, this.emojiCategories), this.pickerContent.appendChild(this.emojiArea.render()), this.events.on("showSearchResults", this.showSearchResults.bind(this)), this.events.on("hideSearchResults", this.hideSearchResults.bind(this)), this.events.on("emoji", this.emitEmoji.bind(this)), this.buildPreview(), this.wrapper = Ee("div", "emoji-picker__wrapper"), this.wrapper.appendChild(this.pickerEl), this.wrapper.style.display = "none", this.options.zIndex && (this.wrapper.style.zIndex = this.options.zIndex + ""), this.options.rootElement && this.options.rootElement.appendChild(this.wrapper), this.observeForLazyLoad() } showVariantPopup(e) { const o = new $o(this.events, e, this.options).render(); o && this.pickerEl.appendChild(o), this.events.on("hideVariantPopup", (() => { o && (o.classList.add("hiding"), setTimeout((() => { o && this.pickerEl.removeChild(o) }), 175)), this.events.off("hideVariantPopup") })) } observeForLazyLoad() { this.observer = new IntersectionObserver(this.handleIntersectionChange.bind(this), { root: this.emojiArea.emojis }), this.emojiArea.emojis.querySelectorAll("." + Ce).forEach((e => { this.shouldLazyLoad(e) && this.observer.observe(e) })) } handleIntersectionChange(e) { Array.prototype.filter.call(e, (e => e.intersectionRatio > 0)).map((e => e.target)).forEach((e => { ze(e, this.options) })) } shouldLazyLoad(e) { return "twemoji" === this.options.style || "true" === e.dataset.custom } onDocumentClick(e) { this.pickerEl.contains(e.target) || this.hidePicker() } destroyPicker() { this.events.off("emoji"), this.events.off("hideVariantPopup"), this.options.rootElement && (this.options.rootElement.removeChild(this.wrapper), this.popper && this.popper.destroy()), this.observer && this.observer.disconnect(), this.options.plugins && this.options.plugins.forEach((e => { e.destroy && e.destroy() })) } hidePicker() { this.hideInProgress = !0, this.focusTrap.deactivate(), this.pickerVisible = !1, this.overlay && (document.body.removeChild(this.overlay), this.overlay = void 0), this.emojiArea.emojis.removeEventListener("scroll", this.emojiArea.highlightCategory), this.pickerEl.classList.add("hiding"), setTimeout((() => { this.wrapper.style.display = "none", this.pickerEl.classList.remove("hiding"), this.pickerContent.firstChild !== this.emojiArea.container && (_e(this.pickerContent), this.pickerContent.appendChild(this.emojiArea.container)), this.search && this.search.clear(), this.events.emit("hideVariantPopup"), this.hideInProgress = !1, this.popper && this.popper.destroy(), this.publicEvents.emit("hidden") }), this.options.showAnimation ? 170 : 0), setTimeout((() => { document.removeEventListener("click", this.onDocumentClick), document.removeEventListener("keydown", this.onDocumentKeydown) })) } showPicker(e) { this.hideInProgress ? setTimeout((() => this.showPicker(e)), 100) : (this.pickerVisible = !0, this.wrapper.style.display = "block", this.determineDisplay(e), this.focusTrap.activate(), setTimeout((() => { this.addEventListeners(), this.setInitialFocus() })), this.emojiArea.reset()) } determineDisplay(e) { window.matchMedia("screen and (max-width: 450px)").matches ? this.showMobileView() : "string" == typeof this.options.position ? this.setRelativePosition(e) : this.setFixedPosition() } setInitialFocus() { this.pickerEl.querySelector(this.options.showSearch && this.options.autoFocusSearch ? ".emoji-picker__search" : `.${Ce}[tabindex="0"]`).focus() } addEventListeners() { document.addEventListener("click", this.onDocumentClick), document.addEventListener("keydown", this.onDocumentKeydown) } setRelativePosition(e) { this.popper = we(e, this.wrapper, { placement: this.options.position }) } setFixedPosition() { var e; if (null === (e = this.options) || void 0 === e ? void 0 : e.position) { this.wrapper.style.position = "fixed"; const e = this.options.position; Object.keys(e).forEach((o => { this.wrapper.style[o] = e[o] })) } } showMobileView() { const e = window.getComputedStyle(this.pickerEl), o = document.querySelector("html"), n = o && o.clientHeight, i = o && o.clientWidth, a = parseInt(e.height), r = n ? n / 2 - a / 2 : 0, t = parseInt(e.width), s = i ? i / 2 - t / 2 : 0; this.wrapper.style.position = "fixed", this.wrapper.style.top = r + "px", this.wrapper.style.left = s + "px", this.wrapper.style.zIndex = "5000", this.overlay = Ee("div", "emoji-picker__overlay"), document.body.appendChild(this.overlay) } togglePicker(e) { this.pickerVisible ? this.hidePicker() : this.showPicker(e) } isPickerVisible() { return this.pickerVisible } onDocumentKeydown(e) { "Escape" === e.key ? this.hidePicker() : "Tab" === e.key ? this.pickerEl.classList.add("keyboard") : e.key.match(/^[\w]$/) && this.search && this.search.focus() } setTheme(e) { e !== this.theme && (this.pickerEl.classList.remove(this.theme), this.theme = e, this.pickerEl.classList.add(e)) } }
diff --git a/src/commoncomponents/emojipicker/emojiPickerLoader.html b/src/commoncomponents/emojipicker/emojiPickerLoader.html
new file mode 100644
index 0000000000000000000000000000000000000000..7ce91772633269e13910d661c169751e09687c5f
--- /dev/null
+++ b/src/commoncomponents/emojipicker/emojiPickerLoader.html
@@ -0,0 +1,7 @@
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1" />
+        <meta charset="utf-8">
+    </head>
+    <body style="height: 100%; width: 100%; margin: 0; padding: 0%; overflow: hidden;"></body>
+</html>
\ No newline at end of file
diff --git a/src/commoncomponents/emojipicker/emojiPickerLoader.js b/src/commoncomponents/emojipicker/emojiPickerLoader.js
new file mode 100644
index 0000000000000000000000000000000000000000..8f9a2539530fbccbe55c376c65f518072ae4e481
--- /dev/null
+++ b/src/commoncomponents/emojipicker/emojiPickerLoader.js
@@ -0,0 +1,47 @@
+"use strict"
+
+var emojiPicker = undefined
+
+new QWebChannel(qt.webChannelTransport, function (channel) {
+    window.jsbridge = channel.objects.jsbridge
+})
+
+/* exported init_emoji_picker */
+function init_emoji_picker(dark) {
+    emojiPicker = new EmojiButton({
+        theme: dark ? "dark" : "light"
+    })
+    emojiPicker.on("emoji", selection => {
+        window.jsbridge.emojiIsPicked(selection.emoji)
+    })
+}
+
+/* exported prepare_to_show */
+function prepare_to_show(dark) {
+    emojiPicker.setTheme(dark ? "dark" : "light")
+
+    if (emojiPicker.hideInProgress) {
+        setTimeout(() => prepare_to_show(), 100)
+        return
+    }
+
+    emojiPicker.pickerVisible = true
+    emojiPicker.wrapper.style.display = 'block'
+
+    emojiPicker.focusTrap.activate()
+
+    emojiPicker.wrapper.style.height = '100%'
+    emojiPicker.wrapper.style.width = '100%'
+
+    setTimeout(() => {
+        emojiPicker.addEventListeners()
+        emojiPicker.setInitialFocus()
+    })
+
+    emojiPicker.emojiArea.reset()
+}
+
+/* exported prepare_to_hide */
+function prepare_to_hide() {
+    emojiPicker.hidePicker()
+}
diff --git a/src/constant/JamiQmlUtils.qml b/src/constant/JamiQmlUtils.qml
index 9cacecaa6b899f1ba4313142550766fc6103bb10..28dabf517d63034a97ff0296a06291c51a69013f 100644
--- a/src/constant/JamiQmlUtils.qml
+++ b/src/constant/JamiQmlUtils.qml
@@ -24,6 +24,8 @@ import QtQuick 2.14
 import net.jami.Adapters 1.0
 
 Item {
+    property string qmlFilePrefix: "file:/"
+
     readonly property string mainViewLoadPath: "qrc:/src/mainview/MainView.qml"
     readonly property string wizardViewLoadPath: "qrc:/src/wizardview/WizardView.qml"
     readonly property string base64StringTitle: "data:image/png;base64,"
diff --git a/src/constant/JamiStrings.qml b/src/constant/JamiStrings.qml
index 0c9acd039ab2c827031c07fbd45abc0a9b7e9b43..6ff9ff466fa9db06c4b706c830ced22a759cdb53 100644
--- a/src/constant/JamiStrings.qml
+++ b/src/constant/JamiStrings.qml
@@ -487,4 +487,12 @@ Item {
     property string isSwarm: qsTr("Is swarm:")
     property string trueStr: qsTr("True")
     property string falseStr: qsTr("False")
+
+    // Message view
+    property string addEmoji: qsTr("Add emoji")
+    property string sendFile: qsTr("Send file")
+    property string leaveAudioMessage: qsTr("Leave audio message")
+    property string leaveVideoMessage: qsTr("Leave video message")
+    property string send: qsTr("Send")
+    property string remove: qsTr("Remove")
 }
diff --git a/src/constant/JamiTheme.qml b/src/constant/JamiTheme.qml
index ae60035683efa5220407cee293803535f7bdd582..eb6a695e086943f11f6d222ac24473c363b43dd4 100644
--- a/src/constant/JamiTheme.qml
+++ b/src/constant/JamiTheme.qml
@@ -158,6 +158,10 @@ Item {
     property color previewImageBackgroundColor: whiteColor
     property color previewCardContainerColor : darkTheme ? blackColor : whiteColor
     property color previewUrlColor : darkTheme ? "#eeeeee" : "#333"
+    property color messageWebViewFooterButtonImageColor: darkTheme ? "#838383" : "#656565"
+
+    // Files To Send Container
+    property color removeFileButtonColor: Qt.rgba(96, 95, 97, 0.5)
 
     // Font.
     property color faddedFontColor: darkTheme? "#c0c0c0" : "#a0a0a0"
@@ -245,7 +249,31 @@ Item {
     property real lineEditContextMenuItemsWidth: 100
     property real lineEditContextMenuSeparatorsHeight: 2
 
-    // main application spec
+    // Modal Popup
+    property real modalPopupRadius: 4
+    property real modalPopupDropShadowSamples: 16
+
+    // MessageWebView
+    property real messageWebViewHeaderPreferredHeight: 64
+    property real messageWebViewFooterPreferredHeight: 50
+    property real messageWebViewFooterMaximumHeight: 230
+    property real messageWebViewFooterRowSpacing: 1
+    property real messageWebViewFooterButtonSize: 36
+    property real messageWebViewFooterButtonIconSize: 48
+    property real messageWebViewFooterButtonRadius: 5
+    property real messageWebViewFooterFileContainerPreferredHeight: 150
+    property real messageWebViewFooterTextAreaMaximumHeight: 80
+
+    // MessageWebView File Transfer Container
+    property real filesToSendContainerSpacing: 5
+    property real filesToSendContainerPadding: 10
+    property real filesToSendDelegateWidth: 100
+    property real filesToSendDelegateHeight: 100
+    property real filesToSendDelegateRadius: 7
+    property real filesToSendDelegateButtonSize: 16
+    property real filesToSendDelegateFontPointSize: textFontSize + 2
+
+    // Main application spec
     property real mainViewMinWidth: 300
     property real mainViewMinHeight: 400
 
diff --git a/src/filestosendlistmodel.cpp b/src/filestosendlistmodel.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..22e8f9ea6996225f0c1e44978ff4afc4664b4e66
--- /dev/null
+++ b/src/filestosendlistmodel.cpp
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2021 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "filestosendlistmodel.h"
+
+#include "utils.h"
+
+#include <QFileInfo>
+#include <QImageReader>
+
+FilesToSendListModel::FilesToSendListModel(QObject* parent)
+    : QAbstractListModel(parent)
+{}
+
+int
+FilesToSendListModel::rowCount(const QModelIndex& parent) const
+{
+    if (parent.isValid())
+        return 0;
+    return pendingFiles_.size();
+}
+
+QHash<int, QByteArray>
+FilesToSendListModel::roleNames() const
+{
+    using namespace FilesToSend;
+    QHash<int, QByteArray> roles;
+#define X(role) roles[role] = #role;
+    FS_ROLES
+#undef X
+    return roles;
+}
+
+Q_INVOKABLE void
+FilesToSendListModel::addToPending(QString filePath)
+{
+    auto fileInfo = QFileInfo(filePath);
+    if (!fileInfo.exists())
+        return;
+
+    // QImageReader will treat .gz file (Jami archive) as svgz image format
+    // so decideFormatFromContent is needed
+    bool isImage = false;
+    QImageReader reader;
+    reader.setDecideFormatFromContent(true);
+    reader.setFileName(filePath);
+
+    if (!reader.read().isNull())
+        isImage = true;
+
+    beginInsertRows(QModelIndex(), pendingFiles_.size(), pendingFiles_.size());
+    auto item = FilesToSend::Item(filePath, fileInfo.fileName(), isImage, fileInfo.size());
+    pendingFiles_.append(item);
+    endInsertRows();
+}
+
+void
+FilesToSendListModel::removeFromPending(int index)
+{
+    beginRemoveRows(QModelIndex(), index, index);
+    pendingFiles_.removeAt(index);
+    endRemoveRows();
+}
+
+Q_INVOKABLE void
+FilesToSendListModel::flush()
+{
+    beginRemoveRows(QModelIndex(), 0, pendingFiles_.size() - 1);
+    pendingFiles_.clear();
+    endRemoveRows();
+}
+
+QVariant
+FilesToSendListModel::data(const QModelIndex& index, int role) const
+{
+    using namespace FilesToSend;
+
+    auto item = pendingFiles_.at(index.row());
+
+    switch (role) {
+    case Role::FileName:
+        return QVariant(item.fileName);
+    case Role::FilePath:
+        return QVariant(item.filePath);
+    case Role::FileSize:
+        return QVariant(Utils::humanFileSize(item.fileSizeInByte));
+    case Role::IsImage:
+        return QVariant(item.isImage);
+    }
+    return QVariant();
+}
diff --git a/src/filestosendlistmodel.h b/src/filestosendlistmodel.h
new file mode 100644
index 0000000000000000000000000000000000000000..01ec26fa0cdd93612fd323b77ac5091ed56319e5
--- /dev/null
+++ b/src/filestosendlistmodel.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2021 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#pragma once
+
+#include <QAbstractListModel>
+#include <QObject>
+
+#define FS_ROLES \
+    X(FileName) \
+    X(FilePath) \
+    X(FileSize) \
+    X(IsImage)
+
+namespace FilesToSend {
+Q_NAMESPACE
+enum Role {
+    DummyRole = Qt::UserRole + 1,
+#define X(role) role,
+    FS_ROLES
+#undef X
+};
+Q_ENUM_NS(Role)
+
+struct Item
+{
+    Item(QString filePath, QString fileName, bool isImage, qint64 fileSizeInByte)
+        : filePath(filePath)
+        , fileName(fileName)
+        , isImage(isImage)
+        , fileSizeInByte(fileSizeInByte)
+    {}
+
+    QString filePath;
+    QString fileName;
+    bool isImage;
+    qint64 fileSizeInByte;
+};
+} // namespace FilesToSend
+
+class FilesToSendListModel : public QAbstractListModel
+{
+    Q_OBJECT
+public:
+    FilesToSendListModel(QObject* parent = nullptr);
+
+    int rowCount(const QModelIndex& parent = QModelIndex()) const override;
+    QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const override;
+    QHash<int, QByteArray> roleNames() const override;
+
+    Q_INVOKABLE void addToPending(QString filePath);
+    Q_INVOKABLE void removeFromPending(int index);
+    Q_INVOKABLE void flush();
+
+private:
+    QList<FilesToSend::Item> pendingFiles_;
+};
diff --git a/src/mainview/components/FilesToSendContainer.qml b/src/mainview/components/FilesToSendContainer.qml
new file mode 100644
index 0000000000000000000000000000000000000000..b21cdd4e8c59144c2d42eb7724aa0ab0d966fe70
--- /dev/null
+++ b/src/mainview/components/FilesToSendContainer.qml
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Layouts 1.14
+
+import net.jami.Models 1.0
+import net.jami.Constants 1.0
+
+Rectangle {
+    id: root
+
+    property alias filesToSendListModel: repeater.model
+    property alias filesToSendCount: repeater.count
+
+    color: JamiTheme.messageOutBgColor
+
+    ScrollView {
+        id: filesToSendContainerScrollView
+
+        anchors.fill: root
+
+        contentHeight: root.height
+        contentWidth: filesToSendContainerRow.width
+
+        ScrollBar.horizontal.visible: {
+            var ratio = filesToSendContainerRow.width / root.width
+            return ratio > 1
+        }
+        ScrollBar.horizontal.contentItem: Rectangle {
+            implicitHeight: 5
+            radius: width / 2
+            color: filesToSendContainerScrollView.ScrollBar.horizontal.pressed ?
+                       JamiTheme.darkGreyColor : JamiTheme.whiteColor
+        }
+        ScrollBar.vertical.policy: ScrollBar.AlwaysOff
+
+        Row {
+            id: filesToSendContainerRow
+
+            anchors.centerIn: parent
+
+            spacing: JamiTheme.filesToSendContainerSpacing
+            padding: JamiTheme.filesToSendContainerPadding
+
+            Repeater {
+                id: repeater
+
+                delegate: FilesToSendDelegate {
+                    anchors.verticalCenter: filesToSendContainerRow.verticalCenter
+
+                    width: JamiTheme.filesToSendDelegateWidth
+                    height: JamiTheme.filesToSendDelegateHeight
+
+                    onRemoveFileButtonClicked: {
+                        filesToSendListModel.removeFromPending(index)
+                    }
+                }
+                model: FilesToSendListModel {
+                    id: filesToSendListModel
+                }
+            }
+        }
+    }
+}
diff --git a/src/mainview/components/FilesToSendDelegate.qml b/src/mainview/components/FilesToSendDelegate.qml
new file mode 100644
index 0000000000000000000000000000000000000000..6e667e6ca52c7da56fedc544011c4cd24db4fb28
--- /dev/null
+++ b/src/mainview/components/FilesToSendDelegate.qml
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Layouts 1.14
+import QtGraphicalEffects 1.14
+
+import net.jami.Constants 1.0
+import net.jami.Models 1.0
+
+import "../../commoncomponents"
+
+Rectangle {
+    id: root
+
+    property real margin: 5
+
+    signal removeFileButtonClicked(int index)
+
+    radius: JamiTheme.filesToSendDelegateRadius
+
+    color: JamiTheme.messageInBgColor
+
+    ColumnLayout {
+        id: delegateFileWrapperColumnLayout
+
+        anchors.fill: parent
+
+        spacing: 0
+
+        visible: !IsImage
+
+        ResponsiveImage {
+            id: fileIcon
+
+            Layout.alignment: Qt.AlignTop | Qt.AlignLeft
+            Layout.topMargin: margin
+            Layout.leftMargin: margin
+
+            visible: !IsImage
+
+            source: "qrc:/images/icons/file_black-24dp.svg"
+        }
+
+        Text {
+            id: fileName
+
+            Layout.alignment: Qt.AlignVCenter | Qt.AlignLeft
+            Layout.leftMargin: margin
+            Layout.preferredWidth: root.width - margin * 2
+
+            visible: !IsImage
+
+            font.pointSize: JamiTheme.filesToSendDelegateFontPointSize
+
+            text: FileName
+            elide: Text.ElideMiddle
+        }
+
+        Text {
+            id: fileSize
+
+            Layout.alignment: Qt.AlignBottom
+            Layout.leftMargin: margin
+            Layout.bottomMargin: margin
+            Layout.preferredWidth: root.width - margin * 2
+
+            visible: !IsImage
+
+            font.pointSize: JamiTheme.filesToSendDelegateFontPointSize
+
+            text: FileSize
+            elide: Text.ElideMiddle
+        }
+    }
+
+    AnimatedImage {
+        id: name
+
+        anchors.fill: parent
+
+        asynchronous: true
+        fillMode: Image.PreserveAspectCrop
+        source: IsImage ? JamiQmlUtils.qmlFilePrefix + FilePath : ""
+
+        layer.enabled: true
+        layer.effect: OpacityMask {
+            maskSource: Rectangle {
+                width: root.width
+                height: root.height
+                radius: JamiTheme.filesToSendDelegateRadius
+            }
+        }
+    }
+
+    PushButton {
+        id: removeFileButton
+
+        anchors.right: root.right
+        anchors.rightMargin: -margin
+        anchors.top: root.top
+        anchors.topMargin: -margin
+
+        radius: margin
+        preferredSize: JamiTheme.filesToSendDelegateButtonSize
+
+        toolTipText: JamiStrings.remove
+
+        source: "qrc:/images/icons/cross_black_24dp.svg"
+
+        normalColor:  JamiTheme.removeFileButtonColor
+        hoveredColor: JamiTheme.lightGrey_
+        imageColor: JamiTheme.textColor
+
+        onClicked: root.removeFileButtonClicked(index)
+    }
+}
diff --git a/src/mainview/components/MessageBar.qml b/src/mainview/components/MessageBar.qml
new file mode 100644
index 0000000000000000000000000000000000000000..7f5dfaa613f8e3eb86e1f13743801e4c16b2b60a
--- /dev/null
+++ b/src/mainview/components/MessageBar.qml
@@ -0,0 +1,198 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Layouts 1.14
+
+import net.jami.Adapters 1.0
+import net.jami.Constants 1.0
+
+import "../../commoncomponents"
+
+RowLayout {
+    id: root
+
+    property var textAreaObj: textArea
+    property real marginSize: 10
+
+    signal sendFileButtonClicked
+    signal audioRecordMessageButtonClicked
+    signal videoRecordMessageButtonClicked
+    signal emojiButtonClicked
+
+    spacing: JamiTheme.messageWebViewFooterRowSpacing
+
+    PushButton {
+        id: sendFileButton
+
+        Layout.alignment: Qt.AlignVCenter
+        Layout.leftMargin: marginSize
+        Layout.preferredWidth: JamiTheme.messageWebViewFooterButtonSize
+        Layout.preferredHeight: JamiTheme.messageWebViewFooterButtonSize
+
+        radius: JamiTheme.messageWebViewFooterButtonRadius
+        preferredSize: JamiTheme.messageWebViewFooterButtonIconSize - 6
+
+        toolTipText: JamiStrings.sendFile
+
+        source: "qrc:/images/icons/link_black-24dp.svg"
+
+        normalColor: JamiTheme.primaryBackgroundColor
+        imageColor: JamiTheme.messageWebViewFooterButtonImageColor
+
+        onClicked: root.sendFileButtonClicked()
+    }
+
+    PushButton {
+        id: audioRecordMessageButton
+
+        Layout.alignment: Qt.AlignVCenter
+        Layout.preferredWidth: JamiTheme.messageWebViewFooterButtonSize
+        Layout.preferredHeight: JamiTheme.messageWebViewFooterButtonSize
+
+        radius: JamiTheme.messageWebViewFooterButtonRadius
+        preferredSize: JamiTheme.messageWebViewFooterButtonIconSize
+
+        toolTipText: JamiStrings.leaveAudioMessage
+
+        source: "qrc:/images/icons/message_audio_black-24dp.svg"
+
+        normalColor: JamiTheme.primaryBackgroundColor
+        imageColor: JamiTheme.messageWebViewFooterButtonImageColor
+
+        onClicked: root.audioRecordMessageButtonClicked()
+    }
+
+    PushButton {
+        id: videoRecordMessageButton
+
+        Layout.alignment: Qt.AlignVCenter
+        Layout.preferredWidth: JamiTheme.messageWebViewFooterButtonSize
+        Layout.preferredHeight: JamiTheme.messageWebViewFooterButtonSize
+
+        radius: JamiTheme.messageWebViewFooterButtonRadius
+        preferredSize: JamiTheme.messageWebViewFooterButtonIconSize
+
+        toolTipText: JamiStrings.leaveVideoMessage
+
+        source: "qrc:/images/icons/message_video_black-24dp.svg"
+
+        normalColor: JamiTheme.primaryBackgroundColor
+        imageColor: JamiTheme.messageWebViewFooterButtonImageColor
+
+        onClicked: root.videoRecordMessageButtonClicked()
+    }
+
+    JamiTextArea {
+        id: textArea
+
+        Layout.alignment: Qt.AlignVCenter
+        Layout.fillWidth: true
+        Layout.margins: marginSize / 2
+        Layout.preferredHeight: {
+            return JamiTheme.messageWebViewFooterPreferredHeight
+                    > contentHeight ? JamiTheme.messageWebViewFooterPreferredHeight : contentHeight
+        }
+        Layout.maximumHeight: JamiTheme.messageWebViewFooterTextAreaMaximumHeight
+                              - marginSize / 2
+
+        onTextChanged: {
+            if (text) {
+                sendMessageButton.visible = true
+                sendMessageButton.state = "buttonFadeOut"
+            } else
+                sendMessageButton.state = "buttonFadeIn"
+        }
+    }
+
+    PushButton {
+        id: emojiButton
+
+        Layout.alignment: Qt.AlignVCenter
+        Layout.rightMargin: sendMessageButton.visible ? 0 : marginSize
+        Layout.preferredWidth: JamiTheme.messageWebViewFooterButtonSize
+        Layout.preferredHeight: JamiTheme.messageWebViewFooterButtonSize
+
+        radius: JamiTheme.messageWebViewFooterButtonRadius
+        preferredSize: JamiTheme.messageWebViewFooterButtonIconSize
+
+        toolTipText: JamiStrings.addEmoji
+
+        source: "qrc:/images/icons/emoji_black-24dp.svg"
+
+        normalColor: JamiTheme.primaryBackgroundColor
+        imageColor: JamiTheme.messageWebViewFooterButtonImageColor
+
+        onClicked: root.emojiButtonClicked()
+    }
+
+    PushButton {
+        id: sendMessageButton
+
+        Layout.alignment: Qt.AlignVCenter
+        Layout.rightMargin: visible ? marginSize : 0
+        Layout.preferredWidth: JamiTheme.messageWebViewFooterButtonSize
+        Layout.preferredHeight: JamiTheme.messageWebViewFooterButtonSize
+
+        radius: JamiTheme.messageWebViewFooterButtonRadius
+        preferredSize: JamiTheme.messageWebViewFooterButtonIconSize - 6
+
+        toolTipText: JamiStrings.send
+
+        source: "qrc:/images/icons/send_black-24dp.svg"
+
+        normalColor: JamiTheme.primaryBackgroundColor
+        imageColor: JamiTheme.messageWebViewFooterButtonImageColor
+
+        opacity: 0
+        visible: false
+        states: [
+            State {
+                name: "buttonFadeIn"
+                PropertyChanges {
+                    target: sendMessageButton
+                    opacity: 0
+                }
+            },
+            State {
+                name: "buttonFadeOut"
+                PropertyChanges {
+                    target: sendMessageButton
+                    opacity: 1
+                }
+            }
+        ]
+        transitions: Transition {
+            NumberAnimation {
+                properties: "opacity"
+                easing.type: Easing.InOutQuad
+                duration: 300
+            }
+        }
+
+        onOpacityChanged: {
+            if (opacity === 0)
+                visible = false
+        }
+
+        onClicked: {
+
+        }
+    }
+}
diff --git a/src/mainview/components/MessageWebView.qml b/src/mainview/components/MessageWebView.qml
index ab653969af7b2d746437b11803b44f8a257fef67..8c7fd77fc6cf8c3ea8caea110442ea3a7d1f4596 100644
--- a/src/mainview/components/MessageWebView.qml
+++ b/src/mainview/components/MessageWebView.qml
@@ -30,11 +30,8 @@ import "../../commoncomponents"
 import "../js/pluginhandlerpickercreation.js" as PluginHandlerPickerCreation
 
 Rectangle {
-    id: messageWebViewRect
+    id: root
 
-    color: JamiTheme.backgroundColor
-
-    property int messageWebViewHeaderPreferredHeight: 64
     property string headerUserAliasLabelText: ""
     property string headerUserUserNameLabelText: ""
     property bool jsLoaded: false
@@ -69,13 +66,6 @@ Rectangle {
         messageWebViewHeader.resetBackToWelcomeViewButtonSource(reset)
     }
 
-    function setFilePathsToSend(filePaths) {
-        for (var index = 0; index < filePaths.length; ++index) {
-            var path = UtilsAdapter.getAbsPath(filePaths[index])
-            MessagesAdapter.setNewMessagesContent(path)
-        }
-    }
-
     function updateChatviewTheme() {
         var theme = 'setTheme("\
             --svg-invert-percentage:' + JamiTheme.invertPercentageInDecimal + ';\
@@ -107,6 +97,8 @@ Rectangle {
         messageWebView.runJavaScript(theme);
     }
 
+    color: JamiTheme.primaryBackgroundColor
+
     Connections {
         target: JamiTheme
 
@@ -115,50 +107,6 @@ Rectangle {
         }
     }
 
-    JamiFileDialog {
-        id: jamiFileDialog
-
-        mode: JamiFileDialog.Mode.OpenFiles
-
-        onAccepted: setFilePathsToSend(jamiFileDialog.files)
-    }
-
-    MessageWebViewHeader {
-
-        DropArea{
-            anchors.fill: parent
-            onDropped: setFilePathsToSend(drop.urls)
-        }
-
-        id: messageWebViewHeader
-
-        anchors.top: messageWebViewRect.top
-        anchors.left: messageWebViewRect.left
-
-        width: messageWebViewRect.width
-        height: messageWebViewHeaderPreferredHeight
-
-        userAliasLabelText: headerUserAliasLabelText
-        userUserNameLabelText: headerUserUserNameLabelText
-
-        onBackClicked: {
-            MessagesAdapter.updateDraft()
-            mainView.showWelcomeView()
-        }
-
-        onNeedToHideConversationInCall: {
-            messageWebViewRect.needToHideConversationInCall()
-        }
-
-        onPluginSelector : {
-            // Create plugin handler picker - PLUGINS
-            PluginHandlerPickerCreation.createPluginHandlerPickerObjects(messageWebViewRect, false)
-            PluginHandlerPickerCreation.calculateCurrentGeo(
-                        messageWebViewRect.width / 2, messageWebViewRect.height / 2)
-            PluginHandlerPickerCreation.openPluginHandlerPicker()
-        }
-    }
-
     QtObject {
         id: jsBridgeObject
 
@@ -203,10 +151,6 @@ Rectangle {
             MessagesAdapter.sendFile(arg)
         }
 
-        function selectFile() {
-            jamiFileDialog.open()
-        }
-
         function acceptInvitation() {
             MessagesAdapter.acceptInvitation()
         }
@@ -220,11 +164,11 @@ Rectangle {
         }
 
         function emitMessagesCleared() {
-            messageWebViewRect.messagesCleared()
+            root.messagesCleared()
         }
 
         function emitMessagesLoaded() {
-            messageWebViewRect.messagesLoaded()
+            root.messagesLoaded()
         }
 
         function copyToDownloads(interactionId, displayName) {
@@ -244,7 +188,7 @@ Rectangle {
         }
 
         function saveSendMessageContent(arg) {
-            messageWebViewRect.sendMessageContentSaved(arg)
+            root.sendMessageContentSaved(arg)
         }
 
         function onComposing(isComposing) {
@@ -260,104 +204,152 @@ Rectangle {
         }
     }
 
-    WebEngineView {
-        id: messageWebView
-
-        anchors.top: messageWebViewHeader.bottom
-        anchors.topMargin: 1
-        anchors.left: messageWebViewRect.left
-
-        width: messageWebViewRect.width
-        height: messageWebViewRect.height - messageWebViewHeaderPreferredHeight
-
-        backgroundColor: "transparent"
-
-        settings.javascriptEnabled: true
-        settings.javascriptCanOpenWindows: true
-        settings.javascriptCanAccessClipboard: true
-        settings.javascriptCanPaste: true
-        settings.fullScreenSupportEnabled: true
-        settings.allowRunningInsecureContent: true
-        settings.localContentCanAccessRemoteUrls: true
-        settings.localContentCanAccessFileUrls: true
-        settings.errorPageEnabled: false
-        settings.pluginsEnabled: false
-        settings.screenCaptureEnabled: false
-        settings.linksIncludedInFocusChain: false
-        settings.localStorageEnabled: true
-
-        webChannel: messageWebViewChannel
-
-        DropArea{
-            anchors.fill: parent
-            onDropped: setFilePathsToSend(drop.urls)
-        }
+    // Provide WebChannel by registering jsBridgeObject.
+    WebChannel {
+        id: messageWebViewChannel
+        registeredObjects: [jsBridgeObject]
+    }
+
+    ColumnLayout {
+        anchors.fill: root
+
+        spacing: 0
+
+        MessageWebViewHeader {
+            id: messageWebViewHeader
+
+            Layout.alignment: Qt.AlignHCenter
+            Layout.fillWidth: true
+            Layout.preferredHeight: JamiTheme.messageWebViewHeaderPreferredHeight
+            Layout.maximumHeight: JamiTheme.messageWebViewHeaderPreferredHeight
+
+            userAliasLabelText: headerUserAliasLabelText
+            userUserNameLabelText: headerUserUserNameLabelText
 
-        onNavigationRequested: {
-            if(request.navigationType === WebEngineView.LinkClickedNavigation) {
-                MessagesAdapter.openUrl(request.url)
-                request.action = WebEngineView.IgnoreRequest
+            DropArea{
+                anchors.fill: parent
+                //onDropped: setFilePathsToSend(drop.urls)
             }
-        }
 
-        onLoadingChanged: {
-            if (loadRequest.status == WebEngineView.LoadSucceededStatus) {
-                messageWebView.runJavaScript(UtilsAdapter.getStyleSheet(
-                                                 "chatcss",
-                                                 UtilsAdapter.qStringFromFile(
-                                                     ":/chatview.css")))
-                messageWebView.runJavaScript(UtilsAdapter.getStyleSheet(
-                                                 "chatwin",
-                                                 UtilsAdapter.qStringFromFile(
-                                                     ":/chatview-qt.css")))
-                messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
-                                                 ":/linkify.js"))
-                messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
-                                                 ":/linkify-html.js"))
-                messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
-                                                 ":/linkify-string.js"))
-                messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
-                                                 ":/qwebchannel.js"))
-                messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
-                                                 ":/jed.js"))
-                messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
-                                                 ":/emoji.js"))
-                messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
-                                                 ":/previewInfo.js"))
-                messageWebView.runJavaScript(
-                            UtilsAdapter.qStringFromFile(":/chatview.js"),
-                            function() {
-                                messageWebView.runJavaScript("init_i18n();")
-                                MessagesAdapter.setDisplayLinks()
-                                updateChatviewTheme()
-                                messageWebView.runJavaScript("displayNavbar(false);")
-                                jsLoaded = true
-                            })
+            onBackClicked: {
+                MessagesAdapter.updateDraft()
+                mainView.showWelcomeView()
+            }
+
+            onNeedToHideConversationInCall: {
+                root.needToHideConversationInCall()
             }
-        }
 
-        onContextMenuRequested: {
-            var needContextMenu = request.selectedText.length || request.isContentEditable
-            if (!needContextMenu)
-                request.accepted = true
+            onPluginSelector : {
+                // Create plugin handler picker - PLUGINS
+                PluginHandlerPickerCreation.createPluginHandlerPickerObjects(root, false)
+                PluginHandlerPickerCreation.calculateCurrentGeo(root.width / 2, root.height / 2)
+                PluginHandlerPickerCreation.openPluginHandlerPicker()
+            }
         }
 
-        Component.onCompleted: {
-            profile.cachePath = UtilsAdapter.getCachePath()
-            profile.persistentStoragePath = UtilsAdapter.getCachePath()
-            profile.persistentCookiesPolicy = WebEngineProfile.NoPersistentCookies
-            profile.httpCacheType = WebEngineProfile.NoCache
-            profile.httpUserAgent = JamiStrings.httpUserAgentName
+        WebEngineView {
+            id: messageWebView
+
+            Layout.alignment: Qt.AlignHCenter
+            Layout.fillWidth: true
+            Layout.fillHeight: true
+            Layout.topMargin: messageWebViewHeader.hairLineSize
+            Layout.bottomMargin: messageWebViewFooter.hairLineSize
+
+            backgroundColor: "transparent"
+
+            settings.javascriptEnabled: true
+            settings.javascriptCanOpenWindows: true
+            settings.javascriptCanAccessClipboard: true
+            settings.javascriptCanPaste: true
+            settings.fullScreenSupportEnabled: true
+            settings.allowRunningInsecureContent: true
+            settings.localContentCanAccessRemoteUrls: true
+            settings.localContentCanAccessFileUrls: true
+            settings.errorPageEnabled: false
+            settings.pluginsEnabled: false
+            settings.screenCaptureEnabled: false
+            settings.linksIncludedInFocusChain: false
+            settings.localStorageEnabled: true
+
+            webChannel: messageWebViewChannel
+
+            DropArea{
+                anchors.fill: parent
+                //onDropped: setFilePathsToSend(drop.urls)
+            }
+
+            onNavigationRequested: {
+                if(request.navigationType === WebEngineView.LinkClickedNavigation) {
+                    MessagesAdapter.openUrl(request.url)
+                    request.action = WebEngineView.IgnoreRequest
+                }
+            }
+
+            onLoadingChanged: {
+                if (loadRequest.status == WebEngineView.LoadSucceededStatus) {
+                    messageWebView.runJavaScript(UtilsAdapter.getStyleSheet(
+                                                     "chatcss",
+                                                     UtilsAdapter.qStringFromFile(
+                                                         ":/chatview.css")))
+                    messageWebView.runJavaScript(UtilsAdapter.getStyleSheet(
+                                                     "chatwin",
+                                                     UtilsAdapter.qStringFromFile(
+                                                         ":/chatview-qt.css")))
+                    messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
+                                                     ":/linkify.js"))
+                    messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
+                                                     ":/linkify-html.js"))
+                    messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
+                                                     ":/linkify-string.js"))
+                    messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
+                                                     ":/qwebchannel.js"))
+                    messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
+                                                     ":/jed.js"))
+                    messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
+                                                     ":/emoji.js"))
+                    messageWebView.runJavaScript(UtilsAdapter.qStringFromFile(
+                                                     ":/previewInfo.js"))
+                    messageWebView.runJavaScript(
+                                UtilsAdapter.qStringFromFile(":/chatview.js"),
+                                function() {
+                                    messageWebView.runJavaScript("init_i18n();")
+                                    MessagesAdapter.setDisplayLinks()
+                                    updateChatviewTheme()
+                                    messageWebView.runJavaScript("displayNavbar(false);")
+                                    messageWebView.runJavaScript("hideMessageBar(true);")
+                                    jsLoaded = true
+                                })
+                }
+            }
 
-            messageWebView.loadHtml(UtilsAdapter.qStringFromFile(
-                                        ":/chatview.html"), ":/chatview.html")
-            messageWebView.url = "qrc:/chatview.html"
+            onContextMenuRequested: {
+                var needContextMenu = request.selectedText.length || request.isContentEditable
+                if (!needContextMenu)
+                    request.accepted = true
+            }
+
+            Component.onCompleted: {
+                profile.cachePath = UtilsAdapter.getCachePath()
+                profile.persistentStoragePath = UtilsAdapter.getCachePath()
+                profile.persistentCookiesPolicy = WebEngineProfile.NoPersistentCookies
+                profile.httpCacheType = WebEngineProfile.NoCache
+                profile.httpUserAgent = JamiStrings.httpUserAgentName
+
+                messageWebView.loadHtml(UtilsAdapter.qStringFromFile(
+                                            ":/chatview.html"), ":/chatview.html")
+                messageWebView.url = "qrc:/chatview.html"
+            }
         }
-    }
 
-    // Provide WebChannel by registering jsBridgeObject.
-    WebChannel {
-        id: messageWebViewChannel
-        registeredObjects: [jsBridgeObject]
+        MessageWebViewFooter {
+            id: messageWebViewFooter
+
+            Layout.alignment: Qt.AlignHCenter
+            Layout.fillWidth: true
+            Layout.preferredHeight: implicitHeight
+            Layout.maximumHeight: JamiTheme.messageWebViewFooterMaximumHeight
+        }
     }
 }
diff --git a/src/mainview/components/MessageWebViewFooter.qml b/src/mainview/components/MessageWebViewFooter.qml
new file mode 100644
index 0000000000000000000000000000000000000000..f28bbfc94ee138717cb6771cdc1060a652cf032a
--- /dev/null
+++ b/src/mainview/components/MessageWebViewFooter.qml
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2020 by Savoir-faire Linux
+ * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+import QtQuick 2.14
+import QtQuick.Controls 2.14
+import QtQuick.Layouts 1.14
+
+import net.jami.Models 1.0
+import net.jami.Constants 1.0
+import net.jami.Adapters 1.0
+
+import "../../commoncomponents"
+import "../../commoncomponents/emojipicker"
+
+Rectangle {
+    id: root
+
+    property real hairLineSize: 1
+
+    function setFilePathsToSend(filePaths) {
+        for (var index = 0; index < filePaths.length; ++index) {
+            var path = UtilsAdapter.getAbsPath(filePaths[index])
+            dataTransferSendContainer.filesToSendListModel.addToPending(path)
+        }
+    }
+
+    implicitHeight: footerColumnLayout.implicitHeight
+
+    color: JamiTheme.primaryBackgroundColor
+
+    EmojiPicker {
+        id: emojiPicker
+
+        onEmojiIsPicked: messageBar.textAreaObj.insertText(content)
+    }
+
+    JamiFileDialog {
+        id: jamiFileDialog
+
+        mode: JamiFileDialog.Mode.OpenFiles
+
+        onAccepted: setFilePathsToSend(jamiFileDialog.files)
+    }
+
+    ColumnLayout {
+        id: footerColumnLayout
+
+        anchors.centerIn: root
+
+        width: root.width
+
+        spacing: 0
+
+        MessageBar {
+            id: messageBar
+
+            Layout.alignment: Qt.AlignHCenter
+            Layout.fillWidth: true
+            Layout.preferredHeight: implicitHeight
+
+            onEmojiButtonClicked: emojiPicker.openEmojiPicker()
+            onSendFileButtonClicked: jamiFileDialog.open()
+        }
+
+        FilesToSendContainer {
+            id: dataTransferSendContainer
+
+            Layout.alignment: Qt.AlignHCenter
+            Layout.fillWidth: true
+            Layout.preferredHeight: filesToSendCount ?
+                                        JamiTheme.messageWebViewFooterFileContainerPreferredHeight : 0
+        }
+    }
+
+    CustomBorder {
+        commonBorder: false
+        lBorderwidth: 0
+        rBorderwidth: 0
+        tBorderwidth: hairLineSize
+        bBorderwidth: 0
+        borderColor: JamiTheme.tabbarBorderColor
+    }
+}
diff --git a/src/mainview/components/MessageWebViewHeader.qml b/src/mainview/components/MessageWebViewHeader.qml
index 161474d261a3fb6b4557494786b716901af857d6..3e817b59ddae9613895a5bcbbf70e4486a88074e 100644
--- a/src/mainview/components/MessageWebViewHeader.qml
+++ b/src/mainview/components/MessageWebViewHeader.qml
@@ -29,6 +29,7 @@ import "../../commoncomponents"
 Rectangle {
     id: messagingHeaderRect
 
+    property real hairLineSize: 1
     property string userAliasLabelText
     property string userUserNameLabelText
     property string backToWelcomeViewButtonSource: "qrc:/images/icons/back-24px.svg"
@@ -229,7 +230,7 @@ Rectangle {
         lBorderwidth: 0
         rBorderwidth: 0
         tBorderwidth: 0
-        bBorderwidth: 1
+        bBorderwidth: hairLineSize
         borderColor: JamiTheme.tabbarBorderColor
     }
 }
diff --git a/src/qmlregister.cpp b/src/qmlregister.cpp
index ab968a6b6cf80f366a77406d36499cf234fb6921..1c9aa28d87be2ea65a5d6767ecc5bdcdf084e907 100644
--- a/src/qmlregister.cpp
+++ b/src/qmlregister.cpp
@@ -28,6 +28,7 @@
 #include "deviceitemlistmodel.h"
 #include "smartlistmodel.h"
 #include "conversationlistmodelbase.h"
+#include "filestosendlistmodel.h"
 
 #include "appsettingsmanager.h"
 #include "distantrenderer.h"
@@ -105,6 +106,7 @@ registerTypes()
     QML_REGISTERTYPE(NS_MODELS, VideoFormatResolutionModel);
     QML_REGISTERTYPE(NS_MODELS, VideoFormatFpsModel);
     QML_REGISTERTYPE(NS_MODELS, PluginListPreferenceModel);
+    QML_REGISTERTYPE(NS_MODELS, FilesToSendListModel);
     QML_REGISTERTYPE(NS_MODELS, SmartListModel);
 
     // Roles & type enums for models
diff --git a/src/utils.cpp b/src/utils.cpp
index 10494d835590d01f76bebb177cb0dc99e2cf0f57..2b12dfefc7c68ed4a28e48589e0143b17fd8a15e 100644
--- a/src/utils.cpp
+++ b/src/utils.cpp
@@ -820,7 +820,7 @@ Utils::humanFileSize(qint64 fileSize)
     if (abs(fileSizeF) < thresh) {
         return QString::number(fileSizeF) + " B";
     }
-    QString units[] = {"kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
+    QString units[] = {"KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"};
     int unit_position = -1;
     do {
         fileSizeF /= thresh;