├── .github └── workflows │ └── php.yml ├── .gitmodules ├── .travis.yml ├── LICENSE ├── Makefile ├── README.md ├── build ├── README.md ├── build.sh ├── build_css.php ├── build_map.php ├── build_table.php ├── inc.css ├── inc.php ├── old_optimize.sh └── old_parse.php ├── composer.json ├── demo ├── html_demo.php └── table.htm ├── lib ├── emoji.css ├── emoji.php └── emoji.png └── test └── test.php /.github/workflows/php.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | branches: ['master', 'main'] 6 | pull_request: 7 | branches: ['master', 'main'] 8 | 9 | jobs: 10 | build: 11 | 12 | runs-on: ubuntu-20.04 13 | strategy: 14 | matrix: 15 | php-versions: ['5.3', '5.4', '5.5', '5.6', '7.0', '7.1', '7.2', '7.3', '7.4', '8.0', '8.1'] 16 | 17 | steps: 18 | - name: Setup PHP 19 | uses: shivammathur/setup-php@v2 20 | with: 21 | php-version: ${{ matrix.php-versions }} 22 | 23 | - uses: actions/checkout@v2 24 | with: 25 | submodules: 'true' 26 | 27 | - run: cd build && ./build.sh 28 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "build/emoji-data"] 2 | path = build/emoji-data 3 | url = git@github.com:iamcal/emoji-data.git 4 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: php 2 | 3 | sudo: false 4 | 5 | git: 6 | submodules: false 7 | before_install: 8 | - sed -i 's/git@github.com:/https:\/\/github.com\//' .gitmodules 9 | - git submodule update --init 10 | - sed -i 's/git@github.com:/https:\/\/github.com\//' build/emoji-data/.gitmodules 11 | - git submodule update --init --recursive 12 | 13 | script: php test/test.php 14 | 15 | notifications: 16 | webhooks: https://app.fossa.io/hooks/travisci 17 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2013 Cal Henderson 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of 6 | this software and associated documentation files (the "Software"), to deal in 7 | the Software without restriction, including without limitation the rights to 8 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 9 | the Software, and to permit persons to whom the Software is furnished to do so, 10 | subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 17 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 18 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 19 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 20 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 21 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | all: 2 | cd build && ./build.sh 3 | @php test/test.php 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # php-emoji - Process Emoji in PHP 2 | 3 | [![Build Status](https://travis-ci.org/iamcal/php-emoji.svg?branch=master)](https://travis-ci.org/iamcal/php-emoji) 4 | 5 | This is a PHP library for dealing with Emoji, allowing you to convert between various native formats and displaying them using HTML. 6 | 7 | You can read more about it and see a demo here: http://www.iamcal.com/emoji-in-web-apps/ 8 | 9 | The data this library is based on comes from another GitHub project: https://github.com/iamcal/emoji-data 10 | 11 | 12 | ## USAGE 13 | ```php 14 | emoji.css file, which points 48 | to the emoji.png image. 49 | 50 | IMPORTANT NOTE: This library currently only deals with UTF-8. If your source data is JIS 51 | or Shift-JIS, you're out of luck for the moment. 52 | 53 | 54 | ## Credits 55 | 56 | By Cal Henderson 57 | 58 | Images and Emoji data come from emoji-data. 59 | 60 | This work is dual-licensed under the GPL v3 and the MIT license. 61 | 62 | 63 | ## Version History 64 | 65 | * v1.0.0 - 2009-10-20 : First release 66 | * v1.2.0 - 2011-03-27 : ? 67 | * v1.3.0 - 2011-07-27 : ? 68 | * v1.4.0 - 2016-02-15 : Switch to using emoji-data as the backend, at v2.4.0 69 | * v1.4.1 - 2016-10-06 : Added `emoji_contains_emoji()`, added travis 70 | * v1.4.2 - 2017-03-03 : Support for unified modifiers when converting to/from HTML only (issue #34) 71 | -------------------------------------------------------------------------------- /build/README.md: -------------------------------------------------------------------------------- 1 | Just looking for the library? 2 | ============================= 3 | 4 | You don't need to worry about the contents of this directory - just use `emoji.php`, 5 | `emoji.css` and `emoji.png` in the parent directory. 6 | 7 | 8 | I'm a developer, tell me more... 9 | ================================ 10 | 11 | The scripts in this directory allow you to build the library from the emoji-data source material. 12 | 13 | The emoji-data repo contains a list of emoji with supporting images (and spritesheets). 14 | 15 | We use this data to build the PHP map and the CSS file: 16 | 17 | ./build.sh 18 | 19 | The following files are created by this process: 20 | 21 | ../emoji.png 22 | ../emoji.php 23 | ../emoji.css 24 | ../table.htm 25 | -------------------------------------------------------------------------------- /build/build.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cp -f emoji-data/sheet_apple_64.png ../lib/emoji.png 3 | php build_map.php > ../lib/emoji.php 4 | php build_css.php > ../lib/emoji.css 5 | php build_table.php > ../demo/table.htm 6 | -------------------------------------------------------------------------------- /build/build_css.php: -------------------------------------------------------------------------------- 1 | array(\n"; 51 | 52 | foreach ($maps['names'] as $k => $v){ 53 | 54 | $key_enc = format_string($k); 55 | $name_enc = "'".AddSlashes($v)."'"; 56 | echo "\t\t\t$key_enc => $name_enc,\n"; 57 | } 58 | 59 | echo "\t\t),\n"; 60 | 61 | foreach ($maps as $k => $v){ 62 | 63 | if ($k == 'names') continue; 64 | if ($k == 'unified_rx') continue; 65 | 66 | echo "\t\t'$k' => array(\n"; 67 | 68 | foreach ($v as $k2 => $v2){ 69 | if (strpos($k, 'prefixes') === 0){ 70 | echo "\t\t\t" . format_string($v2) . ",\n"; 71 | }else{ 72 | echo "\t\t\t" . format_string($k2) . '=>' . format_string($v2) . ",\n"; 73 | } 74 | } 75 | 76 | echo "\t\t),\n"; 77 | } 78 | 79 | echo "\t\t'unified_rx' => " . var_export($maps['unified_rx'], true) . ",\n"; 80 | 81 | echo "\t);\n"; 82 | 83 | 84 | echo file_get_contents('inc.php'); 85 | 86 | 87 | 88 | ########################################################################################## 89 | 90 | function get_all_kaomoji($mapping){ 91 | $arr = array(); 92 | 93 | foreach ($mapping as $map){ 94 | if (isset($map['docomo']['kaomoji']) ) { 95 | $arr[ $map['docomo']['kaomoji'] ] = '1'; 96 | } 97 | 98 | if (isset($map['au']['kaomoji']) ) { 99 | $arr[ $map['au']['kaomoji'] ] = '1'; 100 | } 101 | 102 | if (isset($map['softbank']['kaomoji']) ) { 103 | $arr[ $map['softbank']['kaomoji'] ] = '1'; 104 | } 105 | } 106 | 107 | return array_keys($arr); 108 | } 109 | 110 | function make_names_map($map){ 111 | 112 | $out = array(); 113 | foreach ($map as $row){ 114 | 115 | $bytes = unicode_bytes($row['unified']); 116 | 117 | $out[$bytes] = $row['name']; 118 | } 119 | 120 | return $out; 121 | } 122 | 123 | function make_html_map($map){ 124 | 125 | $out = array(); 126 | 127 | foreach ($map as $row){ 128 | 129 | $hex = unicode_hex_chars($row['unified']); 130 | $bytes = unicode_bytes($row['unified']); 131 | 132 | $out[$bytes] = $hex; 133 | } 134 | 135 | return $out; 136 | } 137 | 138 | function make_html_rx($map){ 139 | 140 | $rx_bits = array(); 141 | 142 | foreach ($map as $bytes => $hex){ 143 | 144 | $out = ''; 145 | for ($i=0; $i 0x10000){ 211 | # 4 bytes 212 | return chr(0xF0 | (($cp & 0x1C0000) >> 18)). 213 | chr(0x80 | (($cp & 0x3F000) >> 12)). 214 | chr(0x80 | (($cp & 0xFC0) >> 6)). 215 | chr(0x80 | ($cp & 0x3F)); 216 | }else if ($cp > 0x800){ 217 | # 3 bytes 218 | return chr(0xE0 | (($cp & 0xF000) >> 12)). 219 | chr(0x80 | (($cp & 0xFC0) >> 6)). 220 | chr(0x80 | ($cp & 0x3F)); 221 | }else if ($cp > 0x80){ 222 | # 2 bytes 223 | return chr(0xC0 | (($cp & 0x7C0) >> 6)). 224 | chr(0x80 | ($cp & 0x3F)); 225 | }else{ 226 | # 1 byte 227 | return chr($cp); 228 | } 229 | } 230 | 231 | function format_string($s){ 232 | $out = ''; 233 | for ($i=0; $i= 0x20 && $c < 0x80 && !in_array($c, array(34, 39, 92))){ 236 | $out .= chr($c); 237 | }else{ 238 | $out .= sprintf('\\x%02x', $c); 239 | } 240 | } 241 | return '"'.$out.'"'; 242 | } 243 | 244 | function fetch_prefixes($map, $length = 2){ 245 | $result = array(); 246 | foreach ($map as $symbol => $junk){ 247 | $result[substr($symbol, 0, $length)] = 1; 248 | } 249 | return array_keys($result); 250 | } 251 | -------------------------------------------------------------------------------- /build/build_table.php: -------------------------------------------------------------------------------- 1 | 12 | 13 | 14 | 15 | PHP Emoji Catalog 16 | 17 | 54 | 55 | 56 | 57 |

PHP Emoji Catalog

58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | $name){ 72 | 73 | echo "\t\n"; 74 | echo "\t\t\n"; 75 | echo "\t\t\n"; 76 | echo "\t\t\n"; 77 | echo "\t\t\n"; 78 | echo "\t\t\n"; 79 | echo "\t\t\n"; 80 | echo "\t\t\n"; 81 | echo "\t\n"; 82 | } 83 | ?> 84 | 85 |
NameUnifiedDocomoKDDISoftbankGoogle
".HtmlSpecialChars(StrToLower($name))."".format_bytes($unified)."".format_bytes($GLOBALS['emoji_maps']['unified_to_docomo'][$unified])."".format_bytes($GLOBALS['emoji_maps']['unified_to_kddi'][$unified])."".format_bytes($GLOBALS['emoji_maps']['unified_to_softbank'][$unified])."".format_bytes($GLOBALS['emoji_maps']['unified_to_google'][$unified])."
86 | 87 | 88 | 89 | -------------------------------------------------------------------------------- /build/inc.css: -------------------------------------------------------------------------------- 1 | span.emoji-sizer { 2 | line-height: 1.013em; 3 | font-size: 1.375em; 4 | margin: -0.05em 0; 5 | } 6 | 7 | span.emoji-outer { 8 | display: -moz-inline-box; 9 | display: inline-block; 10 | *display: inline; 11 | height: 1em; 12 | width: 1em; 13 | } 14 | 15 | span.emoji-inner { 16 | background: url(emoji.png); 17 | display: -moz-inline-box; 18 | display: inline-block; 19 | text-indent: -9999px; 20 | width: 100%; 21 | height: 100%; 22 | vertical-align: baseline; 23 | *vertical-align: auto; 24 | *zoom: 1; 25 | } 26 | -------------------------------------------------------------------------------- /build/inc.php: -------------------------------------------------------------------------------- 1 | 2 | $GLOBALS['emoji_maps']['html_to_unified'] = array_flip($GLOBALS['emoji_maps']['unified_to_html']); 3 | 4 | 5 | # 6 | # functions to convert incoming data into the unified format 7 | # 8 | 9 | function emoji_docomo_to_unified( $text){ return emoji_convert($text, 'docomo_to_unified'); } 10 | function emoji_kddi_to_unified( $text){ return emoji_convert($text, 'kddi_to_unified'); } 11 | function emoji_softbank_to_unified( $text){ return emoji_convert($text, 'softbank_to_unified'); } 12 | function emoji_google_to_unified( $text){ return emoji_convert($text, 'google_to_unified'); } 13 | 14 | 15 | # 16 | # functions to convert unified data into an outgoing format 17 | # 18 | 19 | function emoji_unified_to_docomo( $text){ return emoji_convert($text, 'unified_to_docomo'); } 20 | function emoji_unified_to_kddi( $text){ return emoji_convert($text, 'unified_to_kddi'); } 21 | function emoji_unified_to_softbank( $text){ return emoji_convert($text, 'unified_to_softbank'); } 22 | function emoji_unified_to_google( $text){ return emoji_convert($text, 'unified_to_google'); } 23 | 24 | 25 | # 26 | # HTML transformation 27 | # 28 | 29 | function emoji_unified_to_html($text){ 30 | return preg_replace_callback($GLOBALS['emoji_maps']['unified_rx'], function($m){ 31 | if (isset($m[2]) && $m[2] == "\xEF\xB8\x8E") return $m[0]; 32 | $cp = $GLOBALS['emoji_maps']['unified_to_html'][$m[1]]; 33 | return ""; 34 | }, $text); 35 | } 36 | 37 | function emoji_html_to_unified($text){ 38 | return preg_replace_callback("!!", function($m){ 39 | if (isset($GLOBALS['emoji_maps']['html_to_unified'][$m[1]])){ 40 | return $GLOBALS['emoji_maps']['html_to_unified'][$m[1]]; 41 | } 42 | return $m[0]; 43 | }, $text); 44 | } 45 | 46 | 47 | function emoji_convert($text, $map){ 48 | 49 | return str_replace(array_keys($GLOBALS['emoji_maps'][$map]), $GLOBALS['emoji_maps'][$map], $text); 50 | } 51 | 52 | function emoji_get_name($unified_cp){ 53 | 54 | return $GLOBALS['emoji_maps']['names'][$unified_cp] ? $GLOBALS['emoji_maps']['names'][$unified_cp] : '?'; 55 | } 56 | 57 | function emoji_contains_emoji($text){ 58 | 59 | $count = 0; 60 | str_replace($GLOBALS['emoji_maps']['prefixes'], '00', $text, $count); 61 | return $count > 0; 62 | } 63 | -------------------------------------------------------------------------------- /build/old_optimize.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | optipng -zc1-9 -zm1-9 -zs0-3 -f0-5 -out ../emoji_optipng.png ../emoji.png 4 | 5 | pngcrush -brute ../emoji.png ../emoji_pngcrush.png 6 | 7 | pngout -y ../emoji.png ../emoji_pngout.png 8 | 9 | -------------------------------------------------------------------------------- /build/old_parse.php: -------------------------------------------------------------------------------- 1 | ', '
', '
'), "\n", $html); 13 | 14 | $doc = new DOMDocument(); 15 | @$doc->loadHTML($html); 16 | 17 | 18 | # 19 | # get an array of 's we care about 20 | # 21 | 22 | $all_trs = get_elts_by_tag($doc, 'tr'); 23 | 24 | $trs = array(); 25 | 26 | foreach ($all_trs as $item){ 27 | 28 | if ($item->getAttribute('class') == 'not_in_proposal'){ 29 | continue; 30 | } 31 | 32 | if (!preg_match('/^e-\w{3}$/', $item->getAttribute('id'))){ 33 | continue; 34 | } 35 | 36 | if (!(7 === count(get_elts_by_tag($item, 'td')))){ 37 | continue; 38 | } 39 | 40 | $trs[] = $item; 41 | } 42 | 43 | fprintf(STDERR, "trs count:" . count($trs)."\n"); 44 | 45 | 46 | # 47 | # iterate over the 's, extracting the data we need 48 | # 49 | 50 | $items = array(); 51 | 52 | foreach ($trs as $tr){ 53 | 54 | $tds = get_elts_by_tag($tr, 'td'); 55 | 56 | $item = array( 57 | 'mapid' => parse_mapid($tds[0]), 58 | 'unicode' => parse_unicode($tds[1]), 59 | 'char_name' => parse_char_name($tds[2]), 60 | 'docomo' => parse_mobile($tds[3]), 61 | 'au' => parse_mobile($tds[4]), 62 | 'softbank' => parse_mobile($tds[5]), 63 | 'google' => parse_google($tds[6]), 64 | ); 65 | 66 | $items[] = $item; 67 | } 68 | 69 | fprintf(STDERR, "codepoint count:".count($items)."\n"); 70 | 71 | 72 | # 73 | # filter invalid codepoints 74 | # 75 | 76 | fprintf(STDERR, "filter only_kaomoji ; like e-554 -> [A] -> [A] -> [A] -> [A]\n"); 77 | $items = filter_only_kaomoji($items); 78 | fprintf(STDERR, "filter invisibles\n"); 79 | $items = filter_invisibles($items); 80 | fprintf(STDERR, "codepoint count:".count($items)."\n"); 81 | 82 | 83 | # 84 | # export the catalog 85 | # 86 | 87 | echo "<"."?php \$catalog = "; 88 | var_export($items); 89 | echo "; ?".">"; 90 | 91 | 92 | function get_elts_by_tag($root, $tagname){ 93 | 94 | $nodelist = $root->getElementsByTagName($tagname); 95 | $result = array(); 96 | 97 | $len = $nodelist->length; 98 | for($i=0; $i<$len; $i++) { 99 | $result[] = $nodelist->item($i); 100 | } 101 | 102 | return $result; 103 | } 104 | 105 | function parse_mapid($elt) { 106 | // like e-19E 107 | $links = get_elts_by_tag($elt, 'a'); 108 | if(empty($links)) return null; 109 | return $links[0]->getAttribute("href"); 110 | } 111 | 112 | function parse_unicode($elt) { 113 | //like U+1F469 114 | return get_unicode_chars($elt); 115 | } 116 | 117 | function parse_char_name($elt) { 118 | $lines = array_filter(array_map('trim', explode("\n", $elt->textContent))); 119 | 120 | if(count($lines[0])>0) { 121 | $result['title'] = $lines[0]; 122 | unset($lines[0]); 123 | $result['desc'] = join("\n", $lines); 124 | 125 | return $result; 126 | } 127 | return null; 128 | } 129 | 130 | function parse_mobile($elt){ 131 | 132 | if (!has_image($elt)){ 133 | 134 | return array( 135 | 'kaomoji' => trim($elt->textContent) 136 | ); 137 | }else{ 138 | return array( 139 | 'number' => get_number_chars($elt), 140 | 'number_old' => get_old_num_chars($elt), 141 | 'unicode' => get_unicode_chars($elt), 142 | 'sjis' => get_sjis_chars($elt), 143 | 'jis' => get_jis_chars($elt), 144 | ); 145 | } 146 | } 147 | 148 | function parse_google($elt){ 149 | return array( 150 | 'unicode' => get_unicode_chars($elt), 151 | ); 152 | } 153 | 154 | function has_image($elt) { 155 | return count(get_elts_by_tag($elt, 'img')) > 0; 156 | } 157 | 158 | function get_unicode_chars($elt){ return get_some_chars($elt, '!U\+(\w{4,5})!u', 16); } 159 | function get_sjis_chars($elt){ return get_some_chars($elt, '/\bSJIS-(\w{4})/u', 16); } 160 | function get_jis_chars($elt){ return get_some_chars($elt, '/\bJIS-(\w{4})/u', 16); } 161 | function get_number_chars($elt){ return get_some_chars($elt, '/\#([0-9]{1,})/'); } 162 | function get_old_num_chars($elt){ return get_some_chars($elt, '/\#old([0-9]{1,})/'); } 163 | 164 | function get_some_chars($elt, $rx, $base=10){ 165 | 166 | $out = array(); 167 | 168 | if (preg_match_all($rx, $elt->textContent, $m)){ 169 | 170 | foreach ($m[1] as $n){ 171 | $out[] = intval($n, $base); 172 | } 173 | } 174 | 175 | return $out; 176 | } 177 | 178 | function filter_only_kaomoji($mapping) { 179 | $result = array(); 180 | foreach($mapping as $map) { 181 | 182 | if(isset($map['docomo']['kaomoji']) 183 | && isset($map['au']['kaomoji']) 184 | && isset($map['softbank']['kaomoji'])) 185 | { 186 | continue; 187 | } 188 | else { 189 | $result[] = $map; 190 | } 191 | } 192 | 193 | return $result; 194 | } 195 | 196 | 197 | function filter_chars_group($mapping) { 198 | $result = array(); 199 | foreach($mapping as $map) { 200 | 201 | if( @preg_match('/\+$/', $map['docomo']['number']) 202 | || @preg_match('/\+$/', $map['au']['number']) 203 | || @preg_match('/\+$/', $map['softbank']['number']) 204 | ){ 205 | continue; 206 | } 207 | else { 208 | $result[] = $map; 209 | } 210 | } 211 | 212 | return $result; 213 | } 214 | 215 | function fix_geta_mark($mapping) { 216 | $result = array(); 217 | 218 | foreach($mapping as $map) { 219 | 220 | if(isset($map['docomo']['kaomoji']) 221 | && $map['docomo']['kaomoji'] == '〓') { 222 | $map['docomo']['kaomoji'] = ''; 223 | } 224 | 225 | if(isset($map['au']['kaomoji']) 226 | && $map['au']['kaomoji'] == '〓') { 227 | $map['au']['kaomoji'] = ''; 228 | } 229 | 230 | if(isset($map['softbank']['kaomoji']) 231 | && $map['softbank']['kaomoji'] == '〓') { 232 | $map['softbank']['kaomoji'] = ''; 233 | } 234 | 235 | $result[] = $map; 236 | } 237 | 238 | return $result; 239 | } 240 | 241 | function get_all_kaomoji($mapping) { 242 | $arr = array(); 243 | 244 | foreach($mapping as $map) { 245 | if(isset($map['docomo']['kaomoji']) ) { 246 | $arr[ $map['docomo']['kaomoji'] ] = '1'; 247 | } 248 | 249 | if(isset($map['au']['kaomoji']) ) { 250 | $arr[ $map['au']['kaomoji'] ] = '1'; 251 | } 252 | 253 | if(isset($map['softbank']['kaomoji']) ) { 254 | $arr[ $map['softbank']['kaomoji'] ] = '1'; 255 | } 256 | } 257 | 258 | return array_keys($arr); 259 | } 260 | 261 | function filter_invisibles($items){ 262 | 263 | $out = array(); 264 | 265 | foreach ($items as $item){ 266 | 267 | if (count($item['unicode']) == 1){ 268 | if ($item['unicode'][0] == 0x2003) continue; # em space 269 | if ($item['unicode'][0] == 0x2002) continue; # en space 270 | if ($item['unicode'][0] == 0x2005) continue; # four-per-em space 271 | } 272 | 273 | $out[] = $item; 274 | } 275 | 276 | return $out; 277 | } 278 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "iamcal/php-emoji", 3 | "description": "This is a PHP library for dealing with Emoji, allowing you to convert between various native formats and displaying them using HTML.", 4 | "keywords": ["emoji", "convert", "converter"], 5 | "homepage": "https://github.com/iamcal/php-emoji", 6 | "license": "MIT", 7 | "authors": [ 8 | { 9 | "name": "Cal Henderson", 10 | "email": "cal@iamcal.com", 11 | "homepage": "http://www.iamcal.com/" 12 | } 13 | ], 14 | "require": { 15 | "php": ">=5.0" 16 | }, 17 | "autoload": { 18 | "files": ["lib/emoji.php"] 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /demo/html_demo.php: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | Emoji HTML Test 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 0x10000){ 34 | # 4 bytes 35 | return chr(0xF0 | (($cp & 0x1C0000) >> 18)). 36 | chr(0x80 | (($cp & 0x3F000) >> 12)). 37 | chr(0x80 | (($cp & 0xFC0) >> 6)). 38 | chr(0x80 | ($cp & 0x3F)); 39 | }else if ($cp > 0x800){ 40 | # 3 bytes 41 | return chr(0xE0 | (($cp & 0xF000) >> 12)). 42 | chr(0x80 | (($cp & 0xFC0) >> 6)). 43 | chr(0x80 | ($cp & 0x3F)); 44 | }else if ($cp > 0x80){ 45 | # 2 bytes 46 | return chr(0xC0 | (($cp & 0x7C0) >> 6)). 47 | chr(0x80 | ($cp & 0x3F)); 48 | }else{ 49 | # 1 byte 50 | return chr($cp); 51 | } 52 | } 53 | 54 | foreach ($src as $unified){ 55 | 56 | $bytes = ''; 57 | $hex = array(); 58 | 59 | foreach ($unified as $cp){ 60 | $bytes .= utf8_bytes($cp); 61 | $hex[] = sprintf('U+%04X', $cp); 62 | 63 | } 64 | 65 | $str = "Hello $bytes World"; 66 | 67 | echo "\n"; 68 | echo "\n"; 69 | echo "\n"; 70 | echo "\n"; 71 | echo "\n"; 72 | echo "\n"; 73 | echo "\n"; 74 | } 75 | ?> 76 |
UnifiedNameUnified TextHTMLHTML to Unified
".implode(' ', $hex)."".HtmlSpecialChars(emoji_get_name($bytes))."$str".emoji_unified_to_html($str)."".emoji_html_to_unified(emoji_unified_to_html($str))."
77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /lib/emoji.css: -------------------------------------------------------------------------------- 1 | span.emoji-sizer { 2 | line-height: 1.013em; 3 | font-size: 1.375em; 4 | margin: -0.05em 0; 5 | } 6 | 7 | span.emoji-outer { 8 | display: -moz-inline-box; 9 | display: inline-block; 10 | *display: inline; 11 | height: 1em; 12 | width: 1em; 13 | } 14 | 15 | span.emoji-inner { 16 | background: url(emoji.png); 17 | display: -moz-inline-box; 18 | display: inline-block; 19 | text-indent: -9999px; 20 | width: 100%; 21 | height: 100%; 22 | vertical-align: baseline; 23 | *vertical-align: auto; 24 | *zoom: 1; 25 | } 26 | span.emoji-inner { background-size: 4100%; } 27 | .emojia9 { background-position: 0% 0% !important; } 28 | .emojiae { background-position: 0% 2.5% !important; } 29 | .emoji203c { background-position: 0% 5% !important; } 30 | .emoji2049 { background-position: 0% 7.5% !important; } 31 | .emoji2122 { background-position: 0% 10% !important; } 32 | .emoji2139 { background-position: 0% 12.5% !important; } 33 | .emoji2194 { background-position: 0% 15% !important; } 34 | .emoji2195 { background-position: 0% 17.5% !important; } 35 | .emoji2196 { background-position: 0% 20% !important; } 36 | .emoji2197 { background-position: 0% 22.5% !important; } 37 | .emoji2198 { background-position: 0% 25% !important; } 38 | .emoji2199 { background-position: 0% 27.5% !important; } 39 | .emoji21a9 { background-position: 0% 30% !important; } 40 | .emoji21aa { background-position: 0% 32.5% !important; } 41 | .emoji231a { background-position: 0% 35% !important; } 42 | .emoji231b { background-position: 0% 37.5% !important; } 43 | .emoji2328 { background-position: 0% 40% !important; } 44 | .emoji23e9 { background-position: 0% 42.5% !important; } 45 | .emoji23ea { background-position: 0% 45% !important; } 46 | .emoji23eb { background-position: 0% 47.5% !important; } 47 | .emoji23ec { background-position: 0% 50% !important; } 48 | .emoji23ed { background-position: 0% 52.5% !important; } 49 | .emoji23ee { background-position: 0% 55% !important; } 50 | .emoji23ef { background-position: 0% 57.5% !important; } 51 | .emoji23f0 { background-position: 0% 60% !important; } 52 | .emoji23f1 { background-position: 0% 62.5% !important; } 53 | .emoji23f2 { background-position: 0% 65% !important; } 54 | .emoji23f3 { background-position: 0% 67.5% !important; } 55 | .emoji23f8 { background-position: 0% 70% !important; } 56 | .emoji23f9 { background-position: 0% 72.5% !important; } 57 | .emoji23fa { background-position: 0% 75% !important; } 58 | .emoji24c2 { background-position: 0% 77.5% !important; } 59 | .emoji25aa { background-position: 0% 80% !important; } 60 | .emoji25ab { background-position: 0% 82.5% !important; } 61 | .emoji25b6 { background-position: 0% 85% !important; } 62 | .emoji25c0 { background-position: 0% 87.5% !important; } 63 | .emoji25fb { background-position: 0% 90% !important; } 64 | .emoji25fc { background-position: 0% 92.5% !important; } 65 | .emoji25fd { background-position: 0% 95% !important; } 66 | .emoji25fe { background-position: 0% 97.5% !important; } 67 | .emoji2600 { background-position: 0% 100% !important; } 68 | .emoji2601 { background-position: 2.5% 0% !important; } 69 | .emoji2602 { background-position: 2.5% 2.5% !important; } 70 | .emoji2603 { background-position: 2.5% 5% !important; } 71 | .emoji2604 { background-position: 2.5% 7.5% !important; } 72 | .emoji260e { background-position: 2.5% 10% !important; } 73 | .emoji2611 { background-position: 2.5% 12.5% !important; } 74 | .emoji2614 { background-position: 2.5% 15% !important; } 75 | .emoji2615 { background-position: 2.5% 17.5% !important; } 76 | .emoji2618 { background-position: 2.5% 20% !important; } 77 | .emoji261d { background-position: 2.5% 22.5% !important; } 78 | .emoji2620 { background-position: 2.5% 37.5% !important; } 79 | .emoji2622 { background-position: 2.5% 40% !important; } 80 | .emoji2623 { background-position: 2.5% 42.5% !important; } 81 | .emoji2626 { background-position: 2.5% 45% !important; } 82 | .emoji262a { background-position: 2.5% 47.5% !important; } 83 | .emoji262e { background-position: 2.5% 50% !important; } 84 | .emoji262f { background-position: 2.5% 52.5% !important; } 85 | .emoji2638 { background-position: 2.5% 55% !important; } 86 | .emoji2639 { background-position: 2.5% 57.5% !important; } 87 | .emoji263a { background-position: 2.5% 60% !important; } 88 | .emoji2648 { background-position: 2.5% 62.5% !important; } 89 | .emoji2649 { background-position: 2.5% 65% !important; } 90 | .emoji264a { background-position: 2.5% 67.5% !important; } 91 | .emoji264b { background-position: 2.5% 70% !important; } 92 | .emoji264c { background-position: 2.5% 72.5% !important; } 93 | .emoji264d { background-position: 2.5% 75% !important; } 94 | .emoji264e { background-position: 2.5% 77.5% !important; } 95 | .emoji264f { background-position: 2.5% 80% !important; } 96 | .emoji2650 { background-position: 2.5% 82.5% !important; } 97 | .emoji2651 { background-position: 2.5% 85% !important; } 98 | .emoji2652 { background-position: 2.5% 87.5% !important; } 99 | .emoji2653 { background-position: 2.5% 90% !important; } 100 | .emoji2660 { background-position: 2.5% 92.5% !important; } 101 | .emoji2663 { background-position: 2.5% 95% !important; } 102 | .emoji2665 { background-position: 2.5% 97.5% !important; } 103 | .emoji2666 { background-position: 2.5% 100% !important; } 104 | .emoji2668 { background-position: 5% 0% !important; } 105 | .emoji267b { background-position: 5% 2.5% !important; } 106 | .emoji267f { background-position: 5% 5% !important; } 107 | .emoji2692 { background-position: 5% 7.5% !important; } 108 | .emoji2693 { background-position: 5% 10% !important; } 109 | .emoji2694 { background-position: 5% 12.5% !important; } 110 | .emoji2696 { background-position: 5% 15% !important; } 111 | .emoji2697 { background-position: 5% 17.5% !important; } 112 | .emoji2699 { background-position: 5% 20% !important; } 113 | .emoji269b { background-position: 5% 22.5% !important; } 114 | .emoji269c { background-position: 5% 25% !important; } 115 | .emoji26a0 { background-position: 5% 27.5% !important; } 116 | .emoji26a1 { background-position: 5% 30% !important; } 117 | .emoji26aa { background-position: 5% 32.5% !important; } 118 | .emoji26ab { background-position: 5% 35% !important; } 119 | .emoji26b0 { background-position: 5% 37.5% !important; } 120 | .emoji26b1 { background-position: 5% 40% !important; } 121 | .emoji26bd { background-position: 5% 42.5% !important; } 122 | .emoji26be { background-position: 5% 45% !important; } 123 | .emoji26c4 { background-position: 5% 47.5% !important; } 124 | .emoji26c5 { background-position: 5% 50% !important; } 125 | .emoji26c8 { background-position: 5% 52.5% !important; } 126 | .emoji26ce { background-position: 5% 55% !important; } 127 | .emoji26cf { background-position: 5% 57.5% !important; } 128 | .emoji26d1 { background-position: 5% 60% !important; } 129 | .emoji26d3 { background-position: 5% 62.5% !important; } 130 | .emoji26d4 { background-position: 5% 65% !important; } 131 | .emoji26e9 { background-position: 5% 67.5% !important; } 132 | .emoji26ea { background-position: 5% 70% !important; } 133 | .emoji26f0 { background-position: 5% 72.5% !important; } 134 | .emoji26f1 { background-position: 5% 75% !important; } 135 | .emoji26f2 { background-position: 5% 77.5% !important; } 136 | .emoji26f3 { background-position: 5% 80% !important; } 137 | .emoji26f4 { background-position: 5% 82.5% !important; } 138 | .emoji26f5 { background-position: 5% 85% !important; } 139 | .emoji26f7 { background-position: 5% 87.5% !important; } 140 | .emoji26f8 { background-position: 5% 90% !important; } 141 | .emoji26f9 { background-position: 5% 92.5% !important; } 142 | .emoji26fa { background-position: 7.5% 5% !important; } 143 | .emoji26fd { background-position: 7.5% 7.5% !important; } 144 | .emoji2702 { background-position: 7.5% 10% !important; } 145 | .emoji2705 { background-position: 7.5% 12.5% !important; } 146 | .emoji2708 { background-position: 7.5% 15% !important; } 147 | .emoji2709 { background-position: 7.5% 17.5% !important; } 148 | .emoji270a { background-position: 7.5% 20% !important; } 149 | .emoji270b { background-position: 7.5% 35% !important; } 150 | .emoji270c { background-position: 7.5% 50% !important; } 151 | .emoji270d { background-position: 7.5% 65% !important; } 152 | .emoji270f { background-position: 7.5% 80% !important; } 153 | .emoji2712 { background-position: 7.5% 82.5% !important; } 154 | .emoji2714 { background-position: 7.5% 85% !important; } 155 | .emoji2716 { background-position: 7.5% 87.5% !important; } 156 | .emoji271d { background-position: 7.5% 90% !important; } 157 | .emoji2721 { background-position: 7.5% 92.5% !important; } 158 | .emoji2728 { background-position: 7.5% 95% !important; } 159 | .emoji2733 { background-position: 7.5% 97.5% !important; } 160 | .emoji2734 { background-position: 7.5% 100% !important; } 161 | .emoji2744 { background-position: 10% 0% !important; } 162 | .emoji2747 { background-position: 10% 2.5% !important; } 163 | .emoji274c { background-position: 10% 5% !important; } 164 | .emoji274e { background-position: 10% 7.5% !important; } 165 | .emoji2753 { background-position: 10% 10% !important; } 166 | .emoji2754 { background-position: 10% 12.5% !important; } 167 | .emoji2755 { background-position: 10% 15% !important; } 168 | .emoji2757 { background-position: 10% 17.5% !important; } 169 | .emoji2763 { background-position: 10% 20% !important; } 170 | .emoji2764 { background-position: 10% 22.5% !important; } 171 | .emoji2795 { background-position: 10% 25% !important; } 172 | .emoji2796 { background-position: 10% 27.5% !important; } 173 | .emoji2797 { background-position: 10% 30% !important; } 174 | .emoji27a1 { background-position: 10% 32.5% !important; } 175 | .emoji27b0 { background-position: 10% 35% !important; } 176 | .emoji27bf { background-position: 10% 37.5% !important; } 177 | .emoji2934 { background-position: 10% 40% !important; } 178 | .emoji2935 { background-position: 10% 42.5% !important; } 179 | .emoji2b05 { background-position: 10% 45% !important; } 180 | .emoji2b06 { background-position: 10% 47.5% !important; } 181 | .emoji2b07 { background-position: 10% 50% !important; } 182 | .emoji2b1b { background-position: 10% 52.5% !important; } 183 | .emoji2b1c { background-position: 10% 55% !important; } 184 | .emoji2b50 { background-position: 10% 57.5% !important; } 185 | .emoji2b55 { background-position: 10% 60% !important; } 186 | .emoji3030 { background-position: 10% 62.5% !important; } 187 | .emoji303d { background-position: 10% 65% !important; } 188 | .emoji3297 { background-position: 10% 67.5% !important; } 189 | .emoji3299 { background-position: 10% 70% !important; } 190 | .emoji1f004 { background-position: 10% 72.5% !important; } 191 | .emoji1f0cf { background-position: 10% 75% !important; } 192 | .emoji1f170 { background-position: 10% 77.5% !important; } 193 | .emoji1f171 { background-position: 10% 80% !important; } 194 | .emoji1f17e { background-position: 10% 82.5% !important; } 195 | .emoji1f17f { background-position: 10% 85% !important; } 196 | .emoji1f18e { background-position: 10% 87.5% !important; } 197 | .emoji1f191 { background-position: 10% 90% !important; } 198 | .emoji1f192 { background-position: 10% 92.5% !important; } 199 | .emoji1f193 { background-position: 10% 95% !important; } 200 | .emoji1f194 { background-position: 10% 97.5% !important; } 201 | .emoji1f195 { background-position: 10% 100% !important; } 202 | .emoji1f196 { background-position: 12.5% 0% !important; } 203 | .emoji1f197 { background-position: 12.5% 2.5% !important; } 204 | .emoji1f198 { background-position: 12.5% 5% !important; } 205 | .emoji1f199 { background-position: 12.5% 7.5% !important; } 206 | .emoji1f19a { background-position: 12.5% 10% !important; } 207 | .emoji1f201 { background-position: 12.5% 12.5% !important; } 208 | .emoji1f202 { background-position: 12.5% 15% !important; } 209 | .emoji1f21a { background-position: 12.5% 17.5% !important; } 210 | .emoji1f22f { background-position: 12.5% 20% !important; } 211 | .emoji1f232 { background-position: 12.5% 22.5% !important; } 212 | .emoji1f233 { background-position: 12.5% 25% !important; } 213 | .emoji1f234 { background-position: 12.5% 27.5% !important; } 214 | .emoji1f235 { background-position: 12.5% 30% !important; } 215 | .emoji1f236 { background-position: 12.5% 32.5% !important; } 216 | .emoji1f237 { background-position: 12.5% 35% !important; } 217 | .emoji1f238 { background-position: 12.5% 37.5% !important; } 218 | .emoji1f239 { background-position: 12.5% 40% !important; } 219 | .emoji1f23a { background-position: 12.5% 42.5% !important; } 220 | .emoji1f250 { background-position: 12.5% 45% !important; } 221 | .emoji1f251 { background-position: 12.5% 47.5% !important; } 222 | .emoji1f300 { background-position: 12.5% 50% !important; } 223 | .emoji1f301 { background-position: 12.5% 52.5% !important; } 224 | .emoji1f302 { background-position: 12.5% 55% !important; } 225 | .emoji1f303 { background-position: 12.5% 57.5% !important; } 226 | .emoji1f304 { background-position: 12.5% 60% !important; } 227 | .emoji1f305 { background-position: 12.5% 62.5% !important; } 228 | .emoji1f306 { background-position: 12.5% 65% !important; } 229 | .emoji1f307 { background-position: 12.5% 67.5% !important; } 230 | .emoji1f308 { background-position: 12.5% 70% !important; } 231 | .emoji1f309 { background-position: 12.5% 72.5% !important; } 232 | .emoji1f30a { background-position: 12.5% 75% !important; } 233 | .emoji1f30b { background-position: 12.5% 77.5% !important; } 234 | .emoji1f30c { background-position: 12.5% 80% !important; } 235 | .emoji1f30d { background-position: 12.5% 82.5% !important; } 236 | .emoji1f30e { background-position: 12.5% 85% !important; } 237 | .emoji1f30f { background-position: 12.5% 87.5% !important; } 238 | .emoji1f310 { background-position: 12.5% 90% !important; } 239 | .emoji1f311 { background-position: 12.5% 92.5% !important; } 240 | .emoji1f312 { background-position: 12.5% 95% !important; } 241 | .emoji1f313 { background-position: 12.5% 97.5% !important; } 242 | .emoji1f314 { background-position: 12.5% 100% !important; } 243 | .emoji1f315 { background-position: 15% 0% !important; } 244 | .emoji1f316 { background-position: 15% 2.5% !important; } 245 | .emoji1f317 { background-position: 15% 5% !important; } 246 | .emoji1f318 { background-position: 15% 7.5% !important; } 247 | .emoji1f319 { background-position: 15% 10% !important; } 248 | .emoji1f31a { background-position: 15% 12.5% !important; } 249 | .emoji1f31b { background-position: 15% 15% !important; } 250 | .emoji1f31c { background-position: 15% 17.5% !important; } 251 | .emoji1f31d { background-position: 15% 20% !important; } 252 | .emoji1f31e { background-position: 15% 22.5% !important; } 253 | .emoji1f31f { background-position: 15% 25% !important; } 254 | .emoji1f320 { background-position: 15% 27.5% !important; } 255 | .emoji1f321 { background-position: 15% 30% !important; } 256 | .emoji1f324 { background-position: 15% 32.5% !important; } 257 | .emoji1f325 { background-position: 15% 35% !important; } 258 | .emoji1f326 { background-position: 15% 37.5% !important; } 259 | .emoji1f327 { background-position: 15% 40% !important; } 260 | .emoji1f328 { background-position: 15% 42.5% !important; } 261 | .emoji1f329 { background-position: 15% 45% !important; } 262 | .emoji1f32a { background-position: 15% 47.5% !important; } 263 | .emoji1f32b { background-position: 15% 50% !important; } 264 | .emoji1f32c { background-position: 15% 52.5% !important; } 265 | .emoji1f32d { background-position: 15% 55% !important; } 266 | .emoji1f32e { background-position: 15% 57.5% !important; } 267 | .emoji1f32f { background-position: 15% 60% !important; } 268 | .emoji1f330 { background-position: 15% 62.5% !important; } 269 | .emoji1f331 { background-position: 15% 65% !important; } 270 | .emoji1f332 { background-position: 15% 67.5% !important; } 271 | .emoji1f333 { background-position: 15% 70% !important; } 272 | .emoji1f334 { background-position: 15% 72.5% !important; } 273 | .emoji1f335 { background-position: 15% 75% !important; } 274 | .emoji1f336 { background-position: 15% 77.5% !important; } 275 | .emoji1f337 { background-position: 15% 80% !important; } 276 | .emoji1f338 { background-position: 15% 82.5% !important; } 277 | .emoji1f339 { background-position: 15% 85% !important; } 278 | .emoji1f33a { background-position: 15% 87.5% !important; } 279 | .emoji1f33b { background-position: 15% 90% !important; } 280 | .emoji1f33c { background-position: 15% 92.5% !important; } 281 | .emoji1f33d { background-position: 15% 95% !important; } 282 | .emoji1f33e { background-position: 15% 97.5% !important; } 283 | .emoji1f33f { background-position: 15% 100% !important; } 284 | .emoji1f340 { background-position: 17.5% 0% !important; } 285 | .emoji1f341 { background-position: 17.5% 2.5% !important; } 286 | .emoji1f342 { background-position: 17.5% 5% !important; } 287 | .emoji1f343 { background-position: 17.5% 7.5% !important; } 288 | .emoji1f344 { background-position: 17.5% 10% !important; } 289 | .emoji1f345 { background-position: 17.5% 12.5% !important; } 290 | .emoji1f346 { background-position: 17.5% 15% !important; } 291 | .emoji1f347 { background-position: 17.5% 17.5% !important; } 292 | .emoji1f348 { background-position: 17.5% 20% !important; } 293 | .emoji1f349 { background-position: 17.5% 22.5% !important; } 294 | .emoji1f34a { background-position: 17.5% 25% !important; } 295 | .emoji1f34b { background-position: 17.5% 27.5% !important; } 296 | .emoji1f34c { background-position: 17.5% 30% !important; } 297 | .emoji1f34d { background-position: 17.5% 32.5% !important; } 298 | .emoji1f34e { background-position: 17.5% 35% !important; } 299 | .emoji1f34f { background-position: 17.5% 37.5% !important; } 300 | .emoji1f350 { background-position: 17.5% 40% !important; } 301 | .emoji1f351 { background-position: 17.5% 42.5% !important; } 302 | .emoji1f352 { background-position: 17.5% 45% !important; } 303 | .emoji1f353 { background-position: 17.5% 47.5% !important; } 304 | .emoji1f354 { background-position: 17.5% 50% !important; } 305 | .emoji1f355 { background-position: 17.5% 52.5% !important; } 306 | .emoji1f356 { background-position: 17.5% 55% !important; } 307 | .emoji1f357 { background-position: 17.5% 57.5% !important; } 308 | .emoji1f358 { background-position: 17.5% 60% !important; } 309 | .emoji1f359 { background-position: 17.5% 62.5% !important; } 310 | .emoji1f35a { background-position: 17.5% 65% !important; } 311 | .emoji1f35b { background-position: 17.5% 67.5% !important; } 312 | .emoji1f35c { background-position: 17.5% 70% !important; } 313 | .emoji1f35d { background-position: 17.5% 72.5% !important; } 314 | .emoji1f35e { background-position: 17.5% 75% !important; } 315 | .emoji1f35f { background-position: 17.5% 77.5% !important; } 316 | .emoji1f360 { background-position: 17.5% 80% !important; } 317 | .emoji1f361 { background-position: 17.5% 82.5% !important; } 318 | .emoji1f362 { background-position: 17.5% 85% !important; } 319 | .emoji1f363 { background-position: 17.5% 87.5% !important; } 320 | .emoji1f364 { background-position: 17.5% 90% !important; } 321 | .emoji1f365 { background-position: 17.5% 92.5% !important; } 322 | .emoji1f366 { background-position: 17.5% 95% !important; } 323 | .emoji1f367 { background-position: 17.5% 97.5% !important; } 324 | .emoji1f368 { background-position: 17.5% 100% !important; } 325 | .emoji1f369 { background-position: 20% 0% !important; } 326 | .emoji1f36a { background-position: 20% 2.5% !important; } 327 | .emoji1f36b { background-position: 20% 5% !important; } 328 | .emoji1f36c { background-position: 20% 7.5% !important; } 329 | .emoji1f36d { background-position: 20% 10% !important; } 330 | .emoji1f36e { background-position: 20% 12.5% !important; } 331 | .emoji1f36f { background-position: 20% 15% !important; } 332 | .emoji1f370 { background-position: 20% 17.5% !important; } 333 | .emoji1f371 { background-position: 20% 20% !important; } 334 | .emoji1f372 { background-position: 20% 22.5% !important; } 335 | .emoji1f373 { background-position: 20% 25% !important; } 336 | .emoji1f374 { background-position: 20% 27.5% !important; } 337 | .emoji1f375 { background-position: 20% 30% !important; } 338 | .emoji1f376 { background-position: 20% 32.5% !important; } 339 | .emoji1f377 { background-position: 20% 35% !important; } 340 | .emoji1f378 { background-position: 20% 37.5% !important; } 341 | .emoji1f379 { background-position: 20% 40% !important; } 342 | .emoji1f37a { background-position: 20% 42.5% !important; } 343 | .emoji1f37b { background-position: 20% 45% !important; } 344 | .emoji1f37c { background-position: 20% 47.5% !important; } 345 | .emoji1f37d { background-position: 20% 50% !important; } 346 | .emoji1f37e { background-position: 20% 52.5% !important; } 347 | .emoji1f37f { background-position: 20% 55% !important; } 348 | .emoji1f380 { background-position: 20% 57.5% !important; } 349 | .emoji1f381 { background-position: 20% 60% !important; } 350 | .emoji1f382 { background-position: 20% 62.5% !important; } 351 | .emoji1f383 { background-position: 20% 65% !important; } 352 | .emoji1f384 { background-position: 20% 67.5% !important; } 353 | .emoji1f385 { background-position: 20% 70% !important; } 354 | .emoji1f386 { background-position: 20% 85% !important; } 355 | .emoji1f387 { background-position: 20% 87.5% !important; } 356 | .emoji1f388 { background-position: 20% 90% !important; } 357 | .emoji1f389 { background-position: 20% 92.5% !important; } 358 | .emoji1f38a { background-position: 20% 95% !important; } 359 | .emoji1f38b { background-position: 20% 97.5% !important; } 360 | .emoji1f38c { background-position: 20% 100% !important; } 361 | .emoji1f38d { background-position: 22.5% 0% !important; } 362 | .emoji1f38e { background-position: 22.5% 2.5% !important; } 363 | .emoji1f38f { background-position: 22.5% 5% !important; } 364 | .emoji1f390 { background-position: 22.5% 7.5% !important; } 365 | .emoji1f391 { background-position: 22.5% 10% !important; } 366 | .emoji1f392 { background-position: 22.5% 12.5% !important; } 367 | .emoji1f393 { background-position: 22.5% 15% !important; } 368 | .emoji1f396 { background-position: 22.5% 17.5% !important; } 369 | .emoji1f397 { background-position: 22.5% 20% !important; } 370 | .emoji1f399 { background-position: 22.5% 22.5% !important; } 371 | .emoji1f39a { background-position: 22.5% 25% !important; } 372 | .emoji1f39b { background-position: 22.5% 27.5% !important; } 373 | .emoji1f39e { background-position: 22.5% 30% !important; } 374 | .emoji1f39f { background-position: 22.5% 32.5% !important; } 375 | .emoji1f3a0 { background-position: 22.5% 35% !important; } 376 | .emoji1f3a1 { background-position: 22.5% 37.5% !important; } 377 | .emoji1f3a2 { background-position: 22.5% 40% !important; } 378 | .emoji1f3a3 { background-position: 22.5% 42.5% !important; } 379 | .emoji1f3a4 { background-position: 22.5% 45% !important; } 380 | .emoji1f3a5 { background-position: 22.5% 47.5% !important; } 381 | .emoji1f3a6 { background-position: 22.5% 50% !important; } 382 | .emoji1f3a7 { background-position: 22.5% 52.5% !important; } 383 | .emoji1f3a8 { background-position: 22.5% 55% !important; } 384 | .emoji1f3a9 { background-position: 22.5% 57.5% !important; } 385 | .emoji1f3aa { background-position: 22.5% 60% !important; } 386 | .emoji1f3ab { background-position: 22.5% 62.5% !important; } 387 | .emoji1f3ac { background-position: 22.5% 65% !important; } 388 | .emoji1f3ad { background-position: 22.5% 67.5% !important; } 389 | .emoji1f3ae { background-position: 22.5% 70% !important; } 390 | .emoji1f3af { background-position: 22.5% 72.5% !important; } 391 | .emoji1f3b0 { background-position: 22.5% 75% !important; } 392 | .emoji1f3b1 { background-position: 22.5% 77.5% !important; } 393 | .emoji1f3b2 { background-position: 22.5% 80% !important; } 394 | .emoji1f3b3 { background-position: 22.5% 82.5% !important; } 395 | .emoji1f3b4 { background-position: 22.5% 85% !important; } 396 | .emoji1f3b5 { background-position: 22.5% 87.5% !important; } 397 | .emoji1f3b6 { background-position: 22.5% 90% !important; } 398 | .emoji1f3b7 { background-position: 22.5% 92.5% !important; } 399 | .emoji1f3b8 { background-position: 22.5% 95% !important; } 400 | .emoji1f3b9 { background-position: 22.5% 97.5% !important; } 401 | .emoji1f3ba { background-position: 22.5% 100% !important; } 402 | .emoji1f3bb { background-position: 25% 0% !important; } 403 | .emoji1f3bc { background-position: 25% 2.5% !important; } 404 | .emoji1f3bd { background-position: 25% 5% !important; } 405 | .emoji1f3be { background-position: 25% 7.5% !important; } 406 | .emoji1f3bf { background-position: 25% 10% !important; } 407 | .emoji1f3c0 { background-position: 25% 12.5% !important; } 408 | .emoji1f3c1 { background-position: 25% 15% !important; } 409 | .emoji1f3c2 { background-position: 25% 17.5% !important; } 410 | .emoji1f3c3 { background-position: 25% 20% !important; } 411 | .emoji1f3c4 { background-position: 25% 35% !important; } 412 | .emoji1f3c5 { background-position: 25% 50% !important; } 413 | .emoji1f3c6 { background-position: 25% 52.5% !important; } 414 | .emoji1f3c7 { background-position: 25% 55% !important; } 415 | .emoji1f3c8 { background-position: 25% 70% !important; } 416 | .emoji1f3c9 { background-position: 25% 72.5% !important; } 417 | .emoji1f3ca { background-position: 25% 75% !important; } 418 | .emoji1f3cb { background-position: 25% 90% !important; } 419 | .emoji1f3cc { background-position: 27.5% 2.5% !important; } 420 | .emoji1f3cd { background-position: 27.5% 5% !important; } 421 | .emoji1f3ce { background-position: 27.5% 7.5% !important; } 422 | .emoji1f3cf { background-position: 27.5% 10% !important; } 423 | .emoji1f3d0 { background-position: 27.5% 12.5% !important; } 424 | .emoji1f3d1 { background-position: 27.5% 15% !important; } 425 | .emoji1f3d2 { background-position: 27.5% 17.5% !important; } 426 | .emoji1f3d3 { background-position: 27.5% 20% !important; } 427 | .emoji1f3d4 { background-position: 27.5% 22.5% !important; } 428 | .emoji1f3d5 { background-position: 27.5% 25% !important; } 429 | .emoji1f3d6 { background-position: 27.5% 27.5% !important; } 430 | .emoji1f3d7 { background-position: 27.5% 30% !important; } 431 | .emoji1f3d8 { background-position: 27.5% 32.5% !important; } 432 | .emoji1f3d9 { background-position: 27.5% 35% !important; } 433 | .emoji1f3da { background-position: 27.5% 37.5% !important; } 434 | .emoji1f3db { background-position: 27.5% 40% !important; } 435 | .emoji1f3dc { background-position: 27.5% 42.5% !important; } 436 | .emoji1f3dd { background-position: 27.5% 45% !important; } 437 | .emoji1f3de { background-position: 27.5% 47.5% !important; } 438 | .emoji1f3df { background-position: 27.5% 50% !important; } 439 | .emoji1f3e0 { background-position: 27.5% 52.5% !important; } 440 | .emoji1f3e1 { background-position: 27.5% 55% !important; } 441 | .emoji1f3e2 { background-position: 27.5% 57.5% !important; } 442 | .emoji1f3e3 { background-position: 27.5% 60% !important; } 443 | .emoji1f3e4 { background-position: 27.5% 62.5% !important; } 444 | .emoji1f3e5 { background-position: 27.5% 65% !important; } 445 | .emoji1f3e6 { background-position: 27.5% 67.5% !important; } 446 | .emoji1f3e7 { background-position: 27.5% 70% !important; } 447 | .emoji1f3e8 { background-position: 27.5% 72.5% !important; } 448 | .emoji1f3e9 { background-position: 27.5% 75% !important; } 449 | .emoji1f3ea { background-position: 27.5% 77.5% !important; } 450 | .emoji1f3eb { background-position: 27.5% 80% !important; } 451 | .emoji1f3ec { background-position: 27.5% 82.5% !important; } 452 | .emoji1f3ed { background-position: 27.5% 85% !important; } 453 | .emoji1f3ee { background-position: 27.5% 87.5% !important; } 454 | .emoji1f3ef { background-position: 27.5% 90% !important; } 455 | .emoji1f3f0 { background-position: 27.5% 92.5% !important; } 456 | .emoji1f3f3 { background-position: 27.5% 95% !important; } 457 | .emoji1f3f4 { background-position: 27.5% 97.5% !important; } 458 | .emoji1f3f5 { background-position: 27.5% 100% !important; } 459 | .emoji1f3f7 { background-position: 30% 0% !important; } 460 | .emoji1f3f8 { background-position: 30% 2.5% !important; } 461 | .emoji1f3f9 { background-position: 30% 5% !important; } 462 | .emoji1f3fa { background-position: 30% 7.5% !important; } 463 | .emoji1f3fb { background-position: 30% 10% !important; } 464 | .emoji1f3fc { background-position: 30% 12.5% !important; } 465 | .emoji1f3fd { background-position: 30% 15% !important; } 466 | .emoji1f3fe { background-position: 30% 17.5% !important; } 467 | .emoji1f3ff { background-position: 30% 20% !important; } 468 | .emoji1f400 { background-position: 30% 22.5% !important; } 469 | .emoji1f401 { background-position: 30% 25% !important; } 470 | .emoji1f402 { background-position: 30% 27.5% !important; } 471 | .emoji1f403 { background-position: 30% 30% !important; } 472 | .emoji1f404 { background-position: 30% 32.5% !important; } 473 | .emoji1f405 { background-position: 30% 35% !important; } 474 | .emoji1f406 { background-position: 30% 37.5% !important; } 475 | .emoji1f407 { background-position: 30% 40% !important; } 476 | .emoji1f408 { background-position: 30% 42.5% !important; } 477 | .emoji1f409 { background-position: 30% 45% !important; } 478 | .emoji1f40a { background-position: 30% 47.5% !important; } 479 | .emoji1f40b { background-position: 30% 50% !important; } 480 | .emoji1f40c { background-position: 30% 52.5% !important; } 481 | .emoji1f40d { background-position: 30% 55% !important; } 482 | .emoji1f40e { background-position: 30% 57.5% !important; } 483 | .emoji1f40f { background-position: 30% 60% !important; } 484 | .emoji1f410 { background-position: 30% 62.5% !important; } 485 | .emoji1f411 { background-position: 30% 65% !important; } 486 | .emoji1f412 { background-position: 30% 67.5% !important; } 487 | .emoji1f413 { background-position: 30% 70% !important; } 488 | .emoji1f414 { background-position: 30% 72.5% !important; } 489 | .emoji1f415 { background-position: 30% 75% !important; } 490 | .emoji1f416 { background-position: 30% 77.5% !important; } 491 | .emoji1f417 { background-position: 30% 80% !important; } 492 | .emoji1f418 { background-position: 30% 82.5% !important; } 493 | .emoji1f419 { background-position: 30% 85% !important; } 494 | .emoji1f41a { background-position: 30% 87.5% !important; } 495 | .emoji1f41b { background-position: 30% 90% !important; } 496 | .emoji1f41c { background-position: 30% 92.5% !important; } 497 | .emoji1f41d { background-position: 30% 95% !important; } 498 | .emoji1f41e { background-position: 30% 97.5% !important; } 499 | .emoji1f41f { background-position: 30% 100% !important; } 500 | .emoji1f420 { background-position: 32.5% 0% !important; } 501 | .emoji1f421 { background-position: 32.5% 2.5% !important; } 502 | .emoji1f422 { background-position: 32.5% 5% !important; } 503 | .emoji1f423 { background-position: 32.5% 7.5% !important; } 504 | .emoji1f424 { background-position: 32.5% 10% !important; } 505 | .emoji1f425 { background-position: 32.5% 12.5% !important; } 506 | .emoji1f426 { background-position: 32.5% 15% !important; } 507 | .emoji1f427 { background-position: 32.5% 17.5% !important; } 508 | .emoji1f428 { background-position: 32.5% 20% !important; } 509 | .emoji1f429 { background-position: 32.5% 22.5% !important; } 510 | .emoji1f42a { background-position: 32.5% 25% !important; } 511 | .emoji1f42b { background-position: 32.5% 27.5% !important; } 512 | .emoji1f42c { background-position: 32.5% 30% !important; } 513 | .emoji1f42d { background-position: 32.5% 32.5% !important; } 514 | .emoji1f42e { background-position: 32.5% 35% !important; } 515 | .emoji1f42f { background-position: 32.5% 37.5% !important; } 516 | .emoji1f430 { background-position: 32.5% 40% !important; } 517 | .emoji1f431 { background-position: 32.5% 42.5% !important; } 518 | .emoji1f432 { background-position: 32.5% 45% !important; } 519 | .emoji1f433 { background-position: 32.5% 47.5% !important; } 520 | .emoji1f434 { background-position: 32.5% 50% !important; } 521 | .emoji1f435 { background-position: 32.5% 52.5% !important; } 522 | .emoji1f436 { background-position: 32.5% 55% !important; } 523 | .emoji1f437 { background-position: 32.5% 57.5% !important; } 524 | .emoji1f438 { background-position: 32.5% 60% !important; } 525 | .emoji1f439 { background-position: 32.5% 62.5% !important; } 526 | .emoji1f43a { background-position: 32.5% 65% !important; } 527 | .emoji1f43b { background-position: 32.5% 67.5% !important; } 528 | .emoji1f43c { background-position: 32.5% 70% !important; } 529 | .emoji1f43d { background-position: 32.5% 72.5% !important; } 530 | .emoji1f43e { background-position: 32.5% 75% !important; } 531 | .emoji1f43f { background-position: 32.5% 77.5% !important; } 532 | .emoji1f440 { background-position: 32.5% 80% !important; } 533 | .emoji1f441 { background-position: 32.5% 82.5% !important; } 534 | .emoji1f442 { background-position: 32.5% 85% !important; } 535 | .emoji1f443 { background-position: 32.5% 100% !important; } 536 | .emoji1f444 { background-position: 35% 12.5% !important; } 537 | .emoji1f445 { background-position: 35% 15% !important; } 538 | .emoji1f446 { background-position: 35% 17.5% !important; } 539 | .emoji1f447 { background-position: 35% 32.5% !important; } 540 | .emoji1f448 { background-position: 35% 47.5% !important; } 541 | .emoji1f449 { background-position: 35% 62.5% !important; } 542 | .emoji1f44a { background-position: 35% 77.5% !important; } 543 | .emoji1f44b { background-position: 35% 92.5% !important; } 544 | .emoji1f44c { background-position: 37.5% 5% !important; } 545 | .emoji1f44d { background-position: 37.5% 20% !important; } 546 | .emoji1f44e { background-position: 37.5% 35% !important; } 547 | .emoji1f44f { background-position: 37.5% 50% !important; } 548 | .emoji1f450 { background-position: 37.5% 65% !important; } 549 | .emoji1f451 { background-position: 37.5% 80% !important; } 550 | .emoji1f452 { background-position: 37.5% 82.5% !important; } 551 | .emoji1f453 { background-position: 37.5% 85% !important; } 552 | .emoji1f454 { background-position: 37.5% 87.5% !important; } 553 | .emoji1f455 { background-position: 37.5% 90% !important; } 554 | .emoji1f456 { background-position: 37.5% 92.5% !important; } 555 | .emoji1f457 { background-position: 37.5% 95% !important; } 556 | .emoji1f458 { background-position: 37.5% 97.5% !important; } 557 | .emoji1f459 { background-position: 37.5% 100% !important; } 558 | .emoji1f45a { background-position: 40% 0% !important; } 559 | .emoji1f45b { background-position: 40% 2.5% !important; } 560 | .emoji1f45c { background-position: 40% 5% !important; } 561 | .emoji1f45d { background-position: 40% 7.5% !important; } 562 | .emoji1f45e { background-position: 40% 10% !important; } 563 | .emoji1f45f { background-position: 40% 12.5% !important; } 564 | .emoji1f460 { background-position: 40% 15% !important; } 565 | .emoji1f461 { background-position: 40% 17.5% !important; } 566 | .emoji1f462 { background-position: 40% 20% !important; } 567 | .emoji1f463 { background-position: 40% 22.5% !important; } 568 | .emoji1f464 { background-position: 40% 25% !important; } 569 | .emoji1f465 { background-position: 40% 27.5% !important; } 570 | .emoji1f466 { background-position: 40% 30% !important; } 571 | .emoji1f467 { background-position: 40% 45% !important; } 572 | .emoji1f468 { background-position: 40% 60% !important; } 573 | .emoji1f469 { background-position: 40% 75% !important; } 574 | .emoji1f46a { background-position: 40% 90% !important; } 575 | .emoji1f46b { background-position: 40% 92.5% !important; } 576 | .emoji1f46c { background-position: 40% 95% !important; } 577 | .emoji1f46d { background-position: 40% 97.5% !important; } 578 | .emoji1f46e { background-position: 40% 100% !important; } 579 | .emoji1f46f { background-position: 42.5% 12.5% !important; } 580 | .emoji1f470 { background-position: 42.5% 15% !important; } 581 | .emoji1f471 { background-position: 42.5% 30% !important; } 582 | .emoji1f472 { background-position: 42.5% 45% !important; } 583 | .emoji1f473 { background-position: 42.5% 60% !important; } 584 | .emoji1f474 { background-position: 42.5% 75% !important; } 585 | .emoji1f475 { background-position: 42.5% 90% !important; } 586 | .emoji1f476 { background-position: 45% 2.5% !important; } 587 | .emoji1f477 { background-position: 45% 17.5% !important; } 588 | .emoji1f478 { background-position: 45% 32.5% !important; } 589 | .emoji1f479 { background-position: 45% 47.5% !important; } 590 | .emoji1f47a { background-position: 45% 50% !important; } 591 | .emoji1f47b { background-position: 45% 52.5% !important; } 592 | .emoji1f47c { background-position: 45% 55% !important; } 593 | .emoji1f47d { background-position: 45% 70% !important; } 594 | .emoji1f47e { background-position: 45% 72.5% !important; } 595 | .emoji1f47f { background-position: 45% 75% !important; } 596 | .emoji1f480 { background-position: 45% 77.5% !important; } 597 | .emoji1f481 { background-position: 45% 80% !important; } 598 | .emoji1f482 { background-position: 45% 95% !important; } 599 | .emoji1f483 { background-position: 47.5% 7.5% !important; } 600 | .emoji1f484 { background-position: 47.5% 22.5% !important; } 601 | .emoji1f485 { background-position: 47.5% 25% !important; } 602 | .emoji1f486 { background-position: 47.5% 40% !important; } 603 | .emoji1f487 { background-position: 47.5% 55% !important; } 604 | .emoji1f488 { background-position: 47.5% 70% !important; } 605 | .emoji1f489 { background-position: 47.5% 72.5% !important; } 606 | .emoji1f48a { background-position: 47.5% 75% !important; } 607 | .emoji1f48b { background-position: 47.5% 77.5% !important; } 608 | .emoji1f48c { background-position: 47.5% 80% !important; } 609 | .emoji1f48d { background-position: 47.5% 82.5% !important; } 610 | .emoji1f48e { background-position: 47.5% 85% !important; } 611 | .emoji1f48f { background-position: 47.5% 87.5% !important; } 612 | .emoji1f490 { background-position: 47.5% 90% !important; } 613 | .emoji1f491 { background-position: 47.5% 92.5% !important; } 614 | .emoji1f492 { background-position: 47.5% 95% !important; } 615 | .emoji1f493 { background-position: 47.5% 97.5% !important; } 616 | .emoji1f494 { background-position: 47.5% 100% !important; } 617 | .emoji1f495 { background-position: 50% 0% !important; } 618 | .emoji1f496 { background-position: 50% 2.5% !important; } 619 | .emoji1f497 { background-position: 50% 5% !important; } 620 | .emoji1f498 { background-position: 50% 7.5% !important; } 621 | .emoji1f499 { background-position: 50% 10% !important; } 622 | .emoji1f49a { background-position: 50% 12.5% !important; } 623 | .emoji1f49b { background-position: 50% 15% !important; } 624 | .emoji1f49c { background-position: 50% 17.5% !important; } 625 | .emoji1f49d { background-position: 50% 20% !important; } 626 | .emoji1f49e { background-position: 50% 22.5% !important; } 627 | .emoji1f49f { background-position: 50% 25% !important; } 628 | .emoji1f4a0 { background-position: 50% 27.5% !important; } 629 | .emoji1f4a1 { background-position: 50% 30% !important; } 630 | .emoji1f4a2 { background-position: 50% 32.5% !important; } 631 | .emoji1f4a3 { background-position: 50% 35% !important; } 632 | .emoji1f4a4 { background-position: 50% 37.5% !important; } 633 | .emoji1f4a5 { background-position: 50% 40% !important; } 634 | .emoji1f4a6 { background-position: 50% 42.5% !important; } 635 | .emoji1f4a7 { background-position: 50% 45% !important; } 636 | .emoji1f4a8 { background-position: 50% 47.5% !important; } 637 | .emoji1f4a9 { background-position: 50% 50% !important; } 638 | .emoji1f4aa { background-position: 50% 52.5% !important; } 639 | .emoji1f4ab { background-position: 50% 67.5% !important; } 640 | .emoji1f4ac { background-position: 50% 70% !important; } 641 | .emoji1f4ad { background-position: 50% 72.5% !important; } 642 | .emoji1f4ae { background-position: 50% 75% !important; } 643 | .emoji1f4af { background-position: 50% 77.5% !important; } 644 | .emoji1f4b0 { background-position: 50% 80% !important; } 645 | .emoji1f4b1 { background-position: 50% 82.5% !important; } 646 | .emoji1f4b2 { background-position: 50% 85% !important; } 647 | .emoji1f4b3 { background-position: 50% 87.5% !important; } 648 | .emoji1f4b4 { background-position: 50% 90% !important; } 649 | .emoji1f4b5 { background-position: 50% 92.5% !important; } 650 | .emoji1f4b6 { background-position: 50% 95% !important; } 651 | .emoji1f4b7 { background-position: 50% 97.5% !important; } 652 | .emoji1f4b8 { background-position: 50% 100% !important; } 653 | .emoji1f4b9 { background-position: 52.5% 0% !important; } 654 | .emoji1f4ba { background-position: 52.5% 2.5% !important; } 655 | .emoji1f4bb { background-position: 52.5% 5% !important; } 656 | .emoji1f4bc { background-position: 52.5% 7.5% !important; } 657 | .emoji1f4bd { background-position: 52.5% 10% !important; } 658 | .emoji1f4be { background-position: 52.5% 12.5% !important; } 659 | .emoji1f4bf { background-position: 52.5% 15% !important; } 660 | .emoji1f4c0 { background-position: 52.5% 17.5% !important; } 661 | .emoji1f4c1 { background-position: 52.5% 20% !important; } 662 | .emoji1f4c2 { background-position: 52.5% 22.5% !important; } 663 | .emoji1f4c3 { background-position: 52.5% 25% !important; } 664 | .emoji1f4c4 { background-position: 52.5% 27.5% !important; } 665 | .emoji1f4c5 { background-position: 52.5% 30% !important; } 666 | .emoji1f4c6 { background-position: 52.5% 32.5% !important; } 667 | .emoji1f4c7 { background-position: 52.5% 35% !important; } 668 | .emoji1f4c8 { background-position: 52.5% 37.5% !important; } 669 | .emoji1f4c9 { background-position: 52.5% 40% !important; } 670 | .emoji1f4ca { background-position: 52.5% 42.5% !important; } 671 | .emoji1f4cb { background-position: 52.5% 45% !important; } 672 | .emoji1f4cc { background-position: 52.5% 47.5% !important; } 673 | .emoji1f4cd { background-position: 52.5% 50% !important; } 674 | .emoji1f4ce { background-position: 52.5% 52.5% !important; } 675 | .emoji1f4cf { background-position: 52.5% 55% !important; } 676 | .emoji1f4d0 { background-position: 52.5% 57.5% !important; } 677 | .emoji1f4d1 { background-position: 52.5% 60% !important; } 678 | .emoji1f4d2 { background-position: 52.5% 62.5% !important; } 679 | .emoji1f4d3 { background-position: 52.5% 65% !important; } 680 | .emoji1f4d4 { background-position: 52.5% 67.5% !important; } 681 | .emoji1f4d5 { background-position: 52.5% 70% !important; } 682 | .emoji1f4d6 { background-position: 52.5% 72.5% !important; } 683 | .emoji1f4d7 { background-position: 52.5% 75% !important; } 684 | .emoji1f4d8 { background-position: 52.5% 77.5% !important; } 685 | .emoji1f4d9 { background-position: 52.5% 80% !important; } 686 | .emoji1f4da { background-position: 52.5% 82.5% !important; } 687 | .emoji1f4db { background-position: 52.5% 85% !important; } 688 | .emoji1f4dc { background-position: 52.5% 87.5% !important; } 689 | .emoji1f4dd { background-position: 52.5% 90% !important; } 690 | .emoji1f4de { background-position: 52.5% 92.5% !important; } 691 | .emoji1f4df { background-position: 52.5% 95% !important; } 692 | .emoji1f4e0 { background-position: 52.5% 97.5% !important; } 693 | .emoji1f4e1 { background-position: 52.5% 100% !important; } 694 | .emoji1f4e2 { background-position: 55% 0% !important; } 695 | .emoji1f4e3 { background-position: 55% 2.5% !important; } 696 | .emoji1f4e4 { background-position: 55% 5% !important; } 697 | .emoji1f4e5 { background-position: 55% 7.5% !important; } 698 | .emoji1f4e6 { background-position: 55% 10% !important; } 699 | .emoji1f4e7 { background-position: 55% 12.5% !important; } 700 | .emoji1f4e8 { background-position: 55% 15% !important; } 701 | .emoji1f4e9 { background-position: 55% 17.5% !important; } 702 | .emoji1f4ea { background-position: 55% 20% !important; } 703 | .emoji1f4eb { background-position: 55% 22.5% !important; } 704 | .emoji1f4ec { background-position: 55% 25% !important; } 705 | .emoji1f4ed { background-position: 55% 27.5% !important; } 706 | .emoji1f4ee { background-position: 55% 30% !important; } 707 | .emoji1f4ef { background-position: 55% 32.5% !important; } 708 | .emoji1f4f0 { background-position: 55% 35% !important; } 709 | .emoji1f4f1 { background-position: 55% 37.5% !important; } 710 | .emoji1f4f2 { background-position: 55% 40% !important; } 711 | .emoji1f4f3 { background-position: 55% 42.5% !important; } 712 | .emoji1f4f4 { background-position: 55% 45% !important; } 713 | .emoji1f4f5 { background-position: 55% 47.5% !important; } 714 | .emoji1f4f6 { background-position: 55% 50% !important; } 715 | .emoji1f4f7 { background-position: 55% 52.5% !important; } 716 | .emoji1f4f8 { background-position: 55% 55% !important; } 717 | .emoji1f4f9 { background-position: 55% 57.5% !important; } 718 | .emoji1f4fa { background-position: 55% 60% !important; } 719 | .emoji1f4fb { background-position: 55% 62.5% !important; } 720 | .emoji1f4fc { background-position: 55% 65% !important; } 721 | .emoji1f4fd { background-position: 55% 67.5% !important; } 722 | .emoji1f4ff { background-position: 55% 70% !important; } 723 | .emoji1f500 { background-position: 55% 72.5% !important; } 724 | .emoji1f501 { background-position: 55% 75% !important; } 725 | .emoji1f502 { background-position: 55% 77.5% !important; } 726 | .emoji1f503 { background-position: 55% 80% !important; } 727 | .emoji1f504 { background-position: 55% 82.5% !important; } 728 | .emoji1f505 { background-position: 55% 85% !important; } 729 | .emoji1f506 { background-position: 55% 87.5% !important; } 730 | .emoji1f507 { background-position: 55% 90% !important; } 731 | .emoji1f508 { background-position: 55% 92.5% !important; } 732 | .emoji1f509 { background-position: 55% 95% !important; } 733 | .emoji1f50a { background-position: 55% 97.5% !important; } 734 | .emoji1f50b { background-position: 55% 100% !important; } 735 | .emoji1f50c { background-position: 57.5% 0% !important; } 736 | .emoji1f50d { background-position: 57.5% 2.5% !important; } 737 | .emoji1f50e { background-position: 57.5% 5% !important; } 738 | .emoji1f50f { background-position: 57.5% 7.5% !important; } 739 | .emoji1f510 { background-position: 57.5% 10% !important; } 740 | .emoji1f511 { background-position: 57.5% 12.5% !important; } 741 | .emoji1f512 { background-position: 57.5% 15% !important; } 742 | .emoji1f513 { background-position: 57.5% 17.5% !important; } 743 | .emoji1f514 { background-position: 57.5% 20% !important; } 744 | .emoji1f515 { background-position: 57.5% 22.5% !important; } 745 | .emoji1f516 { background-position: 57.5% 25% !important; } 746 | .emoji1f517 { background-position: 57.5% 27.5% !important; } 747 | .emoji1f518 { background-position: 57.5% 30% !important; } 748 | .emoji1f519 { background-position: 57.5% 32.5% !important; } 749 | .emoji1f51a { background-position: 57.5% 35% !important; } 750 | .emoji1f51b { background-position: 57.5% 37.5% !important; } 751 | .emoji1f51c { background-position: 57.5% 40% !important; } 752 | .emoji1f51d { background-position: 57.5% 42.5% !important; } 753 | .emoji1f51e { background-position: 57.5% 45% !important; } 754 | .emoji1f51f { background-position: 57.5% 47.5% !important; } 755 | .emoji1f520 { background-position: 57.5% 50% !important; } 756 | .emoji1f521 { background-position: 57.5% 52.5% !important; } 757 | .emoji1f522 { background-position: 57.5% 55% !important; } 758 | .emoji1f523 { background-position: 57.5% 57.5% !important; } 759 | .emoji1f524 { background-position: 57.5% 60% !important; } 760 | .emoji1f525 { background-position: 57.5% 62.5% !important; } 761 | .emoji1f526 { background-position: 57.5% 65% !important; } 762 | .emoji1f527 { background-position: 57.5% 67.5% !important; } 763 | .emoji1f528 { background-position: 57.5% 70% !important; } 764 | .emoji1f529 { background-position: 57.5% 72.5% !important; } 765 | .emoji1f52a { background-position: 57.5% 75% !important; } 766 | .emoji1f52b { background-position: 57.5% 77.5% !important; } 767 | .emoji1f52c { background-position: 57.5% 80% !important; } 768 | .emoji1f52d { background-position: 57.5% 82.5% !important; } 769 | .emoji1f52e { background-position: 57.5% 85% !important; } 770 | .emoji1f52f { background-position: 57.5% 87.5% !important; } 771 | .emoji1f530 { background-position: 57.5% 90% !important; } 772 | .emoji1f531 { background-position: 57.5% 92.5% !important; } 773 | .emoji1f532 { background-position: 57.5% 95% !important; } 774 | .emoji1f533 { background-position: 57.5% 97.5% !important; } 775 | .emoji1f534 { background-position: 57.5% 100% !important; } 776 | .emoji1f535 { background-position: 60% 0% !important; } 777 | .emoji1f536 { background-position: 60% 2.5% !important; } 778 | .emoji1f537 { background-position: 60% 5% !important; } 779 | .emoji1f538 { background-position: 60% 7.5% !important; } 780 | .emoji1f539 { background-position: 60% 10% !important; } 781 | .emoji1f53a { background-position: 60% 12.5% !important; } 782 | .emoji1f53b { background-position: 60% 15% !important; } 783 | .emoji1f53c { background-position: 60% 17.5% !important; } 784 | .emoji1f53d { background-position: 60% 20% !important; } 785 | .emoji1f549 { background-position: 60% 22.5% !important; } 786 | .emoji1f54a { background-position: 60% 25% !important; } 787 | .emoji1f54b { background-position: 60% 27.5% !important; } 788 | .emoji1f54c { background-position: 60% 30% !important; } 789 | .emoji1f54d { background-position: 60% 32.5% !important; } 790 | .emoji1f54e { background-position: 60% 35% !important; } 791 | .emoji1f550 { background-position: 60% 37.5% !important; } 792 | .emoji1f551 { background-position: 60% 40% !important; } 793 | .emoji1f552 { background-position: 60% 42.5% !important; } 794 | .emoji1f553 { background-position: 60% 45% !important; } 795 | .emoji1f554 { background-position: 60% 47.5% !important; } 796 | .emoji1f555 { background-position: 60% 50% !important; } 797 | .emoji1f556 { background-position: 60% 52.5% !important; } 798 | .emoji1f557 { background-position: 60% 55% !important; } 799 | .emoji1f558 { background-position: 60% 57.5% !important; } 800 | .emoji1f559 { background-position: 60% 60% !important; } 801 | .emoji1f55a { background-position: 60% 62.5% !important; } 802 | .emoji1f55b { background-position: 60% 65% !important; } 803 | .emoji1f55c { background-position: 60% 67.5% !important; } 804 | .emoji1f55d { background-position: 60% 70% !important; } 805 | .emoji1f55e { background-position: 60% 72.5% !important; } 806 | .emoji1f55f { background-position: 60% 75% !important; } 807 | .emoji1f560 { background-position: 60% 77.5% !important; } 808 | .emoji1f561 { background-position: 60% 80% !important; } 809 | .emoji1f562 { background-position: 60% 82.5% !important; } 810 | .emoji1f563 { background-position: 60% 85% !important; } 811 | .emoji1f564 { background-position: 60% 87.5% !important; } 812 | .emoji1f565 { background-position: 60% 90% !important; } 813 | .emoji1f566 { background-position: 60% 92.5% !important; } 814 | .emoji1f567 { background-position: 60% 95% !important; } 815 | .emoji1f56f { background-position: 60% 97.5% !important; } 816 | .emoji1f570 { background-position: 60% 100% !important; } 817 | .emoji1f573 { background-position: 62.5% 0% !important; } 818 | .emoji1f574 { background-position: 62.5% 2.5% !important; } 819 | .emoji1f575 { background-position: 62.5% 5% !important; } 820 | .emoji1f576 { background-position: 62.5% 7.5% !important; } 821 | .emoji1f577 { background-position: 62.5% 10% !important; } 822 | .emoji1f578 { background-position: 62.5% 12.5% !important; } 823 | .emoji1f579 { background-position: 62.5% 15% !important; } 824 | .emoji1f587 { background-position: 62.5% 17.5% !important; } 825 | .emoji1f58a { background-position: 62.5% 20% !important; } 826 | .emoji1f58b { background-position: 62.5% 22.5% !important; } 827 | .emoji1f58c { background-position: 62.5% 25% !important; } 828 | .emoji1f58d { background-position: 62.5% 27.5% !important; } 829 | .emoji1f590 { background-position: 62.5% 30% !important; } 830 | .emoji1f595 { background-position: 62.5% 45% !important; } 831 | .emoji1f596 { background-position: 62.5% 60% !important; } 832 | .emoji1f5a5 { background-position: 62.5% 75% !important; } 833 | .emoji1f5a8 { background-position: 62.5% 77.5% !important; } 834 | .emoji1f5b1 { background-position: 62.5% 80% !important; } 835 | .emoji1f5b2 { background-position: 62.5% 82.5% !important; } 836 | .emoji1f5bc { background-position: 62.5% 85% !important; } 837 | .emoji1f5c2 { background-position: 62.5% 87.5% !important; } 838 | .emoji1f5c3 { background-position: 62.5% 90% !important; } 839 | .emoji1f5c4 { background-position: 62.5% 92.5% !important; } 840 | .emoji1f5d1 { background-position: 62.5% 95% !important; } 841 | .emoji1f5d2 { background-position: 62.5% 97.5% !important; } 842 | .emoji1f5d3 { background-position: 62.5% 100% !important; } 843 | .emoji1f5dc { background-position: 65% 0% !important; } 844 | .emoji1f5dd { background-position: 65% 2.5% !important; } 845 | .emoji1f5de { background-position: 65% 5% !important; } 846 | .emoji1f5e1 { background-position: 65% 7.5% !important; } 847 | .emoji1f5e3 { background-position: 65% 10% !important; } 848 | .emoji1f5e8 { background-position: 65% 12.5% !important; } 849 | .emoji1f5ef { background-position: 65% 15% !important; } 850 | .emoji1f5f3 { background-position: 65% 17.5% !important; } 851 | .emoji1f5fa { background-position: 65% 20% !important; } 852 | .emoji1f5fb { background-position: 65% 22.5% !important; } 853 | .emoji1f5fc { background-position: 65% 25% !important; } 854 | .emoji1f5fd { background-position: 65% 27.5% !important; } 855 | .emoji1f5fe { background-position: 65% 30% !important; } 856 | .emoji1f5ff { background-position: 65% 32.5% !important; } 857 | .emoji1f600 { background-position: 65% 35% !important; } 858 | .emoji1f601 { background-position: 65% 37.5% !important; } 859 | .emoji1f602 { background-position: 65% 40% !important; } 860 | .emoji1f603 { background-position: 65% 42.5% !important; } 861 | .emoji1f604 { background-position: 65% 45% !important; } 862 | .emoji1f605 { background-position: 65% 47.5% !important; } 863 | .emoji1f606 { background-position: 65% 50% !important; } 864 | .emoji1f607 { background-position: 65% 52.5% !important; } 865 | .emoji1f608 { background-position: 65% 55% !important; } 866 | .emoji1f609 { background-position: 65% 57.5% !important; } 867 | .emoji1f60a { background-position: 65% 60% !important; } 868 | .emoji1f60b { background-position: 65% 62.5% !important; } 869 | .emoji1f60c { background-position: 65% 65% !important; } 870 | .emoji1f60d { background-position: 65% 67.5% !important; } 871 | .emoji1f60e { background-position: 65% 70% !important; } 872 | .emoji1f60f { background-position: 65% 72.5% !important; } 873 | .emoji1f610 { background-position: 65% 75% !important; } 874 | .emoji1f611 { background-position: 65% 77.5% !important; } 875 | .emoji1f612 { background-position: 65% 80% !important; } 876 | .emoji1f613 { background-position: 65% 82.5% !important; } 877 | .emoji1f614 { background-position: 65% 85% !important; } 878 | .emoji1f615 { background-position: 65% 87.5% !important; } 879 | .emoji1f616 { background-position: 65% 90% !important; } 880 | .emoji1f617 { background-position: 65% 92.5% !important; } 881 | .emoji1f618 { background-position: 65% 95% !important; } 882 | .emoji1f619 { background-position: 65% 97.5% !important; } 883 | .emoji1f61a { background-position: 65% 100% !important; } 884 | .emoji1f61b { background-position: 67.5% 0% !important; } 885 | .emoji1f61c { background-position: 67.5% 2.5% !important; } 886 | .emoji1f61d { background-position: 67.5% 5% !important; } 887 | .emoji1f61e { background-position: 67.5% 7.5% !important; } 888 | .emoji1f61f { background-position: 67.5% 10% !important; } 889 | .emoji1f620 { background-position: 67.5% 12.5% !important; } 890 | .emoji1f621 { background-position: 67.5% 15% !important; } 891 | .emoji1f622 { background-position: 67.5% 17.5% !important; } 892 | .emoji1f623 { background-position: 67.5% 20% !important; } 893 | .emoji1f624 { background-position: 67.5% 22.5% !important; } 894 | .emoji1f625 { background-position: 67.5% 25% !important; } 895 | .emoji1f626 { background-position: 67.5% 27.5% !important; } 896 | .emoji1f627 { background-position: 67.5% 30% !important; } 897 | .emoji1f628 { background-position: 67.5% 32.5% !important; } 898 | .emoji1f629 { background-position: 67.5% 35% !important; } 899 | .emoji1f62a { background-position: 67.5% 37.5% !important; } 900 | .emoji1f62b { background-position: 67.5% 40% !important; } 901 | .emoji1f62c { background-position: 67.5% 42.5% !important; } 902 | .emoji1f62d { background-position: 67.5% 45% !important; } 903 | .emoji1f62e { background-position: 67.5% 47.5% !important; } 904 | .emoji1f62f { background-position: 67.5% 50% !important; } 905 | .emoji1f630 { background-position: 67.5% 52.5% !important; } 906 | .emoji1f631 { background-position: 67.5% 55% !important; } 907 | .emoji1f632 { background-position: 67.5% 57.5% !important; } 908 | .emoji1f633 { background-position: 67.5% 60% !important; } 909 | .emoji1f634 { background-position: 67.5% 62.5% !important; } 910 | .emoji1f635 { background-position: 67.5% 65% !important; } 911 | .emoji1f636 { background-position: 67.5% 67.5% !important; } 912 | .emoji1f637 { background-position: 67.5% 70% !important; } 913 | .emoji1f638 { background-position: 67.5% 72.5% !important; } 914 | .emoji1f639 { background-position: 67.5% 75% !important; } 915 | .emoji1f63a { background-position: 67.5% 77.5% !important; } 916 | .emoji1f63b { background-position: 67.5% 80% !important; } 917 | .emoji1f63c { background-position: 67.5% 82.5% !important; } 918 | .emoji1f63d { background-position: 67.5% 85% !important; } 919 | .emoji1f63e { background-position: 67.5% 87.5% !important; } 920 | .emoji1f63f { background-position: 67.5% 90% !important; } 921 | .emoji1f640 { background-position: 67.5% 92.5% !important; } 922 | .emoji1f641 { background-position: 67.5% 95% !important; } 923 | .emoji1f642 { background-position: 67.5% 97.5% !important; } 924 | .emoji1f643 { background-position: 67.5% 100% !important; } 925 | .emoji1f644 { background-position: 70% 0% !important; } 926 | .emoji1f645 { background-position: 70% 2.5% !important; } 927 | .emoji1f646 { background-position: 70% 17.5% !important; } 928 | .emoji1f647 { background-position: 70% 32.5% !important; } 929 | .emoji1f648 { background-position: 70% 47.5% !important; } 930 | .emoji1f649 { background-position: 70% 50% !important; } 931 | .emoji1f64a { background-position: 70% 52.5% !important; } 932 | .emoji1f64b { background-position: 70% 55% !important; } 933 | .emoji1f64c { background-position: 70% 70% !important; } 934 | .emoji1f64d { background-position: 70% 85% !important; } 935 | .emoji1f64e { background-position: 70% 100% !important; } 936 | .emoji1f64f { background-position: 72.5% 12.5% !important; } 937 | .emoji1f680 { background-position: 72.5% 27.5% !important; } 938 | .emoji1f681 { background-position: 72.5% 30% !important; } 939 | .emoji1f682 { background-position: 72.5% 32.5% !important; } 940 | .emoji1f683 { background-position: 72.5% 35% !important; } 941 | .emoji1f684 { background-position: 72.5% 37.5% !important; } 942 | .emoji1f685 { background-position: 72.5% 40% !important; } 943 | .emoji1f686 { background-position: 72.5% 42.5% !important; } 944 | .emoji1f687 { background-position: 72.5% 45% !important; } 945 | .emoji1f688 { background-position: 72.5% 47.5% !important; } 946 | .emoji1f689 { background-position: 72.5% 50% !important; } 947 | .emoji1f68a { background-position: 72.5% 52.5% !important; } 948 | .emoji1f68b { background-position: 72.5% 55% !important; } 949 | .emoji1f68c { background-position: 72.5% 57.5% !important; } 950 | .emoji1f68d { background-position: 72.5% 60% !important; } 951 | .emoji1f68e { background-position: 72.5% 62.5% !important; } 952 | .emoji1f68f { background-position: 72.5% 65% !important; } 953 | .emoji1f690 { background-position: 72.5% 67.5% !important; } 954 | .emoji1f691 { background-position: 72.5% 70% !important; } 955 | .emoji1f692 { background-position: 72.5% 72.5% !important; } 956 | .emoji1f693 { background-position: 72.5% 75% !important; } 957 | .emoji1f694 { background-position: 72.5% 77.5% !important; } 958 | .emoji1f695 { background-position: 72.5% 80% !important; } 959 | .emoji1f696 { background-position: 72.5% 82.5% !important; } 960 | .emoji1f697 { background-position: 72.5% 85% !important; } 961 | .emoji1f698 { background-position: 72.5% 87.5% !important; } 962 | .emoji1f699 { background-position: 72.5% 90% !important; } 963 | .emoji1f69a { background-position: 72.5% 92.5% !important; } 964 | .emoji1f69b { background-position: 72.5% 95% !important; } 965 | .emoji1f69c { background-position: 72.5% 97.5% !important; } 966 | .emoji1f69d { background-position: 72.5% 100% !important; } 967 | .emoji1f69e { background-position: 75% 0% !important; } 968 | .emoji1f69f { background-position: 75% 2.5% !important; } 969 | .emoji1f6a0 { background-position: 75% 5% !important; } 970 | .emoji1f6a1 { background-position: 75% 7.5% !important; } 971 | .emoji1f6a2 { background-position: 75% 10% !important; } 972 | .emoji1f6a3 { background-position: 75% 12.5% !important; } 973 | .emoji1f6a4 { background-position: 75% 27.5% !important; } 974 | .emoji1f6a5 { background-position: 75% 30% !important; } 975 | .emoji1f6a6 { background-position: 75% 32.5% !important; } 976 | .emoji1f6a7 { background-position: 75% 35% !important; } 977 | .emoji1f6a8 { background-position: 75% 37.5% !important; } 978 | .emoji1f6a9 { background-position: 75% 40% !important; } 979 | .emoji1f6aa { background-position: 75% 42.5% !important; } 980 | .emoji1f6ab { background-position: 75% 45% !important; } 981 | .emoji1f6ac { background-position: 75% 47.5% !important; } 982 | .emoji1f6ad { background-position: 75% 50% !important; } 983 | .emoji1f6ae { background-position: 75% 52.5% !important; } 984 | .emoji1f6af { background-position: 75% 55% !important; } 985 | .emoji1f6b0 { background-position: 75% 57.5% !important; } 986 | .emoji1f6b1 { background-position: 75% 60% !important; } 987 | .emoji1f6b2 { background-position: 75% 62.5% !important; } 988 | .emoji1f6b3 { background-position: 75% 65% !important; } 989 | .emoji1f6b4 { background-position: 75% 67.5% !important; } 990 | .emoji1f6b5 { background-position: 75% 82.5% !important; } 991 | .emoji1f6b6 { background-position: 75% 97.5% !important; } 992 | .emoji1f6b7 { background-position: 77.5% 10% !important; } 993 | .emoji1f6b8 { background-position: 77.5% 12.5% !important; } 994 | .emoji1f6b9 { background-position: 77.5% 15% !important; } 995 | .emoji1f6ba { background-position: 77.5% 17.5% !important; } 996 | .emoji1f6bb { background-position: 77.5% 20% !important; } 997 | .emoji1f6bc { background-position: 77.5% 22.5% !important; } 998 | .emoji1f6bd { background-position: 77.5% 25% !important; } 999 | .emoji1f6be { background-position: 77.5% 27.5% !important; } 1000 | .emoji1f6bf { background-position: 77.5% 30% !important; } 1001 | .emoji1f6c0 { background-position: 77.5% 32.5% !important; } 1002 | .emoji1f6c1 { background-position: 77.5% 47.5% !important; } 1003 | .emoji1f6c2 { background-position: 77.5% 50% !important; } 1004 | .emoji1f6c3 { background-position: 77.5% 52.5% !important; } 1005 | .emoji1f6c4 { background-position: 77.5% 55% !important; } 1006 | .emoji1f6c5 { background-position: 77.5% 57.5% !important; } 1007 | .emoji1f6cb { background-position: 77.5% 60% !important; } 1008 | .emoji1f6cc { background-position: 77.5% 62.5% !important; } 1009 | .emoji1f6cd { background-position: 77.5% 65% !important; } 1010 | .emoji1f6ce { background-position: 77.5% 67.5% !important; } 1011 | .emoji1f6cf { background-position: 77.5% 70% !important; } 1012 | .emoji1f6d0 { background-position: 77.5% 72.5% !important; } 1013 | .emoji1f6e0 { background-position: 77.5% 75% !important; } 1014 | .emoji1f6e1 { background-position: 77.5% 77.5% !important; } 1015 | .emoji1f6e2 { background-position: 77.5% 80% !important; } 1016 | .emoji1f6e3 { background-position: 77.5% 82.5% !important; } 1017 | .emoji1f6e4 { background-position: 77.5% 85% !important; } 1018 | .emoji1f6e5 { background-position: 77.5% 87.5% !important; } 1019 | .emoji1f6e9 { background-position: 77.5% 90% !important; } 1020 | .emoji1f6eb { background-position: 77.5% 92.5% !important; } 1021 | .emoji1f6ec { background-position: 77.5% 95% !important; } 1022 | .emoji1f6f0 { background-position: 77.5% 97.5% !important; } 1023 | .emoji1f6f3 { background-position: 77.5% 100% !important; } 1024 | .emoji1f910 { background-position: 80% 0% !important; } 1025 | .emoji1f911 { background-position: 80% 2.5% !important; } 1026 | .emoji1f912 { background-position: 80% 5% !important; } 1027 | .emoji1f913 { background-position: 80% 7.5% !important; } 1028 | .emoji1f914 { background-position: 80% 10% !important; } 1029 | .emoji1f915 { background-position: 80% 12.5% !important; } 1030 | .emoji1f916 { background-position: 80% 15% !important; } 1031 | .emoji1f917 { background-position: 80% 17.5% !important; } 1032 | .emoji1f918 { background-position: 80% 20% !important; } 1033 | .emoji1f980 { background-position: 80% 35% !important; } 1034 | .emoji1f981 { background-position: 80% 37.5% !important; } 1035 | .emoji1f982 { background-position: 80% 40% !important; } 1036 | .emoji1f983 { background-position: 80% 42.5% !important; } 1037 | .emoji1f984 { background-position: 80% 45% !important; } 1038 | .emoji1f9c0 { background-position: 80% 47.5% !important; } 1039 | .emoji2320e3 { background-position: 80% 50% !important; } 1040 | .emoji2a20e3 { background-position: 80% 52.5% !important; } 1041 | .emoji3020e3 { background-position: 80% 55% !important; } 1042 | .emoji3120e3 { background-position: 80% 57.5% !important; } 1043 | .emoji3220e3 { background-position: 80% 60% !important; } 1044 | .emoji3320e3 { background-position: 80% 62.5% !important; } 1045 | .emoji3420e3 { background-position: 80% 65% !important; } 1046 | .emoji3520e3 { background-position: 80% 67.5% !important; } 1047 | .emoji3620e3 { background-position: 80% 70% !important; } 1048 | .emoji3720e3 { background-position: 80% 72.5% !important; } 1049 | .emoji3820e3 { background-position: 80% 75% !important; } 1050 | .emoji3920e3 { background-position: 80% 77.5% !important; } 1051 | .emoji1f1e61f1e8 { background-position: 80% 80% !important; } 1052 | .emoji1f1e61f1e9 { background-position: 80% 82.5% !important; } 1053 | .emoji1f1e61f1ea { background-position: 80% 85% !important; } 1054 | .emoji1f1e61f1eb { background-position: 80% 87.5% !important; } 1055 | .emoji1f1e61f1ec { background-position: 80% 90% !important; } 1056 | .emoji1f1e61f1ee { background-position: 80% 92.5% !important; } 1057 | .emoji1f1e61f1f1 { background-position: 80% 95% !important; } 1058 | .emoji1f1e61f1f2 { background-position: 80% 97.5% !important; } 1059 | .emoji1f1e61f1f4 { background-position: 80% 100% !important; } 1060 | .emoji1f1e61f1f6 { background-position: 82.5% 0% !important; } 1061 | .emoji1f1e61f1f7 { background-position: 82.5% 2.5% !important; } 1062 | .emoji1f1e61f1f8 { background-position: 82.5% 5% !important; } 1063 | .emoji1f1e61f1f9 { background-position: 82.5% 7.5% !important; } 1064 | .emoji1f1e61f1fa { background-position: 82.5% 10% !important; } 1065 | .emoji1f1e61f1fc { background-position: 82.5% 12.5% !important; } 1066 | .emoji1f1e61f1fd { background-position: 82.5% 15% !important; } 1067 | .emoji1f1e61f1ff { background-position: 82.5% 17.5% !important; } 1068 | .emoji1f1e71f1e6 { background-position: 82.5% 20% !important; } 1069 | .emoji1f1e71f1e7 { background-position: 82.5% 22.5% !important; } 1070 | .emoji1f1e71f1e9 { background-position: 82.5% 25% !important; } 1071 | .emoji1f1e71f1ea { background-position: 82.5% 27.5% !important; } 1072 | .emoji1f1e71f1eb { background-position: 82.5% 30% !important; } 1073 | .emoji1f1e71f1ec { background-position: 82.5% 32.5% !important; } 1074 | .emoji1f1e71f1ed { background-position: 82.5% 35% !important; } 1075 | .emoji1f1e71f1ee { background-position: 82.5% 37.5% !important; } 1076 | .emoji1f1e71f1ef { background-position: 82.5% 40% !important; } 1077 | .emoji1f1e71f1f1 { background-position: 82.5% 42.5% !important; } 1078 | .emoji1f1e71f1f2 { background-position: 82.5% 45% !important; } 1079 | .emoji1f1e71f1f3 { background-position: 82.5% 47.5% !important; } 1080 | .emoji1f1e71f1f4 { background-position: 82.5% 50% !important; } 1081 | .emoji1f1e71f1f6 { background-position: 82.5% 52.5% !important; } 1082 | .emoji1f1e71f1f7 { background-position: 82.5% 55% !important; } 1083 | .emoji1f1e71f1f8 { background-position: 82.5% 57.5% !important; } 1084 | .emoji1f1e71f1f9 { background-position: 82.5% 60% !important; } 1085 | .emoji1f1e71f1fb { background-position: 82.5% 62.5% !important; } 1086 | .emoji1f1e71f1fc { background-position: 82.5% 65% !important; } 1087 | .emoji1f1e71f1fe { background-position: 82.5% 67.5% !important; } 1088 | .emoji1f1e71f1ff { background-position: 82.5% 70% !important; } 1089 | .emoji1f1e81f1e6 { background-position: 82.5% 72.5% !important; } 1090 | .emoji1f1e81f1e8 { background-position: 82.5% 75% !important; } 1091 | .emoji1f1e81f1e9 { background-position: 82.5% 77.5% !important; } 1092 | .emoji1f1e81f1eb { background-position: 82.5% 80% !important; } 1093 | .emoji1f1e81f1ec { background-position: 82.5% 82.5% !important; } 1094 | .emoji1f1e81f1ed { background-position: 82.5% 85% !important; } 1095 | .emoji1f1e81f1ee { background-position: 82.5% 87.5% !important; } 1096 | .emoji1f1e81f1f0 { background-position: 82.5% 90% !important; } 1097 | .emoji1f1e81f1f1 { background-position: 82.5% 92.5% !important; } 1098 | .emoji1f1e81f1f2 { background-position: 82.5% 95% !important; } 1099 | .emoji1f1e81f1f3 { background-position: 82.5% 97.5% !important; } 1100 | .emoji1f1e81f1f4 { background-position: 82.5% 100% !important; } 1101 | .emoji1f1e81f1f5 { background-position: 85% 0% !important; } 1102 | .emoji1f1e81f1f7 { background-position: 85% 2.5% !important; } 1103 | .emoji1f1e81f1fa { background-position: 85% 5% !important; } 1104 | .emoji1f1e81f1fb { background-position: 85% 7.5% !important; } 1105 | .emoji1f1e81f1fc { background-position: 85% 10% !important; } 1106 | .emoji1f1e81f1fd { background-position: 85% 12.5% !important; } 1107 | .emoji1f1e81f1fe { background-position: 85% 15% !important; } 1108 | .emoji1f1e81f1ff { background-position: 85% 17.5% !important; } 1109 | .emoji1f1e91f1ea { background-position: 85% 20% !important; } 1110 | .emoji1f1e91f1ec { background-position: 85% 22.5% !important; } 1111 | .emoji1f1e91f1ef { background-position: 85% 25% !important; } 1112 | .emoji1f1e91f1f0 { background-position: 85% 27.5% !important; } 1113 | .emoji1f1e91f1f2 { background-position: 85% 30% !important; } 1114 | .emoji1f1e91f1f4 { background-position: 85% 32.5% !important; } 1115 | .emoji1f1e91f1ff { background-position: 85% 35% !important; } 1116 | .emoji1f1ea1f1e6 { background-position: 85% 37.5% !important; } 1117 | .emoji1f1ea1f1e8 { background-position: 85% 40% !important; } 1118 | .emoji1f1ea1f1ea { background-position: 85% 42.5% !important; } 1119 | .emoji1f1ea1f1ec { background-position: 85% 45% !important; } 1120 | .emoji1f1ea1f1ed { background-position: 85% 47.5% !important; } 1121 | .emoji1f1ea1f1f7 { background-position: 85% 50% !important; } 1122 | .emoji1f1ea1f1f8 { background-position: 85% 52.5% !important; } 1123 | .emoji1f1ea1f1f9 { background-position: 85% 55% !important; } 1124 | .emoji1f1ea1f1fa { background-position: 85% 57.5% !important; } 1125 | .emoji1f1eb1f1ee { background-position: 85% 60% !important; } 1126 | .emoji1f1eb1f1ef { background-position: 85% 62.5% !important; } 1127 | .emoji1f1eb1f1f0 { background-position: 85% 65% !important; } 1128 | .emoji1f1eb1f1f2 { background-position: 85% 67.5% !important; } 1129 | .emoji1f1eb1f1f4 { background-position: 85% 70% !important; } 1130 | .emoji1f1eb1f1f7 { background-position: 85% 72.5% !important; } 1131 | .emoji1f1ec1f1e6 { background-position: 85% 75% !important; } 1132 | .emoji1f1ec1f1e7 { background-position: 85% 77.5% !important; } 1133 | .emoji1f1ec1f1e9 { background-position: 85% 80% !important; } 1134 | .emoji1f1ec1f1ea { background-position: 85% 82.5% !important; } 1135 | .emoji1f1ec1f1eb { background-position: 85% 85% !important; } 1136 | .emoji1f1ec1f1ec { background-position: 85% 87.5% !important; } 1137 | .emoji1f1ec1f1ed { background-position: 85% 90% !important; } 1138 | .emoji1f1ec1f1ee { background-position: 85% 92.5% !important; } 1139 | .emoji1f1ec1f1f1 { background-position: 85% 95% !important; } 1140 | .emoji1f1ec1f1f2 { background-position: 85% 97.5% !important; } 1141 | .emoji1f1ec1f1f3 { background-position: 85% 100% !important; } 1142 | .emoji1f1ec1f1f5 { background-position: 87.5% 0% !important; } 1143 | .emoji1f1ec1f1f6 { background-position: 87.5% 2.5% !important; } 1144 | .emoji1f1ec1f1f7 { background-position: 87.5% 5% !important; } 1145 | .emoji1f1ec1f1f8 { background-position: 87.5% 7.5% !important; } 1146 | .emoji1f1ec1f1f9 { background-position: 87.5% 10% !important; } 1147 | .emoji1f1ec1f1fa { background-position: 87.5% 12.5% !important; } 1148 | .emoji1f1ec1f1fc { background-position: 87.5% 15% !important; } 1149 | .emoji1f1ec1f1fe { background-position: 87.5% 17.5% !important; } 1150 | .emoji1f1ed1f1f0 { background-position: 87.5% 20% !important; } 1151 | .emoji1f1ed1f1f2 { background-position: 87.5% 22.5% !important; } 1152 | .emoji1f1ed1f1f3 { background-position: 87.5% 25% !important; } 1153 | .emoji1f1ed1f1f7 { background-position: 87.5% 27.5% !important; } 1154 | .emoji1f1ed1f1f9 { background-position: 87.5% 30% !important; } 1155 | .emoji1f1ed1f1fa { background-position: 87.5% 32.5% !important; } 1156 | .emoji1f1ee1f1e8 { background-position: 87.5% 35% !important; } 1157 | .emoji1f1ee1f1e9 { background-position: 87.5% 37.5% !important; } 1158 | .emoji1f1ee1f1ea { background-position: 87.5% 40% !important; } 1159 | .emoji1f1ee1f1f1 { background-position: 87.5% 42.5% !important; } 1160 | .emoji1f1ee1f1f2 { background-position: 87.5% 45% !important; } 1161 | .emoji1f1ee1f1f3 { background-position: 87.5% 47.5% !important; } 1162 | .emoji1f1ee1f1f4 { background-position: 87.5% 50% !important; } 1163 | .emoji1f1ee1f1f6 { background-position: 87.5% 52.5% !important; } 1164 | .emoji1f1ee1f1f7 { background-position: 87.5% 55% !important; } 1165 | .emoji1f1ee1f1f8 { background-position: 87.5% 57.5% !important; } 1166 | .emoji1f1ee1f1f9 { background-position: 87.5% 60% !important; } 1167 | .emoji1f1ef1f1ea { background-position: 87.5% 62.5% !important; } 1168 | .emoji1f1ef1f1f2 { background-position: 87.5% 65% !important; } 1169 | .emoji1f1ef1f1f4 { background-position: 87.5% 67.5% !important; } 1170 | .emoji1f1ef1f1f5 { background-position: 87.5% 70% !important; } 1171 | .emoji1f1f01f1ea { background-position: 87.5% 72.5% !important; } 1172 | .emoji1f1f01f1ec { background-position: 87.5% 75% !important; } 1173 | .emoji1f1f01f1ed { background-position: 87.5% 77.5% !important; } 1174 | .emoji1f1f01f1ee { background-position: 87.5% 80% !important; } 1175 | .emoji1f1f01f1f2 { background-position: 87.5% 82.5% !important; } 1176 | .emoji1f1f01f1f3 { background-position: 87.5% 85% !important; } 1177 | .emoji1f1f01f1f5 { background-position: 87.5% 87.5% !important; } 1178 | .emoji1f1f01f1f7 { background-position: 87.5% 90% !important; } 1179 | .emoji1f1f01f1fc { background-position: 87.5% 92.5% !important; } 1180 | .emoji1f1f01f1fe { background-position: 87.5% 95% !important; } 1181 | .emoji1f1f01f1ff { background-position: 87.5% 97.5% !important; } 1182 | .emoji1f1f11f1e6 { background-position: 87.5% 100% !important; } 1183 | .emoji1f1f11f1e7 { background-position: 90% 0% !important; } 1184 | .emoji1f1f11f1e8 { background-position: 90% 2.5% !important; } 1185 | .emoji1f1f11f1ee { background-position: 90% 5% !important; } 1186 | .emoji1f1f11f1f0 { background-position: 90% 7.5% !important; } 1187 | .emoji1f1f11f1f7 { background-position: 90% 10% !important; } 1188 | .emoji1f1f11f1f8 { background-position: 90% 12.5% !important; } 1189 | .emoji1f1f11f1f9 { background-position: 90% 15% !important; } 1190 | .emoji1f1f11f1fa { background-position: 90% 17.5% !important; } 1191 | .emoji1f1f11f1fb { background-position: 90% 20% !important; } 1192 | .emoji1f1f11f1fe { background-position: 90% 22.5% !important; } 1193 | .emoji1f1f21f1e6 { background-position: 90% 25% !important; } 1194 | .emoji1f1f21f1e8 { background-position: 90% 27.5% !important; } 1195 | .emoji1f1f21f1e9 { background-position: 90% 30% !important; } 1196 | .emoji1f1f21f1ea { background-position: 90% 32.5% !important; } 1197 | .emoji1f1f21f1eb { background-position: 90% 35% !important; } 1198 | .emoji1f1f21f1ec { background-position: 90% 37.5% !important; } 1199 | .emoji1f1f21f1ed { background-position: 90% 40% !important; } 1200 | .emoji1f1f21f1f0 { background-position: 90% 42.5% !important; } 1201 | .emoji1f1f21f1f1 { background-position: 90% 45% !important; } 1202 | .emoji1f1f21f1f2 { background-position: 90% 47.5% !important; } 1203 | .emoji1f1f21f1f3 { background-position: 90% 50% !important; } 1204 | .emoji1f1f21f1f4 { background-position: 90% 52.5% !important; } 1205 | .emoji1f1f21f1f5 { background-position: 90% 55% !important; } 1206 | .emoji1f1f21f1f6 { background-position: 90% 57.5% !important; } 1207 | .emoji1f1f21f1f7 { background-position: 90% 60% !important; } 1208 | .emoji1f1f21f1f8 { background-position: 90% 62.5% !important; } 1209 | .emoji1f1f21f1f9 { background-position: 90% 65% !important; } 1210 | .emoji1f1f21f1fa { background-position: 90% 67.5% !important; } 1211 | .emoji1f1f21f1fb { background-position: 90% 70% !important; } 1212 | .emoji1f1f21f1fc { background-position: 90% 72.5% !important; } 1213 | .emoji1f1f21f1fd { background-position: 90% 75% !important; } 1214 | .emoji1f1f21f1fe { background-position: 90% 77.5% !important; } 1215 | .emoji1f1f21f1ff { background-position: 90% 80% !important; } 1216 | .emoji1f1f31f1e6 { background-position: 90% 82.5% !important; } 1217 | .emoji1f1f31f1e8 { background-position: 90% 85% !important; } 1218 | .emoji1f1f31f1ea { background-position: 90% 87.5% !important; } 1219 | .emoji1f1f31f1eb { background-position: 90% 90% !important; } 1220 | .emoji1f1f31f1ec { background-position: 90% 92.5% !important; } 1221 | .emoji1f1f31f1ee { background-position: 90% 95% !important; } 1222 | .emoji1f1f31f1f1 { background-position: 90% 97.5% !important; } 1223 | .emoji1f1f31f1f4 { background-position: 90% 100% !important; } 1224 | .emoji1f1f31f1f5 { background-position: 92.5% 0% !important; } 1225 | .emoji1f1f31f1f7 { background-position: 92.5% 2.5% !important; } 1226 | .emoji1f1f31f1fa { background-position: 92.5% 5% !important; } 1227 | .emoji1f1f31f1ff { background-position: 92.5% 7.5% !important; } 1228 | .emoji1f1f41f1f2 { background-position: 92.5% 10% !important; } 1229 | .emoji1f1f51f1e6 { background-position: 92.5% 12.5% !important; } 1230 | .emoji1f1f51f1ea { background-position: 92.5% 15% !important; } 1231 | .emoji1f1f51f1eb { background-position: 92.5% 17.5% !important; } 1232 | .emoji1f1f51f1ec { background-position: 92.5% 20% !important; } 1233 | .emoji1f1f51f1ed { background-position: 92.5% 22.5% !important; } 1234 | .emoji1f1f51f1f0 { background-position: 92.5% 25% !important; } 1235 | .emoji1f1f51f1f1 { background-position: 92.5% 27.5% !important; } 1236 | .emoji1f1f51f1f2 { background-position: 92.5% 30% !important; } 1237 | .emoji1f1f51f1f3 { background-position: 92.5% 32.5% !important; } 1238 | .emoji1f1f51f1f7 { background-position: 92.5% 35% !important; } 1239 | .emoji1f1f51f1f8 { background-position: 92.5% 37.5% !important; } 1240 | .emoji1f1f51f1f9 { background-position: 92.5% 40% !important; } 1241 | .emoji1f1f51f1fc { background-position: 92.5% 42.5% !important; } 1242 | .emoji1f1f51f1fe { background-position: 92.5% 45% !important; } 1243 | .emoji1f1f61f1e6 { background-position: 92.5% 47.5% !important; } 1244 | .emoji1f1f71f1ea { background-position: 92.5% 50% !important; } 1245 | .emoji1f1f71f1f4 { background-position: 92.5% 52.5% !important; } 1246 | .emoji1f1f71f1f8 { background-position: 92.5% 55% !important; } 1247 | .emoji1f1f71f1fa { background-position: 92.5% 57.5% !important; } 1248 | .emoji1f1f71f1fc { background-position: 92.5% 60% !important; } 1249 | .emoji1f1f81f1e6 { background-position: 92.5% 62.5% !important; } 1250 | .emoji1f1f81f1e7 { background-position: 92.5% 65% !important; } 1251 | .emoji1f1f81f1e8 { background-position: 92.5% 67.5% !important; } 1252 | .emoji1f1f81f1e9 { background-position: 92.5% 70% !important; } 1253 | .emoji1f1f81f1ea { background-position: 92.5% 72.5% !important; } 1254 | .emoji1f1f81f1ec { background-position: 92.5% 75% !important; } 1255 | .emoji1f1f81f1ed { background-position: 92.5% 77.5% !important; } 1256 | .emoji1f1f81f1ee { background-position: 92.5% 80% !important; } 1257 | .emoji1f1f81f1ef { background-position: 92.5% 82.5% !important; } 1258 | .emoji1f1f81f1f0 { background-position: 92.5% 85% !important; } 1259 | .emoji1f1f81f1f1 { background-position: 92.5% 87.5% !important; } 1260 | .emoji1f1f81f1f2 { background-position: 92.5% 90% !important; } 1261 | .emoji1f1f81f1f3 { background-position: 92.5% 92.5% !important; } 1262 | .emoji1f1f81f1f4 { background-position: 92.5% 95% !important; } 1263 | .emoji1f1f81f1f7 { background-position: 92.5% 97.5% !important; } 1264 | .emoji1f1f81f1f8 { background-position: 92.5% 100% !important; } 1265 | .emoji1f1f81f1f9 { background-position: 95% 0% !important; } 1266 | .emoji1f1f81f1fb { background-position: 95% 2.5% !important; } 1267 | .emoji1f1f81f1fd { background-position: 95% 5% !important; } 1268 | .emoji1f1f81f1fe { background-position: 95% 7.5% !important; } 1269 | .emoji1f1f81f1ff { background-position: 95% 10% !important; } 1270 | .emoji1f1f91f1e6 { background-position: 95% 12.5% !important; } 1271 | .emoji1f1f91f1e8 { background-position: 95% 15% !important; } 1272 | .emoji1f1f91f1e9 { background-position: 95% 17.5% !important; } 1273 | .emoji1f1f91f1eb { background-position: 95% 20% !important; } 1274 | .emoji1f1f91f1ec { background-position: 95% 22.5% !important; } 1275 | .emoji1f1f91f1ed { background-position: 95% 25% !important; } 1276 | .emoji1f1f91f1ef { background-position: 95% 27.5% !important; } 1277 | .emoji1f1f91f1f0 { background-position: 95% 30% !important; } 1278 | .emoji1f1f91f1f1 { background-position: 95% 32.5% !important; } 1279 | .emoji1f1f91f1f2 { background-position: 95% 35% !important; } 1280 | .emoji1f1f91f1f3 { background-position: 95% 37.5% !important; } 1281 | .emoji1f1f91f1f4 { background-position: 95% 40% !important; } 1282 | .emoji1f1f91f1f7 { background-position: 95% 42.5% !important; } 1283 | .emoji1f1f91f1f9 { background-position: 95% 45% !important; } 1284 | .emoji1f1f91f1fb { background-position: 95% 47.5% !important; } 1285 | .emoji1f1f91f1fc { background-position: 95% 50% !important; } 1286 | .emoji1f1f91f1ff { background-position: 95% 52.5% !important; } 1287 | .emoji1f1fa1f1e6 { background-position: 95% 55% !important; } 1288 | .emoji1f1fa1f1ec { background-position: 95% 57.5% !important; } 1289 | .emoji1f1fa1f1f2 { background-position: 95% 60% !important; } 1290 | .emoji1f1fa1f1f8 { background-position: 95% 62.5% !important; } 1291 | .emoji1f1fa1f1fe { background-position: 95% 65% !important; } 1292 | .emoji1f1fa1f1ff { background-position: 95% 67.5% !important; } 1293 | .emoji1f1fb1f1e6 { background-position: 95% 70% !important; } 1294 | .emoji1f1fb1f1e8 { background-position: 95% 72.5% !important; } 1295 | .emoji1f1fb1f1ea { background-position: 95% 75% !important; } 1296 | .emoji1f1fb1f1ec { background-position: 95% 77.5% !important; } 1297 | .emoji1f1fb1f1ee { background-position: 95% 80% !important; } 1298 | .emoji1f1fb1f1f3 { background-position: 95% 82.5% !important; } 1299 | .emoji1f1fb1f1fa { background-position: 95% 85% !important; } 1300 | .emoji1f1fc1f1eb { background-position: 95% 87.5% !important; } 1301 | .emoji1f1fc1f1f8 { background-position: 95% 90% !important; } 1302 | .emoji1f1fd1f1f0 { background-position: 95% 92.5% !important; } 1303 | .emoji1f1fe1f1ea { background-position: 95% 95% !important; } 1304 | .emoji1f1fe1f1f9 { background-position: 95% 97.5% !important; } 1305 | .emoji1f1ff1f1e6 { background-position: 95% 100% !important; } 1306 | .emoji1f1ff1f1f2 { background-position: 97.5% 0% !important; } 1307 | .emoji1f1ff1f1fc { background-position: 97.5% 2.5% !important; } 1308 | .emoji1f468200d1f468200d1f466 { background-position: 97.5% 5% !important; } 1309 | .emoji1f468200d1f468200d1f466200d1f466 { background-position: 97.5% 7.5% !important; } 1310 | .emoji1f468200d1f468200d1f467 { background-position: 97.5% 10% !important; } 1311 | .emoji1f468200d1f468200d1f467200d1f466 { background-position: 97.5% 12.5% !important; } 1312 | .emoji1f468200d1f468200d1f467200d1f467 { background-position: 97.5% 15% !important; } 1313 | .emoji1f468200d1f469200d1f466200d1f466 { background-position: 97.5% 17.5% !important; } 1314 | .emoji1f468200d1f469200d1f467 { background-position: 97.5% 20% !important; } 1315 | .emoji1f468200d1f469200d1f467200d1f466 { background-position: 97.5% 22.5% !important; } 1316 | .emoji1f468200d1f469200d1f467200d1f467 { background-position: 97.5% 25% !important; } 1317 | .emoji1f468200d2764fe0f200d1f468 { background-position: 97.5% 27.5% !important; } 1318 | .emoji1f468200d2764fe0f200d1f48b200d1f468 { background-position: 97.5% 30% !important; } 1319 | .emoji1f469200d1f469200d1f466 { background-position: 97.5% 32.5% !important; } 1320 | .emoji1f469200d1f469200d1f466200d1f466 { background-position: 97.5% 35% !important; } 1321 | .emoji1f469200d1f469200d1f467 { background-position: 97.5% 37.5% !important; } 1322 | .emoji1f469200d1f469200d1f467200d1f466 { background-position: 97.5% 40% !important; } 1323 | .emoji1f469200d1f469200d1f467200d1f467 { background-position: 97.5% 42.5% !important; } 1324 | .emoji1f469200d2764fe0f200d1f469 { background-position: 97.5% 45% !important; } 1325 | .emoji1f469200d2764fe0f200d1f48b200d1f469 { background-position: 97.5% 47.5% !important; } 1326 | -------------------------------------------------------------------------------- /lib/emoji.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/iamcal/php-emoji/95c8087933e4cd4d40026abe7d1c916878e82a87/lib/emoji.png -------------------------------------------------------------------------------- /test/test.php: -------------------------------------------------------------------------------- 1 | Unified"); 31 | is(emoji_kddi_to_unified($test_kddi), $test_unified, "KDDI -> Unified"); 32 | is(emoji_softbank_to_unified($test_iphone), $test_unified, "Softbank -> Unified"); 33 | is(emoji_google_to_unified($test_google), $test_unified, "Google -> Unified"); 34 | 35 | echo "#------------------\n"; 36 | 37 | is(emoji_unified_to_docomo($test_unified), $test_docomo, "Unified -> DoCoMo"); 38 | is(emoji_unified_to_kddi($test_unified), $test_kddi, "Unified -> KDDI"); 39 | is(emoji_unified_to_softbank($test_unified), $test_iphone, "Unified -> Softbank"); 40 | is(emoji_unified_to_google($test_unified), $test_google, "Unified -> Google"); 41 | 42 | echo "#------------------\n"; 43 | 44 | is(emoji_unified_to_html($test_unified), $test_html, "Unified -> HTML"); 45 | is(emoji_html_to_unified($test_html), $test_unified, "HTML -> Unified"); 46 | 47 | echo "#------------------\n"; 48 | 49 | 50 | # 51 | # some emoji (e-82C thru e-837 and others) use 2 codepoints in the 52 | # unified mode, but just one in phone modes. test that it works as 53 | # expected 54 | # 55 | 56 | $test_unified = "Hello ".utf8_bytes(0x36).utf8_bytes(0x20E3); 57 | $test_iphone = "Hello ".utf8_bytes(0xE221); 58 | $test_docomo = "Hello ".utf8_bytes(0xE6E7); 59 | $test_kddi = "Hello ".utf8_bytes(0xE527); 60 | $test_google = "Hello ".utf8_bytes(0xFE833); 61 | 62 | $test_html = "Hello "; 63 | 64 | 65 | is(emoji_docomo_to_unified($test_docomo), $test_unified, "DoCoMo -> Unified"); 66 | is(emoji_kddi_to_unified($test_kddi), $test_unified, "KDDI -> Unified"); 67 | is(emoji_softbank_to_unified($test_iphone), $test_unified, "Softbank -> Unified"); 68 | is(emoji_google_to_unified($test_google), $test_unified, "Google -> Unified"); 69 | 70 | echo "#------------------\n"; 71 | 72 | is(emoji_unified_to_docomo($test_unified), $test_docomo, "Unified -> DoCoMo"); 73 | is(emoji_unified_to_kddi($test_unified), $test_kddi, "Unified -> KDDI"); 74 | is(emoji_unified_to_softbank($test_unified), $test_iphone, "Unified -> Softbank"); 75 | is(emoji_unified_to_google($test_unified), $test_google, "Unified -> Google"); 76 | 77 | echo "#------------------\n"; 78 | 79 | is(emoji_unified_to_html($test_unified), $test_html, "Unified -> HTML"); 80 | is(emoji_html_to_unified($test_html), $test_unified, "HTML -> Unified"); 81 | 82 | echo "#------------------\n"; 83 | 84 | 85 | # 86 | # names are accessed by the unified codepoint (which makes it tricky for 2-codepoint unicode symbols) 87 | # 88 | 89 | is(emoji_get_name(utf8_bytes(0x2600)), 'BLACK SUN WITH RAYS', "name U+2600"); 90 | is(emoji_get_name(utf8_bytes(0x26EA)), 'CHURCH', "name U+26EA"); 91 | is(emoji_get_name(utf8_bytes(0x1F480)), 'SKULL', "name U+1F480"); 92 | is(emoji_get_name(utf8_bytes(0x1F450)), 'OPEN HANDS SIGN', "name U+1F450"); 93 | is(emoji_get_name(utf8_bytes(0x1F52B)), 'PISTOL', "name U+1F52B"); 94 | is(emoji_get_name(utf8_bytes(0x36).utf8_bytes(0x20E3)), 'KEYCAP 6', "name U+36 U+20E3"); 95 | 96 | echo "#------------------\n"; 97 | 98 | 99 | # 100 | # finding emoji works correctly 101 | # 102 | 103 | is(emoji_contains_emoji('test '.utf8_bytes(0x2600).' test'), true, "contains simple emoji"); 104 | is(emoji_contains_emoji('test '.utf8_bytes(0x36).utf8_bytes(0x20E3).' test'), true, "contains compound emoji"); 105 | is(emoji_contains_emoji('hello world'), false, "does not contain emoji"); 106 | 107 | 108 | echo "#------------------\n"; 109 | 110 | 111 | # 112 | # deal with modifiers correctly 113 | # 114 | 115 | is(emoji_unified_to_html("\xE2\x9D\xA4"), test_html('2764'), "no modifier"); 116 | is(emoji_unified_to_html("\xE2\x9D\xA4\xEF\xB8\x8F"), test_html('2764'), "image modifier"); 117 | is(emoji_unified_to_html("\xE2\x9D\xA4\xEF\xB8\x8E"), "\xE2\x9D\xA4\xEF\xB8\x8E", "text modifier"); 118 | 119 | 120 | 121 | # 122 | # exit badly if we didn't pass 123 | # 124 | 125 | exit($GLOBALS['failures'] ? 1 : 0); 126 | 127 | 128 | # 129 | # below here are the test helper functions 130 | # 131 | 132 | function is($got, $expected, $name){ 133 | 134 | $passed = ($got === $expected) ? 1 : 0; 135 | 136 | if ($passed){ 137 | echo "ok # $name\n"; 138 | }else{ 139 | echo "not ok # $name\n"; 140 | echo "# expected : ".byteify($expected)."\n"; 141 | echo "# got : ".byteify($got)."\n"; 142 | 143 | $GLOBALS['failures']++; 144 | } 145 | } 146 | 147 | function byteify($s){ 148 | $out = ''; 149 | for ($i=0; $i= 0x20 && $c <= 0x80){ 152 | $out .= chr($c); 153 | }else{ 154 | $out .= sprintf('0x%02x ', $c); 155 | } 156 | } 157 | return trim($out); 158 | } 159 | 160 | function utf8_bytes($cp){ 161 | 162 | if ($cp > 0x10000){ 163 | # 4 bytes 164 | return chr(0xF0 | (($cp & 0x1C0000) >> 18)). 165 | chr(0x80 | (($cp & 0x3F000) >> 12)). 166 | chr(0x80 | (($cp & 0xFC0) >> 6)). 167 | chr(0x80 | ($cp & 0x3F)); 168 | }else if ($cp > 0x800){ 169 | # 3 bytes 170 | return chr(0xE0 | (($cp & 0xF000) >> 12)). 171 | chr(0x80 | (($cp & 0xFC0) >> 6)). 172 | chr(0x80 | ($cp & 0x3F)); 173 | }else if ($cp > 0x80){ 174 | # 2 bytes 175 | return chr(0xC0 | (($cp & 0x7C0) >> 6)). 176 | chr(0x80 | ($cp & 0x3F)); 177 | }else{ 178 | # 1 byte 179 | return chr($cp); 180 | } 181 | } 182 | 183 | function test_html($codepoint){ 184 | return ""; 185 | } 186 | --------------------------------------------------------------------------------