From 2decee83e982fba9d17e805c6b58c6e6c472690e Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 26 Dec 2023 00:26:08 +0100 Subject: [PATCH 01/23] Switch euphoria.io (RIP) to euphoria.leet.nu euphoria.io is dead for good now, and euphoria.leet.nu is the blessed clone/fork that will take its place. May this crevice of the internet survive another day. --- CHANGELOG.md | 4 ++++ examples/testbot_manual.rs | 2 +- src/api.rs | 4 +++- src/bot/instance.rs | 2 +- src/emoji.rs | 2 +- src/emoji.txt | 8 ++++---- src/nick.rs | 6 +++--- 7 files changed, 17 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c605fe3..a1707bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,10 @@ Procedure when bumping the version number: ## Unreleased +### Changed +- **(breaking)** `bot::instance::ServerConfig::default` now points to `euphoria.leet.nu` +- Documentation now references `euphoria.leet.nu` instead of `euphoria.io` + ## v0.4.0 - 2023-05-14 ### Added diff --git a/examples/testbot_manual.rs b/examples/testbot_manual.rs index 8a7afe0..c059004 100644 --- a/examples/testbot_manual.rs +++ b/examples/testbot_manual.rs @@ -10,7 +10,7 @@ use euphoxide::conn::{Conn, ConnTx, State}; use time::OffsetDateTime; const TIMEOUT: Duration = Duration::from_secs(10); -const DOMAIN: &str = "euphoria.io"; +const DOMAIN: &str = "euphoria.leet.nu"; const ROOM: &str = "test"; const NICK: &str = "TestBot"; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; diff --git a/src/api.rs b/src/api.rs index 5923f47..d72b91c 100644 --- a/src/api.rs +++ b/src/api.rs @@ -1,4 +1,6 @@ -//! Models the euphoria API at . +//! Models the [euphoria API][0]. +//! +//! [0](https://github.com/CylonicRaider/heim/blob/master/doc/api.md) mod account_cmds; mod events; diff --git a/src/bot/instance.rs b/src/bot/instance.rs index 58b1e3e..0d00d4d 100644 --- a/src/bot/instance.rs +++ b/src/bot/instance.rs @@ -98,7 +98,7 @@ impl Default for ServerConfig { Self { timeout: Duration::from_secs(30), reconnect_delay: Duration::from_secs(30), - domain: "euphoria.io".to_string(), + domain: "euphoria.leet.nu".to_string(), cookies: Arc::new(Mutex::new(CookieJar::new())), } } diff --git a/src/emoji.rs b/src/emoji.rs index 5f42e5d..7a6182d 100644 --- a/src/emoji.rs +++ b/src/emoji.rs @@ -1,4 +1,4 @@ -//! All emoji the vanilla euphoria.io client knows. +//! All emoji the euphoria.io client knows. use std::borrow::Cow; use std::collections::HashMap; diff --git a/src/emoji.txt b/src/emoji.txt index 51230c4..3989f24 100644 --- a/src/emoji.txt +++ b/src/emoji.txt @@ -4,10 +4,10 @@ # also adds a few more emoji names without a unicode equivalent [4]. # # [0]: https://www.npmjs.com/package/emoji-annotation-to-unicode/v/0.2.4 -# [1]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L37-L39 -# [2]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L26 -# [3]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L23 -# [4]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L8-L22 +# [1]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L37-L39 +# [2]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L26 +# [3]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L23 +# [4]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L8-L22 # Any line that is empty or starts with # is ignored. diff --git a/src/nick.rs b/src/nick.rs index 4a11393..03ada70 100644 --- a/src/nick.rs +++ b/src/nick.rs @@ -15,7 +15,7 @@ fn hue_normalize(text: &str) -> String { /// A re-implementation of [euphoria's nick hue hashing algorithm][0]. /// -/// [0]: https://github.com/euphoria-io/heim/blob/master/client/lib/hueHash.js +/// [0]: https://github.com/CylonicRaider/heim/blob/master/client/lib/hueHash.js fn hue_hash(text: &str, offset: i64) -> u8 { let mut val = 0_i32; for bibyte in text.encode_utf16() { @@ -48,7 +48,7 @@ pub fn hue_without_removing_emoji(nick: &str) -> u8 { /// This is a reimplementation of [euphoria's nick hue hashing algorithm][0]. It /// should always return the same value as the official client's implementation. /// -/// [0]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/hueHash.js +/// [0]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/hueHash.js pub fn hue(emoji: &Emoji, nick: &str) -> u8 { hue_without_removing_emoji(&emoji.remove(nick)) } @@ -74,7 +74,7 @@ pub fn hue(emoji: &Emoji, nick: &str) -> u8 { /// property that's easier to implement, even though it may be incorrect in some /// edge cases. /// -/// [0]: https://github.com/euphoria-io/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/stores/chat.js#L14 +/// [0]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/stores/chat.js#L14 pub fn normalize(nick: &str) -> String { mention(nick) // Step 1 .nfkc() // Step 2 From 96743e26e29b8a1b90324dc559056f175a49726a Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 26 Dec 2023 13:52:19 +0100 Subject: [PATCH 02/23] Update emoji --- CHANGELOG.md | 1 + src/emoji.rs | 2 +- src/emoji.txt | 653 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 643 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a1707bf..a8d29e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ Procedure when bumping the version number: ### Changed - **(breaking)** `bot::instance::ServerConfig::default` now points to `euphoria.leet.nu` +- Updated set of emoji names - Documentation now references `euphoria.leet.nu` instead of `euphoria.io` ## v0.4.0 - 2023-05-14 diff --git a/src/emoji.rs b/src/emoji.rs index 7a6182d..72242df 100644 --- a/src/emoji.rs +++ b/src/emoji.rs @@ -1,4 +1,4 @@ -//! All emoji the euphoria.io client knows. +//! All emoji the euphoria.leet.nu client knows. use std::borrow::Cow; use std::collections::HashMap; diff --git a/src/emoji.txt b/src/emoji.txt index 3989f24..356a38e 100644 --- a/src/emoji.txt +++ b/src/emoji.txt @@ -1,13 +1,11 @@ -# The vanilla euphoria frontend uses version 0.2.4 of the npm package -# "emoji-annotation-to-unicode" [0]. It ignores all emoji set to null [1]. It -# removes the "iphone" emoji [2] and replaces it with the "mobile" emoji [3]. It -# also adds a few more emoji names without a unicode equivalent [4]. +# The vanilla euphoria frontend uses a fork of the npm package +# "emoji-annotation-to-unicode" [0]. It ignores all emoji set to null [1], +# though the fork does not include any such emoji. It also adds and removes a +# few custom emoji, some without unicode equivalent [2]. # -# [0]: https://www.npmjs.com/package/emoji-annotation-to-unicode/v/0.2.4 -# [1]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L37-L39 -# [2]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L26 -# [3]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L23 -# [4]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/emoji.js#L8-L22 +# [0]: https://github.com/CylonicRaider/emoji-annotation-to-unicode +# [1]: https://github.com/CylonicRaider/heim/blob/6d22aa7bfa42f2e7cb817ef9fe0df14c0906e4ac/client/lib/emoji.js#L42-L44 +# [2]: https://github.com/CylonicRaider/heim/blob/6d22aa7bfa42f2e7cb817ef9fe0df14c0906e4ac/client/lib/emoji.js#L6-L32 # Any line that is empty or starts with # is ignored. @@ -20,10 +18,20 @@ ## emoji-annotation-to-unicode ## ################################# +# This section of the file can be generated using the following bash command: +# +# curl https://raw.githubusercontent.com/CylonicRaider/emoji-annotation-to-unicode/master/emoji-annotation-to-unicode.js \ +# | sed 's/module.exports =//;s/};$/}/' \ +# | jq 'map_values(gsub("-"; " ")) | to_entries | map("\(.key) \(.value)") | sort | .[]' -r \ +# | sed 's/^iphone /# iphone /' + +1 1f44d -1 1f44e 100 1f4af 1234 1f522 +1st_place_medal 1f947 +2nd_place_medal 1f948 +3rd_place_medal 1f949 8ball 1f3b1 a 1f170 ab 1f18e @@ -31,19 +39,33 @@ abc 1f524 abcd 1f521 accept 1f251 aerial_tramway 1f6a1 +afghanistan 1f1e6 1f1eb airplane 2708 +aland_islands 1f1e6 1f1fd alarm_clock 23f0 +albania 1f1e6 1f1f1 +alembic 2697 +algeria 1f1e9 1f1ff alien 1f47d ambulance 1f691 +american_samoa 1f1e6 1f1f8 +amphora 1f3fa anchor 2693 +andorra 1f1e6 1f1e9 angel 1f47c anger 1f4a2 +angola 1f1e6 1f1f4 angry 1f620 +anguilla 1f1e6 1f1ee anguished 1f627 ant 1f41c +antarctica 1f1e6 1f1f6 +antigua_barbuda 1f1e6 1f1ec apple 1f34e aquarius 2652 +argentina 1f1e6 1f1f7 aries 2648 +armenia 1f1e6 1f1f2 arrow_backward 25c0 arrow_double_down 23ec arrow_double_up 23eb @@ -66,43 +88,77 @@ arrows_clockwise 1f503 arrows_counterclockwise 1f504 art 1f3a8 articulated_lorry 1f69b +artificial_satellite 1f6f0 +aruba 1f1e6 1f1fc +asterisk 002a 20e3 astonished 1f632 athletic_shoe 1f45f atm 1f3e7 +atom_symbol 269b +australia 1f1e6 1f1fa +austria 1f1e6 1f1f9 +avocado 1f951 +azerbaijan 1f1e6 1f1ff b 1f171 baby 1f476 baby_bottle 1f37c baby_chick 1f424 baby_symbol 1f6bc back 1f519 +bacon 1f953 +badminton 1f3f8 baggage_claim 1f6c4 +baguette_bread 1f956 +bahamas 1f1e7 1f1f8 +bahrain 1f1e7 1f1ed +balance_scale 2696 balloon 1f388 +ballot_box 1f5f3 ballot_box_with_check 2611 bamboo 1f38d banana 1f34c bangbang 203c +bangladesh 1f1e7 1f1e9 bank 1f3e6 bar_chart 1f4ca +barbados 1f1e7 1f1e7 barber 1f488 baseball 26be basketball 1f3c0 +basketball_man 26f9 +basketball_woman 26f9 2640 +bat 1f987 bath 1f6c0 bathtub 1f6c1 battery 1f50b +beach_umbrella 1f3d6 bear 1f43b +bed 1f6cf bee 1f41d beer 1f37a beers 1f37b beetle 1f41e beginner 1f530 +belarus 1f1e7 1f1fe +belgium 1f1e7 1f1ea +belize 1f1e7 1f1ff bell 1f514 +bellhop_bell 1f6ce +benin 1f1e7 1f1ef bento 1f371 +bermuda 1f1e7 1f1f2 +bhutan 1f1e7 1f1f9 bicyclist 1f6b4 bike 1f6b2 +biking_man 1f6b4 +biking_woman 1f6b4 2640 bikini 1f459 +biohazard 2623 bird 1f426 birthday 1f382 black_circle 26ab +black_flag 1f3f4 +black_heart 1f5a4 black_joker 1f0cf black_large_square 2b1b black_medium_small_square 25fe @@ -110,6 +166,8 @@ black_medium_square 25fc black_nib 2712 black_small_square 25aa black_square_button 1f532 +blonde_man 1f471 +blonde_woman 1f471 2640 blossom 1f33c blowfish 1f421 blue_book 1f4d8 @@ -118,6 +176,7 @@ blue_heart 1f499 blush 1f60a boar 1f417 boat 26f5 +bolivia 1f1e7 1f1f4 bomb 1f4a3 book 1f4d6 bookmark 1f516 @@ -125,58 +184,102 @@ bookmark_tabs 1f4d1 books 1f4da boom 1f4a5 boot 1f462 +bosnia_herzegovina 1f1e7 1f1e6 +botswana 1f1e7 1f1fc bouquet 1f490 bow 1f647 +bow_and_arrow 1f3f9 +bowing_man 1f647 +bowing_woman 1f647 2640 bowling 1f3b3 +boxing_glove 1f94a boy 1f466 +brazil 1f1e7 1f1f7 bread 1f35e bride_with_veil 1f470 bridge_at_night 1f309 briefcase 1f4bc +british_indian_ocean_territory 1f1ee 1f1f4 +british_virgin_islands 1f1fb 1f1ec broken_heart 1f494 +brunei 1f1e7 1f1f3 bug 1f41b +building_construction 1f3d7 bulb 1f4a1 +bulgaria 1f1e7 1f1ec bullettrain_front 1f685 bullettrain_side 1f684 +burkina_faso 1f1e7 1f1eb +burrito 1f32f +burundi 1f1e7 1f1ee bus 1f68c +business_suit_levitating 1f574 busstop 1f68f bust_in_silhouette 1f464 busts_in_silhouette 1f465 +butterfly 1f98b cactus 1f335 cake 1f370 calendar 1f4c6 +call_me_hand 1f919 calling 1f4f2 +cambodia 1f1f0 1f1ed camel 1f42b camera 1f4f7 +camera_flash 1f4f8 +cameroon 1f1e8 1f1f2 +camping 1f3d5 +canada 1f1e8 1f1e6 +canary_islands 1f1ee 1f1e8 cancer 264b +candle 1f56f candy 1f36c +canoe 1f6f6 +cape_verde 1f1e8 1f1fb capital_abcd 1f520 capricorn 2651 car 1f697 +card_file_box 1f5c3 card_index 1f4c7 +card_index_dividers 1f5c2 +caribbean_netherlands 1f1e7 1f1f6 carousel_horse 1f3a0 +carrot 1f955 cat 1f431 cat2 1f408 +cayman_islands 1f1f0 1f1fe cd 1f4bf +central_african_republic 1f1e8 1f1eb +chad 1f1f9 1f1e9 +chains 26d3 +champagne 1f37e chart 1f4b9 chart_with_downwards_trend 1f4c9 chart_with_upwards_trend 1f4c8 checkered_flag 1f3c1 +cheese 1f9c0 cherries 1f352 cherry_blossom 1f338 chestnut 1f330 chicken 1f414 children_crossing 1f6b8 +chile 1f1e8 1f1f1 +chipmunk 1f43f chocolate_bar 1f36b +christmas_island 1f1e8 1f1fd christmas_tree 1f384 church 26ea cinema 1f3a6 circus_tent 1f3aa city_sunrise 1f307 city_sunset 1f306 +cityscape 1f3d9 cl 1f191 +clamp 1f5dc clap 1f44f clapper 1f3ac +classical_building 1f3db +clinking_glasses 1f942 clipboard 1f4cb clock1 1f550 clock10 1f559 @@ -206,110 +309,215 @@ closed_book 1f4d5 closed_lock_with_key 1f510 closed_umbrella 1f302 cloud 2601 +cloud_with_lightning 1f329 +cloud_with_lightning_and_rain 26c8 +cloud_with_rain 1f327 +cloud_with_snow 1f328 +clown_face 1f921 clubs 2663 cn 1f1e8 1f1f3 cocktail 1f378 +cocos_islands 1f1e8 1f1e8 coffee 2615 +coffin 26b0 cold_sweat 1f630 collision 1f4a5 +colombia 1f1e8 1f1f4 +comet 2604 +comoros 1f1f0 1f1f2 computer 1f4bb +computer_mouse 1f5b1 confetti_ball 1f38a confounded 1f616 confused 1f615 +congo_brazzaville 1f1e8 1f1ec +congo_kinshasa 1f1e8 1f1e9 congratulations 3297 construction 1f6a7 construction_worker 1f477 +construction_worker_man 1f477 +construction_worker_woman 1f477 2640 +control_knobs 1f39b convenience_store 1f3ea +cook_islands 1f1e8 1f1f0 cookie 1f36a cool 1f192 cop 1f46e copyright 00a9 corn 1f33d +costa_rica 1f1e8 1f1f7 +cote_divoire 1f1e8 1f1ee +couch_and_lamp 1f6cb couple 1f46b couple_with_heart 1f491 -couplekiss 1f48f +couple_with_heart_man_man 1f468 2764 1f468 +couple_with_heart_woman_man 1f491 +couple_with_heart_woman_woman 1f469 2764 1f469 +couplekiss_man_man 1f468 2764 1f48b 1f468 +couplekiss_man_woman 1f48f +couplekiss_woman_woman 1f469 2764 1f48b 1f469 cow 1f42e cow2 1f404 +cowboy_hat_face 1f920 +crab 1f980 +crayon 1f58d credit_card 1f4b3 crescent_moon 1f319 +cricket 1f3cf +croatia 1f1ed 1f1f7 crocodile 1f40a +croissant 1f950 +crossed_fingers 1f91e crossed_flags 1f38c +crossed_swords 2694 crown 1f451 cry 1f622 crying_cat_face 1f63f crystal_ball 1f52e +cuba 1f1e8 1f1fa +cucumber 1f952 cupid 1f498 +curacao 1f1e8 1f1fc curly_loop 27b0 currency_exchange 1f4b1 curry 1f35b custard 1f36e customs 1f6c3 cyclone 1f300 +cyprus 1f1e8 1f1fe +czech_republic 1f1e8 1f1ff +dagger 1f5e1 dancer 1f483 dancers 1f46f +dancing_men 1f46f 2642 +dancing_women 1f46f dango 1f361 +dark_sunglasses 1f576 dart 1f3af dash 1f4a8 date 1f4c5 de 1f1e9 1f1ea deciduous_tree 1f333 +deer 1f98c +denmark 1f1e9 1f1f0 department_store 1f3ec +derelict_house 1f3da +desert 1f3dc +desert_island 1f3dd +desktop_computer 1f5a5 +detective 1f575 diamond_shape_with_a_dot_inside 1f4a0 diamonds 2666 disappointed 1f61e disappointed_relieved 1f625 dizzy 1f4ab dizzy_face 1f635 +djibouti 1f1e9 1f1ef do_not_litter 1f6af dog 1f436 dog2 1f415 dollar 1f4b5 dolls 1f38e dolphin 1f42c +dominica 1f1e9 1f1f2 +dominican_republic 1f1e9 1f1f4 door 1f6aa doughnut 1f369 +dove 1f54a dragon 1f409 dragon_face 1f432 dress 1f457 dromedary_camel 1f42a +drooling_face 1f924 droplet 1f4a7 +drum 1f941 +duck 1f986 dvd 1f4c0 e-mail 1f4e7 +eagle 1f985 ear 1f442 ear_of_rice 1f33e earth_africa 1f30d earth_americas 1f30e earth_asia 1f30f -egg 1f373 +ecuador 1f1ea 1f1e8 +egg 1f95a eggplant 1f346 +egypt 1f1ea 1f1ec eight 0038 20e3 eight_pointed_black_star 2734 eight_spoked_asterisk 2733 +el_salvador 1f1f8 1f1fb electric_plug 1f50c elephant 1f418 email 2709 end 1f51a envelope 2709 envelope_with_arrow 1f4e9 +equatorial_guinea 1f1ec 1f1f6 +eritrea 1f1ea 1f1f7 es 1f1ea 1f1f8 +estonia 1f1ea 1f1ea +ethiopia 1f1ea 1f1f9 +eu 1f1ea 1f1fa euro 1f4b6 european_castle 1f3f0 european_post_office 1f3e4 +european_union 1f1ea 1f1fa evergreen_tree 1f332 exclamation 2757 expressionless 1f611 +eye 1f441 +eye_speech_bubble 1f441 1f5e8 eyeglasses 1f453 eyes 1f440 +face_with_head_bandage 1f915 +face_with_thermometer 1f912 facepunch 1f44a factory 1f3ed +falkland_islands 1f1eb 1f1f0 fallen_leaf 1f342 family 1f46a +family_man_boy 1f468 1f466 +family_man_boy_boy 1f468 1f466 1f466 +family_man_girl 1f468 1f467 +family_man_girl_boy 1f468 1f467 1f466 +family_man_girl_girl 1f468 1f467 1f467 +family_man_man_boy 1f468 1f468 1f466 +family_man_man_boy_boy 1f468 1f468 1f466 1f466 +family_man_man_girl 1f468 1f468 1f467 +family_man_man_girl_boy 1f468 1f468 1f467 1f466 +family_man_man_girl_girl 1f468 1f468 1f467 1f467 +family_man_woman_boy 1f46a +family_man_woman_boy_boy 1f468 1f469 1f466 1f466 +family_man_woman_girl 1f468 1f469 1f467 +family_man_woman_girl_boy 1f468 1f469 1f467 1f466 +family_man_woman_girl_girl 1f468 1f469 1f467 1f467 +family_woman_boy 1f469 1f466 +family_woman_boy_boy 1f469 1f466 1f466 +family_woman_girl 1f469 1f467 +family_woman_girl_boy 1f469 1f467 1f466 +family_woman_girl_girl 1f469 1f467 1f467 +family_woman_woman_boy 1f469 1f469 1f466 +family_woman_woman_boy_boy 1f469 1f469 1f466 1f466 +family_woman_woman_girl 1f469 1f469 1f467 +family_woman_woman_girl_boy 1f469 1f469 1f467 1f466 +family_woman_woman_girl_girl 1f469 1f469 1f467 1f467 +faroe_islands 1f1eb 1f1f4 fast_forward 23e9 fax 1f4e0 fearful 1f628 feet 1f43e +female_detective 1f575 2640 ferris_wheel 1f3a1 +ferry 26f4 +field_hockey 1f3d1 +fiji 1f1eb 1f1ef +file_cabinet 1f5c4 file_folder 1f4c1 +film_projector 1f4fd +film_strip 1f39e +finland 1f1eb 1f1ee fire 1f525 fire_engine 1f692 fireworks 1f386 @@ -319,58 +527,106 @@ fish 1f41f fish_cake 1f365 fishing_pole_and_fish 1f3a3 fist 270a +fist_left 1f91b +fist_oncoming 1f44a +fist_raised 270a +fist_right 1f91c five 0035 20e3 flags 1f38f flashlight 1f526 +fleur_de_lis 269c +flight_arrival 1f6ec +flight_departure 1f6eb flipper 1f42c floppy_disk 1f4be flower_playing_cards 1f3b4 flushed 1f633 +fog 1f32b foggy 1f301 football 1f3c8 footprints 1f463 fork_and_knife 1f374 fountain 26f2 +fountain_pen 1f58b four 0034 20e3 four_leaf_clover 1f340 +fox_face 1f98a fr 1f1eb 1f1f7 +framed_picture 1f5bc free 1f193 +french_guiana 1f1ec 1f1eb +french_polynesia 1f1f5 1f1eb +french_southern_territories 1f1f9 1f1eb +fried_egg 1f373 fried_shrimp 1f364 fries 1f35f frog 1f438 frowning 1f626 +frowning_face 2639 +frowning_man 1f64d 2642 +frowning_woman 1f64d +fu 1f595 fuelpump 26fd full_moon 1f315 full_moon_with_face 1f31d +funeral_urn 26b1 +gabon 1f1ec 1f1e6 +gambia 1f1ec 1f1f2 game_die 1f3b2 gb 1f1ec 1f1e7 +gear 2699 gem 1f48e gemini 264a +georgia 1f1ec 1f1ea +ghana 1f1ec 1f1ed ghost 1f47b +gibraltar 1f1ec 1f1ee gift 1f381 gift_heart 1f49d girl 1f467 globe_with_meridians 1f310 +goal_net 1f945 goat 1f410 golf 26f3 +golfing_man 1f3cc +golfing_woman 1f3cc 2640 +gorilla 1f98d grapes 1f347 +greece 1f1ec 1f1f7 green_apple 1f34f green_book 1f4d7 green_heart 1f49a +green_salad 1f957 +greenland 1f1ec 1f1f1 +grenada 1f1ec 1f1e9 grey_exclamation 2755 grey_question 2754 grimacing 1f62c grin 1f601 grinning 1f600 +guadeloupe 1f1ec 1f1f5 +guam 1f1ec 1f1fa guardsman 1f482 +guardswoman 1f482 2640 +guatemala 1f1ec 1f1f9 +guernsey 1f1ec 1f1ec +guinea 1f1ec 1f1f3 +guinea_bissau 1f1ec 1f1fc guitar 1f3b8 gun 1f52b +guyana 1f1ec 1f1fe haircut 1f487 +haircut_man 1f487 2642 +haircut_woman 1f487 +haiti 1f1ed 1f1f9 hamburger 1f354 hammer 1f528 +hammer_and_pick 2692 +hammer_and_wrench 1f6e0 hamster 1f439 hand 270b handbag 1f45c +handshake 1f91d hankey 1f4a9 hash 0023 20e3 hatched_chick 1f425 @@ -388,6 +644,7 @@ heavy_check_mark 2714 heavy_division_sign 2797 heavy_dollar_sign 1f4b2 heavy_exclamation_mark 2757 +heavy_heart_exclamation 2763 heavy_minus_sign 2796 heavy_multiplication_x 2716 heavy_plus_sign 2795 @@ -397,62 +654,99 @@ hibiscus 1f33a high_brightness 1f506 high_heel 1f460 hocho 1f52a +hole 1f573 +honduras 1f1ed 1f1f3 honey_pot 1f36f honeybee 1f41d +hong_kong 1f1ed 1f1f0 horse 1f434 horse_racing 1f3c7 hospital 1f3e5 +hot_pepper 1f336 +hotdog 1f32d hotel 1f3e8 hotsprings 2668 hourglass 231b hourglass_flowing_sand 23f3 house 1f3e0 house_with_garden 1f3e1 +houses 1f3d8 +hugs 1f917 +hungary 1f1ed 1f1fa hushed 1f62f ice_cream 1f368 +ice_hockey 1f3d2 +ice_skate 26f8 icecream 1f366 +iceland 1f1ee 1f1f8 id 1f194 ideograph_advantage 1f250 imp 1f47f inbox_tray 1f4e5 incoming_envelope 1f4e8 +india 1f1ee 1f1f3 +indonesia 1f1ee 1f1e9 information_desk_person 1f481 information_source 2139 innocent 1f607 interrobang 2049 # iphone 1f4f1 +iran 1f1ee 1f1f7 +iraq 1f1ee 1f1f6 +ireland 1f1ee 1f1ea +isle_of_man 1f1ee 1f1f2 +israel 1f1ee 1f1f1 it 1f1ee 1f1f9 izakaya_lantern 1f3ee jack_o_lantern 1f383 +jamaica 1f1ef 1f1f2 japan 1f5fe japanese_castle 1f3ef japanese_goblin 1f47a japanese_ogre 1f479 jeans 1f456 +jersey 1f1ef 1f1ea +jordan 1f1ef 1f1f4 joy 1f602 joy_cat 1f639 +joystick 1f579 jp 1f1ef 1f1f5 +kaaba 1f54b +kazakhstan 1f1f0 1f1ff +kenya 1f1f0 1f1ea key 1f511 +keyboard 2328 keycap_ten 1f51f +kick_scooter 1f6f4 kimono 1f458 +kiribati 1f1f0 1f1ee kiss 1f48b kissing 1f617 kissing_cat 1f63d kissing_closed_eyes 1f61a kissing_heart 1f618 kissing_smiling_eyes 1f619 +kiwi_fruit 1f95d knife 1f52a koala 1f428 koko 1f201 +kosovo 1f1fd 1f1f0 kr 1f1f0 1f1f7 +kuwait 1f1f0 1f1fc +kyrgyzstan 1f1f0 1f1ec +label 1f3f7 lantern 1f3ee +laos 1f1f1 1f1e6 large_blue_circle 1f535 large_blue_diamond 1f537 large_orange_diamond 1f536 last_quarter_moon 1f317 last_quarter_moon_with_face 1f31c +latin_cross 271d +latvia 1f1f1 1f1fb laughing 1f606 leaves 1f343 +lebanon 1f1f1 1f1e7 ledger 1f4d2 left_luggage 1f6c5 left_right_arrow 2194 @@ -460,11 +754,19 @@ leftwards_arrow_with_hook 21a9 lemon 1f34b leo 264c leopard 1f406 +lesotho 1f1f1 1f1f8 +level_slider 1f39a +liberia 1f1f1 1f1f7 libra 264e +libya 1f1f1 1f1fe +liechtenstein 1f1f1 1f1ee light_rail 1f688 link 1f517 +lion 1f981 lips 1f444 lipstick 1f484 +lithuania 1f1f1 1f1f9 +lizard 1f98e lock 1f512 lock_with_ink_pen 1f50f lollipop 1f36d @@ -474,7 +776,12 @@ loudspeaker 1f4e2 love_hotel 1f3e9 love_letter 1f48c low_brightness 1f505 +luxembourg 1f1f1 1f1fa +lying_face 1f925 m 24c2 +macau 1f1f2 1f1f4 +macedonia 1f1f2 1f1f0 +madagascar 1f1f2 1f1ec mag 1f50d mag_right 1f50e mahjong 1f004 @@ -482,68 +789,159 @@ mailbox 1f4eb mailbox_closed 1f4ea mailbox_with_mail 1f4ec mailbox_with_no_mail 1f4ed +malawi 1f1f2 1f1fc +malaysia 1f1f2 1f1fe +maldives 1f1f2 1f1fb +male_detective 1f575 +mali 1f1f2 1f1f1 +malta 1f1f2 1f1f9 man 1f468 +man_artist 1f468 1f3a8 +man_astronaut 1f468 1f680 +man_cartwheeling 1f938 2642 +man_cook 1f468 1f373 +man_dancing 1f57a +man_facepalming 1f926 2642 +man_factory_worker 1f468 1f3ed +man_farmer 1f468 1f33e +man_firefighter 1f468 1f692 +man_health_worker 1f468 2695 +man_in_tuxedo 1f935 +man_judge 1f468 2696 +man_juggling 1f939 2642 +man_mechanic 1f468 1f527 +man_office_worker 1f468 1f4bc +man_pilot 1f468 2708 +man_playing_handball 1f93e 2642 +man_playing_water_polo 1f93d 2642 +man_scientist 1f468 1f52c +man_shrugging 1f937 2642 +man_singer 1f468 1f3a4 +man_student 1f468 1f393 +man_teacher 1f468 1f3eb +man_technologist 1f468 1f4bb man_with_gua_pi_mao 1f472 man_with_turban 1f473 +mandarin 1f34a mans_shoe 1f45e +mantelpiece_clock 1f570 maple_leaf 1f341 +marshall_islands 1f1f2 1f1ed +martial_arts_uniform 1f94b +martinique 1f1f2 1f1f6 mask 1f637 massage 1f486 +massage_man 1f486 2642 +massage_woman 1f486 +mauritania 1f1f2 1f1f7 +mauritius 1f1f2 1f1fa +mayotte 1f1fe 1f1f9 meat_on_bone 1f356 +medal_military 1f396 +medal_sports 1f3c5 mega 1f4e3 melon 1f348 memo 1f4dd +men_wrestling 1f93c 2642 +menorah 1f54e mens 1f6b9 +metal 1f918 metro 1f687 +mexico 1f1f2 1f1fd +micronesia 1f1eb 1f1f2 microphone 1f3a4 microscope 1f52c +middle_finger 1f595 +milk_glass 1f95b milky_way 1f30c minibus 1f690 minidisc 1f4bd mobile_phone_off 1f4f4 +moldova 1f1f2 1f1e9 +monaco 1f1f2 1f1e8 +money_mouth_face 1f911 money_with_wings 1f4b8 moneybag 1f4b0 +mongolia 1f1f2 1f1f3 monkey 1f412 monkey_face 1f435 monorail 1f69d +montenegro 1f1f2 1f1ea +montserrat 1f1f2 1f1f8 moon 1f314 +morocco 1f1f2 1f1e6 mortar_board 1f393 +mosque 1f54c +motor_boat 1f6e5 +motor_scooter 1f6f5 +motorcycle 1f3cd +motorway 1f6e3 mount_fuji 1f5fb +mountain 26f0 mountain_bicyclist 1f6b5 +mountain_biking_man 1f6b5 +mountain_biking_woman 1f6b5 2640 mountain_cableway 1f6a0 mountain_railway 1f69e +mountain_snow 1f3d4 mouse 1f42d mouse2 1f401 movie_camera 1f3a5 moyai 1f5ff +mozambique 1f1f2 1f1ff +mrs_claus 1f936 muscle 1f4aa mushroom 1f344 musical_keyboard 1f3b9 musical_note 1f3b5 musical_score 1f3bc mute 1f507 +myanmar 1f1f2 1f1f2 nail_care 1f485 name_badge 1f4db +namibia 1f1f3 1f1e6 +national_park 1f3de +nauru 1f1f3 1f1f7 +nauseated_face 1f922 necktie 1f454 negative_squared_cross_mark 274e +nepal 1f1f3 1f1f5 +nerd_face 1f913 +netherlands 1f1f3 1f1f1 neutral_face 1f610 new 1f195 +new_caledonia 1f1f3 1f1e8 new_moon 1f311 new_moon_with_face 1f31a +new_zealand 1f1f3 1f1ff newspaper 1f4f0 +newspaper_roll 1f5de +next_track_button 23ed ng 1f196 +ng_man 1f645 2642 +ng_woman 1f645 +nicaragua 1f1f3 1f1ee +niger 1f1f3 1f1ea +nigeria 1f1f3 1f1ec night_with_stars 1f303 nine 0039 20e3 +niue 1f1f3 1f1fa no_bell 1f515 no_bicycles 1f6b3 no_entry 26d4 no_entry_sign 1f6ab no_good 1f645 +no_good_man 1f645 2642 +no_good_woman 1f645 no_mobile_phones 1f4f5 no_mouth 1f636 no_pedestrians 1f6b7 no_smoking 1f6ad non-potable_water 1f6b1 +norfolk_island 1f1f3 1f1eb +north_korea 1f1f0 1f1f5 +northern_mariana_islands 1f1f2 1f1f5 +norway 1f1f3 1f1f4 nose 1f443 notebook 1f4d3 notebook_with_decorative_cover 1f4d4 @@ -555,11 +953,16 @@ ocean 1f30a octopus 1f419 oden 1f362 office 1f3e2 +oil_drum 1f6e2 ok 1f197 ok_hand 1f44c +ok_man 1f646 2642 ok_woman 1f646 +old_key 1f5dd older_man 1f474 older_woman 1f475 +om 1f549 +oman 1f1f4 1f1f2 on 1f51b oncoming_automobile 1f698 oncoming_bus 1f68d @@ -570,120 +973,193 @@ open_book 1f4d6 open_file_folder 1f4c2 open_hands 1f450 open_mouth 1f62e +open_umbrella 2602 ophiuchus 26ce +orange 1f34a orange_book 1f4d9 +orthodox_cross 2626 outbox_tray 1f4e4 +owl 1f989 ox 1f402 package 1f4e6 page_facing_up 1f4c4 page_with_curl 1f4c3 pager 1f4df +paintbrush 1f58c +pakistan 1f1f5 1f1f0 +palau 1f1f5 1f1fc +palestinian_territories 1f1f5 1f1f8 palm_tree 1f334 +panama 1f1f5 1f1e6 +pancakes 1f95e panda_face 1f43c paperclip 1f4ce +paperclips 1f587 +papua_new_guinea 1f1f5 1f1ec +paraguay 1f1f5 1f1fe +parasol_on_ground 26f1 parking 1f17f part_alternation_mark 303d partly_sunny 26c5 +passenger_ship 1f6f3 passport_control 1f6c2 +pause_button 23f8 paw_prints 1f43e +peace_symbol 262e peach 1f351 +peanuts 1f95c pear 1f350 +pen 1f58a pencil 1f4dd pencil2 270f penguin 1f427 pensive 1f614 performing_arts 1f3ad persevere 1f623 +person_fencing 1f93a person_frowning 1f64d person_with_blond_hair 1f471 person_with_pouting_face 1f64e +peru 1f1f5 1f1ea +philippines 1f1f5 1f1ed phone 260e +pick 26cf pig 1f437 pig2 1f416 pig_nose 1f43d pill 1f48a pineapple 1f34d +ping_pong 1f3d3 pisces 2653 +pitcairn_islands 1f1f5 1f1f3 pizza 1f355 +place_of_worship 1f6d0 +plate_with_cutlery 1f37d +play_or_pause_button 23ef point_down 1f447 point_left 1f448 point_right 1f449 point_up 261d point_up_2 1f446 +poland 1f1f5 1f1f1 police_car 1f693 +policeman 1f46e +policewoman 1f46e 2640 poodle 1f429 poop 1f4a9 +popcorn 1f37f +portugal 1f1f5 1f1f9 post_office 1f3e3 postal_horn 1f4ef postbox 1f4ee potable_water 1f6b0 +potato 1f954 pouch 1f45d poultry_leg 1f357 pound 1f4b7 +pout 1f621 pouting_cat 1f63e +pouting_man 1f64e 2642 +pouting_woman 1f64e pray 1f64f +prayer_beads 1f4ff +pregnant_woman 1f930 +previous_track_button 23ee +prince 1f934 princess 1f478 +printer 1f5a8 +puerto_rico 1f1f5 1f1f7 punch 1f44a purple_heart 1f49c purse 1f45b pushpin 1f4cc put_litter_in_its_place 1f6ae +qatar 1f1f6 1f1e6 question 2753 rabbit 1f430 rabbit2 1f407 racehorse 1f40e +racing_car 1f3ce radio 1f4fb radio_button 1f518 +radioactive 2622 rage 1f621 railway_car 1f683 +railway_track 1f6e4 rainbow 1f308 +rainbow_flag 1f3f3 1f308 +raised_back_of_hand 1f91a raised_hand 270b +raised_hand_with_fingers_splayed 1f590 raised_hands 1f64c raising_hand 1f64b +raising_hand_man 1f64b 2642 +raising_hand_woman 1f64b ram 1f40f ramen 1f35c rat 1f400 +record_button 23fa recycle 267b red_car 1f697 red_circle 1f534 registered 00ae relaxed 263a relieved 1f60c +reminder_ribbon 1f397 repeat 1f501 repeat_one 1f502 +rescue_worker_helmet 26d1 restroom 1f6bb +reunion 1f1f7 1f1ea revolving_hearts 1f49e rewind 23ea +rhinoceros 1f98f ribbon 1f380 rice 1f35a rice_ball 1f359 rice_cracker 1f358 rice_scene 1f391 +right_anger_bubble 1f5ef ring 1f48d +robot 1f916 rocket 1f680 +rofl 1f923 +roll_eyes 1f644 roller_coaster 1f3a2 +romania 1f1f7 1f1f4 rooster 1f413 rose 1f339 +rosette 1f3f5 rotating_light 1f6a8 round_pushpin 1f4cd rowboat 1f6a3 +rowing_man 1f6a3 +rowing_woman 1f6a3 2640 ru 1f1f7 1f1fa rugby_football 1f3c9 runner 1f3c3 running 1f3c3 +running_man 1f3c3 running_shirt_with_sash 1f3bd +running_woman 1f3c3 2640 +rwanda 1f1f7 1f1fc sa 1f202 sagittarius 2650 sailboat 26f5 sake 1f376 +samoa 1f1fc 1f1f8 +san_marino 1f1f8 1f1f2 sandal 1f461 santa 1f385 +sao_tome_principe 1f1f8 1f1f9 satellite 1f4e1 satisfied 1f606 +saudi_arabia 1f1f8 1f1e6 saxophone 1f3b7 school 1f3eb school_satchel 1f392 scissors 2702 +scorpion 1f982 scorpius 264f scream 1f631 scream_cat 1f640 @@ -692,23 +1168,46 @@ seat 1f4ba secret 3299 see_no_evil 1f648 seedling 1f331 +selfie 1f933 +senegal 1f1f8 1f1f3 +serbia 1f1f7 1f1f8 seven 0037 20e3 +seychelles 1f1f8 1f1e8 +shallow_pan_of_food 1f958 +shamrock 2618 +shark 1f988 shaved_ice 1f367 sheep 1f411 shell 1f41a +shield 1f6e1 +shinto_shrine 26e9 ship 1f6a2 shirt 1f455 shit 1f4a9 shoe 1f45e +shopping 1f6cd +shopping_cart 1f6d2 shower 1f6bf +shrimp 1f990 +sierra_leone 1f1f8 1f1f1 signal_strength 1f4f6 +singapore 1f1f8 1f1ec +sint_maarten 1f1f8 1f1fd six 0036 20e3 six_pointed_star 1f52f ski 1f3bf +skier 26f7 skull 1f480 +skull_and_crossbones 2620 sleeping 1f634 +sleeping_bed 1f6cc sleepy 1f62a +slightly_frowning_face 1f641 +slightly_smiling_face 1f642 slot_machine 1f3b0 +slovakia 1f1f8 1f1f0 +slovenia 1f1f8 1f1ee +small_airplane 1f6e9 small_blue_diamond 1f539 small_orange_diamond 1f538 small_red_triangle 1f53a @@ -723,14 +1222,21 @@ smirk_cat 1f63c smoking 1f6ac snail 1f40c snake 1f40d +sneezing_face 1f927 snowboarder 1f3c2 snowflake 2744 snowman 26c4 +snowman_with_snow 2603 sob 1f62d soccer 26bd +solomon_islands 1f1f8 1f1e7 +somalia 1f1f8 1f1f4 soon 1f51c sos 1f198 sound 1f509 +south_africa 1f1ff 1f1e6 +south_georgia_south_sandwich_islands 1f1ec 1f1f8 +south_sudan 1f1f8 1f1f8 space_invader 1f47e spades 2660 spaghetti 1f35d @@ -740,20 +1246,46 @@ sparkles 2728 sparkling_heart 1f496 speak_no_evil 1f64a speaker 1f508 +speaking_head 1f5e3 speech_balloon 1f4ac speedboat 1f6a4 +spider 1f577 +spider_web 1f578 +spiral_calendar 1f5d3 +spiral_notepad 1f5d2 +spoon 1f944 +squid 1f991 +sri_lanka 1f1f1 1f1f0 +st_barthelemy 1f1e7 1f1f1 +st_helena 1f1f8 1f1ed +st_kitts_nevis 1f1f0 1f1f3 +st_lucia 1f1f1 1f1e8 +st_pierre_miquelon 1f1f5 1f1f2 +st_vincent_grenadines 1f1fb 1f1e8 +stadium 1f3df star 2b50 star2 1f31f +star_and_crescent 262a +star_of_david 2721 stars 1f320 station 1f689 statue_of_liberty 1f5fd steam_locomotive 1f682 stew 1f372 +stop_button 23f9 +stop_sign 1f6d1 +stopwatch 23f1 straight_ruler 1f4cf strawberry 1f353 stuck_out_tongue 1f61b stuck_out_tongue_closed_eyes 1f61d stuck_out_tongue_winking_eye 1f61c +studio_microphone 1f399 +stuffed_flatbread 1f959 +sudan 1f1f8 1f1e9 +sun_behind_large_cloud 1f325 +sun_behind_rain_cloud 1f326 +sun_behind_small_cloud 1f324 sun_with_face 1f31e sunflower 1f33b sunglasses 1f60e @@ -761,18 +1293,32 @@ sunny 2600 sunrise 1f305 sunrise_over_mountains 1f304 surfer 1f3c4 +surfing_man 1f3c4 +surfing_woman 1f3c4 2640 +suriname 1f1f8 1f1f7 sushi 1f363 suspension_railway 1f69f +swaziland 1f1f8 1f1ff sweat 1f613 sweat_drops 1f4a6 sweat_smile 1f605 +sweden 1f1f8 1f1ea sweet_potato 1f360 swimmer 1f3ca +swimming_man 1f3ca +swimming_woman 1f3ca 2640 +switzerland 1f1e8 1f1ed symbols 1f523 +synagogue 1f54d +syria 1f1f8 1f1fe syringe 1f489 +taco 1f32e tada 1f389 +taiwan 1f1f9 1f1fc +tajikistan 1f1f9 1f1ef tanabata_tree 1f38b tangerine 1f34a +tanzania 1f1f9 1f1ff taurus 2649 taxi 1f695 tea 1f375 @@ -781,21 +1327,35 @@ telephone_receiver 1f4de telescope 1f52d tennis 1f3be tent 26fa +thailand 1f1f9 1f1ed +thermometer 1f321 +thinking 1f914 thought_balloon 1f4ad three 0033 20e3 thumbsdown 1f44e thumbsup 1f44d ticket 1f3ab +tickets 1f39f tiger 1f42f tiger2 1f405 +timer_clock 23f2 +timor_leste 1f1f9 1f1f1 +tipping_hand_man 1f481 2642 +tipping_hand_woman 1f481 tired_face 1f62b tm 2122 +togo 1f1f9 1f1ec toilet 1f6bd +tokelau 1f1f9 1f1f0 tokyo_tower 1f5fc tomato 1f345 +tonga 1f1f9 1f1f4 tongue 1f445 top 1f51d tophat 1f3a9 +tornado 1f32a +tr 1f1f9 1f1f7 +trackball 1f5b2 tractor 1f69c traffic_light 1f6a5 train 1f68b @@ -804,6 +1364,7 @@ tram 1f68a triangular_flag_on_post 1f6a9 triangular_ruler 1f4d0 trident 1f531 +trinidad_tobago 1f1f9 1f1f9 triumph 1f624 trolleybus 1f68e trophy 1f3c6 @@ -813,7 +1374,13 @@ truck 1f69a trumpet 1f3ba tshirt 1f455 tulip 1f337 +tumbler_glass 1f943 +tunisia 1f1f9 1f1f3 +turkey 1f983 +turkmenistan 1f1f9 1f1f2 +turks_caicos_islands 1f1f9 1f1e8 turtle 1f422 +tuvalu 1f1f9 1f1fb tv 1f4fa twisted_rightwards_arrows 1f500 two 0032 20e3 @@ -831,27 +1398,45 @@ u7121 1f21a u7533 1f238 u7981 1f232 u7a7a 1f233 +uganda 1f1fa 1f1ec uk 1f1ec 1f1e7 +ukraine 1f1fa 1f1e6 umbrella 2614 unamused 1f612 underage 1f51e +unicorn 1f984 +united_arab_emirates 1f1e6 1f1ea unlock 1f513 up 1f199 +upside_down_face 1f643 +uruguay 1f1fa 1f1fe us 1f1fa 1f1f8 +us_virgin_islands 1f1fb 1f1ee +uzbekistan 1f1fa 1f1ff v 270c +vanuatu 1f1fb 1f1fa +vatican_city 1f1fb 1f1e6 +venezuela 1f1fb 1f1ea vertical_traffic_light 1f6a6 vhs 1f4fc vibration_mode 1f4f3 video_camera 1f4f9 video_game 1f3ae +vietnam 1f1fb 1f1f3 violin 1f3bb virgo 264d volcano 1f30b +volleyball 1f3d0 vs 1f19a +vulcan_salute 1f596 walking 1f6b6 +walking_man 1f6b6 +walking_woman 1f6b6 2640 +wallis_futuna 1f1fc 1f1eb waning_crescent_moon 1f318 waning_gibbous_moon 1f316 warning 26a0 +wastebasket 1f5d1 watch 231a water_buffalo 1f403 watermelon 1f349 @@ -862,35 +1447,72 @@ waxing_gibbous_moon 1f314 wc 1f6be weary 1f629 wedding 1f492 +weight_lifting_man 1f3cb +weight_lifting_woman 1f3cb 2640 +western_sahara 1f1ea 1f1ed whale 1f433 whale2 1f40b +wheel_of_dharma 2638 wheelchair 267f white_check_mark 2705 white_circle 26aa +white_flag 1f3f3 white_flower 1f4ae white_large_square 2b1c white_medium_small_square 25fd white_medium_square 25fb white_small_square 25ab white_square_button 1f533 +wilted_flower 1f940 wind_chime 1f390 +wind_face 1f32c wine_glass 1f377 wink 1f609 wolf 1f43a woman 1f469 +woman_artist 1f469 1f3a8 +woman_astronaut 1f469 1f680 +woman_cartwheeling 1f938 2640 +woman_cook 1f469 1f373 +woman_facepalming 1f926 2640 +woman_factory_worker 1f469 1f3ed +woman_farmer 1f469 1f33e +woman_firefighter 1f469 1f692 +woman_health_worker 1f469 2695 +woman_judge 1f469 2696 +woman_juggling 1f939 2640 +woman_mechanic 1f469 1f527 +woman_office_worker 1f469 1f4bc +woman_pilot 1f469 2708 +woman_playing_handball 1f93e 2640 +woman_playing_water_polo 1f93d 2640 +woman_scientist 1f469 1f52c +woman_shrugging 1f937 2640 +woman_singer 1f469 1f3a4 +woman_student 1f469 1f393 +woman_teacher 1f469 1f3eb +woman_technologist 1f469 1f4bb +woman_with_turban 1f473 2640 womans_clothes 1f45a womans_hat 1f452 +women_wrestling 1f93c 2640 womens 1f6ba +world_map 1f5fa worried 1f61f wrench 1f527 +writing_hand 270d x 274c yellow_heart 1f49b +yemen 1f1fe 1f1ea yen 1f4b4 +yin_yang 262f yum 1f60b +zambia 1f1ff 1f1f2 zap 26a1 zero 0030 20e3 +zimbabwe 1f1ff 1f1fc +zipper_mouth_face 1f910 zzz 1f4a4 -simple_smile 1f642 ################## ## custom emoji ## @@ -912,3 +1534,10 @@ orange_heart bot greenduck mobile 1f4f1 +poop +sad 1f622 +sun 2600 +tumbleweed +tumbleweed2 +tumbleweed! +fjafjkldskf7jkfdj From 37934b3af858593e864b63d20c101da5c863bec2 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 27 Dec 2023 00:06:34 +0100 Subject: [PATCH 03/23] Format changelog with more whitespace --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a8d29e2..6cda9d9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). Procedure when bumping the version number: + 1. Update dependencies in a separate commit 2. Set version number in `Cargo.toml` 3. Add new section in this changelog @@ -14,6 +15,7 @@ Procedure when bumping the version number: ## Unreleased ### Changed + - **(breaking)** `bot::instance::ServerConfig::default` now points to `euphoria.leet.nu` - Updated set of emoji names - Documentation now references `euphoria.leet.nu` instead of `euphoria.io` @@ -21,6 +23,7 @@ Procedure when bumping the version number: ## v0.4.0 - 2023-05-14 ### Added + - `bot::botrulez::Uptime` now implements `bot::command::Command` - `bot::command::parse_prefix_initiated` - `bot::commands::Commands::fallthrough` @@ -28,6 +31,7 @@ Procedure when bumping the version number: - `conn::Error::ConnectionTimedOut` ### Changed + - **(breaking)** `bot::command::ClapCommand::execute` now returns a `Result` instead of a `Result<(), E>` - **(breaking)** `bot::command::Command::execute` now returns a `Result` instead of a `Result<(), E>` - **(breaking)** `bot::commands::Commands::handle_packet` now returns a `Result` instead of a `Result<(), E>` @@ -36,6 +40,7 @@ Procedure when bumping the version number: - `bot::instance::Instance` now implements `Clone` ### Fixed + - **(breaking)** Deserializing empty events and replies by turning unit structs into empty structs - `phone` and `mobile` emoji - Instances getting stuck in "Connecting" state @@ -44,16 +49,19 @@ Procedure when bumping the version number: ## v0.3.1 - 2023-02-26 ### Added + - `bot::botrulez::FullHelp` now implements `bot::command::Command` - `bot::botrulez::Ping` now implements `bot::command::Command` - `bot::botrulez::ShortHelp` now implements `bot::command::Command` - `bot::instances::Instances::is_from_known_instance` ### Changed + - Instances log to target `euphoxide::live::` - Instances stay connected if auth is required but no password is set ### Fixed + - `!uptime` minute count - Instance reconnecting after encountering a 404 (it now stops and logs an error) - Instance taking too long to stop when stopped during reconnect delay @@ -61,6 +69,7 @@ Procedure when bumping the version number: ## v0.3.0 - 2023-02-11 ### Added + - `bot` feature - `bot` module (enable the `bot` feature to use) - `Emoji` for finding, replacing and removing colon-delimited emoji in text @@ -73,20 +82,24 @@ Procedure when bumping the version number: - VSCode project settings ### Changed + - **(breaking)** `conn` module redesigned and rewritten - **(breaking)** `nick_hue` moved to `nick::hue_without_removing_emoji` - Renamed `testbot` example to `testbot_manual` ### Removed + - **(breaking)** `connect` (see `conn::Conn::connect`) - **(breaking)** `wrap` (see `conn::Conn::wrap`) ## v0.2.0 - 2022-12-10 ### Added + - `connect` ### Changed + - **(breaking)** Updated dependencies ## v0.1.0 - 2022-10-23 From 97fe80bca12f78f016852381dd5a7ecf959423ff Mon Sep 17 00:00:00 2001 From: Joscha Date: Tue, 26 Dec 2023 14:51:28 +0100 Subject: [PATCH 04/23] Update dependencies --- CHANGELOG.md | 2 ++ Cargo.toml | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6cda9d9..f74d681 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,8 @@ Procedure when bumping the version number: ### Changed - **(breaking)** `bot::instance::ServerConfig::default` now points to `euphoria.leet.nu` +- **(breaking)** Bumped `cookie` dependency from `0.17` to `0.18` +- **(breaking)** Bumped `tokio-tungstenite` dependency from `0.18` to `0.21` - Updated set of emoji names - Documentation now references `euphoria.leet.nu` instead of `euphoria.io` diff --git a/Cargo.toml b/Cargo.toml index 0015d88..45f5f62 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,27 +7,27 @@ edition = "2021" bot = ["dep:async-trait", "dep:clap", "dep:cookie"] [dependencies] -async-trait = { version = "0.1.68", optional = true } +async-trait = { version = "0.1.75", optional = true } caseless = "0.2.1" -cookie = { version = "0.17.0", optional = true } -futures-util = { version = "0.3.28", default-features = false, features = ["sink"] } -log = "0.4.17" -serde = { version = "1.0.163", features = ["derive"] } -serde_json = "1.0.96" -time = { version = "0.3.21", features = ["serde"] } -tokio = { version = "1.28.1", features = ["time", "sync", "macros", "rt"] } +cookie = { version = "0.18.0", optional = true } +futures-util = { version = "0.3.30", default-features = false, features = ["sink"] } +log = "0.4.20" +serde = { version = "1.0.193", features = ["derive"] } +serde_json = "1.0.108" +time = { version = "0.3.31", features = ["serde"] } +tokio = { version = "1.35.1", features = ["time", "sync", "macros", "rt"] } tokio-stream = "0.1.14" -tokio-tungstenite = { version = "0.18.0", features = ["rustls-tls-native-roots"] } +tokio-tungstenite = { version = "0.21.0", features = ["rustls-tls-native-roots"] } unicode-normalization = "0.1.22" [dependencies.clap] -version = "4.2.7" +version = "4.4.11" optional = true default-features = false features = ["std", "derive", "deprecated"] [dev-dependencies] # For example bot -tokio = { version = "1.28.1", features = ["rt-multi-thread"] } +tokio = { version = "1.35.1", features = ["rt-multi-thread"] } [[example]] name = "testbot_instance" From 276ff685127c4c392a2ab001f80f7a053e58746b Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 27 Dec 2023 00:10:15 +0100 Subject: [PATCH 05/23] Bump version to 0.5.0 --- CHANGELOG.md | 2 ++ Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f74d681..e8cb869 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ Procedure when bumping the version number: ## Unreleased +## v0.5.0 - 2023-12-27 + ### Changed - **(breaking)** `bot::instance::ServerConfig::default` now points to `euphoria.leet.nu` diff --git a/Cargo.toml b/Cargo.toml index 45f5f62..fc69f70 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "euphoxide" -version = "0.4.0" +version = "0.5.0" edition = "2021" [features] From 69a4a2c07f063396545c01ce82b88746572fa6c3 Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 20 May 2024 18:46:09 +0200 Subject: [PATCH 06/23] Update emoji The new set was organically sourced from free-range JSON: https://euphoria.leet.nu/static/emoji.json Since I'm loading emoji from JSON anyways, the corresponding function is also exposed. Clients may want to load the emoji list dynamically at runtime instead of using the built-in emoji. --- CHANGELOG.md | 8 + src/emoji.json | 3839 ++++++++++++++++++++++++++++++++++++++++++++++++ src/emoji.rs | 50 +- src/emoji.txt | 1543 ------------------- 4 files changed, 3881 insertions(+), 1559 deletions(-) create mode 100644 src/emoji.json delete mode 100644 src/emoji.txt diff --git a/CHANGELOG.md b/CHANGELOG.md index e8cb869..949de9f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,14 @@ Procedure when bumping the version number: ## Unreleased +### Added + +- `Emoji::load_from_json` + +### Changed + +- Updated set of emoji names + ## v0.5.0 - 2023-12-27 ### Changed diff --git a/src/emoji.json b/src/emoji.json new file mode 100644 index 0000000..e9f8068 --- /dev/null +++ b/src/emoji.json @@ -0,0 +1,3839 @@ +{ + "+1": "~plusone", + "-1": "~minusone", + "100": "1f4af", + "1234": "1f522", + "1st_place_medal": "1f947", + "2nd_place_medal": "1f948", + "3rd_place_medal": "1f949", + "8ball": "1f3b1", + "a": "1f170-fe0f", + "ab": "1f18e", + "abacus": "1f9ee", + "abc": "1f524", + "abcd": "1f521", + "accept": "1f251", + "accordion": "1fa97", + "adhesive_bandage": "1fa79", + "adult": "1f9d1", + "aerial_tramway": "1f6a1", + "afghanistan": "1f1e6-1f1eb", + "airplane": "2708-fe0f", + "aland_islands": "1f1e6-1f1fd", + "alarm_clock": "23f0", + "albania": "1f1e6-1f1f1", + "alembic": "2697-fe0f", + "algeria": "1f1e9-1f1ff", + "alien": "1f47d", + "ambulance": "1f691", + "american_samoa": "1f1e6-1f1f8", + "amphora": "1f3fa", + "anatomical_heart": "1fac0", + "anchor": "2693", + "andorra": "1f1e6-1f1e9", + "angel": "1f47c", + "anger": "1f4a2", + "angola": "1f1e6-1f1f4", + "angry": "1f620", + "anguilla": "1f1e6-1f1ee", + "anguished": "1f627", + "ant": "1f41c", + "antarctica": "1f1e6-1f1f6", + "antigua_barbuda": "1f1e6-1f1ec", + "apple": "1f34e", + "aquarius": "2652", + "argentina": "1f1e6-1f1f7", + "aries": "2648", + "armenia": "1f1e6-1f1f2", + "arrow_backward": "25c0-fe0f", + "arrow_double_down": "23ec", + "arrow_double_up": "23eb", + "arrow_down": "2b07-fe0f", + "arrow_down_small": "1f53d", + "arrow_forward": "25b6-fe0f", + "arrow_heading_down": "2935-fe0f", + "arrow_heading_up": "2934-fe0f", + "arrow_left": "2b05-fe0f", + "arrow_lower_left": "2199-fe0f", + "arrow_lower_right": "2198-fe0f", + "arrow_right": "27a1-fe0f", + "arrow_right_hook": "21aa-fe0f", + "arrow_up": "2b06-fe0f", + "arrow_up_down": "2195-fe0f", + "arrow_up_small": "1f53c", + "arrow_upper_left": "2196-fe0f", + "arrow_upper_right": "2197-fe0f", + "arrows_clockwise": "1f503", + "arrows_counterclockwise": "1f504", + "art": "1f3a8", + "articulated_lorry": "1f69b", + "artificial_satellite": "1f6f0-fe0f", + "artist": "1f9d1-200d-1f3a8", + "artist_dark_skin_tone": "1f9d1-1f3ff-200d-1f3a8", + "artist_light_skin_tone": "1f9d1-1f3fb-200d-1f3a8", + "artist_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3a8", + "artist_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3a8", + "artist_medium_skin_tone": "1f9d1-1f3fd-200d-1f3a8", + "aruba": "1f1e6-1f1fc", + "ascension_island": "1f1e6-1f1e8", + "asterisk": "2a-fe0f-20e3", + "astonished": "1f632", + "astronaut": "1f9d1-200d-1f680", + "astronaut_dark_skin_tone": "1f9d1-1f3ff-200d-1f680", + "astronaut_light_skin_tone": "1f9d1-1f3fb-200d-1f680", + "astronaut_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f680", + "astronaut_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f680", + "astronaut_medium_skin_tone": "1f9d1-1f3fd-200d-1f680", + "athletic_shoe": "1f45f", + "atm": "1f3e7", + "atom_symbol": "269b-fe0f", + "australia": "1f1e6-1f1fa", + "austria": "1f1e6-1f1f9", + "auto_rickshaw": "1f6fa", + "avocado": "1f951", + "axe": "1fa93", + "azerbaijan": "1f1e6-1f1ff", + "b": "1f171-fe0f", + "baby": "1f476", + "baby_angel_dark_skin_tone": "1f47c-1f3ff", + "baby_angel_light_skin_tone": "1f47c-1f3fb", + "baby_angel_medium-dark_skin_tone": "1f47c-1f3fe", + "baby_angel_medium-light_skin_tone": "1f47c-1f3fc", + "baby_angel_medium_skin_tone": "1f47c-1f3fd", + "baby_bottle": "1f37c", + "baby_chick": "1f424", + "baby_dark_skin_tone": "1f476-1f3ff", + "baby_light_skin_tone": "1f476-1f3fb", + "baby_medium-dark_skin_tone": "1f476-1f3fe", + "baby_medium-light_skin_tone": "1f476-1f3fc", + "baby_medium_skin_tone": "1f476-1f3fd", + "baby_symbol": "1f6bc", + "back": "1f519", + "backhand_index_pointing_down_dark_skin_tone": "1f447-1f3ff", + "backhand_index_pointing_down_light_skin_tone": "1f447-1f3fb", + "backhand_index_pointing_down_medium-dark_skin_tone": "1f447-1f3fe", + "backhand_index_pointing_down_medium-light_skin_tone": "1f447-1f3fc", + "backhand_index_pointing_down_medium_skin_tone": "1f447-1f3fd", + "backhand_index_pointing_left_dark_skin_tone": "1f448-1f3ff", + "backhand_index_pointing_left_light_skin_tone": "1f448-1f3fb", + "backhand_index_pointing_left_medium-dark_skin_tone": "1f448-1f3fe", + "backhand_index_pointing_left_medium-light_skin_tone": "1f448-1f3fc", + "backhand_index_pointing_left_medium_skin_tone": "1f448-1f3fd", + "backhand_index_pointing_right_dark_skin_tone": "1f449-1f3ff", + "backhand_index_pointing_right_light_skin_tone": "1f449-1f3fb", + "backhand_index_pointing_right_medium-dark_skin_tone": "1f449-1f3fe", + "backhand_index_pointing_right_medium-light_skin_tone": "1f449-1f3fc", + "backhand_index_pointing_right_medium_skin_tone": "1f449-1f3fd", + "backhand_index_pointing_up_dark_skin_tone": "1f446-1f3ff", + "backhand_index_pointing_up_light_skin_tone": "1f446-1f3fb", + "backhand_index_pointing_up_medium-dark_skin_tone": "1f446-1f3fe", + "backhand_index_pointing_up_medium-light_skin_tone": "1f446-1f3fc", + "backhand_index_pointing_up_medium_skin_tone": "1f446-1f3fd", + "bacon": "1f953", + "badger": "1f9a1", + "badminton": "1f3f8", + "bagel": "1f96f", + "baggage_claim": "1f6c4", + "baguette_bread": "1f956", + "bahamas": "1f1e7-1f1f8", + "bahrain": "1f1e7-1f1ed", + "balance_scale": "2696-fe0f", + "bald_man": "1f468-200d-1f9b2", + "bald_woman": "1f469-200d-1f9b2", + "ballet_shoes": "1fa70", + "balloon": "1f388", + "ballot_box": "1f5f3-fe0f", + "ballot_box_with_check": "2611-fe0f", + "bamboo": "1f38d", + "banana": "1f34c", + "bangbang": "203c-fe0f", + "bangladesh": "1f1e7-1f1e9", + "banjo": "1fa95", + "bank": "1f3e6", + "bar_chart": "1f4ca", + "barbados": "1f1e7-1f1e7", + "barber": "1f488", + "baseball": "26be", + "basket": "1f9fa", + "basketball": "1f3c0", + "basketball_man": "26f9-fe0f-200d-2642-fe0f", + "basketball_woman": "26f9-fe0f-200d-2640-fe0f", + "bat": "1f987", + "bath": "1f6c0", + "bathtub": "1f6c1", + "battery": "1f50b", + "beach_umbrella": "1f3d6-fe0f", + "beans": "1fad8", + "bear": "1f43b", + "bearded_person": "1f9d4", + "beaver": "1f9ab", + "bed": "1f6cf-fe0f", + "bee": "1f41d", + "beer": "1f37a", + "beers": "1f37b", + "beetle": "1fab2", + "beginner": "1f530", + "belarus": "1f1e7-1f1fe", + "belgium": "1f1e7-1f1ea", + "belize": "1f1e7-1f1ff", + "bell": "1f514", + "bell_pepper": "1fad1", + "bellhop_bell": "1f6ce-fe0f", + "benin": "1f1e7-1f1ef", + "bento": "1f371", + "bermuda": "1f1e7-1f1f2", + "beverage_box": "1f9c3", + "bhutan": "1f1e7-1f1f9", + "bicyclist": "1f6b4", + "bike": "1f6b2", + "biking_man": "1f6b4-200d-2642-fe0f", + "biking_woman": "1f6b4-200d-2640-fe0f", + "bikini": "1f459", + "billed_cap": "1f9e2", + "biohazard": "2623-fe0f", + "bird": "1f426", + "birthday": "1f382", + "bison": "1f9ac", + "biting_lip": "1fae6", + "black_bird": "1f426-200d-2b1b", + "black_cat": "1f408-200d-2b1b", + "black_circle": "26ab", + "black_flag": "1f3f4", + "black_heart": "1f5a4", + "black_joker": "1f0cf", + "black_large_square": "2b1b", + "black_medium_small_square": "25fe", + "black_medium_square": "25fc-fe0f", + "black_nib": "2712-fe0f", + "black_small_square": "25aa-fe0f", + "black_square_button": "1f532", + "blond_haired_man": "1f471-200d-2642-fe0f", + "blond_haired_person": "1f471", + "blond_haired_woman": "1f471-200d-2640-fe0f", + "blonde_woman": "1f471-200d-2640-fe0f", + "blossom": "1f33c", + "blowfish": "1f421", + "blue_book": "1f4d8", + "blue_car": "1f699", + "blue_heart": "1f499", + "blue_square": "1f7e6", + "blueberries": "1fad0", + "blush": "1f60a", + "boar": "1f417", + "boat": "26f5", + "bolivia": "1f1e7-1f1f4", + "bomb": "1f4a3", + "bone": "1f9b4", + "book": "1f4d6", + "bookmark": "1f516", + "bookmark_tabs": "1f4d1", + "books": "1f4da", + "boom": "1f4a5", + "boomerang": "1fa83", + "boot": "1f462", + "bosnia_herzegovina": "1f1e7-1f1e6", + "bot": "~bot", + "botswana": "1f1e7-1f1fc", + "bouncing_ball_man": "26f9-fe0f-200d-2642-fe0f", + "bouncing_ball_person": "26f9-fe0f", + "bouncing_ball_woman": "26f9-fe0f-200d-2640-fe0f", + "bouquet": "1f490", + "bouvet_island": "1f1e7-1f1fb", + "bow": "1f647", + "bow_and_arrow": "1f3f9", + "bowing_man": "1f647-200d-2642-fe0f", + "bowing_woman": "1f647-200d-2640-fe0f", + "bowl_with_spoon": "1f963", + "bowling": "1f3b3", + "boxing_glove": "1f94a", + "boy": "1f466", + "boy_dark_skin_tone": "1f466-1f3ff", + "boy_light_skin_tone": "1f466-1f3fb", + "boy_medium-dark_skin_tone": "1f466-1f3fe", + "boy_medium-light_skin_tone": "1f466-1f3fc", + "boy_medium_skin_tone": "1f466-1f3fd", + "brain": "1f9e0", + "brazil": "1f1e7-1f1f7", + "bread": "1f35e", + "breast-feeding_dark_skin_tone": "1f931-1f3ff", + "breast-feeding_light_skin_tone": "1f931-1f3fb", + "breast-feeding_medium-dark_skin_tone": "1f931-1f3fe", + "breast-feeding_medium-light_skin_tone": "1f931-1f3fc", + "breast-feeding_medium_skin_tone": "1f931-1f3fd", + "breast_feeding": "1f931", + "bricks": "1f9f1", + "bride_with_veil": "1f470-200d-2640-fe0f", + "bridge_at_night": "1f309", + "briefcase": "1f4bc", + "british_indian_ocean_territory": "1f1ee-1f1f4", + "british_virgin_islands": "1f1fb-1f1ec", + "broccoli": "1f966", + "broken_chain": "26d3-fe0f-200d-1f4a5", + "broken_heart": "1f494", + "bronze": "~bronze", + "bronze!?": "~bronze2", + "bronze?!": "~bronze2", + "broom": "1f9f9", + "brown_circle": "1f7e4", + "brown_heart": "1f90e", + "brown_mushroom": "1f344-200d-1f7eb", + "brown_square": "1f7eb", + "brunei": "1f1e7-1f1f3", + "bubble_tea": "1f9cb", + "bubbles": "1fae7", + "bucket": "1faa3", + "bug": "1f41b", + "building_construction": "1f3d7-fe0f", + "bulb": "1f4a1", + "bulgaria": "1f1e7-1f1ec", + "bullettrain_front": "1f685", + "bullettrain_side": "1f684", + "burkina_faso": "1f1e7-1f1eb", + "burrito": "1f32f", + "burundi": "1f1e7-1f1ee", + "bus": "1f68c", + "business_suit_levitating": "1f574-fe0f", + "busstop": "1f68f", + "bust_in_silhouette": "1f464", + "busts_in_silhouette": "1f465", + "butter": "1f9c8", + "butterfly": "1f98b", + "cactus": "1f335", + "cake": "1f370", + "calendar": "1f4c6", + "call_me_hand": "1f919", + "call_me_hand_dark_skin_tone": "1f919-1f3ff", + "call_me_hand_light_skin_tone": "1f919-1f3fb", + "call_me_hand_medium-dark_skin_tone": "1f919-1f3fe", + "call_me_hand_medium-light_skin_tone": "1f919-1f3fc", + "call_me_hand_medium_skin_tone": "1f919-1f3fd", + "calling": "1f4f2", + "cambodia": "1f1f0-1f1ed", + "camel": "1f42b", + "camera": "1f4f7", + "camera_flash": "1f4f8", + "cameroon": "1f1e8-1f1f2", + "camping": "1f3d5-fe0f", + "canada": "1f1e8-1f1e6", + "canary_islands": "1f1ee-1f1e8", + "cancer": "264b", + "candle": "1f56f-fe0f", + "candy": "1f36c", + "canned_food": "1f96b", + "canoe": "1f6f6", + "cape_verde": "1f1e8-1f1fb", + "capital_abcd": "1f520", + "capricorn": "2651", + "car": "1f697", + "card_file_box": "1f5c3-fe0f", + "card_index": "1f4c7", + "card_index_dividers": "1f5c2-fe0f", + "caribbean_netherlands": "1f1e7-1f1f6", + "carousel_horse": "1f3a0", + "carpentry_saw": "1fa9a", + "carrot": "1f955", + "cartwheeling": "1f938", + "cat": "1f431", + "cat2": "1f408", + "cayman_islands": "1f1f0-1f1fe", + "cd": "1f4bf", + "central_african_republic": "1f1e8-1f1eb", + "ceuta_melilla": "1f1ea-1f1e6", + "chad": "1f1f9-1f1e9", + "chains": "26d3-fe0f", + "chair": "1fa91", + "champagne": "1f37e", + "chart": "1f4b9", + "chart_with_downwards_trend": "1f4c9", + "chart_with_upwards_trend": "1f4c8", + "checkered_flag": "1f3c1", + "cheese": "1f9c0", + "cherries": "1f352", + "cherry_blossom": "1f338", + "chess_pawn": "265f-fe0f", + "chestnut": "1f330", + "chicken": "1f414", + "child": "1f9d2", + "child_dark_skin_tone": "1f9d2-1f3ff", + "child_light_skin_tone": "1f9d2-1f3fb", + "child_medium-dark_skin_tone": "1f9d2-1f3fe", + "child_medium-light_skin_tone": "1f9d2-1f3fc", + "child_medium_skin_tone": "1f9d2-1f3fd", + "children_crossing": "1f6b8", + "chile": "1f1e8-1f1f1", + "chipmunk": "1f43f-fe0f", + "chocolate_bar": "1f36b", + "chopsticks": "1f962", + "christmas_island": "1f1e8-1f1fd", + "christmas_tree": "1f384", + "chromakode": "~chromakode", + "church": "26ea", + "cinema": "1f3a6", + "circus_tent": "1f3aa", + "city_sunrise": "1f307", + "city_sunset": "1f306", + "cityscape": "1f3d9-fe0f", + "cl": "1f191", + "clamp": "1f5dc-fe0f", + "clap": "1f44f", + "clapper": "1f3ac", + "clapping_hands_dark_skin_tone": "1f44f-1f3ff", + "clapping_hands_light_skin_tone": "1f44f-1f3fb", + "clapping_hands_medium-dark_skin_tone": "1f44f-1f3fe", + "clapping_hands_medium-light_skin_tone": "1f44f-1f3fc", + "clapping_hands_medium_skin_tone": "1f44f-1f3fd", + "classical_building": "1f3db-fe0f", + "climbing": "1f9d7", + "climbing_man": "1f9d7-200d-2642-fe0f", + "climbing_woman": "1f9d7-200d-2640-fe0f", + "clinking_glasses": "1f942", + "clipboard": "1f4cb", + "clipperton_island": "1f1e8-1f1f5", + "clock1": "1f550", + "clock10": "1f559", + "clock1030": "1f565", + "clock11": "1f55a", + "clock1130": "1f566", + "clock12": "1f55b", + "clock1230": "1f567", + "clock130": "1f55c", + "clock2": "1f551", + "clock230": "1f55d", + "clock3": "1f552", + "clock330": "1f55e", + "clock4": "1f553", + "clock430": "1f55f", + "clock5": "1f554", + "clock530": "1f560", + "clock6": "1f555", + "clock630": "1f561", + "clock7": "1f556", + "clock730": "1f562", + "clock8": "1f557", + "clock830": "1f563", + "clock9": "1f558", + "clock930": "1f564", + "closed_book": "1f4d5", + "closed_lock_with_key": "1f510", + "closed_umbrella": "1f302", + "cloud": "2601-fe0f", + "cloud_with_lightning": "1f329-fe0f", + "cloud_with_lightning_and_rain": "26c8-fe0f", + "cloud_with_rain": "1f327-fe0f", + "cloud_with_snow": "1f328-fe0f", + "clown_face": "1f921", + "clubs": "2663-fe0f", + "cn": "1f1e8-1f1f3", + "coat": "1f9e5", + "cockroach": "1fab3", + "cocktail": "1f378", + "coconut": "1f965", + "cocos_islands": "1f1e8-1f1e8", + "coffee": "2615", + "coffin": "26b0-fe0f", + "coin": "1fa99", + "cold_face": "1f976", + "cold_sweat": "1f630", + "collision": "1f4a5", + "colombia": "1f1e8-1f1f4", + "comet": "2604-fe0f", + "comoros": "1f1f0-1f1f2", + "compass": "1f9ed", + "computer": "1f4bb", + "computer_mouse": "1f5b1-fe0f", + "confetti_ball": "1f38a", + "confounded": "1f616", + "confused": "1f615", + "congo_brazzaville": "1f1e8-1f1ec", + "congo_kinshasa": "1f1e8-1f1e9", + "congratulations": "3297-fe0f", + "construction": "1f6a7", + "construction_worker": "1f477", + "construction_worker_dark_skin_tone": "1f477-1f3ff", + "construction_worker_light_skin_tone": "1f477-1f3fb", + "construction_worker_man": "1f477-200d-2642-fe0f", + "construction_worker_medium-dark_skin_tone": "1f477-1f3fe", + "construction_worker_medium-light_skin_tone": "1f477-1f3fc", + "construction_worker_medium_skin_tone": "1f477-1f3fd", + "construction_worker_woman": "1f477-200d-2640-fe0f", + "control_knobs": "1f39b-fe0f", + "convenience_store": "1f3ea", + "cook": "1f9d1-200d-1f373", + "cook_dark_skin_tone": "1f9d1-1f3ff-200d-1f373", + "cook_islands": "1f1e8-1f1f0", + "cook_light_skin_tone": "1f9d1-1f3fb-200d-1f373", + "cook_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f373", + "cook_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f373", + "cook_medium_skin_tone": "1f9d1-1f3fd-200d-1f373", + "cookie": "1f36a", + "cool": "1f192", + "cop": "1f46e", + "copyright": "a9-fe0f", + "coral": "1fab8", + "corn": "1f33d", + "costa_rica": "1f1e8-1f1f7", + "cote_divoire": "1f1e8-1f1ee", + "couch_and_lamp": "1f6cb-fe0f", + "couple": "1f46b", + "couple_with_heart": "1f491", + "couple_with_heart_dark_skin_tone": "1f491-1f3ff", + "couple_with_heart_light_skin_tone": "1f491-1f3fb", + "couple_with_heart_man_man": "1f468-200d-2764-fe0f-200d-1f468", + "couple_with_heart_man_man_dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_man_man_dark_skin_tone_light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_man_man_dark_skin_tone_medium-dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_man_man_dark_skin_tone_medium-light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_man_man_dark_skin_tone_medium_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_man_man_light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_man_man_light_skin_tone_dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_man_man_light_skin_tone_medium-dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_man_man_light_skin_tone_medium-light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_man_man_light_skin_tone_medium_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_man_man_medium-dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_man_man_medium-dark_skin_tone_dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_man_man_medium-dark_skin_tone_light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_man_man_medium-dark_skin_tone_medium-light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_man_man_medium-dark_skin_tone_medium_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_man_man_medium-light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_man_man_medium-light_skin_tone_dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_man_man_medium-light_skin_tone_light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_man_man_medium-light_skin_tone_medium-dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_man_man_medium-light_skin_tone_medium_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_man_man_medium_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_man_man_medium_skin_tone_dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_man_man_medium_skin_tone_light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_man_man_medium_skin_tone_medium-dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_man_man_medium_skin_tone_medium-light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_medium-dark_skin_tone": "1f491-1f3fe", + "couple_with_heart_medium-light_skin_tone": "1f491-1f3fc", + "couple_with_heart_medium_skin_tone": "1f491-1f3fd", + "couple_with_heart_person_person_dark_skin_tone_light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fb", + "couple_with_heart_person_person_dark_skin_tone_medium-dark_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fe", + "couple_with_heart_person_person_dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fc", + "couple_with_heart_person_person_dark_skin_tone_medium_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f9d1-1f3fd", + "couple_with_heart_person_person_light_skin_tone_dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3ff", + "couple_with_heart_person_person_light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fe", + "couple_with_heart_person_person_light_skin_tone_medium-light_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fc", + "couple_with_heart_person_person_light_skin_tone_medium_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f9d1-1f3fd", + "couple_with_heart_person_person_medium-dark_skin_tone_dark_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3ff", + "couple_with_heart_person_person_medium-dark_skin_tone_light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fb", + "couple_with_heart_person_person_medium-dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fc", + "couple_with_heart_person_person_medium-dark_skin_tone_medium_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f9d1-1f3fd", + "couple_with_heart_person_person_medium-light_skin_tone_dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3ff", + "couple_with_heart_person_person_medium-light_skin_tone_light_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fb", + "couple_with_heart_person_person_medium-light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fe", + "couple_with_heart_person_person_medium-light_skin_tone_medium_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f9d1-1f3fd", + "couple_with_heart_person_person_medium_skin_tone_dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3ff", + "couple_with_heart_person_person_medium_skin_tone_light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fb", + "couple_with_heart_person_person_medium_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fe", + "couple_with_heart_person_person_medium_skin_tone_medium-light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f9d1-1f3fc", + "couple_with_heart_woman_man": "1f469-200d-2764-fe0f-200d-1f468", + "couple_with_heart_woman_man_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_woman_man_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_woman_man_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_woman_man_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_woman_man_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_woman_man_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_woman_man_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_woman_man_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_woman_man_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_woman_man_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_woman_man_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_woman_man_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_woman_man_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_woman_man_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_woman_man_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_woman_man_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_woman_man_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_woman_man_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_woman_man_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_woman_man_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fd", + "couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3ff", + "couple_with_heart_woman_man_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fb", + "couple_with_heart_woman_man_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fe", + "couple_with_heart_woman_man_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f468-1f3fc", + "couple_with_heart_woman_woman": "1f469-200d-2764-fe0f-200d-1f469", + "couple_with_heart_woman_woman_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3ff", + "couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fb", + "couple_with_heart_woman_woman_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fe", + "couple_with_heart_woman_woman_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fc", + "couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f469-1f3fd", + "couple_with_heart_woman_woman_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fb", + "couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3ff", + "couple_with_heart_woman_woman_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fe", + "couple_with_heart_woman_woman_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fc", + "couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f469-1f3fd", + "couple_with_heart_woman_woman_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fe", + "couple_with_heart_woman_woman_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3ff", + "couple_with_heart_woman_woman_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fb", + "couple_with_heart_woman_woman_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fc", + "couple_with_heart_woman_woman_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f469-1f3fd", + "couple_with_heart_woman_woman_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fc", + "couple_with_heart_woman_woman_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3ff", + "couple_with_heart_woman_woman_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fb", + "couple_with_heart_woman_woman_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fe", + "couple_with_heart_woman_woman_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f469-1f3fd", + "couple_with_heart_woman_woman_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fd", + "couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3ff", + "couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fb", + "couple_with_heart_woman_woman_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fe", + "couple_with_heart_woman_woman_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f469-1f3fc", + "couplekiss": "1f48f", + "couplekiss_man_man": "1f468-200d-2764-fe0f-200d-1f48b-200d-1f468", + "couplekiss_man_woman": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f468", + "couplekiss_woman_woman": "1f469-200d-2764-fe0f-200d-1f48b-200d-1f469", + "cow": "1f42e", + "cow2": "1f404", + "cowboy": "1f920", + "cowboy_hat_face": "1f920", + "cowgirl": "1f920", + "crab": "1f980", + "crayon": "1f58d-fe0f", + "credit_card": "1f4b3", + "crescent_moon": "1f319", + "cricket": "1f997", + "cricket_game": "1f3cf", + "croatia": "1f1ed-1f1f7", + "crocodile": "1f40a", + "croissant": "1f950", + "crossed_fingers": "1f91e", + "crossed_fingers_dark_skin_tone": "1f91e-1f3ff", + "crossed_fingers_light_skin_tone": "1f91e-1f3fb", + "crossed_fingers_medium-dark_skin_tone": "1f91e-1f3fe", + "crossed_fingers_medium-light_skin_tone": "1f91e-1f3fc", + "crossed_fingers_medium_skin_tone": "1f91e-1f3fd", + "crossed_flags": "1f38c", + "crossed_swords": "2694-fe0f", + "crown": "1f451", + "crutch": "1fa7c", + "cry": "1f622", + "crying_cat_face": "1f63f", + "crystal_ball": "1f52e", + "cuba": "1f1e8-1f1fa", + "cucumber": "1f952", + "cup_with_straw": "1f964", + "cupcake": "1f9c1", + "cupid": "1f498", + "curacao": "1f1e8-1f1fc", + "curling_stone": "1f94c", + "curly_haired_man": "1f468-200d-1f9b1", + "curly_haired_woman": "1f469-200d-1f9b1", + "curly_loop": "27b0", + "currency_exchange": "1f4b1", + "curry": "1f35b", + "cursing_face": "1f92c", + "custard": "1f36e", + "customs": "1f6c3", + "cut_of_meat": "1f969", + "cyclone": "1f300", + "cyprus": "1f1e8-1f1fe", + "czech_republic": "1f1e8-1f1ff", + "dagger": "1f5e1-fe0f", + "dancer": "1f483", + "dancers": "1f46f", + "dancing_men": "1f46f-200d-2642-fe0f", + "dancing_women": "1f46f-200d-2640-fe0f", + "dango": "1f361", + "dark_sunglasses": "1f576-fe0f", + "dart": "1f3af", + "dash": "1f4a8", + "date": "1f4c5", + "de": "1f1e9-1f1ea", + "deaf_man": "1f9cf-200d-2642-fe0f", + "deaf_man_dark_skin_tone": "1f9cf-1f3ff-200d-2642-fe0f", + "deaf_man_light_skin_tone": "1f9cf-1f3fb-200d-2642-fe0f", + "deaf_man_medium-dark_skin_tone": "1f9cf-1f3fe-200d-2642-fe0f", + "deaf_man_medium-light_skin_tone": "1f9cf-1f3fc-200d-2642-fe0f", + "deaf_man_medium_skin_tone": "1f9cf-1f3fd-200d-2642-fe0f", + "deaf_person": "1f9cf", + "deaf_person_dark_skin_tone": "1f9cf-1f3ff", + "deaf_person_light_skin_tone": "1f9cf-1f3fb", + "deaf_person_medium-dark_skin_tone": "1f9cf-1f3fe", + "deaf_person_medium-light_skin_tone": "1f9cf-1f3fc", + "deaf_person_medium_skin_tone": "1f9cf-1f3fd", + "deaf_woman": "1f9cf-200d-2640-fe0f", + "deaf_woman_dark_skin_tone": "1f9cf-1f3ff-200d-2640-fe0f", + "deaf_woman_light_skin_tone": "1f9cf-1f3fb-200d-2640-fe0f", + "deaf_woman_medium-dark_skin_tone": "1f9cf-1f3fe-200d-2640-fe0f", + "deaf_woman_medium-light_skin_tone": "1f9cf-1f3fc-200d-2640-fe0f", + "deaf_woman_medium_skin_tone": "1f9cf-1f3fd-200d-2640-fe0f", + "dealwithit": "~dealwithit", + "deciduous_tree": "1f333", + "deer": "1f98c", + "denmark": "1f1e9-1f1f0", + "department_store": "1f3ec", + "derelict_house": "1f3da-fe0f", + "desert": "1f3dc-fe0f", + "desert_island": "1f3dd-fe0f", + "desktop_computer": "1f5a5-fe0f", + "detective": "1f575-fe0f", + "detective_dark_skin_tone": "1f575-1f3ff", + "detective_light_skin_tone": "1f575-1f3fb", + "detective_medium-dark_skin_tone": "1f575-1f3fe", + "detective_medium-light_skin_tone": "1f575-1f3fc", + "detective_medium_skin_tone": "1f575-1f3fd", + "diamond_shape_with_a_dot_inside": "1f4a0", + "diamonds": "2666-fe0f", + "diego_garcia": "1f1e9-1f1ec", + "disappointed": "1f61e", + "disappointed_relieved": "1f625", + "disguised_face": "1f978", + "diving_mask": "1f93f", + "diya_lamp": "1fa94", + "dizzy": "1f4ab", + "dizzy_face": "1f635", + "djibouti": "1f1e9-1f1ef", + "dna": "1f9ec", + "do_not_litter": "1f6af", + "dodo": "1f9a4", + "dog": "1f436", + "dog2": "1f415", + "dollar": "1f4b5", + "dolls": "1f38e", + "dolphin": "1f42c", + "dominica": "1f1e9-1f1f2", + "dominican_republic": "1f1e9-1f1f4", + "donkey": "1facf", + "door": "1f6aa", + "dotted_line_face": "1fae5", + "doughnut": "1f369", + "dove": "1f54a-fe0f", + "dragon": "1f409", + "dragon_face": "1f432", + "dress": "1f457", + "dromedary_camel": "1f42a", + "drooling_face": "1f924", + "drop_of_blood": "1fa78", + "droplet": "1f4a7", + "drum": "1f941", + "duck": "1f986", + "dumpling": "1f95f", + "dvd": "1f4c0", + "e-mail": "1f4e7", + "eagle": "1f985", + "ear": "1f442", + "ear_dark_skin_tone": "1f442-1f3ff", + "ear_light_skin_tone": "1f442-1f3fb", + "ear_medium-dark_skin_tone": "1f442-1f3fe", + "ear_medium-light_skin_tone": "1f442-1f3fc", + "ear_medium_skin_tone": "1f442-1f3fd", + "ear_of_rice": "1f33e", + "ear_with_hearing_aid": "1f9bb", + "ear_with_hearing_aid_dark_skin_tone": "1f9bb-1f3ff", + "ear_with_hearing_aid_light_skin_tone": "1f9bb-1f3fb", + "ear_with_hearing_aid_medium-dark_skin_tone": "1f9bb-1f3fe", + "ear_with_hearing_aid_medium-light_skin_tone": "1f9bb-1f3fc", + "ear_with_hearing_aid_medium_skin_tone": "1f9bb-1f3fd", + "earth_africa": "1f30d", + "earth_americas": "1f30e", + "earth_asia": "1f30f", + "ecuador": "1f1ea-1f1e8", + "egg": "1f95a", + "eggplant": "1f346", + "egypt": "1f1ea-1f1ec", + "eight": "38-fe0f-20e3", + "eight_pointed_black_star": "2734-fe0f", + "eight_spoked_asterisk": "2733-fe0f", + "eject_button": "23cf-fe0f", + "el_salvador": "1f1f8-1f1fb", + "electric_plug": "1f50c", + "elephant": "1f418", + "elevator": "1f6d7", + "elf": "1f9dd", + "elf_dark_skin_tone": "1f9dd-1f3ff", + "elf_light_skin_tone": "1f9dd-1f3fb", + "elf_man": "1f9dd-200d-2642-fe0f", + "elf_medium-dark_skin_tone": "1f9dd-1f3fe", + "elf_medium-light_skin_tone": "1f9dd-1f3fc", + "elf_medium_skin_tone": "1f9dd-1f3fd", + "elf_woman": "1f9dd-200d-2640-fe0f", + "email": "1f4e7", + "empty_nest": "1fab9", + "end": "1f51a", + "england": "1f3f4-e0067-e0062-e0065-e006e-e0067-e007f", + "envelope": "2709-fe0f", + "envelope_with_arrow": "1f4e9", + "equatorial_guinea": "1f1ec-1f1f6", + "eritrea": "1f1ea-1f1f7", + "es": "1f1ea-1f1f8", + "estonia": "1f1ea-1f1ea", + "ethiopia": "1f1ea-1f1f9", + "eu": "1f1ea-1f1fa", + "euphoria": "~euphoria", + "euphoria!": "~euphoric", + "euro": "1f4b6", + "european_castle": "1f3f0", + "european_post_office": "1f3e4", + "european_union": "1f1ea-1f1fa", + "evergreen_tree": "1f332", + "exclamation": "2757", + "exploding_head": "1f92f", + "expressionless": "1f611", + "eye": "1f441-fe0f", + "eye_speech_bubble": "1f441-fe0f-200d-1f5e8-fe0f", + "eyeglasses": "1f453", + "eyes": "1f440", + "face_exhaling": "1f62e-200d-1f4a8", + "face_holding_back_tears": "1f979", + "face_in_clouds": "1f636-200d-1f32b-fe0f", + "face_with_diagonal_mouth": "1fae4", + "face_with_head_bandage": "1f915", + "face_with_open_eyes_and_hand_over_mouth": "1fae2", + "face_with_peeking_eye": "1fae3", + "face_with_spiral_eyes": "1f635-200d-1f4ab", + "face_with_thermometer": "1f912", + "facepalm": "1f926", + "facepunch": "1f44a", + "factory": "1f3ed", + "factory_worker": "1f9d1-200d-1f3ed", + "factory_worker_dark_skin_tone": "1f9d1-1f3ff-200d-1f3ed", + "factory_worker_light_skin_tone": "1f9d1-1f3fb-200d-1f3ed", + "factory_worker_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3ed", + "factory_worker_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3ed", + "factory_worker_medium_skin_tone": "1f9d1-1f3fd-200d-1f3ed", + "fairy": "1f9da", + "fairy_dark_skin_tone": "1f9da-1f3ff", + "fairy_light_skin_tone": "1f9da-1f3fb", + "fairy_man": "1f9da-200d-2642-fe0f", + "fairy_medium-dark_skin_tone": "1f9da-1f3fe", + "fairy_medium-light_skin_tone": "1f9da-1f3fc", + "fairy_medium_skin_tone": "1f9da-1f3fd", + "fairy_woman": "1f9da-200d-2640-fe0f", + "falafel": "1f9c6", + "falkland_islands": "1f1eb-1f1f0", + "fallen_leaf": "1f342", + "family": "1f46a", + "family_adult_adult_child": "1f9d1-200d-1f9d1-200d-1f9d2", + "family_adult_adult_child_child": "1f9d1-200d-1f9d1-200d-1f9d2-200d-1f9d2", + "family_adult_child": "1f9d1-200d-1f9d2", + "family_adult_child_child": "1f9d1-200d-1f9d2-200d-1f9d2", + "family_man_boy": "1f468-200d-1f466", + "family_man_boy_boy": "1f468-200d-1f466-200d-1f466", + "family_man_girl": "1f468-200d-1f467", + "family_man_girl_boy": "1f468-200d-1f467-200d-1f466", + "family_man_girl_girl": "1f468-200d-1f467-200d-1f467", + "family_man_man_boy": "1f468-200d-1f468-200d-1f466", + "family_man_man_boy_boy": "1f468-200d-1f468-200d-1f466-200d-1f466", + "family_man_man_girl": "1f468-200d-1f468-200d-1f467", + "family_man_man_girl_boy": "1f468-200d-1f468-200d-1f467-200d-1f466", + "family_man_man_girl_girl": "1f468-200d-1f468-200d-1f467-200d-1f467", + "family_man_woman_boy": "1f468-200d-1f469-200d-1f466", + "family_man_woman_boy_boy": "1f468-200d-1f469-200d-1f466-200d-1f466", + "family_man_woman_girl": "1f468-200d-1f469-200d-1f467", + "family_man_woman_girl_boy": "1f468-200d-1f469-200d-1f467-200d-1f466", + "family_man_woman_girl_girl": "1f468-200d-1f469-200d-1f467-200d-1f467", + "family_woman_boy": "1f469-200d-1f466", + "family_woman_boy_boy": "1f469-200d-1f466-200d-1f466", + "family_woman_girl": "1f469-200d-1f467", + "family_woman_girl_boy": "1f469-200d-1f467-200d-1f466", + "family_woman_girl_girl": "1f469-200d-1f467-200d-1f467", + "family_woman_woman_boy": "1f469-200d-1f469-200d-1f466", + "family_woman_woman_boy_boy": "1f469-200d-1f469-200d-1f466-200d-1f466", + "family_woman_woman_girl": "1f469-200d-1f469-200d-1f467", + "family_woman_woman_girl_boy": "1f469-200d-1f469-200d-1f467-200d-1f466", + "family_woman_woman_girl_girl": "1f469-200d-1f469-200d-1f467-200d-1f467", + "farmer": "1f9d1-200d-1f33e", + "farmer_dark_skin_tone": "1f9d1-1f3ff-200d-1f33e", + "farmer_light_skin_tone": "1f9d1-1f3fb-200d-1f33e", + "farmer_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f33e", + "farmer_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f33e", + "farmer_medium_skin_tone": "1f9d1-1f3fd-200d-1f33e", + "faroe_islands": "1f1eb-1f1f4", + "fast_forward": "23e9", + "fax": "1f4e0", + "fearful": "1f628", + "feather": "1fab6", + "feet": "1f43e", + "female_detective": "1f575-fe0f-200d-2640-fe0f", + "female_sign": "2640-fe0f", + "ferris_wheel": "1f3a1", + "ferry": "26f4-fe0f", + "field_hockey": "1f3d1", + "fiji": "1f1eb-1f1ef", + "file_cabinet": "1f5c4-fe0f", + "file_folder": "1f4c1", + "film_projector": "1f4fd-fe0f", + "film_strip": "1f39e-fe0f", + "finland": "1f1eb-1f1ee", + "fire": "1f525", + "fire_engine": "1f692", + "fire_extinguisher": "1f9ef", + "firecracker": "1f9e8", + "firefighter": "1f9d1-200d-1f692", + "firefighter_dark_skin_tone": "1f9d1-1f3ff-200d-1f692", + "firefighter_light_skin_tone": "1f9d1-1f3fb-200d-1f692", + "firefighter_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f692", + "firefighter_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f692", + "firefighter_medium_skin_tone": "1f9d1-1f3fd-200d-1f692", + "fireworks": "1f386", + "first_quarter_moon": "1f313", + "first_quarter_moon_with_face": "1f31b", + "fish": "1f41f", + "fish_cake": "1f365", + "fishing_pole_and_fish": "1f3a3", + "fist": "270a", + "fist_left": "1f91b", + "fist_oncoming": "1f44a", + "fist_raised": "270a", + "fist_right": "1f91c", + "five": "35-fe0f-20e3", + "fjafjkldskf7jkfdj": "1f577", + "flags": "1f38f", + "flamingo": "1f9a9", + "flashlight": "1f526", + "flat_shoe": "1f97f", + "flatbread": "1fad3", + "fleur_de_lis": "269c-fe0f", + "flexed_biceps_dark_skin_tone": "1f4aa-1f3ff", + "flexed_biceps_light_skin_tone": "1f4aa-1f3fb", + "flexed_biceps_medium-dark_skin_tone": "1f4aa-1f3fe", + "flexed_biceps_medium-light_skin_tone": "1f4aa-1f3fc", + "flexed_biceps_medium_skin_tone": "1f4aa-1f3fd", + "flight_arrival": "1f6ec", + "flight_departure": "1f6eb", + "flipper": "1f42c", + "floppy_disk": "1f4be", + "flower_playing_cards": "1f3b4", + "flushed": "1f633", + "flute": "1fa88", + "fly": "1fab0", + "flying_disc": "1f94f", + "flying_saucer": "1f6f8", + "fog": "1f32b-fe0f", + "foggy": "1f301", + "folded_hands_dark_skin_tone": "1f64f-1f3ff", + "folded_hands_light_skin_tone": "1f64f-1f3fb", + "folded_hands_medium-dark_skin_tone": "1f64f-1f3fe", + "folded_hands_medium-light_skin_tone": "1f64f-1f3fc", + "folded_hands_medium_skin_tone": "1f64f-1f3fd", + "folding_hand_fan": "1faad", + "fondue": "1fad5", + "foot": "1f9b6", + "foot_dark_skin_tone": "1f9b6-1f3ff", + "foot_light_skin_tone": "1f9b6-1f3fb", + "foot_medium-dark_skin_tone": "1f9b6-1f3fe", + "foot_medium-light_skin_tone": "1f9b6-1f3fc", + "foot_medium_skin_tone": "1f9b6-1f3fd", + "football": "1f3c8", + "footprints": "1f463", + "fork_and_knife": "1f374", + "fortune_cookie": "1f960", + "fountain": "26f2", + "fountain_pen": "1f58b-fe0f", + "four": "34-fe0f-20e3", + "four_leaf_clover": "1f340", + "fox_face": "1f98a", + "fr": "1f1eb-1f1f7", + "framed_picture": "1f5bc-fe0f", + "free": "1f193", + "french_guiana": "1f1ec-1f1eb", + "french_polynesia": "1f1f5-1f1eb", + "french_southern_territories": "1f1f9-1f1eb", + "fried_egg": "1f373", + "fried_shrimp": "1f364", + "fries": "1f35f", + "frog": "1f438", + "frowning": "1f626", + "frowning_face": "2639-fe0f", + "frowning_man": "1f64d-200d-2642-fe0f", + "frowning_person": "1f64d", + "frowning_woman": "1f64d-200d-2640-fe0f", + "fu": "1f595", + "fuelpump": "26fd", + "full_moon": "1f315", + "full_moon_with_face": "1f31d", + "funeral_urn": "26b1-fe0f", + "gabon": "1f1ec-1f1e6", + "gambia": "1f1ec-1f1f2", + "game_die": "1f3b2", + "garlic": "1f9c4", + "gb": "1f1ec-1f1e7", + "gear": "2699-fe0f", + "gem": "1f48e", + "gemini": "264a", + "genie": "1f9de", + "genie_man": "1f9de-200d-2642-fe0f", + "genie_woman": "1f9de-200d-2640-fe0f", + "georgia": "1f1ec-1f1ea", + "ghana": "1f1ec-1f1ed", + "ghost": "1f47b", + "gibraltar": "1f1ec-1f1ee", + "gift": "1f381", + "gift_heart": "1f49d", + "ginger_root": "1fada", + "giraffe": "1f992", + "girl": "1f467", + "girl_dark_skin_tone": "1f467-1f3ff", + "girl_light_skin_tone": "1f467-1f3fb", + "girl_medium-dark_skin_tone": "1f467-1f3fe", + "girl_medium-light_skin_tone": "1f467-1f3fc", + "girl_medium_skin_tone": "1f467-1f3fd", + "globe_with_meridians": "1f310", + "gloves": "1f9e4", + "goal_net": "1f945", + "goat": "1f410", + "goggles": "1f97d", + "golf": "26f3", + "golfing": "1f3cc-fe0f", + "golfing_man": "1f3cc-fe0f-200d-2642-fe0f", + "golfing_woman": "1f3cc-fe0f-200d-2640-fe0f", + "goose": "1fabf", + "gorilla": "1f98d", + "grapes": "1f347", + "greece": "1f1ec-1f1f7", + "green_apple": "1f34f", + "green_book": "1f4d7", + "green_circle": "1f7e2", + "green_heart": "1f49a", + "green_salad": "1f957", + "green_square": "1f7e9", + "greenduck": "~greenduck", + "greenland": "1f1ec-1f1f1", + "grenada": "1f1ec-1f1e9", + "grey_exclamation": "2755", + "grey_heart": "1fa76", + "grey_question": "2754", + "grimacing": "1f62c", + "grin": "1f601", + "grinning": "1f600", + "guadeloupe": "1f1ec-1f1f5", + "guam": "1f1ec-1f1fa", + "guard": "1f482", + "guard_dark_skin_tone": "1f482-1f3ff", + "guard_light_skin_tone": "1f482-1f3fb", + "guard_medium-dark_skin_tone": "1f482-1f3fe", + "guard_medium-light_skin_tone": "1f482-1f3fc", + "guard_medium_skin_tone": "1f482-1f3fd", + "guardsman": "1f482-200d-2642-fe0f", + "guardswoman": "1f482-200d-2640-fe0f", + "guatemala": "1f1ec-1f1f9", + "guernsey": "1f1ec-1f1ec", + "guide_dog": "1f9ae", + "guinea": "1f1ec-1f1f3", + "guinea_bissau": "1f1ec-1f1fc", + "guitar": "1f3b8", + "gun": "1f52b", + "guyana": "1f1ec-1f1fe", + "hair_pick": "1faae", + "haircut": "1f487", + "haircut_man": "1f487-200d-2642-fe0f", + "haircut_woman": "1f487-200d-2640-fe0f", + "haiti": "1f1ed-1f1f9", + "hamburger": "1f354", + "hammer": "1f528", + "hammer_and_pick": "2692-fe0f", + "hammer_and_wrench": "1f6e0-fe0f", + "hamsa": "1faac", + "hamster": "1f439", + "hand": "270b", + "hand_over_mouth": "1f92d", + "hand_with_fingers_splayed_dark_skin_tone": "1f590-1f3ff", + "hand_with_fingers_splayed_light_skin_tone": "1f590-1f3fb", + "hand_with_fingers_splayed_medium-dark_skin_tone": "1f590-1f3fe", + "hand_with_fingers_splayed_medium-light_skin_tone": "1f590-1f3fc", + "hand_with_fingers_splayed_medium_skin_tone": "1f590-1f3fd", + "hand_with_index_finger_and_thumb_crossed": "1faf0", + "hand_with_index_finger_and_thumb_crossed_dark_skin_tone": "1faf0-1f3ff", + "hand_with_index_finger_and_thumb_crossed_light_skin_tone": "1faf0-1f3fb", + "hand_with_index_finger_and_thumb_crossed_medium-dark_skin_tone": "1faf0-1f3fe", + "hand_with_index_finger_and_thumb_crossed_medium-light_skin_tone": "1faf0-1f3fc", + "hand_with_index_finger_and_thumb_crossed_medium_skin_tone": "1faf0-1f3fd", + "handbag": "1f45c", + "handball_person": "1f93e", + "handshake": "1f91d", + "handshake_dark_skin_tone": "1f91d-1f3ff", + "handshake_dark_skin_tone_light_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fb", + "handshake_dark_skin_tone_medium-dark_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fe", + "handshake_dark_skin_tone_medium-light_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fc", + "handshake_dark_skin_tone_medium_skin_tone": "1faf1-1f3ff-200d-1faf2-1f3fd", + "handshake_light_skin_tone": "1f91d-1f3fb", + "handshake_light_skin_tone_dark_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3ff", + "handshake_light_skin_tone_medium-dark_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3fe", + "handshake_light_skin_tone_medium-light_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3fc", + "handshake_light_skin_tone_medium_skin_tone": "1faf1-1f3fb-200d-1faf2-1f3fd", + "handshake_medium-dark_skin_tone": "1f91d-1f3fe", + "handshake_medium-dark_skin_tone_dark_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3ff", + "handshake_medium-dark_skin_tone_light_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3fb", + "handshake_medium-dark_skin_tone_medium-light_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3fc", + "handshake_medium-dark_skin_tone_medium_skin_tone": "1faf1-1f3fe-200d-1faf2-1f3fd", + "handshake_medium-light_skin_tone": "1f91d-1f3fc", + "handshake_medium-light_skin_tone_dark_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3ff", + "handshake_medium-light_skin_tone_light_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3fb", + "handshake_medium-light_skin_tone_medium-dark_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3fe", + "handshake_medium-light_skin_tone_medium_skin_tone": "1faf1-1f3fc-200d-1faf2-1f3fd", + "handshake_medium_skin_tone": "1f91d-1f3fd", + "handshake_medium_skin_tone_dark_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3ff", + "handshake_medium_skin_tone_light_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3fb", + "handshake_medium_skin_tone_medium-dark_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3fe", + "handshake_medium_skin_tone_medium-light_skin_tone": "1faf1-1f3fd-200d-1faf2-1f3fc", + "hankey": "1f4a9", + "happy": "1f604", + "hash": "23-fe0f-20e3", + "hatched_chick": "1f425", + "hatching_chick": "1f423", + "head_shaking_horizontally": "1f642-200d-2194-fe0f", + "head_shaking_vertically": "1f642-200d-2195-fe0f", + "headphones": "1f3a7", + "headstone": "1faa6", + "health_worker": "1f9d1-200d-2695-fe0f", + "health_worker_dark_skin_tone": "1f9d1-1f3ff-200d-2695-fe0f", + "health_worker_light_skin_tone": "1f9d1-1f3fb-200d-2695-fe0f", + "health_worker_medium-dark_skin_tone": "1f9d1-1f3fe-200d-2695-fe0f", + "health_worker_medium-light_skin_tone": "1f9d1-1f3fc-200d-2695-fe0f", + "health_worker_medium_skin_tone": "1f9d1-1f3fd-200d-2695-fe0f", + "hear_no_evil": "1f649", + "heard_mcdonald_islands": "1f1ed-1f1f2", + "heart": "2764-fe0f", + "heart_decoration": "1f49f", + "heart_eyes": "1f60d", + "heart_eyes_cat": "1f63b", + "heart_hands": "1faf6", + "heart_hands_dark_skin_tone": "1faf6-1f3ff", + "heart_hands_light_skin_tone": "1faf6-1f3fb", + "heart_hands_medium-dark_skin_tone": "1faf6-1f3fe", + "heart_hands_medium-light_skin_tone": "1faf6-1f3fc", + "heart_hands_medium_skin_tone": "1faf6-1f3fd", + "heart_on_fire": "2764-fe0f-200d-1f525", + "heartbeat": "1f493", + "heartpulse": "1f497", + "hearts": "2665-fe0f", + "heavy_check_mark": "2714-fe0f", + "heavy_division_sign": "2797", + "heavy_dollar_sign": "1f4b2", + "heavy_equals_sign": "1f7f0", + "heavy_exclamation_mark": "2757", + "heavy_heart_exclamation": "2763-fe0f", + "heavy_minus_sign": "2796", + "heavy_multiplication_x": "2716-fe0f", + "heavy_plus_sign": "2795", + "hedgehog": "1f994", + "helicopter": "1f681", + "herb": "1f33f", + "hibiscus": "1f33a", + "high_brightness": "1f506", + "high_heel": "1f460", + "hiking_boot": "1f97e", + "hindu_temple": "1f6d5", + "hippopotamus": "1f99b", + "hocho": "1f52a", + "hole": "1f573-fe0f", + "honduras": "1f1ed-1f1f3", + "honey_pot": "1f36f", + "honeybee": "1f41d", + "hong_kong": "1f1ed-1f1f0", + "hook": "1fa9d", + "horse": "1f434", + "horse_racing": "1f3c7", + "horse_racing_dark_skin_tone": "1f3c7-1f3ff", + "horse_racing_light_skin_tone": "1f3c7-1f3fb", + "horse_racing_medium-dark_skin_tone": "1f3c7-1f3fe", + "horse_racing_medium-light_skin_tone": "1f3c7-1f3fc", + "horse_racing_medium_skin_tone": "1f3c7-1f3fd", + "hospital": "1f3e5", + "hot_face": "1f975", + "hot_pepper": "1f336-fe0f", + "hotdog": "1f32d", + "hotel": "1f3e8", + "hotsprings": "2668-fe0f", + "hourglass": "231b", + "hourglass_flowing_sand": "23f3", + "house": "1f3e0", + "house_with_garden": "1f3e1", + "houses": "1f3d8-fe0f", + "hugs": "1f917", + "hungary": "1f1ed-1f1fa", + "hushed": "1f62f", + "hut": "1f6d6", + "hyacinth": "1fabb", + "ice_cream": "1f368", + "ice_cube": "1f9ca", + "ice_hockey": "1f3d2", + "ice_skate": "26f8-fe0f", + "icecream": "1f366", + "iceland": "1f1ee-1f1f8", + "id": "1f194", + "identification_card": "1faaa", + "ideograph_advantage": "1f250", + "imp": "1f47f", + "inbox_tray": "1f4e5", + "incoming_envelope": "1f4e8", + "index_pointing_at_the_viewer": "1faf5", + "index_pointing_at_the_viewer_dark_skin_tone": "1faf5-1f3ff", + "index_pointing_at_the_viewer_light_skin_tone": "1faf5-1f3fb", + "index_pointing_at_the_viewer_medium-dark_skin_tone": "1faf5-1f3fe", + "index_pointing_at_the_viewer_medium-light_skin_tone": "1faf5-1f3fc", + "index_pointing_at_the_viewer_medium_skin_tone": "1faf5-1f3fd", + "index_pointing_up_dark_skin_tone": "261d-1f3ff", + "index_pointing_up_light_skin_tone": "261d-1f3fb", + "index_pointing_up_medium-dark_skin_tone": "261d-1f3fe", + "index_pointing_up_medium-light_skin_tone": "261d-1f3fc", + "index_pointing_up_medium_skin_tone": "261d-1f3fd", + "india": "1f1ee-1f1f3", + "indonesia": "1f1ee-1f1e9", + "infinity": "267e-fe0f", + "information_desk_person": "1f481", + "information_source": "2139-fe0f", + "innocent": "1f607", + "interrobang": "2049-fe0f", + "iran": "1f1ee-1f1f7", + "iraq": "1f1ee-1f1f6", + "ireland": "1f1ee-1f1ea", + "isle_of_man": "1f1ee-1f1f2", + "israel": "1f1ee-1f1f1", + "it": "1f1ee-1f1f9", + "izakaya_lantern": "1f3ee", + "jack_o_lantern": "1f383", + "jamaica": "1f1ef-1f1f2", + "japan": "1f5fe", + "japanese_castle": "1f3ef", + "japanese_goblin": "1f47a", + "japanese_ogre": "1f479", + "jar": "1fad9", + "jeans": "1f456", + "jellyfish": "1fabc", + "jersey": "1f1ef-1f1ea", + "jigsaw": "1f9e9", + "jordan": "1f1ef-1f1f4", + "joy": "1f602", + "joy_cat": "1f639", + "joystick": "1f579-fe0f", + "jp": "1f1ef-1f1f5", + "judge": "1f9d1-200d-2696-fe0f", + "judge_dark_skin_tone": "1f9d1-1f3ff-200d-2696-fe0f", + "judge_light_skin_tone": "1f9d1-1f3fb-200d-2696-fe0f", + "judge_medium-dark_skin_tone": "1f9d1-1f3fe-200d-2696-fe0f", + "judge_medium-light_skin_tone": "1f9d1-1f3fc-200d-2696-fe0f", + "judge_medium_skin_tone": "1f9d1-1f3fd-200d-2696-fe0f", + "juggling_person": "1f939", + "kaaba": "1f54b", + "kangaroo": "1f998", + "kazakhstan": "1f1f0-1f1ff", + "kenya": "1f1f0-1f1ea", + "key": "1f511", + "keyboard": "2328-fe0f", + "keycap_ten": "1f51f", + "khanda": "1faaf", + "kick_scooter": "1f6f4", + "kimono": "1f458", + "kiribati": "1f1f0-1f1ee", + "kiss": "1f48b", + "kiss_dark_skin_tone": "1f48f-1f3ff", + "kiss_light_skin_tone": "1f48f-1f3fb", + "kiss_man_man_dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_man_man_dark_skin_tone_light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_man_man_dark_skin_tone_medium-dark_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_man_man_dark_skin_tone_medium-light_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_man_man_dark_skin_tone_medium_skin_tone": "1f468-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_man_man_light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_man_man_light_skin_tone_dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_man_man_light_skin_tone_medium-dark_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_man_man_light_skin_tone_medium-light_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_man_man_light_skin_tone_medium_skin_tone": "1f468-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_man_man_medium-dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_man_man_medium-dark_skin_tone_dark_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_man_man_medium-dark_skin_tone_light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_man_man_medium-dark_skin_tone_medium-light_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_man_man_medium-dark_skin_tone_medium_skin_tone": "1f468-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_man_man_medium-light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_man_man_medium-light_skin_tone_dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_man_man_medium-light_skin_tone_light_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_man_man_medium-light_skin_tone_medium-dark_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_man_man_medium-light_skin_tone_medium_skin_tone": "1f468-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_man_man_medium_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_man_man_medium_skin_tone_dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_man_man_medium_skin_tone_light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_man_man_medium_skin_tone_medium-dark_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_man_man_medium_skin_tone_medium-light_skin_tone": "1f468-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_medium-dark_skin_tone": "1f48f-1f3fe", + "kiss_medium-light_skin_tone": "1f48f-1f3fc", + "kiss_medium_skin_tone": "1f48f-1f3fd", + "kiss_person_person_dark_skin_tone_light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", + "kiss_person_person_dark_skin_tone_medium-dark_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", + "kiss_person_person_dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", + "kiss_person_person_dark_skin_tone_medium_skin_tone": "1f9d1-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", + "kiss_person_person_light_skin_tone_dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", + "kiss_person_person_light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", + "kiss_person_person_light_skin_tone_medium-light_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", + "kiss_person_person_light_skin_tone_medium_skin_tone": "1f9d1-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", + "kiss_person_person_medium-dark_skin_tone_dark_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", + "kiss_person_person_medium-dark_skin_tone_light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", + "kiss_person_person_medium-dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", + "kiss_person_person_medium-dark_skin_tone_medium_skin_tone": "1f9d1-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", + "kiss_person_person_medium-light_skin_tone_dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", + "kiss_person_person_medium-light_skin_tone_light_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", + "kiss_person_person_medium-light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", + "kiss_person_person_medium-light_skin_tone_medium_skin_tone": "1f9d1-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fd", + "kiss_person_person_medium_skin_tone_dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3ff", + "kiss_person_person_medium_skin_tone_light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fb", + "kiss_person_person_medium_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fe", + "kiss_person_person_medium_skin_tone_medium-light_skin_tone": "1f9d1-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f9d1-1f3fc", + "kiss_woman_man_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_woman_man_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_woman_man_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_woman_man_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_woman_man_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_woman_man_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_woman_man_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_woman_man_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_woman_man_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_woman_man_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_woman_man_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_woman_man_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_woman_man_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_woman_man_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_woman_man_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_woman_man_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_woman_man_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_woman_man_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_woman_man_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_woman_man_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_woman_man_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fd", + "kiss_woman_man_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3ff", + "kiss_woman_man_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fb", + "kiss_woman_man_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fe", + "kiss_woman_man_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f468-1f3fc", + "kiss_woman_woman_dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", + "kiss_woman_woman_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", + "kiss_woman_woman_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", + "kiss_woman_woman_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", + "kiss_woman_woman_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", + "kiss_woman_woman_light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", + "kiss_woman_woman_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", + "kiss_woman_woman_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", + "kiss_woman_woman_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", + "kiss_woman_woman_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", + "kiss_woman_woman_medium-dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", + "kiss_woman_woman_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", + "kiss_woman_woman_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", + "kiss_woman_woman_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", + "kiss_woman_woman_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", + "kiss_woman_woman_medium-light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", + "kiss_woman_woman_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", + "kiss_woman_woman_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", + "kiss_woman_woman_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", + "kiss_woman_woman_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", + "kiss_woman_woman_medium_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fd", + "kiss_woman_woman_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3ff", + "kiss_woman_woman_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fb", + "kiss_woman_woman_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fe", + "kiss_woman_woman_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-2764-fe0f-200d-1f48b-200d-1f469-1f3fc", + "kissing": "1f617", + "kissing_cat": "1f63d", + "kissing_closed_eyes": "1f61a", + "kissing_heart": "1f618", + "kissing_smiling_eyes": "1f619", + "kite": "1fa81", + "kiwi_fruit": "1f95d", + "kneeling_man": "1f9ce-200d-2642-fe0f", + "kneeling_person": "1f9ce", + "kneeling_woman": "1f9ce-200d-2640-fe0f", + "knife": "1f52a", + "knot": "1faa2", + "koala": "1f428", + "koko": "1f201", + "kosovo": "1f1fd-1f1f0", + "kr": "1f1f0-1f1f7", + "kuwait": "1f1f0-1f1fc", + "kyrgyzstan": "1f1f0-1f1ec", + "lab_coat": "1f97c", + "label": "1f3f7-fe0f", + "lacrosse": "1f94d", + "ladder": "1fa9c", + "lady_beetle": "1f41e", + "lantern": "1f3ee", + "laos": "1f1f1-1f1e6", + "large_blue_circle": "1f535", + "large_blue_diamond": "1f537", + "large_orange_diamond": "1f536", + "last_quarter_moon": "1f317", + "last_quarter_moon_with_face": "1f31c", + "latin_cross": "271d-fe0f", + "latvia": "1f1f1-1f1fb", + "laughing": "1f606", + "leafy_green": "1f96c", + "leaves": "1f343", + "lebanon": "1f1f1-1f1e7", + "leck": "~leck", + "ledger": "1f4d2", + "left-facing_fist_dark_skin_tone": "1f91b-1f3ff", + "left-facing_fist_light_skin_tone": "1f91b-1f3fb", + "left-facing_fist_medium-dark_skin_tone": "1f91b-1f3fe", + "left-facing_fist_medium-light_skin_tone": "1f91b-1f3fc", + "left-facing_fist_medium_skin_tone": "1f91b-1f3fd", + "left_luggage": "1f6c5", + "left_right_arrow": "2194-fe0f", + "left_speech_bubble": "1f5e8-fe0f", + "leftwards_arrow_with_hook": "21a9-fe0f", + "leftwards_hand": "1faf2", + "leftwards_hand_dark_skin_tone": "1faf2-1f3ff", + "leftwards_hand_light_skin_tone": "1faf2-1f3fb", + "leftwards_hand_medium-dark_skin_tone": "1faf2-1f3fe", + "leftwards_hand_medium-light_skin_tone": "1faf2-1f3fc", + "leftwards_hand_medium_skin_tone": "1faf2-1f3fd", + "leftwards_pushing_hand": "1faf7", + "leftwards_pushing_hand_dark_skin_tone": "1faf7-1f3ff", + "leftwards_pushing_hand_light_skin_tone": "1faf7-1f3fb", + "leftwards_pushing_hand_medium-dark_skin_tone": "1faf7-1f3fe", + "leftwards_pushing_hand_medium-light_skin_tone": "1faf7-1f3fc", + "leftwards_pushing_hand_medium_skin_tone": "1faf7-1f3fd", + "leg": "1f9b5", + "leg_dark_skin_tone": "1f9b5-1f3ff", + "leg_light_skin_tone": "1f9b5-1f3fb", + "leg_medium-dark_skin_tone": "1f9b5-1f3fe", + "leg_medium-light_skin_tone": "1f9b5-1f3fc", + "leg_medium_skin_tone": "1f9b5-1f3fd", + "lemon": "1f34b", + "leo": "264c", + "leopard": "1f406", + "lesotho": "1f1f1-1f1f8", + "level_slider": "1f39a-fe0f", + "liberia": "1f1f1-1f1f7", + "libra": "264e", + "libya": "1f1f1-1f1fe", + "liechtenstein": "1f1f1-1f1ee", + "light_blue_heart": "1fa75", + "light_rail": "1f688", + "lime": "1f34b-200d-1f7e9", + "link": "1f517", + "lion": "1f981", + "lips": "1f444", + "lipstick": "1f484", + "lithuania": "1f1f1-1f1f9", + "lizard": "1f98e", + "llama": "1f999", + "lobster": "1f99e", + "lock": "1f512", + "lock_with_ink_pen": "1f50f", + "lollipop": "1f36d", + "long_drum": "1fa98", + "loop": "27bf", + "lotion_bottle": "1f9f4", + "lotus": "1fab7", + "lotus_position": "1f9d8", + "lotus_position_man": "1f9d8-200d-2642-fe0f", + "lotus_position_woman": "1f9d8-200d-2640-fe0f", + "loud_sound": "1f50a", + "loudspeaker": "1f4e2", + "love-you_gesture_dark_skin_tone": "1f91f-1f3ff", + "love-you_gesture_light_skin_tone": "1f91f-1f3fb", + "love-you_gesture_medium-dark_skin_tone": "1f91f-1f3fe", + "love-you_gesture_medium-light_skin_tone": "1f91f-1f3fc", + "love-you_gesture_medium_skin_tone": "1f91f-1f3fd", + "love_hotel": "1f3e9", + "love_letter": "1f48c", + "love_you_gesture": "1f91f", + "low_battery": "1faab", + "low_brightness": "1f505", + "luggage": "1f9f3", + "lungs": "1fac1", + "luxembourg": "1f1f1-1f1fa", + "lying_face": "1f925", + "m": "24c2-fe0f", + "macau": "1f1f2-1f1f4", + "macedonia": "1f1f2-1f1f0", + "madagascar": "1f1f2-1f1ec", + "mag": "1f50d", + "mag_right": "1f50e", + "mage": "1f9d9", + "mage_dark_skin_tone": "1f9d9-1f3ff", + "mage_light_skin_tone": "1f9d9-1f3fb", + "mage_man": "1f9d9-200d-2642-fe0f", + "mage_medium-dark_skin_tone": "1f9d9-1f3fe", + "mage_medium-light_skin_tone": "1f9d9-1f3fc", + "mage_medium_skin_tone": "1f9d9-1f3fd", + "mage_woman": "1f9d9-200d-2640-fe0f", + "magic_wand": "1fa84", + "magnet": "1f9f2", + "mahjong": "1f004", + "mailbox": "1f4eb", + "mailbox_closed": "1f4ea", + "mailbox_with_mail": "1f4ec", + "mailbox_with_no_mail": "1f4ed", + "malawi": "1f1f2-1f1fc", + "malaysia": "1f1f2-1f1fe", + "maldives": "1f1f2-1f1fb", + "male_detective": "1f575-fe0f-200d-2642-fe0f", + "male_sign": "2642-fe0f", + "mali": "1f1f2-1f1f1", + "malta": "1f1f2-1f1f9", + "mammoth": "1f9a3", + "man": "1f468", + "man_artist": "1f468-200d-1f3a8", + "man_artist_dark_skin_tone": "1f468-1f3ff-200d-1f3a8", + "man_artist_light_skin_tone": "1f468-1f3fb-200d-1f3a8", + "man_artist_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3a8", + "man_artist_medium-light_skin_tone": "1f468-1f3fc-200d-1f3a8", + "man_artist_medium_skin_tone": "1f468-1f3fd-200d-1f3a8", + "man_astronaut": "1f468-200d-1f680", + "man_astronaut_dark_skin_tone": "1f468-1f3ff-200d-1f680", + "man_astronaut_light_skin_tone": "1f468-1f3fb-200d-1f680", + "man_astronaut_medium-dark_skin_tone": "1f468-1f3fe-200d-1f680", + "man_astronaut_medium-light_skin_tone": "1f468-1f3fc-200d-1f680", + "man_astronaut_medium_skin_tone": "1f468-1f3fd-200d-1f680", + "man_beard": "1f9d4-200d-2642-fe0f", + "man_biking_dark_skin_tone": "1f6b4-1f3ff-200d-2642-fe0f", + "man_biking_light_skin_tone": "1f6b4-1f3fb-200d-2642-fe0f", + "man_biking_medium-dark_skin_tone": "1f6b4-1f3fe-200d-2642-fe0f", + "man_biking_medium-light_skin_tone": "1f6b4-1f3fc-200d-2642-fe0f", + "man_biking_medium_skin_tone": "1f6b4-1f3fd-200d-2642-fe0f", + "man_bouncing_ball_dark_skin_tone": "26f9-1f3ff-200d-2642-fe0f", + "man_bouncing_ball_light_skin_tone": "26f9-1f3fb-200d-2642-fe0f", + "man_bouncing_ball_medium-dark_skin_tone": "26f9-1f3fe-200d-2642-fe0f", + "man_bouncing_ball_medium-light_skin_tone": "26f9-1f3fc-200d-2642-fe0f", + "man_bouncing_ball_medium_skin_tone": "26f9-1f3fd-200d-2642-fe0f", + "man_bowing_dark_skin_tone": "1f647-1f3ff-200d-2642-fe0f", + "man_bowing_light_skin_tone": "1f647-1f3fb-200d-2642-fe0f", + "man_bowing_medium-dark_skin_tone": "1f647-1f3fe-200d-2642-fe0f", + "man_bowing_medium-light_skin_tone": "1f647-1f3fc-200d-2642-fe0f", + "man_bowing_medium_skin_tone": "1f647-1f3fd-200d-2642-fe0f", + "man_cartwheeling": "1f938-200d-2642-fe0f", + "man_cartwheeling_dark_skin_tone": "1f938-1f3ff-200d-2642-fe0f", + "man_cartwheeling_light_skin_tone": "1f938-1f3fb-200d-2642-fe0f", + "man_cartwheeling_medium-dark_skin_tone": "1f938-1f3fe-200d-2642-fe0f", + "man_cartwheeling_medium-light_skin_tone": "1f938-1f3fc-200d-2642-fe0f", + "man_cartwheeling_medium_skin_tone": "1f938-1f3fd-200d-2642-fe0f", + "man_climbing_dark_skin_tone": "1f9d7-1f3ff-200d-2642-fe0f", + "man_climbing_light_skin_tone": "1f9d7-1f3fb-200d-2642-fe0f", + "man_climbing_medium-dark_skin_tone": "1f9d7-1f3fe-200d-2642-fe0f", + "man_climbing_medium-light_skin_tone": "1f9d7-1f3fc-200d-2642-fe0f", + "man_climbing_medium_skin_tone": "1f9d7-1f3fd-200d-2642-fe0f", + "man_construction_worker_dark_skin_tone": "1f477-1f3ff-200d-2642-fe0f", + "man_construction_worker_light_skin_tone": "1f477-1f3fb-200d-2642-fe0f", + "man_construction_worker_medium-dark_skin_tone": "1f477-1f3fe-200d-2642-fe0f", + "man_construction_worker_medium-light_skin_tone": "1f477-1f3fc-200d-2642-fe0f", + "man_construction_worker_medium_skin_tone": "1f477-1f3fd-200d-2642-fe0f", + "man_cook": "1f468-200d-1f373", + "man_cook_dark_skin_tone": "1f468-1f3ff-200d-1f373", + "man_cook_light_skin_tone": "1f468-1f3fb-200d-1f373", + "man_cook_medium-dark_skin_tone": "1f468-1f3fe-200d-1f373", + "man_cook_medium-light_skin_tone": "1f468-1f3fc-200d-1f373", + "man_cook_medium_skin_tone": "1f468-1f3fd-200d-1f373", + "man_dancing": "1f57a", + "man_dancing_dark_skin_tone": "1f57a-1f3ff", + "man_dancing_light_skin_tone": "1f57a-1f3fb", + "man_dancing_medium-dark_skin_tone": "1f57a-1f3fe", + "man_dancing_medium-light_skin_tone": "1f57a-1f3fc", + "man_dancing_medium_skin_tone": "1f57a-1f3fd", + "man_dark_skin_tone": "1f468-1f3ff", + "man_dark_skin_tone_bald": "1f468-1f3ff-200d-1f9b2", + "man_dark_skin_tone_beard": "1f9d4-1f3ff-200d-2642-fe0f", + "man_dark_skin_tone_blond_hair": "1f471-1f3ff-200d-2642-fe0f", + "man_dark_skin_tone_curly_hair": "1f468-1f3ff-200d-1f9b1", + "man_dark_skin_tone_red_hair": "1f468-1f3ff-200d-1f9b0", + "man_dark_skin_tone_white_hair": "1f468-1f3ff-200d-1f9b3", + "man_detective_dark_skin_tone": "1f575-1f3ff-200d-2642-fe0f", + "man_detective_light_skin_tone": "1f575-1f3fb-200d-2642-fe0f", + "man_detective_medium-dark_skin_tone": "1f575-1f3fe-200d-2642-fe0f", + "man_detective_medium-light_skin_tone": "1f575-1f3fc-200d-2642-fe0f", + "man_detective_medium_skin_tone": "1f575-1f3fd-200d-2642-fe0f", + "man_elf_dark_skin_tone": "1f9dd-1f3ff-200d-2642-fe0f", + "man_elf_light_skin_tone": "1f9dd-1f3fb-200d-2642-fe0f", + "man_elf_medium-dark_skin_tone": "1f9dd-1f3fe-200d-2642-fe0f", + "man_elf_medium-light_skin_tone": "1f9dd-1f3fc-200d-2642-fe0f", + "man_elf_medium_skin_tone": "1f9dd-1f3fd-200d-2642-fe0f", + "man_facepalming": "1f926-200d-2642-fe0f", + "man_facepalming_dark_skin_tone": "1f926-1f3ff-200d-2642-fe0f", + "man_facepalming_light_skin_tone": "1f926-1f3fb-200d-2642-fe0f", + "man_facepalming_medium-dark_skin_tone": "1f926-1f3fe-200d-2642-fe0f", + "man_facepalming_medium-light_skin_tone": "1f926-1f3fc-200d-2642-fe0f", + "man_facepalming_medium_skin_tone": "1f926-1f3fd-200d-2642-fe0f", + "man_factory_worker": "1f468-200d-1f3ed", + "man_factory_worker_dark_skin_tone": "1f468-1f3ff-200d-1f3ed", + "man_factory_worker_light_skin_tone": "1f468-1f3fb-200d-1f3ed", + "man_factory_worker_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3ed", + "man_factory_worker_medium-light_skin_tone": "1f468-1f3fc-200d-1f3ed", + "man_factory_worker_medium_skin_tone": "1f468-1f3fd-200d-1f3ed", + "man_fairy_dark_skin_tone": "1f9da-1f3ff-200d-2642-fe0f", + "man_fairy_light_skin_tone": "1f9da-1f3fb-200d-2642-fe0f", + "man_fairy_medium-dark_skin_tone": "1f9da-1f3fe-200d-2642-fe0f", + "man_fairy_medium-light_skin_tone": "1f9da-1f3fc-200d-2642-fe0f", + "man_fairy_medium_skin_tone": "1f9da-1f3fd-200d-2642-fe0f", + "man_farmer": "1f468-200d-1f33e", + "man_farmer_dark_skin_tone": "1f468-1f3ff-200d-1f33e", + "man_farmer_light_skin_tone": "1f468-1f3fb-200d-1f33e", + "man_farmer_medium-dark_skin_tone": "1f468-1f3fe-200d-1f33e", + "man_farmer_medium-light_skin_tone": "1f468-1f3fc-200d-1f33e", + "man_farmer_medium_skin_tone": "1f468-1f3fd-200d-1f33e", + "man_feeding_baby": "1f468-200d-1f37c", + "man_feeding_baby_dark_skin_tone": "1f468-1f3ff-200d-1f37c", + "man_feeding_baby_light_skin_tone": "1f468-1f3fb-200d-1f37c", + "man_feeding_baby_medium-dark_skin_tone": "1f468-1f3fe-200d-1f37c", + "man_feeding_baby_medium-light_skin_tone": "1f468-1f3fc-200d-1f37c", + "man_feeding_baby_medium_skin_tone": "1f468-1f3fd-200d-1f37c", + "man_firefighter": "1f468-200d-1f692", + "man_firefighter_dark_skin_tone": "1f468-1f3ff-200d-1f692", + "man_firefighter_light_skin_tone": "1f468-1f3fb-200d-1f692", + "man_firefighter_medium-dark_skin_tone": "1f468-1f3fe-200d-1f692", + "man_firefighter_medium-light_skin_tone": "1f468-1f3fc-200d-1f692", + "man_firefighter_medium_skin_tone": "1f468-1f3fd-200d-1f692", + "man_frowning_dark_skin_tone": "1f64d-1f3ff-200d-2642-fe0f", + "man_frowning_light_skin_tone": "1f64d-1f3fb-200d-2642-fe0f", + "man_frowning_medium-dark_skin_tone": "1f64d-1f3fe-200d-2642-fe0f", + "man_frowning_medium-light_skin_tone": "1f64d-1f3fc-200d-2642-fe0f", + "man_frowning_medium_skin_tone": "1f64d-1f3fd-200d-2642-fe0f", + "man_gesturing_no_dark_skin_tone": "1f645-1f3ff-200d-2642-fe0f", + "man_gesturing_no_light_skin_tone": "1f645-1f3fb-200d-2642-fe0f", + "man_gesturing_no_medium-dark_skin_tone": "1f645-1f3fe-200d-2642-fe0f", + "man_gesturing_no_medium-light_skin_tone": "1f645-1f3fc-200d-2642-fe0f", + "man_gesturing_no_medium_skin_tone": "1f645-1f3fd-200d-2642-fe0f", + "man_gesturing_ok_dark_skin_tone": "1f646-1f3ff-200d-2642-fe0f", + "man_gesturing_ok_light_skin_tone": "1f646-1f3fb-200d-2642-fe0f", + "man_gesturing_ok_medium-dark_skin_tone": "1f646-1f3fe-200d-2642-fe0f", + "man_gesturing_ok_medium-light_skin_tone": "1f646-1f3fc-200d-2642-fe0f", + "man_gesturing_ok_medium_skin_tone": "1f646-1f3fd-200d-2642-fe0f", + "man_getting_haircut_dark_skin_tone": "1f487-1f3ff-200d-2642-fe0f", + "man_getting_haircut_light_skin_tone": "1f487-1f3fb-200d-2642-fe0f", + "man_getting_haircut_medium-dark_skin_tone": "1f487-1f3fe-200d-2642-fe0f", + "man_getting_haircut_medium-light_skin_tone": "1f487-1f3fc-200d-2642-fe0f", + "man_getting_haircut_medium_skin_tone": "1f487-1f3fd-200d-2642-fe0f", + "man_getting_massage_dark_skin_tone": "1f486-1f3ff-200d-2642-fe0f", + "man_getting_massage_light_skin_tone": "1f486-1f3fb-200d-2642-fe0f", + "man_getting_massage_medium-dark_skin_tone": "1f486-1f3fe-200d-2642-fe0f", + "man_getting_massage_medium-light_skin_tone": "1f486-1f3fc-200d-2642-fe0f", + "man_getting_massage_medium_skin_tone": "1f486-1f3fd-200d-2642-fe0f", + "man_golfing_dark_skin_tone": "1f3cc-1f3ff-200d-2642-fe0f", + "man_golfing_light_skin_tone": "1f3cc-1f3fb-200d-2642-fe0f", + "man_golfing_medium-dark_skin_tone": "1f3cc-1f3fe-200d-2642-fe0f", + "man_golfing_medium-light_skin_tone": "1f3cc-1f3fc-200d-2642-fe0f", + "man_golfing_medium_skin_tone": "1f3cc-1f3fd-200d-2642-fe0f", + "man_guard_dark_skin_tone": "1f482-1f3ff-200d-2642-fe0f", + "man_guard_light_skin_tone": "1f482-1f3fb-200d-2642-fe0f", + "man_guard_medium-dark_skin_tone": "1f482-1f3fe-200d-2642-fe0f", + "man_guard_medium-light_skin_tone": "1f482-1f3fc-200d-2642-fe0f", + "man_guard_medium_skin_tone": "1f482-1f3fd-200d-2642-fe0f", + "man_health_worker": "1f468-200d-2695-fe0f", + "man_health_worker_dark_skin_tone": "1f468-1f3ff-200d-2695-fe0f", + "man_health_worker_light_skin_tone": "1f468-1f3fb-200d-2695-fe0f", + "man_health_worker_medium-dark_skin_tone": "1f468-1f3fe-200d-2695-fe0f", + "man_health_worker_medium-light_skin_tone": "1f468-1f3fc-200d-2695-fe0f", + "man_health_worker_medium_skin_tone": "1f468-1f3fd-200d-2695-fe0f", + "man_in_lotus_position_dark_skin_tone": "1f9d8-1f3ff-200d-2642-fe0f", + "man_in_lotus_position_light_skin_tone": "1f9d8-1f3fb-200d-2642-fe0f", + "man_in_lotus_position_medium-dark_skin_tone": "1f9d8-1f3fe-200d-2642-fe0f", + "man_in_lotus_position_medium-light_skin_tone": "1f9d8-1f3fc-200d-2642-fe0f", + "man_in_lotus_position_medium_skin_tone": "1f9d8-1f3fd-200d-2642-fe0f", + "man_in_manual_wheelchair": "1f468-200d-1f9bd", + "man_in_manual_wheelchair_dark_skin_tone": "1f468-1f3ff-200d-1f9bd", + "man_in_manual_wheelchair_facing_right": "1f468-200d-1f9bd-200d-27a1-fe0f", + "man_in_manual_wheelchair_facing_right_dark_skin_tone": "1f468-1f3ff-200d-1f9bd-200d-27a1-fe0f", + "man_in_manual_wheelchair_facing_right_light_skin_tone": "1f468-1f3fb-200d-1f9bd-200d-27a1-fe0f", + "man_in_manual_wheelchair_facing_right_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bd-200d-27a1-fe0f", + "man_in_manual_wheelchair_facing_right_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bd-200d-27a1-fe0f", + "man_in_manual_wheelchair_facing_right_medium_skin_tone": "1f468-1f3fd-200d-1f9bd-200d-27a1-fe0f", + "man_in_manual_wheelchair_light_skin_tone": "1f468-1f3fb-200d-1f9bd", + "man_in_manual_wheelchair_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bd", + "man_in_manual_wheelchair_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bd", + "man_in_manual_wheelchair_medium_skin_tone": "1f468-1f3fd-200d-1f9bd", + "man_in_motorized_wheelchair": "1f468-200d-1f9bc", + "man_in_motorized_wheelchair_dark_skin_tone": "1f468-1f3ff-200d-1f9bc", + "man_in_motorized_wheelchair_facing_right": "1f468-200d-1f9bc-200d-27a1-fe0f", + "man_in_motorized_wheelchair_facing_right_dark_skin_tone": "1f468-1f3ff-200d-1f9bc-200d-27a1-fe0f", + "man_in_motorized_wheelchair_facing_right_light_skin_tone": "1f468-1f3fb-200d-1f9bc-200d-27a1-fe0f", + "man_in_motorized_wheelchair_facing_right_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bc-200d-27a1-fe0f", + "man_in_motorized_wheelchair_facing_right_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bc-200d-27a1-fe0f", + "man_in_motorized_wheelchair_facing_right_medium_skin_tone": "1f468-1f3fd-200d-1f9bc-200d-27a1-fe0f", + "man_in_motorized_wheelchair_light_skin_tone": "1f468-1f3fb-200d-1f9bc", + "man_in_motorized_wheelchair_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9bc", + "man_in_motorized_wheelchair_medium-light_skin_tone": "1f468-1f3fc-200d-1f9bc", + "man_in_motorized_wheelchair_medium_skin_tone": "1f468-1f3fd-200d-1f9bc", + "man_in_steamy_room_dark_skin_tone": "1f9d6-1f3ff-200d-2642-fe0f", + "man_in_steamy_room_light_skin_tone": "1f9d6-1f3fb-200d-2642-fe0f", + "man_in_steamy_room_medium-dark_skin_tone": "1f9d6-1f3fe-200d-2642-fe0f", + "man_in_steamy_room_medium-light_skin_tone": "1f9d6-1f3fc-200d-2642-fe0f", + "man_in_steamy_room_medium_skin_tone": "1f9d6-1f3fd-200d-2642-fe0f", + "man_in_tuxedo": "1f935-200d-2642-fe0f", + "man_in_tuxedo_dark_skin_tone": "1f935-1f3ff-200d-2642-fe0f", + "man_in_tuxedo_light_skin_tone": "1f935-1f3fb-200d-2642-fe0f", + "man_in_tuxedo_medium-dark_skin_tone": "1f935-1f3fe-200d-2642-fe0f", + "man_in_tuxedo_medium-light_skin_tone": "1f935-1f3fc-200d-2642-fe0f", + "man_in_tuxedo_medium_skin_tone": "1f935-1f3fd-200d-2642-fe0f", + "man_judge": "1f468-200d-2696-fe0f", + "man_judge_dark_skin_tone": "1f468-1f3ff-200d-2696-fe0f", + "man_judge_light_skin_tone": "1f468-1f3fb-200d-2696-fe0f", + "man_judge_medium-dark_skin_tone": "1f468-1f3fe-200d-2696-fe0f", + "man_judge_medium-light_skin_tone": "1f468-1f3fc-200d-2696-fe0f", + "man_judge_medium_skin_tone": "1f468-1f3fd-200d-2696-fe0f", + "man_juggling": "1f939-200d-2642-fe0f", + "man_juggling_dark_skin_tone": "1f939-1f3ff-200d-2642-fe0f", + "man_juggling_light_skin_tone": "1f939-1f3fb-200d-2642-fe0f", + "man_juggling_medium-dark_skin_tone": "1f939-1f3fe-200d-2642-fe0f", + "man_juggling_medium-light_skin_tone": "1f939-1f3fc-200d-2642-fe0f", + "man_juggling_medium_skin_tone": "1f939-1f3fd-200d-2642-fe0f", + "man_kneeling_dark_skin_tone": "1f9ce-1f3ff-200d-2642-fe0f", + "man_kneeling_facing_right": "1f9ce-200d-2642-fe0f-200d-27a1-fe0f", + "man_kneeling_facing_right_dark_skin_tone": "1f9ce-1f3ff-200d-2642-fe0f-200d-27a1-fe0f", + "man_kneeling_facing_right_light_skin_tone": "1f9ce-1f3fb-200d-2642-fe0f-200d-27a1-fe0f", + "man_kneeling_facing_right_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2642-fe0f-200d-27a1-fe0f", + "man_kneeling_facing_right_medium-light_skin_tone": "1f9ce-1f3fc-200d-2642-fe0f-200d-27a1-fe0f", + "man_kneeling_facing_right_medium_skin_tone": "1f9ce-1f3fd-200d-2642-fe0f-200d-27a1-fe0f", + "man_kneeling_light_skin_tone": "1f9ce-1f3fb-200d-2642-fe0f", + "man_kneeling_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2642-fe0f", + "man_kneeling_medium-light_skin_tone": "1f9ce-1f3fc-200d-2642-fe0f", + "man_kneeling_medium_skin_tone": "1f9ce-1f3fd-200d-2642-fe0f", + "man_lifting_weights_dark_skin_tone": "1f3cb-1f3ff-200d-2642-fe0f", + "man_lifting_weights_light_skin_tone": "1f3cb-1f3fb-200d-2642-fe0f", + "man_lifting_weights_medium-dark_skin_tone": "1f3cb-1f3fe-200d-2642-fe0f", + "man_lifting_weights_medium-light_skin_tone": "1f3cb-1f3fc-200d-2642-fe0f", + "man_lifting_weights_medium_skin_tone": "1f3cb-1f3fd-200d-2642-fe0f", + "man_light_skin_tone": "1f468-1f3fb", + "man_light_skin_tone_bald": "1f468-1f3fb-200d-1f9b2", + "man_light_skin_tone_beard": "1f9d4-1f3fb-200d-2642-fe0f", + "man_light_skin_tone_blond_hair": "1f471-1f3fb-200d-2642-fe0f", + "man_light_skin_tone_curly_hair": "1f468-1f3fb-200d-1f9b1", + "man_light_skin_tone_red_hair": "1f468-1f3fb-200d-1f9b0", + "man_light_skin_tone_white_hair": "1f468-1f3fb-200d-1f9b3", + "man_mage_dark_skin_tone": "1f9d9-1f3ff-200d-2642-fe0f", + "man_mage_light_skin_tone": "1f9d9-1f3fb-200d-2642-fe0f", + "man_mage_medium-dark_skin_tone": "1f9d9-1f3fe-200d-2642-fe0f", + "man_mage_medium-light_skin_tone": "1f9d9-1f3fc-200d-2642-fe0f", + "man_mage_medium_skin_tone": "1f9d9-1f3fd-200d-2642-fe0f", + "man_mechanic": "1f468-200d-1f527", + "man_mechanic_dark_skin_tone": "1f468-1f3ff-200d-1f527", + "man_mechanic_light_skin_tone": "1f468-1f3fb-200d-1f527", + "man_mechanic_medium-dark_skin_tone": "1f468-1f3fe-200d-1f527", + "man_mechanic_medium-light_skin_tone": "1f468-1f3fc-200d-1f527", + "man_mechanic_medium_skin_tone": "1f468-1f3fd-200d-1f527", + "man_medium-dark_skin_tone": "1f468-1f3fe", + "man_medium-dark_skin_tone_bald": "1f468-1f3fe-200d-1f9b2", + "man_medium-dark_skin_tone_beard": "1f9d4-1f3fe-200d-2642-fe0f", + "man_medium-dark_skin_tone_blond_hair": "1f471-1f3fe-200d-2642-fe0f", + "man_medium-dark_skin_tone_curly_hair": "1f468-1f3fe-200d-1f9b1", + "man_medium-dark_skin_tone_red_hair": "1f468-1f3fe-200d-1f9b0", + "man_medium-dark_skin_tone_white_hair": "1f468-1f3fe-200d-1f9b3", + "man_medium-light_skin_tone": "1f468-1f3fc", + "man_medium-light_skin_tone_bald": "1f468-1f3fc-200d-1f9b2", + "man_medium-light_skin_tone_beard": "1f9d4-1f3fc-200d-2642-fe0f", + "man_medium-light_skin_tone_blond_hair": "1f471-1f3fc-200d-2642-fe0f", + "man_medium-light_skin_tone_curly_hair": "1f468-1f3fc-200d-1f9b1", + "man_medium-light_skin_tone_red_hair": "1f468-1f3fc-200d-1f9b0", + "man_medium-light_skin_tone_white_hair": "1f468-1f3fc-200d-1f9b3", + "man_medium_skin_tone": "1f468-1f3fd", + "man_medium_skin_tone_bald": "1f468-1f3fd-200d-1f9b2", + "man_medium_skin_tone_beard": "1f9d4-1f3fd-200d-2642-fe0f", + "man_medium_skin_tone_blond_hair": "1f471-1f3fd-200d-2642-fe0f", + "man_medium_skin_tone_curly_hair": "1f468-1f3fd-200d-1f9b1", + "man_medium_skin_tone_red_hair": "1f468-1f3fd-200d-1f9b0", + "man_medium_skin_tone_white_hair": "1f468-1f3fd-200d-1f9b3", + "man_mountain_biking_dark_skin_tone": "1f6b5-1f3ff-200d-2642-fe0f", + "man_mountain_biking_light_skin_tone": "1f6b5-1f3fb-200d-2642-fe0f", + "man_mountain_biking_medium-dark_skin_tone": "1f6b5-1f3fe-200d-2642-fe0f", + "man_mountain_biking_medium-light_skin_tone": "1f6b5-1f3fc-200d-2642-fe0f", + "man_mountain_biking_medium_skin_tone": "1f6b5-1f3fd-200d-2642-fe0f", + "man_office_worker": "1f468-200d-1f4bc", + "man_office_worker_dark_skin_tone": "1f468-1f3ff-200d-1f4bc", + "man_office_worker_light_skin_tone": "1f468-1f3fb-200d-1f4bc", + "man_office_worker_medium-dark_skin_tone": "1f468-1f3fe-200d-1f4bc", + "man_office_worker_medium-light_skin_tone": "1f468-1f3fc-200d-1f4bc", + "man_office_worker_medium_skin_tone": "1f468-1f3fd-200d-1f4bc", + "man_pilot": "1f468-200d-2708-fe0f", + "man_pilot_dark_skin_tone": "1f468-1f3ff-200d-2708-fe0f", + "man_pilot_light_skin_tone": "1f468-1f3fb-200d-2708-fe0f", + "man_pilot_medium-dark_skin_tone": "1f468-1f3fe-200d-2708-fe0f", + "man_pilot_medium-light_skin_tone": "1f468-1f3fc-200d-2708-fe0f", + "man_pilot_medium_skin_tone": "1f468-1f3fd-200d-2708-fe0f", + "man_playing_handball": "1f93e-200d-2642-fe0f", + "man_playing_handball_dark_skin_tone": "1f93e-1f3ff-200d-2642-fe0f", + "man_playing_handball_light_skin_tone": "1f93e-1f3fb-200d-2642-fe0f", + "man_playing_handball_medium-dark_skin_tone": "1f93e-1f3fe-200d-2642-fe0f", + "man_playing_handball_medium-light_skin_tone": "1f93e-1f3fc-200d-2642-fe0f", + "man_playing_handball_medium_skin_tone": "1f93e-1f3fd-200d-2642-fe0f", + "man_playing_water_polo": "1f93d-200d-2642-fe0f", + "man_playing_water_polo_dark_skin_tone": "1f93d-1f3ff-200d-2642-fe0f", + "man_playing_water_polo_light_skin_tone": "1f93d-1f3fb-200d-2642-fe0f", + "man_playing_water_polo_medium-dark_skin_tone": "1f93d-1f3fe-200d-2642-fe0f", + "man_playing_water_polo_medium-light_skin_tone": "1f93d-1f3fc-200d-2642-fe0f", + "man_playing_water_polo_medium_skin_tone": "1f93d-1f3fd-200d-2642-fe0f", + "man_police_officer_dark_skin_tone": "1f46e-1f3ff-200d-2642-fe0f", + "man_police_officer_light_skin_tone": "1f46e-1f3fb-200d-2642-fe0f", + "man_police_officer_medium-dark_skin_tone": "1f46e-1f3fe-200d-2642-fe0f", + "man_police_officer_medium-light_skin_tone": "1f46e-1f3fc-200d-2642-fe0f", + "man_police_officer_medium_skin_tone": "1f46e-1f3fd-200d-2642-fe0f", + "man_pouting_dark_skin_tone": "1f64e-1f3ff-200d-2642-fe0f", + "man_pouting_light_skin_tone": "1f64e-1f3fb-200d-2642-fe0f", + "man_pouting_medium-dark_skin_tone": "1f64e-1f3fe-200d-2642-fe0f", + "man_pouting_medium-light_skin_tone": "1f64e-1f3fc-200d-2642-fe0f", + "man_pouting_medium_skin_tone": "1f64e-1f3fd-200d-2642-fe0f", + "man_raising_hand_dark_skin_tone": "1f64b-1f3ff-200d-2642-fe0f", + "man_raising_hand_light_skin_tone": "1f64b-1f3fb-200d-2642-fe0f", + "man_raising_hand_medium-dark_skin_tone": "1f64b-1f3fe-200d-2642-fe0f", + "man_raising_hand_medium-light_skin_tone": "1f64b-1f3fc-200d-2642-fe0f", + "man_raising_hand_medium_skin_tone": "1f64b-1f3fd-200d-2642-fe0f", + "man_rowing_boat_dark_skin_tone": "1f6a3-1f3ff-200d-2642-fe0f", + "man_rowing_boat_light_skin_tone": "1f6a3-1f3fb-200d-2642-fe0f", + "man_rowing_boat_medium-dark_skin_tone": "1f6a3-1f3fe-200d-2642-fe0f", + "man_rowing_boat_medium-light_skin_tone": "1f6a3-1f3fc-200d-2642-fe0f", + "man_rowing_boat_medium_skin_tone": "1f6a3-1f3fd-200d-2642-fe0f", + "man_running_dark_skin_tone": "1f3c3-1f3ff-200d-2642-fe0f", + "man_running_facing_right": "1f3c3-200d-2642-fe0f-200d-27a1-fe0f", + "man_running_facing_right_dark_skin_tone": "1f3c3-1f3ff-200d-2642-fe0f-200d-27a1-fe0f", + "man_running_facing_right_light_skin_tone": "1f3c3-1f3fb-200d-2642-fe0f-200d-27a1-fe0f", + "man_running_facing_right_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2642-fe0f-200d-27a1-fe0f", + "man_running_facing_right_medium-light_skin_tone": "1f3c3-1f3fc-200d-2642-fe0f-200d-27a1-fe0f", + "man_running_facing_right_medium_skin_tone": "1f3c3-1f3fd-200d-2642-fe0f-200d-27a1-fe0f", + "man_running_light_skin_tone": "1f3c3-1f3fb-200d-2642-fe0f", + "man_running_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2642-fe0f", + "man_running_medium-light_skin_tone": "1f3c3-1f3fc-200d-2642-fe0f", + "man_running_medium_skin_tone": "1f3c3-1f3fd-200d-2642-fe0f", + "man_scientist": "1f468-200d-1f52c", + "man_scientist_dark_skin_tone": "1f468-1f3ff-200d-1f52c", + "man_scientist_light_skin_tone": "1f468-1f3fb-200d-1f52c", + "man_scientist_medium-dark_skin_tone": "1f468-1f3fe-200d-1f52c", + "man_scientist_medium-light_skin_tone": "1f468-1f3fc-200d-1f52c", + "man_scientist_medium_skin_tone": "1f468-1f3fd-200d-1f52c", + "man_shrugging": "1f937-200d-2642-fe0f", + "man_shrugging_dark_skin_tone": "1f937-1f3ff-200d-2642-fe0f", + "man_shrugging_light_skin_tone": "1f937-1f3fb-200d-2642-fe0f", + "man_shrugging_medium-dark_skin_tone": "1f937-1f3fe-200d-2642-fe0f", + "man_shrugging_medium-light_skin_tone": "1f937-1f3fc-200d-2642-fe0f", + "man_shrugging_medium_skin_tone": "1f937-1f3fd-200d-2642-fe0f", + "man_singer": "1f468-200d-1f3a4", + "man_singer_dark_skin_tone": "1f468-1f3ff-200d-1f3a4", + "man_singer_light_skin_tone": "1f468-1f3fb-200d-1f3a4", + "man_singer_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3a4", + "man_singer_medium-light_skin_tone": "1f468-1f3fc-200d-1f3a4", + "man_singer_medium_skin_tone": "1f468-1f3fd-200d-1f3a4", + "man_standing_dark_skin_tone": "1f9cd-1f3ff-200d-2642-fe0f", + "man_standing_light_skin_tone": "1f9cd-1f3fb-200d-2642-fe0f", + "man_standing_medium-dark_skin_tone": "1f9cd-1f3fe-200d-2642-fe0f", + "man_standing_medium-light_skin_tone": "1f9cd-1f3fc-200d-2642-fe0f", + "man_standing_medium_skin_tone": "1f9cd-1f3fd-200d-2642-fe0f", + "man_student": "1f468-200d-1f393", + "man_student_dark_skin_tone": "1f468-1f3ff-200d-1f393", + "man_student_light_skin_tone": "1f468-1f3fb-200d-1f393", + "man_student_medium-dark_skin_tone": "1f468-1f3fe-200d-1f393", + "man_student_medium-light_skin_tone": "1f468-1f3fc-200d-1f393", + "man_student_medium_skin_tone": "1f468-1f3fd-200d-1f393", + "man_superhero_dark_skin_tone": "1f9b8-1f3ff-200d-2642-fe0f", + "man_superhero_light_skin_tone": "1f9b8-1f3fb-200d-2642-fe0f", + "man_superhero_medium-dark_skin_tone": "1f9b8-1f3fe-200d-2642-fe0f", + "man_superhero_medium-light_skin_tone": "1f9b8-1f3fc-200d-2642-fe0f", + "man_superhero_medium_skin_tone": "1f9b8-1f3fd-200d-2642-fe0f", + "man_supervillain_dark_skin_tone": "1f9b9-1f3ff-200d-2642-fe0f", + "man_supervillain_light_skin_tone": "1f9b9-1f3fb-200d-2642-fe0f", + "man_supervillain_medium-dark_skin_tone": "1f9b9-1f3fe-200d-2642-fe0f", + "man_supervillain_medium-light_skin_tone": "1f9b9-1f3fc-200d-2642-fe0f", + "man_supervillain_medium_skin_tone": "1f9b9-1f3fd-200d-2642-fe0f", + "man_surfing_dark_skin_tone": "1f3c4-1f3ff-200d-2642-fe0f", + "man_surfing_light_skin_tone": "1f3c4-1f3fb-200d-2642-fe0f", + "man_surfing_medium-dark_skin_tone": "1f3c4-1f3fe-200d-2642-fe0f", + "man_surfing_medium-light_skin_tone": "1f3c4-1f3fc-200d-2642-fe0f", + "man_surfing_medium_skin_tone": "1f3c4-1f3fd-200d-2642-fe0f", + "man_swimming_dark_skin_tone": "1f3ca-1f3ff-200d-2642-fe0f", + "man_swimming_light_skin_tone": "1f3ca-1f3fb-200d-2642-fe0f", + "man_swimming_medium-dark_skin_tone": "1f3ca-1f3fe-200d-2642-fe0f", + "man_swimming_medium-light_skin_tone": "1f3ca-1f3fc-200d-2642-fe0f", + "man_swimming_medium_skin_tone": "1f3ca-1f3fd-200d-2642-fe0f", + "man_teacher": "1f468-200d-1f3eb", + "man_teacher_dark_skin_tone": "1f468-1f3ff-200d-1f3eb", + "man_teacher_light_skin_tone": "1f468-1f3fb-200d-1f3eb", + "man_teacher_medium-dark_skin_tone": "1f468-1f3fe-200d-1f3eb", + "man_teacher_medium-light_skin_tone": "1f468-1f3fc-200d-1f3eb", + "man_teacher_medium_skin_tone": "1f468-1f3fd-200d-1f3eb", + "man_technologist": "1f468-200d-1f4bb", + "man_technologist_dark_skin_tone": "1f468-1f3ff-200d-1f4bb", + "man_technologist_light_skin_tone": "1f468-1f3fb-200d-1f4bb", + "man_technologist_medium-dark_skin_tone": "1f468-1f3fe-200d-1f4bb", + "man_technologist_medium-light_skin_tone": "1f468-1f3fc-200d-1f4bb", + "man_technologist_medium_skin_tone": "1f468-1f3fd-200d-1f4bb", + "man_tipping_hand_dark_skin_tone": "1f481-1f3ff-200d-2642-fe0f", + "man_tipping_hand_light_skin_tone": "1f481-1f3fb-200d-2642-fe0f", + "man_tipping_hand_medium-dark_skin_tone": "1f481-1f3fe-200d-2642-fe0f", + "man_tipping_hand_medium-light_skin_tone": "1f481-1f3fc-200d-2642-fe0f", + "man_tipping_hand_medium_skin_tone": "1f481-1f3fd-200d-2642-fe0f", + "man_vampire_dark_skin_tone": "1f9db-1f3ff-200d-2642-fe0f", + "man_vampire_light_skin_tone": "1f9db-1f3fb-200d-2642-fe0f", + "man_vampire_medium-dark_skin_tone": "1f9db-1f3fe-200d-2642-fe0f", + "man_vampire_medium-light_skin_tone": "1f9db-1f3fc-200d-2642-fe0f", + "man_vampire_medium_skin_tone": "1f9db-1f3fd-200d-2642-fe0f", + "man_walking_dark_skin_tone": "1f6b6-1f3ff-200d-2642-fe0f", + "man_walking_facing_right": "1f6b6-200d-2642-fe0f-200d-27a1-fe0f", + "man_walking_facing_right_dark_skin_tone": "1f6b6-1f3ff-200d-2642-fe0f-200d-27a1-fe0f", + "man_walking_facing_right_light_skin_tone": "1f6b6-1f3fb-200d-2642-fe0f-200d-27a1-fe0f", + "man_walking_facing_right_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2642-fe0f-200d-27a1-fe0f", + "man_walking_facing_right_medium-light_skin_tone": "1f6b6-1f3fc-200d-2642-fe0f-200d-27a1-fe0f", + "man_walking_facing_right_medium_skin_tone": "1f6b6-1f3fd-200d-2642-fe0f-200d-27a1-fe0f", + "man_walking_light_skin_tone": "1f6b6-1f3fb-200d-2642-fe0f", + "man_walking_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2642-fe0f", + "man_walking_medium-light_skin_tone": "1f6b6-1f3fc-200d-2642-fe0f", + "man_walking_medium_skin_tone": "1f6b6-1f3fd-200d-2642-fe0f", + "man_wearing_turban_dark_skin_tone": "1f473-1f3ff-200d-2642-fe0f", + "man_wearing_turban_light_skin_tone": "1f473-1f3fb-200d-2642-fe0f", + "man_wearing_turban_medium-dark_skin_tone": "1f473-1f3fe-200d-2642-fe0f", + "man_wearing_turban_medium-light_skin_tone": "1f473-1f3fc-200d-2642-fe0f", + "man_wearing_turban_medium_skin_tone": "1f473-1f3fd-200d-2642-fe0f", + "man_with_gua_pi_mao": "1f472", + "man_with_probing_cane": "1f468-200d-1f9af", + "man_with_turban": "1f473-200d-2642-fe0f", + "man_with_veil": "1f470-200d-2642-fe0f", + "man_with_veil_dark_skin_tone": "1f470-1f3ff-200d-2642-fe0f", + "man_with_veil_light_skin_tone": "1f470-1f3fb-200d-2642-fe0f", + "man_with_veil_medium-dark_skin_tone": "1f470-1f3fe-200d-2642-fe0f", + "man_with_veil_medium-light_skin_tone": "1f470-1f3fc-200d-2642-fe0f", + "man_with_veil_medium_skin_tone": "1f470-1f3fd-200d-2642-fe0f", + "man_with_white_cane_dark_skin_tone": "1f468-1f3ff-200d-1f9af", + "man_with_white_cane_facing_right": "1f468-200d-1f9af-200d-27a1-fe0f", + "man_with_white_cane_facing_right_dark_skin_tone": "1f468-1f3ff-200d-1f9af-200d-27a1-fe0f", + "man_with_white_cane_facing_right_light_skin_tone": "1f468-1f3fb-200d-1f9af-200d-27a1-fe0f", + "man_with_white_cane_facing_right_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9af-200d-27a1-fe0f", + "man_with_white_cane_facing_right_medium-light_skin_tone": "1f468-1f3fc-200d-1f9af-200d-27a1-fe0f", + "man_with_white_cane_facing_right_medium_skin_tone": "1f468-1f3fd-200d-1f9af-200d-27a1-fe0f", + "man_with_white_cane_light_skin_tone": "1f468-1f3fb-200d-1f9af", + "man_with_white_cane_medium-dark_skin_tone": "1f468-1f3fe-200d-1f9af", + "man_with_white_cane_medium-light_skin_tone": "1f468-1f3fc-200d-1f9af", + "man_with_white_cane_medium_skin_tone": "1f468-1f3fd-200d-1f9af", + "mandarin": "1f34a", + "mango": "1f96d", + "mans_shoe": "1f45e", + "mantelpiece_clock": "1f570-fe0f", + "manual_wheelchair": "1f9bd", + "maple_leaf": "1f341", + "maracas": "1fa87", + "marshall_islands": "1f1f2-1f1ed", + "martial_arts_uniform": "1f94b", + "martinique": "1f1f2-1f1f6", + "mask": "1f637", + "massage": "1f486", + "massage_man": "1f486-200d-2642-fe0f", + "massage_woman": "1f486-200d-2640-fe0f", + "mate": "1f9c9", + "mauritania": "1f1f2-1f1f7", + "mauritius": "1f1f2-1f1fa", + "mayotte": "1f1fe-1f1f9", + "meat_on_bone": "1f356", + "mechanic": "1f9d1-200d-1f527", + "mechanic_dark_skin_tone": "1f9d1-1f3ff-200d-1f527", + "mechanic_light_skin_tone": "1f9d1-1f3fb-200d-1f527", + "mechanic_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f527", + "mechanic_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f527", + "mechanic_medium_skin_tone": "1f9d1-1f3fd-200d-1f527", + "mechanical_arm": "1f9be", + "mechanical_leg": "1f9bf", + "medal_military": "1f396-fe0f", + "medal_sports": "1f3c5", + "medical_symbol": "2695-fe0f", + "mega": "1f4e3", + "melon": "1f348", + "melting_face": "1fae0", + "memo": "1f4dd", + "men_holding_hands_dark_skin_tone": "1f46c-1f3ff", + "men_holding_hands_dark_skin_tone_light_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fb", + "men_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fe", + "men_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fc", + "men_holding_hands_dark_skin_tone_medium_skin_tone": "1f468-1f3ff-200d-1f91d-200d-1f468-1f3fd", + "men_holding_hands_light_skin_tone": "1f46c-1f3fb", + "men_holding_hands_light_skin_tone_dark_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3ff", + "men_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fe", + "men_holding_hands_light_skin_tone_medium-light_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fc", + "men_holding_hands_light_skin_tone_medium_skin_tone": "1f468-1f3fb-200d-1f91d-200d-1f468-1f3fd", + "men_holding_hands_medium-dark_skin_tone": "1f46c-1f3fe", + "men_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3ff", + "men_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fb", + "men_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fc", + "men_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f468-1f3fe-200d-1f91d-200d-1f468-1f3fd", + "men_holding_hands_medium-light_skin_tone": "1f46c-1f3fc", + "men_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3ff", + "men_holding_hands_medium-light_skin_tone_light_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fb", + "men_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fe", + "men_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f468-1f3fc-200d-1f91d-200d-1f468-1f3fd", + "men_holding_hands_medium_skin_tone": "1f46c-1f3fd", + "men_holding_hands_medium_skin_tone_dark_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3ff", + "men_holding_hands_medium_skin_tone_light_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fb", + "men_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fe", + "men_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f468-1f3fd-200d-1f91d-200d-1f468-1f3fc", + "men_wrestling": "1f93c-200d-2642-fe0f", + "mending_heart": "2764-fe0f-200d-1fa79", + "menorah": "1f54e", + "mens": "1f6b9", + "mermaid": "1f9dc-200d-2640-fe0f", + "mermaid_dark_skin_tone": "1f9dc-1f3ff-200d-2640-fe0f", + "mermaid_light_skin_tone": "1f9dc-1f3fb-200d-2640-fe0f", + "mermaid_medium-dark_skin_tone": "1f9dc-1f3fe-200d-2640-fe0f", + "mermaid_medium-light_skin_tone": "1f9dc-1f3fc-200d-2640-fe0f", + "mermaid_medium_skin_tone": "1f9dc-1f3fd-200d-2640-fe0f", + "merman": "1f9dc-200d-2642-fe0f", + "merman_dark_skin_tone": "1f9dc-1f3ff-200d-2642-fe0f", + "merman_light_skin_tone": "1f9dc-1f3fb-200d-2642-fe0f", + "merman_medium-dark_skin_tone": "1f9dc-1f3fe-200d-2642-fe0f", + "merman_medium-light_skin_tone": "1f9dc-1f3fc-200d-2642-fe0f", + "merman_medium_skin_tone": "1f9dc-1f3fd-200d-2642-fe0f", + "merperson": "1f9dc", + "merperson_dark_skin_tone": "1f9dc-1f3ff", + "merperson_light_skin_tone": "1f9dc-1f3fb", + "merperson_medium-dark_skin_tone": "1f9dc-1f3fe", + "merperson_medium-light_skin_tone": "1f9dc-1f3fc", + "merperson_medium_skin_tone": "1f9dc-1f3fd", + "metal": "1f918", + "metro": "1f687", + "mexico": "1f1f2-1f1fd", + "microbe": "1f9a0", + "micronesia": "1f1eb-1f1f2", + "microphone": "1f3a4", + "microscope": "1f52c", + "middle_finger": "1f595", + "middle_finger_dark_skin_tone": "1f595-1f3ff", + "middle_finger_light_skin_tone": "1f595-1f3fb", + "middle_finger_medium-dark_skin_tone": "1f595-1f3fe", + "middle_finger_medium-light_skin_tone": "1f595-1f3fc", + "middle_finger_medium_skin_tone": "1f595-1f3fd", + "military_helmet": "1fa96", + "milk_glass": "1f95b", + "milky_way": "1f30c", + "minibus": "1f690", + "minidisc": "1f4bd", + "mirror": "1fa9e", + "mirror_ball": "1faa9", + "mobile": "1f4f1", + "mobile_phone_off": "1f4f4", + "moldova": "1f1f2-1f1e9", + "monaco": "1f1f2-1f1e8", + "money_mouth_face": "1f911", + "money_with_wings": "1f4b8", + "moneybag": "1f4b0", + "mongolia": "1f1f2-1f1f3", + "monkey": "1f412", + "monkey_face": "1f435", + "monocle_face": "1f9d0", + "monorail": "1f69d", + "montenegro": "1f1f2-1f1ea", + "montserrat": "1f1f2-1f1f8", + "moon": "1f314", + "moon_cake": "1f96e", + "moose": "1face", + "morocco": "1f1f2-1f1e6", + "mortar_board": "1f393", + "mosque": "1f54c", + "mosquito": "1f99f", + "motor_boat": "1f6e5-fe0f", + "motor_scooter": "1f6f5", + "motorcycle": "1f3cd-fe0f", + "motorized_wheelchair": "1f9bc", + "motorway": "1f6e3-fe0f", + "mount_fuji": "1f5fb", + "mountain": "26f0-fe0f", + "mountain_bicyclist": "1f6b5", + "mountain_biking_man": "1f6b5-200d-2642-fe0f", + "mountain_biking_woman": "1f6b5-200d-2640-fe0f", + "mountain_cableway": "1f6a0", + "mountain_railway": "1f69e", + "mountain_snow": "1f3d4-fe0f", + "mouse": "1f42d", + "mouse2": "1f401", + "mouse_trap": "1faa4", + "movie_camera": "1f3a5", + "moyai": "1f5ff", + "mozambique": "1f1f2-1f1ff", + "mrs_claus": "1f936", + "mrs_claus_dark_skin_tone": "1f936-1f3ff", + "mrs_claus_light_skin_tone": "1f936-1f3fb", + "mrs_claus_medium-dark_skin_tone": "1f936-1f3fe", + "mrs_claus_medium-light_skin_tone": "1f936-1f3fc", + "mrs_claus_medium_skin_tone": "1f936-1f3fd", + "muscle": "1f4aa", + "mushroom": "1f344", + "musical_keyboard": "1f3b9", + "musical_note": "1f3b5", + "musical_score": "1f3bc", + "mute": "1f507", + "mx_claus": "1f9d1-200d-1f384", + "mx_claus_dark_skin_tone": "1f9d1-1f3ff-200d-1f384", + "mx_claus_light_skin_tone": "1f9d1-1f3fb-200d-1f384", + "mx_claus_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f384", + "mx_claus_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f384", + "mx_claus_medium_skin_tone": "1f9d1-1f3fd-200d-1f384", + "myanmar": "1f1f2-1f1f2", + "nail_care": "1f485", + "nail_polish_dark_skin_tone": "1f485-1f3ff", + "nail_polish_light_skin_tone": "1f485-1f3fb", + "nail_polish_medium-dark_skin_tone": "1f485-1f3fe", + "nail_polish_medium-light_skin_tone": "1f485-1f3fc", + "nail_polish_medium_skin_tone": "1f485-1f3fd", + "name_badge": "1f4db", + "namibia": "1f1f3-1f1e6", + "national_park": "1f3de-fe0f", + "nauru": "1f1f3-1f1f7", + "nauseated_face": "1f922", + "nazar_amulet": "1f9ff", + "necktie": "1f454", + "negative_squared_cross_mark": "274e", + "nepal": "1f1f3-1f1f5", + "nerd_face": "1f913", + "nest_with_eggs": "1faba", + "nesting_dolls": "1fa86", + "netherlands": "1f1f3-1f1f1", + "neutral_face": "1f610", + "new": "1f195", + "new_caledonia": "1f1f3-1f1e8", + "new_moon": "1f311", + "new_moon_with_face": "1f31a", + "new_zealand": "1f1f3-1f1ff", + "newspaper": "1f4f0", + "newspaper_roll": "1f5de-fe0f", + "next_track_button": "23ed-fe0f", + "ng": "1f196", + "ng_man": "1f645-200d-2642-fe0f", + "ng_woman": "1f645-200d-2640-fe0f", + "nicaragua": "1f1f3-1f1ee", + "niger": "1f1f3-1f1ea", + "nigeria": "1f1f3-1f1ec", + "night_with_stars": "1f303", + "nine": "39-fe0f-20e3", + "ninja": "1f977", + "ninja_dark_skin_tone": "1f977-1f3ff", + "ninja_light_skin_tone": "1f977-1f3fb", + "ninja_medium-dark_skin_tone": "1f977-1f3fe", + "ninja_medium-light_skin_tone": "1f977-1f3fc", + "ninja_medium_skin_tone": "1f977-1f3fd", + "niue": "1f1f3-1f1fa", + "no_bell": "1f515", + "no_bicycles": "1f6b3", + "no_entry": "26d4", + "no_entry_sign": "1f6ab", + "no_good": "1f645", + "no_good_man": "1f645-200d-2642-fe0f", + "no_good_woman": "1f645-200d-2640-fe0f", + "no_mobile_phones": "1f4f5", + "no_mouth": "1f636", + "no_pedestrians": "1f6b7", + "no_smoking": "1f6ad", + "non-potable_water": "1f6b1", + "norfolk_island": "1f1f3-1f1eb", + "north_korea": "1f1f0-1f1f5", + "northern_mariana_islands": "1f1f2-1f1f5", + "norway": "1f1f3-1f1f4", + "nose": "1f443", + "nose_dark_skin_tone": "1f443-1f3ff", + "nose_light_skin_tone": "1f443-1f3fb", + "nose_medium-dark_skin_tone": "1f443-1f3fe", + "nose_medium-light_skin_tone": "1f443-1f3fc", + "nose_medium_skin_tone": "1f443-1f3fd", + "notebook": "1f4d3", + "notebook_with_decorative_cover": "1f4d4", + "notes": "1f3b6", + "nut_and_bolt": "1f529", + "o": "2b55", + "o2": "1f17e-fe0f", + "ocean": "1f30a", + "octopus": "1f419", + "oden": "1f362", + "office": "1f3e2", + "office_worker": "1f9d1-200d-1f4bc", + "office_worker_dark_skin_tone": "1f9d1-1f3ff-200d-1f4bc", + "office_worker_light_skin_tone": "1f9d1-1f3fb-200d-1f4bc", + "office_worker_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f4bc", + "office_worker_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f4bc", + "office_worker_medium_skin_tone": "1f9d1-1f3fd-200d-1f4bc", + "oil_drum": "1f6e2-fe0f", + "ok": "1f197", + "ok_hand": "1f44c", + "ok_hand_dark_skin_tone": "1f44c-1f3ff", + "ok_hand_light_skin_tone": "1f44c-1f3fb", + "ok_hand_medium-dark_skin_tone": "1f44c-1f3fe", + "ok_hand_medium-light_skin_tone": "1f44c-1f3fc", + "ok_hand_medium_skin_tone": "1f44c-1f3fd", + "ok_man": "1f646-200d-2642-fe0f", + "ok_person": "1f646", + "ok_woman": "1f646-200d-2640-fe0f", + "old_key": "1f5dd-fe0f", + "old_man_dark_skin_tone": "1f474-1f3ff", + "old_man_light_skin_tone": "1f474-1f3fb", + "old_man_medium-dark_skin_tone": "1f474-1f3fe", + "old_man_medium-light_skin_tone": "1f474-1f3fc", + "old_man_medium_skin_tone": "1f474-1f3fd", + "old_woman_dark_skin_tone": "1f475-1f3ff", + "old_woman_light_skin_tone": "1f475-1f3fb", + "old_woman_medium-dark_skin_tone": "1f475-1f3fe", + "old_woman_medium-light_skin_tone": "1f475-1f3fc", + "old_woman_medium_skin_tone": "1f475-1f3fd", + "older_adult": "1f9d3", + "older_man": "1f474", + "older_person_dark_skin_tone": "1f9d3-1f3ff", + "older_person_light_skin_tone": "1f9d3-1f3fb", + "older_person_medium-dark_skin_tone": "1f9d3-1f3fe", + "older_person_medium-light_skin_tone": "1f9d3-1f3fc", + "older_person_medium_skin_tone": "1f9d3-1f3fd", + "older_woman": "1f475", + "olive": "1fad2", + "om": "1f549-fe0f", + "oman": "1f1f4-1f1f2", + "on": "1f51b", + "oncoming_automobile": "1f698", + "oncoming_bus": "1f68d", + "oncoming_fist_dark_skin_tone": "1f44a-1f3ff", + "oncoming_fist_light_skin_tone": "1f44a-1f3fb", + "oncoming_fist_medium-dark_skin_tone": "1f44a-1f3fe", + "oncoming_fist_medium-light_skin_tone": "1f44a-1f3fc", + "oncoming_fist_medium_skin_tone": "1f44a-1f3fd", + "oncoming_police_car": "1f694", + "oncoming_taxi": "1f696", + "one": "31-fe0f-20e3", + "one_piece_swimsuit": "1fa71", + "onion": "1f9c5", + "open_book": "1f4d6", + "open_file_folder": "1f4c2", + "open_hands": "1f450", + "open_hands_dark_skin_tone": "1f450-1f3ff", + "open_hands_light_skin_tone": "1f450-1f3fb", + "open_hands_medium-dark_skin_tone": "1f450-1f3fe", + "open_hands_medium-light_skin_tone": "1f450-1f3fc", + "open_hands_medium_skin_tone": "1f450-1f3fd", + "open_mouth": "1f62e", + "open_umbrella": "2602-fe0f", + "ophiuchus": "26ce", + "orange": "1f34a", + "orange_book": "1f4d9", + "orange_circle": "1f7e0", + "orange_heart": "1f9e1", + "orange_square": "1f7e7", + "orangutan": "1f9a7", + "orthodox_cross": "2626-fe0f", + "otter": "1f9a6", + "outbox_tray": "1f4e4", + "owl": "1f989", + "ox": "1f402", + "oyster": "1f9aa", + "package": "1f4e6", + "page_facing_up": "1f4c4", + "page_with_curl": "1f4c3", + "pager": "1f4df", + "paintbrush": "1f58c-fe0f", + "pakistan": "1f1f5-1f1f0", + "palau": "1f1f5-1f1fc", + "palestinian_territories": "1f1f5-1f1f8", + "palm_down_hand": "1faf3", + "palm_down_hand_dark_skin_tone": "1faf3-1f3ff", + "palm_down_hand_light_skin_tone": "1faf3-1f3fb", + "palm_down_hand_medium-dark_skin_tone": "1faf3-1f3fe", + "palm_down_hand_medium-light_skin_tone": "1faf3-1f3fc", + "palm_down_hand_medium_skin_tone": "1faf3-1f3fd", + "palm_tree": "1f334", + "palm_up_hand": "1faf4", + "palm_up_hand_dark_skin_tone": "1faf4-1f3ff", + "palm_up_hand_light_skin_tone": "1faf4-1f3fb", + "palm_up_hand_medium-dark_skin_tone": "1faf4-1f3fe", + "palm_up_hand_medium-light_skin_tone": "1faf4-1f3fc", + "palm_up_hand_medium_skin_tone": "1faf4-1f3fd", + "palms_up_together": "1f932", + "palms_up_together_dark_skin_tone": "1f932-1f3ff", + "palms_up_together_light_skin_tone": "1f932-1f3fb", + "palms_up_together_medium-dark_skin_tone": "1f932-1f3fe", + "palms_up_together_medium-light_skin_tone": "1f932-1f3fc", + "palms_up_together_medium_skin_tone": "1f932-1f3fd", + "panama": "1f1f5-1f1e6", + "pancakes": "1f95e", + "panda_face": "1f43c", + "paperclip": "1f4ce", + "paperclips": "1f587-fe0f", + "papua_new_guinea": "1f1f5-1f1ec", + "parachute": "1fa82", + "paraguay": "1f1f5-1f1fe", + "parasol_on_ground": "26f1-fe0f", + "parking": "1f17f-fe0f", + "parrot": "1f99c", + "part_alternation_mark": "303d-fe0f", + "partly_sunny": "26c5", + "partying_face": "1f973", + "passenger_ship": "1f6f3-fe0f", + "passport_control": "1f6c2", + "pause_button": "23f8-fe0f", + "paw_prints": "1f43e", + "pea_pod": "1fadb", + "peace_symbol": "262e-fe0f", + "peach": "1f351", + "peacock": "1f99a", + "peanuts": "1f95c", + "pear": "1f350", + "pen": "1f58a-fe0f", + "pencil": "1f4dd", + "pencil2": "270f-fe0f", + "penguin": "1f427", + "pensive": "1f614", + "people_holding_hands": "1f9d1-200d-1f91d-200d-1f9d1", + "people_holding_hands_dark_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3ff", + "people_holding_hands_dark_skin_tone_light_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fb", + "people_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fe", + "people_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fc", + "people_holding_hands_dark_skin_tone_medium_skin_tone": "1f9d1-1f3ff-200d-1f91d-200d-1f9d1-1f3fd", + "people_holding_hands_light_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fb", + "people_holding_hands_light_skin_tone_dark_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3ff", + "people_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fe", + "people_holding_hands_light_skin_tone_medium-light_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fc", + "people_holding_hands_light_skin_tone_medium_skin_tone": "1f9d1-1f3fb-200d-1f91d-200d-1f9d1-1f3fd", + "people_holding_hands_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fe", + "people_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3ff", + "people_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fb", + "people_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fc", + "people_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f9d1-1f3fe-200d-1f91d-200d-1f9d1-1f3fd", + "people_holding_hands_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fc", + "people_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3ff", + "people_holding_hands_medium-light_skin_tone_light_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fb", + "people_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fe", + "people_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f9d1-1f3fc-200d-1f91d-200d-1f9d1-1f3fd", + "people_holding_hands_medium_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fd", + "people_holding_hands_medium_skin_tone_dark_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3ff", + "people_holding_hands_medium_skin_tone_light_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fb", + "people_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fe", + "people_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f9d1-1f3fd-200d-1f91d-200d-1f9d1-1f3fc", + "people_hugging": "1fac2", + "performing_arts": "1f3ad", + "persevere": "1f623", + "person_bald": "1f9d1-200d-1f9b2", + "person_biking_dark_skin_tone": "1f6b4-1f3ff", + "person_biking_light_skin_tone": "1f6b4-1f3fb", + "person_biking_medium-dark_skin_tone": "1f6b4-1f3fe", + "person_biking_medium-light_skin_tone": "1f6b4-1f3fc", + "person_biking_medium_skin_tone": "1f6b4-1f3fd", + "person_bouncing_ball_dark_skin_tone": "26f9-1f3ff", + "person_bouncing_ball_light_skin_tone": "26f9-1f3fb", + "person_bouncing_ball_medium-dark_skin_tone": "26f9-1f3fe", + "person_bouncing_ball_medium-light_skin_tone": "26f9-1f3fc", + "person_bouncing_ball_medium_skin_tone": "26f9-1f3fd", + "person_bowing_dark_skin_tone": "1f647-1f3ff", + "person_bowing_light_skin_tone": "1f647-1f3fb", + "person_bowing_medium-dark_skin_tone": "1f647-1f3fe", + "person_bowing_medium-light_skin_tone": "1f647-1f3fc", + "person_bowing_medium_skin_tone": "1f647-1f3fd", + "person_cartwheeling_dark_skin_tone": "1f938-1f3ff", + "person_cartwheeling_light_skin_tone": "1f938-1f3fb", + "person_cartwheeling_medium-dark_skin_tone": "1f938-1f3fe", + "person_cartwheeling_medium-light_skin_tone": "1f938-1f3fc", + "person_cartwheeling_medium_skin_tone": "1f938-1f3fd", + "person_climbing_dark_skin_tone": "1f9d7-1f3ff", + "person_climbing_light_skin_tone": "1f9d7-1f3fb", + "person_climbing_medium-dark_skin_tone": "1f9d7-1f3fe", + "person_climbing_medium-light_skin_tone": "1f9d7-1f3fc", + "person_climbing_medium_skin_tone": "1f9d7-1f3fd", + "person_curly_hair": "1f9d1-200d-1f9b1", + "person_dark_skin_tone": "1f9d1-1f3ff", + "person_dark_skin_tone_bald": "1f9d1-1f3ff-200d-1f9b2", + "person_dark_skin_tone_beard": "1f9d4-1f3ff", + "person_dark_skin_tone_blond_hair": "1f471-1f3ff", + "person_dark_skin_tone_curly_hair": "1f9d1-1f3ff-200d-1f9b1", + "person_dark_skin_tone_red_hair": "1f9d1-1f3ff-200d-1f9b0", + "person_dark_skin_tone_white_hair": "1f9d1-1f3ff-200d-1f9b3", + "person_facepalming_dark_skin_tone": "1f926-1f3ff", + "person_facepalming_light_skin_tone": "1f926-1f3fb", + "person_facepalming_medium-dark_skin_tone": "1f926-1f3fe", + "person_facepalming_medium-light_skin_tone": "1f926-1f3fc", + "person_facepalming_medium_skin_tone": "1f926-1f3fd", + "person_feeding_baby": "1f9d1-200d-1f37c", + "person_feeding_baby_dark_skin_tone": "1f9d1-1f3ff-200d-1f37c", + "person_feeding_baby_light_skin_tone": "1f9d1-1f3fb-200d-1f37c", + "person_feeding_baby_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f37c", + "person_feeding_baby_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f37c", + "person_feeding_baby_medium_skin_tone": "1f9d1-1f3fd-200d-1f37c", + "person_fencing": "1f93a", + "person_frowning_dark_skin_tone": "1f64d-1f3ff", + "person_frowning_light_skin_tone": "1f64d-1f3fb", + "person_frowning_medium-dark_skin_tone": "1f64d-1f3fe", + "person_frowning_medium-light_skin_tone": "1f64d-1f3fc", + "person_frowning_medium_skin_tone": "1f64d-1f3fd", + "person_gesturing_no_dark_skin_tone": "1f645-1f3ff", + "person_gesturing_no_light_skin_tone": "1f645-1f3fb", + "person_gesturing_no_medium-dark_skin_tone": "1f645-1f3fe", + "person_gesturing_no_medium-light_skin_tone": "1f645-1f3fc", + "person_gesturing_no_medium_skin_tone": "1f645-1f3fd", + "person_gesturing_ok_dark_skin_tone": "1f646-1f3ff", + "person_gesturing_ok_light_skin_tone": "1f646-1f3fb", + "person_gesturing_ok_medium-dark_skin_tone": "1f646-1f3fe", + "person_gesturing_ok_medium-light_skin_tone": "1f646-1f3fc", + "person_gesturing_ok_medium_skin_tone": "1f646-1f3fd", + "person_getting_haircut_dark_skin_tone": "1f487-1f3ff", + "person_getting_haircut_light_skin_tone": "1f487-1f3fb", + "person_getting_haircut_medium-dark_skin_tone": "1f487-1f3fe", + "person_getting_haircut_medium-light_skin_tone": "1f487-1f3fc", + "person_getting_haircut_medium_skin_tone": "1f487-1f3fd", + "person_getting_massage_dark_skin_tone": "1f486-1f3ff", + "person_getting_massage_light_skin_tone": "1f486-1f3fb", + "person_getting_massage_medium-dark_skin_tone": "1f486-1f3fe", + "person_getting_massage_medium-light_skin_tone": "1f486-1f3fc", + "person_getting_massage_medium_skin_tone": "1f486-1f3fd", + "person_golfing_dark_skin_tone": "1f3cc-1f3ff", + "person_golfing_light_skin_tone": "1f3cc-1f3fb", + "person_golfing_medium-dark_skin_tone": "1f3cc-1f3fe", + "person_golfing_medium-light_skin_tone": "1f3cc-1f3fc", + "person_golfing_medium_skin_tone": "1f3cc-1f3fd", + "person_in_bed_dark_skin_tone": "1f6cc-1f3ff", + "person_in_bed_light_skin_tone": "1f6cc-1f3fb", + "person_in_bed_medium-dark_skin_tone": "1f6cc-1f3fe", + "person_in_bed_medium-light_skin_tone": "1f6cc-1f3fc", + "person_in_bed_medium_skin_tone": "1f6cc-1f3fd", + "person_in_lotus_position_dark_skin_tone": "1f9d8-1f3ff", + "person_in_lotus_position_light_skin_tone": "1f9d8-1f3fb", + "person_in_lotus_position_medium-dark_skin_tone": "1f9d8-1f3fe", + "person_in_lotus_position_medium-light_skin_tone": "1f9d8-1f3fc", + "person_in_lotus_position_medium_skin_tone": "1f9d8-1f3fd", + "person_in_manual_wheelchair": "1f9d1-200d-1f9bd", + "person_in_manual_wheelchair_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bd", + "person_in_manual_wheelchair_facing_right": "1f9d1-200d-1f9bd-200d-27a1-fe0f", + "person_in_manual_wheelchair_facing_right_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bd-200d-27a1-fe0f", + "person_in_manual_wheelchair_facing_right_light_skin_tone": "1f9d1-1f3fb-200d-1f9bd-200d-27a1-fe0f", + "person_in_manual_wheelchair_facing_right_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bd-200d-27a1-fe0f", + "person_in_manual_wheelchair_facing_right_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bd-200d-27a1-fe0f", + "person_in_manual_wheelchair_facing_right_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bd-200d-27a1-fe0f", + "person_in_manual_wheelchair_light_skin_tone": "1f9d1-1f3fb-200d-1f9bd", + "person_in_manual_wheelchair_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bd", + "person_in_manual_wheelchair_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bd", + "person_in_manual_wheelchair_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bd", + "person_in_motorized_wheelchair": "1f9d1-200d-1f9bc", + "person_in_motorized_wheelchair_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bc", + "person_in_motorized_wheelchair_facing_right": "1f9d1-200d-1f9bc-200d-27a1-fe0f", + "person_in_motorized_wheelchair_facing_right_dark_skin_tone": "1f9d1-1f3ff-200d-1f9bc-200d-27a1-fe0f", + "person_in_motorized_wheelchair_facing_right_light_skin_tone": "1f9d1-1f3fb-200d-1f9bc-200d-27a1-fe0f", + "person_in_motorized_wheelchair_facing_right_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bc-200d-27a1-fe0f", + "person_in_motorized_wheelchair_facing_right_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bc-200d-27a1-fe0f", + "person_in_motorized_wheelchair_facing_right_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bc-200d-27a1-fe0f", + "person_in_motorized_wheelchair_light_skin_tone": "1f9d1-1f3fb-200d-1f9bc", + "person_in_motorized_wheelchair_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9bc", + "person_in_motorized_wheelchair_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9bc", + "person_in_motorized_wheelchair_medium_skin_tone": "1f9d1-1f3fd-200d-1f9bc", + "person_in_steamy_room_dark_skin_tone": "1f9d6-1f3ff", + "person_in_steamy_room_light_skin_tone": "1f9d6-1f3fb", + "person_in_steamy_room_medium-dark_skin_tone": "1f9d6-1f3fe", + "person_in_steamy_room_medium-light_skin_tone": "1f9d6-1f3fc", + "person_in_steamy_room_medium_skin_tone": "1f9d6-1f3fd", + "person_in_suit_levitating_dark_skin_tone": "1f574-1f3ff", + "person_in_suit_levitating_light_skin_tone": "1f574-1f3fb", + "person_in_suit_levitating_medium-dark_skin_tone": "1f574-1f3fe", + "person_in_suit_levitating_medium-light_skin_tone": "1f574-1f3fc", + "person_in_suit_levitating_medium_skin_tone": "1f574-1f3fd", + "person_in_tuxedo": "1f935", + "person_in_tuxedo_dark_skin_tone": "1f935-1f3ff", + "person_in_tuxedo_light_skin_tone": "1f935-1f3fb", + "person_in_tuxedo_medium-dark_skin_tone": "1f935-1f3fe", + "person_in_tuxedo_medium-light_skin_tone": "1f935-1f3fc", + "person_in_tuxedo_medium_skin_tone": "1f935-1f3fd", + "person_juggling_dark_skin_tone": "1f939-1f3ff", + "person_juggling_light_skin_tone": "1f939-1f3fb", + "person_juggling_medium-dark_skin_tone": "1f939-1f3fe", + "person_juggling_medium-light_skin_tone": "1f939-1f3fc", + "person_juggling_medium_skin_tone": "1f939-1f3fd", + "person_kneeling_dark_skin_tone": "1f9ce-1f3ff", + "person_kneeling_facing_right": "1f9ce-200d-27a1-fe0f", + "person_kneeling_facing_right_dark_skin_tone": "1f9ce-1f3ff-200d-27a1-fe0f", + "person_kneeling_facing_right_light_skin_tone": "1f9ce-1f3fb-200d-27a1-fe0f", + "person_kneeling_facing_right_medium-dark_skin_tone": "1f9ce-1f3fe-200d-27a1-fe0f", + "person_kneeling_facing_right_medium-light_skin_tone": "1f9ce-1f3fc-200d-27a1-fe0f", + "person_kneeling_facing_right_medium_skin_tone": "1f9ce-1f3fd-200d-27a1-fe0f", + "person_kneeling_light_skin_tone": "1f9ce-1f3fb", + "person_kneeling_medium-dark_skin_tone": "1f9ce-1f3fe", + "person_kneeling_medium-light_skin_tone": "1f9ce-1f3fc", + "person_kneeling_medium_skin_tone": "1f9ce-1f3fd", + "person_lifting_weights_dark_skin_tone": "1f3cb-1f3ff", + "person_lifting_weights_light_skin_tone": "1f3cb-1f3fb", + "person_lifting_weights_medium-dark_skin_tone": "1f3cb-1f3fe", + "person_lifting_weights_medium-light_skin_tone": "1f3cb-1f3fc", + "person_lifting_weights_medium_skin_tone": "1f3cb-1f3fd", + "person_light_skin_tone": "1f9d1-1f3fb", + "person_light_skin_tone_bald": "1f9d1-1f3fb-200d-1f9b2", + "person_light_skin_tone_beard": "1f9d4-1f3fb", + "person_light_skin_tone_blond_hair": "1f471-1f3fb", + "person_light_skin_tone_curly_hair": "1f9d1-1f3fb-200d-1f9b1", + "person_light_skin_tone_red_hair": "1f9d1-1f3fb-200d-1f9b0", + "person_light_skin_tone_white_hair": "1f9d1-1f3fb-200d-1f9b3", + "person_medium-dark_skin_tone": "1f9d1-1f3fe", + "person_medium-dark_skin_tone_bald": "1f9d1-1f3fe-200d-1f9b2", + "person_medium-dark_skin_tone_beard": "1f9d4-1f3fe", + "person_medium-dark_skin_tone_blond_hair": "1f471-1f3fe", + "person_medium-dark_skin_tone_curly_hair": "1f9d1-1f3fe-200d-1f9b1", + "person_medium-dark_skin_tone_red_hair": "1f9d1-1f3fe-200d-1f9b0", + "person_medium-dark_skin_tone_white_hair": "1f9d1-1f3fe-200d-1f9b3", + "person_medium-light_skin_tone": "1f9d1-1f3fc", + "person_medium-light_skin_tone_bald": "1f9d1-1f3fc-200d-1f9b2", + "person_medium-light_skin_tone_beard": "1f9d4-1f3fc", + "person_medium-light_skin_tone_blond_hair": "1f471-1f3fc", + "person_medium-light_skin_tone_curly_hair": "1f9d1-1f3fc-200d-1f9b1", + "person_medium-light_skin_tone_red_hair": "1f9d1-1f3fc-200d-1f9b0", + "person_medium-light_skin_tone_white_hair": "1f9d1-1f3fc-200d-1f9b3", + "person_medium_skin_tone": "1f9d1-1f3fd", + "person_medium_skin_tone_bald": "1f9d1-1f3fd-200d-1f9b2", + "person_medium_skin_tone_beard": "1f9d4-1f3fd", + "person_medium_skin_tone_blond_hair": "1f471-1f3fd", + "person_medium_skin_tone_curly_hair": "1f9d1-1f3fd-200d-1f9b1", + "person_medium_skin_tone_red_hair": "1f9d1-1f3fd-200d-1f9b0", + "person_medium_skin_tone_white_hair": "1f9d1-1f3fd-200d-1f9b3", + "person_mountain_biking_dark_skin_tone": "1f6b5-1f3ff", + "person_mountain_biking_light_skin_tone": "1f6b5-1f3fb", + "person_mountain_biking_medium-dark_skin_tone": "1f6b5-1f3fe", + "person_mountain_biking_medium-light_skin_tone": "1f6b5-1f3fc", + "person_mountain_biking_medium_skin_tone": "1f6b5-1f3fd", + "person_playing_handball_dark_skin_tone": "1f93e-1f3ff", + "person_playing_handball_light_skin_tone": "1f93e-1f3fb", + "person_playing_handball_medium-dark_skin_tone": "1f93e-1f3fe", + "person_playing_handball_medium-light_skin_tone": "1f93e-1f3fc", + "person_playing_handball_medium_skin_tone": "1f93e-1f3fd", + "person_playing_water_polo_dark_skin_tone": "1f93d-1f3ff", + "person_playing_water_polo_light_skin_tone": "1f93d-1f3fb", + "person_playing_water_polo_medium-dark_skin_tone": "1f93d-1f3fe", + "person_playing_water_polo_medium-light_skin_tone": "1f93d-1f3fc", + "person_playing_water_polo_medium_skin_tone": "1f93d-1f3fd", + "person_pouting_dark_skin_tone": "1f64e-1f3ff", + "person_pouting_light_skin_tone": "1f64e-1f3fb", + "person_pouting_medium-dark_skin_tone": "1f64e-1f3fe", + "person_pouting_medium-light_skin_tone": "1f64e-1f3fc", + "person_pouting_medium_skin_tone": "1f64e-1f3fd", + "person_raising_hand_dark_skin_tone": "1f64b-1f3ff", + "person_raising_hand_light_skin_tone": "1f64b-1f3fb", + "person_raising_hand_medium-dark_skin_tone": "1f64b-1f3fe", + "person_raising_hand_medium-light_skin_tone": "1f64b-1f3fc", + "person_raising_hand_medium_skin_tone": "1f64b-1f3fd", + "person_red_hair": "1f9d1-200d-1f9b0", + "person_rowing_boat_dark_skin_tone": "1f6a3-1f3ff", + "person_rowing_boat_light_skin_tone": "1f6a3-1f3fb", + "person_rowing_boat_medium-dark_skin_tone": "1f6a3-1f3fe", + "person_rowing_boat_medium-light_skin_tone": "1f6a3-1f3fc", + "person_rowing_boat_medium_skin_tone": "1f6a3-1f3fd", + "person_running_dark_skin_tone": "1f3c3-1f3ff", + "person_running_facing_right": "1f3c3-200d-27a1-fe0f", + "person_running_facing_right_dark_skin_tone": "1f3c3-1f3ff-200d-27a1-fe0f", + "person_running_facing_right_light_skin_tone": "1f3c3-1f3fb-200d-27a1-fe0f", + "person_running_facing_right_medium-dark_skin_tone": "1f3c3-1f3fe-200d-27a1-fe0f", + "person_running_facing_right_medium-light_skin_tone": "1f3c3-1f3fc-200d-27a1-fe0f", + "person_running_facing_right_medium_skin_tone": "1f3c3-1f3fd-200d-27a1-fe0f", + "person_running_light_skin_tone": "1f3c3-1f3fb", + "person_running_medium-dark_skin_tone": "1f3c3-1f3fe", + "person_running_medium-light_skin_tone": "1f3c3-1f3fc", + "person_running_medium_skin_tone": "1f3c3-1f3fd", + "person_shrugging_dark_skin_tone": "1f937-1f3ff", + "person_shrugging_light_skin_tone": "1f937-1f3fb", + "person_shrugging_medium-dark_skin_tone": "1f937-1f3fe", + "person_shrugging_medium-light_skin_tone": "1f937-1f3fc", + "person_shrugging_medium_skin_tone": "1f937-1f3fd", + "person_standing_dark_skin_tone": "1f9cd-1f3ff", + "person_standing_light_skin_tone": "1f9cd-1f3fb", + "person_standing_medium-dark_skin_tone": "1f9cd-1f3fe", + "person_standing_medium-light_skin_tone": "1f9cd-1f3fc", + "person_standing_medium_skin_tone": "1f9cd-1f3fd", + "person_surfing_dark_skin_tone": "1f3c4-1f3ff", + "person_surfing_light_skin_tone": "1f3c4-1f3fb", + "person_surfing_medium-dark_skin_tone": "1f3c4-1f3fe", + "person_surfing_medium-light_skin_tone": "1f3c4-1f3fc", + "person_surfing_medium_skin_tone": "1f3c4-1f3fd", + "person_swimming_dark_skin_tone": "1f3ca-1f3ff", + "person_swimming_light_skin_tone": "1f3ca-1f3fb", + "person_swimming_medium-dark_skin_tone": "1f3ca-1f3fe", + "person_swimming_medium-light_skin_tone": "1f3ca-1f3fc", + "person_swimming_medium_skin_tone": "1f3ca-1f3fd", + "person_taking_bath_dark_skin_tone": "1f6c0-1f3ff", + "person_taking_bath_light_skin_tone": "1f6c0-1f3fb", + "person_taking_bath_medium-dark_skin_tone": "1f6c0-1f3fe", + "person_taking_bath_medium-light_skin_tone": "1f6c0-1f3fc", + "person_taking_bath_medium_skin_tone": "1f6c0-1f3fd", + "person_tipping_hand_dark_skin_tone": "1f481-1f3ff", + "person_tipping_hand_light_skin_tone": "1f481-1f3fb", + "person_tipping_hand_medium-dark_skin_tone": "1f481-1f3fe", + "person_tipping_hand_medium-light_skin_tone": "1f481-1f3fc", + "person_tipping_hand_medium_skin_tone": "1f481-1f3fd", + "person_walking_dark_skin_tone": "1f6b6-1f3ff", + "person_walking_facing_right": "1f6b6-200d-27a1-fe0f", + "person_walking_facing_right_dark_skin_tone": "1f6b6-1f3ff-200d-27a1-fe0f", + "person_walking_facing_right_light_skin_tone": "1f6b6-1f3fb-200d-27a1-fe0f", + "person_walking_facing_right_medium-dark_skin_tone": "1f6b6-1f3fe-200d-27a1-fe0f", + "person_walking_facing_right_medium-light_skin_tone": "1f6b6-1f3fc-200d-27a1-fe0f", + "person_walking_facing_right_medium_skin_tone": "1f6b6-1f3fd-200d-27a1-fe0f", + "person_walking_light_skin_tone": "1f6b6-1f3fb", + "person_walking_medium-dark_skin_tone": "1f6b6-1f3fe", + "person_walking_medium-light_skin_tone": "1f6b6-1f3fc", + "person_walking_medium_skin_tone": "1f6b6-1f3fd", + "person_wearing_turban_dark_skin_tone": "1f473-1f3ff", + "person_wearing_turban_light_skin_tone": "1f473-1f3fb", + "person_wearing_turban_medium-dark_skin_tone": "1f473-1f3fe", + "person_wearing_turban_medium-light_skin_tone": "1f473-1f3fc", + "person_wearing_turban_medium_skin_tone": "1f473-1f3fd", + "person_white_hair": "1f9d1-200d-1f9b3", + "person_with_crown": "1fac5", + "person_with_crown_dark_skin_tone": "1fac5-1f3ff", + "person_with_crown_light_skin_tone": "1fac5-1f3fb", + "person_with_crown_medium-dark_skin_tone": "1fac5-1f3fe", + "person_with_crown_medium-light_skin_tone": "1fac5-1f3fc", + "person_with_crown_medium_skin_tone": "1fac5-1f3fd", + "person_with_probing_cane": "1f9d1-200d-1f9af", + "person_with_skullcap_dark_skin_tone": "1f472-1f3ff", + "person_with_skullcap_light_skin_tone": "1f472-1f3fb", + "person_with_skullcap_medium-dark_skin_tone": "1f472-1f3fe", + "person_with_skullcap_medium-light_skin_tone": "1f472-1f3fc", + "person_with_skullcap_medium_skin_tone": "1f472-1f3fd", + "person_with_turban": "1f473", + "person_with_veil": "1f470", + "person_with_veil_dark_skin_tone": "1f470-1f3ff", + "person_with_veil_light_skin_tone": "1f470-1f3fb", + "person_with_veil_medium-dark_skin_tone": "1f470-1f3fe", + "person_with_veil_medium-light_skin_tone": "1f470-1f3fc", + "person_with_veil_medium_skin_tone": "1f470-1f3fd", + "person_with_white_cane_dark_skin_tone": "1f9d1-1f3ff-200d-1f9af", + "person_with_white_cane_facing_right": "1f9d1-200d-1f9af-200d-27a1-fe0f", + "person_with_white_cane_facing_right_dark_skin_tone": "1f9d1-1f3ff-200d-1f9af-200d-27a1-fe0f", + "person_with_white_cane_facing_right_light_skin_tone": "1f9d1-1f3fb-200d-1f9af-200d-27a1-fe0f", + "person_with_white_cane_facing_right_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9af-200d-27a1-fe0f", + "person_with_white_cane_facing_right_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9af-200d-27a1-fe0f", + "person_with_white_cane_facing_right_medium_skin_tone": "1f9d1-1f3fd-200d-1f9af-200d-27a1-fe0f", + "person_with_white_cane_light_skin_tone": "1f9d1-1f3fb-200d-1f9af", + "person_with_white_cane_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f9af", + "person_with_white_cane_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f9af", + "person_with_white_cane_medium_skin_tone": "1f9d1-1f3fd-200d-1f9af", + "peru": "1f1f5-1f1ea", + "petri_dish": "1f9eb", + "pewpewpew": "~pewpewpew", + "philippines": "1f1f5-1f1ed", + "phoenix": "1f426-200d-1f525", + "phone": "260e-fe0f", + "pick": "26cf-fe0f", + "pickup_truck": "1f6fb", + "pie": "1f967", + "pig": "1f437", + "pig2": "1f416", + "pig_nose": "1f43d", + "pill": "1f48a", + "pilot": "1f9d1-200d-2708-fe0f", + "pilot_dark_skin_tone": "1f9d1-1f3ff-200d-2708-fe0f", + "pilot_light_skin_tone": "1f9d1-1f3fb-200d-2708-fe0f", + "pilot_medium-dark_skin_tone": "1f9d1-1f3fe-200d-2708-fe0f", + "pilot_medium-light_skin_tone": "1f9d1-1f3fc-200d-2708-fe0f", + "pilot_medium_skin_tone": "1f9d1-1f3fd-200d-2708-fe0f", + "pinata": "1fa85", + "pinched_fingers": "1f90c", + "pinched_fingers_dark_skin_tone": "1f90c-1f3ff", + "pinched_fingers_light_skin_tone": "1f90c-1f3fb", + "pinched_fingers_medium-dark_skin_tone": "1f90c-1f3fe", + "pinched_fingers_medium-light_skin_tone": "1f90c-1f3fc", + "pinched_fingers_medium_skin_tone": "1f90c-1f3fd", + "pinching_hand": "1f90f", + "pinching_hand_dark_skin_tone": "1f90f-1f3ff", + "pinching_hand_light_skin_tone": "1f90f-1f3fb", + "pinching_hand_medium-dark_skin_tone": "1f90f-1f3fe", + "pinching_hand_medium-light_skin_tone": "1f90f-1f3fc", + "pinching_hand_medium_skin_tone": "1f90f-1f3fd", + "pineapple": "1f34d", + "ping_pong": "1f3d3", + "pink_heart": "1fa77", + "pirate_flag": "1f3f4-200d-2620-fe0f", + "pisces": "2653", + "pitcairn_islands": "1f1f5-1f1f3", + "pizza": "1f355", + "placard": "1faa7", + "place_of_worship": "1f6d0", + "plate_with_cutlery": "1f37d-fe0f", + "play_or_pause_button": "23ef-fe0f", + "playground_slide": "1f6dd", + "pleading_face": "1f97a", + "plunger": "1faa0", + "point_down": "1f447", + "point_left": "1f448", + "point_right": "1f449", + "point_up": "261d-fe0f", + "point_up_2": "1f446", + "poland": "1f1f5-1f1f1", + "polar_bear": "1f43b-200d-2744-fe0f", + "police_car": "1f693", + "police_officer": "1f46e", + "police_officer_dark_skin_tone": "1f46e-1f3ff", + "police_officer_light_skin_tone": "1f46e-1f3fb", + "police_officer_medium-dark_skin_tone": "1f46e-1f3fe", + "police_officer_medium-light_skin_tone": "1f46e-1f3fc", + "police_officer_medium_skin_tone": "1f46e-1f3fd", + "policeman": "1f46e-200d-2642-fe0f", + "policewoman": "1f46e-200d-2640-fe0f", + "poodle": "1f429", + "poop": "1f4a9", + "popcorn": "1f37f", + "portugal": "1f1f5-1f1f9", + "post_office": "1f3e3", + "postal_horn": "1f4ef", + "postbox": "1f4ee", + "potable_water": "1f6b0", + "potato": "1f954", + "potted_plant": "1fab4", + "pouch": "1f45d", + "poultry_leg": "1f357", + "pound": "1f4b7", + "pouring_liquid": "1fad7", + "pout": "1f621", + "pouting_cat": "1f63e", + "pouting_face": "1f64e", + "pouting_man": "1f64e-200d-2642-fe0f", + "pouting_woman": "1f64e-200d-2640-fe0f", + "pray": "1f64f", + "prayer_beads": "1f4ff", + "pregnant_man": "1fac3", + "pregnant_man_dark_skin_tone": "1fac3-1f3ff", + "pregnant_man_light_skin_tone": "1fac3-1f3fb", + "pregnant_man_medium-dark_skin_tone": "1fac3-1f3fe", + "pregnant_man_medium-light_skin_tone": "1fac3-1f3fc", + "pregnant_man_medium_skin_tone": "1fac3-1f3fd", + "pregnant_person": "1fac4", + "pregnant_person_dark_skin_tone": "1fac4-1f3ff", + "pregnant_person_light_skin_tone": "1fac4-1f3fb", + "pregnant_person_medium-dark_skin_tone": "1fac4-1f3fe", + "pregnant_person_medium-light_skin_tone": "1fac4-1f3fc", + "pregnant_person_medium_skin_tone": "1fac4-1f3fd", + "pregnant_woman": "1f930", + "pregnant_woman_dark_skin_tone": "1f930-1f3ff", + "pregnant_woman_light_skin_tone": "1f930-1f3fb", + "pregnant_woman_medium-dark_skin_tone": "1f930-1f3fe", + "pregnant_woman_medium-light_skin_tone": "1f930-1f3fc", + "pregnant_woman_medium_skin_tone": "1f930-1f3fd", + "pretzel": "1f968", + "previous_track_button": "23ee-fe0f", + "prince": "1f934", + "prince_dark_skin_tone": "1f934-1f3ff", + "prince_light_skin_tone": "1f934-1f3fb", + "prince_medium-dark_skin_tone": "1f934-1f3fe", + "prince_medium-light_skin_tone": "1f934-1f3fc", + "prince_medium_skin_tone": "1f934-1f3fd", + "princess": "1f478", + "princess_dark_skin_tone": "1f478-1f3ff", + "princess_light_skin_tone": "1f478-1f3fb", + "princess_medium-dark_skin_tone": "1f478-1f3fe", + "princess_medium-light_skin_tone": "1f478-1f3fc", + "princess_medium_skin_tone": "1f478-1f3fd", + "printer": "1f5a8-fe0f", + "probing_cane": "1f9af", + "puerto_rico": "1f1f5-1f1f7", + "punch": "1f44a", + "purple_circle": "1f7e3", + "purple_heart": "1f49c", + "purple_square": "1f7ea", + "purse": "1f45b", + "pushpin": "1f4cc", + "put_litter_in_its_place": "1f6ae", + "qatar": "1f1f6-1f1e6", + "question": "2753", + "rabbit": "1f430", + "rabbit2": "1f407", + "raccoon": "1f99d", + "racehorse": "1f40e", + "racing_car": "1f3ce-fe0f", + "radio": "1f4fb", + "radio_button": "1f518", + "radioactive": "2622-fe0f", + "rage": "1f621", + "railway_car": "1f683", + "railway_track": "1f6e4-fe0f", + "rainbow": "1f308", + "rainbow_flag": "1f3f3-fe0f-200d-1f308", + "raised_back_of_hand": "1f91a", + "raised_back_of_hand_dark_skin_tone": "1f91a-1f3ff", + "raised_back_of_hand_light_skin_tone": "1f91a-1f3fb", + "raised_back_of_hand_medium-dark_skin_tone": "1f91a-1f3fe", + "raised_back_of_hand_medium-light_skin_tone": "1f91a-1f3fc", + "raised_back_of_hand_medium_skin_tone": "1f91a-1f3fd", + "raised_eyebrow": "1f928", + "raised_fist_dark_skin_tone": "270a-1f3ff", + "raised_fist_light_skin_tone": "270a-1f3fb", + "raised_fist_medium-dark_skin_tone": "270a-1f3fe", + "raised_fist_medium-light_skin_tone": "270a-1f3fc", + "raised_fist_medium_skin_tone": "270a-1f3fd", + "raised_hand": "270b", + "raised_hand_dark_skin_tone": "270b-1f3ff", + "raised_hand_light_skin_tone": "270b-1f3fb", + "raised_hand_medium-dark_skin_tone": "270b-1f3fe", + "raised_hand_medium-light_skin_tone": "270b-1f3fc", + "raised_hand_medium_skin_tone": "270b-1f3fd", + "raised_hand_with_fingers_splayed": "1f590-fe0f", + "raised_hands": "1f64c", + "raising_hand": "1f64b", + "raising_hand_man": "1f64b-200d-2642-fe0f", + "raising_hand_woman": "1f64b-200d-2640-fe0f", + "raising_hands_dark_skin_tone": "1f64c-1f3ff", + "raising_hands_light_skin_tone": "1f64c-1f3fb", + "raising_hands_medium-dark_skin_tone": "1f64c-1f3fe", + "raising_hands_medium-light_skin_tone": "1f64c-1f3fc", + "raising_hands_medium_skin_tone": "1f64c-1f3fd", + "ram": "1f40f", + "ramen": "1f35c", + "rat": "1f400", + "razor": "1fa92", + "receipt": "1f9fe", + "record_button": "23fa-fe0f", + "recycle": "267b-fe0f", + "red_car": "1f697", + "red_circle": "1f534", + "red_envelope": "1f9e7", + "red_haired_man": "1f468-200d-1f9b0", + "red_haired_woman": "1f469-200d-1f9b0", + "red_square": "1f7e5", + "registered": "ae-fe0f", + "relaxed": "263a-fe0f", + "relieved": "1f60c", + "reminder_ribbon": "1f397-fe0f", + "repeat": "1f501", + "repeat_one": "1f502", + "rescue_worker_helmet": "26d1-fe0f", + "restroom": "1f6bb", + "reunion": "1f1f7-1f1ea", + "revolving_hearts": "1f49e", + "rewind": "23ea", + "rhinoceros": "1f98f", + "ribbon": "1f380", + "rice": "1f35a", + "rice_ball": "1f359", + "rice_cracker": "1f358", + "rice_scene": "1f391", + "right-facing_fist_dark_skin_tone": "1f91c-1f3ff", + "right-facing_fist_light_skin_tone": "1f91c-1f3fb", + "right-facing_fist_medium-dark_skin_tone": "1f91c-1f3fe", + "right-facing_fist_medium-light_skin_tone": "1f91c-1f3fc", + "right-facing_fist_medium_skin_tone": "1f91c-1f3fd", + "right_anger_bubble": "1f5ef-fe0f", + "rightwards_hand": "1faf1", + "rightwards_hand_dark_skin_tone": "1faf1-1f3ff", + "rightwards_hand_light_skin_tone": "1faf1-1f3fb", + "rightwards_hand_medium-dark_skin_tone": "1faf1-1f3fe", + "rightwards_hand_medium-light_skin_tone": "1faf1-1f3fc", + "rightwards_hand_medium_skin_tone": "1faf1-1f3fd", + "rightwards_pushing_hand": "1faf8", + "rightwards_pushing_hand_dark_skin_tone": "1faf8-1f3ff", + "rightwards_pushing_hand_light_skin_tone": "1faf8-1f3fb", + "rightwards_pushing_hand_medium-dark_skin_tone": "1faf8-1f3fe", + "rightwards_pushing_hand_medium-light_skin_tone": "1faf8-1f3fc", + "rightwards_pushing_hand_medium_skin_tone": "1faf8-1f3fd", + "ring": "1f48d", + "ring_buoy": "1f6df", + "ringed_planet": "1fa90", + "robot": "1f916", + "rock": "1faa8", + "rocket": "1f680", + "rofl": "1f923", + "roll_eyes": "1f644", + "roll_of_paper": "1f9fb", + "roller_coaster": "1f3a2", + "roller_skate": "1f6fc", + "romania": "1f1f7-1f1f4", + "rooster": "1f413", + "rose": "1f339", + "rosette": "1f3f5-fe0f", + "rotating_light": "1f6a8", + "round_pushpin": "1f4cd", + "rowboat": "1f6a3", + "rowing_man": "1f6a3-200d-2642-fe0f", + "rowing_woman": "1f6a3-200d-2640-fe0f", + "ru": "1f1f7-1f1fa", + "rugby_football": "1f3c9", + "runner": "1f3c3", + "running": "1f3c3", + "running_man": "1f3c3-200d-2642-fe0f", + "running_shirt_with_sash": "1f3bd", + "running_woman": "1f3c3-200d-2640-fe0f", + "rwanda": "1f1f7-1f1fc", + "sa": "1f202-fe0f", + "sad": "1f622", + "safety_pin": "1f9f7", + "safety_vest": "1f9ba", + "sagittarius": "2650", + "sailboat": "26f5", + "sake": "1f376", + "salt": "1f9c2", + "saluting_face": "1fae1", + "samoa": "1f1fc-1f1f8", + "san_marino": "1f1f8-1f1f2", + "sandal": "1f461", + "sandwich": "1f96a", + "santa": "1f385", + "santa_claus_dark_skin_tone": "1f385-1f3ff", + "santa_claus_light_skin_tone": "1f385-1f3fb", + "santa_claus_medium-dark_skin_tone": "1f385-1f3fe", + "santa_claus_medium-light_skin_tone": "1f385-1f3fc", + "santa_claus_medium_skin_tone": "1f385-1f3fd", + "sao_tome_principe": "1f1f8-1f1f9", + "sari": "1f97b", + "sassy_man": "1f481-200d-2642-fe0f", + "sassy_woman": "1f481-200d-2640-fe0f", + "satellite": "1f4e1", + "satisfied": "1f606", + "saudi_arabia": "1f1f8-1f1e6", + "sauna_man": "1f9d6-200d-2642-fe0f", + "sauna_person": "1f9d6", + "sauna_woman": "1f9d6-200d-2640-fe0f", + "sauropod": "1f995", + "saxophone": "1f3b7", + "scarf": "1f9e3", + "school": "1f3eb", + "school_satchel": "1f392", + "scientist": "1f9d1-200d-1f52c", + "scientist_dark_skin_tone": "1f9d1-1f3ff-200d-1f52c", + "scientist_light_skin_tone": "1f9d1-1f3fb-200d-1f52c", + "scientist_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f52c", + "scientist_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f52c", + "scientist_medium_skin_tone": "1f9d1-1f3fd-200d-1f52c", + "scissors": "2702-fe0f", + "scorpion": "1f982", + "scorpius": "264f", + "scotland": "1f3f4-e0067-e0062-e0073-e0063-e0074-e007f", + "scream": "1f631", + "scream_cat": "1f640", + "screwdriver": "1fa9b", + "scroll": "1f4dc", + "seal": "1f9ad", + "seat": "1f4ba", + "secret": "3299-fe0f", + "see_no_evil": "1f648", + "seedling": "1f331", + "selfie": "1f933", + "selfie_dark_skin_tone": "1f933-1f3ff", + "selfie_light_skin_tone": "1f933-1f3fb", + "selfie_medium-dark_skin_tone": "1f933-1f3fe", + "selfie_medium-light_skin_tone": "1f933-1f3fc", + "selfie_medium_skin_tone": "1f933-1f3fd", + "senegal": "1f1f8-1f1f3", + "serbia": "1f1f7-1f1f8", + "service_dog": "1f415-200d-1f9ba", + "seven": "37-fe0f-20e3", + "sewing_needle": "1faa1", + "seychelles": "1f1f8-1f1e8", + "shaking_face": "1fae8", + "shallow_pan_of_food": "1f958", + "shamrock": "2618-fe0f", + "shark": "1f988", + "shaved_ice": "1f367", + "sheep": "1f411", + "shell": "1f41a", + "shield": "1f6e1-fe0f", + "shinto_shrine": "26e9-fe0f", + "ship": "1f6a2", + "shirt": "1f455", + "shit": "~shit", + "shoe": "1f45e", + "shopping": "1f6cd-fe0f", + "shopping_cart": "1f6d2", + "shorts": "1fa73", + "shower": "1f6bf", + "shrimp": "1f990", + "shrug": "1f937", + "shushing_face": "1f92b", + "sierra_leone": "1f1f8-1f1f1", + "sign_of_the_horns_dark_skin_tone": "1f918-1f3ff", + "sign_of_the_horns_light_skin_tone": "1f918-1f3fb", + "sign_of_the_horns_medium-dark_skin_tone": "1f918-1f3fe", + "sign_of_the_horns_medium-light_skin_tone": "1f918-1f3fc", + "sign_of_the_horns_medium_skin_tone": "1f918-1f3fd", + "signal_strength": "1f4f6", + "singapore": "1f1f8-1f1ec", + "singer": "1f9d1-200d-1f3a4", + "singer_dark_skin_tone": "1f9d1-1f3ff-200d-1f3a4", + "singer_light_skin_tone": "1f9d1-1f3fb-200d-1f3a4", + "singer_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3a4", + "singer_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3a4", + "singer_medium_skin_tone": "1f9d1-1f3fd-200d-1f3a4", + "sint_maarten": "1f1f8-1f1fd", + "six": "36-fe0f-20e3", + "six_pointed_star": "1f52f", + "skateboard": "1f6f9", + "ski": "1f3bf", + "skier": "26f7-fe0f", + "skull": "1f480", + "skull_and_crossbones": "2620-fe0f", + "skunk": "1f9a8", + "sled": "1f6f7", + "sleeping": "1f634", + "sleeping_bed": "1f6cc", + "sleepy": "1f62a", + "slightly_frowning_face": "1f641", + "slightly_smiling_face": "1f642", + "slot_machine": "1f3b0", + "sloth": "1f9a5", + "slovakia": "1f1f8-1f1f0", + "slovenia": "1f1f8-1f1ee", + "small_airplane": "1f6e9-fe0f", + "small_blue_diamond": "1f539", + "small_orange_diamond": "1f538", + "small_red_triangle": "1f53a", + "small_red_triangle_down": "1f53b", + "smile": "1f604", + "smile_cat": "1f638", + "smiley": "1f603", + "smiley_cat": "1f63a", + "smiling_face_with_tear": "1f972", + "smiling_face_with_three_hearts": "1f970", + "smiling_imp": "1f608", + "smirk": "1f60f", + "smirk_cat": "1f63c", + "smoking": "1f6ac", + "snail": "1f40c", + "snake": "1f40d", + "sneezing_face": "1f927", + "snowboarder": "1f3c2", + "snowboarder_dark_skin_tone": "1f3c2-1f3ff", + "snowboarder_light_skin_tone": "1f3c2-1f3fb", + "snowboarder_medium-dark_skin_tone": "1f3c2-1f3fe", + "snowboarder_medium-light_skin_tone": "1f3c2-1f3fc", + "snowboarder_medium_skin_tone": "1f3c2-1f3fd", + "snowflake": "2744-fe0f", + "snowman": "26c4", + "snowman_with_snow": "2603-fe0f", + "soap": "1f9fc", + "sob": "1f62d", + "soccer": "26bd", + "socks": "1f9e6", + "softball": "1f94e", + "solomon_islands": "1f1f8-1f1e7", + "somalia": "1f1f8-1f1f4", + "soon": "1f51c", + "sos": "1f198", + "sound": "1f509", + "south_africa": "1f1ff-1f1e6", + "south_georgia_south_sandwich_islands": "1f1ec-1f1f8", + "south_sudan": "1f1f8-1f1f8", + "space_invader": "1f47e", + "spades": "2660-fe0f", + "spaghetti": "1f35d", + "sparkle": "2747-fe0f", + "sparkler": "1f387", + "sparkles": "2728", + "sparkling_heart": "1f496", + "speak_no_evil": "1f64a", + "speaker": "1f508", + "speaking_head": "1f5e3-fe0f", + "speech_balloon": "1f4ac", + "speedboat": "1f6a4", + "spider": "1f577", + "spider_web": "1f578-fe0f", + "spiral_calendar": "1f5d3-fe0f", + "spiral_notepad": "1f5d2-fe0f", + "sponge": "1f9fd", + "spoon": "1f944", + "squid": "1f991", + "sri_lanka": "1f1f1-1f1f0", + "st_barthelemy": "1f1e7-1f1f1", + "st_helena": "1f1f8-1f1ed", + "st_kitts_nevis": "1f1f0-1f1f3", + "st_lucia": "1f1f1-1f1e8", + "st_martin": "1f1f2-1f1eb", + "st_pierre_miquelon": "1f1f5-1f1f2", + "st_vincent_grenadines": "1f1fb-1f1e8", + "stadium": "1f3df-fe0f", + "standing_man": "1f9cd-200d-2642-fe0f", + "standing_person": "1f9cd", + "standing_woman": "1f9cd-200d-2640-fe0f", + "star": "2b50", + "star2": "1f31f", + "star_and_crescent": "262a-fe0f", + "star_of_david": "2721-fe0f", + "star_struck": "1f929", + "stars": "1f320", + "station": "1f689", + "statue_of_liberty": "1f5fd", + "steam_locomotive": "1f682", + "stethoscope": "1fa7a", + "stew": "1f372", + "stop_button": "23f9-fe0f", + "stop_sign": "1f6d1", + "stopwatch": "23f1-fe0f", + "straight_ruler": "1f4cf", + "strawberry": "1f353", + "stuck_out_tongue": "1f61b", + "stuck_out_tongue_closed_eyes": "1f61d", + "stuck_out_tongue_winking_eye": "1f61c", + "student": "1f9d1-200d-1f393", + "student_dark_skin_tone": "1f9d1-1f3ff-200d-1f393", + "student_light_skin_tone": "1f9d1-1f3fb-200d-1f393", + "student_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f393", + "student_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f393", + "student_medium_skin_tone": "1f9d1-1f3fd-200d-1f393", + "studio_microphone": "1f399-fe0f", + "stuffed_flatbread": "1f959", + "sudan": "1f1f8-1f1e9", + "sun": "2600-fe0f", + "sun_behind_large_cloud": "1f325-fe0f", + "sun_behind_rain_cloud": "1f326-fe0f", + "sun_behind_small_cloud": "1f324-fe0f", + "sun_with_face": "1f31e", + "sunflower": "1f33b", + "sunglasses": "1f60e", + "sunny": "2600-fe0f", + "sunrise": "1f305", + "sunrise_over_mountains": "1f304", + "superhero": "1f9b8", + "superhero_dark_skin_tone": "1f9b8-1f3ff", + "superhero_light_skin_tone": "1f9b8-1f3fb", + "superhero_man": "1f9b8-200d-2642-fe0f", + "superhero_medium-dark_skin_tone": "1f9b8-1f3fe", + "superhero_medium-light_skin_tone": "1f9b8-1f3fc", + "superhero_medium_skin_tone": "1f9b8-1f3fd", + "superhero_woman": "1f9b8-200d-2640-fe0f", + "supervillain": "1f9b9", + "supervillain_dark_skin_tone": "1f9b9-1f3ff", + "supervillain_light_skin_tone": "1f9b9-1f3fb", + "supervillain_man": "1f9b9-200d-2642-fe0f", + "supervillain_medium-dark_skin_tone": "1f9b9-1f3fe", + "supervillain_medium-light_skin_tone": "1f9b9-1f3fc", + "supervillain_medium_skin_tone": "1f9b9-1f3fd", + "supervillain_woman": "1f9b9-200d-2640-fe0f", + "surfer": "1f3c4", + "surfing_man": "1f3c4-200d-2642-fe0f", + "surfing_woman": "1f3c4-200d-2640-fe0f", + "suriname": "1f1f8-1f1f7", + "sushi": "1f363", + "suspension_railway": "1f69f", + "svalbard_jan_mayen": "1f1f8-1f1ef", + "swan": "1f9a2", + "swaziland": "1f1f8-1f1ff", + "sweat": "1f613", + "sweat_drops": "1f4a6", + "sweat_smile": "1f605", + "sweden": "1f1f8-1f1ea", + "sweet_potato": "1f360", + "swim_brief": "1fa72", + "swimmer": "1f3ca", + "swimming_man": "1f3ca-200d-2642-fe0f", + "swimming_woman": "1f3ca-200d-2640-fe0f", + "switzerland": "1f1e8-1f1ed", + "symbols": "1f523", + "synagogue": "1f54d", + "syria": "1f1f8-1f1fe", + "syringe": "1f489", + "t-rex": "1f996", + "taco": "1f32e", + "tada": "1f389", + "taiwan": "1f1f9-1f1fc", + "tajikistan": "1f1f9-1f1ef", + "takeout_box": "1f961", + "tamale": "1fad4", + "tanabata_tree": "1f38b", + "tangerine": "1f34a", + "tanzania": "1f1f9-1f1ff", + "taurus": "2649", + "taxi": "1f695", + "tea": "1f375", + "teacher": "1f9d1-200d-1f3eb", + "teacher_dark_skin_tone": "1f9d1-1f3ff-200d-1f3eb", + "teacher_light_skin_tone": "1f9d1-1f3fb-200d-1f3eb", + "teacher_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f3eb", + "teacher_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f3eb", + "teacher_medium_skin_tone": "1f9d1-1f3fd-200d-1f3eb", + "teapot": "1fad6", + "technologist": "1f9d1-200d-1f4bb", + "technologist_dark_skin_tone": "1f9d1-1f3ff-200d-1f4bb", + "technologist_light_skin_tone": "1f9d1-1f3fb-200d-1f4bb", + "technologist_medium-dark_skin_tone": "1f9d1-1f3fe-200d-1f4bb", + "technologist_medium-light_skin_tone": "1f9d1-1f3fc-200d-1f4bb", + "technologist_medium_skin_tone": "1f9d1-1f3fd-200d-1f4bb", + "teddy_bear": "1f9f8", + "telephone": "260e-fe0f", + "telephone_receiver": "1f4de", + "telescope": "1f52d", + "tennis": "1f3be", + "tent": "26fa", + "test_tube": "1f9ea", + "thailand": "1f1f9-1f1ed", + "thermometer": "1f321-fe0f", + "thinking": "1f914", + "thong_sandal": "1fa74", + "thought_balloon": "1f4ad", + "thread": "1f9f5", + "three": "33-fe0f-20e3", + "thumbs_down_dark_skin_tone": "1f44e-1f3ff", + "thumbs_down_light_skin_tone": "1f44e-1f3fb", + "thumbs_down_medium-dark_skin_tone": "1f44e-1f3fe", + "thumbs_down_medium-light_skin_tone": "1f44e-1f3fc", + "thumbs_down_medium_skin_tone": "1f44e-1f3fd", + "thumbs_up_dark_skin_tone": "1f44d-1f3ff", + "thumbs_up_light_skin_tone": "1f44d-1f3fb", + "thumbs_up_medium-dark_skin_tone": "1f44d-1f3fe", + "thumbs_up_medium-light_skin_tone": "1f44d-1f3fc", + "thumbs_up_medium_skin_tone": "1f44d-1f3fd", + "thumbsdown": "1f44e", + "thumbsup": "1f44d", + "ticket": "1f3ab", + "tickets": "1f39f-fe0f", + "tiger": "1f42f", + "tiger2": "1f405", + "timer_clock": "23f2-fe0f", + "timor_leste": "1f1f9-1f1f1", + "tipping_hand_man": "1f481-200d-2642-fe0f", + "tipping_hand_person": "1f481", + "tipping_hand_woman": "1f481-200d-2640-fe0f", + "tired_face": "1f62b", + "tm": "2122-fe0f", + "togo": "1f1f9-1f1ec", + "toilet": "1f6bd", + "tokelau": "1f1f9-1f1f0", + "tokyo_tower": "1f5fc", + "tomato": "1f345", + "tonga": "1f1f9-1f1f4", + "tongue": "1f445", + "toolbox": "1f9f0", + "tooth": "1f9b7", + "toothbrush": "1faa5", + "top": "1f51d", + "tophat": "1f3a9", + "tornado": "1f32a-fe0f", + "tr": "1f1f9-1f1f7", + "trackball": "1f5b2-fe0f", + "tractor": "1f69c", + "traffic_light": "1f6a5", + "train": "1f68b", + "train2": "1f686", + "tram": "1f68a", + "transgender_flag": "1f3f3-fe0f-200d-26a7-fe0f", + "transgender_symbol": "26a7-fe0f", + "triangular_flag_on_post": "1f6a9", + "triangular_ruler": "1f4d0", + "trident": "1f531", + "trinidad_tobago": "1f1f9-1f1f9", + "tristan_da_cunha": "1f1f9-1f1e6", + "triumph": "1f624", + "troll": "1f9cc", + "trolleybus": "1f68e", + "trophy": "1f3c6", + "tropical_drink": "1f379", + "tropical_fish": "1f420", + "truck": "1f69a", + "trumpet": "1f3ba", + "tshirt": "1f455", + "tulip": "1f337", + "tumbler_glass": "1f943", + "tumbleweed": "~tumbleweed", + "tumbleweed!": "~tumbleweed2", + "tumbleweed2": "~tumbleweed2", + "tunisia": "1f1f9-1f1f3", + "turkey": "1f983", + "turkmenistan": "1f1f9-1f1f2", + "turks_caicos_islands": "1f1f9-1f1e8", + "turtle": "1f422", + "tuvalu": "1f1f9-1f1fb", + "tv": "1f4fa", + "twisted_rightwards_arrows": "1f500", + "two": "32-fe0f-20e3", + "two_hearts": "1f495", + "two_men_holding_hands": "1f46c", + "two_women_holding_hands": "1f46d", + "u5272": "1f239", + "u5408": "1f234", + "u55b6": "1f23a", + "u6307": "1f22f", + "u6708": "1f237-fe0f", + "u6709": "1f236", + "u6e80": "1f235", + "u7121": "1f21a", + "u7533": "1f238", + "u7981": "1f232", + "u7a7a": "1f233", + "uganda": "1f1fa-1f1ec", + "uk": "1f1ec-1f1e7", + "ukraine": "1f1fa-1f1e6", + "umbrella": "2614", + "unamused": "1f612", + "underage": "1f51e", + "unicorn": "1f984", + "united_arab_emirates": "1f1e6-1f1ea", + "united_nations": "1f1fa-1f1f3", + "unlock": "1f513", + "up": "1f199", + "upside_down_face": "1f643", + "uruguay": "1f1fa-1f1fe", + "us": "1f1fa-1f1f8", + "us_outlying_islands": "1f1fa-1f1f2", + "us_virgin_islands": "1f1fb-1f1ee", + "uzbekistan": "1f1fa-1f1ff", + "v": "270c-fe0f", + "vampire": "1f9db", + "vampire_dark_skin_tone": "1f9db-1f3ff", + "vampire_light_skin_tone": "1f9db-1f3fb", + "vampire_man": "1f9db-200d-2642-fe0f", + "vampire_medium-dark_skin_tone": "1f9db-1f3fe", + "vampire_medium-light_skin_tone": "1f9db-1f3fc", + "vampire_medium_skin_tone": "1f9db-1f3fd", + "vampire_woman": "1f9db-200d-2640-fe0f", + "vanuatu": "1f1fb-1f1fa", + "vatican_city": "1f1fb-1f1e6", + "venezuela": "1f1fb-1f1ea", + "vertical_traffic_light": "1f6a6", + "vhs": "1f4fc", + "vibration_mode": "1f4f3", + "victory_hand_dark_skin_tone": "270c-1f3ff", + "victory_hand_light_skin_tone": "270c-1f3fb", + "victory_hand_medium-dark_skin_tone": "270c-1f3fe", + "victory_hand_medium-light_skin_tone": "270c-1f3fc", + "victory_hand_medium_skin_tone": "270c-1f3fd", + "video_camera": "1f4f9", + "video_game": "1f3ae", + "vietnam": "1f1fb-1f1f3", + "violin": "1f3bb", + "virgo": "264d", + "volcano": "1f30b", + "volleyball": "1f3d0", + "vomiting_face": "1f92e", + "vs": "1f19a", + "vulcan_salute": "1f596", + "vulcan_salute_dark_skin_tone": "1f596-1f3ff", + "vulcan_salute_light_skin_tone": "1f596-1f3fb", + "vulcan_salute_medium-dark_skin_tone": "1f596-1f3fe", + "vulcan_salute_medium-light_skin_tone": "1f596-1f3fc", + "vulcan_salute_medium_skin_tone": "1f596-1f3fd", + "waffle": "1f9c7", + "wales": "1f3f4-e0067-e0062-e0077-e006c-e0073-e007f", + "walking": "1f6b6", + "walking_man": "1f6b6-200d-2642-fe0f", + "walking_woman": "1f6b6-200d-2640-fe0f", + "wallis_futuna": "1f1fc-1f1eb", + "waning_crescent_moon": "1f318", + "waning_gibbous_moon": "1f316", + "warning": "26a0-fe0f", + "wastebasket": "1f5d1-fe0f", + "watch": "231a", + "water_buffalo": "1f403", + "water_polo": "1f93d", + "watermelon": "1f349", + "wave": "1f44b", + "waving_hand_dark_skin_tone": "1f44b-1f3ff", + "waving_hand_light_skin_tone": "1f44b-1f3fb", + "waving_hand_medium-dark_skin_tone": "1f44b-1f3fe", + "waving_hand_medium-light_skin_tone": "1f44b-1f3fc", + "waving_hand_medium_skin_tone": "1f44b-1f3fd", + "wavy_dash": "3030-fe0f", + "waxing_crescent_moon": "1f312", + "waxing_gibbous_moon": "1f314", + "wc": "1f6be", + "weary": "1f629", + "wedding": "1f492", + "weight_lifting": "1f3cb-fe0f", + "weight_lifting_man": "1f3cb-fe0f-200d-2642-fe0f", + "weight_lifting_woman": "1f3cb-fe0f-200d-2640-fe0f", + "western_sahara": "1f1ea-1f1ed", + "whale": "1f433", + "whale2": "1f40b", + "wheel": "1f6de", + "wheel_of_dharma": "2638-fe0f", + "wheelchair": "267f", + "white_check_mark": "2705", + "white_circle": "26aa", + "white_flag": "1f3f3-fe0f", + "white_flower": "1f4ae", + "white_haired_man": "1f468-200d-1f9b3", + "white_haired_woman": "1f469-200d-1f9b3", + "white_heart": "1f90d", + "white_large_square": "2b1c", + "white_medium_small_square": "25fd", + "white_medium_square": "25fb-fe0f", + "white_small_square": "25ab-fe0f", + "white_square_button": "1f533", + "wilted_flower": "1f940", + "wind_chime": "1f390", + "wind_face": "1f32c-fe0f", + "window": "1fa9f", + "wine_glass": "1f377", + "wing": "1fabd", + "wink": "1f609", + "wireless": "1f6dc", + "wolf": "1f43a", + "woman": "1f469", + "woman_and_man_holding_hands_dark_skin_tone": "1f46b-1f3ff", + "woman_and_man_holding_hands_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fb", + "woman_and_man_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fe", + "woman_and_man_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fc", + "woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f468-1f3fd", + "woman_and_man_holding_hands_light_skin_tone": "1f46b-1f3fb", + "woman_and_man_holding_hands_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3ff", + "woman_and_man_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fe", + "woman_and_man_holding_hands_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fc", + "woman_and_man_holding_hands_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f468-1f3fd", + "woman_and_man_holding_hands_medium-dark_skin_tone": "1f46b-1f3fe", + "woman_and_man_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3ff", + "woman_and_man_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fb", + "woman_and_man_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fc", + "woman_and_man_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f468-1f3fd", + "woman_and_man_holding_hands_medium-light_skin_tone": "1f46b-1f3fc", + "woman_and_man_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3ff", + "woman_and_man_holding_hands_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fb", + "woman_and_man_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fe", + "woman_and_man_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f468-1f3fd", + "woman_and_man_holding_hands_medium_skin_tone": "1f46b-1f3fd", + "woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3ff", + "woman_and_man_holding_hands_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fb", + "woman_and_man_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fe", + "woman_and_man_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f468-1f3fc", + "woman_artist": "1f469-200d-1f3a8", + "woman_artist_dark_skin_tone": "1f469-1f3ff-200d-1f3a8", + "woman_artist_light_skin_tone": "1f469-1f3fb-200d-1f3a8", + "woman_artist_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3a8", + "woman_artist_medium-light_skin_tone": "1f469-1f3fc-200d-1f3a8", + "woman_artist_medium_skin_tone": "1f469-1f3fd-200d-1f3a8", + "woman_astronaut": "1f469-200d-1f680", + "woman_astronaut_dark_skin_tone": "1f469-1f3ff-200d-1f680", + "woman_astronaut_light_skin_tone": "1f469-1f3fb-200d-1f680", + "woman_astronaut_medium-dark_skin_tone": "1f469-1f3fe-200d-1f680", + "woman_astronaut_medium-light_skin_tone": "1f469-1f3fc-200d-1f680", + "woman_astronaut_medium_skin_tone": "1f469-1f3fd-200d-1f680", + "woman_beard": "1f9d4-200d-2640-fe0f", + "woman_biking_dark_skin_tone": "1f6b4-1f3ff-200d-2640-fe0f", + "woman_biking_light_skin_tone": "1f6b4-1f3fb-200d-2640-fe0f", + "woman_biking_medium-dark_skin_tone": "1f6b4-1f3fe-200d-2640-fe0f", + "woman_biking_medium-light_skin_tone": "1f6b4-1f3fc-200d-2640-fe0f", + "woman_biking_medium_skin_tone": "1f6b4-1f3fd-200d-2640-fe0f", + "woman_bouncing_ball_dark_skin_tone": "26f9-1f3ff-200d-2640-fe0f", + "woman_bouncing_ball_light_skin_tone": "26f9-1f3fb-200d-2640-fe0f", + "woman_bouncing_ball_medium-dark_skin_tone": "26f9-1f3fe-200d-2640-fe0f", + "woman_bouncing_ball_medium-light_skin_tone": "26f9-1f3fc-200d-2640-fe0f", + "woman_bouncing_ball_medium_skin_tone": "26f9-1f3fd-200d-2640-fe0f", + "woman_bowing_dark_skin_tone": "1f647-1f3ff-200d-2640-fe0f", + "woman_bowing_light_skin_tone": "1f647-1f3fb-200d-2640-fe0f", + "woman_bowing_medium-dark_skin_tone": "1f647-1f3fe-200d-2640-fe0f", + "woman_bowing_medium-light_skin_tone": "1f647-1f3fc-200d-2640-fe0f", + "woman_bowing_medium_skin_tone": "1f647-1f3fd-200d-2640-fe0f", + "woman_cartwheeling": "1f938-200d-2640-fe0f", + "woman_cartwheeling_dark_skin_tone": "1f938-1f3ff-200d-2640-fe0f", + "woman_cartwheeling_light_skin_tone": "1f938-1f3fb-200d-2640-fe0f", + "woman_cartwheeling_medium-dark_skin_tone": "1f938-1f3fe-200d-2640-fe0f", + "woman_cartwheeling_medium-light_skin_tone": "1f938-1f3fc-200d-2640-fe0f", + "woman_cartwheeling_medium_skin_tone": "1f938-1f3fd-200d-2640-fe0f", + "woman_climbing_dark_skin_tone": "1f9d7-1f3ff-200d-2640-fe0f", + "woman_climbing_light_skin_tone": "1f9d7-1f3fb-200d-2640-fe0f", + "woman_climbing_medium-dark_skin_tone": "1f9d7-1f3fe-200d-2640-fe0f", + "woman_climbing_medium-light_skin_tone": "1f9d7-1f3fc-200d-2640-fe0f", + "woman_climbing_medium_skin_tone": "1f9d7-1f3fd-200d-2640-fe0f", + "woman_construction_worker_dark_skin_tone": "1f477-1f3ff-200d-2640-fe0f", + "woman_construction_worker_light_skin_tone": "1f477-1f3fb-200d-2640-fe0f", + "woman_construction_worker_medium-dark_skin_tone": "1f477-1f3fe-200d-2640-fe0f", + "woman_construction_worker_medium-light_skin_tone": "1f477-1f3fc-200d-2640-fe0f", + "woman_construction_worker_medium_skin_tone": "1f477-1f3fd-200d-2640-fe0f", + "woman_cook": "1f469-200d-1f373", + "woman_cook_dark_skin_tone": "1f469-1f3ff-200d-1f373", + "woman_cook_light_skin_tone": "1f469-1f3fb-200d-1f373", + "woman_cook_medium-dark_skin_tone": "1f469-1f3fe-200d-1f373", + "woman_cook_medium-light_skin_tone": "1f469-1f3fc-200d-1f373", + "woman_cook_medium_skin_tone": "1f469-1f3fd-200d-1f373", + "woman_dancing": "1f483", + "woman_dancing_dark_skin_tone": "1f483-1f3ff", + "woman_dancing_light_skin_tone": "1f483-1f3fb", + "woman_dancing_medium-dark_skin_tone": "1f483-1f3fe", + "woman_dancing_medium-light_skin_tone": "1f483-1f3fc", + "woman_dancing_medium_skin_tone": "1f483-1f3fd", + "woman_dark_skin_tone": "1f469-1f3ff", + "woman_dark_skin_tone_bald": "1f469-1f3ff-200d-1f9b2", + "woman_dark_skin_tone_beard": "1f9d4-1f3ff-200d-2640-fe0f", + "woman_dark_skin_tone_blond_hair": "1f471-1f3ff-200d-2640-fe0f", + "woman_dark_skin_tone_curly_hair": "1f469-1f3ff-200d-1f9b1", + "woman_dark_skin_tone_red_hair": "1f469-1f3ff-200d-1f9b0", + "woman_dark_skin_tone_white_hair": "1f469-1f3ff-200d-1f9b3", + "woman_detective_dark_skin_tone": "1f575-1f3ff-200d-2640-fe0f", + "woman_detective_light_skin_tone": "1f575-1f3fb-200d-2640-fe0f", + "woman_detective_medium-dark_skin_tone": "1f575-1f3fe-200d-2640-fe0f", + "woman_detective_medium-light_skin_tone": "1f575-1f3fc-200d-2640-fe0f", + "woman_detective_medium_skin_tone": "1f575-1f3fd-200d-2640-fe0f", + "woman_elf_dark_skin_tone": "1f9dd-1f3ff-200d-2640-fe0f", + "woman_elf_light_skin_tone": "1f9dd-1f3fb-200d-2640-fe0f", + "woman_elf_medium-dark_skin_tone": "1f9dd-1f3fe-200d-2640-fe0f", + "woman_elf_medium-light_skin_tone": "1f9dd-1f3fc-200d-2640-fe0f", + "woman_elf_medium_skin_tone": "1f9dd-1f3fd-200d-2640-fe0f", + "woman_facepalming": "1f926-200d-2640-fe0f", + "woman_facepalming_dark_skin_tone": "1f926-1f3ff-200d-2640-fe0f", + "woman_facepalming_light_skin_tone": "1f926-1f3fb-200d-2640-fe0f", + "woman_facepalming_medium-dark_skin_tone": "1f926-1f3fe-200d-2640-fe0f", + "woman_facepalming_medium-light_skin_tone": "1f926-1f3fc-200d-2640-fe0f", + "woman_facepalming_medium_skin_tone": "1f926-1f3fd-200d-2640-fe0f", + "woman_factory_worker": "1f469-200d-1f3ed", + "woman_factory_worker_dark_skin_tone": "1f469-1f3ff-200d-1f3ed", + "woman_factory_worker_light_skin_tone": "1f469-1f3fb-200d-1f3ed", + "woman_factory_worker_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3ed", + "woman_factory_worker_medium-light_skin_tone": "1f469-1f3fc-200d-1f3ed", + "woman_factory_worker_medium_skin_tone": "1f469-1f3fd-200d-1f3ed", + "woman_fairy_dark_skin_tone": "1f9da-1f3ff-200d-2640-fe0f", + "woman_fairy_light_skin_tone": "1f9da-1f3fb-200d-2640-fe0f", + "woman_fairy_medium-dark_skin_tone": "1f9da-1f3fe-200d-2640-fe0f", + "woman_fairy_medium-light_skin_tone": "1f9da-1f3fc-200d-2640-fe0f", + "woman_fairy_medium_skin_tone": "1f9da-1f3fd-200d-2640-fe0f", + "woman_farmer": "1f469-200d-1f33e", + "woman_farmer_dark_skin_tone": "1f469-1f3ff-200d-1f33e", + "woman_farmer_light_skin_tone": "1f469-1f3fb-200d-1f33e", + "woman_farmer_medium-dark_skin_tone": "1f469-1f3fe-200d-1f33e", + "woman_farmer_medium-light_skin_tone": "1f469-1f3fc-200d-1f33e", + "woman_farmer_medium_skin_tone": "1f469-1f3fd-200d-1f33e", + "woman_feeding_baby": "1f469-200d-1f37c", + "woman_feeding_baby_dark_skin_tone": "1f469-1f3ff-200d-1f37c", + "woman_feeding_baby_light_skin_tone": "1f469-1f3fb-200d-1f37c", + "woman_feeding_baby_medium-dark_skin_tone": "1f469-1f3fe-200d-1f37c", + "woman_feeding_baby_medium-light_skin_tone": "1f469-1f3fc-200d-1f37c", + "woman_feeding_baby_medium_skin_tone": "1f469-1f3fd-200d-1f37c", + "woman_firefighter": "1f469-200d-1f692", + "woman_firefighter_dark_skin_tone": "1f469-1f3ff-200d-1f692", + "woman_firefighter_light_skin_tone": "1f469-1f3fb-200d-1f692", + "woman_firefighter_medium-dark_skin_tone": "1f469-1f3fe-200d-1f692", + "woman_firefighter_medium-light_skin_tone": "1f469-1f3fc-200d-1f692", + "woman_firefighter_medium_skin_tone": "1f469-1f3fd-200d-1f692", + "woman_frowning_dark_skin_tone": "1f64d-1f3ff-200d-2640-fe0f", + "woman_frowning_light_skin_tone": "1f64d-1f3fb-200d-2640-fe0f", + "woman_frowning_medium-dark_skin_tone": "1f64d-1f3fe-200d-2640-fe0f", + "woman_frowning_medium-light_skin_tone": "1f64d-1f3fc-200d-2640-fe0f", + "woman_frowning_medium_skin_tone": "1f64d-1f3fd-200d-2640-fe0f", + "woman_gesturing_no_dark_skin_tone": "1f645-1f3ff-200d-2640-fe0f", + "woman_gesturing_no_light_skin_tone": "1f645-1f3fb-200d-2640-fe0f", + "woman_gesturing_no_medium-dark_skin_tone": "1f645-1f3fe-200d-2640-fe0f", + "woman_gesturing_no_medium-light_skin_tone": "1f645-1f3fc-200d-2640-fe0f", + "woman_gesturing_no_medium_skin_tone": "1f645-1f3fd-200d-2640-fe0f", + "woman_gesturing_ok_dark_skin_tone": "1f646-1f3ff-200d-2640-fe0f", + "woman_gesturing_ok_light_skin_tone": "1f646-1f3fb-200d-2640-fe0f", + "woman_gesturing_ok_medium-dark_skin_tone": "1f646-1f3fe-200d-2640-fe0f", + "woman_gesturing_ok_medium-light_skin_tone": "1f646-1f3fc-200d-2640-fe0f", + "woman_gesturing_ok_medium_skin_tone": "1f646-1f3fd-200d-2640-fe0f", + "woman_getting_haircut_dark_skin_tone": "1f487-1f3ff-200d-2640-fe0f", + "woman_getting_haircut_light_skin_tone": "1f487-1f3fb-200d-2640-fe0f", + "woman_getting_haircut_medium-dark_skin_tone": "1f487-1f3fe-200d-2640-fe0f", + "woman_getting_haircut_medium-light_skin_tone": "1f487-1f3fc-200d-2640-fe0f", + "woman_getting_haircut_medium_skin_tone": "1f487-1f3fd-200d-2640-fe0f", + "woman_getting_massage_dark_skin_tone": "1f486-1f3ff-200d-2640-fe0f", + "woman_getting_massage_light_skin_tone": "1f486-1f3fb-200d-2640-fe0f", + "woman_getting_massage_medium-dark_skin_tone": "1f486-1f3fe-200d-2640-fe0f", + "woman_getting_massage_medium-light_skin_tone": "1f486-1f3fc-200d-2640-fe0f", + "woman_getting_massage_medium_skin_tone": "1f486-1f3fd-200d-2640-fe0f", + "woman_golfing_dark_skin_tone": "1f3cc-1f3ff-200d-2640-fe0f", + "woman_golfing_light_skin_tone": "1f3cc-1f3fb-200d-2640-fe0f", + "woman_golfing_medium-dark_skin_tone": "1f3cc-1f3fe-200d-2640-fe0f", + "woman_golfing_medium-light_skin_tone": "1f3cc-1f3fc-200d-2640-fe0f", + "woman_golfing_medium_skin_tone": "1f3cc-1f3fd-200d-2640-fe0f", + "woman_guard_dark_skin_tone": "1f482-1f3ff-200d-2640-fe0f", + "woman_guard_light_skin_tone": "1f482-1f3fb-200d-2640-fe0f", + "woman_guard_medium-dark_skin_tone": "1f482-1f3fe-200d-2640-fe0f", + "woman_guard_medium-light_skin_tone": "1f482-1f3fc-200d-2640-fe0f", + "woman_guard_medium_skin_tone": "1f482-1f3fd-200d-2640-fe0f", + "woman_health_worker": "1f469-200d-2695-fe0f", + "woman_health_worker_dark_skin_tone": "1f469-1f3ff-200d-2695-fe0f", + "woman_health_worker_light_skin_tone": "1f469-1f3fb-200d-2695-fe0f", + "woman_health_worker_medium-dark_skin_tone": "1f469-1f3fe-200d-2695-fe0f", + "woman_health_worker_medium-light_skin_tone": "1f469-1f3fc-200d-2695-fe0f", + "woman_health_worker_medium_skin_tone": "1f469-1f3fd-200d-2695-fe0f", + "woman_in_lotus_position_dark_skin_tone": "1f9d8-1f3ff-200d-2640-fe0f", + "woman_in_lotus_position_light_skin_tone": "1f9d8-1f3fb-200d-2640-fe0f", + "woman_in_lotus_position_medium-dark_skin_tone": "1f9d8-1f3fe-200d-2640-fe0f", + "woman_in_lotus_position_medium-light_skin_tone": "1f9d8-1f3fc-200d-2640-fe0f", + "woman_in_lotus_position_medium_skin_tone": "1f9d8-1f3fd-200d-2640-fe0f", + "woman_in_manual_wheelchair": "1f469-200d-1f9bd", + "woman_in_manual_wheelchair_dark_skin_tone": "1f469-1f3ff-200d-1f9bd", + "woman_in_manual_wheelchair_facing_right": "1f469-200d-1f9bd-200d-27a1-fe0f", + "woman_in_manual_wheelchair_facing_right_dark_skin_tone": "1f469-1f3ff-200d-1f9bd-200d-27a1-fe0f", + "woman_in_manual_wheelchair_facing_right_light_skin_tone": "1f469-1f3fb-200d-1f9bd-200d-27a1-fe0f", + "woman_in_manual_wheelchair_facing_right_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bd-200d-27a1-fe0f", + "woman_in_manual_wheelchair_facing_right_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bd-200d-27a1-fe0f", + "woman_in_manual_wheelchair_facing_right_medium_skin_tone": "1f469-1f3fd-200d-1f9bd-200d-27a1-fe0f", + "woman_in_manual_wheelchair_light_skin_tone": "1f469-1f3fb-200d-1f9bd", + "woman_in_manual_wheelchair_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bd", + "woman_in_manual_wheelchair_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bd", + "woman_in_manual_wheelchair_medium_skin_tone": "1f469-1f3fd-200d-1f9bd", + "woman_in_motorized_wheelchair": "1f469-200d-1f9bc", + "woman_in_motorized_wheelchair_dark_skin_tone": "1f469-1f3ff-200d-1f9bc", + "woman_in_motorized_wheelchair_facing_right": "1f469-200d-1f9bc-200d-27a1-fe0f", + "woman_in_motorized_wheelchair_facing_right_dark_skin_tone": "1f469-1f3ff-200d-1f9bc-200d-27a1-fe0f", + "woman_in_motorized_wheelchair_facing_right_light_skin_tone": "1f469-1f3fb-200d-1f9bc-200d-27a1-fe0f", + "woman_in_motorized_wheelchair_facing_right_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bc-200d-27a1-fe0f", + "woman_in_motorized_wheelchair_facing_right_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bc-200d-27a1-fe0f", + "woman_in_motorized_wheelchair_facing_right_medium_skin_tone": "1f469-1f3fd-200d-1f9bc-200d-27a1-fe0f", + "woman_in_motorized_wheelchair_light_skin_tone": "1f469-1f3fb-200d-1f9bc", + "woman_in_motorized_wheelchair_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9bc", + "woman_in_motorized_wheelchair_medium-light_skin_tone": "1f469-1f3fc-200d-1f9bc", + "woman_in_motorized_wheelchair_medium_skin_tone": "1f469-1f3fd-200d-1f9bc", + "woman_in_steamy_room_dark_skin_tone": "1f9d6-1f3ff-200d-2640-fe0f", + "woman_in_steamy_room_light_skin_tone": "1f9d6-1f3fb-200d-2640-fe0f", + "woman_in_steamy_room_medium-dark_skin_tone": "1f9d6-1f3fe-200d-2640-fe0f", + "woman_in_steamy_room_medium-light_skin_tone": "1f9d6-1f3fc-200d-2640-fe0f", + "woman_in_steamy_room_medium_skin_tone": "1f9d6-1f3fd-200d-2640-fe0f", + "woman_in_tuxedo": "1f935-200d-2640-fe0f", + "woman_in_tuxedo_dark_skin_tone": "1f935-1f3ff-200d-2640-fe0f", + "woman_in_tuxedo_light_skin_tone": "1f935-1f3fb-200d-2640-fe0f", + "woman_in_tuxedo_medium-dark_skin_tone": "1f935-1f3fe-200d-2640-fe0f", + "woman_in_tuxedo_medium-light_skin_tone": "1f935-1f3fc-200d-2640-fe0f", + "woman_in_tuxedo_medium_skin_tone": "1f935-1f3fd-200d-2640-fe0f", + "woman_judge": "1f469-200d-2696-fe0f", + "woman_judge_dark_skin_tone": "1f469-1f3ff-200d-2696-fe0f", + "woman_judge_light_skin_tone": "1f469-1f3fb-200d-2696-fe0f", + "woman_judge_medium-dark_skin_tone": "1f469-1f3fe-200d-2696-fe0f", + "woman_judge_medium-light_skin_tone": "1f469-1f3fc-200d-2696-fe0f", + "woman_judge_medium_skin_tone": "1f469-1f3fd-200d-2696-fe0f", + "woman_juggling": "1f939-200d-2640-fe0f", + "woman_juggling_dark_skin_tone": "1f939-1f3ff-200d-2640-fe0f", + "woman_juggling_light_skin_tone": "1f939-1f3fb-200d-2640-fe0f", + "woman_juggling_medium-dark_skin_tone": "1f939-1f3fe-200d-2640-fe0f", + "woman_juggling_medium-light_skin_tone": "1f939-1f3fc-200d-2640-fe0f", + "woman_juggling_medium_skin_tone": "1f939-1f3fd-200d-2640-fe0f", + "woman_kneeling_dark_skin_tone": "1f9ce-1f3ff-200d-2640-fe0f", + "woman_kneeling_facing_right": "1f9ce-200d-2640-fe0f-200d-27a1-fe0f", + "woman_kneeling_facing_right_dark_skin_tone": "1f9ce-1f3ff-200d-2640-fe0f-200d-27a1-fe0f", + "woman_kneeling_facing_right_light_skin_tone": "1f9ce-1f3fb-200d-2640-fe0f-200d-27a1-fe0f", + "woman_kneeling_facing_right_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2640-fe0f-200d-27a1-fe0f", + "woman_kneeling_facing_right_medium-light_skin_tone": "1f9ce-1f3fc-200d-2640-fe0f-200d-27a1-fe0f", + "woman_kneeling_facing_right_medium_skin_tone": "1f9ce-1f3fd-200d-2640-fe0f-200d-27a1-fe0f", + "woman_kneeling_light_skin_tone": "1f9ce-1f3fb-200d-2640-fe0f", + "woman_kneeling_medium-dark_skin_tone": "1f9ce-1f3fe-200d-2640-fe0f", + "woman_kneeling_medium-light_skin_tone": "1f9ce-1f3fc-200d-2640-fe0f", + "woman_kneeling_medium_skin_tone": "1f9ce-1f3fd-200d-2640-fe0f", + "woman_lifting_weights_dark_skin_tone": "1f3cb-1f3ff-200d-2640-fe0f", + "woman_lifting_weights_light_skin_tone": "1f3cb-1f3fb-200d-2640-fe0f", + "woman_lifting_weights_medium-dark_skin_tone": "1f3cb-1f3fe-200d-2640-fe0f", + "woman_lifting_weights_medium-light_skin_tone": "1f3cb-1f3fc-200d-2640-fe0f", + "woman_lifting_weights_medium_skin_tone": "1f3cb-1f3fd-200d-2640-fe0f", + "woman_light_skin_tone": "1f469-1f3fb", + "woman_light_skin_tone_bald": "1f469-1f3fb-200d-1f9b2", + "woman_light_skin_tone_beard": "1f9d4-1f3fb-200d-2640-fe0f", + "woman_light_skin_tone_blond_hair": "1f471-1f3fb-200d-2640-fe0f", + "woman_light_skin_tone_curly_hair": "1f469-1f3fb-200d-1f9b1", + "woman_light_skin_tone_red_hair": "1f469-1f3fb-200d-1f9b0", + "woman_light_skin_tone_white_hair": "1f469-1f3fb-200d-1f9b3", + "woman_mage_dark_skin_tone": "1f9d9-1f3ff-200d-2640-fe0f", + "woman_mage_light_skin_tone": "1f9d9-1f3fb-200d-2640-fe0f", + "woman_mage_medium-dark_skin_tone": "1f9d9-1f3fe-200d-2640-fe0f", + "woman_mage_medium-light_skin_tone": "1f9d9-1f3fc-200d-2640-fe0f", + "woman_mage_medium_skin_tone": "1f9d9-1f3fd-200d-2640-fe0f", + "woman_mechanic": "1f469-200d-1f527", + "woman_mechanic_dark_skin_tone": "1f469-1f3ff-200d-1f527", + "woman_mechanic_light_skin_tone": "1f469-1f3fb-200d-1f527", + "woman_mechanic_medium-dark_skin_tone": "1f469-1f3fe-200d-1f527", + "woman_mechanic_medium-light_skin_tone": "1f469-1f3fc-200d-1f527", + "woman_mechanic_medium_skin_tone": "1f469-1f3fd-200d-1f527", + "woman_medium-dark_skin_tone": "1f469-1f3fe", + "woman_medium-dark_skin_tone_bald": "1f469-1f3fe-200d-1f9b2", + "woman_medium-dark_skin_tone_beard": "1f9d4-1f3fe-200d-2640-fe0f", + "woman_medium-dark_skin_tone_blond_hair": "1f471-1f3fe-200d-2640-fe0f", + "woman_medium-dark_skin_tone_curly_hair": "1f469-1f3fe-200d-1f9b1", + "woman_medium-dark_skin_tone_red_hair": "1f469-1f3fe-200d-1f9b0", + "woman_medium-dark_skin_tone_white_hair": "1f469-1f3fe-200d-1f9b3", + "woman_medium-light_skin_tone": "1f469-1f3fc", + "woman_medium-light_skin_tone_bald": "1f469-1f3fc-200d-1f9b2", + "woman_medium-light_skin_tone_beard": "1f9d4-1f3fc-200d-2640-fe0f", + "woman_medium-light_skin_tone_blond_hair": "1f471-1f3fc-200d-2640-fe0f", + "woman_medium-light_skin_tone_curly_hair": "1f469-1f3fc-200d-1f9b1", + "woman_medium-light_skin_tone_red_hair": "1f469-1f3fc-200d-1f9b0", + "woman_medium-light_skin_tone_white_hair": "1f469-1f3fc-200d-1f9b3", + "woman_medium_skin_tone": "1f469-1f3fd", + "woman_medium_skin_tone_bald": "1f469-1f3fd-200d-1f9b2", + "woman_medium_skin_tone_beard": "1f9d4-1f3fd-200d-2640-fe0f", + "woman_medium_skin_tone_blond_hair": "1f471-1f3fd-200d-2640-fe0f", + "woman_medium_skin_tone_curly_hair": "1f469-1f3fd-200d-1f9b1", + "woman_medium_skin_tone_red_hair": "1f469-1f3fd-200d-1f9b0", + "woman_medium_skin_tone_white_hair": "1f469-1f3fd-200d-1f9b3", + "woman_mountain_biking_dark_skin_tone": "1f6b5-1f3ff-200d-2640-fe0f", + "woman_mountain_biking_light_skin_tone": "1f6b5-1f3fb-200d-2640-fe0f", + "woman_mountain_biking_medium-dark_skin_tone": "1f6b5-1f3fe-200d-2640-fe0f", + "woman_mountain_biking_medium-light_skin_tone": "1f6b5-1f3fc-200d-2640-fe0f", + "woman_mountain_biking_medium_skin_tone": "1f6b5-1f3fd-200d-2640-fe0f", + "woman_office_worker": "1f469-200d-1f4bc", + "woman_office_worker_dark_skin_tone": "1f469-1f3ff-200d-1f4bc", + "woman_office_worker_light_skin_tone": "1f469-1f3fb-200d-1f4bc", + "woman_office_worker_medium-dark_skin_tone": "1f469-1f3fe-200d-1f4bc", + "woman_office_worker_medium-light_skin_tone": "1f469-1f3fc-200d-1f4bc", + "woman_office_worker_medium_skin_tone": "1f469-1f3fd-200d-1f4bc", + "woman_pilot": "1f469-200d-2708-fe0f", + "woman_pilot_dark_skin_tone": "1f469-1f3ff-200d-2708-fe0f", + "woman_pilot_light_skin_tone": "1f469-1f3fb-200d-2708-fe0f", + "woman_pilot_medium-dark_skin_tone": "1f469-1f3fe-200d-2708-fe0f", + "woman_pilot_medium-light_skin_tone": "1f469-1f3fc-200d-2708-fe0f", + "woman_pilot_medium_skin_tone": "1f469-1f3fd-200d-2708-fe0f", + "woman_playing_handball": "1f93e-200d-2640-fe0f", + "woman_playing_handball_dark_skin_tone": "1f93e-1f3ff-200d-2640-fe0f", + "woman_playing_handball_light_skin_tone": "1f93e-1f3fb-200d-2640-fe0f", + "woman_playing_handball_medium-dark_skin_tone": "1f93e-1f3fe-200d-2640-fe0f", + "woman_playing_handball_medium-light_skin_tone": "1f93e-1f3fc-200d-2640-fe0f", + "woman_playing_handball_medium_skin_tone": "1f93e-1f3fd-200d-2640-fe0f", + "woman_playing_water_polo": "1f93d-200d-2640-fe0f", + "woman_playing_water_polo_dark_skin_tone": "1f93d-1f3ff-200d-2640-fe0f", + "woman_playing_water_polo_light_skin_tone": "1f93d-1f3fb-200d-2640-fe0f", + "woman_playing_water_polo_medium-dark_skin_tone": "1f93d-1f3fe-200d-2640-fe0f", + "woman_playing_water_polo_medium-light_skin_tone": "1f93d-1f3fc-200d-2640-fe0f", + "woman_playing_water_polo_medium_skin_tone": "1f93d-1f3fd-200d-2640-fe0f", + "woman_police_officer_dark_skin_tone": "1f46e-1f3ff-200d-2640-fe0f", + "woman_police_officer_light_skin_tone": "1f46e-1f3fb-200d-2640-fe0f", + "woman_police_officer_medium-dark_skin_tone": "1f46e-1f3fe-200d-2640-fe0f", + "woman_police_officer_medium-light_skin_tone": "1f46e-1f3fc-200d-2640-fe0f", + "woman_police_officer_medium_skin_tone": "1f46e-1f3fd-200d-2640-fe0f", + "woman_pouting_dark_skin_tone": "1f64e-1f3ff-200d-2640-fe0f", + "woman_pouting_light_skin_tone": "1f64e-1f3fb-200d-2640-fe0f", + "woman_pouting_medium-dark_skin_tone": "1f64e-1f3fe-200d-2640-fe0f", + "woman_pouting_medium-light_skin_tone": "1f64e-1f3fc-200d-2640-fe0f", + "woman_pouting_medium_skin_tone": "1f64e-1f3fd-200d-2640-fe0f", + "woman_raising_hand_dark_skin_tone": "1f64b-1f3ff-200d-2640-fe0f", + "woman_raising_hand_light_skin_tone": "1f64b-1f3fb-200d-2640-fe0f", + "woman_raising_hand_medium-dark_skin_tone": "1f64b-1f3fe-200d-2640-fe0f", + "woman_raising_hand_medium-light_skin_tone": "1f64b-1f3fc-200d-2640-fe0f", + "woman_raising_hand_medium_skin_tone": "1f64b-1f3fd-200d-2640-fe0f", + "woman_rowing_boat_dark_skin_tone": "1f6a3-1f3ff-200d-2640-fe0f", + "woman_rowing_boat_light_skin_tone": "1f6a3-1f3fb-200d-2640-fe0f", + "woman_rowing_boat_medium-dark_skin_tone": "1f6a3-1f3fe-200d-2640-fe0f", + "woman_rowing_boat_medium-light_skin_tone": "1f6a3-1f3fc-200d-2640-fe0f", + "woman_rowing_boat_medium_skin_tone": "1f6a3-1f3fd-200d-2640-fe0f", + "woman_running_dark_skin_tone": "1f3c3-1f3ff-200d-2640-fe0f", + "woman_running_facing_right": "1f3c3-200d-2640-fe0f-200d-27a1-fe0f", + "woman_running_facing_right_dark_skin_tone": "1f3c3-1f3ff-200d-2640-fe0f-200d-27a1-fe0f", + "woman_running_facing_right_light_skin_tone": "1f3c3-1f3fb-200d-2640-fe0f-200d-27a1-fe0f", + "woman_running_facing_right_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2640-fe0f-200d-27a1-fe0f", + "woman_running_facing_right_medium-light_skin_tone": "1f3c3-1f3fc-200d-2640-fe0f-200d-27a1-fe0f", + "woman_running_facing_right_medium_skin_tone": "1f3c3-1f3fd-200d-2640-fe0f-200d-27a1-fe0f", + "woman_running_light_skin_tone": "1f3c3-1f3fb-200d-2640-fe0f", + "woman_running_medium-dark_skin_tone": "1f3c3-1f3fe-200d-2640-fe0f", + "woman_running_medium-light_skin_tone": "1f3c3-1f3fc-200d-2640-fe0f", + "woman_running_medium_skin_tone": "1f3c3-1f3fd-200d-2640-fe0f", + "woman_scientist": "1f469-200d-1f52c", + "woman_scientist_dark_skin_tone": "1f469-1f3ff-200d-1f52c", + "woman_scientist_light_skin_tone": "1f469-1f3fb-200d-1f52c", + "woman_scientist_medium-dark_skin_tone": "1f469-1f3fe-200d-1f52c", + "woman_scientist_medium-light_skin_tone": "1f469-1f3fc-200d-1f52c", + "woman_scientist_medium_skin_tone": "1f469-1f3fd-200d-1f52c", + "woman_shrugging": "1f937-200d-2640-fe0f", + "woman_shrugging_dark_skin_tone": "1f937-1f3ff-200d-2640-fe0f", + "woman_shrugging_light_skin_tone": "1f937-1f3fb-200d-2640-fe0f", + "woman_shrugging_medium-dark_skin_tone": "1f937-1f3fe-200d-2640-fe0f", + "woman_shrugging_medium-light_skin_tone": "1f937-1f3fc-200d-2640-fe0f", + "woman_shrugging_medium_skin_tone": "1f937-1f3fd-200d-2640-fe0f", + "woman_singer": "1f469-200d-1f3a4", + "woman_singer_dark_skin_tone": "1f469-1f3ff-200d-1f3a4", + "woman_singer_light_skin_tone": "1f469-1f3fb-200d-1f3a4", + "woman_singer_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3a4", + "woman_singer_medium-light_skin_tone": "1f469-1f3fc-200d-1f3a4", + "woman_singer_medium_skin_tone": "1f469-1f3fd-200d-1f3a4", + "woman_standing_dark_skin_tone": "1f9cd-1f3ff-200d-2640-fe0f", + "woman_standing_light_skin_tone": "1f9cd-1f3fb-200d-2640-fe0f", + "woman_standing_medium-dark_skin_tone": "1f9cd-1f3fe-200d-2640-fe0f", + "woman_standing_medium-light_skin_tone": "1f9cd-1f3fc-200d-2640-fe0f", + "woman_standing_medium_skin_tone": "1f9cd-1f3fd-200d-2640-fe0f", + "woman_student": "1f469-200d-1f393", + "woman_student_dark_skin_tone": "1f469-1f3ff-200d-1f393", + "woman_student_light_skin_tone": "1f469-1f3fb-200d-1f393", + "woman_student_medium-dark_skin_tone": "1f469-1f3fe-200d-1f393", + "woman_student_medium-light_skin_tone": "1f469-1f3fc-200d-1f393", + "woman_student_medium_skin_tone": "1f469-1f3fd-200d-1f393", + "woman_superhero_dark_skin_tone": "1f9b8-1f3ff-200d-2640-fe0f", + "woman_superhero_light_skin_tone": "1f9b8-1f3fb-200d-2640-fe0f", + "woman_superhero_medium-dark_skin_tone": "1f9b8-1f3fe-200d-2640-fe0f", + "woman_superhero_medium-light_skin_tone": "1f9b8-1f3fc-200d-2640-fe0f", + "woman_superhero_medium_skin_tone": "1f9b8-1f3fd-200d-2640-fe0f", + "woman_supervillain_dark_skin_tone": "1f9b9-1f3ff-200d-2640-fe0f", + "woman_supervillain_light_skin_tone": "1f9b9-1f3fb-200d-2640-fe0f", + "woman_supervillain_medium-dark_skin_tone": "1f9b9-1f3fe-200d-2640-fe0f", + "woman_supervillain_medium-light_skin_tone": "1f9b9-1f3fc-200d-2640-fe0f", + "woman_supervillain_medium_skin_tone": "1f9b9-1f3fd-200d-2640-fe0f", + "woman_surfing_dark_skin_tone": "1f3c4-1f3ff-200d-2640-fe0f", + "woman_surfing_light_skin_tone": "1f3c4-1f3fb-200d-2640-fe0f", + "woman_surfing_medium-dark_skin_tone": "1f3c4-1f3fe-200d-2640-fe0f", + "woman_surfing_medium-light_skin_tone": "1f3c4-1f3fc-200d-2640-fe0f", + "woman_surfing_medium_skin_tone": "1f3c4-1f3fd-200d-2640-fe0f", + "woman_swimming_dark_skin_tone": "1f3ca-1f3ff-200d-2640-fe0f", + "woman_swimming_light_skin_tone": "1f3ca-1f3fb-200d-2640-fe0f", + "woman_swimming_medium-dark_skin_tone": "1f3ca-1f3fe-200d-2640-fe0f", + "woman_swimming_medium-light_skin_tone": "1f3ca-1f3fc-200d-2640-fe0f", + "woman_swimming_medium_skin_tone": "1f3ca-1f3fd-200d-2640-fe0f", + "woman_teacher": "1f469-200d-1f3eb", + "woman_teacher_dark_skin_tone": "1f469-1f3ff-200d-1f3eb", + "woman_teacher_light_skin_tone": "1f469-1f3fb-200d-1f3eb", + "woman_teacher_medium-dark_skin_tone": "1f469-1f3fe-200d-1f3eb", + "woman_teacher_medium-light_skin_tone": "1f469-1f3fc-200d-1f3eb", + "woman_teacher_medium_skin_tone": "1f469-1f3fd-200d-1f3eb", + "woman_technologist": "1f469-200d-1f4bb", + "woman_technologist_dark_skin_tone": "1f469-1f3ff-200d-1f4bb", + "woman_technologist_light_skin_tone": "1f469-1f3fb-200d-1f4bb", + "woman_technologist_medium-dark_skin_tone": "1f469-1f3fe-200d-1f4bb", + "woman_technologist_medium-light_skin_tone": "1f469-1f3fc-200d-1f4bb", + "woman_technologist_medium_skin_tone": "1f469-1f3fd-200d-1f4bb", + "woman_tipping_hand_dark_skin_tone": "1f481-1f3ff-200d-2640-fe0f", + "woman_tipping_hand_light_skin_tone": "1f481-1f3fb-200d-2640-fe0f", + "woman_tipping_hand_medium-dark_skin_tone": "1f481-1f3fe-200d-2640-fe0f", + "woman_tipping_hand_medium-light_skin_tone": "1f481-1f3fc-200d-2640-fe0f", + "woman_tipping_hand_medium_skin_tone": "1f481-1f3fd-200d-2640-fe0f", + "woman_vampire_dark_skin_tone": "1f9db-1f3ff-200d-2640-fe0f", + "woman_vampire_light_skin_tone": "1f9db-1f3fb-200d-2640-fe0f", + "woman_vampire_medium-dark_skin_tone": "1f9db-1f3fe-200d-2640-fe0f", + "woman_vampire_medium-light_skin_tone": "1f9db-1f3fc-200d-2640-fe0f", + "woman_vampire_medium_skin_tone": "1f9db-1f3fd-200d-2640-fe0f", + "woman_walking_dark_skin_tone": "1f6b6-1f3ff-200d-2640-fe0f", + "woman_walking_facing_right": "1f6b6-200d-2640-fe0f-200d-27a1-fe0f", + "woman_walking_facing_right_dark_skin_tone": "1f6b6-1f3ff-200d-2640-fe0f-200d-27a1-fe0f", + "woman_walking_facing_right_light_skin_tone": "1f6b6-1f3fb-200d-2640-fe0f-200d-27a1-fe0f", + "woman_walking_facing_right_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2640-fe0f-200d-27a1-fe0f", + "woman_walking_facing_right_medium-light_skin_tone": "1f6b6-1f3fc-200d-2640-fe0f-200d-27a1-fe0f", + "woman_walking_facing_right_medium_skin_tone": "1f6b6-1f3fd-200d-2640-fe0f-200d-27a1-fe0f", + "woman_walking_light_skin_tone": "1f6b6-1f3fb-200d-2640-fe0f", + "woman_walking_medium-dark_skin_tone": "1f6b6-1f3fe-200d-2640-fe0f", + "woman_walking_medium-light_skin_tone": "1f6b6-1f3fc-200d-2640-fe0f", + "woman_walking_medium_skin_tone": "1f6b6-1f3fd-200d-2640-fe0f", + "woman_wearing_turban_dark_skin_tone": "1f473-1f3ff-200d-2640-fe0f", + "woman_wearing_turban_light_skin_tone": "1f473-1f3fb-200d-2640-fe0f", + "woman_wearing_turban_medium-dark_skin_tone": "1f473-1f3fe-200d-2640-fe0f", + "woman_wearing_turban_medium-light_skin_tone": "1f473-1f3fc-200d-2640-fe0f", + "woman_wearing_turban_medium_skin_tone": "1f473-1f3fd-200d-2640-fe0f", + "woman_with_headscarf": "1f9d5", + "woman_with_headscarf_dark_skin_tone": "1f9d5-1f3ff", + "woman_with_headscarf_light_skin_tone": "1f9d5-1f3fb", + "woman_with_headscarf_medium-dark_skin_tone": "1f9d5-1f3fe", + "woman_with_headscarf_medium-light_skin_tone": "1f9d5-1f3fc", + "woman_with_headscarf_medium_skin_tone": "1f9d5-1f3fd", + "woman_with_probing_cane": "1f469-200d-1f9af", + "woman_with_turban": "1f473-200d-2640-fe0f", + "woman_with_veil": "1f470-200d-2640-fe0f", + "woman_with_veil_dark_skin_tone": "1f470-1f3ff-200d-2640-fe0f", + "woman_with_veil_light_skin_tone": "1f470-1f3fb-200d-2640-fe0f", + "woman_with_veil_medium-dark_skin_tone": "1f470-1f3fe-200d-2640-fe0f", + "woman_with_veil_medium-light_skin_tone": "1f470-1f3fc-200d-2640-fe0f", + "woman_with_veil_medium_skin_tone": "1f470-1f3fd-200d-2640-fe0f", + "woman_with_white_cane_dark_skin_tone": "1f469-1f3ff-200d-1f9af", + "woman_with_white_cane_facing_right": "1f469-200d-1f9af-200d-27a1-fe0f", + "woman_with_white_cane_facing_right_dark_skin_tone": "1f469-1f3ff-200d-1f9af-200d-27a1-fe0f", + "woman_with_white_cane_facing_right_light_skin_tone": "1f469-1f3fb-200d-1f9af-200d-27a1-fe0f", + "woman_with_white_cane_facing_right_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9af-200d-27a1-fe0f", + "woman_with_white_cane_facing_right_medium-light_skin_tone": "1f469-1f3fc-200d-1f9af-200d-27a1-fe0f", + "woman_with_white_cane_facing_right_medium_skin_tone": "1f469-1f3fd-200d-1f9af-200d-27a1-fe0f", + "woman_with_white_cane_light_skin_tone": "1f469-1f3fb-200d-1f9af", + "woman_with_white_cane_medium-dark_skin_tone": "1f469-1f3fe-200d-1f9af", + "woman_with_white_cane_medium-light_skin_tone": "1f469-1f3fc-200d-1f9af", + "woman_with_white_cane_medium_skin_tone": "1f469-1f3fd-200d-1f9af", + "womans_clothes": "1f45a", + "womans_hat": "1f452", + "women_holding_hands_dark_skin_tone": "1f46d-1f3ff", + "women_holding_hands_dark_skin_tone_light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fb", + "women_holding_hands_dark_skin_tone_medium-dark_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fe", + "women_holding_hands_dark_skin_tone_medium-light_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fc", + "women_holding_hands_dark_skin_tone_medium_skin_tone": "1f469-1f3ff-200d-1f91d-200d-1f469-1f3fd", + "women_holding_hands_light_skin_tone": "1f46d-1f3fb", + "women_holding_hands_light_skin_tone_dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3ff", + "women_holding_hands_light_skin_tone_medium-dark_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fe", + "women_holding_hands_light_skin_tone_medium-light_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fc", + "women_holding_hands_light_skin_tone_medium_skin_tone": "1f469-1f3fb-200d-1f91d-200d-1f469-1f3fd", + "women_holding_hands_medium-dark_skin_tone": "1f46d-1f3fe", + "women_holding_hands_medium-dark_skin_tone_dark_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3ff", + "women_holding_hands_medium-dark_skin_tone_light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fb", + "women_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fc", + "women_holding_hands_medium-dark_skin_tone_medium_skin_tone": "1f469-1f3fe-200d-1f91d-200d-1f469-1f3fd", + "women_holding_hands_medium-light_skin_tone": "1f46d-1f3fc", + "women_holding_hands_medium-light_skin_tone_dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3ff", + "women_holding_hands_medium-light_skin_tone_light_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fb", + "women_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fe", + "women_holding_hands_medium-light_skin_tone_medium_skin_tone": "1f469-1f3fc-200d-1f91d-200d-1f469-1f3fd", + "women_holding_hands_medium_skin_tone": "1f46d-1f3fd", + "women_holding_hands_medium_skin_tone_dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3ff", + "women_holding_hands_medium_skin_tone_light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fb", + "women_holding_hands_medium_skin_tone_medium-dark_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fe", + "women_holding_hands_medium_skin_tone_medium-light_skin_tone": "1f469-1f3fd-200d-1f91d-200d-1f469-1f3fc", + "women_wrestling": "1f93c-200d-2640-fe0f", + "womens": "1f6ba", + "wood": "1fab5", + "woozy_face": "1f974", + "world_map": "1f5fa-fe0f", + "worm": "1fab1", + "worried": "1f61f", + "wrench": "1f527", + "wrestling": "1f93c", + "writing_hand": "270d-fe0f", + "writing_hand_dark_skin_tone": "270d-1f3ff", + "writing_hand_light_skin_tone": "270d-1f3fb", + "writing_hand_medium-dark_skin_tone": "270d-1f3fe", + "writing_hand_medium-light_skin_tone": "270d-1f3fc", + "writing_hand_medium_skin_tone": "270d-1f3fd", + "x": "274c", + "x_ray": "1fa7b", + "xyzzy": "~xyzzy", + "yarn": "1f9f6", + "yawning_face": "1f971", + "yellow_circle": "1f7e1", + "yellow_heart": "1f49b", + "yellow_square": "1f7e8", + "yemen": "1f1fe-1f1ea", + "yen": "1f4b4", + "yin_yang": "262f-fe0f", + "yo_yo": "1fa80", + "yum": "1f60b", + "zambia": "1f1ff-1f1f2", + "zany_face": "1f92a", + "zap": "26a1", + "zebra": "1f993", + "zero": "30-fe0f-20e3", + "zimbabwe": "1f1ff-1f1fc", + "zipper_mouth_face": "1f910", + "zombie": "1f9df", + "zombie_man": "1f9df-200d-2642-fe0f", + "zombie_woman": "1f9df-200d-2640-fe0f", + "zzz": "1f4a4" +} diff --git a/src/emoji.rs b/src/emoji.rs index 72242df..f7a9e75 100644 --- a/src/emoji.rs +++ b/src/emoji.rs @@ -4,33 +4,51 @@ use std::borrow::Cow; use std::collections::HashMap; use std::ops::RangeInclusive; -const EMOJI_RAW: &str = include_str!("emoji.txt"); +/// Euphoria.leet.nu emoji list, obtainable via shell command: +/// +/// ```bash +/// curl 'https://euphoria.leet.nu/static/emoji.json' \ +/// | jq 'to_entries | sort_by(.key) | from_entries' \ +/// > emoji.json +/// ``` +const EMOJI_JSON: &str = include_str!("emoji.json"); /// A map from emoji names to their unicode representation. Not all emojis have /// such a representation. pub struct Emoji(pub HashMap>); -fn parse_hex_to_char(hex: &str) -> char { - u32::from_str_radix(hex, 16).unwrap().try_into().unwrap() +fn parse_hex_to_char(hex: &str) -> Option { + u32::from_str_radix(hex, 16).ok()?.try_into().ok() } -fn parse_line(line: &str) -> (String, Option) { - let mut line = line.split_ascii_whitespace(); - let name = line.next().unwrap().to_string(); - let unicode = line.map(parse_hex_to_char).collect::(); - let unicode = Some(unicode).filter(|u| !u.is_empty()); - (name, unicode) +fn parse_code_points(code_points: &str) -> Option { + code_points + .split('-') + .map(parse_hex_to_char) + .collect::>() } impl Emoji { + /// Load a list of emoji compiled into the library. pub fn load() -> Self { - let map = EMOJI_RAW - .lines() - .map(|l| l.trim()) - .filter(|l| !l.is_empty() && !l.starts_with('#')) - .map(parse_line) - .collect(); - Self(map) + Self::load_from_json(EMOJI_JSON).unwrap() + } + + /// Load a list of emoji from a string containing a JSON object. + /// + /// The object keys are the emoji names (without colons `:`). The object + /// values are the emoji code points encoded as hexadecimal numbers and + /// separated by a dash `-` (e.g. `"34-fe0f-20e3"`). Emojis whose values + /// don't match this schema are interpreted as emojis without unicode + /// representation. + pub fn load_from_json(json: &str) -> Option { + let map = serde_json::from_str::>(json) + .ok()? + .into_iter() + .map(|(k, v)| (k, parse_code_points(&v))) + .collect::>(); + + Some(Self(map)) } pub fn get(&self, name: &str) -> Option> { diff --git a/src/emoji.txt b/src/emoji.txt deleted file mode 100644 index 356a38e..0000000 --- a/src/emoji.txt +++ /dev/null @@ -1,1543 +0,0 @@ -# The vanilla euphoria frontend uses a fork of the npm package -# "emoji-annotation-to-unicode" [0]. It ignores all emoji set to null [1], -# though the fork does not include any such emoji. It also adds and removes a -# few custom emoji, some without unicode equivalent [2]. -# -# [0]: https://github.com/CylonicRaider/emoji-annotation-to-unicode -# [1]: https://github.com/CylonicRaider/heim/blob/6d22aa7bfa42f2e7cb817ef9fe0df14c0906e4ac/client/lib/emoji.js#L42-L44 -# [2]: https://github.com/CylonicRaider/heim/blob/6d22aa7bfa42f2e7cb817ef9fe0df14c0906e4ac/client/lib/emoji.js#L6-L32 - -# Any line that is empty or starts with # is ignored. - -# Each emoji is represented as a single line. The line starts with the emoji -# name, followed by zero or more hexadecimal unicode code points. These elements -# are separated by one or more spaces. If no code points are listed, the emoji -# does not correspond to any unicode code points. - -################################# -## emoji-annotation-to-unicode ## -################################# - -# This section of the file can be generated using the following bash command: -# -# curl https://raw.githubusercontent.com/CylonicRaider/emoji-annotation-to-unicode/master/emoji-annotation-to-unicode.js \ -# | sed 's/module.exports =//;s/};$/}/' \ -# | jq 'map_values(gsub("-"; " ")) | to_entries | map("\(.key) \(.value)") | sort | .[]' -r \ -# | sed 's/^iphone /# iphone /' - -+1 1f44d --1 1f44e -100 1f4af -1234 1f522 -1st_place_medal 1f947 -2nd_place_medal 1f948 -3rd_place_medal 1f949 -8ball 1f3b1 -a 1f170 -ab 1f18e -abc 1f524 -abcd 1f521 -accept 1f251 -aerial_tramway 1f6a1 -afghanistan 1f1e6 1f1eb -airplane 2708 -aland_islands 1f1e6 1f1fd -alarm_clock 23f0 -albania 1f1e6 1f1f1 -alembic 2697 -algeria 1f1e9 1f1ff -alien 1f47d -ambulance 1f691 -american_samoa 1f1e6 1f1f8 -amphora 1f3fa -anchor 2693 -andorra 1f1e6 1f1e9 -angel 1f47c -anger 1f4a2 -angola 1f1e6 1f1f4 -angry 1f620 -anguilla 1f1e6 1f1ee -anguished 1f627 -ant 1f41c -antarctica 1f1e6 1f1f6 -antigua_barbuda 1f1e6 1f1ec -apple 1f34e -aquarius 2652 -argentina 1f1e6 1f1f7 -aries 2648 -armenia 1f1e6 1f1f2 -arrow_backward 25c0 -arrow_double_down 23ec -arrow_double_up 23eb -arrow_down 2b07 -arrow_down_small 1f53d -arrow_forward 25b6 -arrow_heading_down 2935 -arrow_heading_up 2934 -arrow_left 2b05 -arrow_lower_left 2199 -arrow_lower_right 2198 -arrow_right 27a1 -arrow_right_hook 21aa -arrow_up 2b06 -arrow_up_down 2195 -arrow_up_small 1f53c -arrow_upper_left 2196 -arrow_upper_right 2197 -arrows_clockwise 1f503 -arrows_counterclockwise 1f504 -art 1f3a8 -articulated_lorry 1f69b -artificial_satellite 1f6f0 -aruba 1f1e6 1f1fc -asterisk 002a 20e3 -astonished 1f632 -athletic_shoe 1f45f -atm 1f3e7 -atom_symbol 269b -australia 1f1e6 1f1fa -austria 1f1e6 1f1f9 -avocado 1f951 -azerbaijan 1f1e6 1f1ff -b 1f171 -baby 1f476 -baby_bottle 1f37c -baby_chick 1f424 -baby_symbol 1f6bc -back 1f519 -bacon 1f953 -badminton 1f3f8 -baggage_claim 1f6c4 -baguette_bread 1f956 -bahamas 1f1e7 1f1f8 -bahrain 1f1e7 1f1ed -balance_scale 2696 -balloon 1f388 -ballot_box 1f5f3 -ballot_box_with_check 2611 -bamboo 1f38d -banana 1f34c -bangbang 203c -bangladesh 1f1e7 1f1e9 -bank 1f3e6 -bar_chart 1f4ca -barbados 1f1e7 1f1e7 -barber 1f488 -baseball 26be -basketball 1f3c0 -basketball_man 26f9 -basketball_woman 26f9 2640 -bat 1f987 -bath 1f6c0 -bathtub 1f6c1 -battery 1f50b -beach_umbrella 1f3d6 -bear 1f43b -bed 1f6cf -bee 1f41d -beer 1f37a -beers 1f37b -beetle 1f41e -beginner 1f530 -belarus 1f1e7 1f1fe -belgium 1f1e7 1f1ea -belize 1f1e7 1f1ff -bell 1f514 -bellhop_bell 1f6ce -benin 1f1e7 1f1ef -bento 1f371 -bermuda 1f1e7 1f1f2 -bhutan 1f1e7 1f1f9 -bicyclist 1f6b4 -bike 1f6b2 -biking_man 1f6b4 -biking_woman 1f6b4 2640 -bikini 1f459 -biohazard 2623 -bird 1f426 -birthday 1f382 -black_circle 26ab -black_flag 1f3f4 -black_heart 1f5a4 -black_joker 1f0cf -black_large_square 2b1b -black_medium_small_square 25fe -black_medium_square 25fc -black_nib 2712 -black_small_square 25aa -black_square_button 1f532 -blonde_man 1f471 -blonde_woman 1f471 2640 -blossom 1f33c -blowfish 1f421 -blue_book 1f4d8 -blue_car 1f699 -blue_heart 1f499 -blush 1f60a -boar 1f417 -boat 26f5 -bolivia 1f1e7 1f1f4 -bomb 1f4a3 -book 1f4d6 -bookmark 1f516 -bookmark_tabs 1f4d1 -books 1f4da -boom 1f4a5 -boot 1f462 -bosnia_herzegovina 1f1e7 1f1e6 -botswana 1f1e7 1f1fc -bouquet 1f490 -bow 1f647 -bow_and_arrow 1f3f9 -bowing_man 1f647 -bowing_woman 1f647 2640 -bowling 1f3b3 -boxing_glove 1f94a -boy 1f466 -brazil 1f1e7 1f1f7 -bread 1f35e -bride_with_veil 1f470 -bridge_at_night 1f309 -briefcase 1f4bc -british_indian_ocean_territory 1f1ee 1f1f4 -british_virgin_islands 1f1fb 1f1ec -broken_heart 1f494 -brunei 1f1e7 1f1f3 -bug 1f41b -building_construction 1f3d7 -bulb 1f4a1 -bulgaria 1f1e7 1f1ec -bullettrain_front 1f685 -bullettrain_side 1f684 -burkina_faso 1f1e7 1f1eb -burrito 1f32f -burundi 1f1e7 1f1ee -bus 1f68c -business_suit_levitating 1f574 -busstop 1f68f -bust_in_silhouette 1f464 -busts_in_silhouette 1f465 -butterfly 1f98b -cactus 1f335 -cake 1f370 -calendar 1f4c6 -call_me_hand 1f919 -calling 1f4f2 -cambodia 1f1f0 1f1ed -camel 1f42b -camera 1f4f7 -camera_flash 1f4f8 -cameroon 1f1e8 1f1f2 -camping 1f3d5 -canada 1f1e8 1f1e6 -canary_islands 1f1ee 1f1e8 -cancer 264b -candle 1f56f -candy 1f36c -canoe 1f6f6 -cape_verde 1f1e8 1f1fb -capital_abcd 1f520 -capricorn 2651 -car 1f697 -card_file_box 1f5c3 -card_index 1f4c7 -card_index_dividers 1f5c2 -caribbean_netherlands 1f1e7 1f1f6 -carousel_horse 1f3a0 -carrot 1f955 -cat 1f431 -cat2 1f408 -cayman_islands 1f1f0 1f1fe -cd 1f4bf -central_african_republic 1f1e8 1f1eb -chad 1f1f9 1f1e9 -chains 26d3 -champagne 1f37e -chart 1f4b9 -chart_with_downwards_trend 1f4c9 -chart_with_upwards_trend 1f4c8 -checkered_flag 1f3c1 -cheese 1f9c0 -cherries 1f352 -cherry_blossom 1f338 -chestnut 1f330 -chicken 1f414 -children_crossing 1f6b8 -chile 1f1e8 1f1f1 -chipmunk 1f43f -chocolate_bar 1f36b -christmas_island 1f1e8 1f1fd -christmas_tree 1f384 -church 26ea -cinema 1f3a6 -circus_tent 1f3aa -city_sunrise 1f307 -city_sunset 1f306 -cityscape 1f3d9 -cl 1f191 -clamp 1f5dc -clap 1f44f -clapper 1f3ac -classical_building 1f3db -clinking_glasses 1f942 -clipboard 1f4cb -clock1 1f550 -clock10 1f559 -clock1030 1f565 -clock11 1f55a -clock1130 1f566 -clock12 1f55b -clock1230 1f567 -clock130 1f55c -clock2 1f551 -clock230 1f55d -clock3 1f552 -clock330 1f55e -clock4 1f553 -clock430 1f55f -clock5 1f554 -clock530 1f560 -clock6 1f555 -clock630 1f561 -clock7 1f556 -clock730 1f562 -clock8 1f557 -clock830 1f563 -clock9 1f558 -clock930 1f564 -closed_book 1f4d5 -closed_lock_with_key 1f510 -closed_umbrella 1f302 -cloud 2601 -cloud_with_lightning 1f329 -cloud_with_lightning_and_rain 26c8 -cloud_with_rain 1f327 -cloud_with_snow 1f328 -clown_face 1f921 -clubs 2663 -cn 1f1e8 1f1f3 -cocktail 1f378 -cocos_islands 1f1e8 1f1e8 -coffee 2615 -coffin 26b0 -cold_sweat 1f630 -collision 1f4a5 -colombia 1f1e8 1f1f4 -comet 2604 -comoros 1f1f0 1f1f2 -computer 1f4bb -computer_mouse 1f5b1 -confetti_ball 1f38a -confounded 1f616 -confused 1f615 -congo_brazzaville 1f1e8 1f1ec -congo_kinshasa 1f1e8 1f1e9 -congratulations 3297 -construction 1f6a7 -construction_worker 1f477 -construction_worker_man 1f477 -construction_worker_woman 1f477 2640 -control_knobs 1f39b -convenience_store 1f3ea -cook_islands 1f1e8 1f1f0 -cookie 1f36a -cool 1f192 -cop 1f46e -copyright 00a9 -corn 1f33d -costa_rica 1f1e8 1f1f7 -cote_divoire 1f1e8 1f1ee -couch_and_lamp 1f6cb -couple 1f46b -couple_with_heart 1f491 -couple_with_heart_man_man 1f468 2764 1f468 -couple_with_heart_woman_man 1f491 -couple_with_heart_woman_woman 1f469 2764 1f469 -couplekiss_man_man 1f468 2764 1f48b 1f468 -couplekiss_man_woman 1f48f -couplekiss_woman_woman 1f469 2764 1f48b 1f469 -cow 1f42e -cow2 1f404 -cowboy_hat_face 1f920 -crab 1f980 -crayon 1f58d -credit_card 1f4b3 -crescent_moon 1f319 -cricket 1f3cf -croatia 1f1ed 1f1f7 -crocodile 1f40a -croissant 1f950 -crossed_fingers 1f91e -crossed_flags 1f38c -crossed_swords 2694 -crown 1f451 -cry 1f622 -crying_cat_face 1f63f -crystal_ball 1f52e -cuba 1f1e8 1f1fa -cucumber 1f952 -cupid 1f498 -curacao 1f1e8 1f1fc -curly_loop 27b0 -currency_exchange 1f4b1 -curry 1f35b -custard 1f36e -customs 1f6c3 -cyclone 1f300 -cyprus 1f1e8 1f1fe -czech_republic 1f1e8 1f1ff -dagger 1f5e1 -dancer 1f483 -dancers 1f46f -dancing_men 1f46f 2642 -dancing_women 1f46f -dango 1f361 -dark_sunglasses 1f576 -dart 1f3af -dash 1f4a8 -date 1f4c5 -de 1f1e9 1f1ea -deciduous_tree 1f333 -deer 1f98c -denmark 1f1e9 1f1f0 -department_store 1f3ec -derelict_house 1f3da -desert 1f3dc -desert_island 1f3dd -desktop_computer 1f5a5 -detective 1f575 -diamond_shape_with_a_dot_inside 1f4a0 -diamonds 2666 -disappointed 1f61e -disappointed_relieved 1f625 -dizzy 1f4ab -dizzy_face 1f635 -djibouti 1f1e9 1f1ef -do_not_litter 1f6af -dog 1f436 -dog2 1f415 -dollar 1f4b5 -dolls 1f38e -dolphin 1f42c -dominica 1f1e9 1f1f2 -dominican_republic 1f1e9 1f1f4 -door 1f6aa -doughnut 1f369 -dove 1f54a -dragon 1f409 -dragon_face 1f432 -dress 1f457 -dromedary_camel 1f42a -drooling_face 1f924 -droplet 1f4a7 -drum 1f941 -duck 1f986 -dvd 1f4c0 -e-mail 1f4e7 -eagle 1f985 -ear 1f442 -ear_of_rice 1f33e -earth_africa 1f30d -earth_americas 1f30e -earth_asia 1f30f -ecuador 1f1ea 1f1e8 -egg 1f95a -eggplant 1f346 -egypt 1f1ea 1f1ec -eight 0038 20e3 -eight_pointed_black_star 2734 -eight_spoked_asterisk 2733 -el_salvador 1f1f8 1f1fb -electric_plug 1f50c -elephant 1f418 -email 2709 -end 1f51a -envelope 2709 -envelope_with_arrow 1f4e9 -equatorial_guinea 1f1ec 1f1f6 -eritrea 1f1ea 1f1f7 -es 1f1ea 1f1f8 -estonia 1f1ea 1f1ea -ethiopia 1f1ea 1f1f9 -eu 1f1ea 1f1fa -euro 1f4b6 -european_castle 1f3f0 -european_post_office 1f3e4 -european_union 1f1ea 1f1fa -evergreen_tree 1f332 -exclamation 2757 -expressionless 1f611 -eye 1f441 -eye_speech_bubble 1f441 1f5e8 -eyeglasses 1f453 -eyes 1f440 -face_with_head_bandage 1f915 -face_with_thermometer 1f912 -facepunch 1f44a -factory 1f3ed -falkland_islands 1f1eb 1f1f0 -fallen_leaf 1f342 -family 1f46a -family_man_boy 1f468 1f466 -family_man_boy_boy 1f468 1f466 1f466 -family_man_girl 1f468 1f467 -family_man_girl_boy 1f468 1f467 1f466 -family_man_girl_girl 1f468 1f467 1f467 -family_man_man_boy 1f468 1f468 1f466 -family_man_man_boy_boy 1f468 1f468 1f466 1f466 -family_man_man_girl 1f468 1f468 1f467 -family_man_man_girl_boy 1f468 1f468 1f467 1f466 -family_man_man_girl_girl 1f468 1f468 1f467 1f467 -family_man_woman_boy 1f46a -family_man_woman_boy_boy 1f468 1f469 1f466 1f466 -family_man_woman_girl 1f468 1f469 1f467 -family_man_woman_girl_boy 1f468 1f469 1f467 1f466 -family_man_woman_girl_girl 1f468 1f469 1f467 1f467 -family_woman_boy 1f469 1f466 -family_woman_boy_boy 1f469 1f466 1f466 -family_woman_girl 1f469 1f467 -family_woman_girl_boy 1f469 1f467 1f466 -family_woman_girl_girl 1f469 1f467 1f467 -family_woman_woman_boy 1f469 1f469 1f466 -family_woman_woman_boy_boy 1f469 1f469 1f466 1f466 -family_woman_woman_girl 1f469 1f469 1f467 -family_woman_woman_girl_boy 1f469 1f469 1f467 1f466 -family_woman_woman_girl_girl 1f469 1f469 1f467 1f467 -faroe_islands 1f1eb 1f1f4 -fast_forward 23e9 -fax 1f4e0 -fearful 1f628 -feet 1f43e -female_detective 1f575 2640 -ferris_wheel 1f3a1 -ferry 26f4 -field_hockey 1f3d1 -fiji 1f1eb 1f1ef -file_cabinet 1f5c4 -file_folder 1f4c1 -film_projector 1f4fd -film_strip 1f39e -finland 1f1eb 1f1ee -fire 1f525 -fire_engine 1f692 -fireworks 1f386 -first_quarter_moon 1f313 -first_quarter_moon_with_face 1f31b -fish 1f41f -fish_cake 1f365 -fishing_pole_and_fish 1f3a3 -fist 270a -fist_left 1f91b -fist_oncoming 1f44a -fist_raised 270a -fist_right 1f91c -five 0035 20e3 -flags 1f38f -flashlight 1f526 -fleur_de_lis 269c -flight_arrival 1f6ec -flight_departure 1f6eb -flipper 1f42c -floppy_disk 1f4be -flower_playing_cards 1f3b4 -flushed 1f633 -fog 1f32b -foggy 1f301 -football 1f3c8 -footprints 1f463 -fork_and_knife 1f374 -fountain 26f2 -fountain_pen 1f58b -four 0034 20e3 -four_leaf_clover 1f340 -fox_face 1f98a -fr 1f1eb 1f1f7 -framed_picture 1f5bc -free 1f193 -french_guiana 1f1ec 1f1eb -french_polynesia 1f1f5 1f1eb -french_southern_territories 1f1f9 1f1eb -fried_egg 1f373 -fried_shrimp 1f364 -fries 1f35f -frog 1f438 -frowning 1f626 -frowning_face 2639 -frowning_man 1f64d 2642 -frowning_woman 1f64d -fu 1f595 -fuelpump 26fd -full_moon 1f315 -full_moon_with_face 1f31d -funeral_urn 26b1 -gabon 1f1ec 1f1e6 -gambia 1f1ec 1f1f2 -game_die 1f3b2 -gb 1f1ec 1f1e7 -gear 2699 -gem 1f48e -gemini 264a -georgia 1f1ec 1f1ea -ghana 1f1ec 1f1ed -ghost 1f47b -gibraltar 1f1ec 1f1ee -gift 1f381 -gift_heart 1f49d -girl 1f467 -globe_with_meridians 1f310 -goal_net 1f945 -goat 1f410 -golf 26f3 -golfing_man 1f3cc -golfing_woman 1f3cc 2640 -gorilla 1f98d -grapes 1f347 -greece 1f1ec 1f1f7 -green_apple 1f34f -green_book 1f4d7 -green_heart 1f49a -green_salad 1f957 -greenland 1f1ec 1f1f1 -grenada 1f1ec 1f1e9 -grey_exclamation 2755 -grey_question 2754 -grimacing 1f62c -grin 1f601 -grinning 1f600 -guadeloupe 1f1ec 1f1f5 -guam 1f1ec 1f1fa -guardsman 1f482 -guardswoman 1f482 2640 -guatemala 1f1ec 1f1f9 -guernsey 1f1ec 1f1ec -guinea 1f1ec 1f1f3 -guinea_bissau 1f1ec 1f1fc -guitar 1f3b8 -gun 1f52b -guyana 1f1ec 1f1fe -haircut 1f487 -haircut_man 1f487 2642 -haircut_woman 1f487 -haiti 1f1ed 1f1f9 -hamburger 1f354 -hammer 1f528 -hammer_and_pick 2692 -hammer_and_wrench 1f6e0 -hamster 1f439 -hand 270b -handbag 1f45c -handshake 1f91d -hankey 1f4a9 -hash 0023 20e3 -hatched_chick 1f425 -hatching_chick 1f423 -headphones 1f3a7 -hear_no_evil 1f649 -heart 2764 -heart_decoration 1f49f -heart_eyes 1f60d -heart_eyes_cat 1f63b -heartbeat 1f493 -heartpulse 1f497 -hearts 2665 -heavy_check_mark 2714 -heavy_division_sign 2797 -heavy_dollar_sign 1f4b2 -heavy_exclamation_mark 2757 -heavy_heart_exclamation 2763 -heavy_minus_sign 2796 -heavy_multiplication_x 2716 -heavy_plus_sign 2795 -helicopter 1f681 -herb 1f33f -hibiscus 1f33a -high_brightness 1f506 -high_heel 1f460 -hocho 1f52a -hole 1f573 -honduras 1f1ed 1f1f3 -honey_pot 1f36f -honeybee 1f41d -hong_kong 1f1ed 1f1f0 -horse 1f434 -horse_racing 1f3c7 -hospital 1f3e5 -hot_pepper 1f336 -hotdog 1f32d -hotel 1f3e8 -hotsprings 2668 -hourglass 231b -hourglass_flowing_sand 23f3 -house 1f3e0 -house_with_garden 1f3e1 -houses 1f3d8 -hugs 1f917 -hungary 1f1ed 1f1fa -hushed 1f62f -ice_cream 1f368 -ice_hockey 1f3d2 -ice_skate 26f8 -icecream 1f366 -iceland 1f1ee 1f1f8 -id 1f194 -ideograph_advantage 1f250 -imp 1f47f -inbox_tray 1f4e5 -incoming_envelope 1f4e8 -india 1f1ee 1f1f3 -indonesia 1f1ee 1f1e9 -information_desk_person 1f481 -information_source 2139 -innocent 1f607 -interrobang 2049 -# iphone 1f4f1 -iran 1f1ee 1f1f7 -iraq 1f1ee 1f1f6 -ireland 1f1ee 1f1ea -isle_of_man 1f1ee 1f1f2 -israel 1f1ee 1f1f1 -it 1f1ee 1f1f9 -izakaya_lantern 1f3ee -jack_o_lantern 1f383 -jamaica 1f1ef 1f1f2 -japan 1f5fe -japanese_castle 1f3ef -japanese_goblin 1f47a -japanese_ogre 1f479 -jeans 1f456 -jersey 1f1ef 1f1ea -jordan 1f1ef 1f1f4 -joy 1f602 -joy_cat 1f639 -joystick 1f579 -jp 1f1ef 1f1f5 -kaaba 1f54b -kazakhstan 1f1f0 1f1ff -kenya 1f1f0 1f1ea -key 1f511 -keyboard 2328 -keycap_ten 1f51f -kick_scooter 1f6f4 -kimono 1f458 -kiribati 1f1f0 1f1ee -kiss 1f48b -kissing 1f617 -kissing_cat 1f63d -kissing_closed_eyes 1f61a -kissing_heart 1f618 -kissing_smiling_eyes 1f619 -kiwi_fruit 1f95d -knife 1f52a -koala 1f428 -koko 1f201 -kosovo 1f1fd 1f1f0 -kr 1f1f0 1f1f7 -kuwait 1f1f0 1f1fc -kyrgyzstan 1f1f0 1f1ec -label 1f3f7 -lantern 1f3ee -laos 1f1f1 1f1e6 -large_blue_circle 1f535 -large_blue_diamond 1f537 -large_orange_diamond 1f536 -last_quarter_moon 1f317 -last_quarter_moon_with_face 1f31c -latin_cross 271d -latvia 1f1f1 1f1fb -laughing 1f606 -leaves 1f343 -lebanon 1f1f1 1f1e7 -ledger 1f4d2 -left_luggage 1f6c5 -left_right_arrow 2194 -leftwards_arrow_with_hook 21a9 -lemon 1f34b -leo 264c -leopard 1f406 -lesotho 1f1f1 1f1f8 -level_slider 1f39a -liberia 1f1f1 1f1f7 -libra 264e -libya 1f1f1 1f1fe -liechtenstein 1f1f1 1f1ee -light_rail 1f688 -link 1f517 -lion 1f981 -lips 1f444 -lipstick 1f484 -lithuania 1f1f1 1f1f9 -lizard 1f98e -lock 1f512 -lock_with_ink_pen 1f50f -lollipop 1f36d -loop 27bf -loud_sound 1f50a -loudspeaker 1f4e2 -love_hotel 1f3e9 -love_letter 1f48c -low_brightness 1f505 -luxembourg 1f1f1 1f1fa -lying_face 1f925 -m 24c2 -macau 1f1f2 1f1f4 -macedonia 1f1f2 1f1f0 -madagascar 1f1f2 1f1ec -mag 1f50d -mag_right 1f50e -mahjong 1f004 -mailbox 1f4eb -mailbox_closed 1f4ea -mailbox_with_mail 1f4ec -mailbox_with_no_mail 1f4ed -malawi 1f1f2 1f1fc -malaysia 1f1f2 1f1fe -maldives 1f1f2 1f1fb -male_detective 1f575 -mali 1f1f2 1f1f1 -malta 1f1f2 1f1f9 -man 1f468 -man_artist 1f468 1f3a8 -man_astronaut 1f468 1f680 -man_cartwheeling 1f938 2642 -man_cook 1f468 1f373 -man_dancing 1f57a -man_facepalming 1f926 2642 -man_factory_worker 1f468 1f3ed -man_farmer 1f468 1f33e -man_firefighter 1f468 1f692 -man_health_worker 1f468 2695 -man_in_tuxedo 1f935 -man_judge 1f468 2696 -man_juggling 1f939 2642 -man_mechanic 1f468 1f527 -man_office_worker 1f468 1f4bc -man_pilot 1f468 2708 -man_playing_handball 1f93e 2642 -man_playing_water_polo 1f93d 2642 -man_scientist 1f468 1f52c -man_shrugging 1f937 2642 -man_singer 1f468 1f3a4 -man_student 1f468 1f393 -man_teacher 1f468 1f3eb -man_technologist 1f468 1f4bb -man_with_gua_pi_mao 1f472 -man_with_turban 1f473 -mandarin 1f34a -mans_shoe 1f45e -mantelpiece_clock 1f570 -maple_leaf 1f341 -marshall_islands 1f1f2 1f1ed -martial_arts_uniform 1f94b -martinique 1f1f2 1f1f6 -mask 1f637 -massage 1f486 -massage_man 1f486 2642 -massage_woman 1f486 -mauritania 1f1f2 1f1f7 -mauritius 1f1f2 1f1fa -mayotte 1f1fe 1f1f9 -meat_on_bone 1f356 -medal_military 1f396 -medal_sports 1f3c5 -mega 1f4e3 -melon 1f348 -memo 1f4dd -men_wrestling 1f93c 2642 -menorah 1f54e -mens 1f6b9 -metal 1f918 -metro 1f687 -mexico 1f1f2 1f1fd -micronesia 1f1eb 1f1f2 -microphone 1f3a4 -microscope 1f52c -middle_finger 1f595 -milk_glass 1f95b -milky_way 1f30c -minibus 1f690 -minidisc 1f4bd -mobile_phone_off 1f4f4 -moldova 1f1f2 1f1e9 -monaco 1f1f2 1f1e8 -money_mouth_face 1f911 -money_with_wings 1f4b8 -moneybag 1f4b0 -mongolia 1f1f2 1f1f3 -monkey 1f412 -monkey_face 1f435 -monorail 1f69d -montenegro 1f1f2 1f1ea -montserrat 1f1f2 1f1f8 -moon 1f314 -morocco 1f1f2 1f1e6 -mortar_board 1f393 -mosque 1f54c -motor_boat 1f6e5 -motor_scooter 1f6f5 -motorcycle 1f3cd -motorway 1f6e3 -mount_fuji 1f5fb -mountain 26f0 -mountain_bicyclist 1f6b5 -mountain_biking_man 1f6b5 -mountain_biking_woman 1f6b5 2640 -mountain_cableway 1f6a0 -mountain_railway 1f69e -mountain_snow 1f3d4 -mouse 1f42d -mouse2 1f401 -movie_camera 1f3a5 -moyai 1f5ff -mozambique 1f1f2 1f1ff -mrs_claus 1f936 -muscle 1f4aa -mushroom 1f344 -musical_keyboard 1f3b9 -musical_note 1f3b5 -musical_score 1f3bc -mute 1f507 -myanmar 1f1f2 1f1f2 -nail_care 1f485 -name_badge 1f4db -namibia 1f1f3 1f1e6 -national_park 1f3de -nauru 1f1f3 1f1f7 -nauseated_face 1f922 -necktie 1f454 -negative_squared_cross_mark 274e -nepal 1f1f3 1f1f5 -nerd_face 1f913 -netherlands 1f1f3 1f1f1 -neutral_face 1f610 -new 1f195 -new_caledonia 1f1f3 1f1e8 -new_moon 1f311 -new_moon_with_face 1f31a -new_zealand 1f1f3 1f1ff -newspaper 1f4f0 -newspaper_roll 1f5de -next_track_button 23ed -ng 1f196 -ng_man 1f645 2642 -ng_woman 1f645 -nicaragua 1f1f3 1f1ee -niger 1f1f3 1f1ea -nigeria 1f1f3 1f1ec -night_with_stars 1f303 -nine 0039 20e3 -niue 1f1f3 1f1fa -no_bell 1f515 -no_bicycles 1f6b3 -no_entry 26d4 -no_entry_sign 1f6ab -no_good 1f645 -no_good_man 1f645 2642 -no_good_woman 1f645 -no_mobile_phones 1f4f5 -no_mouth 1f636 -no_pedestrians 1f6b7 -no_smoking 1f6ad -non-potable_water 1f6b1 -norfolk_island 1f1f3 1f1eb -north_korea 1f1f0 1f1f5 -northern_mariana_islands 1f1f2 1f1f5 -norway 1f1f3 1f1f4 -nose 1f443 -notebook 1f4d3 -notebook_with_decorative_cover 1f4d4 -notes 1f3b6 -nut_and_bolt 1f529 -o 2b55 -o2 1f17e -ocean 1f30a -octopus 1f419 -oden 1f362 -office 1f3e2 -oil_drum 1f6e2 -ok 1f197 -ok_hand 1f44c -ok_man 1f646 2642 -ok_woman 1f646 -old_key 1f5dd -older_man 1f474 -older_woman 1f475 -om 1f549 -oman 1f1f4 1f1f2 -on 1f51b -oncoming_automobile 1f698 -oncoming_bus 1f68d -oncoming_police_car 1f694 -oncoming_taxi 1f696 -one 0031 20e3 -open_book 1f4d6 -open_file_folder 1f4c2 -open_hands 1f450 -open_mouth 1f62e -open_umbrella 2602 -ophiuchus 26ce -orange 1f34a -orange_book 1f4d9 -orthodox_cross 2626 -outbox_tray 1f4e4 -owl 1f989 -ox 1f402 -package 1f4e6 -page_facing_up 1f4c4 -page_with_curl 1f4c3 -pager 1f4df -paintbrush 1f58c -pakistan 1f1f5 1f1f0 -palau 1f1f5 1f1fc -palestinian_territories 1f1f5 1f1f8 -palm_tree 1f334 -panama 1f1f5 1f1e6 -pancakes 1f95e -panda_face 1f43c -paperclip 1f4ce -paperclips 1f587 -papua_new_guinea 1f1f5 1f1ec -paraguay 1f1f5 1f1fe -parasol_on_ground 26f1 -parking 1f17f -part_alternation_mark 303d -partly_sunny 26c5 -passenger_ship 1f6f3 -passport_control 1f6c2 -pause_button 23f8 -paw_prints 1f43e -peace_symbol 262e -peach 1f351 -peanuts 1f95c -pear 1f350 -pen 1f58a -pencil 1f4dd -pencil2 270f -penguin 1f427 -pensive 1f614 -performing_arts 1f3ad -persevere 1f623 -person_fencing 1f93a -person_frowning 1f64d -person_with_blond_hair 1f471 -person_with_pouting_face 1f64e -peru 1f1f5 1f1ea -philippines 1f1f5 1f1ed -phone 260e -pick 26cf -pig 1f437 -pig2 1f416 -pig_nose 1f43d -pill 1f48a -pineapple 1f34d -ping_pong 1f3d3 -pisces 2653 -pitcairn_islands 1f1f5 1f1f3 -pizza 1f355 -place_of_worship 1f6d0 -plate_with_cutlery 1f37d -play_or_pause_button 23ef -point_down 1f447 -point_left 1f448 -point_right 1f449 -point_up 261d -point_up_2 1f446 -poland 1f1f5 1f1f1 -police_car 1f693 -policeman 1f46e -policewoman 1f46e 2640 -poodle 1f429 -poop 1f4a9 -popcorn 1f37f -portugal 1f1f5 1f1f9 -post_office 1f3e3 -postal_horn 1f4ef -postbox 1f4ee -potable_water 1f6b0 -potato 1f954 -pouch 1f45d -poultry_leg 1f357 -pound 1f4b7 -pout 1f621 -pouting_cat 1f63e -pouting_man 1f64e 2642 -pouting_woman 1f64e -pray 1f64f -prayer_beads 1f4ff -pregnant_woman 1f930 -previous_track_button 23ee -prince 1f934 -princess 1f478 -printer 1f5a8 -puerto_rico 1f1f5 1f1f7 -punch 1f44a -purple_heart 1f49c -purse 1f45b -pushpin 1f4cc -put_litter_in_its_place 1f6ae -qatar 1f1f6 1f1e6 -question 2753 -rabbit 1f430 -rabbit2 1f407 -racehorse 1f40e -racing_car 1f3ce -radio 1f4fb -radio_button 1f518 -radioactive 2622 -rage 1f621 -railway_car 1f683 -railway_track 1f6e4 -rainbow 1f308 -rainbow_flag 1f3f3 1f308 -raised_back_of_hand 1f91a -raised_hand 270b -raised_hand_with_fingers_splayed 1f590 -raised_hands 1f64c -raising_hand 1f64b -raising_hand_man 1f64b 2642 -raising_hand_woman 1f64b -ram 1f40f -ramen 1f35c -rat 1f400 -record_button 23fa -recycle 267b -red_car 1f697 -red_circle 1f534 -registered 00ae -relaxed 263a -relieved 1f60c -reminder_ribbon 1f397 -repeat 1f501 -repeat_one 1f502 -rescue_worker_helmet 26d1 -restroom 1f6bb -reunion 1f1f7 1f1ea -revolving_hearts 1f49e -rewind 23ea -rhinoceros 1f98f -ribbon 1f380 -rice 1f35a -rice_ball 1f359 -rice_cracker 1f358 -rice_scene 1f391 -right_anger_bubble 1f5ef -ring 1f48d -robot 1f916 -rocket 1f680 -rofl 1f923 -roll_eyes 1f644 -roller_coaster 1f3a2 -romania 1f1f7 1f1f4 -rooster 1f413 -rose 1f339 -rosette 1f3f5 -rotating_light 1f6a8 -round_pushpin 1f4cd -rowboat 1f6a3 -rowing_man 1f6a3 -rowing_woman 1f6a3 2640 -ru 1f1f7 1f1fa -rugby_football 1f3c9 -runner 1f3c3 -running 1f3c3 -running_man 1f3c3 -running_shirt_with_sash 1f3bd -running_woman 1f3c3 2640 -rwanda 1f1f7 1f1fc -sa 1f202 -sagittarius 2650 -sailboat 26f5 -sake 1f376 -samoa 1f1fc 1f1f8 -san_marino 1f1f8 1f1f2 -sandal 1f461 -santa 1f385 -sao_tome_principe 1f1f8 1f1f9 -satellite 1f4e1 -satisfied 1f606 -saudi_arabia 1f1f8 1f1e6 -saxophone 1f3b7 -school 1f3eb -school_satchel 1f392 -scissors 2702 -scorpion 1f982 -scorpius 264f -scream 1f631 -scream_cat 1f640 -scroll 1f4dc -seat 1f4ba -secret 3299 -see_no_evil 1f648 -seedling 1f331 -selfie 1f933 -senegal 1f1f8 1f1f3 -serbia 1f1f7 1f1f8 -seven 0037 20e3 -seychelles 1f1f8 1f1e8 -shallow_pan_of_food 1f958 -shamrock 2618 -shark 1f988 -shaved_ice 1f367 -sheep 1f411 -shell 1f41a -shield 1f6e1 -shinto_shrine 26e9 -ship 1f6a2 -shirt 1f455 -shit 1f4a9 -shoe 1f45e -shopping 1f6cd -shopping_cart 1f6d2 -shower 1f6bf -shrimp 1f990 -sierra_leone 1f1f8 1f1f1 -signal_strength 1f4f6 -singapore 1f1f8 1f1ec -sint_maarten 1f1f8 1f1fd -six 0036 20e3 -six_pointed_star 1f52f -ski 1f3bf -skier 26f7 -skull 1f480 -skull_and_crossbones 2620 -sleeping 1f634 -sleeping_bed 1f6cc -sleepy 1f62a -slightly_frowning_face 1f641 -slightly_smiling_face 1f642 -slot_machine 1f3b0 -slovakia 1f1f8 1f1f0 -slovenia 1f1f8 1f1ee -small_airplane 1f6e9 -small_blue_diamond 1f539 -small_orange_diamond 1f538 -small_red_triangle 1f53a -small_red_triangle_down 1f53b -smile 1f604 -smile_cat 1f638 -smiley 1f603 -smiley_cat 1f63a -smiling_imp 1f608 -smirk 1f60f -smirk_cat 1f63c -smoking 1f6ac -snail 1f40c -snake 1f40d -sneezing_face 1f927 -snowboarder 1f3c2 -snowflake 2744 -snowman 26c4 -snowman_with_snow 2603 -sob 1f62d -soccer 26bd -solomon_islands 1f1f8 1f1e7 -somalia 1f1f8 1f1f4 -soon 1f51c -sos 1f198 -sound 1f509 -south_africa 1f1ff 1f1e6 -south_georgia_south_sandwich_islands 1f1ec 1f1f8 -south_sudan 1f1f8 1f1f8 -space_invader 1f47e -spades 2660 -spaghetti 1f35d -sparkle 2747 -sparkler 1f387 -sparkles 2728 -sparkling_heart 1f496 -speak_no_evil 1f64a -speaker 1f508 -speaking_head 1f5e3 -speech_balloon 1f4ac -speedboat 1f6a4 -spider 1f577 -spider_web 1f578 -spiral_calendar 1f5d3 -spiral_notepad 1f5d2 -spoon 1f944 -squid 1f991 -sri_lanka 1f1f1 1f1f0 -st_barthelemy 1f1e7 1f1f1 -st_helena 1f1f8 1f1ed -st_kitts_nevis 1f1f0 1f1f3 -st_lucia 1f1f1 1f1e8 -st_pierre_miquelon 1f1f5 1f1f2 -st_vincent_grenadines 1f1fb 1f1e8 -stadium 1f3df -star 2b50 -star2 1f31f -star_and_crescent 262a -star_of_david 2721 -stars 1f320 -station 1f689 -statue_of_liberty 1f5fd -steam_locomotive 1f682 -stew 1f372 -stop_button 23f9 -stop_sign 1f6d1 -stopwatch 23f1 -straight_ruler 1f4cf -strawberry 1f353 -stuck_out_tongue 1f61b -stuck_out_tongue_closed_eyes 1f61d -stuck_out_tongue_winking_eye 1f61c -studio_microphone 1f399 -stuffed_flatbread 1f959 -sudan 1f1f8 1f1e9 -sun_behind_large_cloud 1f325 -sun_behind_rain_cloud 1f326 -sun_behind_small_cloud 1f324 -sun_with_face 1f31e -sunflower 1f33b -sunglasses 1f60e -sunny 2600 -sunrise 1f305 -sunrise_over_mountains 1f304 -surfer 1f3c4 -surfing_man 1f3c4 -surfing_woman 1f3c4 2640 -suriname 1f1f8 1f1f7 -sushi 1f363 -suspension_railway 1f69f -swaziland 1f1f8 1f1ff -sweat 1f613 -sweat_drops 1f4a6 -sweat_smile 1f605 -sweden 1f1f8 1f1ea -sweet_potato 1f360 -swimmer 1f3ca -swimming_man 1f3ca -swimming_woman 1f3ca 2640 -switzerland 1f1e8 1f1ed -symbols 1f523 -synagogue 1f54d -syria 1f1f8 1f1fe -syringe 1f489 -taco 1f32e -tada 1f389 -taiwan 1f1f9 1f1fc -tajikistan 1f1f9 1f1ef -tanabata_tree 1f38b -tangerine 1f34a -tanzania 1f1f9 1f1ff -taurus 2649 -taxi 1f695 -tea 1f375 -telephone 260e -telephone_receiver 1f4de -telescope 1f52d -tennis 1f3be -tent 26fa -thailand 1f1f9 1f1ed -thermometer 1f321 -thinking 1f914 -thought_balloon 1f4ad -three 0033 20e3 -thumbsdown 1f44e -thumbsup 1f44d -ticket 1f3ab -tickets 1f39f -tiger 1f42f -tiger2 1f405 -timer_clock 23f2 -timor_leste 1f1f9 1f1f1 -tipping_hand_man 1f481 2642 -tipping_hand_woman 1f481 -tired_face 1f62b -tm 2122 -togo 1f1f9 1f1ec -toilet 1f6bd -tokelau 1f1f9 1f1f0 -tokyo_tower 1f5fc -tomato 1f345 -tonga 1f1f9 1f1f4 -tongue 1f445 -top 1f51d -tophat 1f3a9 -tornado 1f32a -tr 1f1f9 1f1f7 -trackball 1f5b2 -tractor 1f69c -traffic_light 1f6a5 -train 1f68b -train2 1f686 -tram 1f68a -triangular_flag_on_post 1f6a9 -triangular_ruler 1f4d0 -trident 1f531 -trinidad_tobago 1f1f9 1f1f9 -triumph 1f624 -trolleybus 1f68e -trophy 1f3c6 -tropical_drink 1f379 -tropical_fish 1f420 -truck 1f69a -trumpet 1f3ba -tshirt 1f455 -tulip 1f337 -tumbler_glass 1f943 -tunisia 1f1f9 1f1f3 -turkey 1f983 -turkmenistan 1f1f9 1f1f2 -turks_caicos_islands 1f1f9 1f1e8 -turtle 1f422 -tuvalu 1f1f9 1f1fb -tv 1f4fa -twisted_rightwards_arrows 1f500 -two 0032 20e3 -two_hearts 1f495 -two_men_holding_hands 1f46c -two_women_holding_hands 1f46d -u5272 1f239 -u5408 1f234 -u55b6 1f23a -u6307 1f22f -u6708 1f237 -u6709 1f236 -u6e80 1f235 -u7121 1f21a -u7533 1f238 -u7981 1f232 -u7a7a 1f233 -uganda 1f1fa 1f1ec -uk 1f1ec 1f1e7 -ukraine 1f1fa 1f1e6 -umbrella 2614 -unamused 1f612 -underage 1f51e -unicorn 1f984 -united_arab_emirates 1f1e6 1f1ea -unlock 1f513 -up 1f199 -upside_down_face 1f643 -uruguay 1f1fa 1f1fe -us 1f1fa 1f1f8 -us_virgin_islands 1f1fb 1f1ee -uzbekistan 1f1fa 1f1ff -v 270c -vanuatu 1f1fb 1f1fa -vatican_city 1f1fb 1f1e6 -venezuela 1f1fb 1f1ea -vertical_traffic_light 1f6a6 -vhs 1f4fc -vibration_mode 1f4f3 -video_camera 1f4f9 -video_game 1f3ae -vietnam 1f1fb 1f1f3 -violin 1f3bb -virgo 264d -volcano 1f30b -volleyball 1f3d0 -vs 1f19a -vulcan_salute 1f596 -walking 1f6b6 -walking_man 1f6b6 -walking_woman 1f6b6 2640 -wallis_futuna 1f1fc 1f1eb -waning_crescent_moon 1f318 -waning_gibbous_moon 1f316 -warning 26a0 -wastebasket 1f5d1 -watch 231a -water_buffalo 1f403 -watermelon 1f349 -wave 1f44b -wavy_dash 3030 -waxing_crescent_moon 1f312 -waxing_gibbous_moon 1f314 -wc 1f6be -weary 1f629 -wedding 1f492 -weight_lifting_man 1f3cb -weight_lifting_woman 1f3cb 2640 -western_sahara 1f1ea 1f1ed -whale 1f433 -whale2 1f40b -wheel_of_dharma 2638 -wheelchair 267f -white_check_mark 2705 -white_circle 26aa -white_flag 1f3f3 -white_flower 1f4ae -white_large_square 2b1c -white_medium_small_square 25fd -white_medium_square 25fb -white_small_square 25ab -white_square_button 1f533 -wilted_flower 1f940 -wind_chime 1f390 -wind_face 1f32c -wine_glass 1f377 -wink 1f609 -wolf 1f43a -woman 1f469 -woman_artist 1f469 1f3a8 -woman_astronaut 1f469 1f680 -woman_cartwheeling 1f938 2640 -woman_cook 1f469 1f373 -woman_facepalming 1f926 2640 -woman_factory_worker 1f469 1f3ed -woman_farmer 1f469 1f33e -woman_firefighter 1f469 1f692 -woman_health_worker 1f469 2695 -woman_judge 1f469 2696 -woman_juggling 1f939 2640 -woman_mechanic 1f469 1f527 -woman_office_worker 1f469 1f4bc -woman_pilot 1f469 2708 -woman_playing_handball 1f93e 2640 -woman_playing_water_polo 1f93d 2640 -woman_scientist 1f469 1f52c -woman_shrugging 1f937 2640 -woman_singer 1f469 1f3a4 -woman_student 1f469 1f393 -woman_teacher 1f469 1f3eb -woman_technologist 1f469 1f4bb -woman_with_turban 1f473 2640 -womans_clothes 1f45a -womans_hat 1f452 -women_wrestling 1f93c 2640 -womens 1f6ba -world_map 1f5fa -worried 1f61f -wrench 1f527 -writing_hand 270d -x 274c -yellow_heart 1f49b -yemen 1f1fe 1f1ea -yen 1f4b4 -yin_yang 262f -yum 1f60b -zambia 1f1ff 1f1f2 -zap 26a1 -zero 0030 20e3 -zimbabwe 1f1ff 1f1fc -zipper_mouth_face 1f910 -zzz 1f4a4 - -################## -## custom emoji ## -################## - -+1 -bronze -bronze!? -bronze?! -euphoria -euphoria! -chromakode -pewpewpew -leck -dealwithit -spider -indigo_heart -orange_heart -bot -greenduck -mobile 1f4f1 -poop -sad 1f622 -sun 2600 -tumbleweed -tumbleweed2 -tumbleweed! -fjafjkldskf7jkfdj From 20b2aab209ed1b49aac73701e9c0840ee4f1668d Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 20 May 2024 18:53:55 +0200 Subject: [PATCH 07/23] Update dependencies --- Cargo.toml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index fc69f70..b1343a6 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,27 +7,27 @@ edition = "2021" bot = ["dep:async-trait", "dep:clap", "dep:cookie"] [dependencies] -async-trait = { version = "0.1.75", optional = true } +async-trait = { version = "0.1.80", optional = true } caseless = "0.2.1" -cookie = { version = "0.18.0", optional = true } +cookie = { version = "0.18.1", optional = true } futures-util = { version = "0.3.30", default-features = false, features = ["sink"] } -log = "0.4.20" -serde = { version = "1.0.193", features = ["derive"] } -serde_json = "1.0.108" -time = { version = "0.3.31", features = ["serde"] } -tokio = { version = "1.35.1", features = ["time", "sync", "macros", "rt"] } -tokio-stream = "0.1.14" +log = "0.4.21" +serde = { version = "1.0.202", features = ["derive"] } +serde_json = "1.0.117" +time = { version = "0.3.36", features = ["serde"] } +tokio = { version = "1.37.0", features = ["time", "sync", "macros", "rt"] } +tokio-stream = "0.1.15" tokio-tungstenite = { version = "0.21.0", features = ["rustls-tls-native-roots"] } -unicode-normalization = "0.1.22" +unicode-normalization = "0.1.23" [dependencies.clap] -version = "4.4.11" +version = "4.5.4" optional = true default-features = false features = ["std", "derive", "deprecated"] [dev-dependencies] # For example bot -tokio = { version = "1.35.1", features = ["rt-multi-thread"] } +tokio = { version = "1.37.0", features = ["rt-multi-thread"] } [[example]] name = "testbot_instance" From 0256329f65f3ed853092cc210ae2a4a8c526a4bf Mon Sep 17 00:00:00 2001 From: Joscha Date: Mon, 20 May 2024 18:54:48 +0200 Subject: [PATCH 08/23] Bump version to 0.5.1 --- CHANGELOG.md | 2 ++ Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 949de9f..1464ea7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ Procedure when bumping the version number: ## Unreleased +## v0.5.1 - 2024-05-20 + ### Added - `Emoji::load_from_json` diff --git a/Cargo.toml b/Cargo.toml index b1343a6..fb59b0d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "euphoxide" -version = "0.5.0" +version = "0.5.1" edition = "2021" [features] From 4314a24e78aab610b0487a424b75693f08722227 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 17:08:52 +0100 Subject: [PATCH 09/23] Switch to jiff from time --- CHANGELOG.md | 4 ++++ Cargo.toml | 2 +- examples/testbot_commands.rs | 8 +++---- examples/testbot_instance.rs | 43 ++++++----------------------------- examples/testbot_instances.rs | 43 ++++++----------------------------- examples/testbot_manual.rs | 43 ++++++----------------------------- src/api/types.rs | 12 ++++------ src/bot/botrulez/uptime.rs | 23 ++++++++----------- src/conn.rs | 14 ++++++------ 9 files changed, 51 insertions(+), 141 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1464ea7..287c658 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ Procedure when bumping the version number: ## Unreleased +### Changed + +- **(breaking)** Switched to `jiff` from `time` + ## v0.5.1 - 2024-05-20 ### Added diff --git a/Cargo.toml b/Cargo.toml index fb59b0d..2d45180 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,10 +11,10 @@ async-trait = { version = "0.1.80", optional = true } caseless = "0.2.1" cookie = { version = "0.18.1", optional = true } futures-util = { version = "0.3.30", default-features = false, features = ["sink"] } +jiff = { version = "0.1.15", features = ["serde"] } log = "0.4.21" serde = { version = "1.0.202", features = ["derive"] } serde_json = "1.0.117" -time = { version = "0.3.36", features = ["serde"] } tokio = { version = "1.37.0", features = ["time", "sync", "macros", "rt"] } tokio-stream = "0.1.15" tokio-tungstenite = { version = "0.21.0", features = ["rustls-tls-native-roots"] } diff --git a/examples/testbot_commands.rs b/examples/testbot_commands.rs index 3a07c19..bacab89 100644 --- a/examples/testbot_commands.rs +++ b/examples/testbot_commands.rs @@ -12,8 +12,8 @@ use euphoxide::bot::commands::Commands; use euphoxide::bot::instance::{Event, ServerConfig}; use euphoxide::bot::instances::Instances; use euphoxide::conn; +use jiff::Timestamp; use log::error; -use time::OffsetDateTime; use tokio::sync::mpsc; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; @@ -74,7 +74,7 @@ impl ClapCommand for Test { struct Bot { commands: Arc>, - start_time: OffsetDateTime, + start_time: Timestamp, stop: bool, } @@ -85,7 +85,7 @@ impl HasDescriptions for Bot { } impl HasStartTime for Bot { - fn start_time(&self) -> OffsetDateTime { + fn start_time(&self) -> Timestamp { self.start_time } } @@ -107,7 +107,7 @@ async fn main() { let mut bot = Bot { commands: cmds.clone(), - start_time: OffsetDateTime::now_utc(), + start_time: Timestamp::now(), stop: false, }; diff --git a/examples/testbot_instance.rs b/examples/testbot_instance.rs index 5b932b3..c1c2895 100644 --- a/examples/testbot_instance.rs +++ b/examples/testbot_instance.rs @@ -3,46 +3,14 @@ use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; +use euphoxide::bot::botrulez; use euphoxide::bot::instance::{ConnSnapshot, Event, ServerConfig}; -use time::OffsetDateTime; +use jiff::Timestamp; use tokio::sync::mpsc; const NICK: &str = "TestBot"; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; -fn format_delta(delta: time::Duration) -> String { - const MINUTE: u64 = 60; - const HOUR: u64 = MINUTE * 60; - const DAY: u64 = HOUR * 24; - - let mut seconds: u64 = delta.whole_seconds().try_into().unwrap(); - let mut parts = vec![]; - - let days = seconds / DAY; - if days > 0 { - parts.push(format!("{days}d")); - seconds -= days * DAY; - } - - let hours = seconds / HOUR; - if hours > 0 { - parts.push(format!("{hours}h")); - seconds -= hours * HOUR; - } - - let mins = seconds / MINUTE; - if mins > 0 { - parts.push(format!("{mins}m")); - seconds -= mins * MINUTE; - } - - if parts.is_empty() || seconds > 0 { - parts.push(format!("{seconds}s")); - } - - parts.join(" ") -} - async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ()> { let data = match packet.content { Ok(data) => data, @@ -107,8 +75,11 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( reply = Some(HELP.to_string()); } else if content == format!("!uptime @{NICK}") { if let Some(joined) = snapshot.state.joined() { - let delta = OffsetDateTime::now_utc() - joined.since; - reply = Some(format!("/me has been up for {}", format_delta(delta))); + let delta = Timestamp::now() - joined.since; + reply = Some(format!( + "/me has been up for {}", + botrulez::format_duration(delta) + )); } } else if content == "!test" { reply = Some("Test successful!".to_string()); diff --git a/examples/testbot_instances.rs b/examples/testbot_instances.rs index a8a6848..d44cbe7 100644 --- a/examples/testbot_instances.rs +++ b/examples/testbot_instances.rs @@ -3,47 +3,15 @@ use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; +use euphoxide::bot::botrulez; use euphoxide::bot::instance::{ConnSnapshot, Event, ServerConfig}; use euphoxide::bot::instances::Instances; -use time::OffsetDateTime; +use jiff::Timestamp; use tokio::sync::mpsc; const NICK: &str = "TestBot"; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; -fn format_delta(delta: time::Duration) -> String { - const MINUTE: u64 = 60; - const HOUR: u64 = MINUTE * 60; - const DAY: u64 = HOUR * 24; - - let mut seconds: u64 = delta.whole_seconds().try_into().unwrap(); - let mut parts = vec![]; - - let days = seconds / DAY; - if days > 0 { - parts.push(format!("{days}d")); - seconds -= days * DAY; - } - - let hours = seconds / HOUR; - if hours > 0 { - parts.push(format!("{hours}h")); - seconds -= hours * HOUR; - } - - let mins = seconds / MINUTE; - if mins > 0 { - parts.push(format!("{mins}m")); - seconds -= mins * MINUTE; - } - - if parts.is_empty() || seconds > 0 { - parts.push(format!("{seconds}s")); - } - - parts.join(" ") -} - async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ()> { let data = match packet.content { Ok(data) => data, @@ -108,8 +76,11 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( reply = Some(HELP.to_string()); } else if content == format!("!uptime @{NICK}") { if let Some(joined) = snapshot.state.joined() { - let delta = OffsetDateTime::now_utc() - joined.since; - reply = Some(format!("/me has been up for {}", format_delta(delta))); + let delta = Timestamp::now() - joined.since; + reply = Some(format!( + "/me has been up for {}", + botrulez::format_duration(delta) + )); } } else if content == "!test" { reply = Some("Test successful!".to_string()); diff --git a/examples/testbot_manual.rs b/examples/testbot_manual.rs index c059004..d6535a4 100644 --- a/examples/testbot_manual.rs +++ b/examples/testbot_manual.rs @@ -6,8 +6,9 @@ use std::time::Duration; use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; +use euphoxide::bot::botrulez; use euphoxide::conn::{Conn, ConnTx, State}; -use time::OffsetDateTime; +use jiff::Timestamp; const TIMEOUT: Duration = Duration::from_secs(10); const DOMAIN: &str = "euphoria.leet.nu"; @@ -15,39 +16,6 @@ const ROOM: &str = "test"; const NICK: &str = "TestBot"; const HELP: &str = "I'm an example bot for https://github.com/Garmelon/euphoxide"; -fn format_delta(delta: time::Duration) -> String { - const MINUTE: u64 = 60; - const HOUR: u64 = MINUTE * 60; - const DAY: u64 = HOUR * 24; - - let mut seconds: u64 = delta.whole_seconds().try_into().unwrap(); - let mut parts = vec![]; - - let days = seconds / DAY; - if days > 0 { - parts.push(format!("{days}d")); - seconds -= days * DAY; - } - - let hours = seconds / HOUR; - if hours > 0 { - parts.push(format!("{hours}h")); - seconds -= hours * HOUR; - } - - let mins = seconds / MINUTE; - if mins > 0 { - parts.push(format!("{mins}m")); - seconds -= mins * MINUTE; - } - - if parts.is_empty() || seconds > 0 { - parts.push(format!("{seconds}s")); - } - - parts.join(" ") -} - async fn on_packet(packet: ParsedPacket, conn_tx: &ConnTx, state: &State) -> Result<(), ()> { let data = match packet.content { Ok(data) => data, @@ -112,8 +80,11 @@ async fn on_packet(packet: ParsedPacket, conn_tx: &ConnTx, state: &State) -> Res reply = Some(HELP.to_string()); } else if content == format!("!uptime @{NICK}") { if let Some(joined) = state.joined() { - let delta = OffsetDateTime::now_utc() - joined.since; - reply = Some(format!("/me has been up for {}", format_delta(delta))); + let delta = Timestamp::now() - joined.since; + reply = Some(format!( + "/me has been up for {}", + botrulez::format_duration(delta) + )); } } else if content == "!test" { reply = Some("Test successful!".to_string()); diff --git a/src/api/types.rs b/src/api/types.rs index d1a393d..8f438e9 100644 --- a/src/api/types.rs +++ b/src/api/types.rs @@ -10,9 +10,9 @@ use std::num::ParseIntError; use std::str::FromStr; use std::{error, fmt}; +use jiff::Timestamp; use serde::{de, ser, Deserialize, Serialize}; use serde_json::Value; -use time::{OffsetDateTime, UtcOffset}; /// Describes an account and its preferred name. #[derive(Debug, Clone, Serialize, Deserialize)] @@ -403,19 +403,15 @@ impl<'de> Deserialize<'de> for Snowflake { /// Time is specified as a signed 64-bit integer, giving the number of seconds /// since the Unix Epoch. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub struct Time(#[serde(with = "time::serde::timestamp")] pub OffsetDateTime); +pub struct Time(#[serde(with = "jiff::fmt::serde::timestamp::second::required")] pub Timestamp); impl Time { - pub fn new(time: OffsetDateTime) -> Self { - let time = time - .to_offset(UtcOffset::UTC) - .replace_millisecond(0) - .unwrap(); + pub fn new(time: Timestamp) -> Self { Self(time) } pub fn now() -> Self { - Self::new(OffsetDateTime::now_utc()) + Self::new(Timestamp::now()) } } diff --git a/src/bot/botrulez/uptime.rs b/src/bot/botrulez/uptime.rs index b4465e5..1c98ff6 100644 --- a/src/bot/botrulez/uptime.rs +++ b/src/bot/botrulez/uptime.rs @@ -1,24 +1,21 @@ use async_trait::async_trait; use clap::Parser; -use time::macros::format_description; -use time::{Duration, OffsetDateTime, UtcOffset}; +use jiff::{Span, Timestamp}; use crate::api::Message; use crate::bot::command::{ClapCommand, Command, Context}; use crate::conn; -pub fn format_time(t: OffsetDateTime) -> String { - let t = t.to_offset(UtcOffset::UTC); - let format = format_description!("[year]-[month]-[day] [hour]:[minute]:[second] UTC"); - t.format(format).unwrap() +pub fn format_time(t: Timestamp) -> String { + t.strftime("%Y-&m-%d %H:%M:%S UTC").to_string() } -pub fn format_duration(d: Duration) -> String { +pub fn format_duration(d: Span) -> String { let d_abs = d.abs(); - let days = d_abs.whole_days(); - let hours = d_abs.whole_hours() % 24; - let mins = d_abs.whole_minutes() % 60; - let secs = d_abs.whole_seconds() % 60; + let days = d_abs.get_days(); + let hours = d_abs.get_hours() % 24; + let mins = d_abs.get_minutes() % 60; + let secs = d_abs.get_seconds() % 60; let mut segments = vec![]; if days > 0 { @@ -48,13 +45,13 @@ pub fn format_duration(d: Duration) -> String { pub struct Uptime; pub trait HasStartTime { - fn start_time(&self) -> OffsetDateTime; + fn start_time(&self) -> Timestamp; } impl Uptime { fn formulate_reply(&self, ctx: &Context, bot: &B, connected: bool) -> String { let start = bot.start_time(); - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); let mut reply = format!( "/me has been up since {} ({})", diff --git a/src/conn.rs b/src/conn.rs index 92d083c..8d6820c 100644 --- a/src/conn.rs +++ b/src/conn.rs @@ -6,8 +6,8 @@ use std::future::Future; use std::time::{Duration, Instant}; use std::{error, fmt, result}; -use ::time::OffsetDateTime; use futures_util::SinkExt; +use jiff::Timestamp; use log::debug; use tokio::net::TcpStream; use tokio::select; @@ -75,7 +75,7 @@ pub type Result = result::Result; #[derive(Debug, Clone)] pub struct Joining { - pub since: OffsetDateTime, + pub since: Timestamp, pub hello: Option, pub snapshot: Option, pub bounce: Option, @@ -84,7 +84,7 @@ pub struct Joining { impl Joining { fn new() -> Self { Self { - since: OffsetDateTime::now_utc(), + since: Timestamp::now(), hello: None, snapshot: None, bounce: None, @@ -122,7 +122,7 @@ impl Joining { .map(|s| (s.session_id.clone(), SessionInfo::Full(s))) .collect::>(); Some(Joined { - since: OffsetDateTime::now_utc(), + since: Timestamp::now(), session, account: hello.account.clone(), listing, @@ -164,7 +164,7 @@ impl SessionInfo { #[derive(Debug, Clone)] pub struct Joined { - pub since: OffsetDateTime, + pub since: Timestamp, pub session: SessionView, pub account: Option, pub listing: HashMap, @@ -522,10 +522,10 @@ impl Conn { self.disconnect().await?; } - let now = OffsetDateTime::now_utc(); + let now = Timestamp::now(); // Send new ws ping - let ws_payload = now.unix_timestamp_nanos().to_be_bytes().to_vec(); + let ws_payload = now.as_millisecond().to_be_bytes().to_vec(); self.last_ws_ping_payload = Some(ws_payload.clone()); self.last_ws_ping_replied_to = false; self.ws.send(tungstenite::Message::Ping(ws_payload)).await?; From 85c93ee01d7645f391cd284767f26f56a069efe3 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 17:10:42 +0100 Subject: [PATCH 10/23] Update dependencies --- Cargo.toml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 2d45180..3a44b76 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,27 +7,27 @@ edition = "2021" bot = ["dep:async-trait", "dep:clap", "dep:cookie"] [dependencies] -async-trait = { version = "0.1.80", optional = true } +async-trait = { version = "0.1.83", optional = true } caseless = "0.2.1" cookie = { version = "0.18.1", optional = true } -futures-util = { version = "0.3.30", default-features = false, features = ["sink"] } +futures-util = { version = "0.3.31", default-features = false, features = ["sink"] } jiff = { version = "0.1.15", features = ["serde"] } -log = "0.4.21" -serde = { version = "1.0.202", features = ["derive"] } -serde_json = "1.0.117" -tokio = { version = "1.37.0", features = ["time", "sync", "macros", "rt"] } -tokio-stream = "0.1.15" -tokio-tungstenite = { version = "0.21.0", features = ["rustls-tls-native-roots"] } -unicode-normalization = "0.1.23" +log = "0.4.22" +serde = { version = "1.0.215", features = ["derive"] } +serde_json = "1.0.133" +tokio = { version = "1.42.0", features = ["time", "sync", "macros", "rt"] } +tokio-stream = "0.1.16" +tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] } +unicode-normalization = "0.1.24" [dependencies.clap] -version = "4.5.4" +version = "4.5.22" optional = true default-features = false features = ["std", "derive", "deprecated"] [dev-dependencies] # For example bot -tokio = { version = "1.37.0", features = ["rt-multi-thread"] } +tokio = { version = "1.42.0", features = ["rt-multi-thread"] } [[example]] name = "testbot_instance" From 8506a231dd076358dd0ae0c51b93907060333c62 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 17:14:15 +0100 Subject: [PATCH 11/23] Add more lints --- Cargo.toml | 22 ++++++++++++++++++++++ examples/testbot_commands.rs | 2 ++ examples/testbot_instance.rs | 1 + examples/testbot_instances.rs | 1 + examples/testbot_manual.rs | 1 + src/lib.rs | 11 ----------- 6 files changed, 27 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 3a44b76..917f0b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,3 +40,25 @@ required-features = ["bot"] [[example]] name = "testbot_commands" required-features = ["bot"] + +[lints] +rust.unsafe_code = { level = "forbid", priority = 1 } +# Lint groups +rust.deprecated_safe = "warn" +rust.future_incompatible = "warn" +rust.keyword_idents = "warn" +rust.rust_2018_idioms = "warn" +rust.unused = "warn" +# Individual lints +rust.non_local_definitions = "warn" +rust.redundant_imports = "warn" +rust.redundant_lifetimes = "warn" +rust.single_use_lifetimes = "warn" +rust.unit_bindings = "warn" +rust.unnameable_types = "warn" +rust.unused_crate_dependencies = "warn" +rust.unused_import_braces = "warn" +rust.unused_lifetimes = "warn" +rust.unused_qualifications = "warn" +# Clippy +clippy.use_self = "warn" diff --git a/examples/testbot_commands.rs b/examples/testbot_commands.rs index bacab89..f6d184a 100644 --- a/examples/testbot_commands.rs +++ b/examples/testbot_commands.rs @@ -1,3 +1,5 @@ +#![allow(unused_crate_dependencies)] + // TODO Add description // TODO Clean up and unify test bots diff --git a/examples/testbot_instance.rs b/examples/testbot_instance.rs index c1c2895..f748429 100644 --- a/examples/testbot_instance.rs +++ b/examples/testbot_instance.rs @@ -1,5 +1,6 @@ //! Similar to the `testbot_manual` example, but using [`Instance`] to connect //! to the room (and to reconnect). +#![allow(unused_crate_dependencies)] use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; diff --git a/examples/testbot_instances.rs b/examples/testbot_instances.rs index d44cbe7..2ad134b 100644 --- a/examples/testbot_instances.rs +++ b/examples/testbot_instances.rs @@ -1,5 +1,6 @@ //! Similar to the `testbot_manual` example, but using [`Instance`] to connect //! to the room (and to reconnect). +#![allow(unused_crate_dependencies)] use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; diff --git a/examples/testbot_manual.rs b/examples/testbot_manual.rs index d6535a4..71a7280 100644 --- a/examples/testbot_manual.rs +++ b/examples/testbot_manual.rs @@ -1,5 +1,6 @@ //! A small bot that doesn't use the `bot` submodule. Meant to show how the main //! parts of the API fit together. +#![allow(unused_crate_dependencies)] use std::error::Error; use std::time::Duration; diff --git a/src/lib.rs b/src/lib.rs index 66fb34e..380b321 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,14 +1,3 @@ -#![forbid(unsafe_code)] -// Rustc lint groups -#![warn(future_incompatible)] -#![warn(rust_2018_idioms)] -#![warn(unused)] -// Rustc lints -#![warn(noop_method_call)] -#![warn(single_use_lifetimes)] -// Clippy lints -#![warn(clippy::use_self)] - pub mod api; #[cfg(feature = "bot")] pub mod bot; From f973a819b6e3d1ff6c1d55b76747199e3cae5489 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 17:14:55 +0100 Subject: [PATCH 12/23] Make botrulez submodules public This allows users of the library to use the commands' Args structs. --- CHANGELOG.md | 7 +++++++ src/bot/botrulez.rs | 8 ++++---- src/bot/botrulez/uptime.rs | 2 +- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 287c658..d741133 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,13 @@ Procedure when bumping the version number: ## Unreleased +### Added + +- `bot::botrulez::full_help` +- `bot::botrulez::ping` +- `bot::botrulez::short_help` +- `bot::botrulez::uptime` + ### Changed - **(breaking)** Switched to `jiff` from `time` diff --git a/src/bot/botrulez.rs b/src/bot/botrulez.rs index 3161ad6..2120ce3 100644 --- a/src/bot/botrulez.rs +++ b/src/bot/botrulez.rs @@ -1,8 +1,8 @@ //! The main [botrulez](https://github.com/jedevc/botrulez) commands. -mod full_help; -mod ping; -mod short_help; -mod uptime; +pub mod full_help; +pub mod ping; +pub mod short_help; +pub mod uptime; pub use self::full_help::{FullHelp, HasDescriptions}; pub use self::ping::Ping; diff --git a/src/bot/botrulez/uptime.rs b/src/bot/botrulez/uptime.rs index 1c98ff6..7f79ba3 100644 --- a/src/bot/botrulez/uptime.rs +++ b/src/bot/botrulez/uptime.rs @@ -100,7 +100,7 @@ where pub struct Args { /// Show how long the bot has been connected without interruption. #[arg(long, short)] - connected: bool, + pub connected: bool, } #[async_trait] From 61f5559370a80a38f7fa5a629112045887c0a812 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 18:24:18 +0100 Subject: [PATCH 13/23] Document rustls panic in changelog --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d741133..54b8300 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,13 @@ Procedure when bumping the version number: ### Changed - **(breaking)** Switched to `jiff` from `time` +- **(breaking)** Bumped `tokio-tungstenite` dependency from `0.18` to `0.24`. If + this causes a panic while using euphoxide, consider following the steps + mentioned in the [tokio-tungstenite README]. If I'm reading the [rustls docs] + correctly, it is on the users of the libraries to set the required features. + +[tokio-tungstenite README]: https://github.com/snapview/tokio-tungstenite?tab=readme-ov-file#features +[rustls docs]: https://docs.rs/rustls/0.23.19/rustls/crypto/struct.CryptoProvider.html#using-the-per-process-default-cryptoprovider ## v0.5.1 - 2024-05-20 From 7360bf96f81a52f422fbe35a7d093571e9c79533 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 18:52:29 +0100 Subject: [PATCH 14/23] Fix rustls panic in example bots --- Cargo.toml | 2 +- examples/testbot_commands.rs | 7 +++++-- examples/testbot_instance.rs | 6 +++++- examples/testbot_instances.rs | 6 +++++- examples/testbot_manual.rs | 6 +++++- 5 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 917f0b4..0ae6832 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,6 +27,7 @@ default-features = false features = ["std", "derive", "deprecated"] [dev-dependencies] # For example bot +rustls = "0.23.19" tokio = { version = "1.42.0", features = ["rt-multi-thread"] } [[example]] @@ -56,7 +57,6 @@ rust.redundant_lifetimes = "warn" rust.single_use_lifetimes = "warn" rust.unit_bindings = "warn" rust.unnameable_types = "warn" -rust.unused_crate_dependencies = "warn" rust.unused_import_braces = "warn" rust.unused_lifetimes = "warn" rust.unused_qualifications = "warn" diff --git a/examples/testbot_commands.rs b/examples/testbot_commands.rs index f6d184a..c3afada 100644 --- a/examples/testbot_commands.rs +++ b/examples/testbot_commands.rs @@ -1,5 +1,3 @@ -#![allow(unused_crate_dependencies)] - // TODO Add description // TODO Clean up and unify test bots @@ -94,6 +92,11 @@ impl HasStartTime for Bot { #[tokio::main] async fn main() { + // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 + rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .unwrap(); + let (tx, mut rx) = mpsc::unbounded_channel(); let mut instances = Instances::new(ServerConfig::default()); diff --git a/examples/testbot_instance.rs b/examples/testbot_instance.rs index f748429..f60f3b9 100644 --- a/examples/testbot_instance.rs +++ b/examples/testbot_instance.rs @@ -1,6 +1,5 @@ //! Similar to the `testbot_manual` example, but using [`Instance`] to connect //! to the room (and to reconnect). -#![allow(unused_crate_dependencies)] use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; @@ -123,6 +122,11 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( #[tokio::main] async fn main() { + // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 + rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .unwrap(); + let (tx, mut rx) = mpsc::unbounded_channel(); let _instance = ServerConfig::default() diff --git a/examples/testbot_instances.rs b/examples/testbot_instances.rs index 2ad134b..0fb612f 100644 --- a/examples/testbot_instances.rs +++ b/examples/testbot_instances.rs @@ -1,6 +1,5 @@ //! Similar to the `testbot_manual` example, but using [`Instance`] to connect //! to the room (and to reconnect). -#![allow(unused_crate_dependencies)] use euphoxide::api::packet::ParsedPacket; use euphoxide::api::{Data, Nick, Send}; @@ -124,6 +123,11 @@ async fn on_packet(packet: ParsedPacket, snapshot: ConnSnapshot) -> Result<(), ( #[tokio::main] async fn main() { + // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 + rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .unwrap(); + let (tx, mut rx) = mpsc::unbounded_channel(); let mut instances = Instances::new(ServerConfig::default()); diff --git a/examples/testbot_manual.rs b/examples/testbot_manual.rs index 71a7280..da21db0 100644 --- a/examples/testbot_manual.rs +++ b/examples/testbot_manual.rs @@ -1,6 +1,5 @@ //! A small bot that doesn't use the `bot` submodule. Meant to show how the main //! parts of the API fit together. -#![allow(unused_crate_dependencies)] use std::error::Error; use std::time::Duration; @@ -127,6 +126,11 @@ async fn on_packet(packet: ParsedPacket, conn_tx: &ConnTx, state: &State) -> Res #[tokio::main] async fn main() -> Result<(), Box> { + // https://github.com/snapview/tokio-tungstenite/issues/353#issuecomment-2455247837 + rustls::crypto::aws_lc_rs::default_provider() + .install_default() + .unwrap(); + let (mut conn, _) = Conn::connect(DOMAIN, ROOM, false, None, TIMEOUT).await?; while let Ok(packet) = conn.recv().await { From cdcf80ab9abdeb11a5498bebd44752bf9fe507d5 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 18:56:03 +0100 Subject: [PATCH 15/23] Fix timestamps with too much precision being representable --- CHANGELOG.md | 7 +++++++ src/api/types.rs | 12 ++++++++---- src/conn.rs | 2 +- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 54b8300..6ef9b70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,6 +16,8 @@ Procedure when bumping the version number: ### Added +- `api::Time::from_timestamp` +- `api::Time::as_timestamp` - `bot::botrulez::full_help` - `bot::botrulez::ping` - `bot::botrulez::short_help` @@ -24,6 +26,7 @@ Procedure when bumping the version number: ### Changed - **(breaking)** Switched to `jiff` from `time` +- **(breaking)** `api::Time` contents are now an `i64` - **(breaking)** Bumped `tokio-tungstenite` dependency from `0.18` to `0.24`. If this causes a panic while using euphoxide, consider following the steps mentioned in the [tokio-tungstenite README]. If I'm reading the [rustls docs] @@ -32,6 +35,10 @@ Procedure when bumping the version number: [tokio-tungstenite README]: https://github.com/snapview/tokio-tungstenite?tab=readme-ov-file#features [rustls docs]: https://docs.rs/rustls/0.23.19/rustls/crypto/struct.CryptoProvider.html#using-the-per-process-default-cryptoprovider +### Removed + +- `api::Time::new` + ## v0.5.1 - 2024-05-20 ### Added diff --git a/src/api/types.rs b/src/api/types.rs index 8f438e9..b1408a8 100644 --- a/src/api/types.rs +++ b/src/api/types.rs @@ -403,15 +403,19 @@ impl<'de> Deserialize<'de> for Snowflake { /// Time is specified as a signed 64-bit integer, giving the number of seconds /// since the Unix Epoch. #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] -pub struct Time(#[serde(with = "jiff::fmt::serde::timestamp::second::required")] pub Timestamp); +pub struct Time(pub i64); impl Time { - pub fn new(time: Timestamp) -> Self { - Self(time) + pub fn from_timestamp(time: Timestamp) -> Self { + Self(time.as_second()) + } + + pub fn as_timestamp(&self) -> Timestamp { + Timestamp::from_second(self.0).unwrap() } pub fn now() -> Self { - Self::new(Timestamp::now()) + Self::from_timestamp(Timestamp::now()) } } diff --git a/src/conn.rs b/src/conn.rs index 8d6820c..6d88827 100644 --- a/src/conn.rs +++ b/src/conn.rs @@ -531,7 +531,7 @@ impl Conn { self.ws.send(tungstenite::Message::Ping(ws_payload)).await?; // Send new euph ping - let euph_payload = Time::new(now); + let euph_payload = Time::from_timestamp(now); self.last_euph_ping_payload = Some(euph_payload); self.last_euph_ping_replied_to = false; let (tx, _) = oneshot::channel(); From 58b55ef4338a7bb3aeae091b8bb79867f01fa083 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 18:56:52 +0100 Subject: [PATCH 16/23] Fix link to euph api in docs --- src/api.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api.rs b/src/api.rs index d72b91c..e24ca1d 100644 --- a/src/api.rs +++ b/src/api.rs @@ -1,6 +1,6 @@ //! Models the [euphoria API][0]. //! -//! [0](https://github.com/CylonicRaider/heim/blob/master/doc/api.md) +//! [0]: https://euphoria.leet.nu/heim/api mod account_cmds; mod events; From fe6869493225abb1229631816ffdc2fdae5d32e3 Mon Sep 17 00:00:00 2001 From: Joscha Date: Wed, 4 Dec 2024 20:01:32 +0100 Subject: [PATCH 17/23] Fix time and duration formatting --- CHANGELOG.md | 3 +++ src/bot/botrulez.rs | 2 +- src/bot/botrulez/uptime.rs | 30 +++++++++++++++++++----------- 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ef9b70..6dfca90 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -22,6 +22,7 @@ Procedure when bumping the version number: - `bot::botrulez::ping` - `bot::botrulez::short_help` - `bot::botrulez::uptime` +- `bot::botrulez::format_relative_time` ### Changed @@ -31,6 +32,8 @@ Procedure when bumping the version number: this causes a panic while using euphoxide, consider following the steps mentioned in the [tokio-tungstenite README]. If I'm reading the [rustls docs] correctly, it is on the users of the libraries to set the required features. +- `bot::botrulez::format_duration` now no longer mentions "since" or "ago", but + instead has a sign (`-`) if the duration is negative. [tokio-tungstenite README]: https://github.com/snapview/tokio-tungstenite?tab=readme-ov-file#features [rustls docs]: https://docs.rs/rustls/0.23.19/rustls/crypto/struct.CryptoProvider.html#using-the-per-process-default-cryptoprovider diff --git a/src/bot/botrulez.rs b/src/bot/botrulez.rs index 2120ce3..6dd5adb 100644 --- a/src/bot/botrulez.rs +++ b/src/bot/botrulez.rs @@ -7,4 +7,4 @@ pub mod uptime; pub use self::full_help::{FullHelp, HasDescriptions}; pub use self::ping::Ping; pub use self::short_help::ShortHelp; -pub use self::uptime::{format_duration, format_time, HasStartTime, Uptime}; +pub use self::uptime::{format_duration, format_relative_time, format_time, HasStartTime, Uptime}; diff --git a/src/bot/botrulez/uptime.rs b/src/bot/botrulez/uptime.rs index 7f79ba3..d8b1d0d 100644 --- a/src/bot/botrulez/uptime.rs +++ b/src/bot/botrulez/uptime.rs @@ -1,21 +1,29 @@ use async_trait::async_trait; use clap::Parser; -use jiff::{Span, Timestamp}; +use jiff::{Span, Timestamp, Unit}; use crate::api::Message; use crate::bot::command::{ClapCommand, Command, Context}; use crate::conn; pub fn format_time(t: Timestamp) -> String { - t.strftime("%Y-&m-%d %H:%M:%S UTC").to_string() + t.strftime("%Y-%m-%d %H:%M:%S UTC").to_string() +} + +pub fn format_relative_time(d: Span) -> String { + if d.is_positive() { + format!("in {}", format_duration(d.abs())) + } else { + format!("{} ago", format_duration(d.abs())) + } } pub fn format_duration(d: Span) -> String { - let d_abs = d.abs(); - let days = d_abs.get_days(); - let hours = d_abs.get_hours() % 24; - let mins = d_abs.get_minutes() % 60; - let secs = d_abs.get_seconds() % 60; + let total = d.abs().total(Unit::Second).unwrap() as i64; + let secs = total % 60; + let mins = (total / 60) % 60; + let hours = (total / 60 / 60) % 24; + let days = total / 60 / 60 / 24; let mut segments = vec![]; if days > 0 { @@ -36,9 +44,9 @@ pub fn format_duration(d: Span) -> String { let segments = segments.join(" "); if d.is_positive() { - format!("in {segments}") + segments } else { - format!("{segments} ago") + format!("-{segments}") } } @@ -56,7 +64,7 @@ impl Uptime { let mut reply = format!( "/me has been up since {} ({})", format_time(start), - format_duration(start - now), + format_relative_time(start - now), ); if connected { @@ -64,7 +72,7 @@ impl Uptime { reply.push_str(&format!( ", connected since {} ({})", format_time(since), - format_duration(since - now), + format_relative_time(since - now), )); } From bc3e3b1e13f4ac78b4df3096d9ff4c0cbdbbc4f6 Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 20 Feb 2025 20:16:11 +0100 Subject: [PATCH 18/23] Update tokio-tungstenite --- Cargo.toml | 2 +- src/conn.rs | 10 ++++++---- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 0ae6832..ed9c7f4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -17,7 +17,7 @@ serde = { version = "1.0.215", features = ["derive"] } serde_json = "1.0.133" tokio = { version = "1.42.0", features = ["time", "sync", "macros", "rt"] } tokio-stream = "0.1.16" -tokio-tungstenite = { version = "0.24.0", features = ["rustls-tls-native-roots"] } +tokio-tungstenite = { version = "0.26.2", features = ["rustls-tls-native-roots"] } unicode-normalization = "0.1.24" [dependencies.clap] diff --git a/src/conn.rs b/src/conn.rs index 6d88827..7255d60 100644 --- a/src/conn.rs +++ b/src/conn.rs @@ -427,7 +427,7 @@ impl Conn { } tungstenite::Message::Ping(_) => {} tungstenite::Message::Pong(payload) => { - if self.last_ws_ping_payload == Some(payload) { + if self.last_ws_ping_payload == Some(payload.to_vec()) { self.last_ws_ping_replied_to = true; } } @@ -528,7 +528,9 @@ impl Conn { let ws_payload = now.as_millisecond().to_be_bytes().to_vec(); self.last_ws_ping_payload = Some(ws_payload.clone()); self.last_ws_ping_replied_to = false; - self.ws.send(tungstenite::Message::Ping(ws_payload)).await?; + self.ws + .send(tungstenite::Message::Ping(ws_payload.into())) + .await?; // Send new euph ping let euph_payload = Time::from_timestamp(now); @@ -561,7 +563,7 @@ impl Conn { .into_packet()?; debug!(target: "euphoxide::conn::full", "Sending {packet:?}"); - let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?); + let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?.into()); self.ws.send(msg).await?; let _ = reply_tx.send(self.replies.wait_for(id)); @@ -579,7 +581,7 @@ impl Conn { .into_packet()?; debug!(target: "euphoxide::conn::full", "Sending {packet:?}"); - let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?); + let msg = tungstenite::Message::Text(serde_json::to_string(&packet)?.into()); self.ws.send(msg).await?; Ok(()) From 1d444684f7f292183c1ab5c89fef3872dadf96fd Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 20 Feb 2025 20:16:50 +0100 Subject: [PATCH 19/23] Update dependencies --- Cargo.toml | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index ed9c7f4..8d4f092 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,28 +7,28 @@ edition = "2021" bot = ["dep:async-trait", "dep:clap", "dep:cookie"] [dependencies] -async-trait = { version = "0.1.83", optional = true } -caseless = "0.2.1" +async-trait = { version = "0.1.86", optional = true } +caseless = "0.2.2" cookie = { version = "0.18.1", optional = true } futures-util = { version = "0.3.31", default-features = false, features = ["sink"] } -jiff = { version = "0.1.15", features = ["serde"] } -log = "0.4.22" -serde = { version = "1.0.215", features = ["derive"] } -serde_json = "1.0.133" -tokio = { version = "1.42.0", features = ["time", "sync", "macros", "rt"] } -tokio-stream = "0.1.16" +jiff = { version = "0.2.1", features = ["serde"] } +log = "0.4.25" +serde = { version = "1.0.218", features = ["derive"] } +serde_json = "1.0.139" +tokio = { version = "1.43.0", features = ["time", "sync", "macros", "rt"] } +tokio-stream = "0.1.17" tokio-tungstenite = { version = "0.26.2", features = ["rustls-tls-native-roots"] } unicode-normalization = "0.1.24" [dependencies.clap] -version = "4.5.22" +version = "4.5.30" optional = true default-features = false features = ["std", "derive", "deprecated"] [dev-dependencies] # For example bot -rustls = "0.23.19" -tokio = { version = "1.42.0", features = ["rt-multi-thread"] } +rustls = "0.23.23" +tokio = { version = "1.43.0", features = ["rt-multi-thread"] } [[example]] name = "testbot_instance" From 4f7cc49b636301ce9beea9324a0a1390f8391009 Mon Sep 17 00:00:00 2001 From: Joscha Date: Fri, 21 Feb 2025 00:40:15 +0100 Subject: [PATCH 20/23] Bump version to 0.6.0 --- CHANGELOG.md | 2 ++ Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6dfca90..aef37c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ Procedure when bumping the version number: ## Unreleased +## v0.6.0 - 2025-02-21 + ### Added - `api::Time::from_timestamp` diff --git a/Cargo.toml b/Cargo.toml index 8d4f092..1e6a0b4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "euphoxide" -version = "0.5.1" +version = "0.6.0" edition = "2021" [features] From 6eea194d52fb63d7fb260d06e61d0625addf8c67 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 23 Feb 2025 21:37:44 +0100 Subject: [PATCH 21/23] Update emoji --- CHANGELOG.md | 4 ++++ src/emoji.json | 5 +++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aef37c6..04d83a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,10 @@ Procedure when bumping the version number: ## Unreleased +### Changed + +- Updated set of emoji names + ## v0.6.0 - 2025-02-21 ### Added diff --git a/src/emoji.json b/src/emoji.json index e9f8068..b26a1f7 100644 --- a/src/emoji.json +++ b/src/emoji.json @@ -878,7 +878,7 @@ "fist_raised": "270a", "fist_right": "1f91c", "five": "35-fe0f-20e3", - "fjafjkldskf7jkfdj": "1f577", + "fjafjkldskf7jkfdj": "1f577-fe0f", "flags": "1f38f", "flamingo": "1f9a9", "flashlight": "1f526", @@ -958,6 +958,7 @@ "georgia": "1f1ec-1f1ea", "ghana": "1f1ec-1f1ed", "ghost": "1f47b", + "ghoti": "1f41f", "gibraltar": "1f1ec-1f1ee", "gift": "1f381", "gift_heart": "1f49d", @@ -2985,7 +2986,7 @@ "speaking_head": "1f5e3-fe0f", "speech_balloon": "1f4ac", "speedboat": "1f6a4", - "spider": "1f577", + "spider": "1f577-fe0f", "spider_web": "1f578-fe0f", "spiral_calendar": "1f5d3-fe0f", "spiral_notepad": "1f5d2-fe0f", From 095d2cea86a574732e82385e217381b35cf65e4d Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 23 Feb 2025 22:34:22 +0100 Subject: [PATCH 22/23] Fix nick hue hashing algorithm in some edge cases When the nick consisted entirely of non-alphanumeric characters and included at least one colon-delimited emoji, the hue hashing reimplementation would produce an incorrect result because colon-delimited emoji were removed at the wrong point in the hashing process. --- CHANGELOG.md | 4 ++++ src/nick.rs | 26 +++++++++++++++++++------- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 04d83a2..bec1e03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,6 +18,10 @@ Procedure when bumping the version number: - Updated set of emoji names +### Fixed + +- Nick hue hashing algorithm in some edge cases + ## v0.6.0 - 2025-02-21 ### Added diff --git a/src/nick.rs b/src/nick.rs index 03ada70..fc652bf 100644 --- a/src/nick.rs +++ b/src/nick.rs @@ -5,9 +5,10 @@ use unicode_normalization::UnicodeNormalization; use crate::emoji::Emoji; -/// Does not remove emoji. -fn hue_normalize(text: &str) -> String { - text.chars() +fn hue_normalize(emoji: &Emoji, text: &str) -> String { + emoji + .remove(text) + .chars() .filter(|&c| c.is_ascii_alphanumeric() || c == '_' || c == '-') .map(|c| c.to_ascii_lowercase()) .collect() @@ -15,7 +16,7 @@ fn hue_normalize(text: &str) -> String { /// A re-implementation of [euphoria's nick hue hashing algorithm][0]. /// -/// [0]: https://github.com/CylonicRaider/heim/blob/master/client/lib/hueHash.js +/// [0]: https://github.com/CylonicRaider/heim/blob/097a1fde89ada53de2b70e51e635257f27956e4e/client/lib/heim/hueHash.js fn hue_hash(text: &str, offset: i64) -> u8 { let mut val = 0_i32; for bibyte in text.encode_utf16() { @@ -35,7 +36,13 @@ const GREENIE_OFFSET: i64 = 148 - 192; // 148 - hue_hash("greenie", 0) /// This should be slightly faster than [`hue`] but produces incorrect results /// if any colon-delimited emoji are present. pub fn hue_without_removing_emoji(nick: &str) -> u8 { - let normalized = hue_normalize(nick); + // An emoji-less version of hue_normalize + let normalized = nick + .chars() + .filter(|&c| c.is_ascii_alphanumeric() || c == '_' || c == '-') + .map(|c| c.to_ascii_lowercase()) + .collect::(); + if normalized.is_empty() { hue_hash(nick, GREENIE_OFFSET) } else { @@ -48,9 +55,14 @@ pub fn hue_without_removing_emoji(nick: &str) -> u8 { /// This is a reimplementation of [euphoria's nick hue hashing algorithm][0]. It /// should always return the same value as the official client's implementation. /// -/// [0]: https://github.com/CylonicRaider/heim/blob/978c921063e6b06012fc8d16d9fbf1b3a0be1191/client/lib/hueHash.js +/// [0]: https://github.com/CylonicRaider/heim/blob/097a1fde89ada53de2b70e51e635257f27956e4e/client/lib/heim/hueHash.js pub fn hue(emoji: &Emoji, nick: &str) -> u8 { - hue_without_removing_emoji(&emoji.remove(nick)) + let normalized = hue_normalize(emoji, nick); + if normalized.is_empty() { + hue_hash(nick, GREENIE_OFFSET) + } else { + hue_hash(&normalized, GREENIE_OFFSET) + } } /// Normalize a nick to a form that can be compared against other nicks. From 7a292c429ad44aa6aa52fc381e3168841d6303b0 Mon Sep 17 00:00:00 2001 From: Joscha Date: Sun, 23 Feb 2025 23:33:28 +0100 Subject: [PATCH 23/23] Bump version to 0.6.1 --- CHANGELOG.md | 2 ++ Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bec1e03..524e877 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,8 @@ Procedure when bumping the version number: ## Unreleased +## v0.6.1 - 2025-02-23 + ### Changed - Updated set of emoji names diff --git a/Cargo.toml b/Cargo.toml index 1e6a0b4..cf65579 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "euphoxide" -version = "0.6.0" +version = "0.6.1" edition = "2021" [features]