Răsfoiți Sursa

Version 6.2.0-1095

Threema 3 săptămâni în urmă
părinte
comite
0437b0468a
100 a modificat fișierele cu 7392 adăugiri și 6998 ștergeri
  1. 1 0
      .gitignore
  2. 31 38
      README.md
  3. BIN
      app/assets/emojis/activity-0.png
  4. BIN
      app/assets/emojis/flags-0.png
  5. BIN
      app/assets/emojis/flags-1.png
  6. BIN
      app/assets/emojis/food-0.png
  7. BIN
      app/assets/emojis/nature-0.png
  8. BIN
      app/assets/emojis/objects-0.png
  9. BIN
      app/assets/emojis/people-0.png
  10. BIN
      app/assets/emojis/people-1.png
  11. BIN
      app/assets/emojis/people-10.png
  12. BIN
      app/assets/emojis/people-2.png
  13. BIN
      app/assets/emojis/people-3.png
  14. BIN
      app/assets/emojis/people-4.png
  15. BIN
      app/assets/emojis/people-5.png
  16. BIN
      app/assets/emojis/people-6.png
  17. BIN
      app/assets/emojis/people-7.png
  18. BIN
      app/assets/emojis/people-8.png
  19. BIN
      app/assets/emojis/people-9.png
  20. 17 10
      app/assets/emojis/search-index/be.csv
  21. 1814 0
      app/assets/emojis/search-index/bg.csv
  22. 26 18
      app/assets/emojis/search-index/ca.csv
  23. 12 5
      app/assets/emojis/search-index/cs.csv
  24. 25 18
      app/assets/emojis/search-index/de.csv
  25. 2 0
      app/assets/emojis/search-index/diversities.csv
  26. 143 135
      app/assets/emojis/search-index/en.csv
  27. 13 6
      app/assets/emojis/search-index/es.csv
  28. 21 14
      app/assets/emojis/search-index/fr.csv
  29. 24 17
      app/assets/emojis/search-index/gsw.csv
  30. 54 46
      app/assets/emojis/search-index/hu.csv
  31. 95 88
      app/assets/emojis/search-index/it.csv
  32. 111 103
      app/assets/emojis/search-index/nl.csv
  33. 31 23
      app/assets/emojis/search-index/no.csv
  34. 3437 3419
      app/assets/emojis/search-index/orders.csv
  35. 14 7
      app/assets/emojis/search-index/pl.csv
  36. 235 230
      app/assets/emojis/search-index/pt.csv
  37. 12 5
      app/assets/emojis/search-index/ru.csv
  38. 13 6
      app/assets/emojis/search-index/sk.csv
  39. 54 47
      app/assets/emojis/search-index/tr.csv
  40. 18 11
      app/assets/emojis/search-index/uk.csv
  41. BIN
      app/assets/emojis/smileys-0.png
  42. BIN
      app/assets/emojis/smileys-1.png
  43. BIN
      app/assets/emojis/symbols-0.png
  44. BIN
      app/assets/emojis/travel-0.png
  45. 4 75
      app/assets/license.html
  46. 65 32
      app/build.gradle.kts
  47. 39 0
      app/compile-proto.sh
  48. 0 28
      app/jni/Android.mk
  49. 0 4
      app/jni/Application.mk
  50. 0 41
      app/jni/nacl/curve25519-jni.c
  51. 0 210
      app/jni/nacl/poly1305-jni.c
  52. 0 523
      app/jni/nacl/salsa20-jni.c
  53. 0 451
      app/jni/nacl/smult_donna-c64.c
  54. 0 864
      app/jni/nacl/smult_donna.c
  55. 1 1
      app/libs/arm64-v8a/README.txt
  56. BIN
      app/libs/arm64-v8a/libjnidispatch.so
  57. 1 1
      app/libs/armeabi-v7a/README.txt
  58. BIN
      app/libs/armeabi-v7a/libjnidispatch.so
  59. 1 1
      app/libs/x86/README.txt
  60. BIN
      app/libs/x86/libjnidispatch.so
  61. 1 1
      app/libs/x86_64/README.txt
  62. BIN
      app/libs/x86_64/libjnidispatch.so
  63. 0 4
      app/proguard-project.txt
  64. 11 0
      app/protobuf/extra.proto
  65. 125 0
      app/protobuf/key-storage.proto
  66. 12 4
      app/src/androidTest/java/ch/threema/app/TestCoreServiceManager.kt
  67. 10 10
      app/src/androidTest/java/ch/threema/app/backuprestore/csv/BackupServiceTest.java
  68. 46 49
      app/src/androidTest/java/ch/threema/app/contacts/AddOrUpdateContactBackgroundTaskTest.kt
  69. 7 6
      app/src/androidTest/java/ch/threema/app/contacts/MarkContactAsDeletedBackgroundTaskTest.kt
  70. 10 8
      app/src/androidTest/java/ch/threema/app/contacts/ReflectedContactSyncTaskTest.kt
  71. 8 9
      app/src/androidTest/java/ch/threema/app/groupmanagement/CreateGroupFlowTest.kt
  72. 17 17
      app/src/androidTest/java/ch/threema/app/groupmanagement/DisbandGroupFlowTest.kt
  73. 2 2
      app/src/androidTest/java/ch/threema/app/groupmanagement/GroupControlTest.kt
  74. 1 1
      app/src/androidTest/java/ch/threema/app/groupmanagement/GroupResyncFlowTest.kt
  75. 2 1
      app/src/androidTest/java/ch/threema/app/groupmanagement/IncomingGroupLeaveTest.kt
  76. 2 1
      app/src/androidTest/java/ch/threema/app/groupmanagement/IncomingGroupNameTest.kt
  77. 7 6
      app/src/androidTest/java/ch/threema/app/groupmanagement/IncomingGroupSetupTest.kt
  78. 9 9
      app/src/androidTest/java/ch/threema/app/groupmanagement/LeaveGroupFlowTest.kt
  79. 3 3
      app/src/androidTest/java/ch/threema/app/groupmanagement/RemoveGroupFlowTest.kt
  80. 13 13
      app/src/androidTest/java/ch/threema/app/groupmanagement/UpdateGroupFlowTest.kt
  81. 9 6
      app/src/androidTest/java/ch/threema/app/processors/MessageProcessorProvider.kt
  82. 10 5
      app/src/androidTest/java/ch/threema/app/protocol/IdentityBlockedStepsTest.kt
  83. 0 99
      app/src/androidTest/java/ch/threema/app/service/GroupInviteServiceTest.kt
  84. 17 12
      app/src/androidTest/java/ch/threema/app/services/BlockedIdentitiesServiceTest.kt
  85. 200 0
      app/src/androidTest/java/ch/threema/app/stores/EncryptedPreferenceStoreImplTest.kt
  86. 232 0
      app/src/androidTest/java/ch/threema/app/stores/PreferencesStoreImplTest.kt
  87. 3 2
      app/src/androidTest/java/ch/threema/app/tasks/GroupCreateTaskTest.kt
  88. 115 103
      app/src/androidTest/java/ch/threema/app/tasks/PersistableTasksTest.kt
  89. 1 1
      app/src/androidTest/java/ch/threema/app/testutils/AndroidTestUtils.kt
  90. 8 10
      app/src/androidTest/java/ch/threema/app/testutils/TestHelpers.java
  91. 21 0
      app/src/androidTest/java/ch/threema/app/utils/TextUtilTest.java
  92. 1 1
      app/src/androidTest/java/ch/threema/data/TestDatabaseService.kt
  93. 26 22
      app/src/androidTest/java/ch/threema/data/repositories/ContactModelRepositoryTest.kt
  94. 3 1
      app/src/androidTest/java/ch/threema/data/repositories/EditHistoryRepositoryTest.kt
  95. 12 10
      app/src/androidTest/java/ch/threema/data/repositories/EmojiReactionsRepositoryTest.kt
  96. 8 6
      app/src/androidTest/java/ch/threema/data/repositories/GroupModelRepositoryTest.kt
  97. 13 5
      app/src/androidTest/java/ch/threema/storage/DatabaseNonceStoreTest.kt
  98. 13 14
      app/src/androidTest/java/ch/threema/storage/SQLDHSessionStoreTest.java
  99. 3 3
      app/src/androidTest/java/ch/threema/storage/databaseupdate/DatabaseUpdateExtensionsTest.kt
  100. 97 77
      app/src/blue/res/layout/activity_enter_serial.xml

+ 1 - 0
.gitignore

@@ -21,3 +21,4 @@ reproduce/
 .cxx/
 **/.DS_Store
 .kotlin
+/app/lint-report.xml

+ 31 - 38
README.md

@@ -1,7 +1,13 @@
+<!-- Centered README header hack -->
+<!-- Do not replace the obsolete align attribute with inline style, as GitHub may strip it. -->
 <div align="center">
-  <!-- Centered README header hack -->
-  <img width="500" src="logo.svg">
-  <br><br>
+  <picture>
+    <source media="(prefers-color-scheme: dark)" srcset="logo_dark.svg">
+    <source media="(prefers-color-scheme: light)" srcset="logo_light.svg">
+    <img width="500" src="logo_light.svg" alt="Threema Logo">
+  </picture>
+  <br>
+  <br>
 </div>
 
 # Threema for Android
@@ -9,7 +15,6 @@
 This repository contains the complete source code of
 [Threema](https://threema.com/) for Android.
 
-
 ## Table of Contents
 
 - [Bug Reports / Feature Requests / Security Issues](#issues)
@@ -24,7 +29,6 @@ This repository contains the complete source code of
 - [Translating](#translating)
 - [License](#license)
 
-
 ## <a name="issues"></a>Bug Reports / Feature Requests / Security Issues
 
 To report bugs and request new features, please contact the Threema support
@@ -38,7 +42,6 @@ the bug bounty program, you can contact us via Threema or by email; for contact
 details, see [threema.com/contact](https://threema.com/en/contact) (section
 “Security”).
 
-
 ## <a name="release-policy"></a>Source Code Release Policy
 
 This source code repository will be updated for every public non-beta release.
@@ -47,7 +50,6 @@ There will be one commit per released version.
 Commits are signed using PGP. See [SECURITY.md](SECURITY.md) for more
 information.
 
-
 ## <a name="license-checks"></a>License Checks
 
 While the source code for Threema for Android is published under an open source
@@ -103,7 +105,6 @@ The `none` build variant is used for development. It can only be used to create
 new Threema IDs if the random Device ID has been put on an “allow list” by a
 Threema employee.
 
-
 ## <a name="build-variants"></a>Build Variants
 
 **Private**
@@ -111,48 +112,46 @@ Threema employee.
 There are currently the following product flavors relevant for the private
 version of Threema:
 
-| Flavor                 | Description                                    | License Checks |
-| ---------------------- | ---------------------------------------------- | -------------- |
-| `store_google`         | Google Play Store version (regular, paid app)  | Google Play    |
-| `hms`                  | Huawei AppGallery version (regular, paid app)  | Huawei HMS     |
-| `store_threema`¹       | Threema Shop version (with play services)      | Threema Shop   |
-| `libre`¹               | Libre (F-Droid) version (no proprietary code)  | Threema Shop   |
+| Flavor           | Description                                   | License Checks |
+|------------------|-----------------------------------------------|----------------|
+| `store_google`   | Google Play Store version (regular, paid app) | Google Play    |
+| `hms`            | Huawei AppGallery version (regular, paid app) | Huawei HMS     |
+| `store_threema`¹ | Threema Shop version (with play services)     | Threema Shop   |
+| `libre`¹         | Libre (F-Droid) version (no proprietary code) | Threema Shop   |
 
 For local testing, we recommend building the `store_google` or `store_threema`
 build variants.
 
 ¹ The main difference between `store_threema` and `libre` is that the former
-  contains proprietary push services and a self-updater while the latter does
-  not. Additionally, the `libre` version will use your system emoji, instead
-  of bundling emoji graphics.
-
+contains proprietary push services and a self-updater while the latter does
+not. Additionally, the `libre` version will use your system emoji, instead
+of bundling emoji graphics.
 
 **Threema Work / OnPrem**
 
 Additionally, these build variants are only relevant for Threema Work or
 Threema OnPrem customers:
 
-| Flavor               | Description                                    | License Checks |
-| -------------------- | ---------------------------------------------- | -------------- |
-| `store_google_work`  | Google Play Store version (work, free app)     | Threema Work   |
-| `hms_work`           | Huawei AppGallery version (work, free app)     | Threema Work   |
-| `onprem`             | Threema OnPremises version                     | Threema Work   |
+| Flavor              | Description                                | License Checks |
+|---------------------|--------------------------------------------|----------------|
+| `store_google_work` | Google Play Store version (work, free app) | Threema Work   |
+| `hms_work`          | Huawei AppGallery version (work, free app) | Threema Work   |
+| `onprem`            | Threema OnPremises version                 | Threema Work   |
 
 **Internal Development**
 
 The following variants are only used for development and testing within Threema:
 
-| Flavor         | Description                                    | License Checks |
-|----------------| ---------------------------------------------- | -------------- |
-| `none`         | Used for development                           | Allowlist      |
-| `green`        | Uses sandbox test environment¹                 | Allowlist      |
-| `sandbox_work` | Uses sandbox test environment¹                 | Threema Work   |
-| `blue`         | Uses sandbox test environment¹                 | Threema Work   |
+| Flavor         | Description                    | License Checks |
+|----------------|--------------------------------|----------------|
+| `none`         | Used for development           | Allowlist      |
+| `green`        | Uses sandbox test environment¹ | Allowlist      |
+| `sandbox_work` | Uses sandbox test environment¹ | Threema Work   |
+| `blue`         | Uses sandbox test environment¹ | Threema Work   |
 
 ¹ *The “sandbox” is a backend test environment that is used for internal testing
-  at Threema. The sandbox backend can currently not be accessed from the public
-  Internet.*
-
+at Threema. The sandbox backend can currently not be accessed from the public
+Internet.*
 
 ## <a name="building"></a>Building
 
@@ -196,7 +195,6 @@ assistance for building on macOS, Windows, or other operating systems.
 The project can be imported into [Android Studio](https://developer.android.com/studio/).
 To build and deploy it to a device, click the green “Play” icon.
 
-
 ## <a name="testing"></a>Testing
 
 ### Via Command Line
@@ -220,14 +218,12 @@ emulator.
 
 You can also run tests through Android Studio.
 
-
 ## <a name="reproducible-builds"></a>Reproducible Builds
 
 Instructions on how to reproduce the build process used to publish the official
 Threema app can be found at
 [threema.com/open-source/reproducible-builds/](https://threema.com/open-source/reproducible-builds/).
 
-
 ## <a name="architecture"></a>Code Organization / Architecture
 
 Before digging into the codebase, you should read the [Cryptography
@@ -244,7 +240,6 @@ The code of the actual Android app is located in the
 Common code not specific to Threema is located in the
 `common/src/main/java/ch/threema/` directory.
 
-
 ## <a name="contributions"></a>Contributions
 
 We accept GitHub pull requests. Please refer to
@@ -254,14 +249,12 @@ for more information on how to contribute.
 Note that translation fixes should not be contributed through GitHub but
 on Crowdin, see next section.
 
-
 ## <a name="translating"></a>Translating
 
 We manage our app translations on Crowdin. If you’re interested in
 improving translations, or if you would like to translate Threema to a new
 language, please contact us at `support at threema dot ch`.
 
-
 ## <a name="license"></a>License
 
 Threema for Android is licensed under the GNU Affero General Public License v3.

BIN
app/assets/emojis/activity-0.png


BIN
app/assets/emojis/flags-0.png


BIN
app/assets/emojis/flags-1.png


BIN
app/assets/emojis/food-0.png


BIN
app/assets/emojis/nature-0.png


BIN
app/assets/emojis/objects-0.png


BIN
app/assets/emojis/people-0.png


BIN
app/assets/emojis/people-1.png


BIN
app/assets/emojis/people-10.png


BIN
app/assets/emojis/people-2.png


BIN
app/assets/emojis/people-3.png


BIN
app/assets/emojis/people-4.png


BIN
app/assets/emojis/people-5.png


BIN
app/assets/emojis/people-6.png


BIN
app/assets/emojis/people-7.png


BIN
app/assets/emojis/people-8.png


BIN
app/assets/emojis/people-9.png


+ 17 - 10
app/assets/emojis/search-index/be.csv

@@ -70,7 +70,7 @@
 😃|адкрыты|рот|усмешка|усміхаецца з адкрытым ротам
 😄|адкрыты|вока|вочы|рот|смяяцца ўслых|твар|усмешка|усміхацца|ухмылка|ухмыляцца|шчаслівы
 😁|вока|вочы|ззянне|зубы|прыгожы|твар|усмешка|усміхацца|ухмылка|ухмыляцца|шчаслівы
-😆|вочы|гучна смяяцца|закрыты|заходзіцца са смеху|прыжмурвацца|рот|смяяцца|твар|усмешка|усміхацца|ухмыляцца|хахаха|шчаслівы
+😆|адкрыты|вочы|гучна смяяцца|жмурыцца|заплюшчаны|катацца па падлозе ад смеху|рот|смяяцца|твар|усмешка|усміхацца|ха-ха-ха|шчаслівы
 😅|пот|усмешка|усміхаецца адкрытым ротам з халодным потам на лбе|халодны
 🤣|качацца|качаюся са смеху|смех
 😂|зубы|слёзы шчасця|смех|шчасце
@@ -123,6 +123,7 @@
 😪|санлівасць|сонны твар
 🤤|пускае сліну|пускаць|сліна
 😴|сон|спіць|хррр
+🫩|вочы|змораны|знясілены|мяшкі|нуда|позна|сонны|стомлены|твар
 😷|доктар|маска|медыцына|твар у медыцынскай масцы|хворы
 🤒|прастуда|твар з тэрмометрам|тэрмометр|хворы
 🤕|выцятае месца|павязка|твар з павязкай на галаве|траўма
@@ -182,7 +183,7 @@
 👾|космас|монстр-іншапланецянін|пазаземны|стварэнне
 🤖|монстр|паўстанне машын|робат
 😺|адкрыты|адкрыўшы рот|кот усміхаецца, адкрыўшы рот|рот|усмешка
-😸|вочы|зубы|кот шырока ўсміхаецца, прыплюснуўшы вочы|прыплюснуўшы вочы|усмешка
+😸|вочы|зажмурыўшы вочы|зубы|кот шырока ўсміхаецца, зажмурыўшы вочы|усмешка
 😹|зубы|кот плача ад шчасця|слёзы|смех
 😻|закаханы кот|каханне|кот|сэрца|усмешка
 😼|іранічны|кот са скрыўленай усмешкай|скрыўлены|усмешка
@@ -554,6 +555,7 @@
 🧑‍🧒|сям’я: дарослы і дзіця
 🧑‍🧒‍🧒|сям’я: дарослы і двое дзяцей
 👣|адбітак|сляды ног|цела
+🫆|адбітак пальца|бяспека|доказ|дэтэктыў|злачынства|ідэнтыфікацыя|крыміналістыка|след|таямніца
 🐵|малпа|пыска малпы|твар
 🐒|малпа
 🦍|гарыла
@@ -663,6 +665,11 @@
 🐚|ракушка|спіральная ракушка
 🪸|акіян|карал|рыф
 🪼|апёк|беспазваночны|вой|жала|марскі|медуза|студзяністы
+🦀|задыяк|краб|рак
+🦞|амар|клюшні|морапрадукты|ракавы суп
+🦐|ежа|крэветка|маленькая|морапрадукты
+🦑|ежа|кальмар|малюск
+🦪|вустрыца|жэмчуг|ныранне
 🐌|смоўж
 🦋|матылёк|насякомае|прыгожы
 🐛|кузурка|насякомае
@@ -706,6 +713,7 @@
 🪹|гнездаванне|пустое гняздо
 🪺|гнездаванне|гняздо з яйкамі
 🍄|грыб|мухамор
+🪾|бязлісты|бясплодны|веткі|голы|дрэва|засуха|зіма|лес|мёртвы|ствол
 🍇|вінаград|расліна|садавіна
 🍈|дыня|расліна|садавіна
 🍉|кавун|расліна|садавіна
@@ -744,6 +752,7 @@
 🫚|корань імбіру|піва|спецыя
 🫛|боб|гародніна|гарохавы стручок|стручок|фасоля|эдамамэ
 🍄‍🟫|гародніна|грыб|ежа|карычневы грыб|прырода
+🫜|буракі|вегетарыянскі|гародніна|ежа|корань|рэдзька|рэпа|сад|салата
 🍞|бохан|хлеб
 🥐|ежа|круасан|рагалік|французскі|хлеб
 🥖|багет|батон|ежа|французскі
@@ -795,11 +804,6 @@
 🥟|варэнікі|гёдза|пельмені|цяоцзы|эмпанада
 🥠|прадказанне|пячэнне з прадказаннем
 🥡|ежа на вынас|каробка для кітайскай ежы
-🦀|задыяк|краб|рак
-🦞|амар|клюшні|морапрадукты|ракавы суп
-🦐|ежа|крэветка|маленькая|морапрадукты
-🦑|ежа|кальмар|малюск
-🦪|вустрыца|жэмчуг|ныранне
 🍦|дэсерт|марожанае|марозіва|мяккае марожанае|мяккі|пламбір|салодкі
 🍧|дэсерт|лёд|салодкі|фруктовы
 🍨|дэсерт|марожанае|марозіва|салодкі
@@ -1204,6 +1208,7 @@
 🪘|барабан|біт|выцягнуты барабан|конга|рытм
 🪇|інструмент|маракасы|музыка|трэсці|ударны|шумавы
 🪈|блокфлётэ|драўляны|дудачка|дудка|духавы інструмент|музыка|флейта
+🪉|аркестр|арфа|інструмент|каханне|купідон|музыка
 📱|мабільнік|мабільны|смартфон|сотавы|тэлефон
 📲|выклік|мабільнік|мабільны тэлефон са стрэлкай|прыём|смартфон|сотавы|стрэлка|тэлефон
 ☎️|тэлефон|хатні тэлефон
@@ -1334,6 +1339,7 @@
 🧰|інструменты|механік|скрыня з інструментамі
 🧲|магнетызм|магніт|падкова|прыцяжэнне
 🪜|драбіны|караскацца|лесвіца|прыступка
+🪏|закопваць|капаць|расліна|рыдлёўка|савок|сад|снег|шуфель|яма
 🧪|лабараторыя|навука|прабірка|хімік|хімія|эксперымент
 🧫|бактэрыя|біёлаг|біялогія|культура|лабараторыя|чашка петры
 🧬|біёлаг|генетыка|днк|жыццё|эвалюцыя
@@ -1477,25 +1483,26 @@
 ➰|звілістая пятля|звілісты|пятля
 ➿|звілістая|падвойная|пятля
 〽️|знак змены партыі|іарытэн|песенны|японскі
+🫟|беспарадак|вадкасць|капаць|пляма|пырскі|разліў|фарба|холі|чарніла
 🔠|верхні рэгістр|вялікі|лацінскі|літары|увод лацінскіх літар верхнім рэгістрам
 🔡|лацінскі|літары|малы|ніжні рэгістр|увод лацінскіх літар ніжнім рэгістрам
 🔢|1234|лічбы|увод лічбаў
 🔣|сімвалы|увод сімвалаў
 🔤|алфавіт|лацінскі|літары|увод лацінскіх літар
-🅰️|a|група|другая|значок «група крыві a»|кроў
+🅰️|кнопка|кроў|тып
 🆎|ab (група крыві)|група|кроў|чацвёртая
 🅱️|b|група|значок «група крыві b»|кроў|трэцяя
 🆑|ачыстка|кнопка «ачысціць»
 🆒|слова «файна» ў квадраце|файна
 🆓|бясплатна|слова «бясплатна» ў квадраце
 🆔|асоба|ідэнтыфікацыя|ідэнтычнасць|пасведчанне|слова «пасведчанне» ў квадраце
-Ⓜ️|m|кола|круг|літара «m» у коле
+Ⓜ️|m|круг|у коле
 🆕|новы|слова «новы» ў квадраце
 🆖|блага|дрэнна|нічога добрага|скарачэнне «нічога добрага» ў квадраце
 🅾️|0|група|значок «група крыві 0»|кроў|першая
 🆗|добра|ок у квадраце
 🅿️|знак «паркоўка»|паркінг|паркоўка|стаянка
-🆘|sos|дапамажыце|знак «sos»|сос
+🆘|sos|дапамажыце|кнопка
 🆙|гульня|знак «новы ўзровень!»|новы|слова «новы ўзровень!»|уверх|узровень
 🆚|гульня|знак «супраць»|супраць
 🈁|ідэаграма «тут» у квадраце|пісьмо|японскае

+ 1814 - 0
app/assets/emojis/search-index/bg.csv

@@ -0,0 +1,1814 @@
+⁉️|!?|?|въпросителна|пунктуация|удивителен и въпросителен знак|удивителна и въпросителна
+ℹ️|източник на информация|информация
+↔️|стрелка наляво и надясно
+↕️|стрелка нагоре и надолу
+↖️|посока|северозапад|стрелка нагоре и наляво
+↗️|посока|североизток|стрелка нагоре и надясно
+↘️|посока|стрелка надолу и надясно|югоизток
+↙️|посока|стрелка надолу и наляво|югозапад
+⌨️|клавиатура|компютър
+☀️|време|лъчи|слънце|слънчев|ярък
+☁️|време|облак
+☂️|време|дъжд|облекло|чадър
+☃️|време|снежен човек|сняг|студен
+☄️|комета|космос
+☑️|✓|гласуване|готово|отметка|поле с отметка|урна за гласуване с отметка
+☔|време|дъжд|капка|чадър с дъждовни капки
+☕|горещо|димящ|кафе|кофеин|напитка|сутрин|топла напитка|топъл|чай
+☘️|детелина|ирландски|растение
+☠️|кръстосани кости|лице|смърт|череп с кръстосани кости|чудовище
+☢️|знак|радиоактивност
+☣️|биологична опасност|знак
+☦️|кръст|православен кръст|религия|християнство
+☸️|будизъм|дхарма|колелото на дхарма|религия
+☹️|гримаса|лице|намръщено лице|тъжен
+♈|зодиакален знак овен|зодия|овен|хороскоп
+♉|зодиакален знак телец|зодия|телец|хороскоп
+♐|зодиакален знак стрелец|зодия|стрелец|хороскоп
+♑|зодиакален знак козирог|зодия|козирог|хороскоп
+♒|воден|водолей|зодиакален знак водолей|зодия
+♓|зодиакален знак риби|зодия|риби|хороскоп
+♠️|игра|карта|пика
+♣️|игра|карта|спатия
+♥️|емоция|игра|карта|купа|сърце
+♦️|игра|каро|карта
+♨️|горещ|извор|пара
+⚒️|инструмент|кирка|чук и кирка
+⚓|инструмент|кораб|котва
+⚔️|кръстосани|мечове|оръжие
+⚖️|баланс|везна|везни|зодия|инструмент|правосъдие|справедливост
+⚗️|аламбик|инструмент|химия
+⚙️|зъбно колело|инструмент|предавка
+✂️|инструмент|ножици|режа|рязане|хартия
+✅|✓|готово|завършено|маркер|отметка|поправено|приключено|удебелена бяла отметка
+✈️|летя|превозно средство|пътуване|самолет
+✉️|имейл|писмо|плик
+✒️|писалка|писец|черен писец
+✔️|✓|готово|маркер|отметка|удебелена отметка
+✖️|[x]|отказ|удебелен знак за умножение|умножение
+✡️|давид|евреин|еврейска|звезда на давид|религия|юдейство
+✨|звезда|звездичка|звездички|магия
+✳️|*|звезда с осем лъча|звездичка с осем лъча
+✴️|*|звезда|осмолъчна звезда
+❄️|време|снежинка|сняг|студен
+❇️|*|искра
+❓|?|въпросителен знак|въпросителна|пунктуация|червена въпросителна
+❔|?|бяла въпросителен знак|бяла въпросителна|въпросителна|контур|пунктуация
+❕|!|бял удивителен знак|бяла удивителна|контур|пунктуация|удивителна
+❗|!|пунктуация|удивителен знак|удивителна|червена удивителна
+❣️|плътен орнамент от сърце – удивителен знак|плътен орнамент от сърце – удивителна|пунктуация|сърце|удивителен знак|удивителна
+❤️|емоция|любов|сърце|червено сърце
+➕|математика|плюс|удебелен знак плюс
+➖|математика|минус|удебелен знак минус
+➗|деление|математика|удебелен знак за деление
+⤴️|извита нагоре дясна стрелка|извита стрелка надясно и нагоре|стрелка
+⤵️|извита надолу дясна стрелка|извита стрелка надясно и надолу|надолу|стрелка
+〰️|вълнообразно|пунктуация|тире
+㊗️|идеограма "поздравления" в кръг|идеограма за поздравление в кръг|поздравление|поздравления|японски
+㊙️|бутон за тайна на японски|идеограма за тайна в кръг|тайна|японски
+😀|весел|зъби|лице|смях|ухилване|широка усмивка|широко усмихнато лице|щастлив
+😃|зъби|лице|отворена уста|страхотно|усмивка|усмихнато лице с отворена уста|уста|широко усмихнато лице с големи очи|щастлив
+😄|лице|отворен|смях|усмивка|уста|широко усмихнато лице с усмихнати очи|щастлив
+😁|зъби|лице|око|сияещо лице с усмихващи се очи|усмивка|ухилване|щастлив
+😆|лице|смях|удовлетворен|усмивка|усмихнато лице с отворена уста и затворени очи|уста|хаха|широко усмихнато лице с присвити очи|широко усмихнато лице със стиснати очи|щастлив
+😅|лице|нервен|отворен|пот|развълнуван|стрес|студена пот|усмивка|широко усмихнато лице с пот на челото
+🤣|забава|забавно|заливане|заливащо се от смях лице|лице|радост|смешно|смях|сълзи от смях|умирам от смях|хаха|хехе
+😂|весело|забавно|лице със сълзи от радост|радост|смешно|смях|сълза|умирам от смях|хаха|хехе|щастлив
+🙂|леко усмихнато лице|лице|усмивка
+🙃|лице|наобратно|обърнато наобратно лице|усмивка|хехе
+🫠|изчезвам|разтварям се|сарказъм|течен|топя се|топящо се лице|хаха
+😉|лице|намигащо лице|намигване|палав|секси|флирт
+😊|доволен|изчервяване|лице|око|усмивка|усмихнато лице с усмихнати очи
+😇|ангел|библия|лице|невинен|невинно|ореол|приказка|усмихнато лице с ореол|фантазия|щастлив
+🥰|влюбен|лице|любов|обичам те|обожание|романтика|сърце|усмивка|усмихнато лице с 3 сърца|усмихнато лице със сърца
+😍|143|лице|любов|обичам те|око|романтика|сърце|усмивка|усмихнато лице с очи във форма на сърце|целувки
+🤩|въодушевен|дълбоко запленен|звезда|лице със звезди вместо очи|очи|развълнуван|широко усмихнат
+😘|въздушна целувка|липсваш ми|лице с въздушна целувка|лице, пращащо въздушна целувка|обичам те|пращащо въздушна целувка|романтика|сърце|флирт|целувка
+😗|143|лице|обичам те|смучка|среща|флирт|целуващо лице|целувка
+☺️|лице|отпуснат|спокоен|усмивка|усмихнато лице|щастлив
+😚|143|затворен|изчервен|лице|обичам те|око|флирт|целуващо лице със затворени очи|целувка
+😙|затворени очи|лице|любов|око|усмивка|флирт|целуващо лице с усмихнати очи|целувка
+🥲|благодарност|гордост|облекчение|разчувстване|сълза|усмивка|усмихнато лице със сълза
+😋|вкусен|лице, наслаждаващо се на вкусна храна|наслаждавам се|наслаждаващо се на вкусна храна|облизвам се|усмивка|храна
+😛|език|лице с изплезен език|отин|парти|плезещо се лице
+😜|език|забавен|лице|намигащо и плезещо се лице|намигване|парти|шантав|шега|шеговит
+🤪|големи|малки|налудничаво лице|око|очи
+😝|вкус|език|както и да е|лице с изплезен език и стиснати очи|омг|ужасен|ужасно
+🤑|лице с пари в устата|пари|уста
+🤗|лице|прегръдка|прегръщам|прегръщащо лице|ръце
+🤭|издаване|изненада|кикотя се|лице с ръка пред устата|опа!|тайна|шок
+🫢|безверие|изненада|лице с широко отворени очи и ръка пред устата|неудобство|страхопочитание|удивление|уплаха|шокиран
+🫣|вторачвам се|засрамен|изплашен|лице, надничащо зад ръцете си|надничам|надничащо зад ръцете си|скрит|смаян
+🤫|замълчи|знак за шт!|което прави шт!|лице за шт!|лице, което прави шт!|тихо|шт
+🤔|замислено лице|лице|учуден|хммм|чудя се
+🫡|да|козирувам|козируващо лице|ок|поздрав|слънчево|уважение|успех
+🤐|лице с уста с цип|не издавам|тайна|тихо|уста|цип
+🤨|изненада|какво|лице с повдигната вежда|недоверие|скептично|хмм
+😐|безизразен|лице|не впечатлен|не е смешно|не щастлив|непроницаем|неутрален|неутрално лице|ревнив
+😑|безизразен|безизразно лице|лице|не впечатлен|не щастлив|омг|ревнив
+😶|без звук|лице без уста|нямам думи|тайна|тихо|тишина|уста
+🫥|депресиран|изчезвам|интровертен|крия се|лице с пунктир|невидим
+😶‍🌫️|лице в мъгла|лице в облаци|мечтател|разсеян
+😏|вежди|лице|подозрителен|подсмихване|подсмихващо се лице|усмивка|флирт
+😒|все тая|лице|недоволен|недоволно лице|неудовлетворен|нещастен|отегчен
+🙄|въртя очи|извъртам|както и да е|лице с извъртени нагоре очи|очи|сянка
+😬|гримаса|зъби|зъболекар|лице с гримаса|неловко|усмивка
+😮‍💨|въздъхвам|дим|издишвам|издишващо лице|изтощен|охкам|пъшкам|усмивка|шепна
+🤥|лице|лъжа|лъжещо лице|пинокио
+🫨|вибрирам|земетресение|изненада|лице|лудост|паника|треперещо|треперя|шок
+🙂‍↔️|глава, която прави хоризонтални движения|движение за несъгласие|която прави хоризонтални движения
+🙂‍↕️|глава, която прави вертикални движения|кимане за съгласие|която прави вертикални движения
+😌|дзен|лице|облекчено лице
+😔|лице|недоволен|обезсърчен|отегчен|разочарован|тъжен|угрижено лице
+😪|изморен|лице|плачещ|сънено лице|тъжен
+🤤|капят лиги|лиги|лице с капеща слюнка|слюнка
+😴|време за сън|дрямка|изморен|легло|лека нощ|лице|нощ|прозявка|спящо лице|сън
+🫩|изморен|изтощен|лице с торбички под очите|сънен
+😷|болен|дерматолог|зъболекар|лекар|лице с медицинска маска|маска|медицина
+🤒|болен|лице с термометър|термометър
+🤕|боли|лице с превръзка на главата|нараняване|ох|превръзка|рана
+🤢|гади ми се|лице пред повръщане|отвратено|повръщане
+🤮|болен|гадене|гнусно|плюене|повръщане|повръщащо лице
+🤧|болен|грип|кихане|кихащо лице|лице|наздраве|настинка
+🥵|горещина|зачервено лице|зачервяване|изплезен език|лице|потене|температура|топлинен удар|умирам
+🥶|замръзнало лице|клинч|лед|лице|посинял|синьо|студ|тракащи зъби|хапещ студ
+🥴|замаян|зигзагообразна уста|неравен поглед|опиянено лице|пийнал
+😵|замаяно лице|зашеметен|лице със зачеркнати очи|лошо ми е|умирам|умрял
+😵‍💫|замаян|лице със спираловидни очи|омг|проблеми|спирала|хипнотизиран
+🤯|експлодираща глава|невероятно|няма начин|отвя ми ума|потресен|шокиран
+🤠|каубойка|лице с каубойска шапка|шапка
+🥳|купонджийско лице|лице|надувалка|празненство|радостен|развълнуван|рожден ден|свирка|ура|шапка
+🥸|инкогнито|лице|маскирано лице|маскировка|мустак|очила|фалшив нос|шпионин
+😎|готин|лежерен|лице|небрежен|очила|печен|плаж|релаксиран|слънце|слънчеви очила|усмивка|усмихнато лице със слънчеви очила
+🤓|експерт|зубър|интелигентен|лице на читанка|лице на зубър|очила|читанка
+🧐|богат|заможен|класа|консервативен|лице с монокъл|монокъл|старомоден
+😕|извинявай|лице|не знам|объркано лице|съжалявам|тъжен
+🫤|лице с диагонална уста|неодобряващ|несигурен|разочарование|скептичен|съмнение
+😟|лице|нервен|притеснен|разтревожено лице|стресиран|тъжен
+🙁|гримаса|леко намръщено лице|лице|намръщен|тъжен
+😮|забравих|изненадан|лице с отворена уста|не ти вярвам|невярващ|омг|съчувствие|уста|шокиран
+😯|впечатлен|епично|изненадано лице|лице|омг
+😲|изумено лице|лице|няма начин|омг|учудено лице|шокиран
+😳|вина|впечален|горещо|еха|изумен|изчервено лице|лице|уау|удивен
+🥺|големи очи|защо не|кучешки поглед|лице|милост|много те моля|молба|моля те|умоляване|умоляващо лице
+🥹|горд|който сдържа сълзите си|лице, което сдържа сълзите си|плач|сълзи от радост|съпротива|тъга|тъжен|чувства|ядосан
+😦|гримаса|еха|изненада|изплашен|какво|лице|намръщено лице с отворена уста|отворен|уау|уста
+😧|еха|забравих|изненадан|изплашен|изстрадало лице|какво|лице|стресиран
+😨|вина|изплашено лице|лице|притеснен|разтревожен|страх
+😰|изплашен|лице с отворена уста и студена пот|нервен|пот|син|студен
+😥|лице с разочарование и облекчение|нервен|облекчен|олекна ми|пот|разочарован|сложно е|тъжен
+😢|лице|нещастен|плач|разплакано лице|сълза|тъжен
+😭|лице|недоволен|плач|рев|силно плачещо лице|сълза|тъжен
+😱|вик|изплашен|крещящо от страх лице|лице, крещящо от страх|писък|страх|шокиран
+😖|лице|объркан|раздразнен|свивам устни|смутено лице|тъжен|ядосан
+😣|главоболие|концентриран|лице|упорито лице
+😞|лице|разочаровано лице|тъжен
+😓|главоболие|изплашен|лице със студена пот|наведено лице с пот|пот|студен
+😩|гладен|изморен|изтощено лице|лице|плачещ|уморен|ядосан
+😫|дрямка|лице|тъжен|уморено лице
+🥱|време за сън|както и да е|лека нощ|лице|прозяващо се лице|прозявка|скука|спи ми се|сънлив|умора
+😤|бесен|лице с излизащ пушек от носа|лице с излизаща от носа пара|пара|победа|пушек|триумф|ядосан
+😡|вбесен|гневен|гневно лице|гняв|лице|нацупено лице|сърдит|червен|ядосан|ярост
+😠|вбесен|гневен|лице|раздразнен|разстроен|сърдит|ядосано лице
+🤬|бесен|лице със символи върху устата|псувни|ругатни|ядосан
+😈|зъл|лице|рога|усмивка|усмихнато лице с рога|фантастичен
+👿|демон|дяволче|лице|сърдито лице с рога|фантазия|фантастичен|ядосано лице с рога
+💀|лице|приказка|смърт|тяло|умрял съм|фантастика|череп|чудовище
+💩|ако|изпражнение|лице|миризливо|чудовище
+🤡|клоунско лице|лице
+👹|дявол|лице|маска|плашещ|приказка|страшилище|създание|фанстика|фантазия|фантастичен|чудовище|японски
+👺|гоблин|лице|приказка|създание|същество|фантазия|фантастичен|чудовище|ядосан|японски
+👻|лице|призрак|развълнуван|страшен|създание|фантастичен|хелоуин|чудовище
+👽|извънземно|космос|лице|нло|създание|чудовище
+👾|игра|извънземно|космос|лице|нло|пикселизиран|чудовище
+🤖|лице на робот|робот|чудовище
+😺|животно|котка|лице|усмивка|усмихнато котешко лице с отворена уста|уста
+😸|животно|котка|лице|усмивка|ухилване|ухилено котешко лице с усмихнати очи
+😹|котешко лице със сълзи от радост|котка|лице|радост|смях|сълза
+😻|животно|котка|лице|любов|очи|сърце|усмихнато котешко лице с очи с форма на сърце
+😼|животно|ироничен|котешко лице с изкривена усмивка|котка|лице|усмивка
+😽|животно|котка|лице|око|целуващо котешко лице със затворени очи|целувка
+🙀|животно|изненадан|изтощено котешко лице|котка|лице
+😿|котка|плачещо котешко лице|сълза|тъжен
+😾|животно|котка|лице|нацупено котешко лице|сърдит
+🙈|не видях|видях|жест|животно|засрамен|лице|маймуна|не мога да гледам|тайна
+🙉|не чух|жест|животно|забранено|лице|маймуна|тайна|чух|шшт
+🙊|не знам|жест|животно|забранено|знам|лице|маймуна
+💌|валентинка|любовно писмо|писмо|романтика|свети валентин|сърце
+💘|амур|емоция|купидон|любов|обичам те|романтика|свети валентин|сърце със стрела
+💝|валентинка|годишнина|емоция|лента|обичам те|панделка|свети валентин|сърце с панделка|целувки
+💖|блестящо сърце|добро утро|емоция|искра|лека нощ|развълнуван|сърце
+💗|емоция|нервен|обичам те|пулс|развълнуван|растящо сърце|сърце|туптящо сърце|увеличаващо се сърце|целувки
+💓|биене|биещо|емоция|сърце|туптене
+💞|годишнина|обикалящи сърца|сърце
+💕|годишнина|две сърца|емоция|любов|обичам те|сърце|целувки
+💟|бяло сърце|емоция|лилаво сърце|сърце|украса сърце
+💔|емоция|разбито|самотен|сърце|тъжен
+❤️‍🔥|любов|огън|свещено сърце|страст|сърце в пламъци
+❤️‍🩹|възстановяване|добре|оздравяване|по-здрав|подобрение|превързано сърце
+🩷|емоция|любов|обичам те|розово|сладко|сърце|харесвам
+🧡|оранжево сърце
+💛|емоция|жълто|любов|обичам те|сърце
+💚|емоция|зелено сърце|любов|романтика|сърце
+💙|емоция|обичам те|романтика|синьо|сърце
+🩵|емоция|небесносиньо|обичам те|светлосиньо|синьо-зелено|специален|сърце|циан
+💜|емоция|лилаво|любов|обичам те|сърце
+🤎|кафяво|сърце
+🖤|зло|сърце|черно
+🩶|емоция|обичам те|сиво сърце|сребристо|сребърно|сърце|тъмносиво
+🤍|бяло|сърце
+💋|емоция|отпечатък от целувка|романтика|секси|сърце|устни|целувка
+💯|100|резултат|сто точки
+💢|гняв|комикс|символ за гняв|ядосан
+💥|бомба|бум|експлодирам|комикс|сблъсък
+💫|замайване|звезда|комикс
+💦|вода|капки вода|капки пот|комикс|пот|пръска
+💨|бърз|дим|комикс|пушек|спринт|тичане
+🕳️|дупка|яма
+💬|балонче за говор|говор|диалог|комикс|текст
+👁️‍🗨️|балонче за говор|говор|око в балонче за говор|свидетел
+🗨️|балонче за говор наляво|балонче за говор отляво|говор|диалог
+🗯️|балонче за гняв надясно|балонче за гняв отдясно|гняв|ядосан
+💭|балонче за мисъл|идея|комикс|мечта|мисъл|облак|осъзнавам|решения
+💤|zzz|заспал|изморен|комикс|лека нощ|спане|сънен
+👋|до скоро|ехо|здравей|здрасти|махане с ръка|поздрави|помахване|привет|ръка|там ли си|тяло|чао
+🤚|вдигната|длан
+🖐️|вдигната ръка с разперени пръсти|пръст|разперен|ръка|стоп|тяло
+✋|вдигната ръка|дай пет|ръка|стоп|тяло
+🖖|вулкан|поздрав на вулканите|пръст|ръка
+🫱|дясно|надясно|протягане|ръка|ръкостискане|сочеща надясно ръка
+🫲|лява ръка|ляво|наляво|ръка|ръкостискане|сочеща наляво ръка
+🫳|вдигам|вземам|изпускам|отхвърлям|прогонвам|ръка с длан надолу
+🫴|идвам|кажи ми|не знам|повиквам|предлагам|предложение|ръка с длан нагоре|хващам
+🫷|дай пет|блокиране|бутане|високо|задръж|наляво|отказ|пауза|ръка|спри|чакай|шамар
+🫸|дай пет|блокиране|бутане|високо|задръж|надясно|отказ|пауза|ръка|спри|чакай|шамар
+👌|ok|добре|жест окей|много ясно|окей|разбрано|разбрахме се|ръка|тяло
+🤌|въпрос|жест с ръка|какво|пръсти|саркастично|събрани|търпение
+🤏|малка сума|малко|мъничко|нещо малко|пръсти|ръка с приближени палец и показалец
+✌️|жест за победа|мир|победа|ръка|тяло
+🤞|късмет|палци|ръка|стискане на палци
+🫰|любов|пари|ръка с преплетени палец и показалец|скъпо|сърце|щракване
+🤟|жест обичам те|обичам те|ръка|три пръста
+🤘|знак на рогата|метъл|пръст|рога|рок музика|ръка|тяло
+🤙|знак за обаждане|обаждане|ръка
+👈|показалец наляво откъм опакото на ръката|показалец, сочещ наляво|пръст|соча|сочещ наляво показалец
+👉|показалец надясно откъм опакото на ръката|показалец, сочещ надясно|пръст|ръка|соча|сочещ надясно
+👆|нагоре|показалец нагоре откъм опакото на ръката|показалец, сочещ нагоре|ръка|соча|сочещ нагоре показалец
+🖕|пръст|ръка|среден пръст|тяло
+👇|надолу|показалец надолу откъм опакото на ръката|показалец, сочещ надолу|соча|сочещ надолу
+☝️|нагоре|показалец|пръст|соча
+🫵|вие|показалец, сочещ към гледащия|посочвам|ръка|сочещ към гледащия|ти
+👍|+1|браво|вдигнат палец|да|добре|много ясно|нагоре|палец|разбира се|ръка|хубаво|чудесно
+👎|-1|надолу|не ми харесва|палец|ръка
+✊|вдигнат юмрук|ръка|солидарност|стиснат|удар|юмрук
+👊|ръка|стиснат|тяло|удар|юмрук
+🤛|наляво|обърнат наляво юмрук|юмрук
+🤜|надясно|обърнат надясно юмрук|юмрук
+👏|аплодисменти|браво|добра работа|пляскане|пляскащи ръце|поздравления|ръка|тяло|чудесно
+🙌|вдигнат|жест|похвала|празнуване|ура|човек с вдигнати ръце
+🫶|любов|обичам те|ръце във формата на сърце
+👐|джаз|отворени ръце|прегръдка|ръка|тяло
+🤲|желание|молитва|сочещи нагоре|събрани длани, сочещи нагоре
+🤝|ръка|ръкостискане|сделка|среща|съгласие
+🙏|благодаря|благословен|жест|молба|молитва|моля се|ръце|събрани ръце
+✍️|пиша|пишеща ръка|ръка|тяло
+💅|козметика|лак за нокти|маникюр|нокти
+🤳|камера|селфи|телефон
+💪|бицепс|вдигане на тежести|мускул|ръка|силен|стегнат|тренировка|тяло|фитнес
+🦾|достъпна среда|достъпност|механична ръка|протеза
+🦿|достъпна среда|достъпност|механичен крак|протеза
+🦵|крайник|крак|ритник|сгънат крак
+🦶|глезен|крак|настъпване|ритник|стъпало
+👂|звук|слух|тяло|ухо|чувам
+🦻|достъпна среда|достъпност|увреден слух|ухо със слухов апарат
+👃|аромат|миризма|мириша|нос|тяло
+🧠|интелигентен|мозък|умен
+🫀|анатомия|кардиология|орган|пулс|сърдечен ритъм|сърце|червено
+🫁|бели дробове|вдишване|дишане|дробове|дъх|издишване|орган
+🦷|бяло|зъболекар
+🦴|кокал|кост|куче|скелет
+👀|гледам|лице|надзъртам|надничам|око|омг|очи|тяло
+👁️|1 око|едно око|око|тяло
+👅|ближа|език|тяло
+👄|красота|тяло|уста|устни|целувка|червило
+🫦|нервен|нервност|неудобство|прехапана устна|притеснение|секси|страх|устна|флиртуване|целувка
+👶|бебе|дете|малко|новородено
+🧒|без определен пол|дете|малко дете|млад|неутрален пол
+👦|дете|момче
+👧|две опашки|дева|девойка|дъщеря|млад|момиче|светли очи
+🧑|без определен пол|възрастен|неутрален пол|пълнолетен|човек
+👱|блондин/ка|блондинка|лице|мъж|рус мъж|човек
+👨|гадже|момче|мъж|приятел
+🧔|брадат|човек с брада
+🧔‍♂️|брада|мъж: брада
+👱‍♂️|блондин|рус мъж|руса коса
+👩|блондинка|жена|прическа|руса коса
+🧔‍♀️|брада|жена: брада
+👱‍♀️|блондинка|жена|руса жена|руса коса
+🧓|без определен пол|възрастен|неопределен пол|по-възрастен човек
+👴|възрастен|дядо|мъдър|мъж|опадаща коса|плешив|старец
+👵|баба|възрастна|жена|мъдра|стара|старица
+🙍|гримаса|жест|намръщен човек|намръщена жена|не щастлив|раздразнен|разочарован|разстроен|сърдит
+🙍‍♂️|жест|мръщене|намръщен мъж|обиден мъж|обидена гримаса
+🙍‍♀️|мръщене|намръщена жена|обидена гримаса|обидена жена
+🙎|гримаса|жена|жест|мръщя се|нацупен човек|разочарован|разстроен|цупеща се жена
+🙎‍♂️|гримаса|жест|намусен мъж|нацупен мъж|недоволна гримаса
+🙎‍♀️|гримаса|намусена жена|нацупена жена|недоволна гримаса
+🙅|жена прави жест за не|жест за не|забранено|изключвам|не|никакъв шанс|няма шанс|ръка
+🙅‍♂️|жест не|жест с ръка|забрана|мъж с жест за не|мъж, правещ жест за не|не|правещ жест за не|ръка
+🙅‍♀️|жена, правеща жест за не|жест не|жест с ръка|забрана|правеща жест за не
+🙆|ok|жест за окей|окей|омг|ръка|тренирам
+🙆‍♂️|ok|жест да|жест с ръка|мъж с жест за ok|мъж, правещ жест за окей|потвърждение|правещ жест за окей|ръка|тренировка|упражнение
+🙆‍♀️|жена, правеща жест за окей|жест да|жест с ръка|потвърждение|правеща жест за окей
+💁|даване на съвет|жена|информация|както и да е|клюка|нахакан|помощ|ръка|сарказъм|сериозно ли|човек от информационна служба
+💁‍♂️|информация|както и да е|мъж от информационна служба|откъсване на косъм|отскубване на косъм|помощ|сарказъм|съвети
+💁‍♀️|жена от информационна служба|информация|помощ
+🙋|аз знам|аз мога да помогна|вдигнал ръка|вдигнат|въпрос|жена с вдигната ръка|жест|изберете мен|ръка|тук съм|щастлив човек с вдигната ръка|щастлив човек, вдигнал ръка
+🙋‍♂️|вдигнал ръка|вдигната ръка|въпрос|жест с ръка|знам|щастлив мъж с вдигната ръка|щастлив мъж, вдигнал ръка
+🙋‍♀️|вдигнала ръка|вдигната ръка|жест с ръка|щастлива жена, вдигнала ръка
+🧏|глух човек|глухота|достъпна среда|слух|ухо
+🧏‍♂️|глух|мъж
+🧏‍♀️|глуха|жена
+🙇|жест|извинение|извинявай|медитация|медитирам|покланящ се човек|поклон|прости ми|съжалявам
+🙇‍♂️|жест|извинение|покланящ се мъж|поклон
+🙇‍♀️|жест|извинение|медитация|покланяща се жена|поклон|съжалявам
+🤦|лице|не отново|невярване|о не|отчаяние|ръка върху лице|човек|шок
+🤦‍♂️|длан пред лицето|жест с ръка|мъж с ръка върху лицето|не мога да повярвам|не отново|невярване|о не|отчаяние
+🤦‍♀️|длан пред лицето|жена с ръка върху лицето|жест с ръка|не мога да повярвам|не отново|невярване|о не|отчаяние
+🤷|безразличие|кой знае|може би|не знам|нямам идея|рамене|свиване на рамене|сигурно|съмнение
+🤷‍♂️|безразличие|вдигане на рамене|жест с рамене|както и да е|може би|мъж свива рамене|не знам|нямам идея|сигурно|съмнение
+🤷‍♀️|безразличие|вдигане на рамене|жена свива рамене|жест с рамене|както и да е|може би|не знам|нямам идея|сигурно|съмнение
+🧑‍⚕️|здравен служител|здравеопазване|лекар|медицинска сестра|терапевт
+👨‍⚕️|доктор|здравен работник|здравна система|лекар|мъж|терапевт
+👩‍⚕️|жена|здравен работник|здравна работничка|здравна система|лекарка|медицинска сестра|терапевт
+🧑‍🎓|завършил|студент|учащ
+👨‍🎓|висше образование|дипломиран младеж|мъж|студент|учащ
+👩‍🎓|висше образование|жена|студентка|учаща
+🧑‍🏫|инструктор|лектор|преподавател|учител
+👨‍🏫|инструктор|лектор|мъж|преподавател|учител
+👩‍🏫|жена|инструкторка|лектор|преподавателка|учителка
+🧑‍⚖️|везни|съдия
+👨‍⚖️|везни|мъж съдия|правосъдие|служител на правосъдието|съдия
+👩‍⚖️|везни|жена|правосъдие|служител на правосъдието|служителка на правосъдието|съдийка|съдия
+🧑‍🌾|градинар|земеделец|собственик на ранчо
+👨‍🌾|градинар|производител|селскостопански работник|фермер
+👩‍🌾|градинарка|жена|производителка|селско стопанство|фермерка
+🧑‍🍳|готвач|майстор-готвач
+👨‍🍳|готвач|готвещ мъж|мъж готвач
+👩‍🍳|готвачка|готвеща жена|жена
+🧑‍🔧|водопроводчик|електротехник|механик
+👨‍🔧|водопроводчик|електротехник|майстор|механик|мъж|специалист|техник
+👩‍🔧|водопроводчик|електротехник|жена механик|майсторка|специалистка|техник
+🧑‍🏭|завод|индустрия|производство|промишленост|работник във фабрика|фабрика
+👨‍🏭|мъж|производство|работник в завод|фабрика
+👩‍🏭|жена|производство|работничка в завод|фабрика
+🧑‍💼|архитект|бизнес|костюм|мениджър|служител в офис
+👨‍💼|архитект|бизнес|костюм|мениджър|мъж|служител в офис|управител
+👩‍💼|архитектка|бизнес|жена|костюм|мениджър|офис|служителка в офис|управител
+🧑‍🔬|биолог|инженер|учен|физик|химик
+👨‍🔬|биолог|инженер|математик|мъж учен|научен работник|учен|физик|химик
+👩‍🔬|биолог|жена учен|инженер|математик|математичка|научен работник|научна работничка|физик|химик
+🧑‍💻|кодове|програмист|разработчик|софтуер
+👨‍💻|компютърен специалист|мъж в сферата на технологиите|програмист|разработчик|софтуер|технологии
+👩‍💻|жена в сферата на технологиите|компютърен специалист жена|програмист|разработчик|софтуер|технологии
+🧑‍🎤|актьор|звезда|певец|рок|шоумен
+👨‍🎤|актьор|артист|музикален изпълнител|мъж певец|певец|рок звезда|творец
+👩‍🎤|артист|жена|музикална изпълнителка|певица|рок звезда|творец
+🧑‍🎨|палитра|художник
+👨‍🎨|мъж|палитра|рисуване|творец|художник
+👩‍🎨|жена творец|палитра|рисуване|художничка
+🧑‍✈️|пилот|самолет
+👨‍✈️|летец|мъж|пилот|самолет
+👩‍✈️|жена летец|жена пилот|полет|самолет
+🧑‍🚀|астронавт|ракета
+👨‍🚀|астронавт|космически кораб|космонавт|космос|мъж|ракета
+👩‍🚀|астронавтка|жена|космически кораб|космонавт|космос|ракета
+🧑‍🚒|пожарна кола|пожарникар
+👨‍🚒|гасене на пожар|мъж|огън|пожарна|пожарникар
+👩‍🚒|гасене на пожар|жена пожарникар|огън|пожарна
+👮|арестувам|закон|мъж|орган на реда|полицай|полицейски служител|полиция|служител на реда
+👮‍♂️|полицай|полиция|служител на реда|униформа
+👮‍♀️|арестувам|жена|закон|орган на реда|под прикритие|полицайка|полиция|служител на реда|служителка на реда|униформа
+🕵️|детектив|мъж|шпионин
+🕵️‍♂️|мъж детектив|частен детектив|шпионин
+🕵️‍♀️|детектив|жена|частен детектив жена|шпионин
+💂|бъкингамски дворец|гвардеец|караул|конвой|лондон|страж
+💂‍♂️|войник|караул|конвой|мъж гвардеец|страж
+💂‍♀️|бъкингамски дворец|жена войник|жена гвардеец|караул|конвой|лондон|страж
+🥷|воин|война|наемен убиец|нинджа|прокрадване|скрит|човек|шпионин
+👷|каска|мъж|работник|ремонт|строеж|строителство|шапка|шлем
+👷‍♂️|работник|строеж|строителен работник
+👷‍♀️|жена строителен работник|каска|работа|работничка|строеж|строителка
+🫅|благородник|владетел|кралска особа|царствен|човек с корона
+🤴|кралска особа|принц
+👸|корона|кралица|приказка|принцеса|фантастичен|царица
+👳|мъж|тюрбан|чалма|човек с тюрбан
+👳‍♂️|мъж с тюрбан|тюрбан|чалма
+👳‍♀️|жена с тюрбан|тюрбан|чалма
+👲|китайска шапчица|мъж с китайска шапчица|шапка
+🧕|бандана|жена с кърпа за глава|кърпа за глава|мантила|тюрбан|хиджаб|шал за глава
+🤵|младоженец|мъж във фрак|официален|фрак|човек във фрак
+🤵‍♂️|мъж във фрак|фрак
+🤵‍♀️|жена във фрак|фрак
+👰|булка с воал|було|воал|сватба|човек с було
+👰‍♂️|мъж с було
+👰‍♀️|було|жена с було
+🤰|бременна|жена
+🫃|бременен мъж|корем|подут|пълен
+🫄|бременен човек|бременна|корем|подут|пълен
+🤱|бебе|кърмене|хранене
+👩‍🍼|бебе|жена, хранеща бебе|майка|новородено|хранене|хранеща бебе
+👨‍🍼|баща|бебе|мъж, хранещ бебе|новородено|хранене|хранещ бебе|човек
+🧑‍🍼|баща|бебе|жена|майка|мъж|новородено|хранене|хранещ бебе|човек, хранещ бебе
+👼|ангелче|бебе|лице|приказка|църква
+🎅|дядо|коледа|празнуване|приказка|фантастичен
+🤶|баба|коледа
+🧑‍🎄|г-х коледа|дядо коледа|коледа|празник|червена шапка|човек
+🦸|героиня|героична|добра|жена супергерой|супергероиня|суперсили|човек
+🦸‍♂️|герой|добър|супергерой|супермен|суперсила
+🦸‍♀️|героиня|герой|жена|праведна|способности|супергерой от женски пол
+🦹|злодей|престъпник|суперзлодей|суперсила|човек
+🦹‍♂️|злодей|мъж суперзлодей|престъпник|суперсила
+🦹‍♀️|жена суперзлодей|злодей|престъпник|суперсила
+🧙|вещица|жена магьосник|заклинание|магия|магьосница|призовавам|фантазия
+🧙‍♂️|вълшебник|мъж магьосник|чародей
+🧙‍♀️|вълшебница|магьосница|чародейка
+🧚|крила|мит|оберон|пук|титания|фантазия|фея
+🧚‍♂️|мъж фея|оберон|пук
+🧚‍♀️|жена фея|титания
+🧛|вампир|дракула|зъби|костюм|кръв|немъртъв|свръхестествено|страшно|ужаси|хелоуин
+🧛‍♂️|дракула|мъж вампир|немъртъв
+🧛‍♀️|жена вампир|немъртъв
+🧜|жена амфибия|морски създания|мъж амфибия|под водата|приказка|русалка|сирена|човек амфибия
+🧜‍♂️|мъж амфибия|тритон
+🧜‍♀️|жена амфибия|русалка
+🧝|елф|магическо|мистично|митично|фантазия|фолклор|човек елф
+🧝‍♂️|вълшебен|мъж елф
+🧝‍♀️|вълшебен|жена елф
+🧞|джин|дух|желание|женски джин|мистично|потъркай лампата
+🧞‍♂️|джин|мъж джин
+🧞‍♀️|джин|жена джин
+🧟|апокалипсис|зомби|немъртъв|плашещ|ужаси|хелоуин|ходещи мъртви
+🧟‍♂️|мъж зомби|немъртъв|ходещ мъртъв
+🧟‍♀️|жена зомби|немъртва|ходеща мъртва
+🧌|приказка|трол|фантазия|чудовище
+💆|главоболие|масаж на лицето|напрежение|отпускане|процедура|релаксация|салон|спа|терапия
+💆‍♂️|главоболие|лице|масаж на лице|мъж с масажирано лице|отпускане|салон
+💆‍♀️|жена с масажирано лице|масаж на лице
+💇|жена се подстригва|красота|подстригване|прическа|салон|стил|фризьорски салон|човек се подстригва
+💇‍♂️|бръснарски салон|коса|подстригван мъж|подстригване|прическа|салон за красота|фризьорски салон
+💇‍♀️|подстригвана жена|прическа|фризьорски салон
+🚶|мъж|пешеходец|разходка|разхождам се|темпо|ходене|ходещ мъж|ходя|човек се разхожда
+🚶‍♂️|вървене|разходка|ходене пеш|ходещ мъж
+🚶‍♀️|вървене|пешеходец|разходка|ходене пеш|ходеща жена
+🧍|изправен човек|прав|стоя изправен
+🧍‍♂️|изправен мъж|мъж|прав
+🧍‍♀️|жена|изправена жена|права
+🧎|коленича|коленичил човек|на колене
+🧎‍♂️|коленичил мъж|мъж|на колене
+🧎‍♀️|жена|коленичила жена|на колене
+🧑‍🦯|достъпност|сляп|човек с бял бастун
+👨‍🦯|достъпна среда|мъж с бял бастун|незрящ
+👩‍🦯|достъпна среда|жена с бял бастун|незряща
+🧑‍🦼|достъпност|инвалидна количка|човек в моторизирана инвалидна количка
+👨‍🦼|достъпна среда|инвалидна количка|мъж в акумулаторна инвалидна количка
+👩‍🦼|достъпна среда|жена в акумулаторна инвалидна количка|инвалидна количка
+🧑‍🦽|достъпност|инвалидна количка|човек в инвалидна количка
+👨‍🦽|достъпна среда|инвалидна количка|мъж в инвалидна количка|мъж в ръчна инвалидна количка
+👩‍🦽|достъпна среда|жена в инвалидна количка|жена в ръчна инвалидна количка|инвалидна количка
+🏃|бегач|бързина|бързо|бягане|движение|маратон|мъж|скорост|тичане|тичащ човек|човек
+🏃‍♂️|бягане|състезание|тичане|тичащ мъж
+🏃‍♀️|бързо|бягане|идвам|маратон|състезание|тичане|тичаща жена
+💃|да танцуваме|елегантна|жена|салса|танго|танцьорка|фестивал
+🕺|елегантен|мъж|танцуващ мъж|танцьор|фестивал|фламенко
+🕴️|бизнес|костюм|левитиращ мъж в костюм|мъж
+👯|близнаци|двойка|жена|забавляващи се хора|заешки уши|момиче|най-добри приятелки|парти|сродна душа|танцьорка
+👯‍♂️|веселие|веселящи се мъже със заешки уши|забавления|заешки уши|купон|парти|танцьор
+👯‍♀️|веселие|забавления|забавляващи се жени със заешки уши|заешки уши
+🧖|ден за спа|лукс|парна баня|почивка|релаксация|сауна|спа|човек в парна баня|човек в помещение с пара
+🧖‍♂️|мъж в помещение с пара|парна баня|сауна
+🧖‍♀️|жена в помещение с пара|парна баня|сауна
+🧗|алпинист|катерене|катерещ се човек|нагоре|планина|скала|скално катерене
+🧗‍♂️|катерач
+🧗‍♀️|алпинист|катерачка
+🤺|спорт|фехтовач|фехтовка|човек|шпага
+🏇|жокей|конни надбягвания|надбягване
+⛷️|зима|скиор|сняг
+🏂|ски|сноубордист|сняг
+🏌️|голф|играч на голф|спорт|топка|човек играе голф
+🏌️‍♂️|голф|играещ голф|играч|мъж, играещ голф
+🏌️‍♀️|голф|жена играч|жена, играеща голф|играеща голф|топка
+🏄|вълни|море|мъж на сърф|океан|плаж|спорт|сърфист|човек на сърф
+🏄‍♂️|каращ сърф|мъж, каращ сърф|сърфиране
+🏄‍♀️|жена|океан|плаж|спорт|сърфиране|сърфистка
+🚣|гребане|гребец|гребна лодка|езеро|кану|лодка|превозно средство|рафтинг|риболов|човек в гребна лодка
+🚣‍♂️|гребец|гребящ мъж|лодка|спорт във вода
+🚣‍♀️|гребане|гребяща жена|круиз|лодка|река|спорт във вода
+🏊|мъж|плуване|плуващ човек|плувец|свободен стил|спорт|триатлон
+🏊‍♂️|мъж|плуване|плуващ мъж
+🏊‍♀️|жена|плуване|плувкиня|спорт
+⛹️|баскетболист|дриблирам|кош|мрежа|мъж|топка|човек с топка|шампионат
+⛹️‍♂️|мъж с топка|спорт|топка
+⛹️‍♀️|жена с топка|спорт|топка
+🏋️|бодибилдър|вдигане на тежести|тежест|тежкоатлет|трениране|тренировка|човек вдига тежести|щангист
+🏋️‍♂️|вдигане тежести|вдигащ тежести мъж|тежкоатлет|щангист
+🏋️‍♀️|вдигане на тежести|вдигане тежести|вдигаща тежести жена|тежкоатлетка|щангистка
+🚴|велосипедист|каране на велосипед|каране на колело|колело|спорт|човек кара велосипед|човек кара колело
+🚴‍♂️|велосипед|колоездач|мъж на велосипед|мъж с колело
+🚴‍♀️|велосипедистка|жена с колело|колоездене|спорт
+🚵|велосипедист|колело|колоездач|планина|планински колоездач|планинско колоездене|спортист
+🚵‍♂️|мъж на планински велосипед|планински колоездач
+🚵‍♀️|велосипед|жена на планински велосипед|планина|планински колоездач
+🤸|активен|гимнастика|развълнуван|спорт|циганско колело|човек|щастлив
+🤸‍♂️|акробат|активен|гимнастика|мъж|развълнуван|спорт|щастлив
+🤸‍♀️|акробатка|активен|гимнастика|жена|развълнуван|спорт|щастлив
+🤼|борба|борец|борци|в ринга|дуел|спорт|турнир по борба|човек
+🤼‍♂️|битка|борба|борещи се мъже|борци|в ринга|дуел|мъже|турнир по борба
+🤼‍♀️|битка|борба|борещи се жени|борци|в ринга|дуел|жени|турнир по борба
+🤽|вода|водна топка|плуване|спорт|топка|човек
+🤽‍♂️|воден спорт|водна топка|водно поло|играещ водна топка|мъж, играещ водна топка|плуване|спортист|топка
+🤽‍♀️|воден спорт|водна топка|жена играеща водна топка|жена, играеща водна топка|играеща водна топка|плуване|спортистка|топка
+🤾|подавам|спортист|топка|хандбал|хващам|хвърлям|човек
+🤾‍♂️|мъж|спорт|хандбалист
+🤾‍♀️|жена|подавам|спортист|топка|хандбалистка|хващам|хвърлям
+🤹|балансиране|жонглирам|жонглиране|мултитаскинг|умение|човек
+🤹‍♂️|балансиране|жонглиране|жонгльор|мултитаскинг|мъж
+🤹‍♀️|жена|жонглиране|жонгльорка
+🧘|дзен|йога|кръстосани крака|медитация|мир|релаксация|човек в поза лотус
+🧘‍♂️|йога|медитация|мъж в поза лотос
+🧘‍♀️|жена в поза лотос|йога|медитация
+🛀|баня|вана|къпещ се човек
+🛌|дрямка|изморен|лека нощ|сън|хотел|човек в леглото
+🧑‍🤝‍🧑|двойка|за ръце|които се държат за ръце|ръка|хванати за ръка|хора, които се държат за ръце|човек
+👭|гей|две жени|двойка|държащи се за ръце|лгбти|лгбтк|лесбийки|момичета|приятелки
+👫|двойка|държащи се за ръце|жена|мъж и жена с хванати ръце|мъж и жена хванати за ръце|среща|флирт
+👬|близнаци|влюбени|гей|двойка|лгбти|лгбтк|момчета|мъже|приятели
+💏|годишнина|двойка|любов|романтика|целувка
+💑|годишнина|двойка и сърце|любов|романтика|сърце|целувка
+🗣️|глава|говореща|лице|силует
+👤|бюст|мистериозен|силует на бюст|сянка
+👥|бюст|приятели|силуети на бюстове|хора
+🫂|благодаря|довиждане|здравей|прегръдка|прегръщащи се хора|приятелство|сбогом
+👪|баща|дете|майка|семейство
+🧑‍🧑‍🧒|възрастен|дете|семейство
+🧑‍🧑‍🧒‍🧒|възрастен|дете|семейство: възрастен, възрастен, дете, дете
+🧑‍🧒|дете|семейство: възрастен, дете
+🧑‍🧒‍🧒|дете|семейство: възрастен, дете, дете
+👣|боси крака|облекло|следа|стъпала|стъпка|стъпки|тяло
+🫆|идентичност|криминалисти|пръстов отпечатък|сигурност
+🐵|банан|животно|лице на маймуна|маймуна
+🐒|банан|животно|маймуна
+🦍|горила|животно
+🦧|животно|маймуна|орангутан|човекоподобна маймуна
+🐶|домашно животно|животно|куче|лице|муцуна на куче
+🐕|домашен любимец|домашно животно|животно|куче
+🦮|водач|достъпна среда|куче водач|куче-водач|незрящи
+🐕‍🦺|достъпна среда|куче|помощ|служба|служебно куче|съдействие
+🐩|животно|куче|пудел
+🐺|вълк|животно|лице|муцуна на вълк
+🦊|животно|лисица|лице на лисица|муцуна
+🦝|енот|животно|любопитен|миеща мечка
+🐱|домашен любимец|домашно животно|животно|коте|котка|муцуна на котка
+🐈|домашен любимец|домашно животно|животно|коте|котка
+🐈‍⬛|животно|котка|лош късмет|мяу|черна
+🦁|алфа|зодиакален знак|зодия|лъв|муцуна на лъв|ръмжене|сафари
+🐯|голяма котка|животно|муцуна на тигър|тигър|хищник
+🐅|голяма котка|животно|зоопарк|тигър|хищник
+🐆|голяма котка|животно|зоопарк|леопард|хищник
+🐴|дресура|кон|лице|муцуна на кон|ферма
+🫎|бозайник|животно i еленови рога i лос i бозайник|лос
+🫏|бозайник|животно|магаре|муле|товарно животно|упорит
+🐎|животно|кон|надбягвания|състезателен кон|ферма
+🦄|еднорог|лице|муцуна на еднорог
+🦓|животно|зебра|ивица
+🦌|елен|животно
+🦬|бивол|бизон|европейски бизон|животно|стадо
+🐮|крава|лице|мляко|муу|муцуна на крава|ферма
+🐂|бик|вол|животно|зодиакален знак|зодия|телец|ферма
+🐃|бивол|вода|воден бивол|животно|зоопарк
+🐄|животно|крава|мляко|муу|муцуна|ферма
+🐷|бекон|животно|зурла на прасе|прасе|свинско|ферма
+🐖|животно|прасе|свиня|ферма
+🐗|глиган|животно|игра на тронове|прасе
+🐽|животно|зурла|муцуна|нос|прасешка зурла|ферма
+🐏|животно|зодиакален знак|зодия|зоопарк|овен|рога
+🐑|бее|животно|овца|пухкав
+🐐|животно|зодиакален знак|зодия|коза|козирог|мляко|ферма
+🐪|гърбица|едногърба камила|животно|камила|пустиня
+🐫|гърбица|двугърба камила|животно|камила|пустиня
+🦙|алпака|викуня|вълна|гуанако|животно|лама
+🦒|животно|жираф|петна
+🐘|голямо животно|животно|слон|хобот
+🦣|бивници|голям|животно|изчезване|космат|мамут
+🦏|животно|носорог
+🦛|едър бозайник|животно|хипопотам
+🐭|животно|мишка|муцуна на мишка
+🐁|животно|мишка
+🐀|животно|плъх
+🐹|домашен любимец|домашно животно|животно|муцуна на хамстер|хамстер
+🐰|домашен любимец|домашно животно|животно|заек|зайче|муцуна на заек
+🐇|домашен любимец|домашно животно|животно|заек|зайче
+🐿️|катерица
+🦫|бобър|дига|животно|зъби
+🦔|с игли|таралеж
+🦇|вампир|животно|прилеп
+🐻|гризли|мед|мечка|муцуна на мечка
+🐻‍❄️|бяла|мечка|полярна
+🐨|австралия|животно|коала|мечка|муцуна|торбесто животно
+🐼|бамбук|животно|лице|муцуна на панда|панда
+🦥|бавен|ленивец|мързелив
+🦦|видра|игривост|ловене на риба|риболов
+🦨|воня|силна миризма|скункс
+🦘|австралия|двуутробно животно|животно|кенгуру|скокове
+🦡|борсук|животно|меден язовец|язовец
+🐾|лапи|отпечатъци|следи от лапи
+🦃|денят на благодарността|птица|пуйка
+🐔|животно|кокошка|птица
+🐓|животно|петел|птица
+🐣|бебе|животно|излюпващо се пиленце|пиленце|птица|яйце
+🐤|бебе|животно|малко пиленце|пиленце|птица
+🐥|бебе|животно|новородено|пиленце отпред|птица
+🐦|животно|орнитология|птица
+🐧|антарктида|животно|пингвин|птица
+🕊️|гълъб|мир|полет|птица
+🦅|животно|орел|птица
+🦆|животно|патица|птица
+🦢|грозното патенце|животно|лебедова шия|птица
+🦉|бухал|животно|мъдрост|птица
+🦤|голям|додо|животно|изчезване|мавриций|птица
+🪶|леко|перо|перушина|полет|птица
+🦩|тропическа птица|фламинго|ярък цвят
+🦚|ветрило|животно|красива опашка|наперен|паун|птица
+🦜|говореща птица|животно|папагал|пират|птица
+🪽|авиация|ангелски|крило|летене|митология|птица
+🐦‍⬛|врана|гарван|животно|клюн|кос|птица|черен|черно
+🪿|глупав|гъска|животно|крясък|птица|стадо
+🐦‍🔥|безсмъртие|възраждане|възход|жар-птица|подновяване|прераждане|трансформация|фантазия|феникс
+🐸|глава на жаба|жаба|лице
+🐊|воден хищник|животно|зоопарк|крокодил
+🐢|животно|костенурка
+🦎|влечуго|гущер|животно
+🐍|животно|змиеносец|змия|зодиакален знак|зодия
+🐲|глава на дракон|дракон|животно|лице|приказка
+🐉|дракон|животно|китайски|приказка|рицари
+🦕|брахиозавър|бронтозавър|динозавър|диплодок|завропод
+🦖|динозавър|тиранозавър рекс
+🐳|животно|кит|океан|пръскащ
+🐋|животно|кит|морски бозайник|океан|плаж
+🐬|делфин|животно|морски бозайник|океан|плаж
+🦭|животно|морски лъв|океан|тюлен
+🐟|вечеря|животно|зодиакален знак|зодия|риба|риби
+🐠|риба|тропическа
+🐡|животно|риба балон
+🦈|акула|животно|риба
+🐙|животно|океан|октопод|създание
+🐚|животно|мида|плаж|раковина|спирална раковина|спираловидна раковина|черупка
+🪸|изменение на климата|климатични промени|корал|море|океан|промяна на климата|риф
+🪼|безгръбначно|воден свят|желе|животно|изгаряне|медуза|море|морско животно|океан|парещо животно
+🦀|зодиакален знак|зодия|рак
+🦞|морска храна|омар|червен рак|щипки
+🦐|скарида|храна|черупкови
+🦑|животно|калмар|мекотело|храна
+🦪|гмуркане|мида|перла|стрида
+🐌|градина|животно|охлюв|природа
+🦋|красиво|насекомо|пеперуда
+🐛|буболечка|градина|животно|насекомо
+🐜|градина|животно|мравка|насекомо
+🐝|животно|мед|насекомо|природа|пролет|пчела
+🪲|бръмбар|буболечка|бубулечка|животно|насекомо
+🐞|бръмбар|градина|животно|калинка|насекомо|природа
+🦗|буболечка|насекомо|ортоптера|скакалец|щурец
+🪳|вредител|животно|напаст|насекомо|хлебарка
+🕷️|насекомо|паяк
+🕸️|паяжина|паяк
+🦂|зодиакален знак|зодия|скорпион
+🦟|вирус|комар|малария|насекомо|треска|ухапване
+🪰|болест|гниене|животно|ларва|летящ|муха|напаст
+🪱|животно|земен червей|паразит|червей
+🦠|амеба|бактерия|вирус|микроб|наука
+💐|букет|годишнина|любов|растение|рожден ден|романтика|цвете
+🌸|пролет|растение|цвете|цвят|череша|черешов цвят
+💮|бяло цвете|цвете
+🪷|будизъм|виетнам|индия|индуизъм|красота|лотус|мир|цвете|чистота
+🏵️|растение|розета
+🌹|красота|растение|роза|свети валентин|цвете
+🥀|повехнало|цвете
+🌺|растение|хибискус|цвете
+🌻|растение|слънце|слънчоглед|цвете
+🌼|глухарче|растение|цвете|цвят|цъфти
+🌷|лале|растение|цвете|цъфти
+🪻|зюмбюл|кученце|лавандула|лилаво|лупина|люляк|растение|цвете
+🌱|кълн|младо|растение
+🪴|зюмбюл|кученце|лавандула|лилаво|лупина|люляк|растение|цвете
+🌲|вечнозелено дърво|гора|дърво|природа|растение
+🌳|дърво|листопадно|растение|широколистно
+🌴|дърво|палма|растение|тропическо
+🌵|кактус|природа|пустиня|растение
+🌾|жито|клас|оризов клас|растение
+🌿|билка|лист|растение
+🍀|4|детелина|късмет|листо|растение|четирилистен|четирилистна детелина
+🍁|кленов лист|лист|падащ|растение
+🍂|есен|листо|падащ|паднало листо|растение
+🍃|вятър|листо, носено от вятъра|носено от вятъра|растение
+🪹|гнездо|гнездя|дом|правя гнездо|празно гнездо
+🪺|гнездо с яйца|гнездя|правя гнездо|птица|яйце
+🍄|гъба|марио|мухоморка|растение|супер марио
+🪾|дърво без листа|зима|сухо дърво|суша
+🍇|грозде|плод|растение
+🍈|плод|пъпеш|растение
+🍉|диня|плод
+🍊|витамин c|мандарина|оранжев|плод|растение|цитрус
+🍋|кисел|лимон|плод|растение|цитрус
+🍋‍🟩|кисело|коктейл|лайм|маргарита|мохито|плод|салса|текила|тропически плод|цитрус
+🍌|банан|калий|плод|растение
+🍍|ананас|пиня колада|плод|растение|тропически
+🥭|манго|плод|тропически плод|храна
+🍎|диета|плод|растение|храна|червена ябълка|ябълка
+🍏|зелена ябълка|плод|растение|ябълка
+🍐|круша|плод
+🍑|плод|праскова
+🍒|плод|растение|червен|череша|череши
+🍓|плод|растение|ягода
+🫐|боровинка|плодче|синьо|храна|черни боровинки
+🥝|киви|плод|храна
+🍅|домат|зеленчук|плод|растение|храна
+🫒|маслина|храна
+🥥|кокосов орех|палма|пиня колада
+🥑|авокадо|плод|храна
+🍆|зеленчук|патладжан|растение
+🥔|зеленчук|картоф|храна
+🥕|зеленчук|морков|храна
+🌽|кочан|растение|царевица|царевичен кочан
+🌶️|люта чушка|растение|чушка
+🫑|зелена чушка|зеленчук|камба|капсикум|пипер тип долма|храна|чушка
+🥒|зеленчук|кисела|краставица|краставичка|храна
+🥬|бургери|зеле|кейл|листен зеленчук|маруля|салата|спанак
+🥦|броколи|диво зеле|храна
+🧄|подправка|чесън
+🧅|лук|овкусяване|подправка
+🥜|зеленчук|фъстък|фъстъци|храна|ядка
+🫘|боб|бъбрек|храна|шушулка
+🌰|бадем|кестен|растение
+🫚|билка|бира|джинджифил|здраве|корен от джинджифил|подправка
+🫛|бобово растение|грахова шушулка|зелен боб|зеленчук|шушулка
+🍄‍🟫|вегетарианско|гъба|зеленчук|зеленчуци за пица|кафява печурка|природа|трюфел|храна
+🫜|градина|зеленчук|корен|ряпа|цвекло
+🍞|въглехидрати|жито|пшеница|пълнозърнест|ресторант|самун|филия хляб|хляб|храна
+🥐|закуска|кроасан|френски|френско|хляб|храна
+🥖|багета|багети|френско|хляб|храна
+🫓|арепа|лаваш|наан|пита|плосък хляб|храна
+🥨|брецел|геврек|преплетено
+🥯|геврек|закуска от тесто|пекарна
+🥞|закуска|палачинка|палачинки|храна
+🧇|гофрета|закуска|форма за гофрети
+🧀|резен сирене|сирене
+🍖|кост|месо с кост
+🍗|бутче|кост|пилешко|пуешко
+🥩|агнешки котлет|котлет|месо|парче месо|свински котлет|стек
+🥓|бекон|закуска|месо|храна
+🍔|бургер|гладен|сандвич|хамбургер|храна
+🍟|картофи|пържени|храна
+🍕|гладен|парче|пеперони|пица|резен|сирене|храна
+🌭|кренвирш|наденица|хотдог
+🥪|сандвич|хляб
+🌮|мексикански|мексиканско|тако
+🌯|бурито|мексикански|сандвич
+🫔|мексиканска храна|навити питки|тамалес
+🥙|гирос|кебап|пълнена питка|фалафел|храна
+🧆|кюфте|нахут|фалафел
+🥚|закуска|храна|яйце
+🍳|готвене|закуска|пържене|ресторант|тиган|храна|яйце
+🥘|касерол|паеля|пайеля|плитка тава с храна|тава с храна|храна
+🍲|варено|купа с храна|супа|тенджера с храна|яхния
+🫕|разтопяване|сирене|съд|фондю|храна|швейцарско|шоколад
+🥣|азиатска оризова каша|закуска|зърнена закуска|купа с лъжица
+🥗|зелена|салата|храна
+🍿|кино|пуканки|филм
+🧈|масло|млечни продукти
+🧂|вкус|подправка|солено|солница
+🥫|консерва|консервирана храна
+🍱|бенто|кутия за бенто|храна
+🍘|крекер|оризов крекер|храна
+🍙|ориз|топка|храна|японски
+🍚|ориз|сготвен|храна
+🍛|къри и ориз|ориз с къри
+🍜|изпускащ пара|изпускаща пара купа|клечки|купа|нудълс|пара|рамен|супа
+🍝|кюфтета|паста|ресторант|спагети|храна
+🍠|картоф|печен|сладък
+🍢|кебап|морска храна|оден|ресторант|храна|шиш
+🍣|суши|храна
+🍤|пържена|скарида|темпура|храна
+🍥|камабоко със спирален орнамент|ресторант|риба|рибен кейк|спирала|храна
+🥮|есен|китайски сладкиш|лунен кейк|лунен кекс|фестивал на есента
+🍡|данго|десерт|пръчка|сладък|шиш|японски
+🥟|гьоза|емпанада|китайски тестени топчета|кнедли|пелмен|тестено топче
+🥠|бисквита с късметче|предсказание
+🥡|доставка на храна|кутия за стриди|кутия за храна за вкъщи|пръчици за хранене|хартиена кутия за храна
+🍦|десерт|крем|лед|ресторант|сладолед|сладък|храна
+🍧|десерт|леден десерт|ресторант|сладък|храна
+🍨|десерт|крем|лед|ресторант|сладолед|сладък
+🍩|десерт|закуска|поничка|сладко|сладък|храна
+🍪|бисквитка|десерт|курабийка|сладко|сладък
+🎂|десерт|празненство|празнуване|рожден ден|сладкиш|торта за рожден ден
+🍰|десерт|парче|сладкишче|сладък|торта|шорткейк
+🧁|захар|кексче|къпкейк|лакомство|пекарна|сладкарница|сладкиш
+🥧|пай|парче пай|плодов|пълнеж|тестени|тестено|ябълков пай
+🍫|блокче|десерт|сладко|сладък|хелоуин|шоколадово блокче
+🍬|бонбон|десерт|ресторант|сладък|хелоуин
+🍭|близалка|десерт|ресторант|сладкиш|сладък|уили уонка
+🍮|десерт|крем|пудинг|сладък|яйчен крем
+🍯|гърне с мед|мед|мечка|мечо пух|сладък|храна
+🍼|бебешка бутилка|бутилка|мляко|напитка|новородено|раждане
+🥛|мляко|напитка|чаша
+🫖|канче|пия|храна|чайник
+🍵|напитка|пия|чаена чаша без дръжка|чай|чаша
+🍶|бар|бутилка|напитка|ресторант|саке|чаша
+🍾|бар|бутилка с изхвърчаща тапа|питие|тапа
+🍷|алкохол|винена чаша|вино|напитка|питие|ресторант|чаша
+🍸|алкохол|бар|клуб|коктейлна чаша|мартини|напитка|питие|чаша
+🍹|алкохол|бар|клуб|май тай|напитка|парти|питие|тропическа напитка|тропическо
+🍺|алкохол|бар|бира|германия|ейл|октоберфест|питие|халба
+🍻|алкохол|бар|бира|звънтящи халби за бира|наздраве|удрящи се халби бира|халба
+🥂|звънтящи чаши|наздраве|напитка|празнуване|стъкло
+🥃|алкохол|ниска|скоч|уиски|чаша|шот
+🫗|вода|изливаща се течност|инцидент|пия|празен|разливам|чаша
+🥤|безалкохолно|вода|сода|сок|чаша със сламка
+🧋|балончета|мляко|перлен чай|перли|тайван|храна|чай
+🧃|кутия за напитки|кутия за сок|напитка|сладък|сламка|сок
+🧉|мате|напитка|пия
+🧊|айсберг|кубче лед|ледено парче|студено
+🥢|пръчици за хранене|хаши
+🍽️|вечеря|вилица|готвене|нож и вилица с чиния|чиния
+🍴|вечеря|вилица|вкусно|гладен|готвене|закуска|нож и вилица|обяд|прибори|ресторант|хранене
+🥄|лъжица|прибори|хранене
+🔪|готвене|инструмент|кухненски нож|нож|оръжие
+🫙|буркан|контейнер|подправка|празен|сос|съд
+🏺|амфора|водолей|готвене|зодиак|зодия водолей|кана|оръжие|питие|съд
+🌍|африка|глобус с европа и африка|европа|земята
+🌎|глобус със северна и южна америка|земята|северна америка|южна америка
+🌏|австралия|азия|глобус с азия и австралия|земята
+🌐|глобус с меридиани|земята|интернет|меридиани|световната мрежа|свят
+🗺️|карта на света|свят
+🗾|карта на япония|япония
+🧭|компас|магнит|навигация|ориентиране
+🏔️|заскрежен планински връх|планина|покрита със сняг планина|сняг|студен
+⛰️|планина
+🌋|време|вулкан|изригване|планина|природа
+🗻|връх фуджи|планина|фуджи
+🏕️|къмпинг
+🏖️|плаж с чадър|чадър
+🏜️|пустиня
+🏝️|необитаем|остров
+🏞️|национален парк|парк
+🏟️|спорт|стадион
+🏛️|класическа|сграда
+🏗️|кран|сграда|строеж
+🧱|глина|зидам|стена|тухла|тухли|хоросан
+🪨|каменен блок|камък|масивен|скала|тежък
+🪵|дънер|дърва|дървен материал|дървесина|пън
+🛖|дом|колиба|кръгла къща|къща|подслон|юрта
+🏘️|къща|къщи|сграда
+🏚️|запусната|къща|сграда|съборетина
+🏠|дом|къща|предградие|провинция|сграда
+🏡|градина|дом|къща с градина|предградие|провинция|ранчо|сграда
+🏢|офис сграда|офисна сграда|работа|сграда
+🏣|поща|сграда|японска поща|японски
+🏤|европейски|поща|сграда
+🏥|болница|лекар|медицина|сграда
+🏦|банка|сграда
+🏨|сграда|хотел
+🏩|любовен хотел|сграда|хотел
+🏪|24|денонощен|магазин|сграда|смесен магазин
+🏫|сграда|училище
+🏬|магазин|сграда|универсален
+🏭|сграда|фабрика
+🏯|дворец|замък|сграда|японски
+🏰|дворец|европейски|замък|сграда
+💒|романтика|сватба|църква
+🗼|кулата в токио|токио
+🗽|ню йорк|свобода|статуята на свободата
+⛪|кръст|религия|сграда|християнство|църква
+🕌|джамия|ислям|мюсюлманин|религия
+🛕|индуизъм|индуистки храм|храм
+🕍|евреин|религия|синагога|храм|юдаизъм
+⛩️|религия|храм|шинтоистки храм
+🕋|ислям|кааба|мюсюлманин|религия
+⛲|фонтан|шадраван
+⛺|къмпинг|палатка
+🌁|време|мъгла|мъгливо
+🌃|време|звезда|звездна нощ|нощ
+🏙️|градски изглед|сграда|сгради
+🌄|изгрев над планини|планина|слънце|сутрин|утрин
+🌅|време|изгрев|слънце|сутрин|утро
+🌆|вечер|градски изглед по здрач|залез|здрач|сгради|слънце
+🌇|време|залез|здрач|сграда|слънце
+🌉|време|мост през нощта|нощ
+🎠|въртележка|забавление|кон от въртележка
+🛝|детска пързалка|игра|парк за забавления|площадка|пързалка
+🎡|виенско|колело|лунапарк|увеселителен парк
+🎢|влакче в увеселителен парк|лунапарк|увеселителен парк
+💈|бръснар|знак на бръснар|подстригване
+🎪|циркова шатра|шапито|шатра
+🚂|влак|железница|локомотив|парен|превозно средство
+🚃|вагон|влак|електрически|железница|трамвай|тролейбус
+🚄|високоскоростен влак|влак стрела|железница|шинкансен
+🚅|високоскоростен влак стрела|влак стрела|железница|пътуване|скорост|шинкансен
+🚆|влак|железница|превозно средство|пуф-паф
+🚇|метро|превозно средство|пътуване
+🚈|железница|лека железница|превозно средство
+🚉|влак|гара|железница|превозно средство
+🚊|превозно средство|трамвай|тролейбус
+🚝|монорелсова железница|превозно средство
+🚞|вагон|железница|планина|планинска железница|превозно средство
+🚋|вагон|превозно средство|трамваен вагон|трамвай|тролейбус
+🚌|автобус|превозно средство|училище
+🚍|автобус|превозно средство|приближаващ
+🚎|превозно средство|трамвай|тролейбус
+🚐|автобус|ван|минибус|превозно средство
+🚑|линейка|превозно средство|спешен случай
+🚒|камион|пожарен автомобил|превозно средство
+🚓|автомобил|патрулка|полицейска кола|полиция|превозно средство
+🚔|автомобил|полиция|превозно средство|приближаваща полицейска кола
+🚕|жълто такси|превозно средство|такси
+🚖|жълто такси|превозно средство|приближаващо такси|такси
+🚗|автомобил|кола|превозно средство|шофиране
+🚘|автомобил|кола|превозно средство|приближаващ
+🚙|автомобил с повишена проходимост|кола|почивка|превозно средство за почивка
+🛻|автомобил|камион|кола|пикап|товарене|транспорт
+🚚|доставки|камион за доставки|превозно средство
+🚛|камион с полуремарке|полуремарке|превозно средство|тир|шофиране
+🚜|превозно средство|трактор
+🏎️|автомобил|състезание|състезателен автомобил
+🏍️|мотоциклет|състезание
+🛵|моторен скутер|скутер
+🦽|достъпна среда|достъпност|рингова инвалидна количка|ръчна инвалидна количка
+🦼|акумулаторна инвалидна количка|достъпна среда|достъпност
+🛺|авторикша|рикша|тук тук|тук-тук
+🚲|велосипедист|колело|превозно средство|спининг
+🛴|тротинетка
+🛹|дъска|колела|скейтборд|скейтър
+🛼|кънка|кънки|пързаляне|ролери|ролкови кънки|спорт
+🚏|автобусна|спирка
+🛣️|магистрала|път
+🛤️|влак|железница|железопътна линия
+🛢️|варел за нефт|нефт
+⛽|бензиностанция|газ|гориво|колонка за гориво
+🛞|автомобил|въртене|гума|кола|колело|кръг|превозно средство
+🚨|автомобил|лампа|полицейска лампа|полиция|превозно средство|сирена|спешен случай
+🚥|светофар|трафик|хоризонтален светофар
+🚦|вертикален светофар|кръстовище|светофар|сигнализация|трафик
+🛑|знак|осмоъгълен|стоп
+🚧|преграда|строеж|строителни дейности|строителни работи
+🛟|безопасност|плаване|плуване|спасителен пояс|спасяване на живот
+⛵|кораб|курорт|море|превозно средство|яхта
+🛶|кану|лодка
+🚤|езеро|кораб|лукс|лято|милиардер|милионер|моторна лодка|превозно средство|пътуване
+🛳️|кораб|превозно средство|пътнически
+⛴️|кораб|пътнически|ферибот
+🛥️|кораб|моторна яхта|превозно средство
+🚢|кораб|лодка|превозно средство|пътник|пътнически|пътуване|титаник
+🛩️|малък самолет|превозно средство|самолет
+🛫|заминаване|излитане|излитащ самолет|превозно средство|самолет|чекиране
+🛬|кацане|кацащ самолет|превозно средство|пристигане|самолет
+🪂|делтапланеризъм|парасейлинг|парашутизъм|скок с парашут
+💺|място|седалка
+🚁|превозно средство|пътуване|хеликоптер
+🚟|железница|окачена|превозно средство
+🚠|въже|гондола|лифт|планина|превозно средство
+🚡|въжена линия|кабинка|лифт|превозно средство
+🛰️|космос|сателит|спътник
+🚀|космос|превозно средство|пътуване|ракета
+🛸|извънземни|летяща чиния|нло
+🛎️|звънец за рецепция|рецепция|хотел
+🧳|багаж|куфари|пътуване|чанта с колелца
+⌛|пясък|пясъчен часовник|таймер|часовник
+⏳|пясък|пясъчен часовник с падащ пясък|часовник
+⌚|ръчен часовник|часовник
+⏰|аларма|будилник|време|часовник
+⏱️|хронометър|часовник
+⏲️|таймер|часовник
+🕰️|време|часовник за камина
+🕛|00|12:00|време|дванадесет часът|полунощ|час
+🕧|00:30|12:30|24:00|30|дванадесет часът и половина|половина
+🕐|00|01:00|1:00|13:00|един часът
+🕜|1:30|13:30|30|един и половина часът|половина|тридесет|час
+🕑|00|02:00|14:00|2:00|два часът
+🕝|02:30|14:30|2:30|два и половина часът|половина|тридесет
+🕒|00|03:00|15:00|3:00|три часът
+🕞|03:30|15:30|3:30|половина|три и половина часът|тридесет
+🕓|00|04:00|16:00|4:00|четири часът
+🕟|16:30|4:30|половина|тридесет|четири и половина часът
+🕔|00|05:00|17:00|5:00|пет часът
+🕠|05:30|17:30|5:30|пет и половина часът|половина|тридесет
+🕕|00|06:00|18:00|6:00|шест часът
+🕡|06:30|18:30|6:30|половина|тридесет|шест и половина часът
+🕖|00|07:00|19:00|7:00|седем часът
+🕢|07:30|19:30|7:30|половина|седем и половина часът|тридесет
+🕗|00|08:00|20:00|8:00|осем часът
+🕣|08:30|20:30|8:30|осем и половина часът|половина|тридесет
+🕘|00|09:00|21:00|9:00|девет часът
+🕤|09:30|21:30|9:30|девет и половина часът|половина|тридесет
+🕙|00|10:00|22:00|десет часът
+🕥|10:30|22:30|десет и половина часът|половина|тридесет
+🕚|00|11:00|23:00|единадесет часът
+🕦|11:30|23:30|единадесет и половина часът|половина|тридесет
+🌑|време|космос|луна|новолуние|тъмен
+🌒|космос|луна|нарастващ полумесец на луната|полумесец
+🌓|време|космос|луната в първа четвърт|четвърт
+🌔|космос|луна|нарастваща|полупълна
+🌕|време|космос|луна|пълна|пълнолуние
+🌖|космос|луна|намаляваща|полупълна
+🌗|време|космос|луна|последна четвърт на луната|четвърт
+🌘|космос|луна|намаляващ полумесец на луната|полумесец
+🌙|време|космос|луна|полумесец|рамадан
+🌚|време|космос|лице|луната в новолуние с лице
+🌛|космос|лице|луната в първа четвърт с лице|четвърт
+🌜|лице|луната в последна четвърт с лице|четвърт
+🌡️|време|термометър
+🌝|космос|лице|луната в пълнолуние с лице|пълна|ярък
+🌞|време|ден|лице|плаж|слънце с лице|ярко|ярък
+🪐|планета с пръстен|под влиянието на сатурн|под знака на сатурн|сатурн
+⭐|астрономия|жълта звезда|звезда
+🌟|блестяща звезда|блясък|звезда|искрящ|нощ
+🌠|звезда|космос|небе|нощ|падаща
+🌌|време|космос|млечният път
+⛅|време|облак|слънце зад облак
+⛈️|време|гръмотевица|дъжд|облак с дъжд и светкавица
+🌤️|време|облак|слънце зад малък облак
+🌥️|време|облак|слънце зад голям облак
+🌦️|време|дъжд|облак|слънце зад облак с дъжд
+🌧️|време|дъжд|облак с дъжд
+🌨️|време|облак със сняг|сняг|студен
+🌩️|време|облак със светкавица|светкавица
+🌪️|вихрушка|време|облак|торнадо
+🌫️|време|мъгла|облак
+🌬️|време|вятър|издухвам|издухващо вятър|лице с издухване на вятър|лице, издухващо вятър|облак
+🌀|вихър|време|спирала|тайфун|ураган|циклон
+🌈|време|гей|дъга|дъжд|лгбти|лгбтк|лесбийка|прайд|транссексуален
+🌂|време|дъжд|затворен чадър|облекло|чадър
+⛱️|време|дъжд|плажен чадър|слънце|чадър на земята
+⚡|високо напрежение|гръмотевица|електричество|опасност|природа|светкавица|токов удар
+⛄|време|снежен човек без сняг|сняг|студен
+🔥|горещо|запален|огън|пламък
+💧|вода|време|капка|пот|студен|сълза
+🌊|вода|време|вълна|море|океан|сърфист
+🎃|празнуване|тиква|тиквен фенер|хелоуин
+🎄|дърво|елха|коледа|коледна елха|празнуване
+🎆|забавление|заря|празненство|празнуване|фойерверки
+🎇|блестящи|празнуване|фойерверк
+🧨|динамит|експлозив|искра|огън|пиратка|светлина|фойерверки
+🎈|балон|празнуване|рожден ден|честване
+🎉|конфети|купон|празненство|празнуване|развълнуван|рожден ден|ура
+🎊|конфети|парти|празненство|празнуване|топка с конфети
+🎋|дърво за танабата|знаме|празнуване|японски
+🎍|бамбук|бор|празнуване|растение|украса кадомацу|японски
+🎎|кукла|празник|празнуване|фестивал|японски кукли
+🎏|знаме|коинобори|празнуване|шаран
+🎐|вятърни камбанки|звънец|камбанки|празнуване
+🎑|луна|празнуване|церемония цукими
+🧧|китайски плик|късмет|пари|подарък|червен плик
+🎀|панделка|празнуване
+🎁|изненада|кутия|опакован|подарък|празнуване|рожден ден
+🎗️|лента за напомняне|напомняне|празнуване|честване
+🎟️|билети за вход|вход
+🎫|билет|вход
+🎖️|военен|медал|награда|празнуване|честване
+🏆|награда|победа|победител|спортна купа|трофей|шампион
+🏅|злато|медал|награда|победител|спортен медал
+🥇|злато|медал за първо място|първи|първо
+🥈|2|второ|медал за второ място|сребро
+🥉|3|бронз|медал за трето място|трети|трето
+⚽|меси|неймар|рашфорд|роналдо|спорт|топка|футболна топка
+⚾|бейзболна топка|спорт|топка
+🥎|ръкавица|софтбол|спорт с топка|топка
+🏀|баскетболна топка|спорт|топка
+🏐|волейбол|игра|топка
+🏈|американски футбол|спорт|супер купа|топка за американски футбол
+🏉|ръгби|спорт|топка за ръгби
+🎾|ракета|спорт|тенис|топка
+🥏|летящ диск|фризби
+🎳|боулинг|игра|кегла|спорт|топка
+🏏|бухалка|игра|крикет|топка
+🏑|игра|игрище|спорт|стик|хокей на трева|шайба
+🏒|игра|лед|стик и шайба за хокей на лед|хокей|шайба
+🥍|гол|лакрос|спорт|стик|топка
+🏓|игра|пинг-понг|тенис на маса|топка|хилка
+🏸|бадминтон|игра|перце|ракета
+🥊|боксова ръкавица|ръкавица|спорт
+🥋|бойни изкуства|джудо|дреха за бойни изкуства|карате|таекуондо|униформа
+🥅|гол|мрежа за голове|спорт
+⛳|голф|дупка|спорт|флагче в дупка
+⛸️|кънка за лед|кънки на лед|лед
+🎣|въдица|риба|риболов|спорт
+🤿|гмуркане|маска за гмуркане|скуба дайвинг|шнорхелинг
+🎽|лента|потник|спортно горнище|тичане|фланелка
+🎿|ски|сняг|спорт
+🛷|карам шейна|сняг|чук и гек|шейна
+🥌|игра|камък за кърлинг
+🎯|в десетката|дарт|игра|попадение|стрела|стреличка|точен удар|цел|център на мишената
+🪀|въртене|играчка|йо-йо|навиване
+🪁|летене|полет|реене|хвърчило
+🔫|вода|воден пистолет|оръжие|пистолет|револвер
+🎱|8|билярд|игра|осмица|топка
+🔮|бъдеще|гадателски инструмент|кристално кълбо|кълбо|предсказание|приказка|съдба
+🪄|вещица|вълшебна пръчица|магическа пръчка|магия|магьосник|магьосница
+🎮|видеоигра|забавление|игра|контролер
+🕹️|видеоигра|джойстик|игра
+🎰|игра|казино|ротативка|хазарт
+🎲|зар за игра|зарове|зарче|игра
+🧩|парче|пъзел|редя пъзел|следа|част от пъзел
+🧸|играчка|мече|плюшена играчка|плюшено мече
+🪅|мексико|парти|пети май|пинята|празнуване
+🪩|блясък|диско|огледално|парти|танцувам|топка
+🪆|една в друга|кукла|матрьошки|русия
+♟️|маловажна фигура|незначителен човек|пешка|фигура за шах|шах
+🃏|жокер|игра|карта
+🀄|червен дракон в маджонг|игра|маджонг
+🎴|игра|карта|карти за игра ханафуда|цвете|японски
+🎭|актриса|актьор|изкуство|маска|сцена|сценични изкуства|театър|шекспир
+🖼️|изкуство|картина в рамка|музей|рамка
+🎨|изкуство|картина|музей|палитра на художник
+🧵|игла|конец|макара|нишка|шиене
+🪡|бодове|бродиране|игла|шевове|шивач|шивашка игла|шиене
+🧶|кълбо|плетене|плетиво|прежда
+🪢|връв|въже|възел|завързан|усукване
+👓|облекло|око|очила
+🕶️|око|очила|тъмен|тъмни очила
+🥽|гмуркане|заваряване|защита на очите|очила|плуване|предпазни очила
+🥼|бяла престилка|доктор|дрехи|експеримент|лабораторна престилка|лекар|учен
+🦺|безопасност|жилетка|светлоотразителна жилетка|спешен случай
+👔|вратовръзка|облекло|работа|риза|сериозен
+👕|блуза|дрехи|облекло|синьо|тениска|уикенд|фланелка|яка
+👖|дънки|небрежно|облекло|пазаруване|панталони|уикенд
+🧣|врат|студ|шал
+🧤|ръкавици
+🧥|палто|студ|яке
+🧦|три-четвърти чорапи|чорапи
+👗|дрехи|облекло|пазаруване|рокля
+👘|кимоно|облекло
+🥻|дреха|рокля|сари
+🩱|бански костюм|костюм за къпане|цял бански
+🩲|бански костюм|бельо|долно бельо|слипове
+🩳|бански костюм|бельо|долно бельо|къси панталони|плувни шорти
+👙|бански костюм|бикини|облекло|плаж|плуване
+👚|блуза|дамски дрехи|дамско облекло|жена|облекло|яка
+🪭|веене|ветрило|горещо|разхлаждане|ръчно сгъваемо ветрило|срамежлив|танц|флирт|японско ветрило
+👛|аксесоар|дрехи|монета|монети|портмоне|рокля
+👜|дамска чанта|дрехи|облекло|пазаруване|чанта
+👝|дамска чанта|клъч|облекло|чанта|чантичка
+🛍️|пазарски чанти|пазаруване|хотел|чанта
+🎒|образование|раница|ученическа раница|ученическа чанта|училище|чанта
+🩴|джапанка|джапанки|обувка|плажни сандали|сандали|чехли
+👞|кафява|крак|мъжка обувка|облекло|обувка|пазаруване
+👟|гуменка|маратонка|облекло|обувка за тичане|спортна|тенис
+🥾|ботуш|кафява обувка|къмпинг|походи с раница|туристическа обувка
+🥿|балеринки|ниска обувка|обувка без ток|пантофка|удобно
+👠|жена|облекло|обувка с висок ток|пазаруване|токче|червена обувка
+👡|дамска отворена обувка|жена|облекло|обувка|отворена|сандал
+🩰|балетни обувки|танц
+👢|ботуш|дамски ботуш|жена|облекло|обувка
+🪮|афроприческа|гребен|декоративен гребен|декорация|коса|прическа|фризьор
+👑|игра на тронове|корона|кралица|кралска особа|облекло|царско семейство
+👒|градинско парти|дамска шапка|жена|облекло|шапка
+🎩|дрехи|линкълн|магически трикове|облекло|цилиндър|шапка
+🎓|дипломиране|облекло|образование|празнуване|шапка за дипломиране
+🧢|бейзболна шапка|шапка с козирка
+🪖|армия|военна|воин|войник|войска|каска
+⛑️|каска с бял кръст|кръст|помощ|шапка
+📿|броеница|молитва|облекло|религия
+💄|грим|козметика|среща|червило
+💍|блестящ|годеж|диамант|пръстен|романтика|сватба|сгоден
+💎|бижу|годеж|диамант|пари|романтика|сватба|скъпоценен камък
+🔇|високоговорител|заглушен|изключен|сила на звука|тих
+🔈|високоговорител със слаб звук|звук|ниска сила на звука
+🔉|високоговорител със средносилен звук|включен високоговорител|сила на звука|средносилен
+🔊|високоговорител със силен звук|звук|музика|сила на звука|силен|силно пуснат високоговорител
+📢|високоговорител за обществени места|комуникация|обществен|силен
+📣|мегафон|подкрепа
+📯|поща|пощенски|рог
+🔔|звук|звънец|камбана|църква
+🔕|без звук|забрана|забранено|зачертан звънец|звънец|не|тих
+🎼|запис|музика|нота|нотен запис
+🎵|звук|музикална нота|нота
+🎶|звук|музика|нота|ноти
+🎙️|микрофон|музика|студиен микрофон|студио
+🎚️|музика|ниво|плъзгач за нивото
+🎛️|копчета за управление|музика|ръкохватки|управление
+🎤|звук|караоке|микрофон|музика|пеене
+🎧|звук|слушалка|слушалки
+📻|видео|забавление|радио
+🎷|инструмент|музика|саксофон
+🪗|акордеон|баян|инструмент|концертина|музика
+🎸|инструмент|китара|музика
+🎹|инструмент|клавиатура на музикален инструмент|музика|пиано
+🎺|инструмент|музика|тромпет
+🎻|инструмент|музика|цигулка
+🪕|банджо|музика|струни
+🥁|барабан|музика|палки
+🪘|барабан|висок барабан|инструмент|конга|ритъм
+🪇|инструмент|маракаси|музика|перкусии|раздрусване|танци|тракане
+🪈|бенд|духов инструмент|инструмент|кавал|музика|оркестър|рекордер|флейта
+🪉|арфа|инструмент|купидон|любов|музика|оркестър
+📱|клетъчен|комуникация|мобилен|телефон
+📲|входящо|клетъчен|комуникация|мобилен телефон със стрелка|получавам|стрелка|телефон
+☎️|телефон
+📞|комуникация|слушалка|телефонна слушалка
+📟|комуникация|пейджър
+📠|комуникация|факс
+🔋|батерия
+🪫|батерия|електроника|изтощена батерия|слабо захранване
+🔌|електрически|електричество|щепсел
+💻|компютър|лаптоп|офис|персонален
+🖥️|компютър|монитор|настолен
+🖨️|компютър|принтер
+🖱️|бутон|компютърна мишка|мишка
+🖲️|компютър|трекбол
+💽|диск|компютърен диск|минидиск|оптичен
+💾|дискета|компютър|флопи
+💿|[blu-ray]|[cd]|[dvd]|cd|диск|компютър|оптичен
+📀|[blu-ray]|[dvd]|blu-ray|cd|dvd|диск|компютър|оптичен|оптично устройство
+🧮|калкулатор|сметало|смятане
+🎥|записване|камера|кино|филмова|холивуд
+🎞️|кадри|кино|лента|филмови кадри
+📽️|видео|кинопроектор|проектор|филм
+🎬|клапа|филмова
+📺|видео|тв|телевизор
+📷|[instagram]|видео|камера|селфи|фотоапарат
+📸|видео|светкавица|фотоапарат със светкавица
+📹|видеокамера|камера
+📼|[vhs]|видеокасета|лента
+🔍|инструмент|лаборатория|лупа|наклонена наляво лупа|наука|търсене
+🔎|инструмент|лаборатория|лупа|наклонена надясно лупа|наука|търсене
+🕯️|светлина|свещ
+💡|електрическа крушка|идея|комикс|крушка|светлина
+🔦|електрическа|електрическо|инструмент|светлина|фенерче
+🏮|бар|ресторант|светлина|фенер|червен хартиен фенер|японски
+🪔|дия|лампа|маслена лампа|масло
+📔|бележник с декоративна корица|книга|корица|образование|писане|украсен|училище
+📕|затворена книга|книга|образование
+📖|библиотека|знание|книга|образование|отворена книга|романи|четене
+📗|библиотека|зелена книга|книга|образование|фантастика|четене
+📘|библиотека|книга|образование|синя книга|четене
+📙|библиотека|книга|образование|оранжева книга|четене
+📚|библиотека|знание|книга|книги|образование|романи|училище|четене
+📓|бележник
+📒|бележник|главна книга|счетоводна книга
+📃|документ|завита|страница
+📜|свитък|хартия
+📄|документ|страница с лицето нагоре
+📰|вестник|комуникация|новини
+🗞️|вестник|навит на руло вестник|новини|руло
+📑|знак|отбелязване|отметка|отметки
+🔖|знак|отметка
+🏷️|етикет
+💰|банка|богат|долар|злато|милион|пари|плащане|торба с пари|чичо скрудж
+🪙|долар|евро|злато|метал|монета|пари|сребро|съкровище
+💴|банкнота със знак за йена|валута|йена|пари
+💵|банкнота със знак за долар|валута|долар|пари
+💶|банкнота със знак за евро|валута|евро|пари
+💷|банкнота със знак за лира|валута|лира|милиард|милион|пари|паунд
+💸|банкнота|долар|крила|милиард|милион|пари с крила
+💳|банка|карта|кредитна|пари|таксуване
+🧾|доказателство|разписка|счетоводство|фактура
+💹|валута|възходяща диаграма със знак за йена|графика|диаграма с възходяща тенденция и знак за йена|йена|пазар|пари|ръст|тенденция
+📧|имейл|писмо|поща
+📨|входящ|имейл|плик|поща|пристигащ
+📩|изпратен|изходящ|имейл|комуникация|писмо|плик със стрелка|стрелка
+📤|изпратени|изходяща|кутия|писмо|поща|тава за изходящи
+📥|входяща|имейл|кутия|писмо|получен|поща|тава за входящи
+📦|доставка|изпращане|кашон|колет|кутия|пакет|пратка
+📫|затворена пощенска кутия с вдигнато флагче|поща|пощенска кутия с вдигнато флагче
+📪|затворена пощенска кутия със спуснато флагче|поща|пощенска кутия|свален
+📬|отворена пощенска кутия с вдигнато флагче|поща|пощенска кутия
+📭|отворена пощенска кутия със спуснато флагче|поща|пощенска кутия|свален
+📮|поща|пощенска кутия
+🗳️|кутия|урна за гласуване с бюлетина
+✏️|молив
+🖋️|писалка
+🖊️|писалка|химикалка
+🖌️|рисуване|четка
+🖍️|пастел
+📝|бележка|комуникация|молив
+💼|куфарче|офис|чанта за документи
+📁|папка за документи|файл
+📂|отворена|папка|файл
+🗂️|индекс|карта|показалец|разделители за картотека
+📅|дата|календар
+📆|календар с късащи се листове
+🗒️|бележник със спирала|спирала
+🗓️|календар със спирала|спирала
+📇|индекс|карта|картотека|показалец
+📈|възходяща диаграма|графика|данни|диаграма с възходяща тенденция|нагоре|ръст|тенденция
+📉|графика|диаграма с низходяща тенденция|надолу|низходяща диаграма|спад|тенденция
+📊|данни|диаграма|стълбовидна диаграма
+📋|бележки|задачи|клипборд
+📌|кабърче|колаж
+📍|кабърче|кръгло
+📎|кламер
+🖇️|връзка|кламер|съединени кламери
+📏|линия|математика|права линия|ъгъл
+📐|линия|математика|триъгълна линия|триъгълник|ъгъл
+🗃️|документ|карта|картотечна кутия|кутия
+🗄️|карта|картотека|картотечен шкаф|шкаф
+🗑️|кошче за боклук
+🔒|заключен|затворен|катинар
+🔓|катинар|отворен|отключен
+🔏|заключен|катинар с писалка|мастило|писалка|писец|поверителност
+🔐|заключен|затворен катинар с ключ|защитен|катинар|ключ|сигурен
+🔑|заключване|ключ|отключване|парола
+🗝️|заключване|ключалка|стар|указание|улика
+🔨|инструмент|ремонт|чук
+🪓|брадва|дърво|разцепвам|сека|секира|сеч
+⛏️|инструмент|кирка|копане|мина|чук
+🛠️|гаечен ключ|инструмент|чук и гаечен ключ
+🗡️|кинжал|нож|оръжие|острие
+💣|бомба|бум|експлозия|комикс|опасно
+🪃|аборигени|австралия|бумеранг|връщане|оръжие|откат
+🏹|зодия|лък и стрела|стрела|стрелец
+🛡️|оръжие|щит
+🪚|дърводелец|дървосекач|инструмент|режа|трион
+🔧|гаечен ключ|инструмент|ремонт
+🪛|инструмент|отвертка|плоска|развивам
+🔩|болт и гайка|гайка|инструмент|ремонт
+🗜️|инструмент|компресия|менгеме|скоба|стяга
+🦯|бастун за незрящи|бял бастун|достъпна среда|достъпност|незрящ
+🔗|верига|връзка|връзки|синджир
+⛓️‍💥|белезници|верига|свобода|скъсана верига|скъсване
+⛓️|верига|вериги
+🪝|гега|извивка|кука|примка|търговско предимство|хващане
+🧰|инструмент|кутия за инструменти|механика|ремонт|сандък|червена кутия
+🧲|залепване|конска подкова|магнит|привличане
+🪜|катеря се|стълба|стъпало
+🪏|дупка|копая|лопата|остра лопата
+🧪|експеримент|епруветка|лаборатория|химик|химия
+🧫|бактериална култура|бактерия|биология|блюдо на петри|лаборатория
+🧬|биолог|генетика|гени|днк|еволюция|живот
+🔬|експеримент|инструмент|лаборатория|микроскоп|наука
+🔭|инструмент|наука|телескоп
+📡|антена|сателитна|чиния
+💉|болен|ваксина|грип|игла|инструмент|лекар|медицина|спринцовка
+🩸|даряване на кръв|капка кръв|кървене|медицина|менструация|нараняване
+💊|болен|витамин|лекарства|лекарство|медицина|хапче
+🩹|лейкопласт|лепенка за рани|пластир
+🩼|бастун|болка|патерица|помощно средство за придвижване|увреждане
+🩺|лекар|медицина|стетоскоп|сърце
+🩻|кости|лекар|медицински|рентген|скелет
+🚪|врата|външна врата|задна врата|килер
+🛗|асансьор|достъпност|издигане|лифт
+🪞|грим|огледало|отражател|отражение|спекулум
+🪟|изглед|отваряне|прозорец|прозрачно|рамка|свеж въздух
+🛏️|легло|сън|хотел
+🛋️|диван|канапе и лампа|лампа|хотел
+🪑|седене|стол|сядане
+🚽|тоалетна чиния
+🪠|вакуумна помпа за отпушване|водопроводчик|изсмукване|плунжер|тоалетна
+🚿|вода|душ
+🛁|баня|вана
+🪤|капан за мишки|миши капан|примамка|примка|сирене
+🪒|бръснач|бръснене|острие
+🧴|бутилка с лосион|лосион|слънцезащитен продукт|хидратантен крем|хидратиращ крем|шампоан
+🧷|безопасна игла|закопчавам|игла|пелена
+🧹|баба яга|вещица|мета|метла|чистя
+🧺|беритба|кош за пране|кошница|пазаруване|пикник
+🧻|руло хартия|тоалетна хартия|тоалетно руло
+🪣|ведро|кофа|леген
+🧼|къпане|почистване|сапунерка|сапунисване|чист
+🫧|балончета|под водата|сапун|чист
+🪥|баня|дентален|зъби|миене|хигиена|четка за зъби
+🧽|абсорбира|гъба за баня|къпане|накисване|попиване|пореста|почистване|хигиена
+🧯|гасене на пожар|пожарогасител|пяна против пожар
+🛒|количка за пазаруване|пазаруване
+🚬|пушене|цигара
+⚰️|вампир|ковчег|мъртъв|смърт
+🪦|[rip]|гробище|мъртъв|надгробен паметник|надгробна плоча
+⚱️|останки|погребална урна|погребение|прах|смърт|урна
+🧿|амулет|късмет|мънисто|назар|синьо око|талисман
+🪬|амулет|защита|мария|мириам|ръка|фатима|хамса
+🗿|лице|моаи|пътуване|статуя
+🪧|демонстрация|знак|плакат|протест
+🪪|документ за идентификация|документ за самоличност|лична карта|свидетелство|сигурност
+🏧|atm|банка|банков автомат|банкомат|знак за банкомат|пари в брой
+🚮|боклук|кошче за боклук|символ за място за изхвърляне на боклук
+🚰|вода|питейна|пия
+♿|достъп|инвалидна количка|лица с увреждания|символ за инвалидна количка
+🚹|wc|мъже|мъжка тоалетна|тоалетна
+🚺|[wc]|дамска тоалетна|жени|женска тоалетна|тоалетна
+🚻|wc|обществена тоалетна|тоалетна
+🚼|бебе|повиване|символ на бебе|смяна на пелени
+🚾|wc|вода|клозет|тоалетна
+🛂|контрол|паспортен контрол
+🛃|митница|опаковане
+🛄|багаж|куфар|получаване на багаж|пътешествие|пътуване|самолет
+🛅|багаж|забравен багаж|клетка|куфар|съхранение на багаж|шкафче
+⚠️|внимание|предупредителен знак|предупреждение
+🚸|движение|дете|деца|пешеходец|пешеходна пътека|пресичащи
+⛔|влизането забранено|вход|движение|забрана|забранено|не|трафик
+🚫|влизане|вход|забрана|забранено|не|пушене
+🚳|велосипед|забрана|забранено за велосипедисти|колело|не
+🚭|забрана|забранено|не|пушенето забранено
+🚯|боклук|забрана|забранено е изхвърлянето на боклуци|забранено изхвърляне на боклук|не
+🚱|вода|забранено|негодна за пиене вода|непитейна|неподходяща за пиене вода
+🚷|забрана|забранено за пешеходци|не|пешеходец|пешеходци
+📵|забранени мобилни телефони|забранено за мобилни телефони|клетъчен|мобилен|телефон
+🔞|18-годишни|възрастово ограничение|забрана|забранено за лица под осемнадесет години|непълнолетни
+⬆️|посока|север|стрелка нагоре
+➡️|изток|посока|стрелка надясно
+⬇️|надолу|посока|стрелка|юг
+⬅️|запад|посока|стрелка наляво
+↩️|извита наляво дясна стрелка|извита стрелка наляво|стрелка
+↪️|извита надясно лява стрелка|извита стрелка надясно|стрелка
+🔃|вертикални стрелки по часовниковата стрелка|по часовниковата стрелка|презареждане|стрелка
+🔄|бутон със стрелки обратно на часовниковата стрелка|бутон със стрелки срещу часовниковата стрелка|обратно на часовниковата стрелка|отново|превъртане|срещу часовниковата стрелка|стрелка
+🔙|back|стрелка с back
+🔚|end|стрелка с end
+🔛|on|стрелка с on!
+🔜|soon|връщам се скоро|скоро|стрелка със soon|стрелка със скоро
+🔝|top|нагоре|стрелка с top
+🛐|молитва|място за религиозно преклонение|преклонение|религия
+⚛️|атеист|атом|символ на атом
+🕉️|индуизъм|ом|религия|хиндуизъм
+☯️|даоизъм|ин и ян|религия|тао|ян
+✝️|кръст|латински кръст|религия|християнство|христос
+☪️|ислям|мюсюлманин|полумесец със звезда|рамадан|религия
+☮️|мир|символ за мир|символ на мира
+🕎|евреин|менора|религия|свещник|ханука
+🔯|звезда|съдба|шестолъчка|шестолъчна звезда с точка|юдаизъм
+🪯|вяра|кханда|религия|сикхизъм
+♊|близнаци|зодиакален знак близнаци|зодия|хороскоп
+♋|зодиакален знак рак|зодия|рак|хороскоп
+♌|зодиакален знак лъв|зодия|лъв
+♍|дева|зодиакален знак дева|зодия|хороскоп
+♎|везни|зодиакален знак везни|зодия|хороскоп
+♏|зодиакален знак скорпион|зодия|скорпион|хороскоп
+⛎|змиеносец|зодиакален знак змиеносец|зодия
+🔀|бутон за разбъркване|бутон за случаен запис|кръстосана|разбъркване|стрелка
+🔁|бутон за повтаряне|по часовниковата стрелка|повтаряне|стрелка
+🔂|бутон за единично повтаряне|единично|по часовниковата стрелка|стрелка
+▶️|бутон за пускане|възпроизвеждане|надясно|пускане|стрелка|триъгълник
+⏩|бутон за превъртане напред|бързо превъртане|напред|превъртане напред|стрелка
+⏭️|бутон за следващия запис|следващата сцена|следващият запис|стрелка
+⏯️|бутон за пускане или пауза|възпроизвеждане|надясно|пауза|пускане|стрелка|триъгълник
+◀️|бутон за връщане|връщане|назад|стрелка|триъгълник
+⏪|бутон за превъртане назад|превъртане назад|стрелка
+⏮️|бутон за предишния запис|предишна песен|предишната сцена|предишният запис|стрелка
+🔼|бутон за нагоре|стрелка
+⏫|бутон за бързо изкачване|двойна|стрелка
+🔽|бутон за надолу|надолу|стрелка
+⏬|бутон за бързо слизане|двойна|надолу|стрелка
+⏸️|бутон за пауза|вертикална|двойна|пауза|черта
+⏹️|бутон за стоп|квадрат|стоп
+⏺️|бутон за запис|запис|кръг
+⏏️|бутон за изваждане|изваждане
+🎦|камера|кино|филм
+🔅|бутон за ниска яркост|ниска|слънце|яркост
+🔆|бутон за висока яркост|висока|светло|яркост
+📶|комуникация|мобилен|сигнал|сила на сигнал|стълбчета за сила на сигнал|телефон|чертички за силата на сигнала
+🛜|[wi-fi]|[wifi]|безжичен|връзка|интернет|компютър|мрежа|смартфон|хотспот
+📳|вибрация|клетъчен|комуникация|мобилен|режим на вибрация|телефон
+📴|изключен|клетъчен|мобилен|телефон
+⚧️|символ за трансджендър|трансджендър
+🟰|математика|отговор|равенство|равно на|удебелен знак за равенство
+♾️|безкрайност|вечност|завинаги|неограничено
+‼️|!!|два удивителни знака|двоен удивителен знак|двойна|пунктуация|удивителна
+💱|банка|валута|обмен на валута|пари
+💲|валута|долар|милиард|милион|пари|плащане|таксуване|удебелен знак за долар
+♻️|рециклиране|символ за рециклиране
+⚜️|рицари|хералдическа лилия
+🔱|емблема|инструмент|кораб|котва|посейдон|тризъбец
+📛|бадж|име|табелка
+🔰|инструмент|листо|начинаещ|японски символ за начинаещ
+⭕|кръг|окръжност|удебелена голяма окръжност|удебелена червена окръжност|червен
+❌|×|x|кръстче|отказ|умножение
+❎|×|x|бутон с кръстче|квадрат|умножение
+➰|клуп|примка
+➿|двойна|примка
+〽️|знак за смяна на ролята|роля
+🫟|боя|опръсквам|петно|разливам|холи
+🔠|abcd|букви|въвеждане на главни букви на латиница|главни|латиница
+🔡|[abcd]|букви|въвеждане на малки букви на латиница|латиница
+🔢|1234|въвеждане на цифри|цифри
+🔣|〒♪&%|въвеждане на символи
+🔤|[abc]|букви|въвеждане на букви на латиница|латиница
+🅰️|[а]|а|бутон с a|бутон с а (кръвна група)|кръвна група
+🆎|[ab]|ab|бутон с ab (кръвна група)|кръвна група
+🅱️|[b]|b|бутон с b (кръвна група)|кръвна група
+🆑|cl в квадрат|бутон
+🆒|cool в квадрат|бутон
+🆓|free в квадрат|бутон
+🆔|id в квадрат|бутон id|самоличност i id
+Ⓜ️|[m]|буква m в кръг|кръг
+🆕|new в квадрат|бутон|ново
+🆖|ng в квадрат|бутон ng|бутон с ng
+🅾️|0|бутон с o|бутон с 0 (кръвна група)|кръвна група|о
+🆗|ok в квадрат|окей в квадрат|бутон
+🅿️|p|бутон с p|паркинг
+🆘|sos в квадрат|бутон|помощ
+🆙|up!|бутон с up!|отличителен знак
+🆚|vs в квадрат|бутон vs i vs
+🈁|коко от катакана в квадрат|бутон тук на японски|катакана|тук|японски
+🈂️|са от катакана в квадрат|бутон за такса за обслужване на японски|такса за обслужване|японски
+🈷️|идеограма луна в квадрат|идеограма месечна сума в квадрат|месечна сума|японски
+🈶|идеограма не е безплатно в квадрат|идеограма съществувам в квадрат|не е безплатно|японски
+🈯|идеограма пръст в квадрат|идеограма резервирано в квадрат|резервирано|японска|японски
+🉐|идеограма "сделка" в кръг|идеограма за предимство в кръг|сделка|японски
+🈹|идеограма отстъпка в квадрат|идеограма разделяне в квадрат|отстъпка|японски
+🈚|безплатно|идеограма безплатно в квадрат|идеограма отрицание в квадрат|японски
+🈲|идеограма забранявам в квадрат|японски
+🉑|идеограма "приемливо" в кръг|идеограма за приемане в кръг|китайски|приемливо|японски
+🈸|идеограма прилагам в квадрат|идеограма приложение в квадрат|приложение|японски
+🈴|идеограма заедно в квадрат|идеограма преминаваща оценка в квадрат|преминаваща оценка|японски
+🈳|бутон празно на японски|идеограма празно в квадрат|празно|японски
+🈺|идеограма отворено в квадрат|отворено|японски
+🈵|идеограма пълнота в квадрат|японски
+🔴|геометричен|кръг|червен
+🟠|кръг|оранжев кръг|оранжево
+🟡|жълт кръг|жълто|кръг
+🟢|зелен кръг|зелено|кръг
+🔵|геометричен|кръг|син
+🟣|кръг|лилаво
+🟤|кафяв кръг|кафяво|кръг
+⚫|геометричен|кръг|черен кръг
+⚪|бял кръг|геометричен|кръг
+🟥|квадрат|червен квадрат|червено
+🟧|квадрат|оранжев квадрат|оранжево
+🟨|жълт квадрат|жълто|квадрат
+🟩|зелен квадрат|зелено|квадрат
+🟦|квадрат|син квадрат|синьо
+🟪|квадрат|лилав квадрат|лилаво
+🟫|кафяв квадрат|кафяво|квадрат
+⬛|геометричен|квадрат|черен голям квадрат
+⬜|бял голям квадрат|геометричен|квадрат
+◼️|геометричен|квадрат|черен среден квадрат
+◻️|бял среден квадрат|геометричен|квадрат
+◾|геометричен|квадрат|черен средномалък квадрат
+◽|бял средномалък квадрат|геометричен|квадрат
+▪️|геометричен|квадрат|малък черен квадрат
+▫️|геометричен|квадрат|малък бял квадрат
+🔶|геометричен|голям оранжев ромб|оранжев|ромб
+🔷|геометричен|голям син ромб|ромб|син
+🔸|геометричен|малък оранжев ромб|оранжев|ромб
+🔹|геометричен|малък син ромб|ромб|син
+🔺|геометричен|сочещ нагоре червен триъгълник|червен
+🔻|геометричен|надолу|сочещ надолу червен триъгълник|червен
+💠|геометричен|комикс|ромб с точка в средата
+🔘|бутон за избор|геометричен|избор
+🔳|бутон|геометричен|квадратен бутон с бял контур|контур
+🔲|бутон|геометричен|квадратен бутон с черен контур
+🏁|знаме|кариран|наскар|победа|спорт|състезание|финал|флаг
+🚩|голф|знаме|триъгълно знаме|флагщок
+🎌|кръстосани знамена|празнуване|японски
+🏴|веещо се черно знаме|развяващ се|черен флаг|черно знаме
+🏳️|бял флаг|бяло знаме|веещо се бяло знаме|развяващ се|развяващо се
+🏳️‍🌈|бисексуален|гей|гордост|дъга|знаме|лгбти|лгбтк|лесбийка|прайд|транссексуален|флагът на дъгата
+🏳️‍⚧️|бяло|знаме в синьо, розово и бяло|розово и бяло|светлосиньо|транссексуален
+🏴‍☠️|веселия роджър|грабежи|пиратски флаг|съкровище
+🇦🇩|андора
+🇦🇪|обединени арабски емирства
+🇦🇫|афганистан
+🇦🇬|антигуа и барбуда
+🇦🇮|ангуила
+🇦🇱|албания
+🇦🇲|армения
+🇦🇴|ангола
+🇦🇶|антарктика
+🇦🇷|аржентина
+🇦🇸|американска самоа
+🇦🇹|австрия
+🇦🇺|австралия
+🇦🇼|аруба
+🇦🇽|оландски острови
+🇦🇿|азербайджан
+🇧🇦|босна и херцеговина
+🇧🇧|барбадос
+🇧🇩|бангладеш
+🇧🇪|белгия
+🇧🇫|буркина фасо
+🇧🇬|българия
+🇧🇭|бахрейн
+🇧🇮|бурунди
+🇧🇯|бенин
+🇧🇱|сен бартелеми
+🇧🇲|бермудски острови
+🇧🇳|бруней даруссалам
+🇧🇴|боливия
+🇧🇶|карибска нидерландия
+🇧🇷|бразилия
+🇧🇸|бахамски острови
+🇧🇹|бутан
+🇧🇼|ботсвана
+🇧🇾|беларус
+🇧🇿|белиз
+🇨🇦|канада
+🇨🇨|кокосови острови (острови кийлинг)
+🇨🇩|конго (киншаса)
+🇨🇫|централноафриканска република
+🇨🇬|конго (бразавил)
+🇨🇭|швейцария
+🇨🇮|кот д’ивоар
+🇨🇰|острови кук
+🇨🇱|чили
+🇨🇲|камерун
+🇨🇳|китай
+🇨🇴|колумбия
+🇨🇷|коста рика
+🇨🇺|куба
+🇨🇻|кабо верде
+🇨🇼|кюрасао
+🇨🇽|остров рождество
+🇨🇾|кипър
+🇨🇿|чехия
+🇩🇪|германия
+🇩🇯|джибути
+🇩🇰|дания
+🇩🇲|доминика
+🇩🇴|доминиканска република
+🇩🇿|алжир
+🇪🇨|еквадор
+🇪🇪|естония
+🇪🇬|египет
+🇪🇭|западна сахара
+🇪🇷|еритрея
+🇪🇸|испания
+🇪🇹|етиопия
+🇪🇺|европейски съюз
+🇫🇮|финландия
+🇫🇯|фиджи
+🇫🇰|фолкландски острови
+🇫🇲|микронезия
+🇫🇴|фарьорски острови
+🇫🇷|франция
+🇬🇦|габон
+🇬🇧|обединеното кралство
+🇬🇩|гренада
+🇬🇪|грузия
+🇬🇫|френска гвиана
+🇬🇬|гърнзи
+🇬🇭|гана
+🇬🇮|гибралтар
+🇬🇱|гренландия
+🇬🇲|гамбия
+🇬🇳|гвинея
+🇬🇵|гваделупа
+🇬🇶|екваториална гвинея
+🇬🇷|гърция
+🇬🇸|южна джорджия и южни сандвичеви острови
+🇬🇹|гватемала
+🇬🇺|гуам
+🇬🇼|гвинея-бисау
+🇬🇾|гаяна
+🇭🇰|хонконг, сар на китай
+🇭🇳|хондурас
+🇭🇷|хърватия
+🇭🇹|хаити
+🇭🇺|унгария
+🇮🇨|канарски острови
+🇮🇩|индонезия
+🇮🇪|ирландия
+🇮🇱|израел
+🇮🇲|остров ман
+🇮🇳|индия
+🇮🇴|британска територия в индийския океан
+🇮🇶|ирак
+🇮🇷|иран
+🇮🇸|исландия
+🇮🇹|италия
+🇯🇪|джърси
+🇯🇲|ямайка
+🇯🇴|йордания
+🇯🇵|япония
+🇰🇪|кения
+🇰🇬|киргизстан
+🇰🇭|камбоджа
+🇰🇮|кирибати
+🇰🇲|коморски острови
+🇰🇳|сейнт китс и невис
+🇰🇵|северна корея
+🇰🇷|южна корея
+🇰🇼|кувейт
+🇰🇾|кайманови острови
+🇰🇿|казахстан
+🇱🇦|лаос
+🇱🇧|ливан
+🇱🇨|сейнт лусия
+🇱🇮|лихтенщайн
+🇱🇰|шри ланка
+🇱🇷|либерия
+🇱🇸|лесото
+🇱🇹|литва
+🇱🇺|люксембург
+🇱🇻|латвия
+🇱🇾|либия
+🇲🇦|мароко
+🇲🇨|монако
+🇲🇩|молдова
+🇲🇪|черна гора
+🇲🇬|мадагаскар
+🇲🇭|маршалови острови
+🇲🇰|северна македония
+🇲🇱|мали
+🇲🇲|мианмар (бирма)
+🇲🇳|монголия
+🇲🇴|макао, сар на китай
+🇲🇵|северни мариански острови
+🇲🇶|мартиника
+🇲🇷|мавритания
+🇲🇸|монтсерат
+🇲🇹|малта
+🇲🇺|мавриций
+🇲🇻|малдиви
+🇲🇼|малави
+🇲🇽|мексико
+🇲🇾|малайзия
+🇲🇿|мозамбик
+🇳🇦|намибия
+🇳🇨|нова каледония
+🇳🇪|нигер
+🇳🇫|остров норфолк
+🇳🇬|нигерия
+🇳🇮|никарагуа
+🇳🇱|нидерландия
+🇳🇴|норвегия
+🇳🇵|непал
+🇳🇷|науру
+🇳🇺|ниуе
+🇳🇿|нова зеландия
+🇴🇲|оман
+🇵🇦|панама
+🇵🇪|перу
+🇵🇫|френска полинезия
+🇵🇬|папуа-нова гвинея
+🇵🇭|филипини
+🇵🇰|пакистан
+🇵🇱|полша
+🇵🇲|сен пиер и микелон
+🇵🇳|острови питкерн
+🇵🇷|пуерто рико
+🇵🇸|палестински територии
+🇵🇹|португалия
+🇵🇼|палау
+🇵🇾|парагвай
+🇶🇦|катар
+🇷🇪|реюнион
+🇷🇴|румъния
+🇷🇸|сърбия
+🇷🇺|русия
+🇷🇼|руанда
+🇸🇦|саудитска арабия
+🇸🇧|соломонови острови
+🇸🇨|сейшели
+🇸🇩|судан
+🇸🇪|швеция
+🇸🇬|сингапур
+🇸🇭|света елена
+🇸🇮|словения
+🇸🇰|словакия
+🇸🇱|сиера леоне
+🇸🇲|сан марино
+🇸🇳|сенегал
+🇸🇴|сомалия
+🇸🇷|суринам
+🇸🇸|южен судан
+🇸🇹|сао томе и принсипи
+🇸🇻|салвадор
+🇸🇽|синт мартен
+🇸🇾|сирия
+🇸🇿|есватини
+🇹🇨|острови търкс и кайкос
+🇹🇩|чад
+🇹🇫|френски южни територии
+🇹🇬|того
+🇹🇭|тайланд
+🇹🇯|таджикистан
+🇹🇰|токелау
+🇹🇱|тимор лесте
+🇹🇲|туркменистан
+🇹🇳|тунис
+🇹🇴|тонга
+🇹🇷|турция
+🇹🇹|тринидад и тобаго
+🇹🇻|тувалу
+🇹🇼|тайван
+🇹🇿|танзания
+🇺🇦|украйна
+🇺🇬|уганда
+🇺🇸|съединени щати
+🇺🇾|уругвай
+🇺🇿|узбекистан
+🇻🇦|ватикан
+🇻🇨|сейнт винсънт и гренадини
+🇻🇪|венецуела
+🇻🇬|британски вирджински острови
+🇻🇮|американски вирджински острови
+🇻🇳|виетнам
+🇻🇺|вануату
+🇼🇫|уолис и футуна
+🇼🇸|самоа
+🇽🇰|косово
+🇾🇪|йемен
+🇾🇹|майот
+🇿🇦|южна африка
+🇿🇲|замбия
+🇿🇼|зимбабве
+🏴󠁧󠁢󠁥󠁮󠁧󠁿|англия
+🏴󠁧󠁢󠁳󠁣󠁴󠁿|шотландия
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|уелс

+ 26 - 18
app/assets/emojis/search-index/ca.csv

@@ -123,6 +123,7 @@
 😪|cansada|cansat|cara de son|dormint|dormir|plorant|son|trista
 🤤|bava|bavejant|cara que baveja
 😴|badallar|becaina|bona nit|cansada|cansat|cara de dormir|cara de son|dormint|dormir|el que sigui|hora de dormir|llit|son|zzz
+🫩|cansament|cara que fa ulleres|esgotament|son
 😷|cara amb màscara|cara amb mascareta|dentista|dermatòleg|dermatòloga|doctora|dr.|dra.|gèrmens|malalta|malaltia|màscara|mascareta|medecina|refredat
 🤒|cara amb termòmetre|malalta|malaltia|termòmetre
 🤕|ai|bena|cap embenat|cara amb el cap embenat|ferida|ferit|lesió
@@ -242,7 +243,7 @@
 🫷|aturar|bloquejar|empènyer|esperar|esquerra|mà que empeny cap a l’esquerra|prou|rebutjar|xocar
 🫸|aturar|bloquejar|dreta|empènyer|esperar|mà que empeny cap a la dreta|prou|rebutjar
 👌|acceptació|d’acord|entesos|genial|impressionant|mà d’acceptació|ok|perfecte|senyal d’aprovació amb la mà
-🤌|dits junts|gest de la mà|interrogació|paciència|què dius|relaxació|sarcàstic
+🤌|dits junts|gest de la mà|interrogació|italià|paciència|què dius|relaxació|sarcàstic
 🤏|dits|mà que pessiga|petit|quantitat petita|una mica
 ✌️|mà|pau|senyal de la victòria|victòria
 🤞|creuar|creuats|dits|mà|sort
@@ -281,7 +282,7 @@
 👂|cos|escoltar|oïda|orella|orelles|sentir|so
 🦻|accessibilitat|orella amb audiòfon|problema d’audició
 👃|cos|nassos|olors|pudor|tafanera
-🧠|cervell|intel·ligent
+🧠|cervell|coneixement|intel·ligent|llest|saviesa
 🫀|anatomia|batec|cardiologia|cor real|òrgan|pols|vermell
 🫁|exhalació|inhalació|òrgan|pulmó|pulmons|respiració|respirar
 🦷|blanc|dentista|dents|perlí|perlina
@@ -509,9 +510,9 @@
 ⛹️|bàsquet|basquetbol|esportista|home amb una pilota|home fent botar una pilota|jugador de bàsquet|jugador de basquetbol|persona amb una pilota|persona fent botar una pilota|pilota|tir lliure
 ⛹️‍♂️|home amb una pilota|masculí|pilota
 ⛹️‍♀️|dona amb una pilota|femení|pilota
-🏋️|aixecador|culturista|entrenament|esport|exercici|halterofília|home que aixeca peses|persona que aixeca peses|persona que practica halterofília|pesa
-🏋️‍♂️|aixecador|home que aixeca peses|masculí|peses
-🏋️‍♀️|aixecadora|dona que aixeca peses|femení|peses
+🏋️|aixecador|culturista|entrenament|esport|exercici|halterofília|home que aixeca pesos|persona que aixeca pesos|persona que practica halterofília|pes
+🏋️‍♂️|aixecador|home que aixeca pesos|masculí|pesos
+🏋️‍♀️|aixecadora|dona que aixeca pesos|femení|pesos
 🚴|bicicleta|ciclisme|ciclista|esport|persona amb bicicleta|persona en bicicleta|persona pedalejant
 🚴‍♂️|bicicleta|ciclisme|ciclista|home|masculí
 🚴‍♀️|anar amb bicicleta|bicicleta|ciclisme|ciclista|dona amb bicicleta|femení
@@ -554,6 +555,7 @@
 🧑‍🧒|adult|família|infant
 🧑‍🧒‍🧒|adult|família|infant
 👣|caminar|cos|descalça|empremta|petjades|roba|vestit
+🫆|empremta dactilar|empremta digital|forense|identitat|seguretat
 🐵|animal|cara de mona|curiosa|mona
 🐒|animal|mico|mona
 🦍|animal|goril·la|simi
@@ -592,7 +594,7 @@
 🐏|animals|àries|banyes|mardà|marrà|ovella|zodíac|zoo
 🐑|animal|bel|femella|granja|llana|ovella|pècora|xai
 🐐|animals|cabra|capricorn|granja|llet|zodíac
-🐪|animal|camell|desert|dromedari|gepa|una gepa
+🐪|animal|desert|dromedari|gepa|una gepa
 🐫|animal|camell amb dues gepes|camell bactrià|dues gepes|gepa|gepes
 🦙|alpaca|animal|guanac|llama|llana|vicunya
 🦒|girafa|taques
@@ -660,9 +662,14 @@
 🐡|animal|globus|peix
 🦈|animal|peix|tauró
 🐙|animal|criatura|mar|oceà|pop
-🐚|animal|cargol de mar|closca|conquilla|espiral|mar|platja
+🐚|animal|caragol de mar|cargol de mar|closca|conquilla|espiral|mar|platja
 🪸|canvi climàtic|corall|escullera|mar|oceà
 🪼|animal|aquari|coïssor|cremada|dolor|invertebrat|marí|medusa|oceà|picada|plàncton|tentacles
+🦀|càncer|cranc|horòscop|zodíac
+🦞|animal|bisque|llagosta vermella|marisc|pinces|sopa de marisc
+🦐|crustaci|gamba|llagostí|marisc|menjar
+🦑|animal|calamar|menjar|molusc
+🦪|busseig|ostra|perla
 🐌|animal|caragol|cargol|jardí|llimac|natura
 🦋|animal|bonica|insecte|papallona
 🐛|animal|bestiola|eruga|insecte|jardí
@@ -706,9 +713,10 @@
 🪹|branca|covar|llar|niu buit
 🪺|covar|niu amb ous|ocell|ous
 🍄|bolet verinós|fong|mario|planta
+🪾|caiguda de la fulla|fulla caduca|hivern|sequera
 🍇|dionís|dionisi|fruita|planta|raïm
 🍈|cantalup|fruita|meló|planta
-🍉|fruita|meló d’aigua|meló de moro|planta|síndria
+🍉|fruita|meló d’aigua|meló d’alger|meló de moro|planta|síndria
 🍊|cítric|fruita|mandarina|nectarina|planta|taronja|vitamina c
 🍋|àcida|cítric|fruita|llimona|planta
 🍋‍🟩|àcid|aliment|cítric|fruita|llima|menjar|planta|refrescant|tropical|verd
@@ -744,6 +752,7 @@
 🫚|arrel de gingebre|beguda|espècia|gingebre|gínger|herba|natural|salut
 🫛|beina de pèsol|edamame|fesol|llegum|mongeta|pèsol|soja|verdura
 🍄‍🟫|aliment|bolet marró|fong|menjar|natura|vegetal|vegetarià|xampinyó
+🫜|arrel|hort|rave|remolatxa|verdura
 🍞|blat|gra|llesca|menjar|pa|restaurant|torrada
 🥐|brioixeria|croissant|francès|menjar|pa
 🥖|baguet|barra|menjar|pa
@@ -795,11 +804,6 @@
 🥟|cresta japonesa|cresta xinesa|empanada|gyōza|jiaozi|pierogui
 🥠|fortuna|futur|galeta de la sort|profecia|sort
 🥡|bastonets|emportar|envàs|menjar a domicili|menjar per emportar|menjar xinès|paper
-🦀|càncer|cranc|horòscop|zodíac
-🦞|animal|bisque|llagosta vermella|marisc|pinces|sopa de marisc
-🦐|crustaci|gamba|llagostí|marisc|menjar
-🦑|animal|calamar|menjar|molusc
-🦪|busseig|ostra|perla
 🍦|dolç|gelat de màquina|màquina|menjar|postres|restaurant
 🍧|dolç|gelat|granissat|picat|postres
 🍨|crema|dolç|gelat|menjar|postres|restaurant
@@ -945,7 +949,7 @@
 🛹|monopatí|patí|patinadora|rodes
 🛼|esport|patí de rodes|rodes
 🚏|autobús|bus|parada d’autobús|parada de bus
-🛣️|autopista|autovia|carretera
+🛣️|autopista|autovia|carretera|via ràpida
 🛤️|ferrocarril|tren|via de tren
 🛢️|barril de petroli|bidó de petroli|petroli
 ⛽|assortidor de gasolina|benzina|benzinera|combustible|gasolina
@@ -1068,7 +1072,7 @@
 🎗️|celebració|cinta|commemorar|llaç commemoratiu
 🎟️|accés|admissió|bitllet d’entrada|bitllets d’entrada|entrada
 🎫|admissió|entrada|resguard|tiquet
-🎖️|celebració|medalla|militar|premi
+🎖️|celebració|condecoració|condecorar|medalla|militar|premi
 🏆|campió|campiona|esport|guanyar|premi|trofeu|victòria
 🏅|esport|guanyadora|medalla|or|premi
 🥇|medalla d’or|or|posició|primer
@@ -1097,7 +1101,7 @@
 ⛸️|gel|patí|patinar sobre gel|patinatge sobre gel|patins
 🎣|canya de pescar|entreteniment|esport|peix|pescar
 🤿|busseig|immersió lleugera|submarinisme amb tub|ulleres de busseig
-🎽|atletisme|banda|córrer|samarreta per córrer
+🎽|atletisme|banda|córrer|samarreta de tirants|samarreta per córrer
 🎿|esport|esquiar|esquís|neu
 🛷|lliscar|neu|trineu
 🥌|esport|gel|joc|pedra de cúrling
@@ -1204,6 +1208,7 @@
 🪘|conga|instrument|percussió|ritme|timbal
 🪇|ball|diversió|festa|instrument|maraques|música|percussió|ritme|sacsejar|sonall
 🪈|flauta dolça|flautista|instrument de vent de fusta|música|orquestra|vent
+🪉|amor|arpa|cupido|instrument|música|orquestra
 📱|comunicació|mòbil|telèfon
 📲|comunicació|fletxa|mòbil|rebre|telèfon mòbil amb fletxa|trucar
 ☎️|telèfon
@@ -1296,7 +1301,7 @@
 📈|a l’alça|amunt i cap a la dreta|augment|cap amunt|creixement|dades|gràfic d’augment|tendència
 📉|a la baixa|cap avall|dades|descendent|disminució|gràfic de disminució|negatiu|tendència
 📊|barres|dades|gràfic de barres
-📋|clip|llista de tasques pendents|notes|petjapapers|porta-retalls
+📋|clip|llista de tasques pendents|notes|petjapapers|porta-retalls|portanotes
 📌|agulla|collage|xinxeta
 📍|mapa|rodona|ubicació|xinxeta
 📎|clip
@@ -1334,6 +1339,7 @@
 🧰|caixa d’eines|caixa vermella|eines|mecànic
 🧲|atracció|ferradura|forma d’u|imant|magnètic|positiu negatiu
 🪜|escala de mà|esglaó|graó|pujar
+🪏|cavar|forat|pala
 🧪|ciència|experiment|laboratori|química|tub d’assaig
 🧫|bacteri|biòleg|biòloga|biologia|cultiu|laboratori|placa de cultiu|placa de petri
 🧬|adn|biòleg|biòloga|evolució|genètica|vida
@@ -1477,6 +1483,7 @@
 ➰|bucle|llaç arrissat
 ➿|bucle|doble|enrotllat|llaç
 〽️|alternança|marca d’alternança de la part|part|signe d’alternança
+🫟|esquitx|holi|pintura|taca|vessament
 🔠|abcd|botó de lletres llatines en majúscules|llatines|lletres|majúscules
 🔡|abcd|botó de lletres llatines en minúscules|entrada|llatines|lletres|minúscules
 🔢|1234|botó de números|dígits|entrada|números per introduir|xifres
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbàbue
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|anglaterra
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|escòcia
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|gal·les
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|gal·les
+🇨🇶|sark

+ 12 - 5
app/assets/emojis/search-index/cs.csv

@@ -123,6 +123,7 @@
 😪|brečet|nachlazený|obličej|ospalý obličej|ospalý výraz|plakat|rozespalý|smajlík|smutný|spánek|tvář|unavený|uplakaný|výraz
 🤤|bryndat|chutné|cintat|hlad|obličej|slina|slinit|slintající obličej|slintající tvář|slintání|slintat blahem|sliny|smajlík|tvář|vynikající|výraz
 😴|chrnět|chrr|dobrou|noc|obličej|ospalý|pochrupovat|postel|šlofík|spánek|spát|spící|tvář|unavený|usínat|utahaný|výraz|zdřímnout|zívat|zzz
+🫩|kruhy|obličej|oči|ospalost|pozdě|únava|váčky|vyčerpanost|znuděnost
 😷|bacily|bakterie|dermatolog|doktor|lékař|maska|nachlazený|nemocný|obličej s lékařskou rouškou|prevence|rouška|rýma|smajlík|tvář s doktorskou rouškou|výraz|zubař
 🤒|angína|chřipka|horečka|nemocný|obličej s teploměrem|smajlík|teploměr|teplota|tvář s teploměrem v puse|výraz
 🤕|au|bolest|bolí|boule|obličej s ovázanou hlavou|obvaz|ofačovaná hlava|smajlík|tvář|výraz|zafačovaný|zranění|zraněný
@@ -554,6 +555,7 @@
 🧑‍🧒|dítě|rodina: dospělý, dítě
 🧑‍🧒‍🧒|dítě|rodina: dospělý, dítě, dítě
 👣|bosky|bosý|chodidlo|chůze|jít|naboso|neobutý|oblečení|otisk|procházka|šlápota|šlépěj|stopa|stopy|tělo
+🫆|bezpečnost|detektiv|identita|kriminalistika|otisky prstů|stopa|záhada|zločin
 🐵|banán|hlava opice|obličej|opice|opička|smajlík|tvář|výraz|zoo|zvědavá opice|zvědavý george|zvíře
 🐒|banán|džungle|opice|opička|zvíře
 🦍|gorila|hlava|opice|prales|primát|příroda|zvíře
@@ -663,6 +665,11 @@
 🐚|lastura|měkkýš|moře|mušle|mušlička|pláž|škeble|spirála|ulita|zvíře
 🪸|klimatické změny|korálový útes|moře|oceán|ohrožený druh|útes
 🪼|bezobratlí|chapadla|medúza|moře|mořská|popálení|požahání|žahavci|žahnutí|zvíře
+🦀|horoskop|krab|rak|znamení raka|zvěrokruh|zvíře
+🦞|humr|humří polévka|klepeta|korýš|langusta|plody moře|rak|zvíře
+🦐|garnát|jídlo|korýš|kreveta|malý|moře|mořský|oceán|plody moře|zvíře
+🦑|chobotnice|hlavonožec|jídlo|kalamár|kalmar|krakatice|měkkýš|mořské plody|oliheň|plody moře|sépie|zvíře
+🦪|jídlo|perla|perleť|potápění|ústřice
 🐌|hlemýžď|příroda|slimák|šneček|šnek|ulita|zahrada|zvíře
 🦋|hmyz|krásný|modrásek|modrý motýl|motýl|zvíře
 🐛|brouk|hmyz|housenka|příroda|stonožka|zahrada|zvíře
@@ -706,6 +713,7 @@
 🪹|hnízdečko|hnízdění|hnízdit|prázdné hnízdo|ptačí hnízdo|větvičky
 🪺|hnízdění|hnízdo s vejci|ptáček|ptačí hnízdo|pták|snášet vejce|vajíčka|vejce|větvičky
 🍄|houba|hřib|hříbek|jedovatá|jedovatý|muchomůrka
+🪾|bez listí|dřevo|holé|kmen|mrtvé|neplodný|strom|sucho|větve|zima
 🍇|červené hrozny|dionýsos|hrozen|hroznové víno|hrozny|jídlo|ovoce|rostlina|víno
 🍈|ananasový meloun|cukrový meloun|jídlo|meloun|ovoce|rostlina|žlutý meloun
 🍉|červený|jídlo|meloun|ovoce|rostlina|vodní
@@ -744,6 +752,7 @@
 🫚|čaj|koření|pivo|zázvor
 🫛|edamame|hrách|hrachový lusk|hrášek|kulička|lusk|luštěniny|sója|zelenina
 🍄‍🟫|hnědá houba|houbařit|houbová|hříbek|jídlo|les|portobello|příroda|sbírat houby|shiitake|zelenina
+🫜|jídlo|kořen|ředkvička|řepa|salát|tuřín|vegetariánské|zahrada|zelenina
 🍞|bochník|chléb|chleba|jídlo|karbohydráty|moučný|obilí|obilniny|obiloviny|pecen|pšenice|restaurace|sacharidy|toastový chleba
 🥐|croissant|francouzské|francouzský|jídlo|kroasant|loupáček|loupák|pečivo|rohlík
 🥖|bageta|francouzské|jídlo|pečivo|veka
@@ -795,11 +804,6 @@
 🥟|čínský knedlíček|dim sum|džiaozi|empanada|gjózu|gyoza|jiaozi|jídlo|knedlíček|knedlík|pelmeň|pelmeně|pirohy|pirožky|plněný knedlík|taštička|tortellini|wonton
 🥠|budoucnost|čínský koláček štěstí|jídlo|koláček štěstí|předpověď|proroctví|sušenka štěstí|věštba|věštění budoucnosti
 🥡|dovážka jídla|jídelní hůlky|jídlo do domu|krabice na jídlo|krabice s jídlem|krabička na jídlo|papírová krabička|rozvoz jídla|rýže
-🦀|horoskop|krab|rak|znamení raka|zvěrokruh|zvíře
-🦞|humr|humří polévka|klepeta|korýš|langusta|plody moře|rak|zvíře
-🦐|garnát|jídlo|korýš|kreveta|malý|moře|mořský|oceán|plody moře|zvíře
-🦑|chobotnice|hlavonožec|jídlo|kalamár|kalmar|krakatice|měkkýš|mořské plody|oliheň|plody moře|sépie|zvíře
-🦪|jídlo|perla|perleť|potápění|ústřice
 🍦|cukrovinka|dezert|jemný|jídlo|kornoutek|krémová zmrzlina|sladkost|sladký|točená zmrzlina|zákusek|zmrzlina v kornoutku
 🍧|cukrovinka|dezert|dřeň|jídlo|ledová tříšť|osvěžující|restaurace|sladkost|sladký|tříšť|zákusek|zmrzlina|zmrzlinový pohár
 🍨|cukrovinka|dezert|jídlo|kopeček zmrzliny|kopečková zmrzlina|pohár|restaurace|sladkost|sladký|zákusek|zmrzlina|zmrzlinový
@@ -1204,6 +1208,7 @@
 🪘|buben|bubínek|bubnování|conga|congo|hudba|hudební|konga|kongo|nástroj|perkuse|protáhlý buben|rytmus
 🪇|chrastítko|hudba|maracas|nástroj|perkuse|rumbakoule
 🪈|dechový nástroj|flétna|hudba|pikola|píšťala|zobcová flétna
+🪉|amor|harfa|hudba|láska|nástroj|orchestr
 📱|komunikace|mobilní|smartphone|telefon
 📲|hovor|komunikace|mobil se šipkou|mobilní|příjem|přijmout|šipka|telefon|volání
 ☎️|červená|číselník|sluchátko|telefonovat|volat
@@ -1334,6 +1339,7 @@
 🧰|bedna na nářadí|bedýnka|box na nářadí|francouzský klíč|hasák|kleště|krabice|mechanik|nářadí|nástroje|opravář|opravit|souprava nářadí|štípačky
 🧲|kladný|magnetické pole|magnetický|odpuzovat|podkova|přitahovat|přitažlivost|ve tvaru písmene u|záporný
 🪜|lezení|nářadí|příčka|schod|schůdky|šplhat|šprušel|žebřík
+🪏|jáma|kopat|lopata|rostlina|rýč|sníh|zahrabat|zahrada
 🧪|chemička|chemie|chemik|experiment|kapalina|kyselina|laboratoř|pokus|věda|žíravina|zkumavka
 🧫|bakterie|biologie|bioložka|buněčná kultura|chemie|experiment|kapátko|kultivovat|laboratoř|petriho miska|pokusy|věda
 🧬|biologie člověka|bioložka|deoxyribonukleová kyselina|dna|evoluce|genetická informace|genetika|šroubovice|život
@@ -1477,6 +1483,7 @@
 ➰|kadeř|kudrna|lokna|smyčka|spirálka|zatočený
 ➿|dvojitá|dvojitý|kadeř|kudrlinka|kudrna|smyčka|spirálka
 〽️|část|part|symbol|začátek|značka přechodu mezi částmi skladby|značka pro začátek zpěvu v karaoke|znak|zpěvák
+🫟|barva|inkoust|kapka|nepořádek|rozlití|skvrna|tekutina
 🔠|abcd|abeceda|kapitálky|klávesnice|latinka|písmena|psaní|velká písmena|velká tiskací písmena|vstup|zadávání v latince, velká písmena
 🔡|abcd|abeceda|klávesnice|latinka|malá písmena|písmena|psaní|vstup|zadávání v latince, malá písmena
 🔢|1234|čísla|číslo|numerická klávesnice|zadávání čísel

+ 25 - 18
app/assets/emojis/search-index/de.csv

@@ -123,6 +123,7 @@
 😪|gesicht|gute|müde|nacht|schläfrig|smiley|traurig
 🤤|gesicht|sabbern|smiley
 😴|dösen|einschlafen|gähnen|gesicht|gute nacht|langweilig|mittagsschlaf|müde|nickerchen|schlafen|smiley|zzz
+🫩|augenringe|erschöpft|gesicht|müde|schläfrig|smiley|übermüdet
 😷|arzt|atemschutzmaske|bazillen|erkältet|gesicht|krankheit|mundschutz|schutzmaske|smiley|viren|virus
 🤒|fieber|gesicht|krank|messen|smiley|thermometer
 🤕|aua|autsch|gesicht|kopf|schmerzen|smiley|verband|verletzung
@@ -417,8 +418,8 @@
 🫄|aufgebläht|bauch|dicker bauch|person|schwangere person|schwangerschaft|überfressen|zu viel gegessen
 🤱|baby|brust|frau|person|stillen
 👩‍🍼|baby|eltern|flasche gebende frau|frau|füttern|mama|milch|mutter|neugeborenes|person|säugling|weiblich
-👨‍🍼|baby|der baby die flasche gibt|eltern|flasche gebender mann|füttern|kind|mann, der baby die flasche gibt|männlich|milch|neugeborenes|papa|person|säugling|vater
-🧑‍🍼|baby|die baby die flasche gibt|flasche gebende person|frau|füttern|mama|mann|neugeborenes|papa|person, die baby die flasche gibt|säugling|vater
+👨‍🍼|baby|flasche gebender mann|füttern|mann|männlich
+🧑‍🍼|baby|flasche gebende person|person
 👼|engel|gesicht|kind|märchen|putte
 🎅|weihnachten|weihnachtsmann|samichlaus
 🤶|weihnachten|weihnachtsfrau
@@ -453,7 +454,7 @@
 🧌|fantasy|gruslig|kobold|märchen|monster|ork|troll|ungeheuer
 💆|behandlung|die eine kopfmassage bekommt|entspannen|kopfmassage|kopfschmerzen|massage|migräne|person, die eine kopfmassage bekommt|salon|spa|therapie
 💆‍♂️|der eine kopfmassage bekommt|entspannen|kopfmassage|kopfschmerzen|mann, der eine kopfmassage bekommt|massage|salon|männlich
-💆‍♀️|die eine kopfmassage bekommt|frau, die eine kopfmassage bekommt|kopfmassage|weiblich
+💆‍♀️|behandlung|entspannend|frau|gesicht|kopfmassage|kopfschmerzen|kopfweh|lindern|massage|relaxen|salon|spa|therapie|verspannung|weiblich
 💇|friseurin|friseuse|frisörin|frisur|haare|haarschnitt|person beim haareschneiden|schere|coiffeur|friseur(in)|frisör(in)
 💇‍♂️|friseur|frisur|haarschnitt|mann beim haareschneiden|salon|schere|coiffeur|männlich
 💇‍♀️|frau beim haareschneiden|friseur|haarschnitt|schere|coiffeur|weiblich
@@ -478,11 +479,11 @@
 🏃|eilig|joggen|laufende person|läuferin|marathon|person|rennen|schnell|sport
 🏃‍♂️|joggen|jogger|laufender mann|marathon|rennen|männlich
 🏃‍♀️|athletin|frau|joggen|joggerin|laufende frau|läuferin|marathon|rennen|rennerin|rennt|schell|weiblich
-💃|frau|tanzende frau|tänzerin|weiblich
-🕺|mann|tanzender mann|männlich
+💃|elegant|festlich|flair|flamenco|frau|salsa|schwung|tango|tanzen|tänzerin|weiblich
+🕺|elegant|festlich|flair|flamenco|mann|salsa|schwung|tango|tanzen|tänzer|männlich
 🕴️|anzug|geschäftlich|mann|schwebender mann im anzug|männlich
 👯|bunnys|doppelt|hasenohren|leute|party|personen mit hasenohren|seelenverwandt|tanzen|tänzerinnen|zwillinge
-👯‍♂️|bunnys|hasenohren|männer mit hasenohren|party|tanzen|twillinge
+👯‍♂️|bunnys|hasenohren|männer mit hasenohren|party|tanzen|zwillinge
 👯‍♀️|bunnys|frauen mit hasenohren|hasenohren|party|weiblich
 🧖|abschalten|dampfbad|dampfsauna|entspannen|frau|luxuriös|person in dampfsauna|relaxen|sauna|spa
 🧖‍♂️|dampfsauna|mann in dampfsauna|sauna|männlich
@@ -549,11 +550,12 @@
 👥|büsten|personen|silhouette mehrerer büsten
 🫂|abschied|danke|drücken|drücker|freundschaft|hallo|liebe|sich umarmende personen|tschüss|umarmung
 👪|familie|junge|kind|mutter|vater
-🧑‍🧑‍🧒|1 kind|familie: 2 erwachsene, 1 kind
-🧑‍🧑‍🧒‍🧒|2 kinder|familie: 2 erwachsene, 2 kinder
-🧑‍🧒|1 kind|familie: 1 erwachsene(r), 1 kind
-🧑‍🧒‍🧒|2 kinder|familie: 1 erwachsene(r), 2 kinder
+🧑‍🧑‍🧒|erwachsener|familie|kind
+🧑‍🧑‍🧒‍🧒|erwachsener|familie|kind
+🧑‍🧒|erwachsener|familie|kind
+🧑‍🧒‍🧒|erwachsener|familie|kind
 👣|abdruck|auf dem weg|fußabdruck|fußabdrücke|fussabdruck|fussabdrücke
+🫆|fingerabdruck|forensik|identität|sicherheit|abdruck|polizei|täterin
 🐵|affengesicht|banane|dschungel|gesicht|tier|zoo
 🐒|affe|tier
 🦍|affe|gesicht|gorilla|tier
@@ -649,7 +651,7 @@
 🐍|schlangenträger|sternzeichen|tierkreis
 🐲|drachengesicht|gesicht|märchen|tier
 🐉|chinesisch neujahr|drache|märchen|tier
-🦕|brachiosaurus|brontosaurus|dinosaurier|diplodocus|saurier|sauropode|tier
+🦕|brachiosaurus|brontosaurus|dinosaurier|diplodocus|saurier|sauropode
 🦖|dinosaurier|saurier|t-rex|tree|tyrannosaurus rex
 🐳|blasender wal|meer|ozean|tier|wal
 🐋|ozean|tier|wal
@@ -663,6 +665,11 @@
 🐚|muschel|schneckenhaus|strand|tier
 🪸|great barrier reef|klimawandel|korallenriff|meer|ozean|riff|tier
 🪼|autsch|brennen|gallert|glibber|meeresbewohner|meerestier|nesseltier|ozean|qualle|tentakeln
+🦀|krabbe|krebs|meer|sternzeichen|strand|tierkreis
+🦞|hummer|lobster|meeresfrucht|meeresfrüchte|meerestier|scheren|tier
+🦐|garnele|gourmet|krustentier|meeresfrucht|shrimp
+🦑|kalmar|tier|tintenfisch
+🦪|auster|meer|muschel|perle|tauchen|tier
 🐌|langsam|schnecke|tier
 🦋|insekt|schmetterling|schön
 🐛|gefräßig|insekt|raupe|tier|gefrässig
@@ -706,6 +713,7 @@
 🪹|heim|leeres nest|nestbau|nisten|vogelnest|zuhause
 🪺|heim|nest mit blauen eiern|nest mit eiern|nestbau|nisten|vogelnest|zuhause
 🍄|fliegenpilz|giftig|pilz
+🪾|kahler baum|karg|trocken|winter|baum ohne blätter|blätterlos|dürre|herbst
 🍇|frucht|obst|trauben|wein
 🍈|cantaloupe|frucht|honigmelone|melone|obst
 🍉|frucht|melone|obst|wassermelone
@@ -744,6 +752,7 @@
 🫚|gesund|gewürz|ginger ale|ingwerbier|scharf|wurzel|würzig|ginger beer|ingwerwurzel
 🫛|bohne|edamame|erbsenschote|essen|gemüse|hülsenfrucht|hülsenfrüchte|schote
 🍄‍🟫|braun|essen|fungus|gemüse|lebensmittel|natur|pflanze|pilz|wald
+🫜|bete|garten|gemüse|rote bete|rübe|wurzel|beete|randen|radieschen
 🍞|brotlaib|essen|kohlenhydrate|laib brot|toast|weißbrot|weizen|weissbrot
 🥐|corissant|croissant|französisch|frühstückshörnchen|brot
 🥖|baguette|brot|französisch|frühstück
@@ -795,11 +804,6 @@
 🥟|chinesische teigtasche|dumpling|empanada|essen|gyōza|jiaozi|kloß|pierogi|potsticker|teigtasche|kloss
 🥠|essen|glückskeks|prophezeiung
 🥡|chinesisches essen|essen|stäbchen|takeaway-box|takeaway-schachtel
-🦀|krabbe|krebs|meer|sternzeichen|strand|tierkreis
-🦞|hummer|lobster|meeresfrucht|meeresfrüchte|meerestier|scheren|tier
-🦐|garnele|gourmet|krustentier|meeresfrucht|shrimp
-🦑|kalmar|tier|tintenfisch
-🦪|auster|meer|muschel|perle|tauchen|tier
 🍦|eis|softeis
 🍧|eis|sorbet|wassereis|zerstoßen|zerstossen
 🍨|eisbecher|eiscreme|eisdiele
@@ -1204,6 +1208,7 @@
 🪘|afrikanische trommel|conga|handtrommel|instrument|musikinstrument|rhythmus|trommeln
 🪇|cha-cha-cha|instrument|maracas|musikinstrument|musizieren|party|percussion|rasseln|tanzen|schütteln|trommel
 🪈|band|blaskapelle|flöte|holzblasinstrument|instrument|musikinstrument|musizieren|orchester|spielmannszug|blockflöte|pfeife
+🪉|amor|cupido|harfe|instrument|liebe|musik|orchester
 📱|handy|iphone|mobiltelefon|smartphone|telefonieren
 📲|anrufen|handy|iphone|kommunikation|mobiltelefon mit pfeil|pfeil|whatsapp
 ☎️|anrufen|festnetz|telefon
@@ -1334,6 +1339,7 @@
 🧰|box|handkasten|kasten|kiste|mechaniker|rote kiste|werkzeugkasten|werkzeugkiste|werkzeugkoffer
 🧲|anziehungskraft|hufeisen|magnetisch|pole|positiv negativ|u-form
 🪜|hochsteigen|holzleiter|klettern|leiter|sprosse|stufe
+🪏|graben|loch|schippe|spaten|ausgraben|schaufeln|vergraben
 🧪|chemie|chemikalie|chemiker|experiment|labor|reagenzglas|substanz|versuche|wissenschaft
 🧫|bakterienkultur|biologe|biologie|biologin|kultur|labor|petrischale|pipette|probe
 🧬|biologe|biologie|biologin|dna|dns|evolution|genetik|genmanipulation|leben
@@ -1477,6 +1483,7 @@
 ➰|schleife|looping
 ➿|blau|doppelschleife|rechteck|schleife
 〽️|japanisch|teilalternationszeichen|zeichensetzung
+🫟|farbe|fleck|holi|klecks|spritzer|tinte|farbklecks|kleckern|verschütten
 🔠|abcd|buchstaben|großbuchstaben|großschreiben|eingabesymbol lateinische grossbuchstaben|grossbuchstaben|lateinische grossbuchstaben
 🔡|eingabesymbol lateinische kleinbuchstaben|kleinbuchstaben|lateinische kleinbuchstaben
 🔢|1234|eingabesymbol|symbol|zahlen|ziffern
@@ -1513,7 +1520,7 @@
 🈳|chinesisches schriftzeichen|japanisches schriftzeichen|leer|schriftzeichen für leer|schriftzeichen für zimmer frei|zimmer frei
 🈺|betrieb|chinesisches schriftzeichen|geöffnet|japanisches schriftzeichen|schriftzeichen für betrieb|schriftzeichen für geöffnet
 🈵|belegt|besetzt|chinesisches schriftzeichen|fülle|japanisches schriftzeichen|kanji|kein zimmer frei|schriftzeichen für fülle|schriftzeichen für kein zimmer frei
-🔴|ball|großer roter kreis|kreis|punkt|roter punkt|grosser roter kreis
+🔴|ball|punkt|roter punkt|grosser roter kreis|kreis
 🟠|form|kreis|orange scheibe|oranger kreis|oranger punkt|punkt
 🟡|form|gelbe scheibe|gelber kreis|gelber punkt|kreis|punkt|scheibe
 🟢|form|grüne scheibe|grüner kreis|grüner punkt|kreis|punkt
@@ -1804,4 +1811,4 @@
 🇿🇼|simbabwe|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|schottland
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales

+ 2 - 0
app/assets/emojis/search-index/diversities.csv

@@ -267,6 +267,7 @@
 🧗‍♂️|🧗🏻‍♂️|🧗🏼‍♂️|🧗🏽‍♂️|🧗🏾‍♂️|🧗🏿‍♂️
 🧗‍♀️|🧗🏻‍♀️|🧗🏼‍♀️|🧗🏽‍♀️|🧗🏾‍♀️|🧗🏿‍♀️
 🏇|🏇🏻|🏇🏼|🏇🏽|🏇🏾|🏇🏿
+🏂|🏂🏻|🏂🏼|🏂🏽|🏂🏾|🏂🏿
 🏌️|🏌🏻|🏌🏼|🏌🏽|🏌🏾|🏌🏿
 🏌️‍♂️|🏌🏻‍♂️|🏌🏼‍♂️|🏌🏽‍♂️|🏌🏾‍♂️|🏌🏿‍♂️
 🏌️‍♀️|🏌🏻‍♀️|🏌🏼‍♀️|🏌🏽‍♀️|🏌🏾‍♀️|🏌🏿‍♀️
@@ -307,6 +308,7 @@
 🧘‍♂️|🧘🏻‍♂️|🧘🏼‍♂️|🧘🏽‍♂️|🧘🏾‍♂️|🧘🏿‍♂️
 🧘‍♀️|🧘🏻‍♀️|🧘🏼‍♀️|🧘🏽‍♀️|🧘🏾‍♀️|🧘🏿‍♀️
 🛀|🛀🏻|🛀🏼|🛀🏽|🛀🏾|🛀🏿
+🛌|🛌🏻|🛌🏼|🛌🏽|🛌🏾|🛌🏿
 🧑‍🤝‍🧑|🧑🏻‍🤝‍🧑🏻|🧑🏼‍🤝‍🧑🏼|🧑🏽‍🤝‍🧑🏽|🧑🏾‍🤝‍🧑🏾|🧑🏿‍🤝‍🧑🏿
 👭|👭🏻|👭🏼|👭🏽|👭🏾|👭🏿
 👫|👫🏻|👫🏼|👫🏽|👫🏾|👫🏿

+ 143 - 135
app/assets/emojis/search-index/en.csv

@@ -7,13 +7,13 @@
 ↘️|arrow|direction|down-right|intercardinal|southeast
 ↙️|arrow|direction|down-left|intercardinal|southwest
 ⌨️|computer|keyboard
-☀️|bright|rays|space|sunny|weather
-☁️|cloud|weather
-☂️|clothing|rain|umbrella
+☀️|bright|rays|space|sunny|weather|sunshine
+☁️|weather|cloudy
+☂️|clothing|rain|umbrella|open
 ☃️|cold|man|snowman
 ☄️|comet|space
 ☑️|✓|ballot|box|checked|done|off|tick box with tick|check box with check
-☔|clothing|drops|rain|umbrella|weather
+☔|clothing|drops|umbrella|weather|open|raindrops
 ☕|beverage|cafe|caffeine|chai|coffee|drink|hot|morning|steaming|tea
 ☘️|irish|plant|shamrock
 ☠️|bone|crossbones|dead|death|face|monster|skull
@@ -67,16 +67,16 @@
 ㊗️|button|congratulations|ideograph|japanese
 ㊙️|button|ideograph|japanese|secret
 😀|cheerful|cheery|face|grinning|happy|laugh|nice|smile|smiling|teeth
-😃|awesome|big|eyes|face|grinning|happy|mouth|open|smile|smiling|teeth|yay
+😃|awesome|eyes|face|grinning|happy|open|smile|smiling|teeth|yay|big eyes|mouth open
 😄|eyes|face|grinning|happy|laugh|lol|mouth|open|smile|smiling
 😁|beaming|eyes|face|grinning|happy|nice|smile|smiling|teeth
-😆|closed|eyes|face|grinning|hahaha|happy|laugh|lol|mouth|open|rofl|smile|smiling|squinting
-😅|cold|dejected|excited|face|grinning|mouth|nervous|open|smile|smiling|stressed|sweat
-🤣|crying|face|floor|funny|haha|happy|hehe|hilarious|joy|laugh|lmao|lol|roflmao|rolling|tear
-😂|crying|face|feels|funny|haha|happy|hehe|hilarious|joy|laugh|lmao|lol|roflmao|tear
+😆|eyes|face|grinning|hahaha|happy|lol|open|rofl|smile|smiling|squinting|closed eyes|guffaw|laughing|mouth open
+😅|cold|dejected|excited|face|grinning|mouth|nervous|open|smile|smiling|stressed|sweat undefined|awkward|embarrassed
+🤣|crying|face|floor|funny|haha|happy|hehe|hilarious|joy|laugh|lmao|lol|roflmao|tear undefined|rolling tears
+😂|crying|face|feels|funny|haha|happy|hehe|hilarious|joy|laugh|lmao|lol|roflmao|tears
 🙂|face|happy|slightly|smile|smiling
 🙃|face|hehe|smile|upside down|upside-down face
-🫠|disappear|dissolve|embarrassed|face|haha|heat|hot|liquid|lol|melting|sarcasm|sarcastic
+🫠|disappear|dissolve|embarrassed|face|haha|heat|hot|liquid|lol|melting|sarcasm|sarcastic|disgust|overwhelmed|shame
 😉|face|flirt|heartbreaker|sexy|slide|tease|winking|winks
 😊|blush|eyes|face|glad|satisfied|smile|smiling
 😇|angelic|angels|blessed|face|fairytale|fantasy|halo|happy|innocent|peaceful|smile|smiling|spirit|tale
@@ -86,34 +86,34 @@
 😘|adorbs|bae|blowing|face|flirt|heart|ily|kiss|lover|miss|muah|romantic|smooch|xoxo|you|mwah
 😗|143|date|dating|face|flirt|ily|kiss|love|smooches|xoxo|you
 ☺️|face|happy|outlined|relaxed|smile|smiling
-😚|143|bae|blush|closed|date|dating|eyes|face|flirt|ily|kisses|kissing|smooches|xoxo
-😙|143|closed|date|dating|eyes|face|flirt|ily|kisses|kissing|love|night|smile|smiling
+😚|143|bae|blush|date|dating|eyes|face|flirt|ily|kisses|kissing|smooches|xoxo|closed eyes
+😙|143|date|dating|eyes|face|flirt|ily|kisses|kissing|love|night|smile|smiling|closed eyes
 🥲|face|glad|grateful|happy|joy|pain|proud|relieved|smiley|smiling|tear|touched
 😋|delicious|eat|food|full|hungry|smile|smiling|tasty|um|yummy|face savouring food|savouring|savoring
 😛|awesome|cool|face|nice|party|stuck-out|sweet|tongue
-😜|crazy|epic|eye|face|funny|joke|loopy|nutty|party|stuck-out|tongue|wacky|weirdo|winking|yolo
+😜|crazy|epic|face|funny|joke|loopy|nutty|party|stuck-out|wacky|weirdo|winking|yolo|eye closed|tongue stuck-out
 🤪|crazy|eyes|face|goofy|large|small|zany
-😝|closed|eyes|face|gross|horrible|omg|squinting|stuck-out|taste|tongue|whatever|yolo
+😝|closed|face|gross|horrible|omg|squinting|stuck-out|taste|whatever|yolo|eyes closed|laughing|teasing|tongue stuck-out
 🤑|face|money-mouth|mouth|paid
 🤗|face|hands|hugging|open|smiling
 🤭|giggle|giggling|hand|mouth|oops|realization|secret|shock|sudden|surprise|whoops|embarrassed|realisation|face with hand over mouth
-🫢|amazement|awe|disbelief|embarrass|eyes|face|gasp|hand|mouth|omg|open|over|quiet|scared|shock|surprise
+🫢|amazement|awe|disbelief|embarrass|eyes|face|gasp|hand|mouth|omg|open|over|quiet|scared|shock|surprise undefined
 🫣|captivated|embarrass|eye|face|hide|hiding|peeking|peep|scared|shy|stare
 🤫|face|quiet|shh|shooshing face|shushing face
 🤔|chin|consider|face|hmm|pondering|thinking|wondering
 🫡|face|good|luck|ma’am|ok|respect|salute|saluting|sir|troops|yes
 🤐|face|keep|mouth|quiet|secret|shut|zipper-mouth
-🤨|disapproval|disbelief|distrust|emoji|eyebrow|face|hmm|mild|raised|skeptical|skepticism|surprise|what|sceptical|scepticism
-😐|awkward|blank|deadpan|expressionless|face|fine|jealous|meh|neutral|oh|shade|straight|unamused|unhappy|unimpressed|whatever
-😑|awkward|dead|expressionless|face|fine|inexpressive|jealous|meh|not|oh|omg|straight|uh|unhappy|unimpressed|whatever
+🤨|disapproval|disbelief|distrust|emoji|eyebrow|face|hmm|mild|skeptical|skepticism|what|sceptical|scepticism|raised eyebrow|surprised
+😐|awkward|blank|deadpan|expressionless|face|fine|jealous|meh|neutral|oh|shade|straight|unamused|unhappy|unimpressed|whatever|indifference
+😑|awkward|dead|expressionless|face|fine|inexpressive|jealous|meh|not|oh|omg|straight|uh|unhappy|unimpressed|whatever undefined|annoyed|frustration|neutral|unemotional
 😶|awkward|blank|expressionless|face|mouthless|mute|quiet|secret|silence|silent|speechless
 🫥|depressed|disappear|face|hidden|hide|introvert|invisible|line|meh|whatever|wtv|dotted line face|dotted-line face
 😶‍🌫️|absentminded|clouds|fog|absent-minded|face in clouds|face in the fog|head in clouds
 😏|boss|dapper|face|flirt|homie|kidding|leer|shade|slick|sly|smirk|smug|snicker|suave|suspicious|swag
-😒|...|bored|face|fine|jealous|jelly|pissed|smh|ugh|uhh|unamused|unhappy|weird|whatever
+😒|...|bored|face|fine|jealous|jelly|pissed|smh|ugh|uhh|unamused|unhappy|weird|whatever|hurt|sad|tragic
 🙄|eyeroll|eyes|face|rolling|shade|ugh|whatever
 😬|awkward|dentist|face|grimace|grimacing|grinning|smile|smiling
-😮‍💨|blowing|exhale|exhaling|exhausted|face|gasp|groan|relief|sigh|smiley|smoke|whisper|whistle
+😮‍💨|blowing|exhale|exhaling|exhausted|face|gasp|groan|relief|sigh|smiley|smoke|whisper|whistle|tired
 🤥|face|liar|lie|pinocchio|lying face
 🫨|crazy|daze|earthquake|face|omg|panic|shaking|shock|surprise|vibrate|whoa|wow
 🙂‍↔️|head|horizontally|no|shake|shaking
@@ -122,10 +122,11 @@
 😔|awful|bored|dejected|died|disappointed|face|losing|lost|pensive|sad|sucks
 😪|crying|face|good|night|sad|sleeping|sleepy|tired
 🤤|drooling|face
-😴|bedtime|face|goodnight|nap|night|tired|whatever|yawn|zzz|good night|sleeping face
+😴|bedtime|face|goodnight|nap|night|tired|whatever|yawn|zzz|good night|sleeping face|bored|gn
+🫩|bags|bored|exhausted|eyes|face|fatigued|late|sleepy|tired|weary
 😷|cold|dentist|dermatologist|doctor|dr|germs|mask|medical|medicine|sick|poorly|face with medical mask|ill
 🤒|face|ill|sick|thermometer
-🤕|bandage|head-bandage|hurt|injury|ouch|face with head bandage|face with head-bandage
+🤕|bandage|face|head-bandage|hurt|injury|ouch
 🤢|face|gross|nasty|nauseated|sick|vomit
 🤮|barf|ew|face|gross|puke|sick|spew|throw|up|vomiting
 🤧|face|fever|flu|gesundheit|sick|sneeze|bless you|sneezing face
@@ -145,12 +146,12 @@
 🫤|confused|confusion|diagonal|disappointed|doubtful|frustrated|frustration|meh|mouth|skeptical|unsure|whatever|wtv|face with diagonal mouth|sceptical
 😟|anxious|butterflies|face|nerves|nervous|sad|stressed|surprised|worried|worry
 🙁|face|frowning|sad|slightly
-😮|believe|face|forgot|mouth|omg|open|shocked|surprised|sympathy|unbelievable|unreal|whoa|wow|you|woah
+😮|believe|face|forgot|mouth|omg|shocked|surprised|sympathy|unbelievable|unreal|whoa|wow|you|woah|open mouth
 😯|epic|face|hushed|omg|stunned|surprised|whoa|woah
 😲|astonished|cost|face|no|omg|shocked|totally|way
 😳|amazed|awkward|crazy|dazed|dead|disbelief|embarrassed|face|flushed|geez|heat|hot|impressed|jeez|what|wow
 🥺|begging|big|eyes|face|mercy|not|pleading|please|pretty|puppy|sad|why
-🥹|admiration|aww|back|cry|embarrassed|face|feelings|grateful|gratitude|holding|joy|please|proud|resist|sad|tears
+🥹|admiration|aww|back|cry|embarrassed|face|feelings|grateful|gratitude|joy|please|proud|resist|sad|tears|holding tears
 😦|caught|face|frowning|guard|mouth|open|scared|scary|surprise|what|wow
 😧|anguished|face|forgot|scared|scary|stressed|surprise|unhappy|what|wow
 😨|afraid|anxious|blame|face|fearful|scared|worried
@@ -170,14 +171,14 @@
 😡|anger|angry|enraged|face|feels|maddening|pouting|rage|red|shade|unhappy|upset
 😠|anger|angry|blame|face|feels|frustrated|maddening|rage|shade|unhappy|upset
 🤬|censor|cursing|cussing|face|mad|mouth|pissed|swearing|symbols
-😈|demon|devil|evil|face|fairytale|fantasy|horns|purple|shade|smile|tale|smiling face with horns
+😈|demon|devil|evil|face|fairytale|fantasy|horns|purple|shade|smile|tale|smiling face with horns|mischievous
 👿|angry|demon|devil|evil|face|fairytale|fantasy|horns|imp|mischievous|purple|shade|tale
 💀|body|dead|death|face|fairytale|i’m|lmao|monster|skull|tale|yolo
-💩|bs|comic|doo|dung|face|fml|monster|pile|poop|smelly|smh|stinks|stinky|turd
+💩|bs|comic|dung|face|fml|monster|pile|poop|smelly|smh|stinks|stinky|turd|doo-doo
 🤡|clown|face
 👹|creature|devil|face|fairytale|fantasy|mask|monster|ogre|scary|tale
 👺|angry|creature|face|fairytale|fantasy|goblin|mask|mean|monster|tale
-👻|boo|creature|excited|face|fairytale|fantasy|ghost|halloween|haunting|monster|scary|silly|tale
+👻|boo|creature|excited|face|fairytale|fantasy|ghost|halloween|haunting|monster|scary|silly|tale undefined
 👽|alien|creature|extraterrestrial|face|fairytale|fantasy|monster|space|tale|ufo|et
 👾|alien|creature|extraterrestrial|face|fairytale|fantasy|gamer|games|monster|pixelated|space|tale|ufo|et
 🤖|face|monster|robot
@@ -190,9 +191,9 @@
 🙀|animal|cat|face|oh|surprised|weary
 😿|animal|cat|crying|face|sad|tear
 😾|animal|cat|face|pouting
-🙈|embarrassed|evil|face|forbidden|forgot|gesture|hide|monkey|no|omg|prohibited|scared|secret|smh|watch|see
-🙉|animal|ears|evil|face|forbidden|gesture|hear|listen|monkey|not|prohibited|secret|shh|tmi
-🙊|animal|evil|face|forbidden|gesture|monkey|not|oops|prohibited|quiet|secret|speak|stealth
+🙈|embarrassed|evil|face|forbidden|forgot|gesture|hide|monkey|no|omg|prohibited|scared|secret|smh|watch|hands on eyes|see no evil
+🙉|animal|ears|evil|face|forbidden|gesture|listen|monkey|not|prohibited|secret|shh|tmi undefined|hands on ears|hear no evil
+🙊|animal|evil|face|forbidden|gesture|monkey|not|oops|prohibited|quiet|secret|stealth|speak no evil
 💌|heart|letter|love|mail|romance|valentine
 💘|143|adorbs|arrow|cupid|date|emotion|heart|ily|love|romance|valentine
 💝|143|anniversary|emotion|heart|ily|kisses|ribbon|valentine|xoxo
@@ -200,7 +201,7 @@
 💗|143|emotion|excited|growing|heartpulse|ily|kisses|muah|nervous|pulse|xoxo|mwah
 💓|143|beating|cardio|emotion|heartbeat|ily|love|pulsating|pulse
 💞|143|adorbs|anniversary|emotion|hearts|revolving
-💕|143|anniversary|date|dating|emotion|hearts|ily|kisses|love|loving|two|xoxo
+💕|143|anniversary|date|dating|hearts|ily|kisses|love|loving|two|xoxo|emotions
 💟|143|decoration|emotion|hearth|purple|white
 💔|break|broken|crushed|emotion|heartbroken|lonely|sad
 ❤️‍🔥|burn|fire|heart|love|lust|sacred
@@ -210,7 +211,7 @@
 💛|143|cardiac|emotion|heart|ily|love|yellow
 💚|143|emotion|green|heart|ily|love|romantic
 💙|143|blue|emotion|heart|ily|love|romance
-🩵|143|blue|cute|cyan|emotion|heart|ily|light|like|love|sky|special|teal
+🩵|143|blue|cute|cyan|heart|ily|light|like|love|sky|special|teal|affection|deep connection|emotions|support
 💜|143|bestest|emotion|heart|ily|love|purple
 🤎|143|brown|heart
 🖤|black|evil|heart|wicked
@@ -239,10 +240,10 @@
 🫲|handshake|hold|leftwards|reach|shake
 🫳|dismiss|down|dropped|hand|pick|shoo|up|palm down hand|palm-down hand
 🫴|beckon|catch|come|hand|hold|know|lift|me|offer|tell|palm up hand|palm-up hand
-🫷|block|five|halt|hand|hold|pause|pushing|refuse|slap|stop|wait|high five|leftward-pushing hand|leftwards pushing hand
-🫸|block|five|halt|hand|hold|pause|pushing|refuse|slap|stop|wait|high five|rightward-pushing hand|rightwards pushing hand
-👌|awesome|bet|dope|fleek|fosho|gotcha|hand|legit|okay|pinch|rad|sure|sweet|three|perfect
-🤌|fingers|gesture|hand|hold|huh|interrogation|patience|pinched|relax|sarcastic|ugh|what|zip
+🫷|block|five|halt|hand|hold|pause|refuse|slap|stop|wait undefined|high five|leftward-pushing hand|leftwards pushing hand|pushing leftwards
+🫸|block|five|halt|hand|hold|pause|refuse|slap|stop|wait undefined|high five|rightward-pushing hand|rightwards pushing hand|pushing rightwards
+👌|awesome|bet|dope|fleek|fosho|gotcha|hand|legit|okay|pinch|rad|sure|sweet|three|perfect|good|you bet
+🤌|fingers|gesture|hand|hold|huh|interrogation|patience|pinched|relax|sarcastic|ugh|what|zip|disbelief|exasperation
 🤏|amount|bit|fingers|hand|little|pinching|small|sort
 ✌️|hand|peace|victory
 🤞|fingers|hand|luck|crossed fingers|good luck
@@ -260,20 +261,20 @@
 👍|+1|good|hand|like|thumb|up|yes
 👎|-1|bad|dislike|down|good|hand|nope|thumbs
 ✊|clenched|fist|hand|punch|raised|solidarity
-👊|absolutely|agree|boom|bro|bruh|bump|clenched|correct|fist|hand|knuckle|oncoming|pound|punch|rock|ttyl
+👊|absolutely|agree|boom|bro|bruh|bump|correct|fist|hand|oncoming|pound|punch|rock|ttyl|clenched fist|greet|hit|knuckles
 🤛|fist|leftwards|left-facing fist
 🤜|fist|rightwards|right-facing fist
-👏|applause|approval|awesome|clap|congrats|congratulations|excited|good|great|hand|homie|job|nice|prayed|well|yay
+👏|applause|approval|awesome|clap|congrats|congratulations|excited|good|great|hand|homie|job|prayed|yay|nice job|well done
 🙌|celebration|gesture|hands|hooray|praise|raised|raising hands|woo hoo|yay
 🫶|<3|hands|heart|love|you
 👐|hands|hug|jazz|open|swerve
 🤲|cupped|dua|hands|palms|prayer|together|up|wish
 🤝|agreement|deal|handshake|meeting|shake
-🙏|appreciate|ask|beg|blessed|bow|cmon|five|gesture|hand|please|pray|thanks|thx|folded hands|high five
+🙏|appreciate|ask|beg|blessed|bow|cmon|five|gesture|hand|please|pray|thanks|thx|folded hands|high five|gratitude|greeting|namaste|thank you
 ✍️|hand|write|writing
 💅|bored|care|cosmetics|done|makeup|manicure|nail|polish|whatever
 🤳|camera|phone|selfie
-💪|arm|beast|bench|biceps|bodybuilder|bro|curls|gains|gym|jacked|muscle|press|ripped|strong|weightlift|comic|flexed bicep
+💪|arm|beast|bench|biceps|bodybuilder|bro|curls|gains|gym|jacked|muscle|press|ripped|strong|comic|flexed bicep|fit|weightlifting
 🦾|accessibility|arm|mechanical|prosthetic
 🦿|accessibility|leg|mechanical|prosthetic
 🦵|bent|foot|kick|knee|leg|limb
@@ -328,15 +329,15 @@
 🧏|accessibility|ear|gesture|person|deaf person|hard of hearing|hearing impaired
 🧏‍♂️|accessibility|deaf|ear|gesture|hear|man|male
 🧏‍♀️|accessibility|deaf|ear|gesture|hear|woman|female
-🙇|apology|ask|beg|bowing|favor|forgive|gesture|meditate|meditation|person|pity|regret|sorry|favour
-🙇‍♂️|apology|ask|beg|bowing|favor|forgive|gesture|man|meditate|meditation|pity|regret|sorry|favour|male
-🙇‍♀️|apology|ask|beg|bowing|favor|forgive|gesture|meditate|meditation|pity|regret|sorry|woman|favour|female
+🙇|apology|ask|beg|bowing|favor|forgive|gesture|meditate|meditation|pity|regret|sorry|favour|gratitude|person bowing|pray|respect|thinking
+🙇‍♂️|apology|ask|beg|bowing|favor|forgive|gesture|man|meditate|meditation|pity|regret|favour|sorry undefined|gratitude|person bowing|pray|respect|thinking|male
+🙇‍♀️|apology|ask|beg|bowing|favor|forgive|gesture|meditate|meditation|pity|regret|sorry|woman|favour|gratitude|person bowing|pray|respect|thinking|female
 🤦|again|bewilder|disbelief|exasperation|facepalm|not|oh|omg|person|shock|smh
 🤦‍♂️|again|bewilder|disbelief|exasperation|facepalm|man|not|oh|omg|shock|smh|male
 🤦‍♀️|again|bewilder|disbelief|exasperation|facepalm|not|oh|omg|shock|smh|woman|female
-🤷|doubt|dunno|guess|idk|ignorance|indifference|knows|maybe|person|shrugging|whatever|who
-🤷‍♂️|doubt|dunno|guess|idk|ignorance|indifference|knows|man|maybe|shrugging|whatever|who|male
-🤷‍♀️|doubt|dunno|guess|idk|ignorance|indifference|knows|maybe|shrugging|whatever|who|woman|female
+🤷|doubt|dunno|guess|idk|ignorance|indifference|knows|maybe|person|shrugging|whatever|girl|who knows|woman
+🤷‍♂️|doubt|dunno|guess|idk|ignorance|indifference|knows|man|maybe|shrugging|whatever|boy|who knows|male
+🤷‍♀️|doubt|dunno|guess|idk|ignorance|indifference|knows|maybe|shrugging|whatever|woman|girl|who knows|female
 🧑‍⚕️|doctor|healthcare|nurse|therapist|worker|health care|health worker
 👨‍⚕️|doctor|healthcare|nurse|therapist|worker|health care|man health worker
 👩‍⚕️|doctor|healthcare|nurse|therapist|worker|health care|woman health worker
@@ -451,12 +452,12 @@
 🧟‍♂️|apocalypse|dead|halloween|horror|man|scary|undead|walking|zombie|male
 🧟‍♀️|apocalypse|dead|halloween|horror|scary|undead|walking|woman|zombie|female
 🧌|fairy|fantasy|monster|tale|trolling
-💆|face|getting|headache|massage|person|relaxing|salon|soothe|spa|tension|therapy|treatment
-💆‍♂️|face|getting|headache|man|massage|relaxing|salon|soothe|spa|tension|therapy|treatment|male
-💆‍♀️|face|getting|headache|massage|relaxing|salon|soothe|spa|tension|therapy|treatment|woman|female
+💆|face|getting|headache|massage|person|relaxing|salon|soothe|spa|tension|therapy|treatment|alm|calm face|girl|woman
+💆‍♂️|face|getting|headache|man|massage|relaxing|salon|soothe|spa|tension|therapy|treatment|alm|boy|calm face|male
+💆‍♀️|face|getting|headache|massage|relaxing|salon|soothe|spa|tension|therapy|treatment|woman|alm|calm face|girl|female
 💇|barber|beauty|chop|cosmetology|cut|groom|haircut|parlor|shears|style|parlour|person getting haircut|salon
-💇‍♂️|barber|beauty|chop|cosmetology|cut|groom|haircut|parlor|person|shears|style|parlour|hairdresser|man getting haircut|male
-💇‍♀️|barber|beauty|chop|cosmetology|cut|groom|haircut|parlor|person|shears|style|parlour|hairdresser|woman getting haircut|female
+💇‍♂️|barber|beauty|chop|cosmetology|cut|groom|haircut|parlor|person|shears|style|parlour|hairdresser|man getting haircut|boy|male
+💇‍♀️|barber|beauty|chop|cosmetology|cut|groom|haircut|parlor|person|shears|style|parlour|hairdresser|woman getting haircut|girl|female
 🚶|amble|gait|hike|man|pace|pedestrian|person|stride|stroll|walking
 🚶‍♂️|amble|gait|hike|man|pace|pedestrian|stride|stroll|walking|male
 🚶‍♀️|amble|gait|hike|man|pace|pedestrian|stride|stroll|walking|woman|female
@@ -479,11 +480,11 @@
 🏃‍♂️|fast|hurry|man|marathon|move|quick|race|racing|run|rush|speed|male
 🏃‍♀️|fast|hurry|marathon|move|quick|race|racing|run|rush|speed|woman|female
 💃|dancer|dancing|elegant|festive|flair|flamenco|groove|let’s|salsa|tango|woman|female
-🕺|dancer|dancing|elegant|festive|flair|flamenco|groove|let’s|man|salsa|tango|disco|male
+🕺|dancer|dancing|elegant|festive|flair|flamenco|groove|let’s|man|salsa|disco|tango undefined|male
 🕴️|business|levitating|person|suit|male
-👯|bestie|bff|bunny|counterpart|dancer|double|ear|identical|pair|partying|people|soulmate|twinsies
-👯‍♂️|bestie|bff|bunny|counterpart|dancer|double|ear|identical|men|pair|partying|people|soulmate|twinsies
-👯‍♀️|bestie|bff|bunny|counterpart|dancer|double|ear|identical|pair|partying|people|soulmate|twinsies|women|female
+👯|bestie|bff|counterpart|double|ear|pair|partying|people|soulmate|twinsies|bunny ears|dancers|dancing|girls|identical pair
+👯‍♂️|bestie|bff|counterpart|double|ear|men|pair|partying|people|soulmate|twinsies undefined|bunny ears|dancers|dancing|identical pair
+👯‍♀️|bestie|bff|counterpart|double|ear|pair|partying|people|soulmate|twinsies|women|bunny ears|dancers|dancing|identical pair|female
 🧖|day|luxurious|pamper|person|relax|room|sauna|spa|steambath|unwind|steam bath
 🧖‍♂️|day|luxurious|man|pamper|relax|room|sauna|spa|steambath|unwind|steam bath|male
 🧖‍♀️|day|luxurious|pamper|relax|room|sauna|spa|steambath|unwind|woman|steam bath|female
@@ -527,19 +528,19 @@
 🤽|person|playing|polo|sport|swimming|waterpolo
 🤽‍♂️|man|playing|polo|sport|swimming|waterpolo
 🤽‍♀️|playing|polo|sport|swimming|waterpolo|woman
-🤾|athletics|ball|catch|chuck|handball|hurl|lob|person|pitch|playing|sport|throw|toss
-🤾‍♂️|athletics|ball|catch|chuck|handball|hurl|lob|man|pitch|playing|sport|throw|toss|male
-🤾‍♀️|athletics|ball|catch|chuck|handball|hurl|lob|pitch|playing|sport|throw|toss|woman|female
+🤾|athletics|ball|catch|chuck|handball|hurl|lob|person|pitch|playing|sport|throw|toss|boy|man
+🤾‍♂️|athletics|ball|catch|chuck|handball|hurl|lob|man|pitch|playing|sport|throw|toss|boy|male
+🤾‍♀️|athletics|ball|catch|chuck|handball|hurl|lob|pitch|playing|sport|throw|toss|woman|girl|female
 🤹|act|balance|balancing|handle|juggle|juggling|manage|multitask|skill|multi-task|person juggling
 🤹‍♂️|act|balance|balancing|handle|juggle|juggling|manage|multitask|skill|multi-task|male
 🤹‍♀️|act|balance|balancing|handle|juggle|juggling|manage|multitask|skill|woman|multi-task|female
-🧘|cross|legged|legs|lotus|meditation|peace|person|position|relax|serenity|yoga|yogi|zen
-🧘‍♂️|cross|legged|legs|lotus|man|meditation|peace|position|relax|serenity|yoga|yogi|zen|male
-🧘‍♀️|cross|legged|legs|lotus|meditation|peace|position|relax|serenity|woman|yoga|yogi|zen|female
+🧘|legged|legs|lotus|meditation|peace|person|position|relax|serenity|yoga|yogi|zen|cross legged
+🧘‍♂️|legged|legs|lotus|man|meditation|peace|position|relax|serenity|yoga|yogi|zen|cross legged|seated position|male
+🧘‍♀️|legged|legs|lotus|meditation|peace|position|relax|serenity|woman|yoga|yogi|zen undefined|cross legged|seated position|female
 🛀|bathtub|taking|tub|person taking bath
 🛌|bedtime|goodnight|hotel|nap|night|tired|zzz|person in bed|sleeping
 🧑‍🤝‍🧑|bae|bestie|bff|couple|dating|flirt|friends|hand|hold|people|twins
-👭|bae|bestie|bff|couple|dating|flirt|friends|girls|hand|hold|sisters|twins|women|female
+👭|bae|bestie|bff|couple|dating|flirt|friends|girls|hand|sisters|twins|women|holding hands|female
 👫|bae|bestie|bff|couple|dating|flirt|friends|hand|hold|twins|man and woman holding hands|woman and man holding hands
 👬|bae|bestie|bff|boys|brothers|couple|dating|flirt|friends|hand|twins|gemini|holding hands|man|men holding hands|zodiac|male
 💏|anniversary|babe|bae|couple|date|dating|heart|kiss|love|mwah|person|romance|together|xoxo|muah
@@ -554,6 +555,7 @@
 🧑‍🧒|adult|child|family
 🧑‍🧒‍🧒|adult|child|family
 👣|barefoot|clothing|footprints|omw|print|walk
+🫆|clue|crime|detective|fingerprint|forensics|identity|mystery|print|safety|trace|security
 🐵|animal|banana|face|monkey
 🐒|animal|banana|monkey
 🦍|animal|gorilla
@@ -662,7 +664,12 @@
 🐙|animal|creature|ocean|octopus
 🐚|animal|beach|conch|sea|shell|spiral
 🪸|change|climate|coral|ocean|reef|sea
-🪼|animal|aquarium|burn|invertebrate|jellyfish|life|marine|ocean|ouch|plankton|sea|stinger|tentacles
+🪼|animal|aquarium|burn|invertebrate|jellyfish|life|ocean|ouch|plankton|sea|stinger|tentacles|marine life
+🦀|cancer|crab|zodiac|crustacean|seafood|shellfish
+🦞|animal|bisque|claws|lobster|seafood|shellfish
+🦐|food|shellfish|shrimp|small|prawn|seafood
+🦑|animal|food|mollusk|squid|mollusc|decapod|seafood
+🦪|diving|oyster|pearl
 🐌|animal|escargot|garden|nature|slug|snail|mollusc
 🦋|butterfly|insect|pretty|moth
 🐛|animal|bug|garden|insect|caterpillar|worm
@@ -706,14 +713,15 @@
 🪹|branch|empty|home|nesting
 🪺|bird|branch|eggs|nesting
 🍄|fungus|mushroom|toadstool
+🪾|bare|barren|branches|dead|drought|leafless|tree|trunk|winter|wood
 🍇|dionysus|fruit|grapes
 🍈|cantaloupe|fruit|melon
 🍉|fruit|watermelon
 🍊|citrus|fruit|nectarine|orange|tangerine|vitamin|mandarin
 🍋|citrus|fruit|lemon|sour
-🍋‍🟩|acidity|citrus|cocktail|fruit|garnish|key|lime|margarita|mojito|refreshing|salsa|sour|tangy|tequila|tropical|zest
+🍋‍🟩|acidity|citrus|cocktail|fruit|garnish|key|lime|margarita|mojito|refreshing|salsa|sour|tangy|tequila|tropical|zest undefined
 🍌|banana|fruit|potassium
-🍍|colada|fruit|pina|pineapple|tropical
+🍍|colada|fruit|pina|pineapple|tropical|piña
 🥭|food|fruit|mango|tropical
 🍎|apple|diet|food|fruit|health|red|ripe
 🍏|apple|fruit|green
@@ -734,7 +742,7 @@
 🌶️|pepper|chilli|hot pepper
 🫑|capsicum|food|pepper|vegetable|bell pepper|sweet pepper
 🥒|cucumber|food|pickle|vegetable
-🥬|burgers|cabbage|choy|green|kale|lettuce|salad|bok choy|leafy green|pak choi
+🥬|burgers|cabbage|choy|green|kale|lettuce|salad|bok choy|leafy green|pak choi|choi
 🥦|broccoli|cabbage|wild
 🧄|flavoring|garlic|flavouring
 🧅|flavoring|onion|flavouring
@@ -742,12 +750,13 @@
 🫘|beans|food|legume|small|kidney beans
 🌰|almond|chestnut|plant|nut
 🫚|beer|health|herb|natural|spice|ginger root|root ginger
-🫛|beanstalk|edamame|legume|pea|pod|soybean|vegetable|veggie
+🫛|beanstalk|edamame|legume|pea|pod|soybean|vegetable|veggie|soya
 🍄‍🟫|food|fungi|fungus|mushroom|nature|pizza|portobello|shiitake|shroom|spore|sprout|toppings|truffle|vegetable|vegetarian|veggie
+🫜|food|garden|radish|root|salad|turnip|vegetable|vegetarian|beetroot
 🍞|bread|carbs|food|grain|loaf|restaurant|toast|wheat
 🥐|bread|breakfast|crescent|croissant|food|french|roll
 🥖|baguette|bread|food|french stick
-🫓|arepa|bread|flatbread|food|gordita|lavash|naan|pita
+🫓|arepa|bread|flatbread|food|gordita|lavash|naan|pita|nan|pitta
 🥨|convoluted|pretzel|twisted
 🥯|bagel|bakery|bread|breakfast|schmear
 🥞|breakfast|crêpe|food|hotcake|pancakes|crepe
@@ -768,16 +777,16 @@
 🥙|falafel|flatbread|food|gyro|kebab|stuffed|pita roll
 🧆|chickpea|falafel|meatball|chick pea
 🥚|breakfast|egg|food
-🍳|breakfast|cooking|easy|egg|frying|over|pan|restaurant|side|sunny|up
+🍳|breakfast|cooking|easy|egg|frying|over|pan|restaurant|side|sunny|up|fried
 🥘|casserole|food|paella|pan|shallow
 🍲|food|pot|soup|stew
 🫕|cheese|chocolate|fondue|food|melted|pot|ski
 🥣|bowl|breakfast|cereal|congee|oatmeal|porridge|spoon
 🥗|food|green|salad|garden
-🍿|corn|movie|popcorn
+🍿|corn|movie|popcorn|film
 🧈|butter|dairy
 🧂|condiment|flavor|mad|salty|shaker|taste|upset|flavour
-🥫|canned|food
+🥫|canned|food|tin
 🍱|bento|box|food
 🍘|cracker|food|rice
 🍙|ball|food|japanese|rice
@@ -789,17 +798,12 @@
 🍢|food|kebab|oden|restaurant|seafood|skewer|stick
 🍣|food|sushi
 🍤|fried|prawn|shrimp|tempura|battered
-🍥|cake|food|pastry|restaurant|swirl|fish cake with swirl|narutomaki
-🥮|autumn|cake|festival|moon|yuèbǐng
+🍥|cake|food|pastry|restaurant|swirl|fish cake with swirl|narutomaki|fishcake
+🥮|autumn|cake|festival|yuèbǐng|full moon|mooncake
 🍡|dango|dessert|japanese|skewer|stick|sweet
 🥟|dumpling|empanada|gyōza|jiaozi|pierogi|potsticker|pastie|samosa
 🥠|cookie|fortune|prophecy
-🥡|box|chopsticks|delivery|food|pail|oyster pail|takeaway box|takeout box|takeaway container
-🦀|cancer|crab|zodiac|crustacean|seafood|shellfish
-🦞|animal|bisque|claws|lobster|seafood|shellfish
-🦐|food|shellfish|shrimp|small|prawn|seafood
-🦑|animal|food|mollusk|squid|mollusc|decapod|seafood
-🦪|diving|oyster|pearl
+🥡|box|chopsticks|delivery|food|pail|oyster pail|takeaway box|takeout box|takeaway container|chinese
 🍦|cream|dessert|food|icecream|restaurant|serve|sweet|ice cream|soft serve|soft-serve ice cream
 🍧|dessert|ice|restaurant|shaved|sweet|granita
 🍨|cream|dessert|food|restaurant|sweet|ice cream
@@ -822,15 +826,15 @@
 🍾|bar|cork|drink|popping|bottle with popping cork|bubbly
 🍷|alcohol|bar|beverage|booze|club|drinking|drinks|glass|restaurant|wine
 🍸|alcohol|bar|booze|club|cocktail|drinking|drinks|glass|mad|martini|men
-🍹|alcohol|bar|booze|club|cocktail|drinking|drinks|drunk|mai|party|tai|tropical|tropics
+🍹|alcohol|bar|booze|club|cocktail|drinking|drinks|drunk|party|tai|tropical|tropics|mai tai
 🍺|alcohol|ale|bar|beer|booze|drinking|drinks|mug|octoberfest|oktoberfest|pint|stein|summer
 🍻|alcohol|bar|beer|booze|bottoms|cheers|drinking|drinks|mugs|clinking beer mugs
 🥂|celebrate|drink|glasses|cheers|clinking glasses
-🥃|glass|liquor|scotch|shot|tumbler|whiskey|whisky
+🥃|glass|liquor|scotch|shot|tumbler|whiskey|whisky|spirits
 🫗|accident|drink|empty|glass|liquid|oops|pouring|spill|water
-🥤|cup|drink|juice|malt|soda|soft|straw|water
+🥤|cup|drink|juice|malt|soda|soft|straw|water|fizzy|milkshake|pop
 🧋|boba|bubble|food|milk|pearl|tea
-🧃|beverage|box|straw|sweet|drink carton|juice box|popper
+🧃|beverage|box|straw|sweet|drink carton|juice box|popper|carton
 🧉|drink|mate|maté
 🧊|cold|cube|iceberg
 🥢|chopsticks|hashi|jeotgarak|kuaizi|pair of chopsticks
@@ -851,17 +855,17 @@
 ⛰️|mountain
 🌋|eruption|mountain|nature|volcano
 🗻|fuji|mountain|nature|mount fuji
-🏕️|camping
+🏕️|camping|tent
 🏖️|beach|umbrella
-🏜️|desert
-🏝️|desert|island
-🏞️|national|park
+🏜️|desert|cactus
+🏝️|desert|island|palm|tree
+🏞️|national|park|mountain|river|tree
 🏟️|stadium|arena
 🏛️|building|classical building|column
-🏗️|building|construction|crane
+🏗️|building|construction|crane|site
 🧱|bricks|clay|mortar|wall
 🪨|boulder|heavy|rock|solid|stone|tough
-🪵|log|lumber|timber|wood
+🪵|log|lumber|timber|wood|stump
 🛖|home|house|hut|roundhouse|shelter|yurt
 🏘️|houses
 🏚️|derelict|home|house
@@ -874,7 +878,7 @@
 🏦|bank|building
 🏨|building|hotel
 🏩|building|hotel|love
-🏪|24|building|convenience|hours|store|dépanneur
+🏪|24|building|convenience|hours|store|dépanneur|shop
 🏫|building|school
 🏬|building|department|store
 🏭|building|factory
@@ -887,7 +891,7 @@
 🕌|islam|masjid|mosque|muslim|religion
 🛕|hindu|temple
 🕍|jewish|judaism|religion|synagogue|temple|shul
-⛩️|religion|shinto|shrine
+⛩️|religion|shinto|shrine|torii
 🕋|hajj|islam|kaaba|muslim|religion|umrah
 ⛲|fountain
 ⛺|camping|tent
@@ -897,7 +901,7 @@
 🌄|morning|mountains|over|sunrise
 🌅|morning|nature|sunrise
 🌆|at|building|dusk|evening|landscape|sunset|cityscape at dusk|skyline at dusk
-🌇|building|dusk|sunset
+🌇|building|dusk|sunset|cityscape
 🌉|at|bridge|night
 🎠|carousel|entertainment|horse|merry-go-round
 🛝|park|playing|slide|sliding|amusement park|playground slide|theme park
@@ -906,8 +910,8 @@
 💈|barber|cut|fresh|haircut|pole|shave
 🎪|circus|tent|big top
 🚂|caboose|engine|locomotive|railway|steam|trains|travel
-🚃|car|electric|tram|travel|trolleybus|railway carriage|train carriage|trolley bus
-🚄|railway|shinkansen|speed|train|high-speed train
+🚃|electric|tram|travel|trolleybus|railway carriage|train carriage|trolley bus|carriage
+🚄|railway|shinkansen|speed|train|high-speed train|tgv
 🚅|bullet|high-speed|nose|railway|shinkansen|speed|train|travel
 🚆|arrived|choo|railway|train
 🚇|metro|subway|travel|tube|underground
@@ -915,10 +919,10 @@
 🚉|railway|station|train
 🚊|trolleybus|light rail|oncoming light rail|car|streetcar|tramcar|trolley bus
 🚝|monorail|vehicle
-🚞|car|mountain|railway|trip
+🚞|mountain|railway|trip|carriage
 🚋|bus|car|trolleybus|trolley bus|streetcar|tramcar
-🚌|bus|school|vehicle
-🚍|bus|cars|oncoming
+🚌|bus|school|vehicle|coach
+🚍|bus|cars|oncoming|coach
 🚎|bus|tram|trolleybus|streetcar
 🚐|bus|drive|minibus|van|vehicle
 🚑|ambulance|emergency|vehicle
@@ -926,16 +930,16 @@
 🚓|5–0|car|cops|patrol|police
 🚔|car|oncoming|police
 🚕|cabbie|car|drive|taxi|vehicle|yellow
-🚖|cabbie|cars|drove|hail|oncoming|taxi|yellow
+🚖|cabbie|cars|drove|hail|oncoming|taxi|yellow|drive
 🚗|automobile|car|driving|vehicle
-🚘|automobile|cars|drove|oncoming|vehicle
+🚘|automobile|cars|drove|oncoming|vehicle|drive
 🚙|car|drive|recreational|sportutility|utility|vehicle|4x4|off-road|suv|4wd|four-wheel drive|sport utility vehicle
 🛻|automobile|car|flatbed|pick-up|pickup|transportation|truck|ute
-🚚|car|delivery|drive|truck|vehicle
+🚚|car|delivery|drive|truck|vehicle|lorry
 🚛|car|drive|lorry|move|semi|truck|vehicle|articulated truck
 🚜|tractor|vehicle
 🏎️|car|racing|zoom
-🏍️|motorcycle|racing
+🏍️|motorcycle|racing|motorbike
 🛵|motor|scooter
 🦽|accessibility|manual|wheelchair
 🦼|accessibility|motorized|wheelchair|powered wheelchair|mobility scooter
@@ -951,76 +955,76 @@
 ⛽|diesel|fuelpump|gasoline|pump|station|petrol pump
 🛞|car|circle|tire|turn|vehicle|wheel|tyre
 🚨|alarm|alert|beacon|car|emergency|light|police|revolving|siren
-🚥|intersection|signal|stoplight|traffic|horizontal traffic lights|lights
-🚦|drove|intersection|signal|stoplight|traffic|lights|vertical traffic lights
+🚥|intersection|signal|stoplight|traffic|horizontal traffic lights|lights|junction
+🚦|drove|intersection|signal|stoplight|traffic|lights|vertical traffic lights|junction
 🛑|octagonal|sign|stop
 🚧|barrier|construction
 🛟|buoy|float|lifesaver|preserver|rescue|safety|saver|swim|life preserver|life saver|lifebuoy|ring buoy
 ⛵|boat|resort|sailboat|sailing|sea|yacht
-🛶|boat|canoe
+🛶|boat|canoe|kayak
 🚤|billionaire|boat|lake|luxury|millionaire|speedboat|summer|travel
-🛳️|passenger|ship
+🛳️|passenger|ship|cruise|liner
 ⛴️|boat|ferry|passenger
 🛥️|boat|motorboat
 🚢|boat|passenger|ship|travel
-🛩️|aeroplane|airplane|plane|small airplane|small plane
+🛩️|aeroplane|airplane|plane|small airplane|small plane|aircraft|light
 🛫|aeroplane|airplane|check-in|departures|take-off|flight departure|plane departure
 🛬|aeroplane|airplane|arrivals|arriving|landing|plane
 🪂|hang-glide|parachute|parasail|skydive|parascend
 💺|chair|seat
 🚁|copter|helicopter|roflcopter|travel|vehicle
-🚟|railway|suspension|cable
+🚟|railway|suspension|cable|monorail
 🚠|cableway|gondola|lift|mountain|ski
 🚡|aerial|cable|car|gondola|ropeway|tramway
 🛰️|satellite|space
 🚀|launch|rockets|space|travel
-🛸|aliens|extra|saucer|terrestrial|ufo|flying saucer|spaceship
-🛎️|bellhop|hotel|porter
+🛸|aliens|saucer|terrestrial|ufo|flying saucer|spaceship|extraterrestrial
+🛎️|bellhop|hotel|porter|concierge|reception|service
 🧳|bag|luggage|packing|roller|suitcase|travel
 ⌛|done|sand|timer|hourglass done
 ⏳|done|flowing|hourglass|hours|not|sand|timer|waiting|yolo
-⌚|clock|time|watch
+⌚|clock|time|watch|wristwatch
 ⏰|alarm|clock|hours|hrs|late|time|waiting
 ⏱️|clock|stopwatch|time
 ⏲️|clock|timer
 🕰️|clock|mantelpiece|time
 🕛|12:00|clock|o’clock|time|twelve
-🕧|12:30|30|clock|thirty|time|twelve-thirty|12.30|half past twelve
+🕧|12:30|30|clock|thirty|time|twelve-thirty|12.30|half past twelve|past
 🕐|1:00|clock|o’clock|one|time
-🕜|1:30|30|clock|one-thirty|thirty|time|1.30|half past one
+🕜|1:30|30|clock|one-thirty|thirty|time|1.30|half past one|past
 🕑|2:00|clock|o’clock|time|two
-🕝|2:30|30|clock|thirty|time|two-thirty|2.30|half past two
+🕝|2:30|30|clock|thirty|time|two-thirty|2.30|half past two|past
 🕒|3:00|clock|o’clock|three|time
-🕞|3:30|30|clock|thirty|three-thirty|time|3.30|half past three
+🕞|3:30|30|clock|thirty|three-thirty|time|3.30|half past three|past
 🕓|4:00|clock|four|o’clock|time
-🕟|30|4:30|clock|four-thirty|thirty|time|4.30|half past four
+🕟|30|4:30|clock|four-thirty|thirty|time|4.30|half past four|past
 🕔|5:00|clock|five|o’clock|time
-🕠|30|5:30|clock|five-thirty|thirty|time|5.30|half past five
+🕠|30|5:30|clock|five-thirty|thirty|time|5.30|half past five|past
 🕕|6:00|clock|o’clock|six|time
-🕡|30|6:30|clock|six-thirty|thirty|6.30|half past six
-🕖|0|7:00|clock|o’clock|seven
-🕢|30|7:30|clock|seven-thirty|thirty|7.30|half past seven
+🕡|30|6:30|clock|six-thirty|thirty|6.30|half past six|past
+🕖|0|7:00|clock|o’clock|seven|time
+🕢|30|7:30|clock|seven-thirty|thirty|7.30|half past seven|past
 🕗|8:00|clock|eight|o’clock|time
-🕣|30|8:30|clock|eight-thirty|thirty|time|8.30|half past eight
+🕣|30|8:30|clock|eight-thirty|thirty|time|8.30|half past eight|past
 🕘|9:00|clock|nine|o’clock|time
-🕤|30|9:30|clock|nine-thirty|thirty|time|9.30|half past nine
-🕙|0|10:00|clock|o’clock|ten
-🕥|10:30|30|clock|ten-thirty|thirty|time|10.30|half past ten
+🕤|30|9:30|clock|nine-thirty|thirty|time|9.30|half past nine|past
+🕙|0|10:00|clock|o’clock|ten|time
+🕥|10:30|30|clock|ten-thirty|thirty|time|10.30|half past ten|past
 🕚|11:00|clock|eleven|o’clock|time
-🕦|11:30|30|clock|eleven-thirty|thirty|time|11.30|half past eleven
+🕦|11:30|30|clock|eleven-thirty|thirty|time|11.30|half past eleven|past
 🌑|dark|moon|new|space
 🌒|crescent|dreams|moon|space|waxing
 🌓|first|moon|quarter|space
 🌔|gibbous|moon|space|waxing
 🌕|full|moon|space
 🌖|gibbous|moon|space|waning
-🌗|last|moon|quarter|space
+🌗|last|moon|quarter|space|half|third
 🌘|crescent|moon|space|waning
 🌙|crescent|moon|ramadan|space
 🌚|face|moon|new|space
 🌛|face|first|moon|quarter|space
 🌜|dreams|face|last|moon|quarter
-🌡️|thermometer|weather
+🌡️|thermometer|weather|temperature
 🌝|bright|face|moon|full-moon face
 🌞|beach|bright|day|face|heat|shine|sunny|sunshine|weather
 🪐|planet|ringed|saturnine
@@ -1029,7 +1033,7 @@
 🌠|falling|night|shooting|space|star
 🌌|space|way|milky way
 ⛅|behind|cloudy|sun|weather
-⛈️|cloud|lightning|rain|thunderstorm
+⛈️|cloud|lightning|rain|thunderstorm|weather
 🌤️|behind|cloud|sun|weather
 🌥️|behind|cloud|sun|weather
 🌦️|behind|cloud|rain|sun|weather
@@ -1040,14 +1044,14 @@
 🌫️|cloud|fog|weather
 🌬️|blow|cloud|face|wind
 🌀|cyclone|dizzy|hurricane|twister|typhoon|weather
-🌈|gay|genderqueer|glbtq|lesbian|lgbtqia|nature|pride|queer|rainbow|transgender|weather
+🌈|gay|genderqueer|glbtq|lesbian|lgbtqia|nature|pride|queer|rainbow|transgender|weather undefined
 🌂|closed|clothing|rain|umbrella
-⛱️|ground|rain|sun|umbrella|beach|sand
+⛱️|ground|rain|umbrella|beach|sand|sunshade
 ⚡|danger|electricity|high|lightning|nature|thunderbolt|voltage|zap
 ⛄|cold|man|snowman
 🔥|af|burn|fire|flame|hot|litaf|tool
 💧|cold|comic|droplet|nature|sad|sweat|tear|water|weather
-🌊|nature|ocean|surfer|surfing|water|wave
+🌊|nature|ocean|surfer|surfing|water|wave|sea
 🎃|celebration|halloween|jack-o-lantern|lantern|pumpkin|jack-o’-lantern
 🎄|celebration|christmas|tree
 🎆|boom|celebration|entertainment|fireworks|yolo
@@ -1059,13 +1063,13 @@
 🎋|banner|celebration|japanese|tree|tanabata tree
 🎍|bamboo|celebration|decoration|japanese|pine|plant
 🎎|celebration|dolls|festival|japanese
-🎏|celebration|streamer|carp wind sock|japanese wind socks|koinobori
+🎏|celebration|streamer|carp wind sock|japanese wind socks|koinobori|sock|wind
 🎐|bell|celebration|chime|wind
 🎑|celebration|ceremony|viewing|moon viewing ceremony|moon-viewing ceremony
 🧧|envelope|gift|good|hóngbāo|lai|luck|money|red|see
 🎀|celebration|ribbon
 🎁|birthday|bow|box|celebration|christmas|gift|present|surprise|wrapped
-🎗️|celebration|reminder|ribbon
+🎗️|celebration|reminder|ribbon|awareness
 🎟️|tickets|admission tickets|entry
 🎫|admission|stub|ticket
 🎖️|award|celebration|medal|military
@@ -1134,7 +1138,7 @@
 🥼|clothes|coat|doctor|dr|experiment|jacket|lab|scientist|white
 🦺|emergency|safety|vest|hi-vis|high-vis|jacket|life jacket
 👔|clothing|employed|necktie|serious|shirt|tie
-👕|blue|casual|clothes|clothing|collar|dressed|shirt|shopping|t-shirt|tshirt|weekend|green|t shirt|tee-shirt
+👕|blue|casual|clothes|clothing|dressed|shirt|shopping|t-shirt|tshirt|weekend|green|t shirt|tee-shirt|collarless
 👖|blue|casual|clothes|clothing|denim|dressed|jeans|pants|shopping|trousers|weekend
 🧣|bundle|cold|neck|scarf|up
 🧤|gloves|hand
@@ -1204,6 +1208,7 @@
 🪘|beat|conga|drum|instrument|long|rhythm
 🪇|cha|dance|instrument|maracas|music|party|percussion|rattle|shaker
 🪈|band|fife|flautist|flute|instrument|marching|music|orchestra|piccolo|pipe|recorder|woodwind
+🪉|cupid|harp|instrument|love|music|orchestra
 📱|cell|communication|mobile|phone|telephone
 📲|arrow|build|call|cell|communication|mobile|phone|receive|telephone
 ☎️|phone|telephone|landline
@@ -1334,6 +1339,7 @@
 🧰|box|chest|mechanic|red|toolbox
 🧲|attraction|horseshoe|magnetic|negative|positive|shape|u
 🪜|climb|ladder|rung|step
+🪏|bury|dig|garden|hole|plant|scoop|shovel|snow|spade
 🧪|chemistry|experiment|lab|science|test|tube
 🧫|bacteria|biologist|biology|culture|dish|lab|petri
 🧬|biologist|dna|evolution|genetics|life
@@ -1400,7 +1406,7 @@
 🚫|entry|forbidden|not|prohibited|smoke|denied
 🚳|bicycles|bike|forbidden|not|prohibited
 🚭|forbidden|not|prohibited|smoke|smoking|denied
-🚯|forbidden|littering|not|prohibited|denied|no littering
+🚯|forbidden|littering|not|prohibited
 🚱|dry|non-drinking|non-potable|prohibited|water|non-drinkable water
 🚷|forbidden|not|pedestrians|prohibited|denied|no pedestrians
 📵|cell|forbidden|mobile|not|phones|prohibited|telephone
@@ -1477,6 +1483,7 @@
 ➰|curly|loop
 ➿|curly|double|loop
 〽️|alternation|mark|part
+🫟|drip|holi|ink|liquid|mess|paint|spill|splatter|stain
 🔠|abcd|latin|letters|uppercase|input latin uppercase
 🔡|abcd|latin|letters|lowercase|input latin lowercase
 🔢|1234|input|numbers
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|scotland
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🇨🇶|sark

+ 13 - 6
app/assets/emojis/search-index/es.csv

@@ -123,6 +123,7 @@
 😪|cara de sueño|dormir|sueño|cara somnolienta|gota|mocos|resfriado|somnoliento
 🤤|babeando|babas|babear|cara babeando|cara que babea|delicioso|rico|saliva|suculento
 😴|cara durmiendo|dormido|sueño|buenas noches|cansancio|dormir|durmiendo|hora de dormir|noche|siesta|zzzzz
+🫩|agotado|agotamiento|cansado|cansancio|extenuación|extenuado|ojeras|ojos|sueño|cara cansada|cara con ojeras|dormí mal|falta de sueño|no dormí|cara con bolsas bajo los ojos|somnoliento|exhausto
 😷|cara con mascarilla médica|enfermo|malo|máscara|cara con cubrebocas|cubrebocas|enfermedad|gérmenes|gripe|mascarilla|resfriado|resfrío|barbijo|doctor
 🤒|cara con termómetro|enfermo|malo|termómetro|calentura|enfermedad|fiebre
 🤕|cara con la cabeza vendada|dolor|herida|cabeza vendada|cara con vendaje|descalabrado|descalabrar|enfermo|lesión|vendaje|herido|vendas
@@ -554,6 +555,7 @@
 🧑‍🧒|adulto|niño|familia: adulto, infante|infante
 🧑‍🧒‍🧒|adulto|niño|familia: adulto, infante, infante|infante
 👣|huellas de pies|pies|pisada|cuerpo|ropa
+🫆|delito|detective|forense|huella dactilar|huella digital|identidad|misterio|rastro|seguridad
 🐵|cara de mono|mono|animal|chango|chimpancé|simio
 🐒|macaco|mono|simio|animal|cara de mono|chango|chimpancé
 🦍|gorila|primate|simio|animal|king kong|zoo|cara
@@ -663,6 +665,11 @@
 🐚|espiral|animal|caracola marina|concha de caracol|marino|oceano|playa|caracol marino
 🪸|arrecife|coral|océano|animales y naturaleza|cambio climático|mar|planta
 🪼|invertebrado|marino|medusa|picadura|picar|acuario|jalea|océano|plancton|tentáculos
+🦀|animal|cáncer|cangrejo|zodiaco|crustáceo|mariscos
+🦞|bogavante|langosta|pinzas|animal|crustáceo|mariscos|playa|tenazas|bisque
+🦐|camarón|comida|gamba|langostino|oceano|paella|mariscos
+🦑|calamar|comida|molusco|oceano|mariscos
+🦪|buceo|ostra|perla|almeja|concha|ostión
 🐌|caracola|molusco|animal|babosa|baboso|insecto
 🦋|bonito|insecto|mariposa|azul|bonita|animal
 🐛|bicho|gusano|insecto|animal|naturaleza|oruga
@@ -706,6 +713,7 @@
 🪹|anidación|anidamiento|anidar|nido vacío|animales y naturaleza|hogar|rama
 🪺|anidación|anidamiento|anidar|nido con huevos|animales y naturaleza|ave|huevos|pájaro|rama
 🍄|champiñón|hongo|seta|alucinar|mario
+🪾|deshojado|estéril|invierno|madera|muerto|sequía|sin hojas|tronco|ramas secas|yermo|árbol sin hojas|árido
 🍇|agracejo|fruta|racimo|uvas|fruto
 🍈|fruta|melón|planta
 🍉|fruta|sandía|comida|patilla|planta
@@ -744,6 +752,7 @@
 🫚|cerveza|especia|garganta|raíz de jengibre|hierba|jengibre|natural|salud
 🫛|edamame|guisante|judías|legumbre|soja|vaina|verdura|porotos|vegetal
 🍄‍🟫|champiñón marrón|comida|naturaleza|seta|vegetal|espora|hongo café|hongo portabello|hongos|ingrediente|trufa|hongo marrón|champiñones|cremini
+🫜|chirivía|comida|ensalada|huerto|nabo|rábano|raíz|remolacha|vegetariano|verdura|cocina vegetariana|vegetales|betabel|jardín
 🍞|pan de molde|tostada|calorias|comida|desayuno|rebanada de pan|rodaja|trigo|barra de pan
 🥐|bollo|comida|croissant|cruasán|francés|cachito|desayuno|medialuna|cuernito|pan
 🥖|baguete|baguette|barra|comida|francés|desayuno|pan francés
@@ -795,11 +804,6 @@
 🥟|comida|dumpling|gyōza|jiaozi|masa|empanada
 🥠|adivinación|galleta de la fortuna|profecía|superstición|comida|galleta de la suerte|galletita
 🥡|caja para llevar|recipiente para llevar|restaurante|comida a domicilio|comida para llevar|palillos chinos
-🦀|animal|cáncer|cangrejo|zodiaco|crustáceo|mariscos
-🦞|bogavante|langosta|pinzas|animal|crustáceo|mariscos|playa|tenazas|bisque
-🦐|camarón|comida|gamba|langostino|oceano|paella|mariscos
-🦑|calamar|comida|molusco|oceano|mariscos
-🦪|buceo|ostra|perla|almeja|concha|ostión
 🍦|cucurucho de helado|dulce|helado de cucurucho|restaurante|helado en barquillo|cono|hielo|nieve en cono|postre
 🍧|granizado hawaiano|helado|postre|raspado|comida|dulce|frío|hielo molido|nieve|restaurante
 🍨|helado|postre|sorbete
@@ -1155,7 +1159,7 @@
 🛍️|bolsas de compras|compras|rebajas|regalo|hotel
 🎒|colegio|mochila escolar|bolso|escuela|estudiar|maletín|backpack
 🩴|chancla de dedo|chancleta|chinela|sandalia|calzado|comodidad|ojota|verano|zapato|sandalía para la playa|zori
-👞|calzado|hombre|ropa|zapato de hombre|marron|pie|vestimenta
+👞|calzado|hombre|ropa|zapato de hombre|café|marrón|pie|vestimenta
 👟|calzado|correr|tenis|zapatilla deportiva|carrera|deporte|deportivas|ropa deportiva|vestimenta|zapato deportivo
 🥾|bota de senderismo|camping|mochilero|senderismo|acampada|bota de camping|campamento|excursión|excursionismo|acampar|botas de excursión
 🥿|bailarinas|ballet|chatitas|chinitas|pantuflas|toreritas|zapato plano|zapatos cómodos|calzado de piso|zapato de piso
@@ -1204,6 +1208,7 @@
 🪘|conga|ritmo|tamboril|instrumento musical|música|percursión|sonido|yembé
 🪇|agitar|brasil|instrumento|maracas|movimiento|música|percusión|baile|cha cha|coctelera|fiesta|matraca
 🪈|flauta|flautín|instrumento de viento madera|música|banda|grabador|orquesta|pífano
+🪉|amor|arpa|cupido|harpa|instrumento|música|orquesta|angelical|cuerdas
 📱|celular|móvil|teléfono
 📲|móvil con una flecha|celular|comunicación|hacer llamada|hacer una llamada|llamada entrante|recibir llamada|teléfono móvil con una flecha|flecha apuntado a teléfono celular|auricular
 ☎️|agenda|cables|línea|llamar|teléfono de línea|teléfono fijo
@@ -1334,6 +1339,7 @@
 🧰|armario|caja de herramientas|mecánico|cajón|herramientas|cofre
 🧲|atracción|herradura|imán|magnético|forma de u|polos|positivo y negativo
 🪜|escalar|escalera|escalerilla|escalón|peldaño|bajar|subir
+🪏|agujero|cavar|enterrar|excavar|hoyo|huerto|nieve|pala|jardín|palear|plantar|cuchara|pica
 🧪|experimento|laboratorio|química|químico|tubo de ensayo|ciencias|sustancia
 🧫|bacterias|biología|biólogo|cultivo|laboratorio|placa de petri|bióloga|microbio
 🧬|adn|biólogo|evolución|genética|vida|bióloga|genes
@@ -1477,6 +1483,7 @@
 ➰|bucle|giro|tirabuzón
 ➿|doble|bucle doble|japón|llamada gratuita|giro
 〽️|alternancia|marca de alternancia
+🫟|gotear|líquido|manchar|pintura|salpicadura|salpicar|tinta|derrame|goteo|holi|krishna|lío
 🔠|abcd|letras latinas mayúsculas|mayúsculas|abecedario|alfabeto|letras mayúsculas|entrada|latín
 🔡|abcd|letras latinas minúsculas|abecesario|alfabeto|letras minúsculas latinas|minúsculas latinas|entrada|latín
 🔢|1234|dígitos|números|entrada

+ 21 - 14
app/assets/emojis/search-index/fr.csv

@@ -79,8 +79,8 @@
 🫠|disparaître|fondre|gêne|liquéfié|liquide|sarcasme|se dissoudre|visage qui fond
 😉|blague|clin d’œil|émoticône|flirter|plaisanter|sexy|visage faisant un clin d’œil|visage clignant d’un œil
 😊|content|émoticône|heureux|œil|rougir|satisfait|sourire|visage qui rougit|visage souriant avec yeux rieurs|visage souriant avec yeux souriants|yeux|visage souriant les yeux plissés
-😇|ange|angélique|auréole|béni|bible|émoticône|heureux|innocent|paix|sourire|spirituel|visage souriant avec auréole|visage souriant avec une auréole|visage qui sourit avec une auréole
-🥰|adorer|aimer|amoureuse|amoureux|béguin|coeurs|cœurs|j’adore|je t’aime|romance|smiley avec 3 coeurs|sourire|visage souriant avec cœurs
+😇|ange|angélique|auréole|béni|bible|émoticône|heureux|innocent|paix|sourire|spirituel|visage souriant avec auréole|visage qui sourit avec une auréole
+🥰|adorer|aimer|béguin|coeur|cœurs|j’adore|je t’aime|smiley avec 3 coeurs|sourire|visage souriant avec cœurs|amoureuse|amoureux
 😍|amoureux|cœur|émoticône|œil|romantique|sourire|visage souriant avec yeux en forme de cœur|yeux|visage souriant aux yeux en forme de cœur
 🤩|étoiles dans les yeux|grand sourire|heureux|pressé|surexcité|tête avec étoiles|visage avec des étoiles à la place des yeux|wow|yeux|large sourire|visage aux yeux en forme d’étoiles
 😘|amour|baiser|bise|bisou et cœur|bonjour|bonne nuit|cœur|embrasser|émoticône|je t’aime|visage envoyant un bisou|visage qui fait une bise avec un cœur|visage envoyant un baiser
@@ -113,7 +113,7 @@
 😒|bizarre|blasé|émoticône|énervé|fâché|jaloux|pas content|peu importe|visage qui s’ennuie|contrarié|désabusé|résigné
 🙄|agacé|émoticône|excédé|incrédulité|roulement|visage qui lève les yeux au ciel|visage qui roule des yeux|visage roulant des yeux|yeux|roule des yeux
 😬|dents|émoticône|gêné|grimace|rien|sourire|visage grimaçant
-😮‍💨|chuchoter|découragé|déçu|ennuyé|expiration|exténué|fatigué|siffler|souffler|soulagement|soupir|sursaut|visage expirant
+😮‍💨|chuchoter|découragé|déçu|expiration|exténué|fatigué|siffler|souffler|soulagement|soupir|sursaut|visage expirant
 🤥|émoticône|mensonge|menteur|pinocchio|visage de menteur|visage dont le nez s’allonge
 🫨|choc|étourdi|fou|omg|ouah|panique|secoué|surprenant|tremblement de terre|vibration|visage secoué
 🙂‍↔️|non|secouer|tête secouée horizontalement
@@ -123,6 +123,7 @@
 😪|émoticône|fatigué|larme|pleurer|sommeil|triste|visage endormi|endormi
 🤤|baver|délicieux|émoticône|mmh|visage qui bave|saliver
 😴|bonne nuit|coucher|dormir|émoticône|endormi|fatigué|sieste|sommeil|visage somnolent|zzz
+🫩|ensommeilé|épuisé|fatigué|sommeil|visage avec des valises sous les yeux|cernes|endormi|las|poches|somnolent|tard|valises|yeux
 😷|bactéries|dentiste|docteur|émoticône|germes|malade|masque chirurgical|médecin|rhume|visage avec masque|froid|médical
 🤒|indisposé|malade|thermomètre|visage avec thermomètre
 🤕|aïe|bandage|blessure|bobo|émoticône|pansement|tête avec un bandage|visage avec bandage autour de la tête|blessé|visage bandé
@@ -148,7 +149,7 @@
 😮|bouche bée|bouche ouverte|choqué|émoticône|épaté|incroyable|omd|oubli|surpris|visage avec bouche ouverte|visage avec la bouche ouverte|visage étonné|compassion|visage épaté
 😯|émoticône|incroyable|omd|sans voix|stupéfait|stupeur|surpris|visage à la bouche ouverte|visage ébahi|visage sans voix|ébahi
 😲|choc|choqué|émoticône|étonné|impossible|incroyable|omd|stupéfait|visage|surpris
-😳|chaud|comment|ébahi|émoticône|étonné|gêné|hébété|impressionné|incrédule|incroyable|quoi|rouge|rougissant|stupéfait|visage qui rougit|wow
+😳|chaud|comment|ébahi|émoticône|étonné|gêné|impressionné|incrédule|incroyable|quoi|rouge|visage qui rougit|rougissant|stupéfait|wow
 🥺|embarrassé|excuse|gros yeux|pardon|pitié|s’il te plaît|supplication|supplie|visage implorant|yeux de chiens battus|implorant|yeux de chiot
 🥹|admiration|ému|fierté|gratitude|larmes de joie|pleurs|retenir ses larmes|triste|visage retenant ses larmes
 😦|bouche|déçu|effrayé|émoticône|ouverte|peur|pris au dépourvu|surpris|visage déçu avec bouche ouverte|visage mécontent avec bouche ouverte|béante|renfrogné
@@ -210,7 +211,7 @@
 💛|amour|cœur jaune|sentiment|jaune
 💚|amour|cœur|sentiment|vert
 💙|amour|cœur bleu|sentiment|bleu
-🩵|143|aimer|amour|bleu ciel|bleu clair|bleu sarcelle|cœur bleu clair|cyan|émotion|jtm|mignon|spécial
+🩵|143|aimer|amour|bleu ciel|bleu clair|cœur bleu clair|cyan|émotion|jtm|mignon|spécial
 💜|amour|cœur|sentiment|violet
 🤎|brun|cœur|marron
 🖤|cœur|noir
@@ -554,6 +555,7 @@
 🧑‍🧒|enfant|famille : adulte, enfant|famille monoparentale
 🧑‍🧒‍🧒|enfant|famille : adulte, enfant, enfant|famille monoparentale
 👣|empreintes|pieds nus|traces de pas|pas
+🫆|dermatoglyphe|données biométriques|empreinte digitale|identité|sécurité
 🐵|animal|georges le petit curieux|singe|sourire|tête de singe|visage
 🐒|animal|primate|singe
 🦍|animal|gorille|primate
@@ -663,6 +665,11 @@
 🐚|animal|conque|coquillage|coquille en spirale|mer|plage|spirale
 🪸|corail|océan|réchauffement climatique|récif
 🪼|aïe|animal|aquarium|brûlure|gélatineux|invertébré|marin|méduse|mer|mou|océan|piqûre|plancton|tentacules|vie marine
+🦀|animal|astrologie|cancer|crabe|horoscope|mer|pinces|plage|zodiaque
+🦞|animal|bisque|fruit de mer|fruits de mer|homard|pinces
+🦐|aliment|crevette|crustacé|fruits de mer|nourriture
+🦑|aliment|animal|calamar|encornet|mollusque|nourriture
+🦪|coquillage|coquille|huître|mollusque|perle
 🐌|animal|escargot|jardin|lentement|nature
 🦋|animal|insecte|mignon|papillon|printemps
 🐛|animal|chenille|insecte|jardin
@@ -706,6 +713,7 @@
 🪹|branches|faire son nid|maison|nid vide
 🪺|branches|faire son nid|nid avec œufs|oiseau
 🍄|champignon vénéneux|mario|plante|vénéneux
+🪾|arbre sans feuille|aride|hiver|sécheresse|bois|branches|dénudé|dépouillé|mort|sans feuille|tronc
 🍇|fruit|nourriture|raisin
 🍈|fruit|melon
 🍉|fruit|pastèque|melon d’eau
@@ -744,6 +752,7 @@
 🫚|bière|épice|gingembre|naturel|racine de gingembre|santé
 🫛|cosse de petits pois|edamame|fève|haricot|légume|légumineuse|pois|soja
 🍄‍🟫|automne|brun|cèpe|champignon|fongus|marron|nature|nourriture
+🫜|betterave|jardin|légume|navet|racine|nourriture|radis|salade|végétarien
 🍞|miche|nourriture|pain de mie|baguette
 🥐|croissant|nourriture|pain|petit-déjeuner|viennoiserie
 🥖|baguette|nourriture|pain
@@ -792,14 +801,9 @@
 🍥|croquette de poisson|narutomaki|nourriture|poisson|restaurant|gâteau au poisson|pâté de poisson|surimi avec décoration
 🥮|automne|festival|gâteau de lune|moon cake|yuèbǐng
 🍡|bonbons|brochette de bonbons|dango|dessert|japonais|nourriture|sucré
-🥟|boulette de pâte|dumpling|empanada|gyoza|gyōza|jiaozi|pierogi|potsticker|ravioli
+🥟|boulette de pâte|dumpling|empanada|gyoza|jiaozi|pierogi|potsticker|ravioli|gyōza
 🥠|biscuit chinois|nourriture|prophétie
 🥡|baguettes|boîte à emporter|carton|chinois|nourriture à emporter
-🦀|animal|astrologie|cancer|crabe|horoscope|mer|pinces|plage|zodiaque
-🦞|animal|bisque|fruit de mer|fruits de mer|homard|pinces
-🦐|aliment|crevette|crustacé|fruits de mer|nourriture
-🦑|aliment|animal|calamar|encornet|mollusque|nourriture
-🦪|coquillage|coquille|huître|mollusque|perle
 🍦|cornet de glace|dessert|glace italienne|nourriture|sucré|crème glacée molle
 🍧|coupe de glace|crème glacée|dessert|glace|granité|nourriture|restaurant|sucré|pilée
 🍨|coupe de glace|crème glacée|dessert|glace|nourriture|restaurant|sucré
@@ -885,7 +889,7 @@
 🗽|liberté|new york|statue de la liberté|voyage
 ⛪|bâtiment|chapelle|chrétien|croix|église|religion|voyage
 🕌|islam|mosquée|musulmane|religion|voyage
-🛕|bouddhisme|hindou|pagode|religion|stūpa|temple bouddhiste
+🛕|bouddhisme|hindou|pagode|religion|stupa|temple bouddhiste
 🕍|judaïsme|juif|juive|religion|synagogue|temple|voyage
 ⛩️|religion|sanctuaire shinto|shinto|voyage
 🕋|islam|kaaba|musulmane|religion|voyage
@@ -1040,13 +1044,13 @@
 🌫️|brouillard|brume|fog|météo|nuage
 🌬️|météo|nuage|souffle|vent avec visage|visage du vent
 🌀|cyclone|spirale|tourbillon|typhon|vertige|ouragan
-🌈|arc-en-ciel|bisexuelle|gay pride|homosexuelle|lesbienne|lgbtqia|météo|nature|orgueil|pluie|transgenre
+🌈|arc-en-ciel|bisexuelle|gay pride|homosexuelle|lesbienne|lgbtqia|météo|nature|pluie|transgenre
 🌂|météo|parapluie fermé|pluie|fermé|vêtement
 ⛱️|météo|parapluie au sol|parasol sur le sol|plage|pluie|soleil|voyage
 ⚡|courant|danger|éclair|électricité|haute tension|nature|orage|symbole haute tension|tension|vitesse|électrocuter
 ⛄|bonhomme de neige sans flocons|bonhomme de neige sans neige|froid|neige|sans
 🔥|allumer|brûler|chaud|feu|flamme|fournaise|incendie|outil
-💧|bande dessinée|bd|eau|froid|goutte d’eau|larme|météo|nature|pluie|sueurs froides|tristesse|gouttelette
+💧|bd|eau|froid|goutte d’eau|larme|météo|nature|pluie|sueurs froides|tristesse|bande dessinée|gouttelette
 🌊|eau|kanagawa|lame|large|marée|mer|nature|océan|remous|rouleau|surf|vague
 🎃|citrouille|halloween|lanterne
 🎄|arbre|fêtes|guirlandes|noël|sapin de noël|célébration
@@ -1204,6 +1208,7 @@
 🪘|battement|conga|djembé|instrument|musique|percussions|rythme|tambour
 🪇|cha cha cha|danser|fête|hochet|instrument|maracas|musique|percussion|secouer
 🪈|bois|fanfare|fifre|flûte à bec|flûtiste|instrument|musique|orchestre|piccolo
+🪉|amour|cupidon|harpe|instrument|musique|orchestre
 📱|communication|smartphone|téléphone portable|téléphone cellulaire
 📲|appel entrant|communication|recevoir un appel|smartphone|téléphone portable avec une flèche|téléphone cellulaire précédé par une flèche
 ☎️|téléphone rouge
@@ -1334,6 +1339,7 @@
 🧰|boîte à outils|caisse à outils|coffre|mécanique|mécano|outils
 🧲|aimanter|attirer|attraction|fer à cheval|magnet|magnétique|positif négatif
 🪜|ascension|barreau|échelle|échelon|escabeau|grimper|monter
+🪏|bêche|creuser|pelle|trou
 🧪|chimie|chimiste|expérience|expérimentation|laboratoire|réaction|sciences|tube à essai
 🧫|bactérie|bactériologie|biologie|biologiste|boîte de petri|boîte de pétri|culture|laboratoire|micro-organismes|microbiologie|science
 🧬|adn|biologie|biologiste|évolution|gène|génétique|science|vie
@@ -1477,6 +1483,7 @@
 ➰|bouclette
 ➿|boucle|double boucle
 〽️|alternance|symbole|marque
+🫟|éclaboussure|holi|peinture|tache|dégât|encre|liquide|renversé
 🔠|abcd|alphabet latin|lettres latines|majuscules|saisie en lettres majuscules|latin
 🔡|abcd|alphabet latin|lettres latines|minuscules|saisie de lettres minuscules|latin
 🔢|1234|chiffres|saisie de chiffres|nombres

+ 24 - 17
app/assets/emojis/search-index/gsw.csv

@@ -123,6 +123,7 @@
 😪|gesicht|gute|müde|nacht|schläfrig|smiley|traurig
 🤤|gesicht|sabbern|smiley
 😴|dösen|einschlafen|gähnen|gesicht|gute nacht|langweilig|mittagsschlaf|müde|nickerchen|schlafen|smiley|zzz
+🫩|augenringe|erschöpft|gesicht|müde|schläfrig|smiley|übermüdet
 😷|arzt|atemschutzmaske|bazillen|erkältet|gesicht|krankheit|mundschutz|schutzmaske|smiley|viren|virus
 🤒|fieber|gesicht|krank|messen|smiley|thermometer
 🤕|aua|autsch|gesicht|kopf|schmerzen|smiley|verband|verletzung
@@ -417,8 +418,8 @@
 🫄|aufgebläht|bauch|dicker bauch|person|schwangere person|schwangerschaft|überfressen|zu viel gegessen
 🤱|baby|brust|frau|person|stillen
 👩‍🍼|baby|eltern|flasche gebende frau|frau|füttern|mama|milch|mutter|neugeborenes|person|säugling|weiblich
-👨‍🍼|baby|der baby die flasche gibt|eltern|flasche gebender mann|füttern|kind|mann, der baby die flasche gibt|männlich|milch|neugeborenes|papa|person|säugling|vater
-🧑‍🍼|baby|die baby die flasche gibt|flasche gebende person|frau|füttern|mama|mann|neugeborenes|papa|person, die baby die flasche gibt|säugling|vater
+👨‍🍼|baby|flasche gebender mann|füttern|mann|männlich
+🧑‍🍼|baby|flasche gebende person|person
 👼|engel|gesicht|kind|märchen|putte
 🎅|weihnachten|weihnachtsmann|samichlaus
 🤶|weihnachten|weihnachtsfrau
@@ -453,7 +454,7 @@
 🧌|fantasy|gruslig|kobold|märchen|monster|ork|troll|ungeheuer
 💆|behandlung|die eine kopfmassage bekommt|entspannen|kopfmassage|kopfschmerzen|massage|migräne|person, die eine kopfmassage bekommt|salon|spa|therapie
 💆‍♂️|der eine kopfmassage bekommt|entspannen|kopfmassage|kopfschmerzen|mann, der eine kopfmassage bekommt|massage|salon|männlich
-💆‍♀️|die eine kopfmassage bekommt|frau, die eine kopfmassage bekommt|kopfmassage|weiblich
+💆‍♀️|behandlung|entspannend|frau|gesicht|kopfmassage|kopfschmerzen|kopfweh|lindern|massage|relaxen|salon|spa|therapie|verspannung|weiblich
 💇|friseurin|friseuse|frisörin|frisur|haare|haarschnitt|person beim haareschneiden|schere|coiffeur|friseur(in)|frisör(in)
 💇‍♂️|friseur|frisur|haarschnitt|mann beim haareschneiden|salon|schere|coiffeur|männlich
 💇‍♀️|frau beim haareschneiden|friseur|haarschnitt|schere|coiffeur|weiblich
@@ -478,11 +479,11 @@
 🏃|eilig|joggen|laufende person|läuferin|marathon|person|rennen|schnell|sport
 🏃‍♂️|joggen|jogger|laufender mann|marathon|rennen|männlich
 🏃‍♀️|athletin|frau|joggen|joggerin|laufende frau|läuferin|marathon|rennen|rennerin|rennt|schell|weiblich
-💃|frau|tanzende frau|tänzerin|weiblich
-🕺|mann|tanzender mann|männlich
+💃|elegant|festlich|flair|flamenco|frau|salsa|schwung|tango|tanzen|tänzerin|weiblich
+🕺|elegant|festlich|flair|flamenco|mann|salsa|schwung|tango|tanzen|tänzer|männlich
 🕴️|anzug|geschäftlich|mann|schwebender mann im anzug|männlich
 👯|bunnys|doppelt|hasenohren|leute|party|personen mit hasenohren|seelenverwandt|tanzen|tänzerinnen|zwillinge
-👯‍♂️|bunnys|hasenohren|männer mit hasenohren|party|tanzen|twillinge
+👯‍♂️|bunnys|hasenohren|männer mit hasenohren|party|tanzen|zwillinge
 👯‍♀️|bunnys|frauen mit hasenohren|hasenohren|party|weiblich
 🧖|abschalten|dampfbad|dampfsauna|entspannen|frau|luxuriös|person in dampfsauna|relaxen|sauna|spa
 🧖‍♂️|dampfsauna|mann in dampfsauna|sauna|männlich
@@ -549,11 +550,12 @@
 👥|büsten|personen|silhouette mehrerer büsten
 🫂|abschied|danke|drücken|drücker|freundschaft|hallo|liebe|sich umarmende personen|tschüss|umarmung
 👪|familie|junge|kind|mutter|vater
-🧑‍🧑‍🧒|1 kind|familie: 2 erwachsene, 1 kind
-🧑‍🧑‍🧒‍🧒|2 kinder|familie: 2 erwachsene, 2 kinder
-🧑‍🧒|1 kind|familie: 1 erwachsene(r), 1 kind
-🧑‍🧒‍🧒|2 kinder|familie: 1 erwachsene(r), 2 kinder
+🧑‍🧑‍🧒|erwachsener|familie|kind
+🧑‍🧑‍🧒‍🧒|erwachsener|familie|kind
+🧑‍🧒|erwachsener|familie|kind
+🧑‍🧒‍🧒|erwachsener|familie|kind
 👣|abdruck|auf dem weg|fußabdruck|fußabdrücke|fussabdruck|fussabdrücke
+🫆|fingerabdruck|forensik|identität|sicherheit|abdruck|polizei|täterin
 🐵|affengesicht|banane|dschungel|gesicht|tier|zoo
 🐒|affe|tier
 🦍|affe|gesicht|gorilla|tier
@@ -649,7 +651,7 @@
 🐍|schlangenträger|sternzeichen|tierkreis
 🐲|drachengesicht|gesicht|märchen|tier
 🐉|chinesisch neujahr|drache|märchen|tier
-🦕|brachiosaurus|brontosaurus|dinosaurier|diplodocus|saurier|sauropode|tier
+🦕|brachiosaurus|brontosaurus|dinosaurier|diplodocus|saurier|sauropode
 🦖|dinosaurier|saurier|t-rex|tree|tyrannosaurus rex
 🐳|blasender wal|meer|ozean|tier|wal
 🐋|ozean|tier|wal
@@ -663,6 +665,11 @@
 🐚|muschel|schneckenhaus|strand|tier
 🪸|great barrier reef|klimawandel|korallenriff|meer|ozean|riff|tier
 🪼|autsch|brennen|gallert|glibber|meeresbewohner|meerestier|nesseltier|ozean|qualle|tentakeln
+🦀|krabbe|krebs|meer|sternzeichen|strand|tierkreis
+🦞|hummer|lobster|meeresfrucht|meeresfrüchte|meerestier|scheren|tier
+🦐|garnele|gourmet|krustentier|meeresfrucht|shrimp
+🦑|kalmar|tier|tintenfisch
+🦪|auster|meer|muschel|perle|tauchen|tier
 🐌|langsam|schnecke|tier
 🦋|insekt|schmetterling|schön
 🐛|gefräßig|insekt|raupe|tier|gefrässig
@@ -706,6 +713,7 @@
 🪹|heim|leeres nest|nestbau|nisten|vogelnest|zuhause
 🪺|heim|nest mit blauen eiern|nest mit eiern|nestbau|nisten|vogelnest|zuhause
 🍄|fliegenpilz|giftig|pilz
+🪾|kahler baum|karg|trocken|winter|baum ohne blätter|blätterlos|dürre|herbst
 🍇|frucht|obst|trauben|wein
 🍈|cantaloupe|frucht|honigmelone|melone|obst
 🍉|frucht|melone|obst|wassermelone
@@ -744,6 +752,7 @@
 🫚|gesund|gewürz|ginger ale|ingwerbier|scharf|wurzel|würzig|ginger beer|ingwerwurzel
 🫛|bohne|edamame|erbsenschote|essen|gemüse|hülsenfrucht|hülsenfrüchte|schote
 🍄‍🟫|braun|essen|fungus|gemüse|lebensmittel|natur|pflanze|pilz|wald
+🫜|bete|garten|gemüse|rote bete|rübe|wurzel|beete|randen|radieschen
 🍞|brotlaib|essen|kohlenhydrate|laib brot|toast|weißbrot|weizen|weissbrot
 🥐|corissant|croissant|französisch|frühstückshörnchen|brot
 🥖|baguette|brot|französisch|frühstück
@@ -795,11 +804,6 @@
 🥟|chinesische teigtasche|dumpling|empanada|essen|gyōza|jiaozi|kloß|pierogi|potsticker|teigtasche|kloss
 🥠|essen|glückskeks|prophezeiung
 🥡|chinesisches essen|essen|stäbchen|takeaway-box|takeaway-schachtel
-🦀|krabbe|krebs|meer|sternzeichen|strand|tierkreis
-🦞|hummer|lobster|meeresfrucht|meeresfrüchte|meerestier|scheren|tier
-🦐|garnele|gourmet|krustentier|meeresfrucht|shrimp
-🦑|kalmar|tier|tintenfisch
-🦪|auster|meer|muschel|perle|tauchen|tier
 🍦|eis|softeis
 🍧|eis|sorbet|wassereis|zerstoßen|zerstossen
 🍨|eisbecher|eiscreme|eisdiele
@@ -1204,6 +1208,7 @@
 🪘|afrikanische trommel|conga|handtrommel|instrument|musikinstrument|rhythmus|trommeln
 🪇|cha-cha-cha|instrument|maracas|musikinstrument|musizieren|party|percussion|rasseln|tanzen|schütteln|trommel
 🪈|band|blaskapelle|flöte|holzblasinstrument|instrument|musikinstrument|musizieren|orchester|spielmannszug|blockflöte|pfeife
+🪉|amor|cupido|harfe|instrument|liebe|musik|orchester
 📱|handy|iphone|mobiltelefon|smartphone|telefonieren
 📲|anrufen|handy|iphone|kommunikation|mobiltelefon mit pfeil|pfeil|whatsapp
 ☎️|anrufen|festnetz|telefon
@@ -1334,6 +1339,7 @@
 🧰|box|handkasten|kasten|kiste|mechaniker|rote kiste|werkzeugkasten|werkzeugkiste|werkzeugkoffer
 🧲|anziehungskraft|hufeisen|magnetisch|pole|positiv negativ|u-form
 🪜|hochsteigen|holzleiter|klettern|leiter|sprosse|stufe
+🪏|graben|loch|schippe|spaten|ausgraben|schaufeln|vergraben
 🧪|chemie|chemikalie|chemiker|experiment|labor|reagenzglas|substanz|versuche|wissenschaft
 🧫|bakterienkultur|biologe|biologie|biologin|kultur|labor|petrischale|pipette|probe
 🧬|biologe|biologie|biologin|dna|dns|evolution|genetik|genmanipulation|leben
@@ -1477,6 +1483,7 @@
 ➰|schleife|looping
 ➿|blau|doppelschleife|rechteck|schleife
 〽️|japanisch|teilalternationszeichen|zeichensetzung
+🫟|farbe|fleck|holi|klecks|spritzer|tinte|farbklecks|kleckern|verschütten
 🔠|abcd|buchstaben|großbuchstaben|großschreiben|eingabesymbol lateinische grossbuchstaben|grossbuchstaben|lateinische grossbuchstaben
 🔡|eingabesymbol lateinische kleinbuchstaben|kleinbuchstaben|lateinische kleinbuchstaben
 🔢|1234|eingabesymbol|symbol|zahlen|ziffern
@@ -1513,7 +1520,7 @@
 🈳|chinesisches schriftzeichen|japanisches schriftzeichen|leer|schriftzeichen für leer|schriftzeichen für zimmer frei|zimmer frei
 🈺|betrieb|chinesisches schriftzeichen|geöffnet|japanisches schriftzeichen|schriftzeichen für betrieb|schriftzeichen für geöffnet
 🈵|belegt|besetzt|chinesisches schriftzeichen|fülle|japanisches schriftzeichen|kanji|kein zimmer frei|schriftzeichen für fülle|schriftzeichen für kein zimmer frei
-🔴|ball|großer roter kreis|kreis|punkt|roter punkt|grosser roter kreis
+🔴|ball|punkt|roter punkt|grosser roter kreis|kreis
 🟠|form|kreis|orange scheibe|oranger kreis|oranger punkt|punkt
 🟡|form|gelbe scheibe|gelber kreis|gelber punkt|kreis|punkt|scheibe
 🟢|form|grüne scheibe|grüner kreis|grüner punkt|kreis|punkt

+ 54 - 46
app/assets/emojis/search-index/hu.csv

@@ -84,7 +84,7 @@
 😍|arc|mosolygó arc szív alakú szemmel|szem|szerelem|szerelmes|szívek|szmájli
 🤩|arc|azta|csillagos szemű|csillagszemű|elbűvölt|elragadtatott|fülig ér a szája|hű|izgatott|szemek|szmájli|vigyorgó|vigyorog
 😘|arc|csókot dobó arc|flörtöl|puszi|szeretlek|szív|szmájli
-😗|arc|csókoló arc|puszi|szmájli
+😗|arc|csókoló arc|flört|puszi|randi|szerelem|szmájli
 ☺️|arc|boldog|mosolygó arc|nyugodt|örül|szmájli
 😚|arc|behunyt szem|csókoló arc lehunyt szemmel|csókot dob|csukott szem|lehunyt szem|puszit dob|szmájli
 😙|arc|csókoló arc mosolygó szemmel|puszi|szem|szmájli
@@ -98,7 +98,7 @@
 🤗|arc|kezek|ölelés|szmájli
 🤭|arc szájra tett kézzel|hirtelen ráébred|hirtelen rájön|hoppá|kéz a száj előtt arc|kuncog|nevet|röhög|rötyög|szmájli|titok|vihog
 🫢|áhítat|ámulat|arc|csend|elakadt lélegzet|előtt|félelem|hitetlenkedés|kéz|meglepetés|nyitva|omg|sokk|száj|szemek|zavar
-🫣|bámul|kémlelő szemű arc|kukucskál|megbabonázott|pillant
+🫣|bámul|ijedt|kémlelő szemű arc|kukucskál|megbabonázott|pillant|riadt|szégyenlős
 🤫|arc|csend|csitító arc|csitt|csöndesen|csöndre int|elhallgattat|halkan|maradj csendben|pszt|szmájli
 🤔|arc|elgondolkodó|gondolkodó arc|gondolkozik|megfontol|szmájli|tűnődő
 🫡|derűs|igen|katonák|oké|tisztelgés|tisztelgő arc
@@ -116,13 +116,14 @@
 😮‍💨|arc|fáradt|füst|fütty|kifúj|kilégzés|kimerült|levegőt kifújó arc|megkönnyebbülés|sóhajtás|suttogás|zihálás
 🤥|arc|hazudik|hazudó fej|hazudós|hazug|hosszú orr|orr|pinokkió|szmájli
 🫨|arc|földrengés|meglepődés|rázkódó|rezeg
-🙂‍↔️|nem, fejrázás|vízszintesen rázkódó arc
-🙂‍↕️|bólintás, igen|függőlegesen rázkódó arc
+🙂‍↔️|fejcsóválás|fejrázás|nem|vízszintes
+🙂‍↕️|bólintás|fej|függőleges|igen
 😌|arc|béke|békés|megkönnyebbült|nyugodt|szmájli
 😔|arc|borzasztó|csalódott|elgondolkodó|elkeseredett|rossz|szmájli|szomorú|tűnődő|unott|veszít
 😪|álmos|arc|ásít|fáradt|sír|szmájli|szomorú
 🤤|arc|fej|folyik a nyála|nyáladzó|szmájli
 😴|álmos|alszik|alvás|alvó arc|arc|fáradt|jó éjszakát|jó éjt|lefekvés ideje|szmájli|szundi|zzz
+🫩|álmos|arc|elnyűtt|fáradt|késő|kifáradt|kimerült|szemek|táskás|unatkozik
 😷|arc egészségügyi maszkkal|betegség|egészségügyi maszk|gyógyszer|maszk|orvos|szmájli
 🤒|arc lázmérővel|beteg|láza van|lázas|lázmérő|szmájli
 🤕|arc bekötött fejjel|beütötte a fejét|fáj|fej|kötés|sérülés|szmájli
@@ -217,19 +218,19 @@
 🩶|ezüst|pala|szív|szürke
 🤍|fehér|szív
 💋|ajkak|csóknyom|romantika|rúzsfolt|rúzsnyom|szenvedély
-💯|100|szám|száz pont|teljes pontszám
+💯|100|a+|aha|egyértelműen|egyetértés|hűséges|igazság|megtartás|mindenképpen|mutatás|remek|száz|találat|teljes|tökéletes
 💢|a düh szimbóluma|dühös|képregény|mérges
 💥|bumm|csattanás|képregény|robbanás|ütközés
 💫|csillagokat lát|fényes|hullócsillag|képregény|szédülés
-💦|cseppek|csobbanás|izzadságcseppek|képregény|víz
+💦|cseppek|csobbanás|edzés|fröccsenés|izzadságcseppek|képregény|víz
 💨|elillan|ereget|ereszt|felhő|füst|futás|gyors|képregény|pukizik|púzik|rohanás|szellent
 🕳️|lyuk
 💬|beszéd|buborék|gépel|képregény|párbeszéd|sms|szövegbuborék|üzenet
 👁️‍🗨️|párbeszéd|szem szövegbuborékban|szövegbuborék|tanú
-🗨️|balra nyíló szövegbuborék|beszéd|buborék|képregény|párbeszéd|szövegbuborék
-🗯️|buborék|dühös|jobbra nyíló dühös szövegbuborék|képregény|mérges|szövegbuborék
+🗨️|balra nyíló szövegbuborék|beszéd|buborék|párbeszéd|szövegbuborék
+🗯️|buborék|dühös|jobbra nyíló szövegbuborék|mérges|szövegbuborék
 💭|álmodozik|álom|buborék|felhő|gondolatbuborék|gondolkozik|képregény|ötlet
-💤|álmos|alszik|alvás|fáradt|képregény|zzzz
+💤|álmos|alszik|alvás|éjszaka|fáradt|jó éjszakát|képregény|zzz
 👋|hello|integetés|integető kéz|kéz|szia|test|viszlát
 🤚|felemelt|kézfej
 🖐️|állj|felemelt kéz szétálló ujjakkal|kéz|ne tovább|stop|szétálló|test|ujj
@@ -301,7 +302,7 @@
 🧔|szakállas ember
 🧔‍♂️|férfi: szakáll|szakáll
 👱‍♂️|férfi|szőke
-👩|hölgy|nő|szőke
+👩|felnőtt|hölgy|nő
 🧔‍♀️|nő: szakáll|szakáll
 👱‍♀️|nő|szőke
 🧓|idősebb felnőtt|nemi szempontból semleges|öreg
@@ -319,7 +320,7 @@
 🙆|beleegyezés mutatása|kézjel|oké|rendben|tornázik
 🙆‍♂️|beleegyezést mutató férfi|férfi|gesztus|kézmozdulat|oké|rendben|tornázik
 🙆‍♀️|beleegyezést mutató nő|gesztus|kézmozdulat|nő|oké
-💁|ember az információs pultnál|információ|kéz|nyitott tenyér|nyitott tenyerű nő|segítség
+💁|borravaló|ember|kéz|mindegy|nyitott tenyér|pletyka|szarkasztikus|szarkazmus|szemtelen
 💁‍♂️|férfi|információ|nyitott tenyér|nyitott tenyerű férfi|segítség
 💁‍♀️|információ|nő|nyitott tenyér|nyitott tenyerű nő|segítség
 🙋|boldog|én tudom|felemeli a kezét|integet|intés|jelentkezik|kézmozdulat|vidáman intő ember
@@ -347,8 +348,8 @@
 👨‍🏫|férfi|foglalkozás|oktató|professzor|tanár
 👩‍🏫|foglalkozás|nő|oktató|professzorasszony|tanárnő|tanítónő
 🧑‍⚖️|bíró / bírónő|mérleg
-👨‍⚖️|bíró|igazság, ítél, férfi, mérleg, foglalkozás
-👩‍⚖️|bíró, igazság, mérleg, nő|bírónő|foglalkozás|ítél
+👨‍⚖️|bíró|férfi|igazság|mérleg|törvény
+👩‍⚖️|bíró|igazság|mérleg|nő|törvény
 🧑‍🌾|földműves|gazda / női gazda|növénytermesztő
 👨‍🌾|farmer|férfi|foglalkozás|földműves|gazda|kertész
 👩‍🌾|farmer|foglalkozás|földműves|gazda|kertész|női gazda
@@ -423,7 +424,7 @@
 🎅|arc|fej|karácsony|mikulás|télapó|ünneplés
 🤶|anyó|karácsony|mikulás felesége|mikulás ruhás anyó|ünnep
 🧑‍🎄|ember|karácsony|mikulás|sapka|télapó|ünnepek
-🦸|batman|ember|hős|jó|superman|szupererő|szuperhős|szuperképesség
+🦸|hős|jó|szupererő|szuperhős|szuperképesség
 🦸‍♂️|férfi szuperhős|hősnő|jó|szuperképesség
 🦸‍♀️|hősnő|jó|női szuperhős|szuperképesség
 🦹|bűnöző|ember|főgonosz|gazember|gonosztevő|rossz|szupererő|szupergonosz|szuperképesség
@@ -478,8 +479,8 @@
 🏃|futás|futó|gyors|maraton|siet|sport
 🏃‍♂️|férfi|futás|futó férfi|maraton|verseny
 🏃‍♀️|futás|futónő|gyorsaság|maraton|női futó|sebesség|siet|sport|verseny
-💃|nő|táncoló|táncosnő
-🕺|férfi|táncoló férfi|táncos
+💃|nő|salsa|táncoló|táncosnő|tangó
+🕺|férfi|flamenco|salsa|táncoló férfi|táncos|tangó
 🕴️|lebegő ember|öltönyös, lebegő ember|üzletember
 👯|bulizó emberek|lányok|nő|nyuszifül|parti
 👯‍♂️|buil|bulizó férfiak|férfiak|ikrek|nyuszifül|partizik|party|táncol|táncos
@@ -539,25 +540,26 @@
 🛀|fürdés|fürdik|fürdő ember|fürdőkád
 🛌|ágy|álmos|alszik|alvás|ember az ágyban|szálloda
 🧑‍🤝‍🧑|egymás kezét fogó emberek|fogás|kézenfogva|pár
-👭|barátnők|barátok|barátság|gyerekek|húg|kézen fogva álló nők|kislányok|lányok|legjobb barátnők|leszbikus|lgbt|lmbt|nők|nővér|pár|randevú|randi|szövetség|testvérek
+👭|barátnők|barátok|barátság|gyerekek|húg|kézen fogva álló nők|kislányok|lányok|legjobb barátnők|nők|nővér|pár|randevú|randi|szövetség|testvérek
 👫|barátok|férfi|fiú|kéz a kézben|kézen fogva álló férfi és nő|lány|nő|pár|randevú|randi|szerelem|szerelmesek
-👬|barátok|barátság|báty|férfiak|fiúk|homoszexuális|ikrek|kézen fogva álló férfiak|lgbt|lmbt|meleg|öcs|pár|randevú|randi|testvérek
+👬|barátok|barátság|báty|férfiak|fiúk|ikrek|kézen fogva álló férfiak|öcs|pár|randevú|randi|testvérek
 💏|barátnő|csók|évforduló|pár|randevú|randi|romantika|szerelem|szív
 💑|csók|évforduló|pár szívvel|romantika|szerelem|szív
 🗣️|arc|beszéd|beszélő fej|fej|sziluett
 👤|árnyék|ember sziluettje melltől felfelé|mellszobor|sziluett
 👥|emberek|két ember sziluettje melltől felfelé|mellszobor|sziluett
 🫂|barátság|egymást ölelő emberek|helló|köszönet|ölelés|ölelkezés|ölelkező emberek|szerelem|üdv|viszlát
-👪|anya|anyuka|apa|apuka|család|fiú|gyermek|kisfiú
-🧑‍🧑‍🧒|család: felnőtt, felnőtt, gyerek|felnőtt|gyerek
-🧑‍🧑‍🧒‍🧒|család: felnőtt, felnőtt, gyerek, gyerek|felnőtt|gyerek
-🧑‍🧒|család: felnőtt, gyerek|gyerek
-🧑‍🧒‍🧒|család: felnőtt, gyerek, gyerek|gyerek
+👪|család|gyerek
+🧑‍🧑‍🧒|család|felnőtt|gyerek
+🧑‍🧑‍🧒‍🧒|család|felnőtt|gyerek
+🧑‍🧒|család|felnőtt|gyerek
+🧑‍🧒‍🧒|család|felnőtt|gyerek
 👣|lábnyomok|mezítláb|nyomok|úton
+🫆|biztonság|bűncselekmény|lenyomat|nyomozó|nyomravezető jel|rejtély|személyazonosság|törvényszék|ujjlenyomat
 🐵|állat|fej|majomfej
-🐒|állat|kismajom|majom
+🐒|állat|banán|majom
 🦍|állat|gorilla
-🦧|emberszabású majom|majom|orangután
+🦧|állat|emberszabású majom|majom|orangután
 🐶|állat|fej|kedvenc|kisállat|kiskutya|kutyafej
 🐕|állat|háziállat|kisállat|kutya
 🦮|akadálymentesség|vakvezető kutya
@@ -578,7 +580,7 @@
 🫏|állat|csacsi|emlős|makacs|öszvér|szamár
 🐎|állat|derbi|fogadás|lovaglás|lovassport|lóverseny|lovi|sportfogadás|versenyló|versenyzés
 🦄|egyszarvú|fej|unikornisfej
-🦓|csík|zebra, állat, csík, csíkos
+🦓|állat|csíkos|zebra
 🦌|agancs|állat|szarvas
 🦬|állat|bölény|csorda
 🐮|állat|fej|tehénfej|tej
@@ -595,8 +597,8 @@
 🐪|állat|dromedár|egypúpú teve|púposteve|sivatag|teve
 🐫|állat|kétpúpú teve|púposteve|sivatag|teve
 🦙|állat|alpaka|guanako|guanakó|gyapjas|gyapjú|láma|vicuña
-🦒|foltok|zsiráf, állat, foltok, foltos
-🐘|állat|elefánt|ormány
+🦒|állat|foltos|zsiráf
+🐘|állat|elefánt
 🦣|állat|gyapjas|kihalt|mamut|nagy|ormányos
 🦏|állat|orrszarvú|rinocérosz
 🦛|állat|víziló
@@ -608,7 +610,7 @@
 🐇|állat|háziállat|kedvenc|kisállat|nyúl|nyuszi
 🐿️|állat|mogyoró|mókus
 🦫|állat|fog|gát|hód
-🦔|állat|sün, sündisznó, süni, tüske, tüskés|tüskés
+🦔|állat|sündisznó|tüskés
 🦇|állat|denevér|drakula|vámpír
 🐻|állat|fej|maci|medvefej
 🐻‍❄️|fehér|jegesmedve|medve|sarkvidék
@@ -652,17 +654,22 @@
 🦕|állat|brachiosaurus|brontosaurus|dínó|dinoszaurusz|diplodocus|kihalt|őslény|sauropoda
 🦖|állat|dínó|dinoszaurusz|kihalt|őslény|t-rex|t. rex|t.-rex|tyrannosaurus rex
 🐳|állat|bálna|fej|fröcskölés|fröcskölő bálna
-🐋|állat|bálna
-🐬|állat|delfin
+🐋|állat|bálna|óceán|tengerpart
+🐬|állat|delfin|flipper|óceán|tengerpart
 🦭|állat|fóka|oroszlánfóka|tenger
 🐟|állatöv|csillagjegy|étel|halak|halászat|halászik|horoszkóp
 🐠|állat|díszhal|hal|trópusi
 🐡|állat|gömbhal|hal
 🦈|állat|cápa|hal
-🐙|állat|oktopusz|polip
+🐙|állat|óceán|oktopusz|polip
 🐚|kagyló|spirális|tengeri csiga|tengerpart
 🪸|korallzátony|óceán|zátony
 🪼|csíp|gerinctelen|jaj|kocsonyás|medúza|szúrószerv|tengeri
+🦀|állatöv|csillagjegy|rák
+🦞|állat|homár|ollók|rákleves|tenger gyümölcsei|tengeri étel
+🦐|étel|garnélarák|kicsi|rák|tengeri
+🦑|állat|étel|tintahal
+🦪|búvárkodás|gyöngy|osztriga
 🐌|állat|csiga|lassú
 🦋|állat|lepke|pillangó|rovar|szép
 🐛|állat|bogár|hernyó|kukac|rovar|százlábú
@@ -706,13 +713,14 @@
 🪹|fészekrakás|üres fészek
 🪺|fészek tojásokkal|fészekrakás|tojások
 🍄|gomba|növény
+🪾|ágak|csupasz|faanyag|halott|kiszáradt|levél nélküli|tél|terméketlen|törzs
 🍇|étel|gyümölcs|növény|szőlő
 🍈|étel|gyümölcs|növény|sárgadinnye
 🍉|dinnye|étel|görögdinnye|gyümölcs|növény
-🍊|étel|gyümölcs|mandarin|narancs|növény
+🍊|c-vitamin|gyümölcs|mandarin|narancs|nektarin|növény
 🍋|citrom|citrusféle|étel|gyümölcs|keserű|növény
 🍋‍🟩|citrus|friss|gyümölcs|koktél|lé|lime|margarita|mojito|salsa|tequila|trópusi|zöld
-🍌|banán|étel|gyümölcs|majom|növény
+🍌|banán|gyümölcs|kálium
 🍍|ananász|étel|gyümölcs|növény
 🥭|déligyümölcs|étel|gyümölcs|mangó|trópusi
 🍎|alma|egészség|érett|étel|gyümölcs|növény|piros
@@ -744,6 +752,7 @@
 🫚|fűszer|gyökér|gyömbérgyökér|sör
 🫛|bab|borsóhüvely|edamame|hüvelyes|zöldség
 🍄‍🟫|barna gomba|étel|gomba|portobello|szarvasgomba|természet|vega|vegán|vegetariánus
+🫜|cékla|étel|fehérrépa|gyökér|kert|retek|saláta|vegetáriánus|zöldség
 🍞|étel|kenyér|vekni
 🥐|croissant|étel|francia|kifli|péksütemény|péksüti|reggeli
 🥖|bagett|étel|francia|kenyér
@@ -761,7 +770,7 @@
 🍟|étel|gyorsétel|gyorskaja|hasábburgonya|krumpli|sült krumpli|sültkrumpli
 🍕|étel|pepperoni|pizza|sajtos|szelet
 🌭|étel|hot dog|hotdog|kifli|kolbász|mustár|virsli
-🥪|kenyér|szendvics, kenyér, étel
+🥪|kenyér|szendvics
 🌮|étel|mexikói|taco
 🌯|burrito|étel|mexikói
 🫔|étel|felcsavart|mexikói|tamale
@@ -777,7 +786,7 @@
 🍿|étel|kukorica|mozi|pattogatott kukorica
 🧈|tejtermék|vaj
 🧂|dühös|fűszer|íz|sószóró
-🥫|konzerv étel, konzerv, készétel, étel|konzervdoboz
+🥫|étel|konzerv
 🍱|bento|doboz|ételdoboz|japán ételdoboz
 🍘|étel|japán|keksz|rizskeksz
 🍙|étel|golyó|japán|rizsgolyó
@@ -795,11 +804,6 @@
 🥟|batyu|étel|gombóc|gyoza|japán|jiaozi|kínai|pierogi|tészta|töltött
 🥠|desszert|édesség|étel|jóslás|jóslat|szerencsesüti
 🥡|doboz|elviteles doboz|elviteles papírdoboz|elvitelre|étel házhozszállítás|evőpálcika|kínai|pálcika
-🦀|állatöv|csillagjegy|rák
-🦞|állat|homár|ollók|rákleves|tenger gyümölcsei|tengeri étel
-🦐|étel|garnélarák|kicsi|rák|tengeri
-🦑|állat|étel|tintahal
-🦪|búvárkodás|gyöngy|osztriga
 🍦|desszert|édesség|étel|fagyi|fagylalt|gépi fagylalt|lágyfagylalt|tölcséres fagylalt
 🍧|desszert|édesség|étel|fagyi|fagylalt öntettel|öntet
 🍨|desszert|édesség|étel|fagyi|fagylaltkehely
@@ -1139,7 +1143,7 @@
 🧣|hideg|nyak|ruházat|sál
 🧤|kesztyű, kék kesztyű, kéz|kéz
 🧥|dzseki|hideg|kabát|ruházat|télikabát
-🧦|harisnya|zokni, harisnya
+🧦|harisnya|zokni
 👗|ruha|ruházat|vásárlás
 👘|japán|kimonó|ruha|ruházat
 🥻|indiai ruha|ruha|ruházat|szári
@@ -1177,7 +1181,7 @@
 💎|drágakő|ékkő|ékszer|eljegyzés|értékes|esküvő|gyémánt|romantika
 🔇|csendes|elnémított hangszóró|hangerő|hangszóró|néma|némított
 🔈|hangerő|hangszóró
-🔉|alacsony hangerő|bekapcsolt hangszóró|hangerő|hangszóró
+🔉|hangerő|hangszóró|közepes
 🔊|hangos|hangszóró|nagy hangerő|zene
 📢|hangosbeszélő|kikiált|közhírré tesz|közlemények|megafon
 📣|hangosbeszélő|megafon|szurkolás
@@ -1204,6 +1208,7 @@
 🪘|dob|hangszer|hosszú dob|konga|ritmus|ütem
 🪇|csörgő|hangszer|ráz|rumbatök|ütőhangszer|zene
 🪈|blockflöte|fafúvós|fife|furulya|fuvola|zene
+🪉|ámor|hangszer|hárfa|szerelem|zenekar
 📱|kommunikáció|mobiltelefon|rádiótelefon|telefon
 📲|hívás|kommunikáció, hívásfogadás|mobiltelefon nyíllal|nyíl|rádiótelefon|telefon
 ☎️|telefon
@@ -1264,7 +1269,7 @@
 💷|bankjegy|bankó|font|gazdag|készpénz|papírpénz|pénznem|valuta
 💸|bankjegy|bankó|dollár|fizet|készpénz|kifizet|papírpénz|pénz szárnyakkal|repülés|szárnyak
 💳|bankkártya|fizet|hitelkártya|kártya
-🧾|bizonyíták|bizonyíték|bizonylat|könyvelés|nyugta|pénzügyek|számla|számvitel
+🧾|bizonyíték|bizonylat|könyvelés|nyugta|pénzügyek|számla|számvitel
 💹|bank|diagram|emelkedés|felfelé|jen|növekedés|növekvő jendiagram|pénznem|piac|trend|valuta
 📧|e-mail|email|levél
 📨|beérkező|bejövő|boríték|e-mail|fogadás|kézbesíteni|küldött|levél|posta
@@ -1334,6 +1339,7 @@
 🧰|barkácsolás|doboz|láda|piros doboz|szerelő|szerszámok|szerszámos doboz|szerszámos láda|szerszámosláda
 🧲|mágneses|negatív|patkómágnes|pozitív|vonzás|vonzódás
 🪜|fok|létrafok|mászás
+🪏|ásó|elás|hó|kert|lapát|lyuk|ültet
 🧪|kémcső|kémia|kísérlet|laboratórium|tudomány|vegyészet|vegyi anyag|vegyipar
 🧫|baktérium|biológia|biológus|laboratórium|petri-csésze|tenyészet|tenyésztés
 🧬|biológia|biológus|dns|élet|evolúció|fejlődés|gének|genetika|tudomány
@@ -1457,7 +1463,7 @@
 🔅|fényerő|sötétítés gomb
 🔆|fényerő|világosítás gomb
 📶|antennasávok|mobiltelefon|térerő
-🛜|hálózat|internet|számítógép|vezeték nélküli
+🛜|hálózat|hotspot|internet|kapcsolat|okostelefon|router|számítógép|szélessávú|vezeték nélküli|wi-fi|wifi|wlan
 📳|mobiltelefon|rádiótelefon|rezgés|rezgő mód|telefon|tiltott
 📴|kikapcsolva|mobiltelefon|rádiótelefon|telefon|tiltott
 ⚧️|transznemű szimbólum
@@ -1477,6 +1483,7 @@
 ➰|hurok
 ➿|dupla|hurok
 〽️|jel|részelválasztó|választó
+🫟|csepp|festék|folt|folyadék|fröccsenés|kiömlik|rendetlenség|tinta
 🔠|abcd|betűk|bevitel|latin|nagybetűs
 🔡|abcd|betűk|bevitel|kisbetűs|latin
 🔢|1234|bevitel|számbevitel|számok
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|anglia
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|skócia
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🇨🇶|sark

+ 95 - 88
app/assets/emojis/search-index/it.csv

@@ -66,50 +66,50 @@
 〰️|onda|ondulato|trattino
 ㊗️|cinese|congratulazioni|giapponese|ideogramma giapponese di congratulazioni
 ㊙️|cinese|giapponese|ideogramma giapponese di segreto|segreto
-😀|allegria|allegro|denti|faccina che ride|faccina che sogghigna|faccina con un gran sorriso|felice|molto felice|risata|sogghignare|sogghigno|sorriso
-😃|bocca aperta|che bello|contento|denti|evvai|faccina che ride|faccina con un gran sorriso e occhi spalancati|faccina sorridente|felice|felicità|ottimo|ridere|risata|sorridere|sorriso a bocca aperta|urrà
+😀|allegria|allegro|denti|faccina con un gran sorriso|felice|molto felice|risata|sogghignare|sogghigno|sorriso
+😃|bocca aperta|che bello|contento|denti|evvai|faccina con un gran sorriso e occhi spalancati|felice|felicità|ottimo|ridere|risata|sorridente|sorridere|sorriso a bocca aperta|urrà
 😄|a crepapelle|bene|bocca aperta|faccina che ride|faccina con un gran sorriso e occhi sorridenti|faccina felice|felicità|occhi felici|ridere|risata|sorriso a bocca aperta
 😁|denti|faccina che ride|faccina che sogghigna|faccina raggiante con occhi felici|molto felice|occhi felici|risata|sogghignare|sogghigno con occhi felici|sorriso
 😆|ahahah|bocca aperta|faccina felice|faccina sorridente|felicissimo|lol|occhi chiusi|ridere|risata|sorridente|sorriso a bocca aperta con occhi chiusi
-😅|emozionato|faccina con un gran sorriso e goccia di sudore|faccina sudata che ride|felice|goccia|nervoso|sollevato|sollievo|sorriso con goccia di sudore|sorriso teso|stressato|sudore
-🤣|ahah|crepapelle|divertente|esilarante|faccina che ride|faccina che si rotola|felice|felicissimo|lacrime dal ridere|lmao|lol|molto felice|occhi chiusi|ridere a crepapelle|ridicolo|risata|rofl
-😂|ahahaha|che ridere|contentissimo|contento|faccina che piange dal ridere|faccina con lacrime di gioia|felice|felicissimo|felicità|gioia|lacrima|lacrime di gioia|lol|piangere dal ridere|ridere|risata|rofl
+😅|emozionato|faccina con un gran sorriso e goccia di sudore|felice|goccia|nervoso|sollevato|sollievo|sorriso con goccia di sudore|stressato|sudore|teso
+🤣|ahah|crepapelle|divertente|esilarante|faccia che si rotola|faccina che ride|felice|felicissimo|lacrime dal ridere|lmao|lol|molto felice|occhi chiusi|ridere a crepapelle|ridicolo|risata|rofl
+😂|ahahaha|che ridere|contentissimo|contento|faccina che piange dal ridere|felice|felicissimo|felicità|gioia|lacrima|lacrime di gioia|lol|piangere dal ridere|ridere|risata|rofl
 🙂|contento|faccina che sorride|faccina con sorriso accennato|felice|mezzo sorriso|ok|sorrisetto|sorriso a bocca chiusa|sorriso accennato|va bene
 🙃|ah ah ah|ahahah|arrabbiato|capovolto|faccina|sarcastico|scombussolata|sottosopra|triste
-🫠|afa|caldo|dissolversi|faccina che si scioglie|faccina che si squaglia|liquefarsi|liquido|sciogliendo|sciogliersi|sciolto|sparire|squagliando|squagliarsi
+🫠|afa|caldo|dissolversi|faccina che si scioglie|liquefarsi|liquido|sciogliendo|sciogliersi|sciolto|sparire|squagliando|squagliarsi
 😉|capirsi|faccina che fa l’occhiolino|fare l’occhiolino|flirtare|intesa|occhiolino|sexy|strizzare l’occhio
 😊|arrossire|bocca|faccina con occhi sorridenti|felice|felicità|imbarazzato|occhi sorridenti|sorriso|timido
-😇|angelo|angioletto|aureola|faccina con aureola|faccina con sorriso e aureola|faccina sorridente con aureola|innocente|santarellino|santo|sorriso con aureola|spirito
+😇|angelo|angioletto|aureola|faccina sorridente con aureola|innocente|santarellino|santo|sorriso con aureola|spirito
 🥰|amore|cotta|cuoricini|faccina|innamoramento|sorriso|ti amo
 😍|amore|cuore|faccina con sorriso e occhi a cuore|innamorato|occhi a cuore|romantico|sorriso con occhi a cuore
-🤩|colpo di fulmine|emozionante|emozionato|faccia sorridente|faccina con le stelle|felice|figata|figo|occhi a stella|stelle|stelline|wow
-😘|amore|bacetti|bacini|bacio|buona notte|cuore|faccina che dà i baci|faccina che manda baci|faccina che manda un bacio|faccina con bacio|innamorato|mandare baci|mi manchi|smack|ti amo|ti voglio bene
+🤩|emozionante|emozionato|faccia sorridente|faccina con le stelle|felice|figata|figo|occhi a stella|stelline|wow
+😘|amore|bacetti|bacini|buona notte|cuore|faccina che manda baci|innamorato|mandare baci|mi manchi|smack|ti amo|ti voglio bene
 😗|appuntamento|bacio|bocca|buona notte|faccina che manda bacio|flirt|sbaciucchiare
 ☺️|contorno faccina sorridente|delineata|emozionarsi|faccina|felice|rilassata|sorridente
 😚|amore|bacetti|bacio a occhi chiusi|buona notte|faccina che bacia con occhi chiusi|occhi chiusi|ti amo|ti voglio bene|tvb
 😙|appuntamento|bacetti|buona notte|faccina che manda baci|occhi chiusi|occhi sorridenti|sorriso
 🥲|commosso|dolore|emozionato|faccina sorridente con lacrima|felice|lacrima|orgoglioso|rincuorato
-😋|buonissimo|buono|che buono|cibo delizioso|faccina che fa la lingua|faccina che si lecca i baffi|faccina con lingua|gnam|golosa|goloso|leccarsi i baffi|slurp
+😋|buonissimo|buono|che buono|cibo delizioso|faccina che si lecca i baffi|gnam|golosa|goloso|leccarsi i baffi|slurp
 😛|bello|faccina che fa la linguaccia|faccina che mostra la lingua|faccina con lingua fuori|fantastico|lingua fuori|linguaccia
-😜|barzelletta|divertente|faccina che fa l’occhiolino e mostra la lingua|faccina che fa la lingua|lingua fuori con occhiolino|linguaccia con occhiolino|occhiolino|pazzerello|pazzo|scherzo|sto scherzando|strano|yolo
+😜|barzelletta|divertente|faccina che fa l’occhiolino e mostra la lingua|lingua fuori con occhiolino|linguaccia con occhiolino|occhiolino|pazzerello|pazzo|scherzo|sto scherzando|strano|yolo
 🤪|faccina con occhi pazzi|faccina impazzita|faccina pazza|grande|inquietante|occhi diversi|occhio|pazzo|piccolo|sclerato
 😝|bleah|faccina che strizza gli occhi e mostra la lingua|faccina con un gran sorriso che mostra la lingua|linguaccia con occhi chiusi|non mi piace|occhi chiusi|orribile|terribile
-🤑|arricchire|avarizia|avidità di denaro|avido|denaro|dollari|faccina con lingua verde|guadagnare|lingua|occhi|pagare|ricchezza|ricco|soldi|taccagno
+🤑|avarizia|avidità|avido|denaro|dollari|faccina con lingua verde|guadagnare|lingua|pagare|ricchezza|ricco|taccagno
 🤗|abbracciare|abbraccio|ciao|faccina che abbraccia|imbarazzo|mani|mano|saluti|sorriso|ti voglio bene|tvb
-🤭|faccina che sogghigna|faccina con mano davanti alla bocca|imbarazzato|imbarazzo|mano|non ci credo|oddio|oops|ridacchiare|ridere|segreto|sogghignare|sorpresa
-🫢|faccina con occhi aperti e mano sulla bocca|imbarazzo|incredibile|incredulità|mano sulla bocca|meraviglia|non ci credo|non ci posso credere|ops|sconvolto|shock|sorpresa|spavento|stupore
+🤭|faccina che sogghigna|imbarazzato|imbarazzo|mano davanti alla bocca|non ci credo|oddio|oops|ridacchiare|ridere|segreto|sogghignare|sorpresa
+🫢|imbarazzo|incredibile|incredulità|meraviglia|non ci credo|non ci posso credere|ops|sconvolto|shock|sorpresa|spavento|stupore
 🫣|curiosità|faccina che sbircia tra le dita|fissare|imbarazzo|incuriosito|nascondo|sbirciare|sbircio|spiare|timida|timido
 🤫|dito|faccina che zittisce|muto|non parlare|segreto|silenzioso|zittire|zitto
 🤔|arrovellarsi|concentrarsi|dubbio|faccina che pensa|faccina concentrata|mmm|pensare|scervellarsi
 🫡|agli ordini|d’accordo|faccina che fa il saluto militare|militare|obbedisco|ok|saluto|signorsì|sissignora|sissignore|truppe|va bene
 🤐|acqua in bocca|bocca a zip|bocca cucita|faccina con bocca con cerniera|faccina con zip|no comment|non parlare|non posso parlare|segreto|silenzio|zitto
 🤨|diffidente|disappunto|eh|faccia con sopracciglia alzate|faccina con sopracciglio alzato|incredulo|mah|non ci credo|scetticismo|scettico|sconcertato|sorpresa|sorpreso
-😐|ah|faccina|imbarazzato|imbarazzo|impassibile|mmm|neutro|no comment|non fa ridere|non rido|oh|senza espressione|senza parole|uh
+😐|ah|imbarazzato|imbarazzo|impassibile|mmm|neutro|no comment|non fa ridere|non rido|oh|senza espressione|senza parole|uh
 😑|brutto|cattivo|come no|faccina|inespressiva|male|neutro|niente commenti|no comment|strano
 😶|faccina senza bocca|muto|non parlo|non posso parlare|segreto|senza bocca|senza espressione|senza parole|silenzio|zitto
 🫥|depresso|faccina tratteggiata|introverso|invisibile|nascondersi|scomparire|sparire
 😶‍🌫️|annebbiato|distratto|sbadato|testa tra le nuvole
-😏|ammiccante|bocca|faccia|faccina che sorride|faccina con sorrisetto|flirtare|furbetto|malizioso|mmm|non ci credo|occhiolino|sopracciglia|sorrisetto|sospettoso
+😏|ammiccante|bocca|faccia|faccina con sorrisetto|flirtare|furbetto|malizioso|mmm|non ci credo|occhiolino|sopracciglia|sorrisetto|sospettoso
 😒|che barba|contrariato|deluso|faccina|indifferente|infelice|triste|uffa|ugh|wtf
 🙄|evabbé|faccina con occhi al cielo|guardare altrove|noia|occhi al cielo|pazienza|roteare gli occhi|ruotare gli occhi|sollevare gli occhi al cielo|uffa|vabbè
 😬|dentista|digrignare i denti|faccina con smorfia|smorfia
@@ -119,33 +119,34 @@
 🙂‍↔️|no|scuotere la testa in senso orizzontale
 🙂‍↕️|annuire|scuotere la testa in senso verticale|sì
 😌|faccina con sorriso|pace|sollevato|sollievo|tranquillità|tranquillo|zen
-😔|faccina|mai una gioia|male|mi dispiace|morire|no|peccato|pensieroso|perdere|persa|purtroppo|scoraggiato|triste
+😔|mai una gioia|male|mi dispiace|morire|no|peccato|pensieroso|perdere|persa|purtroppo|scoraggiato|triste
 😪|assonnato|dormire|faccina assonnata|goccia|sonno|stanco|zzz
 🤤|bava|che buono|faccina che sbava|felice|figata|sbavare
 😴|assonnato|buona notte|dormire|faccina che dorme|pisolino|sonno|stanco|zzz
-😷|dentista|dottore|faccia|faccina con mascherina|germi|infermiera|infermiere|malato|maschera|mascherina|medicina|raffreddato|raffreddore|smog
+🫩|assonnato|borse|esausto|occhiaie|sfinito|sonno|stanchezza|stanco
+😷|dentista|dottore|faccina con mascherina|germi|infermiera|infermiere|malato|mascherina|medicina|raffreddato|raffreddore|smog
 🤒|ammalato|faccina con termometro|faccina malata|febbre|influenza|malato|mutua|raffreddore|termometro
 🤕|bende|dolore|faccina bendata|faccina con la testa bendata|faccina malata|farsi male|fasciarsi la testa|ferita|ferito|mal di testa|malato
 🤢|faccina che vomita|faccina con la nausea|faccina nauseata|hang over|mal di mare|malato|nauseato|sto male|verde|vomito
 🤮|faccina che vomita|malato|male|nausea|sputare|sto male|verde|vomitare|vomito
 🤧|faccina che starnutisce|faccina con fazzoletto|faccina con raffreddore|fazzoletto|malato|raffreddore|starnutire|starnuto
-🥵|accaldato|bollente|caldone|colpo di calore|colpo di sole|faccina|febbre|febbricitante|fuoco|lingua di fuori|morendo dal caldo|morendo di caldo|morire di caldo|muoio di caldo|sudare|sudato|sudore
-🥶|blu|congelare|congelato|denti che battono per il freddo|faccina blu|faccina congelata|faccina fredda|freddo|gelone|geloni|ghiaccioli|ghiacciolo|ipotermia|sottozero
-🥴|alticcio|bocca ondulata|brillo|faccina con occhi semiaperti|faccina confusa|faccina stordita|frastornata|frastornato|occhi irregolari|occhi storti|stordito|ubriaco|vertigini
+🥵|accaldato|bollente|caldo|colpo di calore|febbre|febbricitante|fuoco|lingua di fuori|morendo dal caldo|morire di caldo|sudare|sudore
+🥶|blu|congelare|denti che battono per il freddo|freddo|gelo|ghiaccioli|ghiacciolo|ipotermia|sottozero
+🥴|alticcio|bocca ondulata|brillo|confuso|frastornato|occhi storti|ubriaco|vertigini
 😵|crocetta|crocette|emozione|faccina|frastornato|malato|occhi a croce|stanco|testa che gira
 😵‍💫|capogiro|confuso|faccina con occhi a spirale|giramento di testa|ipnotizzato|nausea|problema|stordito|vertigini
-🤯|cervello|faccina con testa che esplode|faccina sorpresa|mindblown|non ci credo|sbalordito|scioccato|sconcertato|sorpesa|sorpreso|stupore|testa che esplode
+🤯|cervello|faccina sorpresa|mindblown|non ci credo|sbalordito|scioccato|sconcertato|sorpesa|sorpreso|stupore|testa che esplode
 🤠|cappello da cowboy|cowboy|faccina con cappello da cowboy
-🥳|cappellino|celebrazione|compleanno|entusiasta|faccina che festeggia|faccina da festa|faccina da party|faccina festosa|festa|festeggiamenti|festeggiamento|festeggiamo|festeggiare|party|si festeggia|trombetta
+🥳|cappellino|celebrazione|compleanno|entusiasta|faccina che festeggia|festa|festeggiamenti|festeggiamento|festeggiamo|festeggiare|party|si festeggia|trombetta
 🥸|baffi|faccina travestita|incognito|naso|occhiali|persona|spia|travestimento
-😎|cool|faccina con occhiali da sole|faccina con sorriso e occhiali da sole|fighetto|figo|ganzo|luce|occhiali da sole|relax|soleggiato|sorriso|spensierato|vacanza
+😎|cool|fighetto|figo|ganzo|luce|relax|soleggiato|spensierato|vacanza
 🤓|faccina|nerd|occhiali da nerd|secchione|studioso
 🧐|antico|classe|faccina con monocolo|fighetto|monocolo|occhiale|ricco|sospetto
 😕|confuso|deluso|faccina|forse|non so|peccato|triste|uffa
 🫤|confuso|così così|deluso|dubbioso|faccina perplessa|mah|meh|perplesso|scettico
 😟|ansioso|faccina|nodo allo stomaco|preoccupato|preoccupazione|triste
 🙁|corrucciato|faccina leggermente imbronciata|imbronciato|mettere il muso|mi dispiace|triste|un po’ imbronciato
-😮|bocca aperta|faccina con bocca aperta|non ci credo|non mi dire|oh|scioccato|shock|sorpresa|sorpreso|stupito|wow
+😮|bocca aperta|non ci credo|non mi dire|oh|scioccato|shock|sorpresa|sorpreso|stupito|wow
 😯|faccina|incredulo|omg|sbalordito|sorpresa|sorpreso|wow
 😲|cosa?|davvero|faccina|non ci credo|oddio|omg|scioccato|sorpresa|sorpreso|stupito
 😳|confuso|faccina arrossata|faccina con guance rosse|faccina con occhi aperti|guance rosse|imbarazzato|occhi
@@ -154,18 +155,18 @@
 😦|bocca aperta|corrucciata|faccina imbronciata con bocca aperta|male|noo|paura|sorpresa|wow
 😧|angosciato|ansia|ansioso|faccina|infelice|paura|sofferente|stressato|triste
 😨|ansia|ansioso|esami|faccina|fifa blu|impaurito|paura|preoccupato|spaventato|spavento
-😰|ansia|blu|esami|faccina sotto pressione|faccina spaventata|faccina sudata in ansia|freddo|nervoso|paura|risultato|spaventato|sudato|sudore|terrore
+😰|ansia|blu|esami|faccina spaventata|freddo|nervoso|paura|risultato|spaventato|sudato|sudore|terrore
 😥|ansioso|deluso ma sollevato|faccina delusa ma sollevata|goccia|infelice|lacrima|sollevato|sudore|triste
 😢|emozione|faccina che piange|faccina con lacrima|infelice|lacrima|mi dispiace|mi manchi|piangere|triste
 😭|faccina che piange|faccina disperata|infelice|lacrime|nooo|piangere|pianto|singhiozzare|triste
 😱|blu|faccina|grido di paura|munch|oddio|paura|terrore|terrorizzata|urlare|urlo di munch
 😖|arrabbiato|concentrato|confuso|doh|faccia|faccina|frustrato|scontento|stressato|triste|uffa
 😣|concentrato|faccina che pensa|faccina concentrata|pensare|perseverante
-😞|abbandonare|delusione|disilluso|emozione|faccia|faccina|fallimento|fallire|fallito|ho perso|infelice|male|no|perdere|sospiro|triste|uffa
+😞|abbandonare|delusione|disilluso|emozione|faccina|fallimento|fallire|fallito|ho perso|infelice|male|no|perdere|sospiro|triste|uffa
 😓|ci è mancato poco|delusione|faccina abbattuta sudata|faccina sudata|goccia|malato|sudore|triste
 😩|arrabbiato|disperato|esausto|faccina che piange|nooo|piangere|sfinito|stanco
 😫|disperato|faccina|stanco|triste
-🥱|annoiato|assonnato|buona notte|faccina che sbadiglia|mi annoio|noia|pisolino|sbadigliare|sbadiglio|sonno|stanchezza|stanco|zzz
+🥱|annoiato|assonnato|buona notte|mi annoio|noia|pisolino|sbadigliare|sbadiglio|sonno|stanchezza|stanco|zzz
 😤|arrabbiarsi|arrabbiato|faccina arrabbiata|faccina che sbuffa|faccina con il fumo|faccina frustrata|frustrato|frustrazione|rabbia|sbuffare|scontento|uffa
 😡|arrabbiato|broncio|faccina accigliata|faccina rossa|furioso|imbronciato|male|muso|odio
 😠|arrabbiato|che odio|faccina|frustrato|furia|infuriato|non mi piace|odio|rabbia
@@ -177,7 +178,7 @@
 🤡|carnevale|circo|clown|faccina del clown|it|maschera|pagliaccio|teatro
 👹|creature|diavolo|faccina|favola|fiaba|finzione|maschera|mostro|orco|paura
 👺|arrabbiato|carnevale|cattivo|crudele|diavolo|favola|fiaba|folletto|goblin|malefico|mostro
-👻|creatura|fantasma|fantasmino|favola|fiaba|giocare|gioco|halloween|horror|mostro|paura|scherzetto|scherzo|sciocco|storie di fantasmi|stregare|stregato|terrore
+👻|creatura|fantasmino|favola|fiaba|halloween|horror|mostro|paura|scherzetto|scherzo|sciocco|storie di fantasmi|stregare|stregato|terrore
 👽|alieno|et|extraterrestre|faccina|favola|marziani|mostro|spazio|ufo
 👾|alieno|arcade|creatura|faccina viola|favola|gif|mostro|pixel|ufo|video gioco|videogioco
 🤖|faccina di robot|robot|tecnologia
@@ -192,9 +193,9 @@
 😾|arrabbiato|broncio|faccina|gatto imbronciato|infelice|muso
 🙈|faccina della scimmietta|gesto|non guardo|non posso guardare|non vedo|proibito|scimmia|scimmietta non vedo|segreto|vietato
 🙉|animale|animali|faccina|non sentire|non sento|orecchie da mercante|scimmia|scimmietta non sento|segreto|vietato
-🙊|animale|animali|faccia|faccina|in silenzio|monello|non parlo|proibito|scimmia|scimmietta non parlo|segreto|vietato
+🙊|animale|animali|faccina|in silenzio|monello|non parlo|proibito|scimmia|scimmietta non parlo|segreto|vietato
 💌|busta con cuore|c’è posta per te|cuore|inviare|lettera d’amore|posta|ricevere|romanticismo|san valentino
-💘|amore|appuntamento|cuore con freccia|cuore rosa con freccia|cupido|emozione|emozioni|freccia|innamorarsi|innamorati|romantico|rosa|san valentino
+💘|amore|appuntamento|cuore con freccia|cupido|emozione|emozioni|freccia|innamorarsi|innamorati|romantico|rosa|san valentino
 💝|amore|cuore con fiocco|cuore rosa con fiocco|emozione|fiocco|regalo|romantico|san valentino
 💖|amore|cuore che luccica|cuore rosa|emozionato|emozione|innamorata|innamorato|luccicare|luccichio
 💗|amore|battito|cuore che batte|cuore che cresce|cuore che pulsa|cuore rosa|emozionato|emozione|nervoso
@@ -232,23 +233,23 @@
 💤|dormire|dormita|fumetto|ho sonno|pisolino|russare|sonnellino|sonno|stanco|zzz
 👋|a dopo|ci sei?|ci vediamo|ciaone|gesto di saluto|mano aperta|mano che saluta|salutare|schiaffo
 🤚|alzata|ciaone|dorso mano alzata|mano
-🖐️|batti cinque|batti il cinque|cinque|dita|fermo|gesto|high five|mano alzata|mano aperta|palmo della mano|stop|un attimo
+🖐️|batti il cinque|cinque|dita|fermo|gesto|high five|mano alzata|mano aperta|palmo della mano|stop|un attimo
 ✋|alzata|carta|cinque|mano aperta
 🖖|mano aperta|mano di spock|saluto vulcaniano|spock
 🫱|dare la mano|destra|mano rivolta a destra|verso destra
 🫲|dare la mano|mano destra rivolta a sinistra|mano rivolta a sinistra|sinistra|verso sinistra
 🫳|afferrare|allontanare|cacciare|congedare|imporre|lasciar cadere|mano con il palmo verso il basso|porgere la mano|scacciare|sciò
 🫴|elemosina|mano con il palmo verso l’alto|offrire|prendere|raccogliere|richiamare|sollevare|vieni qui
-🫷|alt|aspettare|batti cinque|fermare|indietro|mano che spinge a sinistra|mano che spinge verso sinistra|palmo|rifiutare|sinistra|spingere|spinta|stop
-🫸|alt|aspettare|batti cinque|destra|fermare|indietro|mano che spinge a destra|mano che spinge verso destra|palmo|rifiutare|spingere|spinta|stop
+🫷|alt|aspettare|batti cinque|fermare|indietro|mano che spinge verso sinistra|palmo|rifiutare|sinistra|spingere|spinta|stop
+🫸|alt|aspettare|batti cinque|destra|fermare|indietro|mano che spinge verso destra|palmo|rifiutare|spingere|spinta|stop
 👌|bene|capito|d’accordo|dito|gesto di ok|ho capito|indice e pollice|mano che fa ok|ok con la mano|segno di ok|va bene
-🤌|che vuoi|cosa vuoi|cuoppo|dita unite|gesto della mano|interrogativo|ma che dici|mano a borsa|mano a carciofo|mano a cuoppo|mano a pigna|mano a tulipano|sarcastico
+🤌|che vuoi|cosa vuoi|dita unite|gesto della mano|interrogativo|ma che dici|mano a borsa|mano a carciofo|mano a cuoppo|mano a pigna|mano a tulipano|sarcastico
 🤏|dita|gesto|mano che fa il gesto del pizzico|piccola quantità|piccolo|poco|un po’|un pochino
 ✌️|due|forbice|mano|segno di vittoria|vittoria|yeah
 🤞|buona fortuna|dita incrociate|fortuna|incrociare le dita|mano
 🫰|amore|caro|costa|costoso|cuore|denaro|mano con indice e pollice incrociati|schioccare|soldi
 🤟|corna|dita|dito|gesto ti amo|gesto tvb|mano|rock|tre dita
-🤘|concerto|corna|cornuto|dita|dito|fare le corna|gesto|mani|mano con le corna|rock and roll|rockstar|segno delle corna
+🤘|concerto|corna|fare le corna|gesto|mani|mano con le corna|rock and roll|rockstar|segno delle corna
 🤙|chiamami|chiamare|dita|dito|gesto|mani|mano con gesto di chiamata|telefonare|ti chiamo
 👈|direzione|dito verso sinistra|indicare|indice verso sinistra|là|mano|sinistra
 👉|a destra|destra|di là|dito indice|dito verso destra|indicare|indice verso destra|mano
@@ -257,23 +258,23 @@
 👇|dito abbassato|dito in giù|dito indice|indicare|indice abbassato|indice in giù|mano|qui|sotto
 ☝️|dito verso l’alto|in alto|indicare|indice verso l’alto|io|sopra|tu
 🫵|dito puntato|indicare|indice puntato|indice verso l’osservatore|mano|puntare|tu
-👍|+1|bene|capito|certo|d’accordo|dito|mano|mi piace|ok|perfetto|pollice alzato|pollice in su|segno|sì|su|va bene
+👍|+1|bene|capito|certo|d’accordo|dito|mi piace|ok|perfetto|pollice in su|sì|va bene
 👎|giù|in basso|mano|non mi piace|pollice abbassato|pollice in giù|pollice verso|segno
 ✊|alzato|lotta|mano|pugno chiuso|sasso|solidarietà
 👊|d’accordo|mano|ok|patto|pugno chiuso|rock|sì
 🤛|mano chiusa|pugno a sinistra|sinistra
 🤜|destra|pugno a destra
-👏|applaudire|applauso|bravo|clap clap|complimenti|congratulazioni|mani che applaudono|mani giunte|mano|ok|pregare|preghiera|segno|yeah
-🙌|celebrare|due mani|evvai|evviva|gesto|grazie|innocente|mani alzate|mani aperte|mano|urrà|vittoria
+👏|applaudire|applauso|bravo|clap clap|complimenti|congratulazioni|mani che applaudono|ok|pregare|preghiera|segno|yeah
+🙌|celebrare|due mani|evvai|evviva|gesto|grazie|innocente|mani alzate|mano|urrà|vittoria
 🫶|amore|cuore|mani a cuore|mano|ti amo|ti voglio bene
 👐|abbracciare|abbraccio|accogliere|aperta|aperte|mani|mano|segno delle mani aperte
 🤲|desiderare|mani a coppa|mani in preghiera|mani unite in alto|mano|offrire|palmi|palmo della mano|pregare|preghiera
-🤝|accordo|affare fatto|conoscere|d’accordo|mani che si stringono|mano|ok|patto|piacere|presentarsi|promessa|promettere|stretta di mano|stringersi la mano|ti presento|vi presento
+🤝|affare fatto|conoscere|d’accordo|mani che si stringono|ok|patto|piacere|presentarsi|presentazione|promessa|stretta di mano|stringersi la mano
 🙏|gesto|grazie|mani giunte|mano|per favore|pregare|preghiera|ti prego
 ✍️|disegnare|mano che scrive|penna|scrivere a mano
 💅|cosmetici|make up|manicure|noia|smalto per unghie|spa|unghie con smalto
 🤳|autoscatto|fare un selfie|fotocamera|fotografare|fotografia|scattare|selfie|smartphone|telefono
-💪|bicipite|bodybuilding|braccio di ferro|braccio piegato|corpo|forte|forza|fumetto|muscolo|palestra|pesi|sollevamento|teso
+💪|bicipite|bodybuilding|braccio piegato|corpo|forte|forza|fumetto|muscolo|palestra|pesi|sollevamento|teso
 🦾|accessibilità|braccio meccanico|protesi robotica per il braccio
 🦿|accessibilità|gamba meccanica|protesi robotica per la gamba
 🦵|arto|calcio|gamba piegata|ginocchio piegato|piede|polpaccio
@@ -308,16 +309,16 @@
 👴|anziano|capelli|nonnino|nonno|pelato|perdere i capelli|persona|persone|saggio|uomo|vecchietto|vecchio
 👵|anziana|capelli bianchi|donna|nonna|nonnina|persone|saggezza|saggia|signora|vecchia|vecchietta
 🙍|arrabbiata|corrucciata|delusa|donna|faccia|frustrata|gesto|infelice|persona|triste
-🙍‍♂️|arrabbiato|corrucciato|crucciato|deluso|emozione|faccia|gesto|infelice|maschio|persona corrucciata|preoccupato|ragazzo|triste|uomo
+🙍‍♂️|arrabbiato|corrucciato|crucciato|deluso|emozione|faccia|infelice|persona corrucciata|preoccupato|ragazzo|triste|uomo
 🙍‍♀️|corrucciata|donna|femmina|gesto
 🙎|arrabbiata|broncio|delusa|donna|gesto|imbronciata|persona|seccata|sguardo arrabbiato
 🙎‍♂️|arrabbiato|broncio|disappunto|gesto|imbronciato|maschio|person|uomo
 🙎‍♀️|donna|femmina|gesto|imbronciata
 🙅|donna|escluso|faccina|gesto di rifiuto|non bene|persona che fa segno di no|rifiuto|stop|vietato
-🙅‍♂️|basta|braccia incrociate|gesto di rifiuto|incrocio|no|persona|proibito|rifiuto|stop|uomo con gesto di rifiuto|vietato
+🙅‍♂️|basta|braccia incrociate|incrocio|no|persona|proibito|stop|vietato
 🙅‍♀️|donna con gesto di rifiuto|no|proibito|rifiuto
 🙆|donna con braccia alzate|esercizio|fitness|gesto|mani|ok|persona con gesto ok|tutto bene|yoga
-🙆‍♂️|braccia|cerchio|d’accordo|esercizio|gesto|mani|mano|ok|person|uomo con braccia a cerchio|uomo con braccia alzate|uomo con gesto ok|ymca
+🙆‍♂️|cerchio|d’accordo|esercizio|gesto|mani|mano|ok|uomo con braccia a cerchio|uomo con braccia alzate|uomo con gesto ok|ymca
 🙆‍♀️|d’accordo|donna con gesto ok|gesto|ok
 💁|aiuto|capovolgere la mano|gesto con i capelli|gossip|informazioni|mano all’insù|pettegolezzo|sarcasmo|sfacciataggine|sul serio
 💁‍♂️|aiuto|capovolgere la mano|gesto con i capelli|gossip|informazioni|mano all’insù|pettegolezzo|sarcasmo|sarcastico|sfacciato
@@ -335,8 +336,8 @@
 🤦‍♂️|esasperato|esasperazione|facepalm|figuraccia|gesto|imbarazzo|incredulo|non ci credo|oddio|persona|uomo
 🤦‍♀️|donna|esasperata|esasperazione|figuraccia|gesto|imbarazzo|incredula|mano sul viso|non ci credo|oddio|persona
 🤷|boh|dubbio|forse|indifferenza|non lo so|non saprei|noncuranza|persona che alza le spalle|persona che scrolla le spalle|può darsi|spalle alzate|vabbè
-🤷‍♂️|boh|dubbio|dubitare|forse|gesto|indifferenza|mani|non saprei|non so|persona|uomo che alza le spalle|uomo che scrolla le spalle
-🤷‍♀️|boh|donna che alza le spalle|donna che scrolla le spalle|dubitare|forse|gesto|indifferente|indifferenza|mani|non lo so|non so|persona
+🤷‍♂️|alzare le spalle|boh|dubbio|dubitare|forse|gesto|indifferenza|mani|non saprei|non so|persona|uomo che scrolla le spalle
+🤷‍♀️|alzare le spalle|boh|donna che scrolla le spalle|dubitare|forse|gesto|indifferente|indifferenza|mani|non lo so|non so|persona
 🧑‍⚕️|infermiera|infermiere|medico|persona che lavora nella sanità|sanità|terapista
 👨‍⚕️|camice|dottore|infermiere|lavoro|medicina|medico|operatore sanitario|ospedale|sanità|terapista|uomo
 👩‍⚕️|camice|donna|dottoressa|infermiera|lavoro|medicina|medico|operatrice sanitaria|ospedale|sanità|terapista
@@ -452,7 +453,7 @@
 🧟‍♀️|morto vivente|zombie donna
 🧌|fantasia|favola|fiaba|mostro|troll
 💆|centro estetico|estetista|faccia|mal di testa|massaggio facciale|persona che riceve un massaggio|relax|spa|testa
-💆‍♂️|centro estetico|mal di testa|massaggio al viso per uomo|massaggio facciale|persona|relax|spa|tensione|testa|uomo che riceve un massaggio|viso
+💆‍♂️|centro estetico|mal di testa|massaggio al viso per uomo|persona|relax|spa|tensione|testa|uomo che riceve un massaggio|viso
 💆‍♀️|donna che riceve un massaggio|faccia|massaggio al viso per donna|viso
 💇|acconciatura|bellezza|capelli|parrucchiera|parrucchiere|persona|salone di bellezza|tagliare|taglio di capelli
 💇‍♂️|acconciatura|bellezza|capelli|parrucchiere|persona|salone di bellezza|tagliare|taglio di capelli|uomo
@@ -482,7 +483,7 @@
 🕺|ballare|ballo|discoteca|lavoro|uomo che balla
 🕴️|abbigliamento|abito|business man|cravatta|giacca|lavoro|persona|uomo con completo che levita|uomo elegante che levita|vestito elegante
 👯|amicizia|anima gemella|ballare|festa|orecchie da coniglio|party|persone con orecchie da coniglio|uguali
-👯‍♂️|ballare|ballerino|cabaret|coniglietti|coniglietto|festa|intrattenimento|orecchie da coniglietto|orecchie da coniglio|party|show|uomini con orecchie da coniglio|uomo|velini
+👯‍♂️|ballare|ballerino|cabaret|coniglietti|festa|intrattenimento|party|show
 👯‍♀️|ballerina|donna|donne con orecchie da coniglio|orecchie da coniglio|party
 🧖|bagno turco|benessere|hammam|persona in sauna|persona nella sauna|relax|sauna|spa
 🧖‍♂️|bagno turco|sauna|uomo in sauna
@@ -499,7 +500,7 @@
 🏌️‍♀️|attività|buca|donna che gioca a golf|giocatrice di golf|golfista|mazza|persona|sport|tiro
 🏄|mare|onde|persona che fa surf|spiaggia|sport|surfare|tavola
 🏄‍♂️|sport|surfista uomo|tavola da surf|uomo
-🏄‍♀️|donna che fa surf|mare|oceano|persona|spiaggia|sport|surfare|surfer|surfista|tavola da surf
+🏄‍♀️|donna che fa surf|mare|oceano|persona|spiaggia|sport|surfare|surfer|tavola da surf
 🚣|barca a remi|canoa|fiume|lago|persona che rema|persona in barca a remi|pesca|remare|remi|sport
 🚣‍♂️|barca|remi|uomo in barca a remi
 🚣‍♀️|barca a remi|canoa|canottaggio|donna in barca a remi|imbarcazione|lago|mare|persona che rema|pesca|remi|sport
@@ -539,9 +540,9 @@
 🛀|bagno|doccia|fare il bagno|lavarsi|persona che fa il bagno|relax|vasca da bagno
 🛌|addormentato|arredamento|dormire|hotel|letto|notte|persona a letto|sonno|stanca|stanco|zzz
 🧑‍🤝‍🧑|coppia che si tiene per mano|coppia per mano|insieme|mano nella mano|persona|persone che si tengono per mano|tenersi per mano|uniti
-👭|amiche|amicizia|bambine|bff|coppia|darsi la mano|donne|due donne che si tengono per mano|legame|mano|migliori amiche|persone|ragazze|sorelle
+👭|amiche|amicizia|bambine|bff|coppia|darsi la mano|due donne che si tengono per mano|legame|migliori amiche|persone|ragazze|sorelle
 👫|amore|coppia|donna e uomo|famiglia|innamorati|per mano|persone|tenersi per mano|uomo e donna che si tengono per mano|uomo e donna per mano
-👬|appuntamento|bff|compagni|coppia|due uomini che si tengono per mano|due uomini per mano|fidanzati|gay|gemelli|innamorati|mano|oroscopo|persone|tenersi per mano|uomo|zodiaco
+👬|bff|compagni|coppia|due uomini che si tengono per mano|fidanzati|gemelli|innamorati|oroscopo|persone|tenersi per mano|uomo|zodiaco
 💏|amore|appuntamento|baciarsi|bacio tra coppia|coppia|coppietta|fidanzati|persone|romanticismo|romantico
 💑|amore|anniversario|bacio|coppia con cuore|cuore|innamorati|insieme|persone|romanticismo
 🗣️|parlare|persona che parla|profilo|urlare
@@ -554,6 +555,7 @@
 🧑‍🧒|famiglia: persona adulta, minore|minore
 🧑‍🧒‍🧒|famiglia: persona adulta, minore, minore|minore
 👣|camminare|corpo|impronta di piedi|impronte|passi|passo|piede|piedi nudi
+🫆|identità|impronta digitale|indizio|riconoscimento biometrico|scienza forense|sicurezza|traccia
 🐵|animale|faccina|scimmia|scimmietta
 🐒|animale|scimmietta|selvatico
 🦍|animale|foresta|scimmia|selvatico
@@ -569,7 +571,7 @@
 🐱|animale|animali|faccina|gatto|muso di gatto
 🐈|animale|cucciolo|domestico|gatta|gattina|gattino|miao|micino|micio
 🐈‍⬛|animale|felino|gatto|halloween|miao|micio|nero|sfiga|sfortuna
-🦁|alpha|animale|criniera|faccina|forte|forza|muso di leone|oroscopo|roar|ruggito|savana|segno zodiacale|selvaggio|selvatico
+🦁|alpha|animale|criniera|forte|forza|muso di leone|oroscopo|roar|ruggito|segno zodiacale|selvaggio|selvatico
 🐯|animale|animali|faccina|felino|muso di tigre|tigre
 🐅|animale|animali|felino|predatore|tigre
 🐆|animale|felino|leopardo|predatore|selvatico
@@ -642,7 +644,7 @@
 🐦‍⬛|animale|cornacchia|corvo|merlo|nero|uccello
 🪿|animale|oca|papera|pollame|starnazzare|stupidità|uccello
 🐦‍🔥|fantasia|fenice|immortale|mitologia|personaggio|reincarnazione|reinventarsi|rinascita|trasformazione|uccello di fuoco
-🐸|animale|bosco|faccina|fiaba|lago|muso di rana|natura|principe|raganella|ranocchia|ranocchio|rospetto|rospo|stagno
+🐸|animale|bosco|fiaba|lago|muso di rana|natura|principe|raganella|ranocchia|ranocchio|rospo|stagno
 🐊|animale|coccodrillo|lacrime di coccodrillo|rettile|selvatico
 🐢|animale|animali|lenta|lentezza|lento|tartaruga
 🦎|animale|animali|lucertola|rettile
@@ -663,6 +665,11 @@
 🐚|animale|conchiglia a spirale|mare|oceano|spiaggia
 🪸|barriera corallina|cambiamento climatico|corallo|mare|oceano
 🪼|animale|bruciatura|dolore|invertebrato|mare|medusa|puntura|trasparente|urticante
+🦀|cancro|granchio|mare|mollusco|oceano|segno zodiacale
+🦞|animale|aragosta rossa|astice|chele|crostacei|frutti di mare|zuppa
+🦐|animale|animali|cibo|crostaceo|gamberetto|gambero|mare|oceano
+🦑|animale|animali|calamaro|cibo|mare|mollusco|oceano|polipo|polpo|totano
+🦪|alimento|cibo|mollusco|ostrea|ostrica|perla
 🐌|animale|giardino|lentezza|lento|lumachina|lumacone|natura
 🦋|ali|animale|colorata|insetto
 🐛|animale|bruco|giardino|millepiedi
@@ -679,7 +686,7 @@
 🪰|animale|decomposizione|infestante|insetto volante|larva|malattia|mosca|moscone|volare
 🪱|anellide|animale|lombrico|parassita|strisciare|verme
 🦠|ameba|batterio|microbo|scienza|virus
-💐|anniversario|appuntamento|bouquet|compleanno|festa della donna|festa della mamma|fioraio|fiore|fiori|mazzo di fiori|natura|pianta|piante|regalo|romanticismo|romantico
+💐|anniversario|appuntamento|bouquet|compleanno|fioraio|fiore|fiori|natura|regalo|romanticismo|romantico
 🌸|ciliegio|fiore di ciliegio|fiorito|natura|pianta|primavera|primula|rosa
 💮|fiore bianco|fiorellino|simbolo ben fatto
 🪷|bellezza|buddhismo|fior di loto|fiore|india|induismo|loto|purezza|serenità|vietnam|yoga
@@ -706,6 +713,7 @@
 🪹|nidificazione|nido vuoto
 🪺|nidificazione|nido con uova|nido di uccelli|uccelli|uova
 🍄|amanita|autunno|biancaneve|bosco|favola|fiaba|funghetto|fungo|natura|velenoso
+🪾|inverno|senza foglie|siccità
 🍇|cibo|dioniso|frutta|frutto|grappolo d’uva|uva|vino|viola
 🍈|cantaloupe|cibo|frutta|frutto|melone|oliva
 🍉|anguria|cibo|frutta|frutto
@@ -744,13 +752,14 @@
 🫚|birra|radice di zenzero|salute|spezia|zenzero
 🫛|baccello di piselli|cibo|edamame|legume|pisello|vegetale|verdura
 🍄‍🟫|autunno|bosco|champignon|cibo|fungo marrone|natura|porcino|vegano|vegetale|vegetariano
+🫜|barbabietola|orto|radice|rapa|vegetale
 🍞|carboidrati|cereali|cibo|pancarré|pane a cassetta|pane in cassetta|ristorante|toast
 🥐|bar|cibo|colazione|cornetto|croissant|dolce|francese|zucchero
 🥖|baguette|carboidrati|cibo|filone|francese|francia|pane
 🫓|arepa|cibo|focaccia|lavash|naan|pane|piadina|pita|tigella
 🥨|brezel|cibo|pane|pretzel
 🥯|bagel|ciambella di pane|colazione|panetteria|panificio|spalmare formaggio sul bagel
-🥞|americano|brunch|burro|cibo|colazione|crêpe|dolce|francese|francia|frittelle|pancake|sciroppo d’acero|zucchero
+🥞|america|brunch|burro|cibo|colazione|crêpe|dolce|francia|frittelle|pancake|sciroppo d’acero|zucchero
 🧇|cialda|cibo|colazione|gaufre|waffle
 🧀|cibo|fetta di formaggio|formaggio|gruviera
 🍖|barbecue|carne con osso|cibo|fame|osso|ristorante
@@ -790,16 +799,11 @@
 🍣|cibo|cucina|giapponese|riso|ristorante|salmone|sushi
 🍤|cibo|gamberetto|gambero fritto|ristorante|tempura
 🍥|cibo|crocchetta di pesce|cucina giapponese|giapponese|pesce|ristorante|rotolo di pesce|spirale|tortino di pesce a spirale
-🥮|autunno|dolce della luna|dolce lunare|festa d’autunno|festival|moon cake|torta della luna|torta lunare|yuebing|yuèbǐng
+🥮|autunno|dolce della luna|dolce lunare|festa d’autunno|festival|moon cake|torta lunare|yuebing|yuèbǐng
 🍡|dango|dolcetto|palline di mochi|ristorante|spiedino di mochi
 🥟|cibo|dumpling|empanada|fagottino|gyoza|jiaozi|pierogi|ravioli|raviolo
 🥠|biscotto della fortuna|cibo|cinese|consiglio|profezia|suggerimento
 🥡|asporto|bacchette|bastoncini|cibo a domicilio|cibo cinese|cibo da asporto|confezione da asporto|consegna|scatola d’asporto
-🦀|cancro|granchio|mare|mollusco|oceano|segno zodiacale
-🦞|animale|aragosta rossa|astice|chele|crostacei|frutti di mare|zuppa
-🦐|animale|animali|cibo|crostaceo|gamberetto|gambero|mare|oceano
-🦑|animale|animali|calamaro|cibo|mare|mollusco|oceano|polipo|polpo|totano
-🦪|alimento|cibo|mollusco|ostrea|ostrica|perla
 🍦|bar|cono|crema|dessert|dolce|estate|gelateria|gelato|ristorante|zucchero
 🍧|cibo|estate|ghiaccio|granita siciliana|sicilia
 🍨|cibo|coppa di gelato|crema|dessert|dolce|estate|gelateria|gelato|ristorante|zucchero
@@ -819,13 +823,13 @@
 🫖|bere|cibo|tè|teiera|thè
 🍵|bere|bevanda|pomeriggio|sete|tazza da tè senza manico|tazza di tè|tazzina|tè
 🍶|bar|bere|bevanda|bicchiere|bottiglia e bicchiere di sake|bottiglia e bicchiere di sakè|giapponese|ristorante|sake|sakè
-🍾|auguri|bar|bere|bottiglia stappata|brindisi|celebrare|champagne|congratulazioni|festeggiare|spumante|stappare|tappo
+🍾|auguri|bar|bere|brindisi|celebrare|champagne|congratulazioni|festeggiare|spumante|stappare|tappo
 🍷|alcool|bar|bere|bicchiere di vino|calice|enoteca|ristorante|vino
 🍸|alcolico|bar|bere|bevanda|bicchiere da cocktail|calice|cocktail|drink|ristorante
 🍹|alcool|bar|bere|club|cocktail|drink|ristorante|tropicale
 🍺|alcool|bar|bere|birra|boccale di birra|estate|germania|octoberfest|pinta|pub|ristorante|sete
-🍻|alcool|bar|birra|birre|boccale|boccali di birra che brindano|brindisi|celebrare|cin cin|festeggiare|pub|ristorante
-🥂|anniversario|auguri|bere|brindare|brindiamo|brindisi|champagne|cin cin|compleanno|congratulazioni|festeggiare|prosecco|spumante
+🍻|alcool|bar|birra|birre|boccali di birra che brindano|brindisi|celebrare|cin cin|festeggiare|pub|ristorante
+🥂|anniversario|auguri|bere|brindare|brindisi|champagne|cin cin|compleanno|congratulazioni|festeggiare|prosecco|spumante
 🥃|alcool|bevanda|bicchiere|drink|liquore|tumbler|whisky
 🫗|bevanda|bicchiere rovesciato|drink|liquido versato|rovesciare|svuotare|versare
 🥤|acqua|bevanda|bevande|bibita gasata|bicchiere con cannuccia|cannuccia|succo
@@ -835,7 +839,7 @@
 🧊|cubetto di ghiaccio|freddo|gelo|ghiaccio in cubetti|ghiaccio in cubi
 🥢|bacchette|bastoncini|cibo asiatico|hashi|jeotgarak|kuaizi
 🍽️|apparecchiare|cena|coltello|fame|forchetta|mangiare|piatto e posate|posate|pranzo|tavola
-🍴|affamata|affamato|cena|che fame|cibo|coltello|cucinare|fame|forchetta e coltello|mangiare|posate|pranzo|ristorante|si mangia
+🍴|affamata|affamato|cena|che fame|cibo|cucinare|fame|forchetta e coltello|mangiare|posate|pranzo|ristorante
 🥄|cucchiaino|cucchiaio|cucina|posate|stoviglie|utensili
 🔪|arma|chef|coltello da cucina|cucina|fame|posate
 🫙|barattolo|condimento|conservare|contenitore|dispensa|salsa|sugo|vuoto
@@ -864,7 +868,7 @@
 🪵|ceppo|ciocco|legname|legno|tronco
 🛖|capanna|capanno|casa|iurta|rifugio
 🏘️|casa|casetta|casette|cittadina|edifici|quartiere|residenziale|via|vicinato|vicini|vicino
-🏚️|abbandonata|abbandonato|casa in rovina|crepa|crepe|decrepita|disabitata|disabitato|fatiscente|in rovina|rovinato|rudere|terremoto
+🏚️|abbandonata|casa in rovina|crepa|crepe|decrepita|disabitata|disabitato|fatiscente|in rovina|rovinato|rudere|terremoto
 🏠|abitazione|casa di campagna|casetta|edificio|fattoria|villetta
 🏡|abitazione|casa con giardino|casa di campagna|casetta|edificio|giardino|nido|villa|villetta
 🏢|edificio di uffici|edifico di uffici|palazzo|ufficio
@@ -913,7 +917,7 @@
 🚇|metropolitana|mezzo|trasporti|trasporto|veicolo|viaggiare
 🚈|arrivare|ferrovia|metrotranvia|mezzo|monorotaia|tram|trasporti|trasporto|treno|veicolo|viaggiare
 🚉|arrivo|fermata|ferrovia|ritardo|stazione|trasporto|treno|veicolo|viaggiare
-🚊|arrivo|ferrovia|frecce|freccia|partire|pendolare|tram|trasporto|treno|veicolo|veloce|velocità|viaggiare
+🚊|arrivo|ferrovia|freccia|partire|pendolare|tram|trasporto|treno|veicolo|veloce|velocità|viaggiare
 🚝|mezzo|monorotaia|trasporti|trasporto|veicolo|veloce|viaggiare
 🚞|ferrovia di montagna|montagna|trasporti|treno di montagna|veicolo|viaggiare
 🚋|filobus|mezzo|tram|trasporti|trasporto|vagone del tram|veicolo
@@ -924,7 +928,7 @@
 🚑|ambulanza|croce rossa|emergenza|incidente|mezzo|ospedale|trasporto|veicolo
 🚒|autopompa|camion dei pompieri|emergenza|incendio|mezzo|pompieri|veicolo|vigili del fuoco
 🚓|auto|carabinieri|gazzella|macchina della polizia|polizia|veicolo
-🚔|auto della polizia in arrivo|automobile|gazzella|macchina della polizia in arrivo|mezzo|polizia|trasporti|trasporto|veicolo|volante
+🚔|auto della polizia|automobile|gazzella|macchina della polizia|mezzo|polizia|trasporti|trasporto|veicolo|volante
 🚕|auto|guidare|mezzo|tassì|taxi giallo|trasporto|veicolo
 🚖|mezzo|tassì|taxi giallo|taxi in arrivo|trasporti|trasporto|veicolo
 🚗|automobile|guidare|macchina|mezzo|trasporti|veicolo|viaggiare
@@ -965,7 +969,7 @@
 🚢|barca|crociera|imbarcazione|mare|nave|titanic|trasporti|trasporto|veicolo|viaggiare
 🛩️|aereo turistico|aeroplano|jet|velivolo|viaggiare|viaggio
 🛫|aereo|andare|check-in|decollo|partenza|partenze|partire|pista di decollo|trasporti|trasporto|vacanza|viaggiare
-🛬|aereo|aeroplano|aeroporto|arrivare|arrivi|arrivo|atterraggio|mezzo|pista d’atterraggio|trasporti|trasporto|veicolo|viaggiare
+🛬|aereo|aeroplano|aeroporto|arrivare|arrivi|arrivo|atterraggio|pista d’atterraggio|trasporti|trasporto|veicolo|viaggiare
 🪂|parà|paracadute ascensionale|paracadutismo|paracadutista|parasailing|skydiving|sport
 💺|sedia|sedile
 🚁|elicottero|trasporti|veicolo|velivolo|viaggiare|volare
@@ -1054,7 +1058,7 @@
 🎇|boom|esplosione|festa|fuoco d’artificio|stella filante|stellina scintillante|stelline scintillanti
 🧨|botto|dinamite|esplodere|esplosivo|far esplodere|fuochi artificiali|fuochi d’artificio|petardo|scintilla|scoppiare|scoppio
 🎈|auguri|compleanno|festa|palloncino
-🎉|auguri|compleanno|congratulazioni|coriandoli|evvai|evviva|felice|felicità|festa|festeggiare|party|spara coriandoli|stelle filanti|urrà|yahoo
+🎉|auguri|compleanno|congratulazioni|coriandoli|evviva|felicità|festa|party|spara coriandoli|stelle filanti|urrà|yahoo
 🎊|carnevale|congratulazioni|coriandoli|decorazioni|evviva|festa|festeggiare|palla di coriandoli|stelle filanti
 🎋|albero decorato|albero di tanabata|decorazioni di carta|festa delle stelle|giapponese|natura
 🎍|bambù decorato|decorazione kadomatsu|festa|giapponese|pianta|pino
@@ -1062,7 +1066,7 @@
 🎏|aquilone a forma di carpa|carpa|festa|giapponese|pesce
 🎐|campana al vento|campanelle a vento|festa|scacciapensieri|vento
 🎑|contemplazione della luna|contemplazione festa|festa della contemplazione della luna|festa della luna|festeggiare|luna
-🧧|buona fortuna|buono auspicio|busta hongbao|busta rossa|busta soldi|denaro|hongbao|hóngbāo|lai see|regalo|soldi
+🧧|buona fortuna|buono auspicio|busta rossa|busta soldi|denaro|hóngbāo|lai see|regalo|soldi
 🎀|auguri|bambina|bebé|festa|fiocco rosa|neonata
 🎁|dono|festa|fiocco|natale|pacchetto|regalino|regalo|sorpresa
 🎗️|festa|festeggiamenti|fiocchetto|fiocco giallo|nastro giallo|nodo
@@ -1121,7 +1125,7 @@
 🃏|carta da gioco|gioco|joker|jolly
 🀄|drago rosso|mahjong|tessera
 🎴|carta da gioco hanafuda|carta dei fiori|giapponese|gioco di carte|hanafuda
-🎭|arte|arti performative|attore|attrice|carnevale|dietro le quinte|intrattenimento|maschere|palco|performance|quinte|recitare|scena|shakespeare|teatro
+🎭|arte|arti performative|carnevale|dietro le quinte|intrattenimento|maschere|palco|performance|recitare|scena|shakespeare|teatro
 🖼️|arte|cornice|dipinto|disegno|galleria|museo|opera d’arte|paesaggio|quadretto|quadro incorniciato
 🎨|arte|artista|colori|creativo|dipingere|palette|pittore|pittura|tavolozza dei colori
 🧵|ago|bobina|corda|cucire|filo|rocchetto|rotolo
@@ -1173,9 +1177,9 @@
 ⛑️|bianca|croce|elmetto con croce bianca|salvataggio|soccorso
 📿|grani|perle|pregare|religione
 💄|appuntamento|bellezza|cosmetici|make up|makeup|rossetto|rosso|serata|trucco
-💍|anello di diamanti|anello di fidanzamento|brillante|diamante|fidanzamento|fidanzarsi|fidanzata|fidanzato|gioielli|gioiello|matrimonio|romanticismo
+💍|brillante|diamante|fidanzamento|fidanzarsi|fidanzata|fidanzato|gioielli|gioiello|matrimonio|romanticismo undefined
 💎|diamante|fidanzamento|gemma|gioiello|per sempre|pietra preziosa|romanticismo|romantico|soldi
-🔇|altoparlante barrato|altoparlante disattivato|audio|megafono barrato|musica|muto|no audio|no volume|silenzioso|speaker barrato|suono disattivato|volume|zitto
+🔇|altoparlante barrato|audio|megafono barrato|musica|muto|no audio|no volume|silenzioso|speaker barrato|suono disattivato|volume|zitto
 🔈|altoparlante a basso volume|altoparlante a volume basso|altoparlante attivato|audio|basso volume|megafono|speaker|suoneria|suono attivo|volume basso
 🔉|altoparlante a volume intermedio|altoparlante volume basso|audio|basso|megafono|speaker|suono|volume basso|volume intermedio|volume medio
 🔊|altoparlante a volume alto|audio|megafono|musica|speaker|suono|volume
@@ -1204,6 +1208,7 @@
 🪘|bongo|conga|musica|percussioni|ritmo|strumento musicale|tamburo lungo
 🪇|agitare|ballare|maracas|musica|percussioni|ritmo|scuotere|strumento
 🪈|fiati|fiato|flautista|flauto|legno|musica|pifferaio|piffero|strumento|zufolo
+🪉|amore|arpa|cupido|musica|orchestra|strumento
 📱|cellulare|chiamare|comunicare|smartphone|telefono
 📲|cellulare con freccia|chiamami|chiamare|ricevere|smartphone|telefonare|telefono cellulare con freccia
 ☎️|fisso|telefono di casa
@@ -1225,7 +1230,7 @@
 🧮|abaco|abbaco|calcolare|calcolatrice|calcolo|fare i calcoli|pallottoliere
 🎥|cinema|cinepresa|filmare|hollywood|intrattenimento|registrare|telecamera
 🎞️|cinema paradiso|film|fotogrammi di film|pellicola cinematografica
-📽️|cinema|cinepresa|filmato|fotocamera|fotografare|macchina fotografica|proiettore cinematografico|ricordi|riproduzione|scattare foto|videoproiettore
+📽️|cinema|cinepresa|filmato|fotocamera|fotografare|macchina fotografica|ricordi|riproduzione|scattare foto|videoproiettore
 🎬|ciak si gira|cinema|filmare|intrattenimento|lavagna|regista|scena|tavoletta
 📺|arredamento|televisione|televisore|tv
 📷|fotocamera|fotografare|instagram|macchina fotografica|ricordi|scattare foto|selfie|viaggiare|video
@@ -1245,7 +1250,7 @@
 📗|biblioteca|compiti|istruzione|libreria|libro verde|quaderno|scuola
 📘|biblioteca|compiti|istruzione|leggere|libreria|libro blu|quaderno blu|scuola|studiare
 📙|biblioteca|compiti|istruzione|leggere|libreria|libro arancione|quaderno|scuola|studiare
-📚|biblioteca|compiti|doposcuola|formazione|leggere|libreria|libri|libro|pila di libri|quaderni|relax|romanzi|scrivere|scuola|studiare|università
+📚|biblioteca|compiti|doposcuola|leggere|libreria|libri|pila di libri|quaderni|romanzi|scuola|studiare|università
 📓|appunti|biblioteca|libreria|libro grigio|prendere nota|quaderno|taccuino|ufficio
 📒|annotazioni|appunti|blocco|block notes|libro mastro|note|quaderno ad anelli|registro scolastico|scuola|taccuino
 📃|carta|documento|lettera|pagina arricciata|pagina con piega|ufficio
@@ -1256,16 +1261,16 @@
 📑|etichette segnalibro|linguette|segnalibro|ufficio
 🔖|etichetta|leggere|lettura|libro|segnalibro
 🏷️|etichetta|identificativo|prezzo|talloncino
-💰|banca|borsa|contanti|denaro|dollari|oro|pagare|paperone|ricchezza|ricco|sacco di soldi|sacco per soldi|soldi|tesoro|vincere
+💰|banca|borsa|contanti|denaro|dollari|oro|pagare|ricchezza|ricco|sacco per soldi|soldi|tesoro
 🪙|argento|denaro|dollaro|euro|metallo|moneta|oro|ricco|soldi|tesoro
 💴|banca|banconota|denaro|giappone|soldi|valuta|yen
 💵|banca|banconota|banconote|contanti|denaro|dollaro|moneta|soldi|valuta
 💶|banca|banconota|cash|crisi|denaro|euro|millionario|soldi|valuta
-💷|banconota|banconote|brexit|cash|denaro|gran bretagna|millionario|pound|ricco|soldi|sterlina|uk|valuta
+💷|banconote|brexit|cash|denaro|gran bretagna|millionario|pound|ricco|soldi|sterlina|uk|valuta
 💸|banconota con le ali|soldi che volano|soldi con le ali
 💳|addebito|banca|carta di credito|credito|denaro|pagare|soldi
 🧾|contabilità|fattura|invoice|prova|ricevuta di pagamento|scontrino|tenuta dei libri
-💹|ascendente|banca|crescita|finanza|grafico in rialzo|grafico yen in rialzo|in rialzo|mercati|mercato in salita|rialzo|trend|valute|yen
+💹|ascendente|banca|crescita|finanza|grafico yen in rialzo|in rialzo|mercati|mercato in salita|rialzo|trend|valute|yen
 📧|busta|comunicazione|e-mail|email|inviare|lettera|mail|posta elettronica|ricevere
 📨|busta|comunicazione|consegnare|e-mail|email|in arrivo|lettera|mail|posta in arrivo|posta ricevuta
 📩|busta con freccia|comunicazione|email|in uscita|lettera|mail|posta in uscita|posta inviata
@@ -1334,13 +1339,14 @@
 🧰|attrezzi|attrezzo|cassetta degli attrezzi|cassetta per gli attrezzi|meccanico|strumenti|strumento
 🧲|a forma di u|attrazione|calamita|ferro di cavallo|magnete|magnetica|magnetico|positivo negativo
 🪜|arrampicarsi|oggetto|piolo|scala a pioli|scalino
+🪏|buco|pala|scavare|spalare|vanga
 🧪|chimica|chimico|esperimenti|esperimento|laboratorio|provetta|scienza
 🧫|batterio|biologa|biologia|biologo|capsula di petri|coltura|cultura|laboratorio|piastra di petri
 🧬|biologo|dna|evoluzione|genetica|geni|vita
 🔬|analisi|esperimento|microrganismo|microscopio|ricerca|scienza|scienziata|scienziato|strumento
-🔭|astronomia|cielo|corpi celesti|costellazioni|galileo galilei|osservare|osservatorio|osservazione delle stelle|scientifico|scienza|scienze|spazio|stelle|strumento|telescopio|universo
+🔭|astronomia|corpi celesti|costellazioni|galileo galilei|osservatorio|osservazione delle stelle|scientifico|scienza|spazio|stelle|telescopio|universo
 📡|antenna parabolica|antenne paraboliche|antenne satellitari|comunicazione|parabola|satellitare|satellite|scienza|scienze|tecnologia
-💉|ago|dottore|iniezione|malato|medicina|medico|ospedale|puntura|sangue|siringa|vaccinare|vaccinazione|vaccino
+💉|ago|dottore|iniezione|malato|medicina|medico|ospedale|puntura|sangue|siringa|vaccinazione|vaccino
 🩸|ciclo mestruale|donare il sangue|donazione di sangue|goccia di sangue|medicinale|mestruazioni
 💊|dottore|farmaco|malato|malattia|medicina|pillola|pillole|vitaminca
 🩹|cerotto adesivo
@@ -1392,7 +1398,7 @@
 🚾|bagni|bagno|gabinetto|segnale|servizi|simbolo del wc|toilette|wc
 🛂|aeroporto|controllo|dogana|immigrazione|passaporti|passaporto|segnale|simbolo del controllo passaporti
 🛃|confine di stato|controllo doganale|dogana|doganiere|frontiera|polizia di frontiera|simbolo della dogana|viaggiare
-🛄|aereo|aeroporto|arrivare|bagagli|check in|fare i bagagli|gita|partire|pronti|ritiro|simbolo del ritiro bagagli|valigie|viaggiare|viaggio
+🛄|aereo|aeroporto|arrivare|bagagli|check in|gita|partire|pronti|ritiro|simbolo del ritiro bagagli|valigie|viaggio
 🛅|aeroporto|bagagli|deposito|servizio bagagli|sicurezza|simbolo del deposito bagagli|viaggiare
 ⚠️|attenzione|pericolo|punto esclamativo|simbolo di avviso|triangolo
 🚸|attraversamento pedonale|attraversare|bambini|pedoni|scuola|segnale|simbolo|strada|traffico
@@ -1403,7 +1409,7 @@
 🚯|buttare|divieto|proibito|simbolo del divieto di gettare rifiuti|simbolo vietato gettare rifiuti|vietato gettare rifiuti
 🚱|acqua non potabile|divieto|non potabile|rubinetto|simbolo acqua non potabile|simbolo di acqua non potabile|vietato
 🚷|divieto transito pedoni|niente pedoni|no pedoni|proibito|segnale|simbolo del divieto di transito pedoni|strada|vietato
-📵|cellulare|cellulari vietati|divieto|niente cellulare|no cellulare|no telefono|proibito|segnale|segno|simbolo che vieta l’uso dei cellulari|telefono|vietato telefonare
+📵|cellulari vietati|divieto|niente cellulare|no cellulare|no telefono|proibito|segnale|segno|simbolo che vieta l’uso dei cellulari|telefono|vietato telefonare
 🔞|18 sbarrato|divieto ai minori|minori|proibito|simbolo di divieto ai minorenni|vietato ai minori di 18|vietato ai minori di anni 18
 ⬆️|alto|direzione|freccia in alto|freccia rivolta verso l’alto|nord|punto cardinale
 ➡️|avanti|destra|direzione|est|freccia a destra|freccia rivolta verso destra|punto cardinale
@@ -1468,7 +1474,7 @@
 💲|cash|contanti|denaro|dollaro|pagare|simbolo del dollaro|soldi|valuta
 ♻️|raccolta differenziata|riciclaggio|riciclare|riciclo|simbolo del riciclaggio
 ⚜️|araldica|fiore|giglio araldico|simbolo|stemma
-🔱|ancora|barca|dio del mare|favola|fiaba|mare|marino|naufragio|nave|oceano|poseidone|simbolo|tridente
+🔱|ancora|barca|dio del mare|favola|fiaba|marino|naufragio|nave|oceano|poseidone|simbolo|tridente
 📛|badge|etichetta a tulipano|giapponese|nome|tesserino per nome|tulipano
 🔰|etichetta gialla e verde principiante|gallone|giallo|ideogramma giapponese di principiante|patente|principiante|simbolo principiante giappone|verde|zig zag
 ⭕|cerchio rosso vuoto|gioco|pallino|tris
@@ -1477,6 +1483,7 @@
 ➰|cerchio|nodo|occhiello
 ➿|doppio|occhiello
 〽️|canzone|divisione spartito|parti musicali|segno|simbolo di alternanza delle parti|suddivisione parti
+🫟|chiazza|holi|pittura|rovesciare|schizzo|vernice
 🔠|abcd|caratteri latini|inserire|lettere|maiuscole|pulsante con lettere latine maiuscole|tasto
 🔡|caratteri latini|inserire|lettere|minuscole|pulsante con lettere latine minuscole|tasto
 🔢|1234|inserire|numeri|pulsante con numeri|tastierino numerico
@@ -1498,7 +1505,7 @@
 🆘|aiuto|pulsante sos|segnale di sos|simbolo di sos|simbolo sos|soccorsi|soccorso|sos
 🆙|alto|in alto|pulsante|simbolo up!|sù|tasto up!|up!
 🆚|contro|pulsante|simbolo contro|tasto|versus|vs
-🈁|giapponese|ideogramma giapponese per qui|ideogramma katakana qui|katakana|parola|pulsante|qui|simbolo|tabelloni|tasto|ココ
+🈁|giapponese|katakana|parola|pulsante|qui|simbolo|tabelloni|tasto|ココ
 🈂️|ideogramma giapponese di costo del servizio|ideogramma katakana sa|katakana|parola|sa
 🈷️|cinese|giapponese|ideogramma giapponese di importo mensile|luna|mese
 🈶|esistere|giapponese|ideogramma giapponese di a pagamento
@@ -1508,11 +1515,11 @@
 🈚|giapponese|gratis|ideogramma giapponese di gratis|negazione
 🈲|giapponese|ideogramma giapponese di proibito|proibito
 🉑|accettabile|accettare|cinese|giapponese|ideogramma giapponese di accettabile
-🈸|applicare|candidarsi|cinese|giapponese|ideogramma giapponese di candidatura|申
+🈸|applicare|candidarsi|cinese|giapponese|ideogramma giapponese di candidatura
 🈴|cinese|giapponese|ideogramma giapponese di voto di sufficienza|insieme|sufficienza
 🈳|cinese|disponibilità|giapponese|ideogramma giapponese di posto libero|libero|posto libero|vuoto
 🈺|aperto al pubblico|aperto per affari|cinese|giapponese|ideogramma giapponese di aperto al pubblico|ideogramma in funzione|in funzione
-🈵|cinese|giapponese|ideogramma giapponese di nessun posto libero|nessun posto libero|pienezza|pieno|満
+🈵|cinese|giapponese|ideogramma giapponese di nessun posto libero|nessun posto libero|pienezza|pieno
 🔴|cerchio rosso grande|geometria|rosso|stop
 🟠|arancione|cerchio arancio|cerchio di colore arancione|forma
 🟡|cerchio di colore giallo|colore giallo|forma|giallo
@@ -1552,7 +1559,7 @@
 🎌|bandiere del giappone incrociate|festa|festeggiamenti|giapponese|giapponesi|incrociate
 🏴|bandiera che sventola|bandiera nera
 🏳️|arrendersi|bandiera bianca|bandiera che sventola|sos|sventolare bandiera bianca
-🏳️‍🌈|bandiera arcobaleno|bisessuale|bisex|gay|genderqueer|glbtq|lesbica|lgbtqia|omosessuale|pace|pride|transgender
+🏳️‍🌈|bisessuale|bisex|gay|genderqueer|glbtq|lesbica|lgbtqia|omosessuale|pace|pride|transgender
 🏳️‍⚧️|azzurro|bandiera|bianco|rosa|transgender
 🏴‍☠️|bandiera dei pirati|corsari|corsaro|pirata|pirati
 🇦🇩|andorra

+ 111 - 103
app/assets/emojis/search-index/nl.csv

@@ -12,7 +12,7 @@
 ☂️|geopende paraplu|kleding|open paraplu|paraplu|regen|weer
 ☃️|koud|sneeuwpop|weer
 ☄️|komeet|ruimte|vuurbal
-☑️|✓|check|gedaan|klaar|symbool|teken|to-do|vak|vinkje in vak|wit vinkje in grijs vak
+☑️|✓|check|klaar|stem|uit|vak|vinkje
 ☔|druppels|kleding|paraplu met regendruppels|regen|weer
 ☕|café|cafeïne|chai|drank|drinken|koffie|ochtend|stomen|thee|warm
 ☘️|iers|klavertjedrie|plant
@@ -66,28 +66,28 @@
 〰️|golvend|interpunctie|streepje
 ㊗️|gefeliciteerd|ideogram|japans|knop
 ㊙️|geheim|ideogram|japans|knop
-😀|gezicht|grappig|grijns|grijnzend gezicht|lachend gezicht met open ogen|leuk|smiley
-😃|gaaf|gezicht|grappig|grijnzend gezicht met grote ogen|haha|lachend gezicht met open mond|leuk|mond|open|smiley
-😄|gelukkig|gezicht|grijns|grijnzen|lachen|lol|mond|ogen|oog|open
-😁|gezicht|glimlach|grappig|grijns|grijnzend gezicht met lachende ogen|lachende ogen|leuk|oog|smiley|stralend gezicht met lachende ogen
-😆|dichtgeknepen ogen|gelukkig|gesloten|gezicht|glimlachend|grijnzen|hahaha|lachen|lol|mond|ogen|open|rofl
-😅|gestrest|gezicht|grijnzen|koud|lachen|mond|neerslachtig|nerveus|open|opgewonden|stress|zweet
-🤣|gelukkig|gezicht|grappig|haha|hehe|hilarisch|huilen|lachen|lmao|lol|roflmao|rollen|traan|vloer|vreugde
-😂|gelukkig|gevoelens|gezicht|grappig|haha|hehe|hilarisch|huilen|lachen|lmao|lol|roflmao|traan|vreugde
-🙂|enigszins lachend gezicht|gezicht|glimlach|lach|smiley|tevreden
+😀|blij|fijn|gezicht|glimlachen|grijns|grijnzend|lachen|leuk|tanden|vrolijk
+😃|blij|gaaf|gezicht|glimlachen|grijns|grijnzend|groot|joepie|lach|mond|ogen|open|tanden
+😄|blij|gezicht|glimlachen|grijns|grijnzend|lachen|lol|mond|ogen|oog|open
+😁|blij|fijn|gezicht|glimlachen|grijns|grijnzend|lach|ogen|oog|stralend|tanden
+😆|blij|gesloten|gezicht|glimlachen|grijnzend|hahaha|lachen|lol|mond|ogen|open|rofl|scheelzien
+😅|gestrest|gezicht|glimlachen|grijnzend|koud|lach|mond|neerslachtig|nerveus|open|opgewonden|stress|zweet
+🤣|blij|gezicht|grappig|haha|hehe|hilarisch|huilen|lachen|lmao|lol|roflmao|rollen|traan|vloer|vreugde
+😂|blij|gevoelens|gezicht|grappig|haha|hehe|hilarisch|huilen|lachen|lmao|lol|roflmao|traan|vreugde
+🙂|blij|enigszins|gezicht|glimlachen|lach
 🙃|gezicht|glimlach|hehe|omgekeerd
-🫠|heet|oplossen|smeltend gezicht|smiley|verdwijnen|vloeibaar|warm
-😉|flirten|gezicht|knipogend gezicht|knipoog|sexy|smiley|zwoel
-😊|blosjes|blozen|gezicht|glimlach|lachend gezicht met lachende ogen|oog|rode wangen|smiley
-😇|aureool|engel|fantasie|gezegend|gezicht|glimlach|halo|heilig|lach met halo|lachend gezicht met halo|onschuldig|smiley|stralenkrans
-🥰|crush|dol|gezicht|hartjes|jou|lachen|liefde|romantiek
+🫠|beschaamd|gezicht|haha|heet|lol|oplossen|sarcasme|sarcastisch|smelten|verdwijnen|vloeibaar|warm
+😉|flirten|gezicht|hartenbreker|knipogen|knipoogt|plagerij|sexy|zwoel
+😊|blozen|gelukkig|gezicht|glimlachen|ogen|oog|tevreden
+😇|blij|elfje|engelachtig|engelen|fantasie|geest|gezegend|gezicht|glimlachen|onschuldig|sprookje|stralenkrans|verhaal|vredig
+🥰|3|crush|dol|gezicht|glimlachen|hartjes|hou van jou|jou|liefde|romantiek
 😍|gevoelens|gezicht|hartjesogen|kussen|lach|liefde|oog|romantiek|schatje
 🤩|gezicht|grijnzend|lach|ogen|opgewonden|sterren als ogen|sterren in de ogen|wauw
 😘|flirten|gezicht dat kus toeblaast|hartje|kusje blazen|kussen|romantiek|smiley|xoxo|zoen
 😗|afspraakje|date|gezicht|hou van jou|hvj|kussend gezicht|smiley|xoxo|zoen
 ☺️|blij|gezicht|lachen|omtrek|ontspannen
 😚|blosjes|blozen|gesloten ogen|gezicht|kussend gezicht met gesloten ogen|kussend gezicht met ogen dicht|oog|rode wangen|smiley|zoen
-😙|gezicht|glimlachen|hou van jou|hvj|kus en lach|kussend gezicht met lachende ogen|lachende ogen|oog|smiley
+😙|143|afspraakje|daten|flirten|gesloten|gezicht|ik hou van je|kussend|lachen|liefde|nacht|ogen|oog
 🥲|aangedaan|blij|dankbaar|enigszins lachend|gelukkig|lachend gezicht met traan|opgelucht|smiley|traan|trots
 😋|genieten|gezicht|glimlach|jammie|lachend gezicht dat lippen likt|lekker|mmm|smiley|smullen
 😛|gezicht met uitgestoken tong en open ogen|grapje|grappig|ontdeugend|smiley|tong uitsteken|uitgesteken tong
@@ -123,6 +123,7 @@
 😪|gezicht|huilen|slaap|slaperig gezicht|smiley|traan
 🤤|gezicht|kwijlend
 😴|bedtijd|dutje|gapen|gezicht|moe|slaap lekker|slapend gezicht|smiley|vermoeid|welterusten|zzz
+🫩|gezicht met wallen onder de ogen|moe|slaperig|uitgeput
 😷|besmet|doktersmasker|gezicht met doktersmasker|gezicht met masker|koud|masker|medicijn|medisch masker|smiley|virus|ziek
 🤒|gezicht met thermometer|niet lekker|thermometer|ziek
 🤕|gewond|gezicht met hoofdverband|pijn|verband|verwonding
@@ -183,7 +184,7 @@
 🤖|gezicht|monster|robot
 😺|dier|gezicht|grijnzen|kat|lachen|mond|open
 😸|dier|gezicht|grijns|grijnzend kattengezicht met lachende ogen|grijnzende kat met lachende ogen|kat|lach|oog|vrolijk
-😹|dier|gelukstranen|gezicht|grappig|hilarisch|kat met tranen van vreugde|kattengezicht met tranen van geluk|lachen|smiley|traan|tranen|vreugdetranen
+😹|dier|gezicht|kat|lachen|lol|traan|tranen|vreugde
 😻|dier|gezicht|hartjesogen|kat|lachen|liefde|oog
 😼|gezicht|gniffelende kat|grimas|ironische lach|kattenkwaad|lach|ondeugend kattengezicht|smiley|spottend
 😽|dier|gezicht|kat|kussend kattengezicht met gesloten ogen|kussende kat|oog|smiley
@@ -341,7 +342,7 @@
 👨‍⚕️|arts|gezondheidszorg|man|therapeut|verpleger|werknemer
 👩‍⚕️|arts|gezondheidszorg|therapeute|verpleegster|vrouw|werknemer
 🧑‍🎓|scholier|student
-👨‍🎓|scholier|student|vrouw
+👨‍🎓|man|scholier|student
 👩‍🎓|scholier|student|vrouw
 🧑‍🏫|docent|leraar|professor
 👨‍🏫|docent|instructeur|leraar|man|professor
@@ -551,15 +552,16 @@
 👪|gezin|kind
 🧑‍🧑‍🧒|gezin|kind|volwassene
 🧑‍🧑‍🧒‍🧒|gezin|kind|volwassene
-🧑‍🧒|gezin: volwassene, kind|kind
-🧑‍🧒‍🧒|gezin: volwassene, kind, kind|kind
+🧑‍🧒|gezin|kind|volwassene
+🧑‍🧒‍🧒|gezin|kind|volwassene
 👣|afdruk|blote voeten|kleding|lopen|onderweg|voetafdrukken
-🐵|aap|apengezicht|dier|gezicht
-🐒|aap|dier
+🫆|forensisch|identiteit|veiligheid|vingerafdruk
+🐵|aap|banaan|dier|gezicht
+🐒|aap|banaan|dier
 🦍|dier|gorilla
 🦧|aap|dier|orang-oetang
-🐶|dier|gezicht|hondengezicht|huisdier|viervoeter
-🐕|dier|hond|huisdier|viervoeter
+🐶|dier|gezicht|hond|huisdier|puppy’s|schattig
+🐕|dieren|honden|huisdier
 🦮|blind|dier|geleide|hond|toegankelijkheid
 🐕‍🦺|assistentie|dier|hond|hulp|toegankelijkheid
 🐩|dier|hond|pluizig|poedel
@@ -567,33 +569,33 @@
 🦊|dier|gezicht|vos
 🦝|dier|nieuwsgierig|sluw|wasbeer
 🐱|dier|gezicht|huisdier|kat|kitten
-🐈|dier|huisdier|kat|kitten
+🐈|dieren|huisdier|katten|kitten
 🐈‍⬛|dier|halloween|katachtig|miauw|pech|zwart
-🦁|brul|dier|gezicht|horoscoop|leeuwengezicht|leo|simba|sterrenbeeld
-🐯|dier|gezicht|roofdier|tijgergezicht
-🐅|dier|roofdier|tijger
-🐆|dier|luipaard|panter|roofdier
-🐴|dier|gezicht|paardengezicht
+🦁|alfa|brul|dier|gezicht|leeuw|leo|manen|orde|safari|sterk|sterrenbeeld
+🐯|dier|gezicht|groot|kat|roofdier|tijger
+🐅|dierentuin|groot|kat|roofdier|tijger
+🐆|dierentuin|groot|kat|luipaard|roofdier
+🐴|boerderij|dier|dressuur|gezicht|paarden
 🫎|dier|eland|gewei|zoogdier
 🫏|dier|ezel|grauwtje|koppig|muildier|pakezel|zoogdier
-🐎|dier|paard|racen|racepaard|renpaard|ruitersport
+🐎|boerderij|dier|paard|racen|renpaard|ruitersport
 🦄|eenhoorn|gezicht
 🦓|dier|streep|zebra
 🦌|dier|hert
 🦬|bizon|buffel|dier|kudde|wisent
-🐮|boe|dier|gezicht|koeiengezicht
-🐂|dier|horoscoop|os|sterrenbeeld|stier|taurus
-🐃|buffel|dier|waterbuffel
-🐄|boe|dier|koe|melk
-🐷|dier|gezicht|varkensgezicht
-🐖|big|dier|varken|zeug
+🐮|boerderij|dier|gezicht|koe|melk
+🐂|boerderij|dieren|os|sterrenbeeld|stier|taurus
+🐃|buffel|dierentuin|water
+🐄|boerderij|dieren|koe|melk
+🐷|boerderij|dier|gezicht|spek|varken
+🐖|boerderij|dier|spek|varken|zeug
 🐗|dier|varken|zwijn
 🐽|gezicht|neus|varkensneus
-🐏|aries|dier|horoscoop|mannelijk|ram|schaap|sterrenbeeld
-🐑|blaten|dier|ooi|ram|schaap|vrouwelijk
-🐐|bok|dier|geit|horoscoop|steenbok|sterrenbeeld
-🐪|bult|dier|dromedaris|kameel met één bult|woestijn
-🐫|bult|dier|kameel met twee bulten|vervoermiddel|woestijn
+🐏|aries|dierentuin|horens|mannelijk|ram|schaap|sterrenbeeld
+🐑|blaten|boerderij|dier|lam|ooi|schaap|vrouwelijk|wollig
+🐐|boerderij|capricorn|dier|geit|melk|sterrenbeeld
+🐪|bult|dier|dromedaris|één|kameel|woestijn
+🐫|bult|dier|dromedaris|kameel|twee bulten|woestijn
 🦙|alpaca|dier|guanaco|lama|vicuña|wol
 🦒|dier|giraffe|vlekken
 🐘|dier|olifant
@@ -601,7 +603,7 @@
 🦏|dier|neushoorn
 🦛|dier|hippopotamus|nijlpaard
 🐭|dier|gezicht|muis
-🐁|dier|knaagdier|muis
+🐁|dieren|muis
 🐀|dier|rat
 🐹|dier|gezicht|hamster|huisdier
 🐰|dier|gezicht|huisdier|konijn
@@ -610,9 +612,9 @@
 🦫|bever|dam|dier|tanden
 🦔|dier|egel|stekelig
 🦇|dier|vampier|vleermuis
-🐻|beer|berengezicht|dier|gezicht|knuffel
+🐻|beer|dier|gezicht|grizzly|grommen|honing
 🐻‍❄️|beer|ijsbeer|noordpool|wit
-🐨|australië|beer|dier|down under|koala
+🐨|australië|beer|buideldier|dier|down|gezicht|koala|under
 🐼|bamboe|dier|gezicht|panda
 🦥|luiaard|traag
 🦦|dier|otter|speels|vissen
@@ -651,61 +653,67 @@
 🐉|dier|draak|ridders|sprookje
 🦕|brachiosaurus|brontosaurus|dinosaurus|diplodocus|sauropode
 🦖|dinosaurus|rex|t-rex|tyrannosaurus
-🐳|dier|gezicht|spuitende walvis|spuitgat|walvis
-🐋|dier|vis|walvis
-🐬|dier|dolfijn|flipper
+🐳|dier|gezicht|oceaan|spuitend|strand|walvis
+🐋|dier|oceaan|strand|walvis
+🐬|dier|dolfijn|flipper|oceaan|strand
 🦭|dier|leeuw|oceaan|zeehond
-🐟|dier|horoscoop|sterrenbeeld|vissen
-🐠|dier|tropische vis|vis
+🐟|dier|eten|pisces|sterrenbeeld|vissen
+🐠|dier|tropisch|vissen
 🐡|dier|kogelvis|vis
 🦈|dier|haai|vis
-🐙|dier|oceaan|octopus|zee
+🐙|dier|oceaan|octopus|wezen
 🐚|dier|schelp|spiraal|strand|zee
 🪸|klimaat|koraal|oceaan|rif|verandering|zee
-🪼|au|branden|gelei|kwal|oceaan|ongewerveld|stekel|tentakels|zee
+🪼|aquarium|au|beet|branden|dier|gelei|kwal|leven|oceaan|ongewerveld|plankton|stekel|tentakels|zee
+🦀|dierenriem|krab|kreeft
+🦞|bisque|dier|kreeft|scharen|zeevruchten
+🦐|garnaal|klein|schaaldier|voedsel
+🦑|dier|inktvis|voedsel|weekdier
+🦪|duiken|oester|parel
 🐌|dier|escargot|naaktslak|natuur|slak|tuin
 🦋|insect|mooi|vlinder
-🐛|beestje|dier|insect|rups
-🐜|dier|insect|mier
-🐝|bij|dier|hommel|honingbij|insect|wesp
+🐛|beestje|dier|insect|tuin
+🐜|dier|insect|mier|tuin
+🐝|bij|dier|hommel|honingbij|insect|lente|natuur
 🪲|beestje|dier|insect|kever
-🐞|dier|insect|kever|lieveheersbeestje
+🐞|dier|insect|kever|lieveheersbeestje|natuur|tuin
 🦗|dier|insect|krekel|orthoptera|sprinkhaan
 🪳|bakkerstor|dier|insect|kakkerlak|plaag
-🕷️|dier|geleedpotigen|insect|spin
+🕷️|dier|insect|spin
 🕸️|spinnenweb|web
-🦂|dier|horoscoop|schorpioen|scorpio|sterrenbeeld
+🦂|schorpioen|scorpio|scorpius|sterrenbeeld
 🦟|beet|insect|koorts|malaria|mug|ongedierte|virus|ziekte
 🪰|dier|insect|made|ongedierte|rottend|vlieg|ziekte
 🪱|dier|parasiet|regenworm|ringworm|worm
 🦠|amoebe|bacteriën|microbe|virus|wetenschap
 💐|afspraakje|bedankt|beterschap|bloem|boeket|date|jubileum|romantiek|verjaardag
-🌸|bloem|bloesem|kersenbloesem|plant
-💮|bloemenstempel|witte bloem
+🌸|bloem|bloesem|kers|lente|plant|voorjaar
+💮|bloem|wit
 🪷|bloem|boeddhisme|hindoeïsme|lotus|puurheid|rust|schoonheid|sereen|vrede
 🏵️|plant|rozet
-🌹|bloem|liefde|plant|roos|valentijn
+🌹|bloem|elegant|liefde|plant|rood|roos|schoonheid|valentijn
 🥀|bloem|sterven|verwelkt
 🌺|bloem|hibiscus|plant
-🌻|bloem|plant|zonnebloem
+🌻|bloem|buiten|plant|zonnebloem
 🌼|bloem|bloesem|boterbloem|paardenbloem|plant
-🌷|bloem|plant|tulp
+🌷|bloem|bloesem|groei|plant|tulp
 🪻|bloem|hyacint|lavendel|leeuwenbek|lupine|vlinderbloemige
 🌱|jong|plant|spruit|stekje|zaailing
 🪴|decor|groeien|huis|plant|potplant|verzorgen
-🌲|boom|dennenboom|naaldboom|plant|spar
-🌳|bladeren verliezen|boom die bladeren verliest|bos|loof verliezen|loofboom
-🌴|boom|palmboom|plant|tropisch|vakantie
-🌵|cactus|droogte|plant|woestijn
-🌾|aar|graan|plant|rijstaar|rijstplant
+🌲|boom|bos|dennenboom|kerst|naaldboom
+🌳|boom|bos|groen|habitat|loofboom|verliezen
+🌴|boom|palm|plant|strand|tropisch
+🌵|cactus|droogte|natuur|plant|woestijn
+🌾|aar|graan|granen|plant|rijstaar
 🌿|blad|kruid|plant
-🍀|4|blad|geluk|klavertjevier|plant|vier
+🍀|4|blad|geluk|iers|klavertjevier|plant|vier
 🍁|blad|esdoorn|vallend
 🍂|blad|gevallen|herfst|vallend
 🍃|blad|blazen|fladderen|wind
 🪹|leeg|nestelen|tak|thuis
 🪺|eieren|nestelen|tak|vogel
 🍄|paddenstoel|schimmel|zwam
+🪾|boomstam|dood|droogte|hout|kaal|leeg|takken|winter|zonder bladeren
 🍇|dionysus|druif|druiven|fruit
 🍈|fruit|kanteloep|meloen
 🍉|fruit|watermeloen
@@ -744,6 +752,7 @@
 🫚|bier|gemberwortel|specerij|wortel
 🫛|bonen|dop|edamame|erwtendop|groente|peulvrucht
 🍄‍🟫|bruine paddenstoel|bruine paddestoel|champignon|eten|groente|natuur|paddenstoel|paddo|pizza|schimmel|shiitake
+🫜|biet|groente|raap|tuin|wortel
 🍞|brood|eten|koolhydraten|tarwe|voedsel
 🥐|brood|croissant|eten|frans|ontbijt|voedsel
 🥖|brood|eten|frans|stokbrood
@@ -767,10 +776,10 @@
 🫔|eten|mexicaans|pamonha|tamale|verpakt
 🥙|eten|falafel|gevuld|gyros|kebab|pitabrood
 🧆|falafel|gehaktbal|kikkererwt
-🥚|ei|eten|voedsel
+🥚|ei|ontbijt|voedsel
 🍳|bakken|ei|gemakkelijk|koken|ontbijt|pan|restaurant|spiegelei
 🥘|braadpan|eten|ondiep|paella|pan
-🍲|eenpansgerecht|eten|stoofschotel|voedsel
+🍲|pan|soep|stoofschotel|voedsel
 🫕|chocolade|eten|fondue|gesmolten|kaas|pot|ski
 🥣|cornflakes|eten|kom met lepel|muesli|ontbijtgranen|pap|soep|voedsel
 🥗|eten|groen|salade
@@ -795,11 +804,6 @@
 🥟|dumpling|empanada|gyōza|jiaozi|pierogi|potsticker
 🥠|geluk|koekje|profetie
 🥡|afhaalmaaltijd|bezorgen|doggybag|eten|oesteremmer|stokjes|voedsel
-🦀|dierenriem|krab|kreeft
-🦞|bisque|dier|kreeft|scharen|zeevruchten
-🦐|garnaal|klein|schaaldier|voedsel
-🦑|dier|inktvis|voedsel|weekdier
-🦪|duiken|oester|parel
 🍦|dessert|eten|ijs|restaurant|room|softijs|zoet
 🍧|dessert|geschaafd|ijs|restaurant|zoet
 🍨|dessert|eten|ijs|restaurant|room|zoet
@@ -1201,9 +1205,10 @@
 🎻|instrument|muziekinstrument|stradivarius|viool
 🪕|banjo|besnaard|instrument|muziek|snaarinstrument|spelen
 🥁|drummen|drumsticks|muziekinstrument|trommelen|trommelstokken
-🪘|beat|bongo|conga|dansen|drummen|hoge trom|ritme|trommelen|voorwerp
+🪘|beat|conga|hoog|instrument|ritme|trom
 🪇|instrument|muziek|percussie|ratelen|sambaballen|schudden
 🪈|blokfluit|dwarsfluit|fluit|houtblazer|muziek|pijperfluit
+🪉|cupido|harp|instrument|liefde|muziek|orkestra
 📱|bellen|communicatie|mobiele telefoon|smartphone|telefoon
 📲|bellen|mobiel met pijl|mobiele telefoon|ontvangen|pijl|smartphone|telefoon
 ☎️|rode telefoon met hoorn|telefoon|vaste telefoon
@@ -1334,6 +1339,7 @@
 🧰|doos|gereedschapskist|kist|monteur|rode kist
 🧲|aantrekkingskracht|hoefijzer|magneet|magnetisch|positief negatief|uvormig
 🪜|klimmen|ladder|omhoog|omlaag|sport|trede|voorwerp
+🪏|gat|graven|schep|schop|spade
 🧪|chemicus|experiment|laboratorium|reageerbuis|scheikunde|scheikundige|wetenschap
 🧫|bacterie|bacteriën|biologe|biologie|bioloog|cultuur|kweek|laboratorium|petrischaal
 🧬|biologe|bioloog|dna|evolutie|genetica|genetisch|leven
@@ -1383,25 +1389,25 @@
 🪪|beveiliging|id-kaart|identificatie|identiteitskaart|legitimatiebewijs|overheid|vergunning
 🏧|atm|automaat|bank|geld|pinautomaat|pinnen
 🚮|afval|prullenbak|teken|vuilnisbak
-🚰|drinkwatersymbool|kraan met glas|kraanwater
+🚰|drinkbaar|water
 ♿|handicap|rolstoel|symbool|toegang
-🚹|heren-wc|herensymbool|herentoilet|mannen|symbool|toilet|wc
-🚺|dames-wc|damessymbool|damestoilet|symbool|toilet|vrouwen|wc
-🚻|toiletsymbool|toiletten|unisex|wc
+🚹|heren|man|plee|toilet|urinoir|wc
+🚺|dames|plee|toilet|vrouw|wc
+🚻|plee|toilet|wc
 🚼|baby|symbool|verschonen
 🚾|toilet|wasgelegenheid|water|wc
 🛂|controle|paspoort
-🛃|douane|vliegveld
-🛄|aangekomen|bagage afhalen|bagage ophalen|bagageband|koffer|reizen|vliegveld
+🛃|douane|inpakken
+🛄|aangekomen|bagage|ingecheckt|inpakken|klaar|koffer|ophalen|reisje|reizen|tassen|vliegtuig
 🛅|achtergelaten|bagage|kluisje|koffer
 ⚠️|voorzichtig|waarschuwing
 🚸|kinderen|oversteekplaats|verkeer|voetganger
-⛔|geen toegang|nee|symbool|verboden toegang
+⛔|belemmerd|doorgang|geen|ingang|mislukt|niet|toegang|verboden|verkeer
 🚫|nee|niet|roken|toegang|verboden
 🚳|fietsen|nee|niet|verboden
 🚭|nee|niet|roken|verboden
 🚯|geen|niet|verboden|zwerfvuil
-🚱|drinken verboden|geen drinkwater|niet drinkbaar|niet drinken|water
+🚱|droog|geen drinkwater|niet drinkbaar|verboden|water
 🚷|nee|niet|verboden|voetgangers
 📵|mobiel|nee|niet|telefoons|verboden
 🔞|18|achttien|beperking|één|leeftijd|minderjarig|nee|niet|verboden
@@ -1418,13 +1424,13 @@
 🔛|on!|pijl|teken
 🔜|onderweg|pijl|soon|zo terug
 🔝|omhoog|pijl|top
-🛐|bidden|gebedsruimte|geloof|religie|tempel
+🛐|bidden|godsdienst|plaats|religie
 ⚛️|atheïst|atoom|symbool
 🕉️|hindoeïsme|om|religie
 ☯️|leven|moeilijk|religie|taoist|totaal|yang|yin en yang
-✝️|christelijk kruis|christendom|geloof|kruis|religie
-☪️|geloof|islam|moslim|ramadan|religie|wassende maan en ster
-☮️|hippie|peace|symbool|vredessymbool|vredesteken
+✝️|christelijk|christus|kruis|latijns|religie
+☪️|islam|moslim|ramadan|religie|ster|wassende maan
+☮️|helend|symbool|vrede|vredig
 🕎|hannuka|jodendom|joods|kandelaar|menora|religie
 🔯|geluk|jodendom|joods|met stip|ster|zespuntig
 🪯|khanda|religie|sikh
@@ -1444,10 +1450,10 @@
 ⏯️|driehoek|knop|pauzeren|pijl|rechts|spelen
 ◀️|achteruit|driehoek|knop|links|pijl
 ⏪|dubbele pijl links|knop voor versneld terugspoelen|links|pijl|terugspoelen
-⏮️|driehoek|dubbele pijl naar links|knop voor vorig nummer|knop voor vorige nummer|pijl|vorige nummer|vorige scène
+⏮️|driehoek|knop|laatste|nummer|pijl|scène|vorige
 🔼|knop|omhoog|pijl|rood
 ⏫|dubbel|knop|omhoog|pijl|snel
-🔽|driehoek|knop voor omlaag|omlaag|pijl|rood
+🔽|beneden|knop|omlaag|pijl|rood
 ⏬|dubbel|knop|omlaag|pijl|snel
 ⏸️|dubbel|knop|pauze|streep|verticaal
 ⏹️|knop voor stoppen|stoppen|vierkant
@@ -1470,21 +1476,22 @@
 ⚜️|fleur-de-lis|ridders
 🔱|anker|drietand|embleem|gereedschap|poseidon|schip
 📛|badge|kaartje|naamkaartje
-🔰|beginner|blad|chevron|groen en geel|japans ideogram voor beginner|japans symbool voor beginner|onderscheiding
-⭕|cirkel|groot|grote rode cirkel|lege rode cirkel|o|rood
+🔰|beginner|blad|chevron|geel|gereedschap|groen|japans|symbool
+⭕|cirkel|groot|hol|o|rood|vet
 ❌|×|annuleren|kruis|teken|vermenigvuldigen|vermenigvuldiging|x
-❎|×|knop voor kruis|kruis|teken|vermenigvuldigen|vierkant|wit kruis in groen vak|x
+❎|×|knop|kruis|teken|vermenigvuldigen|vermenigvuldiging|vierkant|x
 ➰|gedraaid|gekrulde lus|lus
 ➿|dubbel|krullend|lus
 〽️|markering|rolwisselingsmarkering|teken
+🫟|druppel|geknoei|gemors|gespat|holi|inkt|verf|vlek|vloeistof
 🔠|abcd|hoofdletters|invoeren|latijns|letters
 🔡|abcd|invoeren|kleine letters|latijns|letters
 🔢|1234|cijfers|invoeren
 🔣|&|%|♪|〒|invoeren|symbolen
 🔤|abc|alfabet|invoeren|latijns|letters
-🅰️|a-knop|bloedgroep
-🆎|ab|bloedgroep
-🅱️|b-knop|bloedgroep
+🅰️|bloed|groep|knop
+🆎|ab|bloed|groep|knop
+🅱️|bloed|groep|knop
 🆑|cl|knop
 🆒|cool|knop
 🆓|free|knop
@@ -1492,7 +1499,7 @@
 Ⓜ️|cirkel|in cirkel|m
 🆕|knop|new
 🆖|knop|ng
-🅾️|bloedgroep|o-knop
+🅾️|bloed|groep|knop|o
 🆗|knop|oké
 🅿️|knop|parkeren
 🆘|help|knop|sos
@@ -1524,19 +1531,19 @@
 ⚪|cirkel|geometrisch|wit
 🟥|kaart|penalty|rood|vierkant
 🟧|oranje|vierkant
-🟨|geel|gele kaart|kaart|kleur|penalty|vierkant
+🟨|geel|kaart|penalty|vierkant
 🟩|groen|vierkant
 🟦|blauw|vierkant
 🟪|paars|vierkant
 🟫|bruin|vierkant
 ⬛|geometrisch|groot|vierkant|zwart
-⬜|geometrisch|groot wit vierkant|vierkant|vorm
+⬜|geometrisch|groot|vierkant|wit
 ◼️|geometrisch|middelgroot|vierkant|zwart
 ◻️|middelgroot|vierkant|wit
-◾|geometrisch|klein tot middelgroot zwart vierkant|middelgroot zwart vierkant|redelijk klein zwart vierkant|vierkant|vorm
+◾|geometrisch|klein tot middelgroot|vierkant|zwart
 ◽|geometrisch|klein tot middelgroot|vierkant|wit
 ▪️|geometrisch|klein|vierkant|zwart
-▫️|geometrisch|klein wit vierkant|vierkant|vorm
+▫️|geometrisch|klein|vierkant|wit
 🔶|diamant|geometrisch|groot|oranje
 🔷|blauw|diamant|geometrisch|groot
 🔸|diamant|geometrisch|klein|oranje
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|engeland
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|schotland
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🇨🇶|sark

+ 31 - 23
app/assets/emojis/search-index/no.csv

@@ -73,7 +73,7 @@
 😆|åpen munn|artig|fjes|flir|fornøyd|glad|gøy|haha|latter|ler|lol|lykkelig|morsomt|smil med sammenknepne øyne|smiler
 😅|åpen|glisende fjes som svetter|kaldsvette|munn|smil med svette|svett smil med åpen munn
 🤣|artig|fjes|flirer|gøyalt|gulv|hæhæ|haha|hoho|latter|ler så jeg griner|lol|lykkelig|morsomt|roflmao|ruller rundt på gulvet i latter
-😂|fjes med gledestårer|flire|gledestårer|glise|gøy|hæhæ|haha|hoho|latter|ler så jeg griner|lol|morsomt|roflmao|tårer
+😂|fjes|flire|gledestårer|gøy|haha|hoho|latter|le|lol|morsomt|tårer
 🙂|fjes|smiler litt
 🙃|fjes som er opp-ned|opp-ned
 🫠|fjes som smelter|flau|forsvinner|går i oppløsning|haha|lol|sarkasme|sarkastisk|smelter
@@ -97,8 +97,8 @@
 🤑|fjes|munn|pengegal|penger
 🤗|fjes som gir klem|klem
 🤭|flire|hand over munnen|hånd over munnen|handa over munnen|hånden over munnen|oi|oops|ops|ups
-🫢|fjes med åpne øyne og hånd over munnen|flau|forskrekkelse|gispe|omg|overraskelse|redd|sjokkert|stille
-🫣|engstelig|fjes som titter frem bak hendene|flau|gjemme seg|gjemmer seg|kikker|klarer ikke dy seg|må se|redd|sjenert|stirre|titte
+🫢|åpne|fjes|flau|forskrekkelse|gispe|hånd|munnen|omg|overraskelse|øyne|redd|sjokk|stille
+🫣|fascinert|fjes|flau|gjemme|kikke|øyne|redd|sjenert|skjule|smugkikke|stirre|titte
 🤫|hysj|stillhet|vær stille
 🤔|fjes|tankefull|tenkefjes|tenker
 🫡|fjes som viser honnør|honnør|ja|lykke til|militærhilsen|respekt|salutt|skal bli|yes ma’am|yes sir
@@ -115,7 +115,7 @@
 😬|fjes|grimase
 😮‍💨|fjes|gisper|hviske|lettet|plystre|pust|sliten|sukk|utpust|utslitt
 🤥|fjes|løgn|lyver|pinocchio
-🫨|ansikt|fjes|jordskjelv|omg|ør|overraskelse|panikk|rister|sjokk|skjelvende|sprøtt|vibrerer|wow
+🫨|ansikt|jordskjelv|omg|ør|overraskelse|panikk|riste|sjokk|skjelvende|sprøtt|vibrere|wow
 🙂‍↔️|nei|ristende hode|rister på hodet
 🙂‍↕️|ja|nikkende hode|nikker
 😌|fjes|lettet
@@ -123,6 +123,7 @@
 😪|fjes|søvnig
 🤤|fjes|sikler
 😴|fjes|gjesp|god natt|godnatt|natt|snork|sove|søvn|trett|trøtt
+🫩|fjes|kjedelig|øyne|poser|sliten|søvnig|trøtt|utslitt
 😷|bakteriemaske|fjes med munnbind|sykdom
 🤒|fjes med termometer|syk|termometer
 🤕|bandasjert hode|fjes|skadet
@@ -230,7 +231,7 @@
 🗯️|ballong|boble|sint snakkeboble mot høyre|sur
 💭|boble|tankeboble|tegneserie
 💤|følelse|god natt|snorker|sover|soving|søvnig|tegneserie|trett|trøtt|zzz
-👋|er du der?|ha det|hallo|hånd|hei|hilse|sees|ses|vi sees|vi ses|vinkende hånd|vinking
+👋|farvel|hallo|hand|hånd|hei|hilse|sees|senere|ses|vinke
 🤚|håndbak|løftet
 🖐️|finger|flat hånd med spredte fingre|hånd|spredt
 ✋|flat hånd|håndflate|hevet hånd
@@ -238,7 +239,7 @@
 🫱|håndhilse|håndtrykk|høyrevendt|rekke ut
 🫲|håndhilse|håndtrykk|rekke ut|venstrevendt
 🫳|avfeie|hand|hånd|husj|ned|opp|plukke|slapp|slippe
-🫴|fortell meg|gripe|håndflaten opp|holde|invitere|kalle på|kom|løfte|lokke|tilbud|tilby|vet ikke
+🫴|fortell|håndflate|holde|invitere|kalle|kom|løfte|på|tilbud|tilby|vinke
 🫷|håndflate hevet mot venstre|high five|high-five|holdt|mot venstre|nekte|skyv|stopp|venstre|vent
 🫸|håndflate hevet mot høyre|high five|high-five|holdt|høyre|mot høyre|nekte|skyv|stopp|vent
 👌|ålreit|bra|glimrende|greit|hand|hånd|klart|kult|okay|perfekt|supert
@@ -290,7 +291,7 @@
 👁️|kropp|øye
 👅|fjes|kropp|tunge
 👄|fjes|kropp|lepper|munn
-🫦|bekymre seg|bekymret|bite seg i leppa|bite seg i leppen|flørte|kyss|leppestift|nervøs|redd|sexy|ukomfortabel
+🫦|bekymret|bite|engstelig|flørte|kyss|lepper|leppestift|munn|nervøs|redd|sexy|utilpass
 👶|baby|menneske|ung
 🧒|barn|kjønnsnøytral|menneske|ung
 👦|gutt|menneske|ung
@@ -395,9 +396,9 @@
 💂‍♂️|gardist|mannlig gardist|vakt
 💂‍♀️|gardist|kvinnelig gardist|vakt
 🥷|hemmelig|kampkunst|kampsport|kriger|ninja|skjult|slåss|snikende
-👷|anleggsarbeider|arbeider|hjelm|ingeniør|menneske|person|refleksvest|vernehjelm
-👷‍♂️|anlegg|arbeider|bygg|hjelm|ingeniør|mannlig anleggsarbeider
-👷‍♀️|anlegg|arbeider|bygg|hjelm|ingeniør|kvinnelig anleggsarbeider
+👷|anleggsarbeider|arbeider|bygg|hjelm|ingeniør|menneske|person|refleksvest|vernehjelm
+👷‍♂️|anlegg|arbeider|bygg|hjelm|ingeniør|mannlig anleggsarbeider|refleksvest
+👷‍♀️|anlegg|arbeider|bygg|hjelm|ingeniør|kvinnelig anleggsarbeider|refleksvest
 🫅|adelig|høyhet|kongelig|krone|majestetisk|monark|person|royal
 🤴|prins
 👸|eventyr|fantasy|menneske|prinsesse
@@ -447,7 +448,7 @@
 🧞|aladdin|ånd i lampe|ånden i flasken|djinn|fantasy|flaskeånd|genie|gni på lampen|ønsker
 🧞‍♂️|aladdin|ånd i lampe|ånden i flasken|djinn|fantasy|flaskeånd|genie|gni på lampen|mann|ønsker
 🧞‍♀️|aladdin|ånd i lampe|ånden i flasken|djinn|fantasy|flaskeånd|genie|gni på lampen|kvinne|ønsker
-🧟|apocalypse|dead|halloween|skrekk|skummel|udød|vandød|walking|zombie
+🧟|apokalypse|død|halloween|skrekk|skummel|udød|vandød|zombie
 🧟‍♂️|mannlig zombie|udød|vandød
 🧟‍♀️|kvinnelig zombie|udød|vandød
 🧌|eventyr|fantasi|fantasy|monster|nettroll|troll
@@ -494,7 +495,7 @@
 🏇|galopp|hesteveddeløp|jockey|løp|sport|veddeløpshest
 ⛷️|skiløper|snø
 🏂|snøbrettkjøring|snowboarder|snowboarding|vintersport
-🏌️|ball|caddie|caddy|drive|driving range|golfball|golfer|golfslag|golfspiller|green|pga|putte|sport|tee
+🏌️|ball|birdie|caddy|driving|golfe|green|person|pga|putte|range|tee
 🏌️‍♂️|golfspiller|mannlig golfspiller
 🏌️‍♀️|golfspiller|kvinnelig golfspiller
 🏄|hav|sport|strand|surfebrett|surfer|surfing
@@ -539,9 +540,9 @@
 🛀|badekar|person i badekar
 🛌|god natt|hotell|overnatting|person i seng|sengetid|sove
 🧑‍🤝‍🧑|hånd|holde hender|par|personer som leier
-👭|bestevenner|bff|damer|dating|forelsket|hånd|hender|holde|homo|jenter|kjærester|kvinner|lesbisk|lhbt|par|skeiv|søstre|venner|vennskap
+👭|bestevenner|bff|damer|dating|hender|jenter|kvinner|par|søstre|tvillinger|venner|vennskap
 👫|bestevenner|bff|dating|forelsket|hånd|holder hender|kjærester|kvinne|mann|par|søsken
-👬|bestevenner|bff|brødre|dating|forelsket|gutter|hånd|hender|holde|homo|kjærester|lhbt|mann|menn|par|skeiv|venner|vennskap
+👬|bestevenner|bff|brødre|dating|gutter|hender|karer|menn|par|tvillinger|venner|vennskap
 💏|kyssing|mennesker|romantikk
 💑|hjerte|kjærlighet|mennesker|par med hjerte|romantikk
 🗣️|fjes|hode|silhuett|snakkende hode i profil|snakker
@@ -554,6 +555,7 @@
 🧑‍🧒|barn|familie|voksen
 🧑‍🧒‍🧒|barn|familie|voksen
 👣|avtrykk|fotavtrykk|fotspor|kropp|spor
+🫆|avtrykk|etterforskning|fingeravtrykk|identitet|innbrudd|krim|sikkerhet|spor|teknisk|tyveri
 🐵|apefjes|dyr|fjes
 🐒|ape|dyr
 🦍|ape|dyr|gorilla
@@ -653,7 +655,7 @@
 🦖|dinosaur|t-rex|tyrannosaurus rex
 🐳|dyr|hval|sprutende hval|spruter
 🐋|dyr|hval
-🐬|delfin|dyr
+🐬|delfin|dyr|flipper|hav|strand
 🦭|dyr|hav|sel|sjøløve
 🐟|dyr|fiskene|stjernebilde|stjernetegn
 🐠|dyr|fisk|tropisk
@@ -663,6 +665,11 @@
 🐚|dyr|skjell|spiralskjell
 🪸|dyr|hav|klimaendringer|korallrev|rev
 🪼|au|brennmanet|dyr|glassmanet|havdyr|manet|plankton|sjø|tentakler
+🦀|dyr|krabbe|krepsen|stjernebilde|stjernetegn
+🦞|bisque|hummer|klør|kreps|sjømat|skalldyr
+🦐|dyr|liten|mat|reke
+🦑|akkar|blekksprut|bløtdyr|dyr|sprut
+🦪|dykking|østers|perle
 🐌|dyr|snegle
 🦋|dyr|insekt|pen|sommerfugl
 🐛|åme|dyr|insekt|kryp|larve
@@ -706,12 +713,13 @@
 🪹|bygge|grein|gren|heim|hjem|rede|reir|tomt
 🪺|egg|fugl|grein|gren|heim|hjem|rede|reir|tomt
 🍄|fluesopp|sopp
+🪾|dødt|stamme|tørke|tørt|tre|ufruktbart|vinter
 🍇|drueklase|druer|frukt
 🍈|cantaloupe|frukt|honningmelon|melon
 🍉|frukt|melon|vannmelon
 🍊|appelsin|c|frukt|klementin|mandarin|sitrus|vitamin
 🍋|frukt|sitron|sitrus
-🍋‍🟩|cocktail|drink|frukt|grønn|juice|key lime pie|lime|margarita|mat|mojito|salsa|sitrus|sur|tequila|tropisk
+🍋‍🟩|cocktail|frukt|garnityr|lime|margarita|mojito|salsa|sitrus|syrlig|tequila|tropisk|zest
 🍌|banan|frukt
 🍍|ananas|frukt
 🥭|frukt|mango|tropisk
@@ -744,6 +752,7 @@
 🫚|helse|ingefærrot|krydder|naturlig|øl|rot|sunn|urt
 🫛|belg|bønner|ertebelg|erter|grønnsak|soyabønne|sukkerert
 🍄‍🟫|brun sopp|matsopp|natur|pizzafyll|portobello|sjampinjong|sopp|trøffel|vegetarianer
+🫜|bete|grønnsak|hage|kålrot|nepe|rotgrønnsak|turnips
 🍞|brød|loff
 🥐|brød|croissant|fransk|mat
 🥖|bagett|baguette|brød|fransk|mat
@@ -795,11 +804,6 @@
 🥟|dumpling|empanada|gyoza|jiaozi|melbolle|pirog
 🥠|fortune cookie|lykkekake|spådom
 🥡|bestille|boks|eske|hentemat|kinesisk|mat|spisepinner|takeaway
-🦀|dyr|krabbe|krepsen|stjernebilde|stjernetegn
-🦞|bisque|hummer|klør|kreps|sjømat|skalldyr
-🦐|dyr|liten|mat|reke
-🦑|akkar|blekksprut|bløtdyr|dyr|sprut
-🦪|dykking|østers|perle
 🍦|dessert|iskrem|restaurant|soft-is|softis
 🍧|dessert|is|restaurant|shave-ice|slush-is
 🍨|dessert|iskrem|restaurant
@@ -835,7 +839,7 @@
 🧊|chill|isbit|isterning|kald
 🥢|hashi|spisepinner
 🍽️|gaffel|kniv|matlaging|tallerken med kniv og gaffel
-🍴|bestikk|frokost|gaffel|kniv og gaffel|lunsj|matlaging|middag|namnam|restaurant|spise
+🍴|bestikk|frokost|gaffel|kniv|lunsj|matlaging|middag|nam|restaurant|spise|sulten
 🥄|bestikk|skje
 🔪|kniv|kokkekniv|matlaging|våpen|verktøy
 🫙|beholder|ingenting|krukke|mos|oppbevare|pålegg|syltetøy|tom
@@ -1204,6 +1208,7 @@
 🪘|beat|conga|langtromme|musikk|perkusjon|rytme|tromme
 🪇|cha|dans|fest|instrument|maracas|marakas|musikk|perkusjon|riste|rytme
 🪈|band|blokkfløyte|fløyte|instrument|korps|musikk|orkester|treblåseinstrument|treblåser
+🪉|amor|harpe|instrument|kjærlighet|musikk|orkester
 📱|mobiltelefon|telefon
 📲|anrop|mobiltelefon med pil|pil|ring|telefon
 ☎️|fasttelefon|ringe|telefon
@@ -1334,6 +1339,7 @@
 🧰|kasse|rød boks|skrin|verktøykasse
 🧲|hestesko|magnetisk|tiltrekning
 🪜|klatre|steg|stige|trinn
+🪏|grave|hull|skuffe|spade
 🧪|eksperiment|forskning|kjemiker|lab|prøverør|reagensrør
 🧫|bakterie|biologi|kultur|lab|petriskål
 🧬|biologi|dna|evolusjon|gener|genetikk|liv
@@ -1477,6 +1483,7 @@
 ➰|løkketegn
 ➿|dobbel løkke-tegn
 〽️|merke for nytt parti|nytt|parti
+🫟|farge|flekk|holi|maling|søl|sprut
 🔠|abcd|bokstaver|inndata|store bokstaver
 🔡|abcd|bokstaver|inndata|små bokstaver
 🔢|1234|inndata|numeriske data|tall
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|skottland
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🇨🇶|sark

+ 3437 - 3419
app/assets/emojis/search-index/orders.csv

@@ -1,71 +1,71 @@
-⁉️|4606
-ℹ️|4687
-↔️|4504
-↕️|4502
-↖️|4500
-↗️|4488
-↘️|4492
-↙️|4496
-⌨️|4242
-☀️|3998
-☁️|4007
-☂️|4033
-☃️|4041
-☄️|4044
-☑️|4627
-☔|4034
-☕|3755
-☘️|3636
-☠️|115
-☢️|4482
-☣️|4484
-☦️|4534
-☸️|4528
-☹️|85
-♈|4542
-♉|4543
-♐|4550
-♑|4551
-♒|4552
-♓|4553
-♠️|4124
-♣️|4130
-♥️|4126
-♦️|4128
-♨️|3856
-⚒️|4371
-⚓|3918
-⚔️|4377
-⚖️|4392
-⚗️|4404
-⚙️|4388
-✂️|4352
-✅|4625
-✈️|3931
-✉️|4301
-✒️|4318
-✔️|4629
-✖️|4596
-✡️|4526
-✨|4053
-✳️|4637
-✴️|4639
-❄️|4039
-❇️|4641
-❓|4607
-❔|4608
-❕|4609
-❗|4610
-❣️|146
-❤️|153
-➕|4597
-➖|4598
-➗|4599
-⤴️|4510
-⤵️|4512
-〰️|4612
-㊗️|4717
-㊙️|4719
+⁉️|4612
+ℹ️|4694
+↔️|4510
+↕️|4508
+↖️|4506
+↗️|4494
+↘️|4498
+↙️|4502
+⌨️|4247
+☀️|4002
+☁️|4011
+☂️|4037
+☃️|4045
+☄️|4048
+☑️|4633
+☔|4038
+☕|3759
+☘️|3643
+☠️|116
+☢️|4488
+☣️|4490
+☦️|4540
+☸️|4534
+☹️|86
+♈|4548
+♉|4549
+♐|4556
+♑|4557
+♒|4558
+♓|4559
+♠️|4128
+♣️|4134
+♥️|4130
+♦️|4132
+♨️|3860
+⚒️|4376
+⚓|3922
+⚔️|4382
+⚖️|4397
+⚗️|4410
+⚙️|4393
+✂️|4357
+✅|4631
+✈️|3935
+✉️|4306
+✒️|4323
+✔️|4635
+✖️|4602
+✡️|4532
+✨|4057
+✳️|4643
+✴️|4645
+❄️|4043
+❇️|4647
+❓|4613
+❔|4614
+❕|4615
+❗|4616
+❣️|147
+❤️|154
+➕|4603
+➖|4604
+➗|4605
+⤴️|4516
+⤵️|4518
+〰️|4618
+㊗️|4724
+㊙️|4726
 😀|1
 😃|2
 😄|3
@@ -123,3354 +123,3372 @@
 😪|59
 🤤|60
 😴|61
-😷|62
-🤒|63
-🤕|64
-🤢|65
-🤮|66
-🤧|67
-🥵|68
-🥶|69
-🥴|70
-😵|71
-😵‍💫|72
-🤯|73
-🤠|74
-🥳|75
-🥸|76
-😎|77
-🤓|78
-🧐|79
-😕|80
-🫤|81
-😟|82
-🙁|83
-😮|86
-😯|87
-😲|88
-😳|89
-🥺|90
-🥹|91
-😦|92
-😧|93
-😨|94
-😰|95
-😥|96
-😢|97
-😭|98
-😱|99
-😖|100
-😣|101
-😞|102
-😓|103
-😩|104
-😫|105
-🥱|106
-😤|107
-😡|108
-😠|109
-🤬|110
-😈|111
-👿|112
-💀|113
-💩|116
-🤡|117
-👹|118
-👺|119
-👻|120
-👽|121
-👾|122
-🤖|123
-😺|124
-😸|125
-😹|126
-😻|127
-😼|128
-😽|129
-🙀|130
-😿|131
-😾|132
-🙈|133
-🙉|134
-🙊|135
-💌|136
-💘|137
-💝|138
-💖|139
-💗|140
-💓|141
-💞|142
-💕|143
-💟|144
-💔|147
-❤️‍🔥|148
-❤️‍🩹|150
-🩷|154
-🧡|155
-💛|156
-💚|157
-💙|158
-🩵|159
-💜|160
-🤎|161
-🖤|162
-🩶|163
-🤍|164
-💋|165
-💯|166
-💢|167
-💥|168
-💫|169
-💦|170
-💨|171
-🕳️|173
-💬|174
-👁️‍🗨️|175
-🗨️|180
-🗯️|182
-💭|183
-💤|184
-👋|185
-👋🏻|186
-👋🏼|187
-👋🏽|188
-👋🏾|189
-👋🏿|190
-🤚|191
-🤚🏻|192
-🤚🏼|193
-🤚🏽|194
-🤚🏾|195
-🤚🏿|196
-🖐️|198
-🖐🏻|199
-🖐🏼|200
-🖐🏽|201
-🖐🏾|202
-🖐🏿|203
-✋|204
-✋🏻|205
-✋🏼|206
-✋🏽|207
-✋🏾|208
-✋🏿|209
-🖖|210
-🖖🏻|211
-🖖🏼|212
-🖖🏽|213
-🖖🏾|214
-🖖🏿|215
-🫱|216
-🫱🏻|217
-🫱🏼|218
-🫱🏽|219
-🫱🏾|220
-🫱🏿|221
-🫲|222
-🫲🏻|223
-🫲🏼|224
-🫲🏽|225
-🫲🏾|226
-🫲🏿|227
-🫳|228
-🫳🏻|229
-🫳🏼|230
-🫳🏽|231
-🫳🏾|232
-🫳🏿|233
-🫴|234
-🫴🏻|235
-🫴🏼|236
-🫴🏽|237
-🫴🏾|238
-🫴🏿|239
-🫷|240
-🫷🏻|241
-🫷🏼|242
-🫷🏽|243
-🫷🏾|244
-🫷🏿|245
-🫸|246
-🫸🏻|247
-🫸🏼|248
-🫸🏽|249
-🫸🏾|250
-🫸🏿|251
-👌|252
-👌🏻|253
-👌🏼|254
-👌🏽|255
-👌🏾|256
-👌🏿|257
-🤌|258
-🤌🏻|259
-🤌🏼|260
-🤌🏽|261
-🤌🏾|262
-🤌🏿|263
-🤏|264
-🤏🏻|265
-🤏🏼|266
-🤏🏽|267
-🤏🏾|268
-🤏🏿|269
-✌️|271
-✌🏻|272
-✌🏼|273
-✌🏽|274
-✌🏾|275
-✌🏿|276
-🤞|277
-🤞🏻|278
-🤞🏼|279
-🤞🏽|280
-🤞🏾|281
-🤞🏿|282
-🫰|283
-🫰🏻|284
-🫰🏼|285
-🫰🏽|286
-🫰🏾|287
-🫰🏿|288
-🤟|289
-🤟🏻|290
-🤟🏼|291
-🤟🏽|292
-🤟🏾|293
-🤟🏿|294
-🤘|295
-🤘🏻|296
-🤘🏼|297
-🤘🏽|298
-🤘🏾|299
-🤘🏿|300
-🤙|301
-🤙🏻|302
-🤙🏼|303
-🤙🏽|304
-🤙🏾|305
-🤙🏿|306
-👈|307
-👈🏻|308
-👈🏼|309
-👈🏽|310
-👈🏾|311
-👈🏿|312
-👉|313
-👉🏻|314
-👉🏼|315
-👉🏽|316
-👉🏾|317
-👉🏿|318
-👆|319
-👆🏻|320
-👆🏼|321
-👆🏽|322
-👆🏾|323
-👆🏿|324
-🖕|325
-🖕🏻|326
-🖕🏼|327
-🖕🏽|328
-🖕🏾|329
-🖕🏿|330
-👇|331
-👇🏻|332
-👇🏼|333
-👇🏽|334
-👇🏾|335
-👇🏿|336
-☝️|338
-☝🏻|339
-☝🏼|340
-☝🏽|341
-☝🏾|342
-☝🏿|343
-🫵|344
-🫵🏻|345
-🫵🏼|346
-🫵🏽|347
-🫵🏾|348
-🫵🏿|349
-👍|350
-👍🏻|351
-👍🏼|352
-👍🏽|353
-👍🏾|354
-👍🏿|355
-👎|356
-👎🏻|357
-👎🏼|358
-👎🏽|359
-👎🏾|360
-👎🏿|361
-✊|362
-✊🏻|363
-✊🏼|364
-✊🏽|365
-✊🏾|366
-✊🏿|367
-👊|368
-👊🏻|369
-👊🏼|370
-👊🏽|371
-👊🏾|372
-👊🏿|373
-🤛|374
-🤛🏻|375
-🤛🏼|376
-🤛🏽|377
-🤛🏾|378
-🤛🏿|379
-🤜|380
-🤜🏻|381
-🤜🏼|382
-🤜🏽|383
-🤜🏾|384
-🤜🏿|385
-👏|386
-👏🏻|387
-👏🏼|388
-👏🏽|389
-👏🏾|390
-👏🏿|391
-🙌|392
-🙌🏻|393
-🙌🏼|394
-🙌🏽|395
-🙌🏾|396
-🙌🏿|397
-🫶|398
-🫶🏻|399
-🫶🏼|400
-🫶🏽|401
-🫶🏾|402
-🫶🏿|403
-👐|404
-👐🏻|405
-👐🏼|406
-👐🏽|407
-👐🏾|408
-👐🏿|409
-🤲|410
-🤲🏻|411
-🤲🏼|412
-🤲🏽|413
-🤲🏾|414
-🤲🏿|415
-🤝|416
-🤝🏻|417
-🤝🏼|418
-🤝🏽|419
-🤝🏾|420
-🤝🏿|421
-🙏|442
-🙏🏻|443
-🙏🏼|444
-🙏🏽|445
-🙏🏾|446
-🙏🏿|447
-✍️|449
-✍🏻|450
-✍🏼|451
-✍🏽|452
-✍🏾|453
-✍🏿|454
-💅|455
-💅🏻|456
-💅🏼|457
-💅🏽|458
-💅🏾|459
-💅🏿|460
-🤳|461
-🤳🏻|462
-🤳🏼|463
-🤳🏽|464
-🤳🏾|465
-🤳🏿|466
-💪|467
-💪🏻|468
-💪🏼|469
-💪🏽|470
-💪🏾|471
-💪🏿|472
-🦾|473
-🦿|474
-🦵|475
-🦵🏻|476
-🦵🏼|477
-🦵🏽|478
-🦵🏾|479
-🦵🏿|480
-🦶|481
-🦶🏻|482
-🦶🏼|483
-🦶🏽|484
-🦶🏾|485
-🦶🏿|486
-👂|487
-👂🏻|488
-👂🏼|489
-👂🏽|490
-👂🏾|491
-👂🏿|492
-🦻|493
-🦻🏻|494
-🦻🏼|495
-🦻🏽|496
-🦻🏾|497
-🦻🏿|498
-👃|499
-👃🏻|500
-👃🏼|501
-👃🏽|502
-👃🏾|503
-👃🏿|504
-🧠|505
-🫀|506
-🫁|507
-🦷|508
-🦴|509
-👀|510
-👁️|512
-👅|513
-👄|514
-🫦|515
-👶|516
-👶🏻|517
-👶🏼|518
-👶🏽|519
-👶🏾|520
-👶🏿|521
-🧒|522
-🧒🏻|523
-🧒🏼|524
-🧒🏽|525
-🧒🏾|526
-🧒🏿|527
-👦|528
-👦🏻|529
-👦🏼|530
-👦🏽|531
-👦🏾|532
-👦🏿|533
-👧|534
-👧🏻|535
-👧🏼|536
-👧🏽|537
-👧🏾|538
-👧🏿|539
-🧑|540
-🧑🏻|541
-🧑🏼|542
-🧑🏽|543
-🧑🏾|544
-🧑🏿|545
-👱|546
-👱🏻|547
-👱🏼|548
-👱🏽|549
-👱🏾|550
-👱🏿|551
-👨|552
-👨🏻|553
-👨🏼|554
-👨🏽|555
-👨🏾|556
-👨🏿|557
-🧔|558
-🧔🏻|559
-🧔🏼|560
-🧔🏽|561
-🧔🏾|562
-🧔🏿|563
-🧔‍♂️|564
-🧔🏻‍♂️|566
-🧔🏼‍♂️|568
-🧔🏽‍♂️|570
-🧔🏾‍♂️|572
-🧔🏿‍♂️|574
-🧔‍♀️|576
-🧔🏻‍♀️|578
-🧔🏼‍♀️|580
-🧔🏽‍♀️|582
-🧔🏾‍♀️|584
-🧔🏿‍♀️|586
-👨‍🦰|588
-👨🏻‍🦰|589
-👨🏼‍🦰|590
-👨🏽‍🦰|591
-👨🏾‍🦰|592
-👨🏿‍🦰|593
-👨‍🦱|594
-👨🏻‍🦱|595
-👨🏼‍🦱|596
-👨🏽‍🦱|597
-👨🏾‍🦱|598
-👨🏿‍🦱|599
-👨‍🦳|600
-👨🏻‍🦳|601
-👨🏼‍🦳|602
-👨🏽‍🦳|603
-👨🏾‍🦳|604
-👨🏿‍🦳|605
-👨‍🦲|606
-👨🏻‍🦲|607
-👨🏼‍🦲|608
-👨🏽‍🦲|609
-👨🏾‍🦲|610
-👨🏿‍🦲|611
-👩|612
-👩🏻|613
-👩🏼|614
-👩🏽|615
-👩🏾|616
-👩🏿|617
-👩‍🦰|618
-👩🏻‍🦰|619
-👩🏼‍🦰|620
-👩🏽‍🦰|621
-👩🏾‍🦰|622
-👩🏿‍🦰|623
-🧑‍🦰|624
-🧑🏻‍🦰|625
-🧑🏼‍🦰|626
-🧑🏽‍🦰|627
-🧑🏾‍🦰|628
-🧑🏿‍🦰|629
-👩‍🦱|630
-👩🏻‍🦱|631
-👩🏼‍🦱|632
-👩🏽‍🦱|633
-👩🏾‍🦱|634
-👩🏿‍🦱|635
-🧑‍🦱|636
-🧑🏻‍🦱|637
-🧑🏼‍🦱|638
-🧑🏽‍🦱|639
-🧑🏾‍🦱|640
-🧑🏿‍🦱|641
-👩‍🦳|642
-👩🏻‍🦳|643
-👩🏼‍🦳|644
-👩🏽‍🦳|645
-👩🏾‍🦳|646
-👩🏿‍🦳|647
-🧑‍🦳|648
-🧑🏻‍🦳|649
-🧑🏼‍🦳|650
-🧑🏽‍🦳|651
-🧑🏾‍🦳|652
-🧑🏿‍🦳|653
-👩‍🦲|654
-👩🏻‍🦲|655
-👩🏼‍🦲|656
-👩🏽‍🦲|657
-👩🏾‍🦲|658
-👩🏿‍🦲|659
-🧑‍🦲|660
-🧑🏻‍🦲|661
-🧑🏼‍🦲|662
-🧑🏽‍🦲|663
-🧑🏾‍🦲|664
-🧑🏿‍🦲|665
-👱‍♀️|666
-👱🏻‍♀️|668
-👱🏼‍♀️|670
-👱🏽‍♀️|672
-👱🏾‍♀️|674
-👱🏿‍♀️|676
-👱‍♂️|678
-👱🏻‍♂️|680
-👱🏼‍♂️|682
-👱🏽‍♂️|684
-👱🏾‍♂️|686
-👱🏿‍♂️|688
-🧓|690
-🧓🏻|691
-🧓🏼|692
-🧓🏽|693
-🧓🏾|694
-🧓🏿|695
-👴|696
-👴🏻|697
-👴🏼|698
-👴🏽|699
-👴🏾|700
-👴🏿|701
-👵|702
-👵🏻|703
-👵🏼|704
-👵🏽|705
-👵🏾|706
-👵🏿|707
-🙍|708
-🙍🏻|709
-🙍🏼|710
-🙍🏽|711
-🙍🏾|712
-🙍🏿|713
-🙍‍♂️|714
-🙍🏻‍♂️|716
-🙍🏼‍♂️|718
-🙍🏽‍♂️|720
-🙍🏾‍♂️|722
-🙍🏿‍♂️|724
-🙍‍♀️|726
-🙍🏻‍♀️|728
-🙍🏼‍♀️|730
-🙍🏽‍♀️|732
-🙍🏾‍♀️|734
-🙍🏿‍♀️|736
-🙎|738
-🙎🏻|739
-🙎🏼|740
-🙎🏽|741
-🙎🏾|742
-🙎🏿|743
-🙎‍♂️|744
-🙎🏻‍♂️|746
-🙎🏼‍♂️|748
-🙎🏽‍♂️|750
-🙎🏾‍♂️|752
-🙎🏿‍♂️|754
-🙎‍♀️|756
-🙎🏻‍♀️|758
-🙎🏼‍♀️|760
-🙎🏽‍♀️|762
-🙎🏾‍♀️|764
-🙎🏿‍♀️|766
-🙅|768
-🙅🏻|769
-🙅🏼|770
-🙅🏽|771
-🙅🏾|772
-🙅🏿|773
-🙅‍♂️|774
-🙅🏻‍♂️|776
-🙅🏼‍♂️|778
-🙅🏽‍♂️|780
-🙅🏾‍♂️|782
-🙅🏿‍♂️|784
-🙅‍♀️|786
-🙅🏻‍♀️|788
-🙅🏼‍♀️|790
-🙅🏽‍♀️|792
-🙅🏾‍♀️|794
-🙅🏿‍♀️|796
-🙆|798
-🙆🏻|799
-🙆🏼|800
-🙆🏽|801
-🙆🏾|802
-🙆🏿|803
-🙆‍♂️|804
-🙆🏻‍♂️|806
-🙆🏼‍♂️|808
-🙆🏽‍♂️|810
-🙆🏾‍♂️|812
-🙆🏿‍♂️|814
-🙆‍♀️|816
-🙆🏻‍♀️|818
-🙆🏼‍♀️|820
-🙆🏽‍♀️|822
-🙆🏾‍♀️|824
-🙆🏿‍♀️|826
-💁|828
-💁🏻|829
-💁🏼|830
-💁🏽|831
-💁🏾|832
-💁🏿|833
-💁‍♂️|834
-💁🏻‍♂️|836
-💁🏼‍♂️|838
-💁🏽‍♂️|840
-💁🏾‍♂️|842
-💁🏿‍♂️|844
-💁‍♀️|846
-💁🏻‍♀️|848
-💁🏼‍♀️|850
-💁🏽‍♀️|852
-💁🏾‍♀️|854
-💁🏿‍♀️|856
-🙋|858
-🙋🏻|859
-🙋🏼|860
-🙋🏽|861
-🙋🏾|862
-🙋🏿|863
-🙋‍♂️|864
-🙋🏻‍♂️|866
-🙋🏼‍♂️|868
-🙋🏽‍♂️|870
-🙋🏾‍♂️|872
-🙋🏿‍♂️|874
-🙋‍♀️|876
-🙋🏻‍♀️|878
-🙋🏼‍♀️|880
-🙋🏽‍♀️|882
-🙋🏾‍♀️|884
-🙋🏿‍♀️|886
-🧏|888
-🧏🏻|889
-🧏🏼|890
-🧏🏽|891
-🧏🏾|892
-🧏🏿|893
-🧏‍♂️|894
-🧏🏻‍♂️|896
-🧏🏼‍♂️|898
-🧏🏽‍♂️|900
-🧏🏾‍♂️|902
-🧏🏿‍♂️|904
-🧏‍♀️|906
-🧏🏻‍♀️|908
-🧏🏼‍♀️|910
-🧏🏽‍♀️|912
-🧏🏾‍♀️|914
-🧏🏿‍♀️|916
-🙇|918
-🙇🏻|919
-🙇🏼|920
-🙇🏽|921
-🙇🏾|922
-🙇🏿|923
-🙇‍♂️|924
-🙇🏻‍♂️|926
-🙇🏼‍♂️|928
-🙇🏽‍♂️|930
-🙇🏾‍♂️|932
-🙇🏿‍♂️|934
-🙇‍♀️|936
-🙇🏻‍♀️|938
-🙇🏼‍♀️|940
-🙇🏽‍♀️|942
-🙇🏾‍♀️|944
-🙇🏿‍♀️|946
-🤦|948
-🤦🏻|949
-🤦🏼|950
-🤦🏽|951
-🤦🏾|952
-🤦🏿|953
-🤦‍♂️|954
-🤦🏻‍♂️|956
-🤦🏼‍♂️|958
-🤦🏽‍♂️|960
-🤦🏾‍♂️|962
-🤦🏿‍♂️|964
-🤦‍♀️|966
-🤦🏻‍♀️|968
-🤦🏼‍♀️|970
-🤦🏽‍♀️|972
-🤦🏾‍♀️|974
-🤦🏿‍♀️|976
-🤷|978
-🤷🏻|979
-🤷🏼|980
-🤷🏽|981
-🤷🏾|982
-🤷🏿|983
-🤷‍♂️|984
-🤷🏻‍♂️|986
-🤷🏼‍♂️|988
-🤷🏽‍♂️|990
-🤷🏾‍♂️|992
-🤷🏿‍♂️|994
-🤷‍♀️|996
-🤷🏻‍♀️|998
-🤷🏼‍♀️|1000
-🤷🏽‍♀️|1002
-🤷🏾‍♀️|1004
-🤷🏿‍♀️|1006
-🧑‍⚕️|1008
-🧑🏻‍⚕️|1010
-🧑🏼‍⚕️|1012
-🧑🏽‍⚕️|1014
-🧑🏾‍⚕️|1016
-🧑🏿‍⚕️|1018
-👨‍⚕️|1020
-👨🏻‍⚕️|1022
-👨🏼‍⚕️|1024
-👨🏽‍⚕️|1026
-👨🏾‍⚕️|1028
-👨🏿‍⚕️|1030
-👩‍⚕️|1032
-👩🏻‍⚕️|1034
-👩🏼‍⚕️|1036
-👩🏽‍⚕️|1038
-👩🏾‍⚕️|1040
-👩🏿‍⚕️|1042
-🧑‍🎓|1044
-🧑🏻‍🎓|1045
-🧑🏼‍🎓|1046
-🧑🏽‍🎓|1047
-🧑🏾‍🎓|1048
-🧑🏿‍🎓|1049
-👨‍🎓|1050
-👨🏻‍🎓|1051
-👨🏼‍🎓|1052
-👨🏽‍🎓|1053
-👨🏾‍🎓|1054
-👨🏿‍🎓|1055
-👩‍🎓|1056
-👩🏻‍🎓|1057
-👩🏼‍🎓|1058
-👩🏽‍🎓|1059
-👩🏾‍🎓|1060
-👩🏿‍🎓|1061
-🧑‍🏫|1062
-🧑🏻‍🏫|1063
-🧑🏼‍🏫|1064
-🧑🏽‍🏫|1065
-🧑🏾‍🏫|1066
-🧑🏿‍🏫|1067
-👨‍🏫|1068
-👨🏻‍🏫|1069
-👨🏼‍🏫|1070
-👨🏽‍🏫|1071
-👨🏾‍🏫|1072
-👨🏿‍🏫|1073
-👩‍🏫|1074
-👩🏻‍🏫|1075
-👩🏼‍🏫|1076
-👩🏽‍🏫|1077
-👩🏾‍🏫|1078
-👩🏿‍🏫|1079
-🧑‍⚖️|1080
-🧑🏻‍⚖️|1082
-🧑🏼‍⚖️|1084
-🧑🏽‍⚖️|1086
-🧑🏾‍⚖️|1088
-🧑🏿‍⚖️|1090
-👨‍⚖️|1092
-👨🏻‍⚖️|1094
-👨🏼‍⚖️|1096
-👨🏽‍⚖️|1098
-👨🏾‍⚖️|1100
-👨🏿‍⚖️|1102
-👩‍⚖️|1104
-👩🏻‍⚖️|1106
-👩🏼‍⚖️|1108
-👩🏽‍⚖️|1110
-👩🏾‍⚖️|1112
-👩🏿‍⚖️|1114
-🧑‍🌾|1116
-🧑🏻‍🌾|1117
-🧑🏼‍🌾|1118
-🧑🏽‍🌾|1119
-🧑🏾‍🌾|1120
-🧑🏿‍🌾|1121
-👨‍🌾|1122
-👨🏻‍🌾|1123
-👨🏼‍🌾|1124
-👨🏽‍🌾|1125
-👨🏾‍🌾|1126
-👨🏿‍🌾|1127
-👩‍🌾|1128
-👩🏻‍🌾|1129
-👩🏼‍🌾|1130
-👩🏽‍🌾|1131
-👩🏾‍🌾|1132
-👩🏿‍🌾|1133
-🧑‍🍳|1134
-🧑🏻‍🍳|1135
-🧑🏼‍🍳|1136
-🧑🏽‍🍳|1137
-🧑🏾‍🍳|1138
-🧑🏿‍🍳|1139
-👨‍🍳|1140
-👨🏻‍🍳|1141
-👨🏼‍🍳|1142
-👨🏽‍🍳|1143
-👨🏾‍🍳|1144
-👨🏿‍🍳|1145
-👩‍🍳|1146
-👩🏻‍🍳|1147
-👩🏼‍🍳|1148
-👩🏽‍🍳|1149
-👩🏾‍🍳|1150
-👩🏿‍🍳|1151
-🧑‍🔧|1152
-🧑🏻‍🔧|1153
-🧑🏼‍🔧|1154
-🧑🏽‍🔧|1155
-🧑🏾‍🔧|1156
-🧑🏿‍🔧|1157
-👨‍🔧|1158
-👨🏻‍🔧|1159
-👨🏼‍🔧|1160
-👨🏽‍🔧|1161
-👨🏾‍🔧|1162
-👨🏿‍🔧|1163
-👩‍🔧|1164
-👩🏻‍🔧|1165
-👩🏼‍🔧|1166
-👩🏽‍🔧|1167
-👩🏾‍🔧|1168
-👩🏿‍🔧|1169
-🧑‍🏭|1170
-🧑🏻‍🏭|1171
-🧑🏼‍🏭|1172
-🧑🏽‍🏭|1173
-🧑🏾‍🏭|1174
-🧑🏿‍🏭|1175
-👨‍🏭|1176
-👨🏻‍🏭|1177
-👨🏼‍🏭|1178
-👨🏽‍🏭|1179
-👨🏾‍🏭|1180
-👨🏿‍🏭|1181
-👩‍🏭|1182
-👩🏻‍🏭|1183
-👩🏼‍🏭|1184
-👩🏽‍🏭|1185
-👩🏾‍🏭|1186
-👩🏿‍🏭|1187
-🧑‍💼|1188
-🧑🏻‍💼|1189
-🧑🏼‍💼|1190
-🧑🏽‍💼|1191
-🧑🏾‍💼|1192
-🧑🏿‍💼|1193
-👨‍💼|1194
-👨🏻‍💼|1195
-👨🏼‍💼|1196
-👨🏽‍💼|1197
-👨🏾‍💼|1198
-👨🏿‍💼|1199
-👩‍💼|1200
-👩🏻‍💼|1201
-👩🏼‍💼|1202
-👩🏽‍💼|1203
-👩🏾‍💼|1204
-👩🏿‍💼|1205
-🧑‍🔬|1206
-🧑🏻‍🔬|1207
-🧑🏼‍🔬|1208
-🧑🏽‍🔬|1209
-🧑🏾‍🔬|1210
-🧑🏿‍🔬|1211
-👨‍🔬|1212
-👨🏻‍🔬|1213
-👨🏼‍🔬|1214
-👨🏽‍🔬|1215
-👨🏾‍🔬|1216
-👨🏿‍🔬|1217
-👩‍🔬|1218
-👩🏻‍🔬|1219
-👩🏼‍🔬|1220
-👩🏽‍🔬|1221
-👩🏾‍🔬|1222
-👩🏿‍🔬|1223
-🧑‍💻|1224
-🧑🏻‍💻|1225
-🧑🏼‍💻|1226
-🧑🏽‍💻|1227
-🧑🏾‍💻|1228
-🧑🏿‍💻|1229
-👨‍💻|1230
-👨🏻‍💻|1231
-👨🏼‍💻|1232
-👨🏽‍💻|1233
-👨🏾‍💻|1234
-👨🏿‍💻|1235
-👩‍💻|1236
-👩🏻‍💻|1237
-👩🏼‍💻|1238
-👩🏽‍💻|1239
-👩🏾‍💻|1240
-👩🏿‍💻|1241
-🧑‍🎤|1242
-🧑🏻‍🎤|1243
-🧑🏼‍🎤|1244
-🧑🏽‍🎤|1245
-🧑🏾‍🎤|1246
-🧑🏿‍🎤|1247
-👨‍🎤|1248
-👨🏻‍🎤|1249
-👨🏼‍🎤|1250
-👨🏽‍🎤|1251
-👨🏾‍🎤|1252
-👨🏿‍🎤|1253
-👩‍🎤|1254
-👩🏻‍🎤|1255
-👩🏼‍🎤|1256
-👩🏽‍🎤|1257
-👩🏾‍🎤|1258
-👩🏿‍🎤|1259
-🧑‍🎨|1260
-🧑🏻‍🎨|1261
-🧑🏼‍🎨|1262
-🧑🏽‍🎨|1263
-🧑🏾‍🎨|1264
-🧑🏿‍🎨|1265
-👨‍🎨|1266
-👨🏻‍🎨|1267
-👨🏼‍🎨|1268
-👨🏽‍🎨|1269
-👨🏾‍🎨|1270
-👨🏿‍🎨|1271
-👩‍🎨|1272
-👩🏻‍🎨|1273
-👩🏼‍🎨|1274
-👩🏽‍🎨|1275
-👩🏾‍🎨|1276
-👩🏿‍🎨|1277
-🧑‍✈️|1278
-🧑🏻‍✈️|1280
-🧑🏼‍✈️|1282
-🧑🏽‍✈️|1284
-🧑🏾‍✈️|1286
-🧑🏿‍✈️|1288
-👨‍✈️|1290
-👨🏻‍✈️|1292
-👨🏼‍✈️|1294
-👨🏽‍✈️|1296
-👨🏾‍✈️|1298
-👨🏿‍✈️|1300
-👩‍✈️|1302
-👩🏻‍✈️|1304
-👩🏼‍✈️|1306
-👩🏽‍✈️|1308
-👩🏾‍✈️|1310
-👩🏿‍✈️|1312
-🧑‍🚀|1314
-🧑🏻‍🚀|1315
-🧑🏼‍🚀|1316
-🧑🏽‍🚀|1317
-🧑🏾‍🚀|1318
-🧑🏿‍🚀|1319
-👨‍🚀|1320
-👨🏻‍🚀|1321
-👨🏼‍🚀|1322
-👨🏽‍🚀|1323
-👨🏾‍🚀|1324
-👨🏿‍🚀|1325
-👩‍🚀|1326
-👩🏻‍🚀|1327
-👩🏼‍🚀|1328
-👩🏽‍🚀|1329
-👩🏾‍🚀|1330
-👩🏿‍🚀|1331
-🧑‍🚒|1332
-🧑🏻‍🚒|1333
-🧑🏼‍🚒|1334
-🧑🏽‍🚒|1335
-🧑🏾‍🚒|1336
-🧑🏿‍🚒|1337
-👨‍🚒|1338
-👨🏻‍🚒|1339
-👨🏼‍🚒|1340
-👨🏽‍🚒|1341
-👨🏾‍🚒|1342
-👨🏿‍🚒|1343
-👩‍🚒|1344
-👩🏻‍🚒|1345
-👩🏼‍🚒|1346
-👩🏽‍🚒|1347
-👩🏾‍🚒|1348
-👩🏿‍🚒|1349
-👮|1350
-👮🏻|1351
-👮🏼|1352
-👮🏽|1353
-👮🏾|1354
-👮🏿|1355
-👮‍♂️|1356
-👮🏻‍♂️|1358
-👮🏼‍♂️|1360
-👮🏽‍♂️|1362
-👮🏾‍♂️|1364
-👮🏿‍♂️|1366
-👮‍♀️|1368
-👮🏻‍♀️|1370
-👮🏼‍♀️|1372
-👮🏽‍♀️|1374
-👮🏾‍♀️|1376
-👮🏿‍♀️|1378
-🕵️|1381
-🕵🏻|1382
-🕵🏼|1383
-🕵🏽|1384
-🕵🏾|1385
-🕵🏿|1386
-🕵️‍♂️|1387
-🕵🏻‍♂️|1391
-🕵🏼‍♂️|1393
-🕵🏽‍♂️|1395
-🕵🏾‍♂️|1397
-🕵🏿‍♂️|1399
-🕵️‍♀️|1401
-🕵🏻‍♀️|1405
-🕵🏼‍♀️|1407
-🕵🏽‍♀️|1409
-🕵🏾‍♀️|1411
-🕵🏿‍♀️|1413
-💂|1415
-💂🏻|1416
-💂🏼|1417
-💂🏽|1418
-💂🏾|1419
-💂🏿|1420
-💂‍♂️|1421
-💂🏻‍♂️|1423
-💂🏼‍♂️|1425
-💂🏽‍♂️|1427
-💂🏾‍♂️|1429
-💂🏿‍♂️|1431
-💂‍♀️|1433
-💂🏻‍♀️|1435
-💂🏼‍♀️|1437
-💂🏽‍♀️|1439
-💂🏾‍♀️|1441
-💂🏿‍♀️|1443
-🥷|1445
-🥷🏻|1446
-🥷🏼|1447
-🥷🏽|1448
-🥷🏾|1449
-🥷🏿|1450
-👷|1451
-👷🏻|1452
-👷🏼|1453
-👷🏽|1454
-👷🏾|1455
-👷🏿|1456
-👷‍♂️|1457
-👷🏻‍♂️|1459
-👷🏼‍♂️|1461
-👷🏽‍♂️|1463
-👷🏾‍♂️|1465
-👷🏿‍♂️|1467
-👷‍♀️|1469
-👷🏻‍♀️|1471
-👷🏼‍♀️|1473
-👷🏽‍♀️|1475
-👷🏾‍♀️|1477
-👷🏿‍♀️|1479
-🫅|1481
-🫅🏻|1482
-🫅🏼|1483
-🫅🏽|1484
-🫅🏾|1485
-🫅🏿|1486
-🤴|1487
-🤴🏻|1488
-🤴🏼|1489
-🤴🏽|1490
-🤴🏾|1491
-🤴🏿|1492
-👸|1493
-👸🏻|1494
-👸🏼|1495
-👸🏽|1496
-👸🏾|1497
-👸🏿|1498
-👳|1499
-👳🏻|1500
-👳🏼|1501
-👳🏽|1502
-👳🏾|1503
-👳🏿|1504
-👳‍♂️|1505
-👳🏻‍♂️|1507
-👳🏼‍♂️|1509
-👳🏽‍♂️|1511
-👳🏾‍♂️|1513
-👳🏿‍♂️|1515
-👳‍♀️|1517
-👳🏻‍♀️|1519
-👳🏼‍♀️|1521
-👳🏽‍♀️|1523
-👳🏾‍♀️|1525
-👳🏿‍♀️|1527
-👲|1529
-👲🏻|1530
-👲🏼|1531
-👲🏽|1532
-👲🏾|1533
-👲🏿|1534
-🧕|1535
-🧕🏻|1536
-🧕🏼|1537
-🧕🏽|1538
-🧕🏾|1539
-🧕🏿|1540
-🤵|1541
-🤵🏻|1542
-🤵🏼|1543
-🤵🏽|1544
-🤵🏾|1545
-🤵🏿|1546
-🤵‍♂️|1547
-🤵🏻‍♂️|1549
-🤵🏼‍♂️|1551
-🤵🏽‍♂️|1553
-🤵🏾‍♂️|1555
-🤵🏿‍♂️|1557
-🤵‍♀️|1559
-🤵🏻‍♀️|1561
-🤵🏼‍♀️|1563
-🤵🏽‍♀️|1565
-🤵🏾‍♀️|1567
-🤵🏿‍♀️|1569
-👰|1571
-👰🏻|1572
-👰🏼|1573
-👰🏽|1574
-👰🏾|1575
-👰🏿|1576
-👰‍♂️|1577
-👰🏻‍♂️|1579
-👰🏼‍♂️|1581
-👰🏽‍♂️|1583
-👰🏾‍♂️|1585
-👰🏿‍♂️|1587
-👰‍♀️|1589
-👰🏻‍♀️|1591
-👰🏼‍♀️|1593
-👰🏽‍♀️|1595
-👰🏾‍♀️|1597
-👰🏿‍♀️|1599
-🤰|1601
-🤰🏻|1602
-🤰🏼|1603
-🤰🏽|1604
-🤰🏾|1605
-🤰🏿|1606
-🫃|1607
-🫃🏻|1608
-🫃🏼|1609
-🫃🏽|1610
-🫃🏾|1611
-🫃🏿|1612
-🫄|1613
-🫄🏻|1614
-🫄🏼|1615
-🫄🏽|1616
-🫄🏾|1617
-🫄🏿|1618
-🤱|1619
-🤱🏻|1620
-🤱🏼|1621
-🤱🏽|1622
-🤱🏾|1623
-🤱🏿|1624
-👩‍🍼|1625
-👩🏻‍🍼|1626
-👩🏼‍🍼|1627
-👩🏽‍🍼|1628
-👩🏾‍🍼|1629
-👩🏿‍🍼|1630
-👨‍🍼|1631
-👨🏻‍🍼|1632
-👨🏼‍🍼|1633
-👨🏽‍🍼|1634
-👨🏾‍🍼|1635
-👨🏿‍🍼|1636
-🧑‍🍼|1637
-🧑🏻‍🍼|1638
-🧑🏼‍🍼|1639
-🧑🏽‍🍼|1640
-🧑🏾‍🍼|1641
-🧑🏿‍🍼|1642
-👼|1643
-👼🏻|1644
-👼🏼|1645
-👼🏽|1646
-👼🏾|1647
-👼🏿|1648
-🎅|1649
-🎅🏻|1650
-🎅🏼|1651
-🎅🏽|1652
-🎅🏾|1653
-🎅🏿|1654
-🤶|1655
-🤶🏻|1656
-🤶🏼|1657
-🤶🏽|1658
-🤶🏾|1659
-🤶🏿|1660
-🧑‍🎄|1661
-🧑🏻‍🎄|1662
-🧑🏼‍🎄|1663
-🧑🏽‍🎄|1664
-🧑🏾‍🎄|1665
-🧑🏿‍🎄|1666
-🦸|1667
-🦸🏻|1668
-🦸🏼|1669
-🦸🏽|1670
-🦸🏾|1671
-🦸🏿|1672
-🦸‍♂️|1673
-🦸🏻‍♂️|1675
-🦸🏼‍♂️|1677
-🦸🏽‍♂️|1679
-🦸🏾‍♂️|1681
-🦸🏿‍♂️|1683
-🦸‍♀️|1685
-🦸🏻‍♀️|1687
-🦸🏼‍♀️|1689
-🦸🏽‍♀️|1691
-🦸🏾‍♀️|1693
-🦸🏿‍♀️|1695
-🦹|1697
-🦹🏻|1698
-🦹🏼|1699
-🦹🏽|1700
-🦹🏾|1701
-🦹🏿|1702
-🦹‍♂️|1703
-🦹🏻‍♂️|1705
-🦹🏼‍♂️|1707
-🦹🏽‍♂️|1709
-🦹🏾‍♂️|1711
-🦹🏿‍♂️|1713
-🦹‍♀️|1715
-🦹🏻‍♀️|1717
-🦹🏼‍♀️|1719
-🦹🏽‍♀️|1721
-🦹🏾‍♀️|1723
-🦹🏿‍♀️|1725
-🧙|1727
-🧙🏻|1728
-🧙🏼|1729
-🧙🏽|1730
-🧙🏾|1731
-🧙🏿|1732
-🧙‍♂️|1733
-🧙🏻‍♂️|1735
-🧙🏼‍♂️|1737
-🧙🏽‍♂️|1739
-🧙🏾‍♂️|1741
-🧙🏿‍♂️|1743
-🧙‍♀️|1745
-🧙🏻‍♀️|1747
-🧙🏼‍♀️|1749
-🧙🏽‍♀️|1751
-🧙🏾‍♀️|1753
-🧙🏿‍♀️|1755
-🧚|1757
-🧚🏻|1758
-🧚🏼|1759
-🧚🏽|1760
-🧚🏾|1761
-🧚🏿|1762
-🧚‍♂️|1763
-🧚🏻‍♂️|1765
-🧚🏼‍♂️|1767
-🧚🏽‍♂️|1769
-🧚🏾‍♂️|1771
-🧚🏿‍♂️|1773
-🧚‍♀️|1775
-🧚🏻‍♀️|1777
-🧚🏼‍♀️|1779
-🧚🏽‍♀️|1781
-🧚🏾‍♀️|1783
-🧚🏿‍♀️|1785
-🧛|1787
-🧛🏻|1788
-🧛🏼|1789
-🧛🏽|1790
-🧛🏾|1791
-🧛🏿|1792
-🧛‍♂️|1793
-🧛🏻‍♂️|1795
-🧛🏼‍♂️|1797
-🧛🏽‍♂️|1799
-🧛🏾‍♂️|1801
-🧛🏿‍♂️|1803
-🧛‍♀️|1805
-🧛🏻‍♀️|1807
-🧛🏼‍♀️|1809
-🧛🏽‍♀️|1811
-🧛🏾‍♀️|1813
-🧛🏿‍♀️|1815
-🧜|1817
-🧜🏻|1818
-🧜🏼|1819
-🧜🏽|1820
-🧜🏾|1821
-🧜🏿|1822
-🧜‍♂️|1823
-🧜🏻‍♂️|1825
-🧜🏼‍♂️|1827
-🧜🏽‍♂️|1829
-🧜🏾‍♂️|1831
-🧜🏿‍♂️|1833
-🧜‍♀️|1835
-🧜🏻‍♀️|1837
-🧜🏼‍♀️|1839
-🧜🏽‍♀️|1841
-🧜🏾‍♀️|1843
-🧜🏿‍♀️|1845
-🧝|1847
-🧝🏻|1848
-🧝🏼|1849
-🧝🏽|1850
-🧝🏾|1851
-🧝🏿|1852
-🧝‍♂️|1853
-🧝🏻‍♂️|1855
-🧝🏼‍♂️|1857
-🧝🏽‍♂️|1859
-🧝🏾‍♂️|1861
-🧝🏿‍♂️|1863
-🧝‍♀️|1865
-🧝🏻‍♀️|1867
-🧝🏼‍♀️|1869
-🧝🏽‍♀️|1871
-🧝🏾‍♀️|1873
-🧝🏿‍♀️|1875
-🧞|1877
-🧞‍♂️|1878
-🧞‍♀️|1880
-🧟|1882
-🧟‍♂️|1883
-🧟‍♀️|1885
-🧌|1887
-💆|1888
-💆🏻|1889
-💆🏼|1890
-💆🏽|1891
-💆🏾|1892
-💆🏿|1893
-💆‍♂️|1894
-💆🏻‍♂️|1896
-💆🏼‍♂️|1898
-💆🏽‍♂️|1900
-💆🏾‍♂️|1902
-💆🏿‍♂️|1904
-💆‍♀️|1906
-💆🏻‍♀️|1908
-💆🏼‍♀️|1910
-💆🏽‍♀️|1912
-💆🏾‍♀️|1914
-💆🏿‍♀️|1916
-💇|1918
-💇🏻|1919
-💇🏼|1920
-💇🏽|1921
-💇🏾|1922
-💇🏿|1923
-💇‍♂️|1924
-💇🏻‍♂️|1926
-💇🏼‍♂️|1928
-💇🏽‍♂️|1930
-💇🏾‍♂️|1932
-💇🏿‍♂️|1934
-💇‍♀️|1936
-💇🏻‍♀️|1938
-💇🏼‍♀️|1940
-💇🏽‍♀️|1942
-💇🏾‍♀️|1944
-💇🏿‍♀️|1946
-🚶|1948
-🚶🏻|1949
-🚶🏼|1950
-🚶🏽|1951
-🚶🏾|1952
-🚶🏿|1953
-🚶‍♂️|1954
-🚶🏻‍♂️|1956
-🚶🏼‍♂️|1958
-🚶🏽‍♂️|1960
-🚶🏾‍♂️|1962
-🚶🏿‍♂️|1964
-🚶‍♀️|1966
-🚶🏻‍♀️|1968
-🚶🏼‍♀️|1970
-🚶🏽‍♀️|1972
-🚶🏾‍♀️|1974
-🚶🏿‍♀️|1976
-🚶‍➡️|1978
-🚶🏻‍➡️|1980
-🚶🏼‍➡️|1982
-🚶🏽‍➡️|1984
-🚶🏾‍➡️|1986
-🚶🏿‍➡️|1988
-🚶‍♀️‍➡️|1990
-🚶🏻‍♀️‍➡️|1994
-🚶🏼‍♀️‍➡️|1998
-🚶🏽‍♀️‍➡️|2002
-🚶🏾‍♀️‍➡️|2006
-🚶🏿‍♀️‍➡️|2010
-🚶‍♂️‍➡️|2014
-🚶🏻‍♂️‍➡️|2018
-🚶🏼‍♂️‍➡️|2022
-🚶🏽‍♂️‍➡️|2026
-🚶🏾‍♂️‍➡️|2030
-🚶🏿‍♂️‍➡️|2034
-🧍|2038
-🧍🏻|2039
-🧍🏼|2040
-🧍🏽|2041
-🧍🏾|2042
-🧍🏿|2043
-🧍‍♂️|2044
-🧍🏻‍♂️|2046
-🧍🏼‍♂️|2048
-🧍🏽‍♂️|2050
-🧍🏾‍♂️|2052
-🧍🏿‍♂️|2054
-🧍‍♀️|2056
-🧍🏻‍♀️|2058
-🧍🏼‍♀️|2060
-🧍🏽‍♀️|2062
-🧍🏾‍♀️|2064
-🧍🏿‍♀️|2066
-🧎|2068
-🧎🏻|2069
-🧎🏼|2070
-🧎🏽|2071
-🧎🏾|2072
-🧎🏿|2073
-🧎‍♂️|2074
-🧎🏻‍♂️|2076
-🧎🏼‍♂️|2078
-🧎🏽‍♂️|2080
-🧎🏾‍♂️|2082
-🧎🏿‍♂️|2084
-🧎‍♀️|2086
-🧎🏻‍♀️|2088
-🧎🏼‍♀️|2090
-🧎🏽‍♀️|2092
-🧎🏾‍♀️|2094
-🧎🏿‍♀️|2096
-🧎‍➡️|2098
-🧎🏻‍➡️|2100
-🧎🏼‍➡️|2102
-🧎🏽‍➡️|2104
-🧎🏾‍➡️|2106
-🧎🏿‍➡️|2108
-🧎‍♀️‍➡️|2110
-🧎🏻‍♀️‍➡️|2114
-🧎🏼‍♀️‍➡️|2118
-🧎🏽‍♀️‍➡️|2122
-🧎🏾‍♀️‍➡️|2126
-🧎🏿‍♀️‍➡️|2130
-🧎‍♂️‍➡️|2134
-🧎🏻‍♂️‍➡️|2138
-🧎🏼‍♂️‍➡️|2142
-🧎🏽‍♂️‍➡️|2146
-🧎🏾‍♂️‍➡️|2150
-🧎🏿‍♂️‍➡️|2154
-🧑‍🦯|2158
-🧑🏻‍🦯|2159
-🧑🏼‍🦯|2160
-🧑🏽‍🦯|2161
-🧑🏾‍🦯|2162
-🧑🏿‍🦯|2163
-🧑‍🦯‍➡️|2164
-🧑🏻‍🦯‍➡️|2166
-🧑🏼‍🦯‍➡️|2168
-🧑🏽‍🦯‍➡️|2170
-🧑🏾‍🦯‍➡️|2172
-🧑🏿‍🦯‍➡️|2174
-👨‍🦯|2176
-👨🏻‍🦯|2177
-👨🏼‍🦯|2178
-👨🏽‍🦯|2179
-👨🏾‍🦯|2180
-👨🏿‍🦯|2181
-👨‍🦯‍➡️|2182
-👨🏻‍🦯‍➡️|2184
-👨🏼‍🦯‍➡️|2186
-👨🏽‍🦯‍➡️|2188
-👨🏾‍🦯‍➡️|2190
-👨🏿‍🦯‍➡️|2192
-👩‍🦯|2194
-👩🏻‍🦯|2195
-👩🏼‍🦯|2196
-👩🏽‍🦯|2197
-👩🏾‍🦯|2198
-👩🏿‍🦯|2199
-👩‍🦯‍➡️|2200
-👩🏻‍🦯‍➡️|2202
-👩🏼‍🦯‍➡️|2204
-👩🏽‍🦯‍➡️|2206
-👩🏾‍🦯‍➡️|2208
-👩🏿‍🦯‍➡️|2210
-🧑‍🦼|2212
-🧑🏻‍🦼|2213
-🧑🏼‍🦼|2214
-🧑🏽‍🦼|2215
-🧑🏾‍🦼|2216
-🧑🏿‍🦼|2217
-🧑‍🦼‍➡️|2218
-🧑🏻‍🦼‍➡️|2220
-🧑🏼‍🦼‍➡️|2222
-🧑🏽‍🦼‍➡️|2224
-🧑🏾‍🦼‍➡️|2226
-🧑🏿‍🦼‍➡️|2228
-👨‍🦼|2230
-👨🏻‍🦼|2231
-👨🏼‍🦼|2232
-👨🏽‍🦼|2233
-👨🏾‍🦼|2234
-👨🏿‍🦼|2235
-👨‍🦼‍➡️|2236
-👨🏻‍🦼‍➡️|2238
-👨🏼‍🦼‍➡️|2240
-👨🏽‍🦼‍➡️|2242
-👨🏾‍🦼‍➡️|2244
-👨🏿‍🦼‍➡️|2246
-👩‍🦼|2248
-👩🏻‍🦼|2249
-👩🏼‍🦼|2250
-👩🏽‍🦼|2251
-👩🏾‍🦼|2252
-👩🏿‍🦼|2253
-👩‍🦼‍➡️|2254
-👩🏻‍🦼‍➡️|2256
-👩🏼‍🦼‍➡️|2258
-👩🏽‍🦼‍➡️|2260
-👩🏾‍🦼‍➡️|2262
-👩🏿‍🦼‍➡️|2264
-🧑‍🦽|2266
-🧑🏻‍🦽|2267
-🧑🏼‍🦽|2268
-🧑🏽‍🦽|2269
-🧑🏾‍🦽|2270
-🧑🏿‍🦽|2271
-🧑‍🦽‍➡️|2272
-🧑🏻‍🦽‍➡️|2274
-🧑🏼‍🦽‍➡️|2276
-🧑🏽‍🦽‍➡️|2278
-🧑🏾‍🦽‍➡️|2280
-🧑🏿‍🦽‍➡️|2282
-👨‍🦽|2284
-👨🏻‍🦽|2285
-👨🏼‍🦽|2286
-👨🏽‍🦽|2287
-👨🏾‍🦽|2288
-👨🏿‍🦽|2289
-👨‍🦽‍➡️|2290
-👨🏻‍🦽‍➡️|2292
-👨🏼‍🦽‍➡️|2294
-👨🏽‍🦽‍➡️|2296
-👨🏾‍🦽‍➡️|2298
-👨🏿‍🦽‍➡️|2300
-👩‍🦽|2302
-👩🏻‍🦽|2303
-👩🏼‍🦽|2304
-👩🏽‍🦽|2305
-👩🏾‍🦽|2306
-👩🏿‍🦽|2307
-👩‍🦽‍➡️|2308
-👩🏻‍🦽‍➡️|2310
-👩🏼‍🦽‍➡️|2312
-👩🏽‍🦽‍➡️|2314
-👩🏾‍🦽‍➡️|2316
-👩🏿‍🦽‍➡️|2318
-🏃|2320
-🏃🏻|2321
-🏃🏼|2322
-🏃🏽|2323
-🏃🏾|2324
-🏃🏿|2325
-🏃‍♂️|2326
-🏃🏻‍♂️|2328
-🏃🏼‍♂️|2330
-🏃🏽‍♂️|2332
-🏃🏾‍♂️|2334
-🏃🏿‍♂️|2336
-🏃‍♀️|2338
-🏃🏻‍♀️|2340
-🏃🏼‍♀️|2342
-🏃🏽‍♀️|2344
-🏃🏾‍♀️|2346
-🏃🏿‍♀️|2348
-🏃‍➡️|2350
-🏃🏻‍➡️|2352
-🏃🏼‍➡️|2354
-🏃🏽‍➡️|2356
-🏃🏾‍➡️|2358
-🏃🏿‍➡️|2360
-🏃‍♀️‍➡️|2362
-🏃🏻‍♀️‍➡️|2366
-🏃🏼‍♀️‍➡️|2370
-🏃🏽‍♀️‍➡️|2374
-🏃🏾‍♀️‍➡️|2378
-🏃🏿‍♀️‍➡️|2382
-🏃‍♂️‍➡️|2386
-🏃🏻‍♂️‍➡️|2390
-🏃🏼‍♂️‍➡️|2394
-🏃🏽‍♂️‍➡️|2398
-🏃🏾‍♂️‍➡️|2402
-🏃🏿‍♂️‍➡️|2406
-💃|2410
-💃🏻|2411
-💃🏼|2412
-💃🏽|2413
-💃🏾|2414
-💃🏿|2415
-🕺|2416
-🕺🏻|2417
-🕺🏼|2418
-🕺🏽|2419
-🕺🏾|2420
-🕺🏿|2421
-🕴️|2423
-🕴🏻|2424
-🕴🏼|2425
-🕴🏽|2426
-🕴🏾|2427
-🕴🏿|2428
-👯|2429
-👯‍♂️|2430
-👯‍♀️|2432
-🧖|2434
-🧖🏻|2435
-🧖🏼|2436
-🧖🏽|2437
-🧖🏾|2438
-🧖🏿|2439
-🧖‍♂️|2440
-🧖🏻‍♂️|2442
-🧖🏼‍♂️|2444
-🧖🏽‍♂️|2446
-🧖🏾‍♂️|2448
-🧖🏿‍♂️|2450
-🧖‍♀️|2452
-🧖🏻‍♀️|2454
-🧖🏼‍♀️|2456
-🧖🏽‍♀️|2458
-🧖🏾‍♀️|2460
-🧖🏿‍♀️|2462
-🧗|2464
-🧗🏻|2465
-🧗🏼|2466
-🧗🏽|2467
-🧗🏾|2468
-🧗🏿|2469
-🧗‍♂️|2470
-🧗🏻‍♂️|2472
-🧗🏼‍♂️|2474
-🧗🏽‍♂️|2476
-🧗🏾‍♂️|2478
-🧗🏿‍♂️|2480
-🧗‍♀️|2482
-🧗🏻‍♀️|2484
-🧗🏼‍♀️|2486
-🧗🏽‍♀️|2488
-🧗🏾‍♀️|2490
-🧗🏿‍♀️|2492
-🤺|2494
-🏇|2495
-🏇🏻|2496
-🏇🏼|2497
-🏇🏽|2498
-🏇🏾|2499
-🏇🏿|2500
-⛷️|2502
-🏂|2503
-🏌️|2510
-🏌🏻|2511
-🏌🏼|2512
-🏌🏽|2513
-🏌🏾|2514
-🏌🏿|2515
-🏌️‍♂️|2516
-🏌🏻‍♂️|2520
-🏌🏼‍♂️|2522
-🏌🏽‍♂️|2524
-🏌🏾‍♂️|2526
-🏌🏿‍♂️|2528
-🏌️‍♀️|2530
-🏌🏻‍♀️|2534
-🏌🏼‍♀️|2536
-🏌🏽‍♀️|2538
-🏌🏾‍♀️|2540
-🏌🏿‍♀️|2542
-🏄|2544
-🏄🏻|2545
-🏄🏼|2546
-🏄🏽|2547
-🏄🏾|2548
-🏄🏿|2549
-🏄‍♂️|2550
-🏄🏻‍♂️|2552
-🏄🏼‍♂️|2554
-🏄🏽‍♂️|2556
-🏄🏾‍♂️|2558
-🏄🏿‍♂️|2560
-🏄‍♀️|2562
-🏄🏻‍♀️|2564
-🏄🏼‍♀️|2566
-🏄🏽‍♀️|2568
-🏄🏾‍♀️|2570
-🏄🏿‍♀️|2572
-🚣|2574
-🚣🏻|2575
-🚣🏼|2576
-🚣🏽|2577
-🚣🏾|2578
-🚣🏿|2579
-🚣‍♂️|2580
-🚣🏻‍♂️|2582
-🚣🏼‍♂️|2584
-🚣🏽‍♂️|2586
-🚣🏾‍♂️|2588
-🚣🏿‍♂️|2590
-🚣‍♀️|2592
-🚣🏻‍♀️|2594
-🚣🏼‍♀️|2596
-🚣🏽‍♀️|2598
-🚣🏾‍♀️|2600
-🚣🏿‍♀️|2602
-🏊|2604
-🏊🏻|2605
-🏊🏼|2606
-🏊🏽|2607
-🏊🏾|2608
-🏊🏿|2609
-🏊‍♂️|2610
-🏊🏻‍♂️|2612
-🏊🏼‍♂️|2614
-🏊🏽‍♂️|2616
-🏊🏾‍♂️|2618
-🏊🏿‍♂️|2620
-🏊‍♀️|2622
-🏊🏻‍♀️|2624
-🏊🏼‍♀️|2626
-🏊🏽‍♀️|2628
-🏊🏾‍♀️|2630
-🏊🏿‍♀️|2632
-⛹️|2635
-⛹🏻|2636
-⛹🏼|2637
-⛹🏽|2638
-⛹🏾|2639
-⛹🏿|2640
-⛹️‍♂️|2641
-⛹🏻‍♂️|2645
-⛹🏼‍♂️|2647
-⛹🏽‍♂️|2649
-⛹🏾‍♂️|2651
-⛹🏿‍♂️|2653
-⛹️‍♀️|2655
-⛹🏻‍♀️|2659
-⛹🏼‍♀️|2661
-⛹🏽‍♀️|2663
-⛹🏾‍♀️|2665
-⛹🏿‍♀️|2667
-🏋️|2670
-🏋🏻|2671
-🏋🏼|2672
-🏋🏽|2673
-🏋🏾|2674
-🏋🏿|2675
-🏋️‍♂️|2676
-🏋🏻‍♂️|2680
-🏋🏼‍♂️|2682
-🏋🏽‍♂️|2684
-🏋🏾‍♂️|2686
-🏋🏿‍♂️|2688
-🏋️‍♀️|2690
-🏋🏻‍♀️|2694
-🏋🏼‍♀️|2696
-🏋🏽‍♀️|2698
-🏋🏾‍♀️|2700
-🏋🏿‍♀️|2702
-🚴|2704
-🚴🏻|2705
-🚴🏼|2706
-🚴🏽|2707
-🚴🏾|2708
-🚴🏿|2709
-🚴‍♂️|2710
-🚴🏻‍♂️|2712
-🚴🏼‍♂️|2714
-🚴🏽‍♂️|2716
-🚴🏾‍♂️|2718
-🚴🏿‍♂️|2720
-🚴‍♀️|2722
-🚴🏻‍♀️|2724
-🚴🏼‍♀️|2726
-🚴🏽‍♀️|2728
-🚴🏾‍♀️|2730
-🚴🏿‍♀️|2732
-🚵|2734
-🚵🏻|2735
-🚵🏼|2736
-🚵🏽|2737
-🚵🏾|2738
-🚵🏿|2739
-🚵‍♂️|2740
-🚵🏻‍♂️|2742
-🚵🏼‍♂️|2744
-🚵🏽‍♂️|2746
-🚵🏾‍♂️|2748
-🚵🏿‍♂️|2750
-🚵‍♀️|2752
-🚵🏻‍♀️|2754
-🚵🏼‍♀️|2756
-🚵🏽‍♀️|2758
-🚵🏾‍♀️|2760
-🚵🏿‍♀️|2762
-🤸|2764
-🤸🏻|2765
-🤸🏼|2766
-🤸🏽|2767
-🤸🏾|2768
-🤸🏿|2769
-🤸‍♂️|2770
-🤸🏻‍♂️|2772
-🤸🏼‍♂️|2774
-🤸🏽‍♂️|2776
-🤸🏾‍♂️|2778
-🤸🏿‍♂️|2780
-🤸‍♀️|2782
-🤸🏻‍♀️|2784
-🤸🏼‍♀️|2786
-🤸🏽‍♀️|2788
-🤸🏾‍♀️|2790
-🤸🏿‍♀️|2792
-🤼|2794
-🤼‍♂️|2795
-🤼‍♀️|2797
-🤽|2799
-🤽🏻|2800
-🤽🏼|2801
-🤽🏽|2802
-🤽🏾|2803
-🤽🏿|2804
-🤽‍♂️|2805
-🤽🏻‍♂️|2807
-🤽🏼‍♂️|2809
-🤽🏽‍♂️|2811
-🤽🏾‍♂️|2813
-🤽🏿‍♂️|2815
-🤽‍♀️|2817
-🤽🏻‍♀️|2819
-🤽🏼‍♀️|2821
-🤽🏽‍♀️|2823
-🤽🏾‍♀️|2825
-🤽🏿‍♀️|2827
-🤾|2829
-🤾🏻|2830
-🤾🏼|2831
-🤾🏽|2832
-🤾🏾|2833
-🤾🏿|2834
-🤾‍♂️|2835
-🤾🏻‍♂️|2837
-🤾🏼‍♂️|2839
-🤾🏽‍♂️|2841
-🤾🏾‍♂️|2843
-🤾🏿‍♂️|2845
-🤾‍♀️|2847
-🤾🏻‍♀️|2849
-🤾🏼‍♀️|2851
-🤾🏽‍♀️|2853
-🤾🏾‍♀️|2855
-🤾🏿‍♀️|2857
-🤹|2859
-🤹🏻|2860
-🤹🏼|2861
-🤹🏽|2862
-🤹🏾|2863
-🤹🏿|2864
-🤹‍♂️|2865
-🤹🏻‍♂️|2867
-🤹🏼‍♂️|2869
-🤹🏽‍♂️|2871
-🤹🏾‍♂️|2873
-🤹🏿‍♂️|2875
-🤹‍♀️|2877
-🤹🏻‍♀️|2879
-🤹🏼‍♀️|2881
-🤹🏽‍♀️|2883
-🤹🏾‍♀️|2885
-🤹🏿‍♀️|2887
-🧘|2889
-🧘🏻|2890
-🧘🏼|2891
-🧘🏽|2892
-🧘🏾|2893
-🧘🏿|2894
-🧘‍♂️|2895
-🧘🏻‍♂️|2897
-🧘🏼‍♂️|2899
-🧘🏽‍♂️|2901
-🧘🏾‍♂️|2903
-🧘🏿‍♂️|2905
-🧘‍♀️|2907
-🧘🏻‍♀️|2909
-🧘🏼‍♀️|2911
-🧘🏽‍♀️|2913
-🧘🏾‍♀️|2915
-🧘🏿‍♀️|2917
-🛀|2919
-🛀🏻|2920
-🛀🏼|2921
-🛀🏽|2922
-🛀🏾|2923
-🛀🏿|2924
-🛌|2925
-🧑‍🤝‍🧑|2931
-🧑🏻‍🤝‍🧑🏻|2932
-🧑🏼‍🤝‍🧑🏼|2938
-🧑🏽‍🤝‍🧑🏽|2944
-🧑🏾‍🤝‍🧑🏾|2950
-🧑🏿‍🤝‍🧑🏿|2956
-👭|2957
-👭🏻|2958
-👭🏼|2964
-👭🏽|2970
-👭🏾|2976
-👭🏿|2982
-👫|2983
-👫🏻|2984
-👫🏼|2990
-👫🏽|2996
-👫🏾|3002
-👫🏿|3008
-👬|3009
-👬🏻|3010
-👬🏼|3016
-👬🏽|3022
-👬🏾|3028
-👬🏿|3034
-💏|3035
-💏🏻|3036
-💏🏼|3037
-💏🏽|3038
-💏🏾|3039
-💏🏿|3040
-👩‍❤️‍💋‍👨|3081
-👩🏻‍❤️‍💋‍👨🏻|3083
-👩🏼‍❤️‍💋‍👨🏼|3095
-👩🏽‍❤️‍💋‍👨🏽|3107
-👩🏾‍❤️‍💋‍👨🏾|3119
-👩🏿‍❤️‍💋‍👨🏿|3131
-👨‍❤️‍💋‍👨|3133
-👨🏻‍❤️‍💋‍👨🏻|3135
-👨🏼‍❤️‍💋‍👨🏼|3147
-👨🏽‍❤️‍💋‍👨🏽|3159
-👨🏾‍❤️‍💋‍👨🏾|3171
-👨🏿‍❤️‍💋‍👨🏿|3183
-👩‍❤️‍💋‍👩|3185
-👩🏻‍❤️‍💋‍👩🏻|3187
-👩🏼‍❤️‍💋‍👩🏼|3199
-👩🏽‍❤️‍💋‍👩🏽|3211
-👩🏾‍❤️‍💋‍👩🏾|3223
-👩🏿‍❤️‍💋‍👩🏿|3235
-💑|3237
-💑🏻|3238
-💑🏼|3239
-💑🏽|3240
-💑🏾|3241
-💑🏿|3242
-👩‍❤️‍👨|3283
-👩🏻‍❤️‍👨🏻|3285
-👩🏼‍❤️‍👨🏼|3297
-👩🏽‍❤️‍👨🏽|3309
-👩🏾‍❤️‍👨🏾|3321
-👩🏿‍❤️‍👨🏿|3333
-👨‍❤️‍👨|3335
-👨🏻‍❤️‍👨🏻|3337
-👨🏼‍❤️‍👨🏼|3349
-👨🏽‍❤️‍👨🏽|3361
-👨🏾‍❤️‍👨🏾|3373
-👨🏿‍❤️‍👨🏿|3385
-👩‍❤️‍👩|3387
-👩🏻‍❤️‍👩🏻|3389
-👩🏼‍❤️‍👩🏼|3401
-👩🏽‍❤️‍👩🏽|3413
-👩🏾‍❤️‍👩🏾|3425
-👩🏿‍❤️‍👩🏿|3437
-👨‍👩‍👦|3439
-👨‍👩‍👧|3440
-👨‍👩‍👧‍👦|3441
-👨‍👩‍👦‍👦|3442
-👨‍👩‍👧‍👧|3443
-👨‍👨‍👦|3444
-👨‍👨‍👧|3445
-👨‍👨‍👧‍👦|3446
-👨‍👨‍👦‍👦|3447
-👨‍👨‍👧‍👧|3448
-👩‍👩‍👦|3449
-👩‍👩‍👧|3450
-👩‍👩‍👧‍👦|3451
-👩‍👩‍👦‍👦|3452
-👩‍👩‍👧‍👧|3453
-👨‍👦|3454
-👨‍👦‍👦|3455
-👨‍👧|3456
-👨‍👧‍👦|3457
-👨‍👧‍👧|3458
-👩‍👦|3459
-👩‍👦‍👦|3460
-👩‍👧|3461
-👩‍👧‍👦|3462
-👩‍👧‍👧|3463
-🗣️|3465
-👤|3466
-👥|3467
-🫂|3468
-👪|3469
-🧑‍🧑‍🧒|3470
-🧑‍🧑‍🧒‍🧒|3471
-🧑‍🧒|3472
-🧑‍🧒‍🧒|3473
-👣|3474
-🐵|3484
-🐒|3485
-🦍|3486
-🦧|3487
-🐶|3488
-🐕|3489
-🦮|3490
-🐕‍🦺|3491
-🐩|3492
-🐺|3493
-🦊|3494
-🦝|3495
-🐱|3496
-🐈|3497
-🐈‍⬛|3498
-🦁|3499
-🐯|3500
-🐅|3501
-🐆|3502
-🐴|3503
-🫎|3504
-🫏|3505
-🐎|3506
-🦄|3507
-🦓|3508
-🦌|3509
-🦬|3510
-🐮|3511
-🐂|3512
-🐃|3513
-🐄|3514
-🐷|3515
-🐖|3516
-🐗|3517
-🐽|3518
-🐏|3519
-🐑|3520
-🐐|3521
-🐪|3522
-🐫|3523
-🦙|3524
-🦒|3525
-🐘|3526
-🦣|3527
-🦏|3528
-🦛|3529
-🐭|3530
-🐁|3531
-🐀|3532
-🐹|3533
-🐰|3534
-🐇|3535
-🐿️|3537
-🦫|3538
-🦔|3539
-🦇|3540
-🐻|3541
-🐻‍❄️|3542
-🐨|3544
-🐼|3545
-🦥|3546
-🦦|3547
-🦨|3548
-🦘|3549
-🦡|3550
-🐾|3551
-🦃|3552
-🐔|3553
-🐓|3554
-🐣|3555
-🐤|3556
-🐥|3557
-🐦|3558
-🐧|3559
-🕊️|3561
-🦅|3562
-🦆|3563
-🦢|3564
-🦉|3565
-🦤|3566
-🪶|3567
-🦩|3568
-🦚|3569
-🦜|3570
-🪽|3571
-🐦‍⬛|3572
-🪿|3573
-🐦‍🔥|3574
-🐸|3575
-🐊|3576
-🐢|3577
-🦎|3578
-🐍|3579
-🐲|3580
-🐉|3581
-🦕|3582
-🦖|3583
-🐳|3584
-🐋|3585
-🐬|3586
-🦭|3587
-🐟|3588
-🐠|3589
-🐡|3590
-🦈|3591
-🐙|3592
-🐚|3593
-🪸|3594
-🪼|3595
-🐌|3596
-🦋|3597
-🐛|3598
-🐜|3599
-🐝|3600
-🪲|3601
-🐞|3602
-🦗|3603
-🪳|3604
-🕷️|3606
-🕸️|3608
-🦂|3609
-🦟|3610
-🪰|3611
-🪱|3612
-🦠|3613
-💐|3614
-🌸|3615
-💮|3616
-🪷|3617
-🏵️|3619
-🌹|3620
-🥀|3621
-🌺|3622
-🌻|3623
-🌼|3624
-🌷|3625
-🪻|3626
-🌱|3627
-🪴|3628
-🌲|3629
-🌳|3630
-🌴|3631
-🌵|3632
-🌾|3633
-🌿|3634
-🍀|3637
-🍁|3638
-🍂|3639
-🍃|3640
-🪹|3641
-🪺|3642
-🍄|3643
-🍇|3644
-🍈|3645
-🍉|3646
-🍊|3647
-🍋|3648
-🍋‍🟩|3649
-🍌|3650
-🍍|3651
-🥭|3652
-🍎|3653
-🍏|3654
-🍐|3655
-🍑|3656
-🍒|3657
-🍓|3658
-🫐|3659
-🥝|3660
-🍅|3661
-🫒|3662
-🥥|3663
-🥑|3664
-🍆|3665
-🥔|3666
-🥕|3667
-🌽|3668
-🌶️|3670
-🫑|3671
-🥒|3672
-🥬|3673
-🥦|3674
-🧄|3675
-🧅|3676
-🥜|3677
-🫘|3678
-🌰|3679
-🫚|3680
-🫛|3681
-🍄‍🟫|3682
-🍞|3683
-🥐|3684
-🥖|3685
-🫓|3686
-🥨|3687
-🥯|3688
-🥞|3689
-🧇|3690
-🧀|3691
-🍖|3692
-🍗|3693
-🥩|3694
-🥓|3695
-🍔|3696
-🍟|3697
-🍕|3698
-🌭|3699
-🥪|3700
-🌮|3701
-🌯|3702
-🫔|3703
-🥙|3704
-🧆|3705
-🥚|3706
-🍳|3707
-🥘|3708
-🍲|3709
-🫕|3710
-🥣|3711
-🥗|3712
-🍿|3713
-🧈|3714
-🧂|3715
-🥫|3716
-🍱|3717
-🍘|3718
-🍙|3719
-🍚|3720
-🍛|3721
-🍜|3722
-🍝|3723
-🍠|3724
-🍢|3725
-🍣|3726
-🍤|3727
-🍥|3728
-🥮|3729
-🍡|3730
-🥟|3731
-🥠|3732
-🥡|3733
-🦀|3734
-🦞|3735
-🦐|3736
-🦑|3737
-🦪|3738
-🍦|3739
-🍧|3740
-🍨|3741
-🍩|3742
-🍪|3743
-🎂|3744
-🍰|3745
-🧁|3746
-🥧|3747
-🍫|3748
-🍬|3749
-🍭|3750
-🍮|3751
-🍯|3752
-🍼|3753
-🥛|3754
-🫖|3756
-🍵|3757
-🍶|3758
-🍾|3759
-🍷|3760
-🍸|3761
-🍹|3762
-🍺|3763
-🍻|3764
-🥂|3765
-🥃|3766
-🫗|3767
-🥤|3768
-🧋|3769
-🧃|3770
-🧉|3771
-🧊|3772
-🥢|3773
-🍽️|3775
-🍴|3776
-🥄|3777
-🔪|3778
-🫙|3779
-🏺|3780
-🌍|3781
-🌎|3782
-🌏|3783
-🌐|3784
-🗺️|3786
-🗾|3787
-🧭|3788
-🏔️|3790
-⛰️|3792
-🌋|3793
-🗻|3794
-🏕️|3796
-🏖️|3798
-🏜️|3800
-🏝️|3802
-🏞️|3804
-🏟️|3806
-🏛️|3808
-🏗️|3810
-🧱|3811
-🪨|3812
-🪵|3813
-🛖|3814
-🏘️|3816
-🏚️|3818
-🏠|3819
-🏡|3820
-🏢|3821
-🏣|3822
-🏤|3823
-🏥|3824
-🏦|3825
-🏨|3826
-🏩|3827
-🏪|3828
-🏫|3829
-🏬|3830
-🏭|3831
-🏯|3832
-🏰|3833
-💒|3834
-🗼|3835
-🗽|3836
-⛪|3837
-🕌|3838
-🛕|3839
-🕍|3840
-⛩️|3842
-🕋|3843
-⛲|3844
-⛺|3845
-🌁|3846
-🌃|3847
-🏙️|3849
-🌄|3850
-🌅|3851
-🌆|3852
-🌇|3853
-🌉|3854
-🎠|3857
-🛝|3858
-🎡|3859
-🎢|3860
-💈|3861
-🎪|3862
-🚂|3863
-🚃|3864
-🚄|3865
-🚅|3866
-🚆|3867
-🚇|3868
-🚈|3869
-🚉|3870
-🚊|3871
-🚝|3872
-🚞|3873
-🚋|3874
-🚌|3875
-🚍|3876
-🚎|3877
-🚐|3878
-🚑|3879
-🚒|3880
-🚓|3881
-🚔|3882
-🚕|3883
-🚖|3884
-🚗|3885
-🚘|3886
-🚙|3887
-🛻|3888
-🚚|3889
-🚛|3890
-🚜|3891
-🏎️|3893
-🏍️|3895
-🛵|3896
-🦽|3897
-🦼|3898
-🛺|3899
-🚲|3900
-🛴|3901
-🛹|3902
-🛼|3903
-🚏|3904
-🛣️|3906
-🛤️|3908
-🛢️|3910
-⛽|3911
-🛞|3912
-🚨|3913
-🚥|3914
-🚦|3915
-🛑|3916
-🚧|3917
-🛟|3919
-⛵|3920
-🛶|3921
-🚤|3922
-🛳️|3924
-⛴️|3926
-🛥️|3928
-🚢|3929
-🛩️|3933
-🛫|3934
-🛬|3935
-🪂|3936
-💺|3937
-🚁|3938
-🚟|3939
-🚠|3940
-🚡|3941
-🛰️|3943
-🚀|3944
-🛸|3945
-🛎️|3947
-🧳|3948
-⌛|3949
-⏳|3950
-⌚|3951
-⏰|3952
-⏱️|3954
-⏲️|3956
-🕰️|3958
-🕛|3959
-🕧|3960
-🕐|3961
-🕜|3962
-🕑|3963
-🕝|3964
-🕒|3965
-🕞|3966
-🕓|3967
-🕟|3968
-🕔|3969
-🕠|3970
-🕕|3971
-🕡|3972
-🕖|3973
-🕢|3974
-🕗|3975
-🕣|3976
-🕘|3977
-🕤|3978
-🕙|3979
-🕥|3980
-🕚|3981
-🕦|3982
-🌑|3983
-🌒|3984
-🌓|3985
-🌔|3986
-🌕|3987
-🌖|3988
-🌗|3989
-🌘|3990
-🌙|3991
-🌚|3992
-🌛|3993
-🌜|3994
-🌡️|3996
-🌝|3999
-🌞|4000
-🪐|4001
-⭐|4002
-🌟|4003
-🌠|4004
-🌌|4005
-⛅|4008
-⛈️|4010
-🌤️|4012
-🌥️|4014
-🌦️|4016
-🌧️|4018
-🌨️|4020
-🌩️|4022
-🌪️|4024
-🌫️|4026
-🌬️|4028
-🌀|4029
-🌈|4030
-🌂|4031
-⛱️|4036
-⚡|4037
-⛄|4042
-🔥|4045
-💧|4046
-🌊|4047
-🎃|4048
-🎄|4049
-🎆|4050
-🎇|4051
-🧨|4052
-🎈|4054
-🎉|4055
-🎊|4056
-🎋|4057
-🎍|4058
-🎎|4059
-🎏|4060
-🎐|4061
-🎑|4062
-🧧|4063
-🎀|4064
-🎁|4065
-🎗️|4067
-🎟️|4069
-🎫|4070
-🎖️|4072
-🏆|4073
-🏅|4074
-🥇|4075
-🥈|4076
-🥉|4077
-⚽|4078
-⚾|4079
-🥎|4080
-🏀|4081
-🏐|4082
-🏈|4083
-🏉|4084
-🎾|4085
-🥏|4086
-🎳|4087
-🏏|4088
-🏑|4089
-🏒|4090
-🥍|4091
-🏓|4092
-🏸|4093
-🥊|4094
-🥋|4095
-🥅|4096
-⛳|4097
-⛸️|4099
-🎣|4100
-🤿|4101
-🎽|4102
-🎿|4103
-🛷|4104
-🥌|4105
-🎯|4106
-🪀|4107
-🪁|4108
-🔫|4109
-🎱|4110
-🔮|4111
-🪄|4112
-🎮|4113
-🕹️|4115
-🎰|4116
-🎲|4117
-🧩|4118
-🧸|4119
-🪅|4120
-🪩|4121
-🪆|4122
-♟️|4132
-🃏|4133
-🀄|4134
-🎴|4135
-🎭|4136
-🖼️|4138
-🎨|4139
-🧵|4140
-🪡|4141
-🧶|4142
-🪢|4143
-👓|4144
-🕶️|4146
-🥽|4147
-🥼|4148
-🦺|4149
-👔|4150
-👕|4151
-👖|4152
-🧣|4153
-🧤|4154
-🧥|4155
-🧦|4156
-👗|4157
-👘|4158
-🥻|4159
-🩱|4160
-🩲|4161
-🩳|4162
-👙|4163
-👚|4164
-🪭|4165
-👛|4166
-👜|4167
-👝|4168
-🛍️|4170
-🎒|4171
-🩴|4172
-👞|4173
-👟|4174
-🥾|4175
-🥿|4176
-👠|4177
-👡|4178
-🩰|4179
-👢|4180
-🪮|4181
-👑|4182
-👒|4183
-🎩|4184
-🎓|4185
-🧢|4186
-🪖|4187
-⛑️|4189
-📿|4190
-💄|4191
-💍|4192
-💎|4193
-🔇|4194
-🔈|4195
-🔉|4196
-🔊|4197
-📢|4198
-📣|4199
-📯|4200
-🔔|4201
-🔕|4202
-🎼|4203
-🎵|4204
-🎶|4205
-🎙️|4207
-🎚️|4209
-🎛️|4211
-🎤|4212
-🎧|4213
-📻|4214
-🎷|4215
-🪗|4216
-🎸|4217
-🎹|4218
-🎺|4219
-🎻|4220
-🪕|4221
-🥁|4222
-🪘|4223
-🪇|4224
-🪈|4225
-📱|4226
-📲|4227
-☎️|4229
-📞|4230
-📟|4231
-📠|4232
-🔋|4233
-🪫|4234
-🔌|4235
-💻|4236
-🖥️|4238
-🖨️|4240
-🖱️|4244
-🖲️|4246
-💽|4247
-💾|4248
-💿|4249
-📀|4250
-🧮|4251
-🎥|4252
-🎞️|4254
-📽️|4256
-🎬|4257
-📺|4258
-📷|4259
-📸|4260
-📹|4261
-📼|4262
-🔍|4263
-🔎|4264
-🕯️|4266
-💡|4267
-🔦|4268
-🏮|4269
-🪔|4270
-📔|4271
-📕|4272
-📖|4273
-📗|4274
-📘|4275
-📙|4276
-📚|4277
-📓|4278
-📒|4279
-📃|4280
-📜|4281
-📄|4282
-📰|4283
-🗞️|4285
-📑|4286
-🔖|4287
-🏷️|4289
-💰|4290
-🪙|4291
-💴|4292
-💵|4293
-💶|4294
-💷|4295
-💸|4296
-💳|4297
-🧾|4298
-💹|4299
-📧|4302
-📨|4303
-📩|4304
-📤|4305
-📥|4306
-📦|4307
-📫|4308
-📪|4309
-📬|4310
-📭|4311
-📮|4312
-🗳️|4314
-✏️|4316
-🖋️|4320
-🖊️|4322
-🖌️|4324
-🖍️|4326
-📝|4327
-💼|4328
-📁|4329
-📂|4330
-🗂️|4332
-📅|4333
-📆|4334
-🗒️|4336
-🗓️|4338
-📇|4339
-📈|4340
-📉|4341
-📊|4342
-📋|4343
-📌|4344
-📍|4345
-📎|4346
-🖇️|4348
-📏|4349
-📐|4350
-🗃️|4354
-🗄️|4356
-🗑️|4358
-🔒|4359
-🔓|4360
-🔏|4361
-🔐|4362
-🔑|4363
-🗝️|4365
-🔨|4366
-🪓|4367
-⛏️|4369
-🛠️|4373
-🗡️|4375
-💣|4378
-🪃|4379
-🏹|4380
-🛡️|4382
-🪚|4383
-🔧|4384
-🪛|4385
-🔩|4386
-🗜️|4390
-🦯|4393
-🔗|4394
-⛓️‍💥|4395
-⛓️|4398
-🪝|4399
-🧰|4400
-🧲|4401
-🪜|4402
-🧪|4405
-🧫|4406
-🧬|4407
-🔬|4408
-🔭|4409
-📡|4410
-💉|4411
-🩸|4412
-💊|4413
-🩹|4414
-🩼|4415
-🩺|4416
-🩻|4417
-🚪|4418
-🛗|4419
-🪞|4420
-🪟|4421
-🛏️|4423
-🛋️|4425
-🪑|4426
-🚽|4427
-🪠|4428
-🚿|4429
-🛁|4430
-🪤|4431
-🪒|4432
-🧴|4433
-🧷|4434
-🧹|4435
-🧺|4436
-🧻|4437
-🪣|4438
-🧼|4439
-🫧|4440
-🪥|4441
-🧽|4442
-🧯|4443
-🛒|4444
-🚬|4445
-⚰️|4447
-🪦|4448
-⚱️|4450
-🧿|4451
-🪬|4452
-🗿|4453
-🪧|4454
-🪪|4455
-🏧|4456
-🚮|4457
-🚰|4458
-♿|4459
-🚹|4460
-🚺|4461
-🚻|4462
-🚼|4463
-🚾|4464
-🛂|4465
-🛃|4466
-🛄|4467
-🛅|4468
-⚠️|4470
-🚸|4471
-⛔|4472
-🚫|4473
-🚳|4474
-🚭|4475
-🚯|4476
-🚱|4477
-🚷|4478
-📵|4479
-🔞|4480
-⬆️|4486
-➡️|4490
-⬇️|4494
-⬅️|4498
-↩️|4506
-↪️|4508
-🔃|4513
-🔄|4514
-🔙|4515
-🔚|4516
-🔛|4517
-🔜|4518
-🔝|4519
-🛐|4520
-⚛️|4522
-🕉️|4524
-☯️|4530
-✝️|4532
-☪️|4536
-☮️|4538
-🕎|4539
-🔯|4540
-🪯|4541
-♊|4544
-♋|4545
-♌|4546
-♍|4547
-♎|4548
-♏|4549
-⛎|4554
-🔀|4555
-🔁|4556
-🔂|4557
-▶️|4559
-⏩|4560
-⏭️|4562
-⏯️|4564
-◀️|4566
-⏪|4567
-⏮️|4569
-🔼|4570
-⏫|4571
-🔽|4572
-⏬|4573
-⏸️|4575
-⏹️|4577
-⏺️|4579
-⏏️|4581
-🎦|4582
-🔅|4583
-🔆|4584
-📶|4585
-🛜|4586
-📳|4587
-📴|4588
-⚧️|4594
-🟰|4600
-♾️|4602
-‼️|4604
-💱|4613
-💲|4614
-♻️|4618
-⚜️|4620
-🔱|4621
-📛|4622
-🔰|4623
-⭕|4624
-❌|4630
-❎|4631
-➰|4632
-➿|4633
-〽️|4635
-©️|4643
-®️|4645
-🔟|4672
-🔠|4673
-🔡|4674
-🔢|4675
-🔣|4676
-🔤|4677
-🅰️|4679
-🆎|4680
-🅱️|4682
-🆑|4683
-🆒|4684
-🆓|4685
-🆔|4688
-Ⓜ️|4690
-🆕|4691
-🆖|4692
-🅾️|4694
-🆗|4695
-🅿️|4697
-🆘|4698
-🆙|4699
-🆚|4700
-🈁|4701
-🈂️|4703
-🈷️|4705
-🈶|4706
-🈯|4707
-🉐|4708
-🈹|4709
-🈚|4710
-🈲|4711
-🉑|4712
-🈸|4713
-🈴|4714
-🈳|4715
-🈺|4720
-🈵|4721
-🔴|4722
-🟠|4723
-🟡|4724
-🟢|4725
-🔵|4726
-🟣|4727
-🟤|4728
-⚫|4729
-⚪|4730
-🟥|4731
-🟧|4732
-🟨|4733
-🟩|4734
-🟦|4735
-🟪|4736
-🟫|4737
-⬛|4738
-⬜|4739
-◼️|4741
-◻️|4743
-◾|4744
-◽|4745
-▪️|4747
-▫️|4749
-🔶|4750
-🔷|4751
-🔸|4752
-🔹|4753
-🔺|4754
-🔻|4755
-💠|4756
-🔘|4757
-🔳|4758
-🔲|4759
-🏁|4760
-🚩|4761
-🎌|4762
-🏴|4763
-🏳️|4765
-🏳️‍🌈|4766
-🏳️‍⚧️|4768
-🏴‍☠️|4772
-🇦🇩|4775
-🇦🇪|4776
-🇦🇫|4777
-🇦🇬|4778
-🇦🇮|4779
-🇦🇱|4780
-🇦🇲|4781
-🇦🇴|4782
-🇦🇶|4783
-🇦🇷|4784
-🇦🇸|4785
-🇦🇹|4786
-🇦🇺|4787
-🇦🇼|4788
-🇦🇽|4789
-🇦🇿|4790
-🇧🇦|4791
-🇧🇧|4792
-🇧🇩|4793
-🇧🇪|4794
-🇧🇫|4795
-🇧🇬|4796
-🇧🇭|4797
-🇧🇮|4798
-🇧🇯|4799
-🇧🇱|4800
-🇧🇲|4801
-🇧🇳|4802
-🇧🇴|4803
-🇧🇶|4804
-🇧🇷|4805
-🇧🇸|4806
-🇧🇹|4807
-🇧🇼|4809
-🇧🇾|4810
-🇧🇿|4811
-🇨🇦|4812
-🇨🇨|4813
-🇨🇩|4814
-🇨🇫|4815
-🇨🇬|4816
-🇨🇭|4817
-🇨🇮|4818
-🇨🇰|4819
-🇨🇱|4820
-🇨🇲|4821
-🇨🇳|4822
-🇨🇴|4823
-🇨🇷|4825
-🇨🇺|4826
-🇨🇻|4827
-🇨🇼|4828
-🇨🇽|4829
-🇨🇾|4830
-🇨🇿|4831
-🇩🇪|4832
-🇩🇯|4834
-🇩🇰|4835
-🇩🇲|4836
-🇩🇴|4837
-🇩🇿|4838
-🇪🇨|4840
-🇪🇪|4841
-🇪🇬|4842
-🇪🇭|4843
-🇪🇷|4844
-🇪🇸|4845
-🇪🇹|4846
-🇪🇺|4847
-🇫🇮|4848
-🇫🇯|4849
-🇫🇰|4850
-🇫🇲|4851
-🇫🇴|4852
-🇫🇷|4853
-🇬🇦|4854
-🇬🇧|4855
-🇬🇩|4856
-🇬🇪|4857
-🇬🇫|4858
-🇬🇬|4859
-🇬🇭|4860
-🇬🇮|4861
-🇬🇱|4862
-🇬🇲|4863
-🇬🇳|4864
-🇬🇵|4865
-🇬🇶|4866
-🇬🇷|4867
-🇬🇸|4868
-🇬🇹|4869
-🇬🇺|4870
-🇬🇼|4871
-🇬🇾|4872
-🇭🇰|4873
-🇭🇳|4875
-🇭🇷|4876
-🇭🇹|4877
-🇭🇺|4878
-🇮🇨|4879
-🇮🇩|4880
-🇮🇪|4881
-🇮🇱|4882
-🇮🇲|4883
-🇮🇳|4884
-🇮🇴|4885
-🇮🇶|4886
-🇮🇷|4887
-🇮🇸|4888
-🇮🇹|4889
-🇯🇪|4890
-🇯🇲|4891
-🇯🇴|4892
-🇯🇵|4893
-🇰🇪|4894
-🇰🇬|4895
-🇰🇭|4896
-🇰🇮|4897
-🇰🇲|4898
-🇰🇳|4899
-🇰🇵|4900
-🇰🇷|4901
-🇰🇼|4902
-🇰🇾|4903
-🇰🇿|4904
-🇱🇦|4905
-🇱🇧|4906
-🇱🇨|4907
-🇱🇮|4908
-🇱🇰|4909
-🇱🇷|4910
-🇱🇸|4911
-🇱🇹|4912
-🇱🇺|4913
-🇱🇻|4914
-🇱🇾|4915
-🇲🇦|4916
-🇲🇨|4917
-🇲🇩|4918
-🇲🇪|4919
-🇲🇬|4921
-🇲🇭|4922
-🇲🇰|4923
-🇲🇱|4924
-🇲🇲|4925
-🇲🇳|4926
-🇲🇴|4927
-🇲🇵|4928
-🇲🇶|4929
-🇲🇷|4930
-🇲🇸|4931
-🇲🇹|4932
-🇲🇺|4933
-🇲🇻|4934
-🇲🇼|4935
-🇲🇽|4936
-🇲🇾|4937
-🇲🇿|4938
-🇳🇦|4939
-🇳🇨|4940
-🇳🇪|4941
-🇳🇫|4942
-🇳🇬|4943
-🇳🇮|4944
-🇳🇱|4945
-🇳🇴|4946
-🇳🇵|4947
-🇳🇷|4948
-🇳🇺|4949
-🇳🇿|4950
-🇴🇲|4951
-🇵🇦|4952
-🇵🇪|4953
-🇵🇫|4954
-🇵🇬|4955
-🇵🇭|4956
-🇵🇰|4957
-🇵🇱|4958
-🇵🇲|4959
-🇵🇳|4960
-🇵🇷|4961
-🇵🇸|4962
-🇵🇹|4963
-🇵🇼|4964
-🇵🇾|4965
-🇶🇦|4966
-🇷🇪|4967
-🇷🇴|4968
-🇷🇸|4969
-🇷🇺|4970
-🇷🇼|4971
-🇸🇦|4972
-🇸🇧|4973
-🇸🇨|4974
-🇸🇩|4975
-🇸🇪|4976
-🇸🇬|4977
-🇸🇭|4978
-🇸🇮|4979
-🇸🇰|4981
-🇸🇱|4982
-🇸🇲|4983
-🇸🇳|4984
-🇸🇴|4985
-🇸🇷|4986
-🇸🇸|4987
-🇸🇹|4988
-🇸🇻|4989
-🇸🇽|4990
-🇸🇾|4991
-🇸🇿|4992
-🇹🇨|4994
-🇹🇩|4995
-🇹🇫|4996
-🇹🇬|4997
-🇹🇭|4998
-🇹🇯|4999
-🇹🇰|5000
-🇹🇱|5001
-🇹🇲|5002
-🇹🇳|5003
-🇹🇴|5004
-🇹🇷|5005
-🇹🇹|5006
-🇹🇻|5007
-🇹🇼|5008
-🇹🇿|5009
-🇺🇦|5010
-🇺🇬|5011
-🇺🇸|5014
-🇺🇾|5015
-🇺🇿|5016
-🇻🇦|5017
-🇻🇨|5018
-🇻🇪|5019
-🇻🇬|5020
-🇻🇮|5021
-🇻🇳|5022
-🇻🇺|5023
-🇼🇫|5024
-🇼🇸|5025
-🇽🇰|5026
-🇾🇪|5027
-🇾🇹|5028
-🇿🇦|5029
-🇿🇲|5030
-🇿🇼|5031
-🏴󠁧󠁢󠁥󠁮󠁧󠁿|5032
-🏴󠁧󠁢󠁳󠁣󠁴󠁿|5033
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|5034
+🫩|62
+😷|63
+🤒|64
+🤕|65
+🤢|66
+🤮|67
+🤧|68
+🥵|69
+🥶|70
+🥴|71
+😵|72
+😵‍💫|73
+🤯|74
+🤠|75
+🥳|76
+🥸|77
+😎|78
+🤓|79
+🧐|80
+😕|81
+🫤|82
+😟|83
+🙁|84
+😮|87
+😯|88
+😲|89
+😳|90
+🥺|91
+🥹|92
+😦|93
+😧|94
+😨|95
+😰|96
+😥|97
+😢|98
+😭|99
+😱|100
+😖|101
+😣|102
+😞|103
+😓|104
+😩|105
+😫|106
+🥱|107
+😤|108
+😡|109
+😠|110
+🤬|111
+😈|112
+👿|113
+💀|114
+💩|117
+🤡|118
+👹|119
+👺|120
+👻|121
+👽|122
+👾|123
+🤖|124
+😺|125
+😸|126
+😹|127
+😻|128
+😼|129
+😽|130
+🙀|131
+😿|132
+😾|133
+🙈|134
+🙉|135
+🙊|136
+💌|137
+💘|138
+💝|139
+💖|140
+💗|141
+💓|142
+💞|143
+💕|144
+💟|145
+💔|148
+❤️‍🔥|149
+❤️‍🩹|151
+🩷|155
+🧡|156
+💛|157
+💚|158
+💙|159
+🩵|160
+💜|161
+🤎|162
+🖤|163
+🩶|164
+🤍|165
+💋|166
+💯|167
+💢|168
+💥|169
+💫|170
+💦|171
+💨|172
+🕳️|174
+💬|175
+👁️‍🗨️|176
+🗨️|181
+🗯️|183
+💭|184
+💤|185
+👋|186
+👋🏻|187
+👋🏼|188
+👋🏽|189
+👋🏾|190
+👋🏿|191
+🤚|192
+🤚🏻|193
+🤚🏼|194
+🤚🏽|195
+🤚🏾|196
+🤚🏿|197
+🖐️|199
+🖐🏻|200
+🖐🏼|201
+🖐🏽|202
+🖐🏾|203
+🖐🏿|204
+✋|205
+✋🏻|206
+✋🏼|207
+✋🏽|208
+✋🏾|209
+✋🏿|210
+🖖|211
+🖖🏻|212
+🖖🏼|213
+🖖🏽|214
+🖖🏾|215
+🖖🏿|216
+🫱|217
+🫱🏻|218
+🫱🏼|219
+🫱🏽|220
+🫱🏾|221
+🫱🏿|222
+🫲|223
+🫲🏻|224
+🫲🏼|225
+🫲🏽|226
+🫲🏾|227
+🫲🏿|228
+🫳|229
+🫳🏻|230
+🫳🏼|231
+🫳🏽|232
+🫳🏾|233
+🫳🏿|234
+🫴|235
+🫴🏻|236
+🫴🏼|237
+🫴🏽|238
+🫴🏾|239
+🫴🏿|240
+🫷|241
+🫷🏻|242
+🫷🏼|243
+🫷🏽|244
+🫷🏾|245
+🫷🏿|246
+🫸|247
+🫸🏻|248
+🫸🏼|249
+🫸🏽|250
+🫸🏾|251
+🫸🏿|252
+👌|253
+👌🏻|254
+👌🏼|255
+👌🏽|256
+👌🏾|257
+👌🏿|258
+🤌|259
+🤌🏻|260
+🤌🏼|261
+🤌🏽|262
+🤌🏾|263
+🤌🏿|264
+🤏|265
+🤏🏻|266
+🤏🏼|267
+🤏🏽|268
+🤏🏾|269
+🤏🏿|270
+✌️|272
+✌🏻|273
+✌🏼|274
+✌🏽|275
+✌🏾|276
+✌🏿|277
+🤞|278
+🤞🏻|279
+🤞🏼|280
+🤞🏽|281
+🤞🏾|282
+🤞🏿|283
+🫰|284
+🫰🏻|285
+🫰🏼|286
+🫰🏽|287
+🫰🏾|288
+🫰🏿|289
+🤟|290
+🤟🏻|291
+🤟🏼|292
+🤟🏽|293
+🤟🏾|294
+🤟🏿|295
+🤘|296
+🤘🏻|297
+🤘🏼|298
+🤘🏽|299
+🤘🏾|300
+🤘🏿|301
+🤙|302
+🤙🏻|303
+🤙🏼|304
+🤙🏽|305
+🤙🏾|306
+🤙🏿|307
+👈|308
+👈🏻|309
+👈🏼|310
+👈🏽|311
+👈🏾|312
+👈🏿|313
+👉|314
+👉🏻|315
+👉🏼|316
+👉🏽|317
+👉🏾|318
+👉🏿|319
+👆|320
+👆🏻|321
+👆🏼|322
+👆🏽|323
+👆🏾|324
+👆🏿|325
+🖕|326
+🖕🏻|327
+🖕🏼|328
+🖕🏽|329
+🖕🏾|330
+🖕🏿|331
+👇|332
+👇🏻|333
+👇🏼|334
+👇🏽|335
+👇🏾|336
+👇🏿|337
+☝️|339
+☝🏻|340
+☝🏼|341
+☝🏽|342
+☝🏾|343
+☝🏿|344
+🫵|345
+🫵🏻|346
+🫵🏼|347
+🫵🏽|348
+🫵🏾|349
+🫵🏿|350
+👍|351
+👍🏻|352
+👍🏼|353
+👍🏽|354
+👍🏾|355
+👍🏿|356
+👎|357
+👎🏻|358
+👎🏼|359
+👎🏽|360
+👎🏾|361
+👎🏿|362
+✊|363
+✊🏻|364
+✊🏼|365
+✊🏽|366
+✊🏾|367
+✊🏿|368
+👊|369
+👊🏻|370
+👊🏼|371
+👊🏽|372
+👊🏾|373
+👊🏿|374
+🤛|375
+🤛🏻|376
+🤛🏼|377
+🤛🏽|378
+🤛🏾|379
+🤛🏿|380
+🤜|381
+🤜🏻|382
+🤜🏼|383
+🤜🏽|384
+🤜🏾|385
+🤜🏿|386
+👏|387
+👏🏻|388
+👏🏼|389
+👏🏽|390
+👏🏾|391
+👏🏿|392
+🙌|393
+🙌🏻|394
+🙌🏼|395
+🙌🏽|396
+🙌🏾|397
+🙌🏿|398
+🫶|399
+🫶🏻|400
+🫶🏼|401
+🫶🏽|402
+🫶🏾|403
+🫶🏿|404
+👐|405
+👐🏻|406
+👐🏼|407
+👐🏽|408
+👐🏾|409
+👐🏿|410
+🤲|411
+🤲🏻|412
+🤲🏼|413
+🤲🏽|414
+🤲🏾|415
+🤲🏿|416
+🤝|417
+🤝🏻|418
+🤝🏼|419
+🤝🏽|420
+🤝🏾|421
+🤝🏿|422
+🙏|443
+🙏🏻|444
+🙏🏼|445
+🙏🏽|446
+🙏🏾|447
+🙏🏿|448
+✍️|450
+✍🏻|451
+✍🏼|452
+✍🏽|453
+✍🏾|454
+✍🏿|455
+💅|456
+💅🏻|457
+💅🏼|458
+💅🏽|459
+💅🏾|460
+💅🏿|461
+🤳|462
+🤳🏻|463
+🤳🏼|464
+🤳🏽|465
+🤳🏾|466
+🤳🏿|467
+💪|468
+💪🏻|469
+💪🏼|470
+💪🏽|471
+💪🏾|472
+💪🏿|473
+🦾|474
+🦿|475
+🦵|476
+🦵🏻|477
+🦵🏼|478
+🦵🏽|479
+🦵🏾|480
+🦵🏿|481
+🦶|482
+🦶🏻|483
+🦶🏼|484
+🦶🏽|485
+🦶🏾|486
+🦶🏿|487
+👂|488
+👂🏻|489
+👂🏼|490
+👂🏽|491
+👂🏾|492
+👂🏿|493
+🦻|494
+🦻🏻|495
+🦻🏼|496
+🦻🏽|497
+🦻🏾|498
+🦻🏿|499
+👃|500
+👃🏻|501
+👃🏼|502
+👃🏽|503
+👃🏾|504
+👃🏿|505
+🧠|506
+🫀|507
+🫁|508
+🦷|509
+🦴|510
+👀|511
+👁️|513
+👅|514
+👄|515
+🫦|516
+👶|517
+👶🏻|518
+👶🏼|519
+👶🏽|520
+👶🏾|521
+👶🏿|522
+🧒|523
+🧒🏻|524
+🧒🏼|525
+🧒🏽|526
+🧒🏾|527
+🧒🏿|528
+👦|529
+👦🏻|530
+👦🏼|531
+👦🏽|532
+👦🏾|533
+👦🏿|534
+👧|535
+👧🏻|536
+👧🏼|537
+👧🏽|538
+👧🏾|539
+👧🏿|540
+🧑|541
+🧑🏻|542
+🧑🏼|543
+🧑🏽|544
+🧑🏾|545
+🧑🏿|546
+👱|547
+👱🏻|548
+👱🏼|549
+👱🏽|550
+👱🏾|551
+👱🏿|552
+👨|553
+👨🏻|554
+👨🏼|555
+👨🏽|556
+👨🏾|557
+👨🏿|558
+🧔|559
+🧔🏻|560
+🧔🏼|561
+🧔🏽|562
+🧔🏾|563
+🧔🏿|564
+🧔‍♂️|565
+🧔🏻‍♂️|567
+🧔🏼‍♂️|569
+🧔🏽‍♂️|571
+🧔🏾‍♂️|573
+🧔🏿‍♂️|575
+🧔‍♀️|577
+🧔🏻‍♀️|579
+🧔🏼‍♀️|581
+🧔🏽‍♀️|583
+🧔🏾‍♀️|585
+🧔🏿‍♀️|587
+👨‍🦰|589
+👨🏻‍🦰|590
+👨🏼‍🦰|591
+👨🏽‍🦰|592
+👨🏾‍🦰|593
+👨🏿‍🦰|594
+👨‍🦱|595
+👨🏻‍🦱|596
+👨🏼‍🦱|597
+👨🏽‍🦱|598
+👨🏾‍🦱|599
+👨🏿‍🦱|600
+👨‍🦳|601
+👨🏻‍🦳|602
+👨🏼‍🦳|603
+👨🏽‍🦳|604
+👨🏾‍🦳|605
+👨🏿‍🦳|606
+👨‍🦲|607
+👨🏻‍🦲|608
+👨🏼‍🦲|609
+👨🏽‍🦲|610
+👨🏾‍🦲|611
+👨🏿‍🦲|612
+👩|613
+👩🏻|614
+👩🏼|615
+👩🏽|616
+👩🏾|617
+👩🏿|618
+👩‍🦰|619
+👩🏻‍🦰|620
+👩🏼‍🦰|621
+👩🏽‍🦰|622
+👩🏾‍🦰|623
+👩🏿‍🦰|624
+🧑‍🦰|625
+🧑🏻‍🦰|626
+🧑🏼‍🦰|627
+🧑🏽‍🦰|628
+🧑🏾‍🦰|629
+🧑🏿‍🦰|630
+👩‍🦱|631
+👩🏻‍🦱|632
+👩🏼‍🦱|633
+👩🏽‍🦱|634
+👩🏾‍🦱|635
+👩🏿‍🦱|636
+🧑‍🦱|637
+🧑🏻‍🦱|638
+🧑🏼‍🦱|639
+🧑🏽‍🦱|640
+🧑🏾‍🦱|641
+🧑🏿‍🦱|642
+👩‍🦳|643
+👩🏻‍🦳|644
+👩🏼‍🦳|645
+👩🏽‍🦳|646
+👩🏾‍🦳|647
+👩🏿‍🦳|648
+🧑‍🦳|649
+🧑🏻‍🦳|650
+🧑🏼‍🦳|651
+🧑🏽‍🦳|652
+🧑🏾‍🦳|653
+🧑🏿‍🦳|654
+👩‍🦲|655
+👩🏻‍🦲|656
+👩🏼‍🦲|657
+👩🏽‍🦲|658
+👩🏾‍🦲|659
+👩🏿‍🦲|660
+🧑‍🦲|661
+🧑🏻‍🦲|662
+🧑🏼‍🦲|663
+🧑🏽‍🦲|664
+🧑🏾‍🦲|665
+🧑🏿‍🦲|666
+👱‍♀️|667
+👱🏻‍♀️|669
+👱🏼‍♀️|671
+👱🏽‍♀️|673
+👱🏾‍♀️|675
+👱🏿‍♀️|677
+👱‍♂️|679
+👱🏻‍♂️|681
+👱🏼‍♂️|683
+👱🏽‍♂️|685
+👱🏾‍♂️|687
+👱🏿‍♂️|689
+🧓|691
+🧓🏻|692
+🧓🏼|693
+🧓🏽|694
+🧓🏾|695
+🧓🏿|696
+👴|697
+👴🏻|698
+👴🏼|699
+👴🏽|700
+👴🏾|701
+👴🏿|702
+👵|703
+👵🏻|704
+👵🏼|705
+👵🏽|706
+👵🏾|707
+👵🏿|708
+🙍|709
+🙍🏻|710
+🙍🏼|711
+🙍🏽|712
+🙍🏾|713
+🙍🏿|714
+🙍‍♂️|715
+🙍🏻‍♂️|717
+🙍🏼‍♂️|719
+🙍🏽‍♂️|721
+🙍🏾‍♂️|723
+🙍🏿‍♂️|725
+🙍‍♀️|727
+🙍🏻‍♀️|729
+🙍🏼‍♀️|731
+🙍🏽‍♀️|733
+🙍🏾‍♀️|735
+🙍🏿‍♀️|737
+🙎|739
+🙎🏻|740
+🙎🏼|741
+🙎🏽|742
+🙎🏾|743
+🙎🏿|744
+🙎‍♂️|745
+🙎🏻‍♂️|747
+🙎🏼‍♂️|749
+🙎🏽‍♂️|751
+🙎🏾‍♂️|753
+🙎🏿‍♂️|755
+🙎‍♀️|757
+🙎🏻‍♀️|759
+🙎🏼‍♀️|761
+🙎🏽‍♀️|763
+🙎🏾‍♀️|765
+🙎🏿‍♀️|767
+🙅|769
+🙅🏻|770
+🙅🏼|771
+🙅🏽|772
+🙅🏾|773
+🙅🏿|774
+🙅‍♂️|775
+🙅🏻‍♂️|777
+🙅🏼‍♂️|779
+🙅🏽‍♂️|781
+🙅🏾‍♂️|783
+🙅🏿‍♂️|785
+🙅‍♀️|787
+🙅🏻‍♀️|789
+🙅🏼‍♀️|791
+🙅🏽‍♀️|793
+🙅🏾‍♀️|795
+🙅🏿‍♀️|797
+🙆|799
+🙆🏻|800
+🙆🏼|801
+🙆🏽|802
+🙆🏾|803
+🙆🏿|804
+🙆‍♂️|805
+🙆🏻‍♂️|807
+🙆🏼‍♂️|809
+🙆🏽‍♂️|811
+🙆🏾‍♂️|813
+🙆🏿‍♂️|815
+🙆‍♀️|817
+🙆🏻‍♀️|819
+🙆🏼‍♀️|821
+🙆🏽‍♀️|823
+🙆🏾‍♀️|825
+🙆🏿‍♀️|827
+💁|829
+💁🏻|830
+💁🏼|831
+💁🏽|832
+💁🏾|833
+💁🏿|834
+💁‍♂️|835
+💁🏻‍♂️|837
+💁🏼‍♂️|839
+💁🏽‍♂️|841
+💁🏾‍♂️|843
+💁🏿‍♂️|845
+💁‍♀️|847
+💁🏻‍♀️|849
+💁🏼‍♀️|851
+💁🏽‍♀️|853
+💁🏾‍♀️|855
+💁🏿‍♀️|857
+🙋|859
+🙋🏻|860
+🙋🏼|861
+🙋🏽|862
+🙋🏾|863
+🙋🏿|864
+🙋‍♂️|865
+🙋🏻‍♂️|867
+🙋🏼‍♂️|869
+🙋🏽‍♂️|871
+🙋🏾‍♂️|873
+🙋🏿‍♂️|875
+🙋‍♀️|877
+🙋🏻‍♀️|879
+🙋🏼‍♀️|881
+🙋🏽‍♀️|883
+🙋🏾‍♀️|885
+🙋🏿‍♀️|887
+🧏|889
+🧏🏻|890
+🧏🏼|891
+🧏🏽|892
+🧏🏾|893
+🧏🏿|894
+🧏‍♂️|895
+🧏🏻‍♂️|897
+🧏🏼‍♂️|899
+🧏🏽‍♂️|901
+🧏🏾‍♂️|903
+🧏🏿‍♂️|905
+🧏‍♀️|907
+🧏🏻‍♀️|909
+🧏🏼‍♀️|911
+🧏🏽‍♀️|913
+🧏🏾‍♀️|915
+🧏🏿‍♀️|917
+🙇|919
+🙇🏻|920
+🙇🏼|921
+🙇🏽|922
+🙇🏾|923
+🙇🏿|924
+🙇‍♂️|925
+🙇🏻‍♂️|927
+🙇🏼‍♂️|929
+🙇🏽‍♂️|931
+🙇🏾‍♂️|933
+🙇🏿‍♂️|935
+🙇‍♀️|937
+🙇🏻‍♀️|939
+🙇🏼‍♀️|941
+🙇🏽‍♀️|943
+🙇🏾‍♀️|945
+🙇🏿‍♀️|947
+🤦|949
+🤦🏻|950
+🤦🏼|951
+🤦🏽|952
+🤦🏾|953
+🤦🏿|954
+🤦‍♂️|955
+🤦🏻‍♂️|957
+🤦🏼‍♂️|959
+🤦🏽‍♂️|961
+🤦🏾‍♂️|963
+🤦🏿‍♂️|965
+🤦‍♀️|967
+🤦🏻‍♀️|969
+🤦🏼‍♀️|971
+🤦🏽‍♀️|973
+🤦🏾‍♀️|975
+🤦🏿‍♀️|977
+🤷|979
+🤷🏻|980
+🤷🏼|981
+🤷🏽|982
+🤷🏾|983
+🤷🏿|984
+🤷‍♂️|985
+🤷🏻‍♂️|987
+🤷🏼‍♂️|989
+🤷🏽‍♂️|991
+🤷🏾‍♂️|993
+🤷🏿‍♂️|995
+🤷‍♀️|997
+🤷🏻‍♀️|999
+🤷🏼‍♀️|1001
+🤷🏽‍♀️|1003
+🤷🏾‍♀️|1005
+🤷🏿‍♀️|1007
+🧑‍⚕️|1009
+🧑🏻‍⚕️|1011
+🧑🏼‍⚕️|1013
+🧑🏽‍⚕️|1015
+🧑🏾‍⚕️|1017
+🧑🏿‍⚕️|1019
+👨‍⚕️|1021
+👨🏻‍⚕️|1023
+👨🏼‍⚕️|1025
+👨🏽‍⚕️|1027
+👨🏾‍⚕️|1029
+👨🏿‍⚕️|1031
+👩‍⚕️|1033
+👩🏻‍⚕️|1035
+👩🏼‍⚕️|1037
+👩🏽‍⚕️|1039
+👩🏾‍⚕️|1041
+👩🏿‍⚕️|1043
+🧑‍🎓|1045
+🧑🏻‍🎓|1046
+🧑🏼‍🎓|1047
+🧑🏽‍🎓|1048
+🧑🏾‍🎓|1049
+🧑🏿‍🎓|1050
+👨‍🎓|1051
+👨🏻‍🎓|1052
+👨🏼‍🎓|1053
+👨🏽‍🎓|1054
+👨🏾‍🎓|1055
+👨🏿‍🎓|1056
+👩‍🎓|1057
+👩🏻‍🎓|1058
+👩🏼‍🎓|1059
+👩🏽‍🎓|1060
+👩🏾‍🎓|1061
+👩🏿‍🎓|1062
+🧑‍🏫|1063
+🧑🏻‍🏫|1064
+🧑🏼‍🏫|1065
+🧑🏽‍🏫|1066
+🧑🏾‍🏫|1067
+🧑🏿‍🏫|1068
+👨‍🏫|1069
+👨🏻‍🏫|1070
+👨🏼‍🏫|1071
+👨🏽‍🏫|1072
+👨🏾‍🏫|1073
+👨🏿‍🏫|1074
+👩‍🏫|1075
+👩🏻‍🏫|1076
+👩🏼‍🏫|1077
+👩🏽‍🏫|1078
+👩🏾‍🏫|1079
+👩🏿‍🏫|1080
+🧑‍⚖️|1081
+🧑🏻‍⚖️|1083
+🧑🏼‍⚖️|1085
+🧑🏽‍⚖️|1087
+🧑🏾‍⚖️|1089
+🧑🏿‍⚖️|1091
+👨‍⚖️|1093
+👨🏻‍⚖️|1095
+👨🏼‍⚖️|1097
+👨🏽‍⚖️|1099
+👨🏾‍⚖️|1101
+👨🏿‍⚖️|1103
+👩‍⚖️|1105
+👩🏻‍⚖️|1107
+👩🏼‍⚖️|1109
+👩🏽‍⚖️|1111
+👩🏾‍⚖️|1113
+👩🏿‍⚖️|1115
+🧑‍🌾|1117
+🧑🏻‍🌾|1118
+🧑🏼‍🌾|1119
+🧑🏽‍🌾|1120
+🧑🏾‍🌾|1121
+🧑🏿‍🌾|1122
+👨‍🌾|1123
+👨🏻‍🌾|1124
+👨🏼‍🌾|1125
+👨🏽‍🌾|1126
+👨🏾‍🌾|1127
+👨🏿‍🌾|1128
+👩‍🌾|1129
+👩🏻‍🌾|1130
+👩🏼‍🌾|1131
+👩🏽‍🌾|1132
+👩🏾‍🌾|1133
+👩🏿‍🌾|1134
+🧑‍🍳|1135
+🧑🏻‍🍳|1136
+🧑🏼‍🍳|1137
+🧑🏽‍🍳|1138
+🧑🏾‍🍳|1139
+🧑🏿‍🍳|1140
+👨‍🍳|1141
+👨🏻‍🍳|1142
+👨🏼‍🍳|1143
+👨🏽‍🍳|1144
+👨🏾‍🍳|1145
+👨🏿‍🍳|1146
+👩‍🍳|1147
+👩🏻‍🍳|1148
+👩🏼‍🍳|1149
+👩🏽‍🍳|1150
+👩🏾‍🍳|1151
+👩🏿‍🍳|1152
+🧑‍🔧|1153
+🧑🏻‍🔧|1154
+🧑🏼‍🔧|1155
+🧑🏽‍🔧|1156
+🧑🏾‍🔧|1157
+🧑🏿‍🔧|1158
+👨‍🔧|1159
+👨🏻‍🔧|1160
+👨🏼‍🔧|1161
+👨🏽‍🔧|1162
+👨🏾‍🔧|1163
+👨🏿‍🔧|1164
+👩‍🔧|1165
+👩🏻‍🔧|1166
+👩🏼‍🔧|1167
+👩🏽‍🔧|1168
+👩🏾‍🔧|1169
+👩🏿‍🔧|1170
+🧑‍🏭|1171
+🧑🏻‍🏭|1172
+🧑🏼‍🏭|1173
+🧑🏽‍🏭|1174
+🧑🏾‍🏭|1175
+🧑🏿‍🏭|1176
+👨‍🏭|1177
+👨🏻‍🏭|1178
+👨🏼‍🏭|1179
+👨🏽‍🏭|1180
+👨🏾‍🏭|1181
+👨🏿‍🏭|1182
+👩‍🏭|1183
+👩🏻‍🏭|1184
+👩🏼‍🏭|1185
+👩🏽‍🏭|1186
+👩🏾‍🏭|1187
+👩🏿‍🏭|1188
+🧑‍💼|1189
+🧑🏻‍💼|1190
+🧑🏼‍💼|1191
+🧑🏽‍💼|1192
+🧑🏾‍💼|1193
+🧑🏿‍💼|1194
+👨‍💼|1195
+👨🏻‍💼|1196
+👨🏼‍💼|1197
+👨🏽‍💼|1198
+👨🏾‍💼|1199
+👨🏿‍💼|1200
+👩‍💼|1201
+👩🏻‍💼|1202
+👩🏼‍💼|1203
+👩🏽‍💼|1204
+👩🏾‍💼|1205
+👩🏿‍💼|1206
+🧑‍🔬|1207
+🧑🏻‍🔬|1208
+🧑🏼‍🔬|1209
+🧑🏽‍🔬|1210
+🧑🏾‍🔬|1211
+🧑🏿‍🔬|1212
+👨‍🔬|1213
+👨🏻‍🔬|1214
+👨🏼‍🔬|1215
+👨🏽‍🔬|1216
+👨🏾‍🔬|1217
+👨🏿‍🔬|1218
+👩‍🔬|1219
+👩🏻‍🔬|1220
+👩🏼‍🔬|1221
+👩🏽‍🔬|1222
+👩🏾‍🔬|1223
+👩🏿‍🔬|1224
+🧑‍💻|1225
+🧑🏻‍💻|1226
+🧑🏼‍💻|1227
+🧑🏽‍💻|1228
+🧑🏾‍💻|1229
+🧑🏿‍💻|1230
+👨‍💻|1231
+👨🏻‍💻|1232
+👨🏼‍💻|1233
+👨🏽‍💻|1234
+👨🏾‍💻|1235
+👨🏿‍💻|1236
+👩‍💻|1237
+👩🏻‍💻|1238
+👩🏼‍💻|1239
+👩🏽‍💻|1240
+👩🏾‍💻|1241
+👩🏿‍💻|1242
+🧑‍🎤|1243
+🧑🏻‍🎤|1244
+🧑🏼‍🎤|1245
+🧑🏽‍🎤|1246
+🧑🏾‍🎤|1247
+🧑🏿‍🎤|1248
+👨‍🎤|1249
+👨🏻‍🎤|1250
+👨🏼‍🎤|1251
+👨🏽‍🎤|1252
+👨🏾‍🎤|1253
+👨🏿‍🎤|1254
+👩‍🎤|1255
+👩🏻‍🎤|1256
+👩🏼‍🎤|1257
+👩🏽‍🎤|1258
+👩🏾‍🎤|1259
+👩🏿‍🎤|1260
+🧑‍🎨|1261
+🧑🏻‍🎨|1262
+🧑🏼‍🎨|1263
+🧑🏽‍🎨|1264
+🧑🏾‍🎨|1265
+🧑🏿‍🎨|1266
+👨‍🎨|1267
+👨🏻‍🎨|1268
+👨🏼‍🎨|1269
+👨🏽‍🎨|1270
+👨🏾‍🎨|1271
+👨🏿‍🎨|1272
+👩‍🎨|1273
+👩🏻‍🎨|1274
+👩🏼‍🎨|1275
+👩🏽‍🎨|1276
+👩🏾‍🎨|1277
+👩🏿‍🎨|1278
+🧑‍✈️|1279
+🧑🏻‍✈️|1281
+🧑🏼‍✈️|1283
+🧑🏽‍✈️|1285
+🧑🏾‍✈️|1287
+🧑🏿‍✈️|1289
+👨‍✈️|1291
+👨🏻‍✈️|1293
+👨🏼‍✈️|1295
+👨🏽‍✈️|1297
+👨🏾‍✈️|1299
+👨🏿‍✈️|1301
+👩‍✈️|1303
+👩🏻‍✈️|1305
+👩🏼‍✈️|1307
+👩🏽‍✈️|1309
+👩🏾‍✈️|1311
+👩🏿‍✈️|1313
+🧑‍🚀|1315
+🧑🏻‍🚀|1316
+🧑🏼‍🚀|1317
+🧑🏽‍🚀|1318
+🧑🏾‍🚀|1319
+🧑🏿‍🚀|1320
+👨‍🚀|1321
+👨🏻‍🚀|1322
+👨🏼‍🚀|1323
+👨🏽‍🚀|1324
+👨🏾‍🚀|1325
+👨🏿‍🚀|1326
+👩‍🚀|1327
+👩🏻‍🚀|1328
+👩🏼‍🚀|1329
+👩🏽‍🚀|1330
+👩🏾‍🚀|1331
+👩🏿‍🚀|1332
+🧑‍🚒|1333
+🧑🏻‍🚒|1334
+🧑🏼‍🚒|1335
+🧑🏽‍🚒|1336
+🧑🏾‍🚒|1337
+🧑🏿‍🚒|1338
+👨‍🚒|1339
+👨🏻‍🚒|1340
+👨🏼‍🚒|1341
+👨🏽‍🚒|1342
+👨🏾‍🚒|1343
+👨🏿‍🚒|1344
+👩‍🚒|1345
+👩🏻‍🚒|1346
+👩🏼‍🚒|1347
+👩🏽‍🚒|1348
+👩🏾‍🚒|1349
+👩🏿‍🚒|1350
+👮|1351
+👮🏻|1352
+👮🏼|1353
+👮🏽|1354
+👮🏾|1355
+👮🏿|1356
+👮‍♂️|1357
+👮🏻‍♂️|1359
+👮🏼‍♂️|1361
+👮🏽‍♂️|1363
+👮🏾‍♂️|1365
+👮🏿‍♂️|1367
+👮‍♀️|1369
+👮🏻‍♀️|1371
+👮🏼‍♀️|1373
+👮🏽‍♀️|1375
+👮🏾‍♀️|1377
+👮🏿‍♀️|1379
+🕵️|1382
+🕵🏻|1383
+🕵🏼|1384
+🕵🏽|1385
+🕵🏾|1386
+🕵🏿|1387
+🕵️‍♂️|1388
+🕵🏻‍♂️|1392
+🕵🏼‍♂️|1394
+🕵🏽‍♂️|1396
+🕵🏾‍♂️|1398
+🕵🏿‍♂️|1400
+🕵️‍♀️|1402
+🕵🏻‍♀️|1406
+🕵🏼‍♀️|1408
+🕵🏽‍♀️|1410
+🕵🏾‍♀️|1412
+🕵🏿‍♀️|1414
+💂|1416
+💂🏻|1417
+💂🏼|1418
+💂🏽|1419
+💂🏾|1420
+💂🏿|1421
+💂‍♂️|1422
+💂🏻‍♂️|1424
+💂🏼‍♂️|1426
+💂🏽‍♂️|1428
+💂🏾‍♂️|1430
+💂🏿‍♂️|1432
+💂‍♀️|1434
+💂🏻‍♀️|1436
+💂🏼‍♀️|1438
+💂🏽‍♀️|1440
+💂🏾‍♀️|1442
+💂🏿‍♀️|1444
+🥷|1446
+🥷🏻|1447
+🥷🏼|1448
+🥷🏽|1449
+🥷🏾|1450
+🥷🏿|1451
+👷|1452
+👷🏻|1453
+👷🏼|1454
+👷🏽|1455
+👷🏾|1456
+👷🏿|1457
+👷‍♂️|1458
+👷🏻‍♂️|1460
+👷🏼‍♂️|1462
+👷🏽‍♂️|1464
+👷🏾‍♂️|1466
+👷🏿‍♂️|1468
+👷‍♀️|1470
+👷🏻‍♀️|1472
+👷🏼‍♀️|1474
+👷🏽‍♀️|1476
+👷🏾‍♀️|1478
+👷🏿‍♀️|1480
+🫅|1482
+🫅🏻|1483
+🫅🏼|1484
+🫅🏽|1485
+🫅🏾|1486
+🫅🏿|1487
+🤴|1488
+🤴🏻|1489
+🤴🏼|1490
+🤴🏽|1491
+🤴🏾|1492
+🤴🏿|1493
+👸|1494
+👸🏻|1495
+👸🏼|1496
+👸🏽|1497
+👸🏾|1498
+👸🏿|1499
+👳|1500
+👳🏻|1501
+👳🏼|1502
+👳🏽|1503
+👳🏾|1504
+👳🏿|1505
+👳‍♂️|1506
+👳🏻‍♂️|1508
+👳🏼‍♂️|1510
+👳🏽‍♂️|1512
+👳🏾‍♂️|1514
+👳🏿‍♂️|1516
+👳‍♀️|1518
+👳🏻‍♀️|1520
+👳🏼‍♀️|1522
+👳🏽‍♀️|1524
+👳🏾‍♀️|1526
+👳🏿‍♀️|1528
+👲|1530
+👲🏻|1531
+👲🏼|1532
+👲🏽|1533
+👲🏾|1534
+👲🏿|1535
+🧕|1536
+🧕🏻|1537
+🧕🏼|1538
+🧕🏽|1539
+🧕🏾|1540
+🧕🏿|1541
+🤵|1542
+🤵🏻|1543
+🤵🏼|1544
+🤵🏽|1545
+🤵🏾|1546
+🤵🏿|1547
+🤵‍♂️|1548
+🤵🏻‍♂️|1550
+🤵🏼‍♂️|1552
+🤵🏽‍♂️|1554
+🤵🏾‍♂️|1556
+🤵🏿‍♂️|1558
+🤵‍♀️|1560
+🤵🏻‍♀️|1562
+🤵🏼‍♀️|1564
+🤵🏽‍♀️|1566
+🤵🏾‍♀️|1568
+🤵🏿‍♀️|1570
+👰|1572
+👰🏻|1573
+👰🏼|1574
+👰🏽|1575
+👰🏾|1576
+👰🏿|1577
+👰‍♂️|1578
+👰🏻‍♂️|1580
+👰🏼‍♂️|1582
+👰🏽‍♂️|1584
+👰🏾‍♂️|1586
+👰🏿‍♂️|1588
+👰‍♀️|1590
+👰🏻‍♀️|1592
+👰🏼‍♀️|1594
+👰🏽‍♀️|1596
+👰🏾‍♀️|1598
+👰🏿‍♀️|1600
+🤰|1602
+🤰🏻|1603
+🤰🏼|1604
+🤰🏽|1605
+🤰🏾|1606
+🤰🏿|1607
+🫃|1608
+🫃🏻|1609
+🫃🏼|1610
+🫃🏽|1611
+🫃🏾|1612
+🫃🏿|1613
+🫄|1614
+🫄🏻|1615
+🫄🏼|1616
+🫄🏽|1617
+🫄🏾|1618
+🫄🏿|1619
+🤱|1620
+🤱🏻|1621
+🤱🏼|1622
+🤱🏽|1623
+🤱🏾|1624
+🤱🏿|1625
+👩‍🍼|1626
+👩🏻‍🍼|1627
+👩🏼‍🍼|1628
+👩🏽‍🍼|1629
+👩🏾‍🍼|1630
+👩🏿‍🍼|1631
+👨‍🍼|1632
+👨🏻‍🍼|1633
+👨🏼‍🍼|1634
+👨🏽‍🍼|1635
+👨🏾‍🍼|1636
+👨🏿‍🍼|1637
+🧑‍🍼|1638
+🧑🏻‍🍼|1639
+🧑🏼‍🍼|1640
+🧑🏽‍🍼|1641
+🧑🏾‍🍼|1642
+🧑🏿‍🍼|1643
+👼|1644
+👼🏻|1645
+👼🏼|1646
+👼🏽|1647
+👼🏾|1648
+👼🏿|1649
+🎅|1650
+🎅🏻|1651
+🎅🏼|1652
+🎅🏽|1653
+🎅🏾|1654
+🎅🏿|1655
+🤶|1656
+🤶🏻|1657
+🤶🏼|1658
+🤶🏽|1659
+🤶🏾|1660
+🤶🏿|1661
+🧑‍🎄|1662
+🧑🏻‍🎄|1663
+🧑🏼‍🎄|1664
+🧑🏽‍🎄|1665
+🧑🏾‍🎄|1666
+🧑🏿‍🎄|1667
+🦸|1668
+🦸🏻|1669
+🦸🏼|1670
+🦸🏽|1671
+🦸🏾|1672
+🦸🏿|1673
+🦸‍♂️|1674
+🦸🏻‍♂️|1676
+🦸🏼‍♂️|1678
+🦸🏽‍♂️|1680
+🦸🏾‍♂️|1682
+🦸🏿‍♂️|1684
+🦸‍♀️|1686
+🦸🏻‍♀️|1688
+🦸🏼‍♀️|1690
+🦸🏽‍♀️|1692
+🦸🏾‍♀️|1694
+🦸🏿‍♀️|1696
+🦹|1698
+🦹🏻|1699
+🦹🏼|1700
+🦹🏽|1701
+🦹🏾|1702
+🦹🏿|1703
+🦹‍♂️|1704
+🦹🏻‍♂️|1706
+🦹🏼‍♂️|1708
+🦹🏽‍♂️|1710
+🦹🏾‍♂️|1712
+🦹🏿‍♂️|1714
+🦹‍♀️|1716
+🦹🏻‍♀️|1718
+🦹🏼‍♀️|1720
+🦹🏽‍♀️|1722
+🦹🏾‍♀️|1724
+🦹🏿‍♀️|1726
+🧙|1728
+🧙🏻|1729
+🧙🏼|1730
+🧙🏽|1731
+🧙🏾|1732
+🧙🏿|1733
+🧙‍♂️|1734
+🧙🏻‍♂️|1736
+🧙🏼‍♂️|1738
+🧙🏽‍♂️|1740
+🧙🏾‍♂️|1742
+🧙🏿‍♂️|1744
+🧙‍♀️|1746
+🧙🏻‍♀️|1748
+🧙🏼‍♀️|1750
+🧙🏽‍♀️|1752
+🧙🏾‍♀️|1754
+🧙🏿‍♀️|1756
+🧚|1758
+🧚🏻|1759
+🧚🏼|1760
+🧚🏽|1761
+🧚🏾|1762
+🧚🏿|1763
+🧚‍♂️|1764
+🧚🏻‍♂️|1766
+🧚🏼‍♂️|1768
+🧚🏽‍♂️|1770
+🧚🏾‍♂️|1772
+🧚🏿‍♂️|1774
+🧚‍♀️|1776
+🧚🏻‍♀️|1778
+🧚🏼‍♀️|1780
+🧚🏽‍♀️|1782
+🧚🏾‍♀️|1784
+🧚🏿‍♀️|1786
+🧛|1788
+🧛🏻|1789
+🧛🏼|1790
+🧛🏽|1791
+🧛🏾|1792
+🧛🏿|1793
+🧛‍♂️|1794
+🧛🏻‍♂️|1796
+🧛🏼‍♂️|1798
+🧛🏽‍♂️|1800
+🧛🏾‍♂️|1802
+🧛🏿‍♂️|1804
+🧛‍♀️|1806
+🧛🏻‍♀️|1808
+🧛🏼‍♀️|1810
+🧛🏽‍♀️|1812
+🧛🏾‍♀️|1814
+🧛🏿‍♀️|1816
+🧜|1818
+🧜🏻|1819
+🧜🏼|1820
+🧜🏽|1821
+🧜🏾|1822
+🧜🏿|1823
+🧜‍♂️|1824
+🧜🏻‍♂️|1826
+🧜🏼‍♂️|1828
+🧜🏽‍♂️|1830
+🧜🏾‍♂️|1832
+🧜🏿‍♂️|1834
+🧜‍♀️|1836
+🧜🏻‍♀️|1838
+🧜🏼‍♀️|1840
+🧜🏽‍♀️|1842
+🧜🏾‍♀️|1844
+🧜🏿‍♀️|1846
+🧝|1848
+🧝🏻|1849
+🧝🏼|1850
+🧝🏽|1851
+🧝🏾|1852
+🧝🏿|1853
+🧝‍♂️|1854
+🧝🏻‍♂️|1856
+🧝🏼‍♂️|1858
+🧝🏽‍♂️|1860
+🧝🏾‍♂️|1862
+🧝🏿‍♂️|1864
+🧝‍♀️|1866
+🧝🏻‍♀️|1868
+🧝🏼‍♀️|1870
+🧝🏽‍♀️|1872
+🧝🏾‍♀️|1874
+🧝🏿‍♀️|1876
+🧞|1878
+🧞‍♂️|1879
+🧞‍♀️|1881
+🧟|1883
+🧟‍♂️|1884
+🧟‍♀️|1886
+🧌|1888
+💆|1889
+💆🏻|1890
+💆🏼|1891
+💆🏽|1892
+💆🏾|1893
+💆🏿|1894
+💆‍♂️|1895
+💆🏻‍♂️|1897
+💆🏼‍♂️|1899
+💆🏽‍♂️|1901
+💆🏾‍♂️|1903
+💆🏿‍♂️|1905
+💆‍♀️|1907
+💆🏻‍♀️|1909
+💆🏼‍♀️|1911
+💆🏽‍♀️|1913
+💆🏾‍♀️|1915
+💆🏿‍♀️|1917
+💇|1919
+💇🏻|1920
+💇🏼|1921
+💇🏽|1922
+💇🏾|1923
+💇🏿|1924
+💇‍♂️|1925
+💇🏻‍♂️|1927
+💇🏼‍♂️|1929
+💇🏽‍♂️|1931
+💇🏾‍♂️|1933
+💇🏿‍♂️|1935
+💇‍♀️|1937
+💇🏻‍♀️|1939
+💇🏼‍♀️|1941
+💇🏽‍♀️|1943
+💇🏾‍♀️|1945
+💇🏿‍♀️|1947
+🚶|1949
+🚶🏻|1950
+🚶🏼|1951
+🚶🏽|1952
+🚶🏾|1953
+🚶🏿|1954
+🚶‍♂️|1955
+🚶🏻‍♂️|1957
+🚶🏼‍♂️|1959
+🚶🏽‍♂️|1961
+🚶🏾‍♂️|1963
+🚶🏿‍♂️|1965
+🚶‍♀️|1967
+🚶🏻‍♀️|1969
+🚶🏼‍♀️|1971
+🚶🏽‍♀️|1973
+🚶🏾‍♀️|1975
+🚶🏿‍♀️|1977
+🚶‍➡️|1979
+🚶🏻‍➡️|1981
+🚶🏼‍➡️|1983
+🚶🏽‍➡️|1985
+🚶🏾‍➡️|1987
+🚶🏿‍➡️|1989
+🚶‍♀️‍➡️|1991
+🚶🏻‍♀️‍➡️|1995
+🚶🏼‍♀️‍➡️|1999
+🚶🏽‍♀️‍➡️|2003
+🚶🏾‍♀️‍➡️|2007
+🚶🏿‍♀️‍➡️|2011
+🚶‍♂️‍➡️|2015
+🚶🏻‍♂️‍➡️|2019
+🚶🏼‍♂️‍➡️|2023
+🚶🏽‍♂️‍➡️|2027
+🚶🏾‍♂️‍➡️|2031
+🚶🏿‍♂️‍➡️|2035
+🧍|2039
+🧍🏻|2040
+🧍🏼|2041
+🧍🏽|2042
+🧍🏾|2043
+🧍🏿|2044
+🧍‍♂️|2045
+🧍🏻‍♂️|2047
+🧍🏼‍♂️|2049
+🧍🏽‍♂️|2051
+🧍🏾‍♂️|2053
+🧍🏿‍♂️|2055
+🧍‍♀️|2057
+🧍🏻‍♀️|2059
+🧍🏼‍♀️|2061
+🧍🏽‍♀️|2063
+🧍🏾‍♀️|2065
+🧍🏿‍♀️|2067
+🧎|2069
+🧎🏻|2070
+🧎🏼|2071
+🧎🏽|2072
+🧎🏾|2073
+🧎🏿|2074
+🧎‍♂️|2075
+🧎🏻‍♂️|2077
+🧎🏼‍♂️|2079
+🧎🏽‍♂️|2081
+🧎🏾‍♂️|2083
+🧎🏿‍♂️|2085
+🧎‍♀️|2087
+🧎🏻‍♀️|2089
+🧎🏼‍♀️|2091
+🧎🏽‍♀️|2093
+🧎🏾‍♀️|2095
+🧎🏿‍♀️|2097
+🧎‍➡️|2099
+🧎🏻‍➡️|2101
+🧎🏼‍➡️|2103
+🧎🏽‍➡️|2105
+🧎🏾‍➡️|2107
+🧎🏿‍➡️|2109
+🧎‍♀️‍➡️|2111
+🧎🏻‍♀️‍➡️|2115
+🧎🏼‍♀️‍➡️|2119
+🧎🏽‍♀️‍➡️|2123
+🧎🏾‍♀️‍➡️|2127
+🧎🏿‍♀️‍➡️|2131
+🧎‍♂️‍➡️|2135
+🧎🏻‍♂️‍➡️|2139
+🧎🏼‍♂️‍➡️|2143
+🧎🏽‍♂️‍➡️|2147
+🧎🏾‍♂️‍➡️|2151
+🧎🏿‍♂️‍➡️|2155
+🧑‍🦯|2159
+🧑🏻‍🦯|2160
+🧑🏼‍🦯|2161
+🧑🏽‍🦯|2162
+🧑🏾‍🦯|2163
+🧑🏿‍🦯|2164
+🧑‍🦯‍➡️|2165
+🧑🏻‍🦯‍➡️|2167
+🧑🏼‍🦯‍➡️|2169
+🧑🏽‍🦯‍➡️|2171
+🧑🏾‍🦯‍➡️|2173
+🧑🏿‍🦯‍➡️|2175
+👨‍🦯|2177
+👨🏻‍🦯|2178
+👨🏼‍🦯|2179
+👨🏽‍🦯|2180
+👨🏾‍🦯|2181
+👨🏿‍🦯|2182
+👨‍🦯‍➡️|2183
+👨🏻‍🦯‍➡️|2185
+👨🏼‍🦯‍➡️|2187
+👨🏽‍🦯‍➡️|2189
+👨🏾‍🦯‍➡️|2191
+👨🏿‍🦯‍➡️|2193
+👩‍🦯|2195
+👩🏻‍🦯|2196
+👩🏼‍🦯|2197
+👩🏽‍🦯|2198
+👩🏾‍🦯|2199
+👩🏿‍🦯|2200
+👩‍🦯‍➡️|2201
+👩🏻‍🦯‍➡️|2203
+👩🏼‍🦯‍➡️|2205
+👩🏽‍🦯‍➡️|2207
+👩🏾‍🦯‍➡️|2209
+👩🏿‍🦯‍➡️|2211
+🧑‍🦼|2213
+🧑🏻‍🦼|2214
+🧑🏼‍🦼|2215
+🧑🏽‍🦼|2216
+🧑🏾‍🦼|2217
+🧑🏿‍🦼|2218
+🧑‍🦼‍➡️|2219
+🧑🏻‍🦼‍➡️|2221
+🧑🏼‍🦼‍➡️|2223
+🧑🏽‍🦼‍➡️|2225
+🧑🏾‍🦼‍➡️|2227
+🧑🏿‍🦼‍➡️|2229
+👨‍🦼|2231
+👨🏻‍🦼|2232
+👨🏼‍🦼|2233
+👨🏽‍🦼|2234
+👨🏾‍🦼|2235
+👨🏿‍🦼|2236
+👨‍🦼‍➡️|2237
+👨🏻‍🦼‍➡️|2239
+👨🏼‍🦼‍➡️|2241
+👨🏽‍🦼‍➡️|2243
+👨🏾‍🦼‍➡️|2245
+👨🏿‍🦼‍➡️|2247
+👩‍🦼|2249
+👩🏻‍🦼|2250
+👩🏼‍🦼|2251
+👩🏽‍🦼|2252
+👩🏾‍🦼|2253
+👩🏿‍🦼|2254
+👩‍🦼‍➡️|2255
+👩🏻‍🦼‍➡️|2257
+👩🏼‍🦼‍➡️|2259
+👩🏽‍🦼‍➡️|2261
+👩🏾‍🦼‍➡️|2263
+👩🏿‍🦼‍➡️|2265
+🧑‍🦽|2267
+🧑🏻‍🦽|2268
+🧑🏼‍🦽|2269
+🧑🏽‍🦽|2270
+🧑🏾‍🦽|2271
+🧑🏿‍🦽|2272
+🧑‍🦽‍➡️|2273
+🧑🏻‍🦽‍➡️|2275
+🧑🏼‍🦽‍➡️|2277
+🧑🏽‍🦽‍➡️|2279
+🧑🏾‍🦽‍➡️|2281
+🧑🏿‍🦽‍➡️|2283
+👨‍🦽|2285
+👨🏻‍🦽|2286
+👨🏼‍🦽|2287
+👨🏽‍🦽|2288
+👨🏾‍🦽|2289
+👨🏿‍🦽|2290
+👨‍🦽‍➡️|2291
+👨🏻‍🦽‍➡️|2293
+👨🏼‍🦽‍➡️|2295
+👨🏽‍🦽‍➡️|2297
+👨🏾‍🦽‍➡️|2299
+👨🏿‍🦽‍➡️|2301
+👩‍🦽|2303
+👩🏻‍🦽|2304
+👩🏼‍🦽|2305
+👩🏽‍🦽|2306
+👩🏾‍🦽|2307
+👩🏿‍🦽|2308
+👩‍🦽‍➡️|2309
+👩🏻‍🦽‍➡️|2311
+👩🏼‍🦽‍➡️|2313
+👩🏽‍🦽‍➡️|2315
+👩🏾‍🦽‍➡️|2317
+👩🏿‍🦽‍➡️|2319
+🏃|2321
+🏃🏻|2322
+🏃🏼|2323
+🏃🏽|2324
+🏃🏾|2325
+🏃🏿|2326
+🏃‍♂️|2327
+🏃🏻‍♂️|2329
+🏃🏼‍♂️|2331
+🏃🏽‍♂️|2333
+🏃🏾‍♂️|2335
+🏃🏿‍♂️|2337
+🏃‍♀️|2339
+🏃🏻‍♀️|2341
+🏃🏼‍♀️|2343
+🏃🏽‍♀️|2345
+🏃🏾‍♀️|2347
+🏃🏿‍♀️|2349
+🏃‍➡️|2351
+🏃🏻‍➡️|2353
+🏃🏼‍➡️|2355
+🏃🏽‍➡️|2357
+🏃🏾‍➡️|2359
+🏃🏿‍➡️|2361
+🏃‍♀️‍➡️|2363
+🏃🏻‍♀️‍➡️|2367
+🏃🏼‍♀️‍➡️|2371
+🏃🏽‍♀️‍➡️|2375
+🏃🏾‍♀️‍➡️|2379
+🏃🏿‍♀️‍➡️|2383
+🏃‍♂️‍➡️|2387
+🏃🏻‍♂️‍➡️|2391
+🏃🏼‍♂️‍➡️|2395
+🏃🏽‍♂️‍➡️|2399
+🏃🏾‍♂️‍➡️|2403
+🏃🏿‍♂️‍➡️|2407
+💃|2411
+💃🏻|2412
+💃🏼|2413
+💃🏽|2414
+💃🏾|2415
+💃🏿|2416
+🕺|2417
+🕺🏻|2418
+🕺🏼|2419
+🕺🏽|2420
+🕺🏾|2421
+🕺🏿|2422
+🕴️|2424
+🕴🏻|2425
+🕴🏼|2426
+🕴🏽|2427
+🕴🏾|2428
+🕴🏿|2429
+👯|2430
+👯‍♂️|2431
+👯‍♀️|2433
+🧖|2435
+🧖🏻|2436
+🧖🏼|2437
+🧖🏽|2438
+🧖🏾|2439
+🧖🏿|2440
+🧖‍♂️|2441
+🧖🏻‍♂️|2443
+🧖🏼‍♂️|2445
+🧖🏽‍♂️|2447
+🧖🏾‍♂️|2449
+🧖🏿‍♂️|2451
+🧖‍♀️|2453
+🧖🏻‍♀️|2455
+🧖🏼‍♀️|2457
+🧖🏽‍♀️|2459
+🧖🏾‍♀️|2461
+🧖🏿‍♀️|2463
+🧗|2465
+🧗🏻|2466
+🧗🏼|2467
+🧗🏽|2468
+🧗🏾|2469
+🧗🏿|2470
+🧗‍♂️|2471
+🧗🏻‍♂️|2473
+🧗🏼‍♂️|2475
+🧗🏽‍♂️|2477
+🧗🏾‍♂️|2479
+🧗🏿‍♂️|2481
+🧗‍♀️|2483
+🧗🏻‍♀️|2485
+🧗🏼‍♀️|2487
+🧗🏽‍♀️|2489
+🧗🏾‍♀️|2491
+🧗🏿‍♀️|2493
+🤺|2495
+🏇|2496
+🏇🏻|2497
+🏇🏼|2498
+🏇🏽|2499
+🏇🏾|2500
+🏇🏿|2501
+⛷️|2503
+🏂|2504
+🏂🏻|2505
+🏂🏼|2506
+🏂🏽|2507
+🏂🏾|2508
+🏂🏿|2509
+🏌️|2511
+🏌🏻|2512
+🏌🏼|2513
+🏌🏽|2514
+🏌🏾|2515
+🏌🏿|2516
+🏌️‍♂️|2517
+🏌🏻‍♂️|2521
+🏌🏼‍♂️|2523
+🏌🏽‍♂️|2525
+🏌🏾‍♂️|2527
+🏌🏿‍♂️|2529
+🏌️‍♀️|2531
+🏌🏻‍♀️|2535
+🏌🏼‍♀️|2537
+🏌🏽‍♀️|2539
+🏌🏾‍♀️|2541
+🏌🏿‍♀️|2543
+🏄|2545
+🏄🏻|2546
+🏄🏼|2547
+🏄🏽|2548
+🏄🏾|2549
+🏄🏿|2550
+🏄‍♂️|2551
+🏄🏻‍♂️|2553
+🏄🏼‍♂️|2555
+🏄🏽‍♂️|2557
+🏄🏾‍♂️|2559
+🏄🏿‍♂️|2561
+🏄‍♀️|2563
+🏄🏻‍♀️|2565
+🏄🏼‍♀️|2567
+🏄🏽‍♀️|2569
+🏄🏾‍♀️|2571
+🏄🏿‍♀️|2573
+🚣|2575
+🚣🏻|2576
+🚣🏼|2577
+🚣🏽|2578
+🚣🏾|2579
+🚣🏿|2580
+🚣‍♂️|2581
+🚣🏻‍♂️|2583
+🚣🏼‍♂️|2585
+🚣🏽‍♂️|2587
+🚣🏾‍♂️|2589
+🚣🏿‍♂️|2591
+🚣‍♀️|2593
+🚣🏻‍♀️|2595
+🚣🏼‍♀️|2597
+🚣🏽‍♀️|2599
+🚣🏾‍♀️|2601
+🚣🏿‍♀️|2603
+🏊|2605
+🏊🏻|2606
+🏊🏼|2607
+🏊🏽|2608
+🏊🏾|2609
+🏊🏿|2610
+🏊‍♂️|2611
+🏊🏻‍♂️|2613
+🏊🏼‍♂️|2615
+🏊🏽‍♂️|2617
+🏊🏾‍♂️|2619
+🏊🏿‍♂️|2621
+🏊‍♀️|2623
+🏊🏻‍♀️|2625
+🏊🏼‍♀️|2627
+🏊🏽‍♀️|2629
+🏊🏾‍♀️|2631
+🏊🏿‍♀️|2633
+⛹️|2636
+⛹🏻|2637
+⛹🏼|2638
+⛹🏽|2639
+⛹🏾|2640
+⛹🏿|2641
+⛹️‍♂️|2642
+⛹🏻‍♂️|2646
+⛹🏼‍♂️|2648
+⛹🏽‍♂️|2650
+⛹🏾‍♂️|2652
+⛹🏿‍♂️|2654
+⛹️‍♀️|2656
+⛹🏻‍♀️|2660
+⛹🏼‍♀️|2662
+⛹🏽‍♀️|2664
+⛹🏾‍♀️|2666
+⛹🏿‍♀️|2668
+🏋️|2671
+🏋🏻|2672
+🏋🏼|2673
+🏋🏽|2674
+🏋🏾|2675
+🏋🏿|2676
+🏋️‍♂️|2677
+🏋🏻‍♂️|2681
+🏋🏼‍♂️|2683
+🏋🏽‍♂️|2685
+🏋🏾‍♂️|2687
+🏋🏿‍♂️|2689
+🏋️‍♀️|2691
+🏋🏻‍♀️|2695
+🏋🏼‍♀️|2697
+🏋🏽‍♀️|2699
+🏋🏾‍♀️|2701
+🏋🏿‍♀️|2703
+🚴|2705
+🚴🏻|2706
+🚴🏼|2707
+🚴🏽|2708
+🚴🏾|2709
+🚴🏿|2710
+🚴‍♂️|2711
+🚴🏻‍♂️|2713
+🚴🏼‍♂️|2715
+🚴🏽‍♂️|2717
+🚴🏾‍♂️|2719
+🚴🏿‍♂️|2721
+🚴‍♀️|2723
+🚴🏻‍♀️|2725
+🚴🏼‍♀️|2727
+🚴🏽‍♀️|2729
+🚴🏾‍♀️|2731
+🚴🏿‍♀️|2733
+🚵|2735
+🚵🏻|2736
+🚵🏼|2737
+🚵🏽|2738
+🚵🏾|2739
+🚵🏿|2740
+🚵‍♂️|2741
+🚵🏻‍♂️|2743
+🚵🏼‍♂️|2745
+🚵🏽‍♂️|2747
+🚵🏾‍♂️|2749
+🚵🏿‍♂️|2751
+🚵‍♀️|2753
+🚵🏻‍♀️|2755
+🚵🏼‍♀️|2757
+🚵🏽‍♀️|2759
+🚵🏾‍♀️|2761
+🚵🏿‍♀️|2763
+🤸|2765
+🤸🏻|2766
+🤸🏼|2767
+🤸🏽|2768
+🤸🏾|2769
+🤸🏿|2770
+🤸‍♂️|2771
+🤸🏻‍♂️|2773
+🤸🏼‍♂️|2775
+🤸🏽‍♂️|2777
+🤸🏾‍♂️|2779
+🤸🏿‍♂️|2781
+🤸‍♀️|2783
+🤸🏻‍♀️|2785
+🤸🏼‍♀️|2787
+🤸🏽‍♀️|2789
+🤸🏾‍♀️|2791
+🤸🏿‍♀️|2793
+🤼|2795
+🤼‍♂️|2796
+🤼‍♀️|2798
+🤽|2800
+🤽🏻|2801
+🤽🏼|2802
+🤽🏽|2803
+🤽🏾|2804
+🤽🏿|2805
+🤽‍♂️|2806
+🤽🏻‍♂️|2808
+🤽🏼‍♂️|2810
+🤽🏽‍♂️|2812
+🤽🏾‍♂️|2814
+🤽🏿‍♂️|2816
+🤽‍♀️|2818
+🤽🏻‍♀️|2820
+🤽🏼‍♀️|2822
+🤽🏽‍♀️|2824
+🤽🏾‍♀️|2826
+🤽🏿‍♀️|2828
+🤾|2830
+🤾🏻|2831
+🤾🏼|2832
+🤾🏽|2833
+🤾🏾|2834
+🤾🏿|2835
+🤾‍♂️|2836
+🤾🏻‍♂️|2838
+🤾🏼‍♂️|2840
+🤾🏽‍♂️|2842
+🤾🏾‍♂️|2844
+🤾🏿‍♂️|2846
+🤾‍♀️|2848
+🤾🏻‍♀️|2850
+🤾🏼‍♀️|2852
+🤾🏽‍♀️|2854
+🤾🏾‍♀️|2856
+🤾🏿‍♀️|2858
+🤹|2860
+🤹🏻|2861
+🤹🏼|2862
+🤹🏽|2863
+🤹🏾|2864
+🤹🏿|2865
+🤹‍♂️|2866
+🤹🏻‍♂️|2868
+🤹🏼‍♂️|2870
+🤹🏽‍♂️|2872
+🤹🏾‍♂️|2874
+🤹🏿‍♂️|2876
+🤹‍♀️|2878
+🤹🏻‍♀️|2880
+🤹🏼‍♀️|2882
+🤹🏽‍♀️|2884
+🤹🏾‍♀️|2886
+🤹🏿‍♀️|2888
+🧘|2890
+🧘🏻|2891
+🧘🏼|2892
+🧘🏽|2893
+🧘🏾|2894
+🧘🏿|2895
+🧘‍♂️|2896
+🧘🏻‍♂️|2898
+🧘🏼‍♂️|2900
+🧘🏽‍♂️|2902
+🧘🏾‍♂️|2904
+🧘🏿‍♂️|2906
+🧘‍♀️|2908
+🧘🏻‍♀️|2910
+🧘🏼‍♀️|2912
+🧘🏽‍♀️|2914
+🧘🏾‍♀️|2916
+🧘🏿‍♀️|2918
+🛀|2920
+🛀🏻|2921
+🛀🏼|2922
+🛀🏽|2923
+🛀🏾|2924
+🛀🏿|2925
+🛌|2926
+🛌🏻|2927
+🛌🏼|2928
+🛌🏽|2929
+🛌🏾|2930
+🛌🏿|2931
+🧑‍🤝‍🧑|2932
+🧑🏻‍🤝‍🧑🏻|2933
+🧑🏼‍🤝‍🧑🏼|2939
+🧑🏽‍🤝‍🧑🏽|2945
+🧑🏾‍🤝‍🧑🏾|2951
+🧑🏿‍🤝‍🧑🏿|2957
+👭|2958
+👭🏻|2959
+👭🏼|2965
+👭🏽|2971
+👭🏾|2977
+👭🏿|2983
+👫|2984
+👫🏻|2985
+👫🏼|2991
+👫🏽|2997
+👫🏾|3003
+👫🏿|3009
+👬|3010
+👬🏻|3011
+👬🏼|3017
+👬🏽|3023
+👬🏾|3029
+👬🏿|3035
+💏|3036
+💏🏻|3037
+💏🏼|3038
+💏🏽|3039
+💏🏾|3040
+💏🏿|3041
+👩‍❤️‍💋‍👨|3082
+👩🏻‍❤️‍💋‍👨🏻|3084
+👩🏼‍❤️‍💋‍👨🏼|3096
+👩🏽‍❤️‍💋‍👨🏽|3108
+👩🏾‍❤️‍💋‍👨🏾|3120
+👩🏿‍❤️‍💋‍👨🏿|3132
+👨‍❤️‍💋‍👨|3134
+👨🏻‍❤️‍💋‍👨🏻|3136
+👨🏼‍❤️‍💋‍👨🏼|3148
+👨🏽‍❤️‍💋‍👨🏽|3160
+👨🏾‍❤️‍💋‍👨🏾|3172
+👨🏿‍❤️‍💋‍👨🏿|3184
+👩‍❤️‍💋‍👩|3186
+👩🏻‍❤️‍💋‍👩🏻|3188
+👩🏼‍❤️‍💋‍👩🏼|3200
+👩🏽‍❤️‍💋‍👩🏽|3212
+👩🏾‍❤️‍💋‍👩🏾|3224
+👩🏿‍❤️‍💋‍👩🏿|3236
+💑|3238
+💑🏻|3239
+💑🏼|3240
+💑🏽|3241
+💑🏾|3242
+💑🏿|3243
+👩‍❤️‍👨|3284
+👩🏻‍❤️‍👨🏻|3286
+👩🏼‍❤️‍👨🏼|3298
+👩🏽‍❤️‍👨🏽|3310
+👩🏾‍❤️‍👨🏾|3322
+👩🏿‍❤️‍👨🏿|3334
+👨‍❤️‍👨|3336
+👨🏻‍❤️‍👨🏻|3338
+👨🏼‍❤️‍👨🏼|3350
+👨🏽‍❤️‍👨🏽|3362
+👨🏾‍❤️‍👨🏾|3374
+👨🏿‍❤️‍👨🏿|3386
+👩‍❤️‍👩|3388
+👩🏻‍❤️‍👩🏻|3390
+👩🏼‍❤️‍👩🏼|3402
+👩🏽‍❤️‍👩🏽|3414
+👩🏾‍❤️‍👩🏾|3426
+👩🏿‍❤️‍👩🏿|3438
+👨‍👩‍👦|3440
+👨‍👩‍👧|3441
+👨‍👩‍👧‍👦|3442
+👨‍👩‍👦‍👦|3443
+👨‍👩‍👧‍👧|3444
+👨‍👨‍👦|3445
+👨‍👨‍👧|3446
+👨‍👨‍👧‍👦|3447
+👨‍👨‍👦‍👦|3448
+👨‍👨‍👧‍👧|3449
+👩‍👩‍👦|3450
+👩‍👩‍👧|3451
+👩‍👩‍👧‍👦|3452
+👩‍👩‍👦‍👦|3453
+👩‍👩‍👧‍👧|3454
+👨‍👦|3455
+👨‍👦‍👦|3456
+👨‍👧|3457
+👨‍👧‍👦|3458
+👨‍👧‍👧|3459
+👩‍👦|3460
+👩‍👦‍👦|3461
+👩‍👧|3462
+👩‍👧‍👦|3463
+👩‍👧‍👧|3464
+🗣️|3466
+👤|3467
+👥|3468
+🫂|3469
+👪|3470
+🧑‍🧑‍🧒|3471
+🧑‍🧑‍🧒‍🧒|3472
+🧑‍🧒|3473
+🧑‍🧒‍🧒|3474
+👣|3475
+🫆|3476
+🐵|3486
+🐒|3487
+🦍|3488
+🦧|3489
+🐶|3490
+🐕|3491
+🦮|3492
+🐕‍🦺|3493
+🐩|3494
+🐺|3495
+🦊|3496
+🦝|3497
+🐱|3498
+🐈|3499
+🐈‍⬛|3500
+🦁|3501
+🐯|3502
+🐅|3503
+🐆|3504
+🐴|3505
+🫎|3506
+🫏|3507
+🐎|3508
+🦄|3509
+🦓|3510
+🦌|3511
+🦬|3512
+🐮|3513
+🐂|3514
+🐃|3515
+🐄|3516
+🐷|3517
+🐖|3518
+🐗|3519
+🐽|3520
+🐏|3521
+🐑|3522
+🐐|3523
+🐪|3524
+🐫|3525
+🦙|3526
+🦒|3527
+🐘|3528
+🦣|3529
+🦏|3530
+🦛|3531
+🐭|3532
+🐁|3533
+🐀|3534
+🐹|3535
+🐰|3536
+🐇|3537
+🐿️|3539
+🦫|3540
+🦔|3541
+🦇|3542
+🐻|3543
+🐻‍❄️|3544
+🐨|3546
+🐼|3547
+🦥|3548
+🦦|3549
+🦨|3550
+🦘|3551
+🦡|3552
+🐾|3553
+🦃|3554
+🐔|3555
+🐓|3556
+🐣|3557
+🐤|3558
+🐥|3559
+🐦|3560
+🐧|3561
+🕊️|3563
+🦅|3564
+🦆|3565
+🦢|3566
+🦉|3567
+🦤|3568
+🪶|3569
+🦩|3570
+🦚|3571
+🦜|3572
+🪽|3573
+🐦‍⬛|3574
+🪿|3575
+🐦‍🔥|3576
+🐸|3577
+🐊|3578
+🐢|3579
+🦎|3580
+🐍|3581
+🐲|3582
+🐉|3583
+🦕|3584
+🦖|3585
+🐳|3586
+🐋|3587
+🐬|3588
+🦭|3589
+🐟|3590
+🐠|3591
+🐡|3592
+🦈|3593
+🐙|3594
+🐚|3595
+🪸|3596
+🪼|3597
+🦀|3598
+🦞|3599
+🦐|3600
+🦑|3601
+🦪|3602
+🐌|3603
+🦋|3604
+🐛|3605
+🐜|3606
+🐝|3607
+🪲|3608
+🐞|3609
+🦗|3610
+🪳|3611
+🕷️|3613
+🕸️|3615
+🦂|3616
+🦟|3617
+🪰|3618
+🪱|3619
+🦠|3620
+💐|3621
+🌸|3622
+💮|3623
+🪷|3624
+🏵️|3626
+🌹|3627
+🥀|3628
+🌺|3629
+🌻|3630
+🌼|3631
+🌷|3632
+🪻|3633
+🌱|3634
+🪴|3635
+🌲|3636
+🌳|3637
+🌴|3638
+🌵|3639
+🌾|3640
+🌿|3641
+🍀|3644
+🍁|3645
+🍂|3646
+🍃|3647
+🪹|3648
+🪺|3649
+🍄|3650
+🪾|3651
+🍇|3652
+🍈|3653
+🍉|3654
+🍊|3655
+🍋|3656
+🍋‍🟩|3657
+🍌|3658
+🍍|3659
+🥭|3660
+🍎|3661
+🍏|3662
+🍐|3663
+🍑|3664
+🍒|3665
+🍓|3666
+🫐|3667
+🥝|3668
+🍅|3669
+🫒|3670
+🥥|3671
+🥑|3672
+🍆|3673
+🥔|3674
+🥕|3675
+🌽|3676
+🌶️|3678
+🫑|3679
+🥒|3680
+🥬|3681
+🥦|3682
+🧄|3683
+🧅|3684
+🥜|3685
+🫘|3686
+🌰|3687
+🫚|3688
+🫛|3689
+🍄‍🟫|3690
+🫜|3691
+🍞|3692
+🥐|3693
+🥖|3694
+🫓|3695
+🥨|3696
+🥯|3697
+🥞|3698
+🧇|3699
+🧀|3700
+🍖|3701
+🍗|3702
+🥩|3703
+🥓|3704
+🍔|3705
+🍟|3706
+🍕|3707
+🌭|3708
+🥪|3709
+🌮|3710
+🌯|3711
+🫔|3712
+🥙|3713
+🧆|3714
+🥚|3715
+🍳|3716
+🥘|3717
+🍲|3718
+🫕|3719
+🥣|3720
+🥗|3721
+🍿|3722
+🧈|3723
+🧂|3724
+🥫|3725
+🍱|3726
+🍘|3727
+🍙|3728
+🍚|3729
+🍛|3730
+🍜|3731
+🍝|3732
+🍠|3733
+🍢|3734
+🍣|3735
+🍤|3736
+🍥|3737
+🥮|3738
+🍡|3739
+🥟|3740
+🥠|3741
+🥡|3742
+🍦|3743
+🍧|3744
+🍨|3745
+🍩|3746
+🍪|3747
+🎂|3748
+🍰|3749
+🧁|3750
+🥧|3751
+🍫|3752
+🍬|3753
+🍭|3754
+🍮|3755
+🍯|3756
+🍼|3757
+🥛|3758
+🫖|3760
+🍵|3761
+🍶|3762
+🍾|3763
+🍷|3764
+🍸|3765
+🍹|3766
+🍺|3767
+🍻|3768
+🥂|3769
+🥃|3770
+🫗|3771
+🥤|3772
+🧋|3773
+🧃|3774
+🧉|3775
+🧊|3776
+🥢|3777
+🍽️|3779
+🍴|3780
+🥄|3781
+🔪|3782
+🫙|3783
+🏺|3784
+🌍|3785
+🌎|3786
+🌏|3787
+🌐|3788
+🗺️|3790
+🗾|3791
+🧭|3792
+🏔️|3794
+⛰️|3796
+🌋|3797
+🗻|3798
+🏕️|3800
+🏖️|3802
+🏜️|3804
+🏝️|3806
+🏞️|3808
+🏟️|3810
+🏛️|3812
+🏗️|3814
+🧱|3815
+🪨|3816
+🪵|3817
+🛖|3818
+🏘️|3820
+🏚️|3822
+🏠|3823
+🏡|3824
+🏢|3825
+🏣|3826
+🏤|3827
+🏥|3828
+🏦|3829
+🏨|3830
+🏩|3831
+🏪|3832
+🏫|3833
+🏬|3834
+🏭|3835
+🏯|3836
+🏰|3837
+💒|3838
+🗼|3839
+🗽|3840
+⛪|3841
+🕌|3842
+🛕|3843
+🕍|3844
+⛩️|3846
+🕋|3847
+⛲|3848
+⛺|3849
+🌁|3850
+🌃|3851
+🏙️|3853
+🌄|3854
+🌅|3855
+🌆|3856
+🌇|3857
+🌉|3858
+🎠|3861
+🛝|3862
+🎡|3863
+🎢|3864
+💈|3865
+🎪|3866
+🚂|3867
+🚃|3868
+🚄|3869
+🚅|3870
+🚆|3871
+🚇|3872
+🚈|3873
+🚉|3874
+🚊|3875
+🚝|3876
+🚞|3877
+🚋|3878
+🚌|3879
+🚍|3880
+🚎|3881
+🚐|3882
+🚑|3883
+🚒|3884
+🚓|3885
+🚔|3886
+🚕|3887
+🚖|3888
+🚗|3889
+🚘|3890
+🚙|3891
+🛻|3892
+🚚|3893
+🚛|3894
+🚜|3895
+🏎️|3897
+🏍️|3899
+🛵|3900
+🦽|3901
+🦼|3902
+🛺|3903
+🚲|3904
+🛴|3905
+🛹|3906
+🛼|3907
+🚏|3908
+🛣️|3910
+🛤️|3912
+🛢️|3914
+⛽|3915
+🛞|3916
+🚨|3917
+🚥|3918
+🚦|3919
+🛑|3920
+🚧|3921
+🛟|3923
+⛵|3924
+🛶|3925
+🚤|3926
+🛳️|3928
+⛴️|3930
+🛥️|3932
+🚢|3933
+🛩️|3937
+🛫|3938
+🛬|3939
+🪂|3940
+💺|3941
+🚁|3942
+🚟|3943
+🚠|3944
+🚡|3945
+🛰️|3947
+🚀|3948
+🛸|3949
+🛎️|3951
+🧳|3952
+⌛|3953
+⏳|3954
+⌚|3955
+⏰|3956
+⏱️|3958
+⏲️|3960
+🕰️|3962
+🕛|3963
+🕧|3964
+🕐|3965
+🕜|3966
+🕑|3967
+🕝|3968
+🕒|3969
+🕞|3970
+🕓|3971
+🕟|3972
+🕔|3973
+🕠|3974
+🕕|3975
+🕡|3976
+🕖|3977
+🕢|3978
+🕗|3979
+🕣|3980
+🕘|3981
+🕤|3982
+🕙|3983
+🕥|3984
+🕚|3985
+🕦|3986
+🌑|3987
+🌒|3988
+🌓|3989
+🌔|3990
+🌕|3991
+🌖|3992
+🌗|3993
+🌘|3994
+🌙|3995
+🌚|3996
+🌛|3997
+🌜|3998
+🌡️|4000
+🌝|4003
+🌞|4004
+🪐|4005
+⭐|4006
+🌟|4007
+🌠|4008
+🌌|4009
+⛅|4012
+⛈️|4014
+🌤️|4016
+🌥️|4018
+🌦️|4020
+🌧️|4022
+🌨️|4024
+🌩️|4026
+🌪️|4028
+🌫️|4030
+🌬️|4032
+🌀|4033
+🌈|4034
+🌂|4035
+⛱️|4040
+⚡|4041
+⛄|4046
+🔥|4049
+💧|4050
+🌊|4051
+🎃|4052
+🎄|4053
+🎆|4054
+🎇|4055
+🧨|4056
+🎈|4058
+🎉|4059
+🎊|4060
+🎋|4061
+🎍|4062
+🎎|4063
+🎏|4064
+🎐|4065
+🎑|4066
+🧧|4067
+🎀|4068
+🎁|4069
+🎗️|4071
+🎟️|4073
+🎫|4074
+🎖️|4076
+🏆|4077
+🏅|4078
+🥇|4079
+🥈|4080
+🥉|4081
+⚽|4082
+⚾|4083
+🥎|4084
+🏀|4085
+🏐|4086
+🏈|4087
+🏉|4088
+🎾|4089
+🥏|4090
+🎳|4091
+🏏|4092
+🏑|4093
+🏒|4094
+🥍|4095
+🏓|4096
+🏸|4097
+🥊|4098
+🥋|4099
+🥅|4100
+⛳|4101
+⛸️|4103
+🎣|4104
+🤿|4105
+🎽|4106
+🎿|4107
+🛷|4108
+🥌|4109
+🎯|4110
+🪀|4111
+🪁|4112
+🔫|4113
+🎱|4114
+🔮|4115
+🪄|4116
+🎮|4117
+🕹️|4119
+🎰|4120
+🎲|4121
+🧩|4122
+🧸|4123
+🪅|4124
+🪩|4125
+🪆|4126
+♟️|4136
+🃏|4137
+🀄|4138
+🎴|4139
+🎭|4140
+🖼️|4142
+🎨|4143
+🧵|4144
+🪡|4145
+🧶|4146
+🪢|4147
+👓|4148
+🕶️|4150
+🥽|4151
+🥼|4152
+🦺|4153
+👔|4154
+👕|4155
+👖|4156
+🧣|4157
+🧤|4158
+🧥|4159
+🧦|4160
+👗|4161
+👘|4162
+🥻|4163
+🩱|4164
+🩲|4165
+🩳|4166
+👙|4167
+👚|4168
+🪭|4169
+👛|4170
+👜|4171
+👝|4172
+🛍️|4174
+🎒|4175
+🩴|4176
+👞|4177
+👟|4178
+🥾|4179
+🥿|4180
+👠|4181
+👡|4182
+🩰|4183
+👢|4184
+🪮|4185
+👑|4186
+👒|4187
+🎩|4188
+🎓|4189
+🧢|4190
+🪖|4191
+⛑️|4193
+📿|4194
+💄|4195
+💍|4196
+💎|4197
+🔇|4198
+🔈|4199
+🔉|4200
+🔊|4201
+📢|4202
+📣|4203
+📯|4204
+🔔|4205
+🔕|4206
+🎼|4207
+🎵|4208
+🎶|4209
+🎙️|4211
+🎚️|4213
+🎛️|4215
+🎤|4216
+🎧|4217
+📻|4218
+🎷|4219
+🪗|4220
+🎸|4221
+🎹|4222
+🎺|4223
+🎻|4224
+🪕|4225
+🥁|4226
+🪘|4227
+🪇|4228
+🪈|4229
+🪉|4230
+📱|4231
+📲|4232
+☎️|4234
+📞|4235
+📟|4236
+📠|4237
+🔋|4238
+🪫|4239
+🔌|4240
+💻|4241
+🖥️|4243
+🖨️|4245
+🖱️|4249
+🖲️|4251
+💽|4252
+💾|4253
+💿|4254
+📀|4255
+🧮|4256
+🎥|4257
+🎞️|4259
+📽️|4261
+🎬|4262
+📺|4263
+📷|4264
+📸|4265
+📹|4266
+📼|4267
+🔍|4268
+🔎|4269
+🕯️|4271
+💡|4272
+🔦|4273
+🏮|4274
+🪔|4275
+📔|4276
+📕|4277
+📖|4278
+📗|4279
+📘|4280
+📙|4281
+📚|4282
+📓|4283
+📒|4284
+📃|4285
+📜|4286
+📄|4287
+📰|4288
+🗞️|4290
+📑|4291
+🔖|4292
+🏷️|4294
+💰|4295
+🪙|4296
+💴|4297
+💵|4298
+💶|4299
+💷|4300
+💸|4301
+💳|4302
+🧾|4303
+💹|4304
+📧|4307
+📨|4308
+📩|4309
+📤|4310
+📥|4311
+📦|4312
+📫|4313
+📪|4314
+📬|4315
+📭|4316
+📮|4317
+🗳️|4319
+✏️|4321
+🖋️|4325
+🖊️|4327
+🖌️|4329
+🖍️|4331
+📝|4332
+💼|4333
+📁|4334
+📂|4335
+🗂️|4337
+📅|4338
+📆|4339
+🗒️|4341
+🗓️|4343
+📇|4344
+📈|4345
+📉|4346
+📊|4347
+📋|4348
+📌|4349
+📍|4350
+📎|4351
+🖇️|4353
+📏|4354
+📐|4355
+🗃️|4359
+🗄️|4361
+🗑️|4363
+🔒|4364
+🔓|4365
+🔏|4366
+🔐|4367
+🔑|4368
+🗝️|4370
+🔨|4371
+🪓|4372
+⛏️|4374
+🛠️|4378
+🗡️|4380
+💣|4383
+🪃|4384
+🏹|4385
+🛡️|4387
+🪚|4388
+🔧|4389
+🪛|4390
+🔩|4391
+🗜️|4395
+🦯|4398
+🔗|4399
+⛓️‍💥|4400
+⛓️|4403
+🪝|4404
+🧰|4405
+🧲|4406
+🪜|4407
+🪏|4408
+🧪|4411
+🧫|4412
+🧬|4413
+🔬|4414
+🔭|4415
+📡|4416
+💉|4417
+🩸|4418
+💊|4419
+🩹|4420
+🩼|4421
+🩺|4422
+🩻|4423
+🚪|4424
+🛗|4425
+🪞|4426
+🪟|4427
+🛏️|4429
+🛋️|4431
+🪑|4432
+🚽|4433
+🪠|4434
+🚿|4435
+🛁|4436
+🪤|4437
+🪒|4438
+🧴|4439
+🧷|4440
+🧹|4441
+🧺|4442
+🧻|4443
+🪣|4444
+🧼|4445
+🫧|4446
+🪥|4447
+🧽|4448
+🧯|4449
+🛒|4450
+🚬|4451
+⚰️|4453
+🪦|4454
+⚱️|4456
+🧿|4457
+🪬|4458
+🗿|4459
+🪧|4460
+🪪|4461
+🏧|4462
+🚮|4463
+🚰|4464
+♿|4465
+🚹|4466
+🚺|4467
+🚻|4468
+🚼|4469
+🚾|4470
+🛂|4471
+🛃|4472
+🛄|4473
+🛅|4474
+⚠️|4476
+🚸|4477
+⛔|4478
+🚫|4479
+🚳|4480
+🚭|4481
+🚯|4482
+🚱|4483
+🚷|4484
+📵|4485
+🔞|4486
+⬆️|4492
+➡️|4496
+⬇️|4500
+⬅️|4504
+↩️|4512
+↪️|4514
+🔃|4519
+🔄|4520
+🔙|4521
+🔚|4522
+🔛|4523
+🔜|4524
+🔝|4525
+🛐|4526
+⚛️|4528
+🕉️|4530
+☯️|4536
+✝️|4538
+☪️|4542
+☮️|4544
+🕎|4545
+🔯|4546
+🪯|4547
+♊|4550
+♋|4551
+♌|4552
+♍|4553
+♎|4554
+♏|4555
+⛎|4560
+🔀|4561
+🔁|4562
+🔂|4563
+▶️|4565
+⏩|4566
+⏭️|4568
+⏯️|4570
+◀️|4572
+⏪|4573
+⏮️|4575
+🔼|4576
+⏫|4577
+🔽|4578
+⏬|4579
+⏸️|4581
+⏹️|4583
+⏺️|4585
+⏏️|4587
+🎦|4588
+🔅|4589
+🔆|4590
+📶|4591
+🛜|4592
+📳|4593
+📴|4594
+⚧️|4600
+🟰|4606
+♾️|4608
+‼️|4610
+💱|4619
+💲|4620
+♻️|4624
+⚜️|4626
+🔱|4627
+📛|4628
+🔰|4629
+⭕|4630
+❌|4636
+❎|4637
+➰|4638
+➿|4639
+〽️|4641
+©️|4649
+®️|4651
+🫟|4654
+🔟|4679
+🔠|4680
+🔡|4681
+🔢|4682
+🔣|4683
+🔤|4684
+🅰️|4686
+🆎|4687
+🅱️|4689
+🆑|4690
+🆒|4691
+🆓|4692
+🆔|4695
+Ⓜ️|4697
+🆕|4698
+🆖|4699
+🅾️|4701
+🆗|4702
+🅿️|4704
+🆘|4705
+🆙|4706
+🆚|4707
+🈁|4708
+🈂️|4710
+🈷️|4712
+🈶|4713
+🈯|4714
+🉐|4715
+🈹|4716
+🈚|4717
+🈲|4718
+🉑|4719
+🈸|4720
+🈴|4721
+🈳|4722
+🈺|4727
+🈵|4728
+🔴|4729
+🟠|4730
+🟡|4731
+🟢|4732
+🔵|4733
+🟣|4734
+🟤|4735
+⚫|4736
+⚪|4737
+🟥|4738
+🟧|4739
+🟨|4740
+🟩|4741
+🟦|4742
+🟪|4743
+🟫|4744
+⬛|4745
+⬜|4746
+◼️|4748
+◻️|4750
+◾|4751
+◽|4752
+▪️|4754
+▫️|4756
+🔶|4757
+🔷|4758
+🔸|4759
+🔹|4760
+🔺|4761
+🔻|4762
+💠|4763
+🔘|4764
+🔳|4765
+🔲|4766
+🏁|4767
+🚩|4768
+🎌|4769
+🏴|4770
+🏳️|4772
+🏳️‍🌈|4773
+🏳️‍⚧️|4775
+🏴‍☠️|4779
+🇦🇩|4782
+🇦🇪|4783
+🇦🇫|4784
+🇦🇬|4785
+🇦🇮|4786
+🇦🇱|4787
+🇦🇲|4788
+🇦🇴|4789
+🇦🇶|4790
+🇦🇷|4791
+🇦🇸|4792
+🇦🇹|4793
+🇦🇺|4794
+🇦🇼|4795
+🇦🇽|4796
+🇦🇿|4797
+🇧🇦|4798
+🇧🇧|4799
+🇧🇩|4800
+🇧🇪|4801
+🇧🇫|4802
+🇧🇬|4803
+🇧🇭|4804
+🇧🇮|4805
+🇧🇯|4806
+🇧🇱|4807
+🇧🇲|4808
+🇧🇳|4809
+🇧🇴|4810
+🇧🇶|4811
+🇧🇷|4812
+🇧🇸|4813
+🇧🇹|4814
+🇧🇼|4816
+🇧🇾|4817
+🇧🇿|4818
+🇨🇦|4819
+🇨🇨|4820
+🇨🇩|4821
+🇨🇫|4822
+🇨🇬|4823
+🇨🇭|4824
+🇨🇮|4825
+🇨🇰|4826
+🇨🇱|4827
+🇨🇲|4828
+🇨🇳|4829
+🇨🇴|4830
+🇨🇶|4832
+🇨🇷|4833
+🇨🇺|4834
+🇨🇻|4835
+🇨🇼|4836
+🇨🇽|4837
+🇨🇾|4838
+🇨🇿|4839
+🇩🇪|4840
+🇩🇯|4842
+🇩🇰|4843
+🇩🇲|4844
+🇩🇴|4845
+🇩🇿|4846
+🇪🇨|4848
+🇪🇪|4849
+🇪🇬|4850
+🇪🇭|4851
+🇪🇷|4852
+🇪🇸|4853
+🇪🇹|4854
+🇪🇺|4855
+🇫🇮|4856
+🇫🇯|4857
+🇫🇰|4858
+🇫🇲|4859
+🇫🇴|4860
+🇫🇷|4861
+🇬🇦|4862
+🇬🇧|4863
+🇬🇩|4864
+🇬🇪|4865
+🇬🇫|4866
+🇬🇬|4867
+🇬🇭|4868
+🇬🇮|4869
+🇬🇱|4870
+🇬🇲|4871
+🇬🇳|4872
+🇬🇵|4873
+🇬🇶|4874
+🇬🇷|4875
+🇬🇸|4876
+🇬🇹|4877
+🇬🇺|4878
+🇬🇼|4879
+🇬🇾|4880
+🇭🇰|4881
+🇭🇳|4883
+🇭🇷|4884
+🇭🇹|4885
+🇭🇺|4886
+🇮🇨|4887
+🇮🇩|4888
+🇮🇪|4889
+🇮🇱|4890
+🇮🇲|4891
+🇮🇳|4892
+🇮🇴|4893
+🇮🇶|4894
+🇮🇷|4895
+🇮🇸|4896
+🇮🇹|4897
+🇯🇪|4898
+🇯🇲|4899
+🇯🇴|4900
+🇯🇵|4901
+🇰🇪|4902
+🇰🇬|4903
+🇰🇭|4904
+🇰🇮|4905
+🇰🇲|4906
+🇰🇳|4907
+🇰🇵|4908
+🇰🇷|4909
+🇰🇼|4910
+🇰🇾|4911
+🇰🇿|4912
+🇱🇦|4913
+🇱🇧|4914
+🇱🇨|4915
+🇱🇮|4916
+🇱🇰|4917
+🇱🇷|4918
+🇱🇸|4919
+🇱🇹|4920
+🇱🇺|4921
+🇱🇻|4922
+🇱🇾|4923
+🇲🇦|4924
+🇲🇨|4925
+🇲🇩|4926
+🇲🇪|4927
+🇲🇬|4929
+🇲🇭|4930
+🇲🇰|4931
+🇲🇱|4932
+🇲🇲|4933
+🇲🇳|4934
+🇲🇴|4935
+🇲🇵|4936
+🇲🇶|4937
+🇲🇷|4938
+🇲🇸|4939
+🇲🇹|4940
+🇲🇺|4941
+🇲🇻|4942
+🇲🇼|4943
+🇲🇽|4944
+🇲🇾|4945
+🇲🇿|4946
+🇳🇦|4947
+🇳🇨|4948
+🇳🇪|4949
+🇳🇫|4950
+🇳🇬|4951
+🇳🇮|4952
+🇳🇱|4953
+🇳🇴|4954
+🇳🇵|4955
+🇳🇷|4956
+🇳🇺|4957
+🇳🇿|4958
+🇴🇲|4959
+🇵🇦|4960
+🇵🇪|4961
+🇵🇫|4962
+🇵🇬|4963
+🇵🇭|4964
+🇵🇰|4965
+🇵🇱|4966
+🇵🇲|4967
+🇵🇳|4968
+🇵🇷|4969
+🇵🇸|4970
+🇵🇹|4971
+🇵🇼|4972
+🇵🇾|4973
+🇶🇦|4974
+🇷🇪|4975
+🇷🇴|4976
+🇷🇸|4977
+🇷🇺|4978
+🇷🇼|4979
+🇸🇦|4980
+🇸🇧|4981
+🇸🇨|4982
+🇸🇩|4983
+🇸🇪|4984
+🇸🇬|4985
+🇸🇭|4986
+🇸🇮|4987
+🇸🇰|4989
+🇸🇱|4990
+🇸🇲|4991
+🇸🇳|4992
+🇸🇴|4993
+🇸🇷|4994
+🇸🇸|4995
+🇸🇹|4996
+🇸🇻|4997
+🇸🇽|4998
+🇸🇾|4999
+🇸🇿|5000
+🇹🇨|5002
+🇹🇩|5003
+🇹🇫|5004
+🇹🇬|5005
+🇹🇭|5006
+🇹🇯|5007
+🇹🇰|5008
+🇹🇱|5009
+🇹🇲|5010
+🇹🇳|5011
+🇹🇴|5012
+🇹🇷|5013
+🇹🇹|5014
+🇹🇻|5015
+🇹🇼|5016
+🇹🇿|5017
+🇺🇦|5018
+🇺🇬|5019
+🇺🇸|5022
+🇺🇾|5023
+🇺🇿|5024
+🇻🇦|5025
+🇻🇨|5026
+🇻🇪|5027
+🇻🇬|5028
+🇻🇮|5029
+🇻🇳|5030
+🇻🇺|5031
+🇼🇫|5032
+🇼🇸|5033
+🇽🇰|5034
+🇾🇪|5035
+🇾🇹|5036
+🇿🇦|5037
+🇿🇲|5038
+🇿🇼|5039
+🏴󠁧󠁢󠁥󠁮󠁧󠁿|5040
+🏴󠁧󠁢󠁳󠁣󠁴󠁿|5041
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|5042

+ 14 - 7
app/assets/emojis/search-index/pl.csv

@@ -103,7 +103,7 @@
 🤔|buźka|hmm|myśląca twarz|myślę|zamyślony|zastanawiam się|zastanowienie
 🫡|ok|pogodna twarz|powodzenia|salutowanie|salutująca twarz|tak jest|wojsko
 🤐|buzia na kłódkę|buźka|nic nie powiem|tajemnica|twarz z zamkiem błyskawicznym na ustach
-🤨|brew|buźka|dziwne|głowa|hę|hmm|nie wierzę|sceptyczny|twarz z podniesioną brwią|zdiwiony|że co
+🤨|brew|buźka|dziwne|głowa|hę|hmm|nie wierzę|sceptyczny|twarz z podniesioną brwią|zdziwiony|że co
 😐|buźka bez wyrazu|hm|neutralna twarz|nic|nie mam zdania|nie obchodzi mnie|wtf
 😑|brak emocji|buźka|nic|nie mam zdania|nie obchodzi mnie|twarz bez wyrazu|wtf
 😶|buźka bez ust|cisza|nic nie mówię|oczy|twarz bez ust
@@ -123,6 +123,7 @@
 😪|buźka|senna twarz|senność|spać|śpiąca buźka
 🤤|buźka|cieknie mi ślinka|głodny|mniam|ślina|śliniąca się twarz|ślinka
 😴|buźka|chrapanie|dobranoc|drzemka|noc|nuda|sen|spać|spanie|śpiąca twarz|śpiący|twarz|ziew|zmęczenie|zzz
+🫩|podkrążone oczy|senność|worki pod oczami|zmęczenie
 😷|buźka|choroba|lekarz|maska|operacja|pielęgniarka|twarz w masce medycznej
 🤒|buźka|choroba|gorączka|smutek|temperatura|termometr|twarz z termometrem
 🤕|bandaż|buźka|czoło|głowa|rana|skaleczenie|smutny|twarz z bandażem
@@ -539,7 +540,7 @@
 🛀|biorąca kąpiel|kąpiel|osoba|w wannie|wanna
 🛌|dobranoc|drzemka|hotel|łóżko|nocleg|nocowanie|osoba|pensjonat|posłanie|sen|spać|w łóżku|zzz
 🧑‍🤝‍🧑|ludzie|osoby trzymające się za ręce|para|rękę|za ręce
-👭|dwie kobiety trzymające się za ręce|kobieca para|kobieta|kobiety trzymające się za ręce|miłość|para|przyjaciółka|przyjaźń|za ręce|zakochane|zakochani
+👭|kobieca para|kobieta|kobiety trzymające się za ręce|miłość|para|przyjaciółka|przyjaźń|za ręce|zakochane|zakochani
 👫|kobieta i mężczyzna|ludzie|mężczyzna i kobieta|miłość|para|rodzeństwo|trzymający się|za ręce|zakochani
 👬|dwóch mężczyzn trzymających się za ręce|gej|lgbt|mężczyźni|miłość|para|za ręce|zakochani
 💏|buziaki|całusy|kocham|miłość|osoba|osoby|para|pocałunek|zakochani|związek
@@ -554,6 +555,7 @@
 🧑‍🧒|dorosły|dziecko|rodzina: dorosły, dziecko
 🧑‍🧒‍🧒|dorosły|dziecko|rodzina: dorosły, dziecko, dziecko
 👣|odciski stóp|ślady stóp|stopy
+🫆|bezpieczeństwo|odcisk palca|tożsamość
 🐵|buźka|głowa małpy|małpka|zwierzę
 🐒|małpa|małpka|zwierzę
 🦍|goryl|zwierzę
@@ -663,6 +665,11 @@
 🐚|morze|muszelka|muszla spiralna|plaża|spirala|zwierzę
 🪸|koralowa|koralowiec|ocean|rafa
 🪼|akwarium|bezkręgowiec|galareta|macki|meduza|morskie|morze|ocean|parzyć|plankton|zwierzę
+🦀|krab|morze|ocean|plaża|rak|zodiak|zwierzę
+🦞|czerwony|homar|owoce morza|rak|szczypce|zwierzę
+🦐|jedzenie|krewetka|morze|ocean|owoce morza|zwierzę
+🦑|atrament|jedzenie|kałamarnica|mątwa|mięczak|morze|ocean|ośmiornica|owoce morza|sepia|tusz|zwierzę
+🦪|małże|nurkowanie|ostryga|perła|perły|zwierzę
 🐌|mięczak|muszla|powolny|ślimak|wolny|zwierzę
 🦋|kolorowy|motyl|owad|zwierzę
 🐛|gąsienica|owad|robak|zwierzę
@@ -706,6 +713,7 @@
 🪹|gniazdowanie|gnieżdżenie|ptasie|puste
 🪺|gniazdowanie|gnieżdżenie|jajka|ptasie|z jajkami|zniesione jaja
 🍄|grzyb|muchomorek|trujący
+🪾|bez liści|drzewo|susza|zima
 🍇|jedzenie|owoce|winogrona
 🍈|jedzenie|melon|owoc
 🍉|arbuza|jedzenie|kawałek|lato|owoc
@@ -744,6 +752,7 @@
 🫚|imbiru|korzeń|naturalne|przyprawa|zdrowie|zioła|zioło
 🫛|edamame|fasola|grochu|łuskać|roślina|soja|sojowa|strączek|strączkowa|strąk|warzywo
 🍄‍🟫|borowik|brązowy|grzyb|jedzenie|natura|shiitake|warzywo
+🫜|burak|korzeń|ogród|rzepa|warzywo
 🍞|bochenek|chleba|jedzenie|kawałek|pieczywo
 🥐|croissant|francuski|jedzenie|pieczywo|rogalik
 🥖|bagietka|bułka|chleb|jedzenie|pieczywo
@@ -795,11 +804,6 @@
 🥟|gyoza|jedzenie|pieróg|pierogi
 🥠|ciasteczko|ciastko|przepowiednia|szczęście|wróżba|z wróżbą
 🥡|jedzenie|na wynos|pałeczki|pudełko|ryż
-🦀|krab|morze|ocean|plaża|rak|zodiak|zwierzę
-🦞|czerwony|homar|owoce morza|rak|szczypce|zwierzę
-🦐|jedzenie|krewetka|morze|ocean|owoce morza|zwierzę
-🦑|atrament|jedzenie|kałamarnica|mątwa|mięczak|morze|ocean|ośmiornica|owoce morza|sepia|tusz|zwierzę
-🦪|małże|nurkowanie|ostryga|perła|perły|zwierzę
 🍦|jedzenie|lody|śmietankowe|świderek|w kubku|włoskie
 🍧|deser|hawajskie|jedzenie|lody
 🍨|deser|jedzenie|lody
@@ -1204,6 +1208,7 @@
 🪘|bębenek|bębnić|instrument|konga|muzyka|rytm|tamburyn
 🪇|cza cza|grzechotać|grzechotki|impreza|instrument|marakasy|muzyka|perkusja|perkusyjny|potrząsać|taniec
 🪈|dęty|drewniany|flet|fujarka|grać|gwizdać|instrument|muzyka|na flecie|orkiestra|piccolo|pikolo|piszczałka|prosty
+🪉|amorek|harfa|instrument|miłość|muzyka|orkiestra
 📱|komóra|komórka|smartfon|telefon komórkowy
 📲|dzwonić|komórka|odebrać|połączenie|smartfon ze strzałką|strzałka|telefon komórkowy ze strzałką
 ☎️|aparat telefoniczny|telefon
@@ -1334,6 +1339,7 @@
 🧰|czerwona|klucze|kombinerki|mechanik|na narzędzia|narzędzia|narzędzie|skrzynka|z narzędziami
 🧲|kształt u|magnes|magnetyczny|magnetyzm|odpychanie|podkowa|przyciąganie
 🪜|do góry|drabina|hierarchia|ranking|stopnie|szczebel|wspinać się
+🪏|dziura|kopać|łopata|szpadel
 🧪|chemia|chemik|eksperyment|laboratorium|nauka|probówka
 🧫|badania|bakteria|bakterie|biologia|kultura|laboratorium|płytka petriego|szalka petriego
 🧬|biolog|dna|ewolucja|genetyka|geny|życie
@@ -1477,6 +1483,7 @@
 ➰|pętla|zawijas|znak
 ➿|pętla|podwójna|zawijas
 〽️|m|początek partii wokalnej|znak|zygzak
+🫟|farba|holi|plama|rozbryzg|rozlanie
 🔠|abcd|alfabet łaciński|duże litery|kapitaliki|łacińskie|litery|pisać|wielkie litery|wielkimi literami|wprowadzać
 🔡|abcd|alfabet łaciński|łacińskie|litery|małe litery|małymi literami|pisać|wprowadzać
 🔢|1234|cyfry|kalkulator|liczby|wprowadzać

Fișier diff suprimat deoarece este prea mare
+ 235 - 230
app/assets/emojis/search-index/pt.csv


+ 12 - 5
app/assets/emojis/search-index/ru.csv

@@ -123,6 +123,7 @@
 😪|ночи|плакать|плач|пора|сон|спать|сплю|спокойной|устал
 🤤|лицо|пускает слюни|слюни
 😴|боковую|ночи|пора|сон|спать|спокойной|уснул|устал|храп
+🫩|без|глазами|истощение|мешки|под|сил|скучно|сон|спать|устал
 😷|болеть|вирус|врач|заражение|карантин|маска|медик|микроб|простуда|санитар
 🤒|болеть|больной|вирус|градусник|грипп|жар|плохо|простуда|температура
 🤕|бинт|болеть|больной|гипс|перевязка|повязка|пострадал|ударился
@@ -554,6 +555,7 @@
 🧑‍🧒|неполная семья с одним ребенком|родитель-одиночка с одним ребенком|семья: взрослый и ребенок
 🧑‍🧒‍🧒|неполная семья с двумя детьми|родитель-одиночка с двумя детьми|семья: взрослый и двое детей
 👣|нога|подошва|рельеф|следы|человек
+🫆|безопасность|биометрия|идентификация|криминалистика|отпечаток пальца
 🐵|животное|морда|обезьяна|обезьянья
 🐒|животное|обезьяна
 🦍|горилла|животное|обезьяна
@@ -663,6 +665,11 @@
 🐚|моллюск|раковина|ракушка|спираль|улитка
 🪸|изменение климата|коралл|море|океан|природа|риф
 🪼|беспозвоночное|морское|ожог|ой|ужалить
+🦀|знак|зодиак|клешни|краб|рак
+🦞|животное|клешни|лангуст|лобстер|морепродукты|омар|рак
+🦐|еда|креветка|маленькая|морепродукты|ракообразные|рачок
+🦑|еда|кальмар|моллюск|щупальца
+🦪|жемчуг|жемчужина|нырять|раковина|ракушка|устрица|устричный
 🐌|медленно|ползти|раковина|улитка
 🦋|бабочка|красота|мотылек|насекомое
 🐛|гусеница|жук|многоножка|насекомое|сороконожка
@@ -706,6 +713,7 @@
 🪹|гнездование|домой|природа|птицы|пустое гнездо
 🪺|гнездо с яйцами|гнездование|кладка яиц|природа|птицы|яйца
 🍄|гриб|мухомор|несъедобный|поганка|ядовитый
+🪾|дерево без листвы|дерево без листьев|засуха|зима
 🍇|ветвь винограда|виноградина|сок|фрукт
 🍈|дыня|растение|фрукт|ягода
 🍉|арбуз|растение|фрукт|ягода
@@ -744,6 +752,7 @@
 🫚|имбирь|корень|специя
 🫛|бобовые|бобы|горох|овощ|стручок|эдамамэ
 🍄‍🟫|бурый гриб|вегетарианство|веги|грибок|грибочек|грибы|еда|овощ|природа
+🫜|корень|овощ|огород|репа|свекла
 🍞|батон|буханка|хлеб
 🥐|еда|круассан|рогалик|французский|хлеб
 🥖|багет|батон|булка|еда|французский|хлеб
@@ -795,11 +804,6 @@
 🥟|вареники|гёдза|колдуны|пельмени|равиоли|ушки|цзяоцзы
 🥠|гадание|оракул|печенье с предсказанием|предсказание
 🥡|доставка еды|еда на вынос|еда с собой|коробка для еды на вынос|коробка с едой|на вынос|палочки|с собой
-🦀|знак|зодиак|клешни|краб|рак
-🦞|животное|клешни|лангуст|лобстер|морепродукты|омар|рак
-🦐|еда|креветка|маленькая|морепродукты|ракообразные|рачок
-🦑|еда|кальмар|моллюск|щупальца
-🦪|жемчуг|жемчужина|нырять|раковина|ракушка|устрица|устричный
 🍦|ванильное мороженое|вафельный стаканчик|вафля|десерт|мороженое в стаканчике|мягкое мороженое|рожок
 🍧|десерт|креманка|мороженое в креманке|строганый лед
 🍨|десерт|мороженое|сладкое|холодное
@@ -1204,6 +1208,7 @@
 🪘|барабан|бит|конга|музыкальный инструмент|ритм|тамтам
 🪇|вечеринка|инструмент|маракасы|музыкальные инструменты|перкуссия|погремушки|ритм|танец|танцы|трясти|ча-ча-ча
 🪈|группа|деревянный духовой инструмент|дудочка|духовой инструмент|инструмент|музыка|оркестр|продольная флейта|сопилка|труба|флейта пикколо|флейтист
+🪉|ангелочек|арфа|инструмент|купидон|любовь|музыка|оркестр
 📱|мобильник|мобильный|смартфон|сотовый|телефон
 📲|входящий|вызов|мобильник|мобильный|смартфон|сотовый|телефон
 ☎️|аппарат|линия|телефон|трубка
@@ -1334,6 +1339,7 @@
 🧰|инструменты|комплект инструментов|коробка|красный ящик|мастер|механик|набор инструментов|ремонт|слесарь|ящик для инструментов
 🧲|магнетический|магнит-подкова|отрицательный|подкова|положительный|притяжение
 🪜|залезать|лезть|лестница|перекладина|стремянка|ступень
+🪏|ковш|копать|лопата|совок|яма
 🧪|лаборатория|наука|опыты|пробирка|химик|химия|эксперименты
 🧫|анализы|бактерии|биология|лаборатория|чашка петри|эксперимент
 🧬|биология|генетика|гены|днк|жизнь|молекула|эволюция
@@ -1477,6 +1483,7 @@
 ➰|значок|петелька|петля
 ➿|две|двойная|петелька|петельки|петли|петля
 〽️|вступает другой голос|голос|другой голос|знак|певцы|япония
+🫟|клякса|краска|пролить|пятно|холи
 🔠|алфавит|ввод прописными|верхний регистр|латиница|латинские буквы|прописные символы
 🔡|алфавит|буквы|ввод строчными|кнопка|латинские буквы|нижний регистр|строчные символы
 🔢|ввод цифр|цифры

+ 13 - 6
app/assets/emojis/search-index/sk.csv

@@ -123,6 +123,7 @@
 😪|ospalá|plakať|smajlík|smutný|spánok|tvár|únava|unavený
 🤤|blaho|chutné|hlad|slintajúca tvár|slintať|smajlík|tvár
 😴|spánok|spať|spiaca tvár|tvár|unavený|znudený|zzz
+🫩|ospalý|tvár s kruhmi pod očami|unavený|vyčerpaný
 😷|bacily|chorá|choroba|doktor|lekár|maska|medicína|nemocnica|rúško|smajlík|studená|tvár s rúškom|zubár
 🤒|chorá|choroba|horúčka|nezdravá|smajlík|teplomer|teplota|tvár s teplomerom
 🤕|bandáž|bolesť|chorý|obväz|poranená|smajlík|tvár s bandážou|tvár s obväzom|úraz|zranenie
@@ -554,6 +555,7 @@
 🧑‍🧒|dcéra|dieťa|matka|otec|rodina: dospelý, dieťa|syn
 🧑‍🧒‍🧒|brat|dcéra|dieťa|dve deti|matka|otec|rodina: dospelý, dieťa, dieťa|sestra|syn
 👣|bosý|chodidlo|naboso|nohy|odtlačok|šľapaj|stopa|stopy|telo|topánka
+🫆|bezpečnosť|forenzný|identita|odtlačok prsta
 🐵|banán|hlava opice|opica|príroda|tvár opice|zvedavá|zvedavý george|zviera
 🐒|banány|džungľa|opica|opička|príroda|zviera
 🦍|gorila|opica|príroda|zviera
@@ -663,6 +665,11 @@
 🐚|mušľa|oceán|pláž|príroda|škebľa|špirálovitá
 🪸|klíma|klimatické zmeny|koral|more|oceán|útes
 🪼|bezstavovec|bolesť|chápadlá|medúza|more|planktón|podmorský svet|popáliť|popŕhliť|želé|žihadlo|zviera
+🦀|horoskop|krab|oceán|príroda|rak|voda|zverokruh|zviera
+🦞|dary mora|homár|klepetá|kôrovec|krab|morské plody|morský rak|morský živočích|pancier|plody mora|polievka z homára|rak|zviera
+🦐|hlad|jedlo|kreveta|mäkkýš|malá|oceán|príroda|zviera
+🦑|jedlo|kalmár|mäkkýš|oceán|príroda|zviera
+🦪|perla|potápanie|ustrica
 🐌|príroda|slimák|záhrada|zviera
 🦋|hmyz|krása|modrý motýľ|motýľ|pekný|príroda|zviera
 🐛|chrobák|hmyz|húsenica|príroda|záhrada|zviera
@@ -706,6 +713,7 @@
 🪹|domov|hniezdenie|hniezdo|prázdne hniezdo
 🪺|hniezdenie|hniezdo s vajcami|vajce|vajíčko|vtáča|vták
 🍄|hríb|huba|mario|muchotrávka|príroda|rastlina
+🪾|neúroda|strom bez listov|sucho|zima
 🍇|dionýzos|hrozno|jedlo|ovocie|rastlina|réva|vinná réva
 🍈|cukrový melón|jedlo|melón|ovocie|rastlina|žltá dyňa
 🍉|červený melón|dyňa|jedlo|melón|ovocie|rastlina|vodný melón
@@ -744,6 +752,7 @@
 🫚|koreň ďumbiera|korenina|pivo|rastlina|štipľavý|zázvor|zdravie
 🫛|edamame|fazuľa|hrachový struk|strukovina|vegetariánske|zelenina
 🍄‍🟫|hnedý hríb|huba|huby|jedlo|príroda|vegetarián|výhonok|zelenina
+🫜|cvikla|repa|záhrada|zelenina
 🍞|bochník|chlieb|jedlo|karbohydráty|múčny|peceň|pšenica|reštaurácia|sacharidy|toastový chlieb
 🥐|croissant|francúzske|francúzsky|jedlo|pečivo|rožok
 🥖|bageta|chlieb|francúzske|jedlo|pečivo
@@ -795,11 +804,6 @@
 🥟|buchta|buchtička|dim sum|empanada|gyoza|haluška|jedlo|knedlička|knedlík|piroh|pirôžok|pirôžtek|ravioli
 🥠|budúcnosť|čínsky koláčik|jedlo|koláčik šťastia|predpoveď|proroctvo|sušienka s predpoveďou
 🥡|donáška|dovoz jedla|jedlo|krabička na jedlo|paličky|rýchle občerstvenie|ryža|škatuľka
-🦀|horoskop|krab|oceán|príroda|rak|voda|zverokruh|zviera
-🦞|dary mora|homár|klepetá|kôrovec|krab|morské plody|morský rak|morský živočích|pancier|plody mora|polievka z homára|rak|zviera
-🦐|hlad|jedlo|kreveta|mäkkýš|malá|oceán|príroda|zviera
-🦑|jedlo|kalmár|mäkkýš|oceán|príroda|zviera
-🦪|perla|potápanie|ustrica
 🍦|čapovaná|dezert|jedlo|krém|sladkosť|strojová zmrzlina|točená zmrzlina|zmrzlina
 🍧|dezert|dreň|hlad|jedlo|mrazená dreň|ochutená ľadová drť|reštaurácia|sladkosť|zmrzlina
 🍨|dezert|jedlo|krém|sladkosť|sorbet|zmrzlina
@@ -1204,6 +1208,7 @@
 🪘|bubenícke|bubon|hudobný nástroj|kongo|rytmus
 🪇|hrkať|hudba|nástroj|párty|perkusie|rumbagule|tancovať|triasť
 🪈|drevený dychový hudobný nástroj|drevený dychový nástroj|flauta|hudba|nástroj|orchester|pikola|píšťalka|záznamník
+🪉|harfa|hudba|hudobný|láska|nástroj
 📱|komunikácia|mobilný|telefón
 📲|hovor|mobil so šípkou|mobilný telefón so šípkou|prijímať|šípka|telefón
 ☎️|červená|pevná linka|telefón|volať
@@ -1334,6 +1339,7 @@
 🧰|bedňa|bednička|červená krabica|debna|francúzsky kľúč|inštrumenty|kliešte|krabica|kufrík na náradie|mechanik
 🧲|magnet v tvare podkovy|magnet v tvare u|magnetické pole|magnetický|negatívny pól|odpudzovať|podkova|pozitívny pól|priťahovať
 🪜|priečka|rebrík|stúpadlo
+🪏|jama|kopať|lopata|rýľ
 🧪|chémia|chemička|chemik|elixír|experiment|kvapalina|laboratórium|pokus|skúmavka|veda
 🧫|baktéria|biológia|biologička|bunky|chémia|experimenty|kultivácia|kultivovať|kultúra
 🧬|biológia|biologička|deoxyribonukleová kyselina|dna|dvojzávitnica|dvojzávitnicová špirála|evolúcia|gén|genetická informácia
@@ -1474,9 +1480,10 @@
 ⭕|červený|kruh|o|prázdny červený kruh|veľký hrubý kruh
 ❌|×|krát|krížik|matematika|násobenie|násobiť|x|znak|zrušiť
 ❎|×|krát|krížik|násobenie|štvorec|tlačidlo s krížikom|x|znak
-➰|slučka
+➰|lano|oko|pasca|povraz|uzol|viazanie
 ➿|cyklus|dvojitá|slučka
 〽️|časť|graf|krivka|part|značka striedania častí|znak začiatku partu
+🫟|fľak|machuľa|škvrna
 🔠|abcd|kapitálky|latinka|písmená|veľké písmená|zadať veľké písma latinky|zadávanie veľkých písmen latinky
 🔡|abcd|latinka|malé písmená|písmená|zadať malé písma latinky|zadávanie malých písmen latinky
 🔢|1234|čísla|klávesnica|numerická|zadať|zadávanie čísel

+ 54 - 47
app/assets/emojis/search-index/tr.csv

@@ -70,17 +70,17 @@
 😃|ağzı açık gülen yüz|ağzı açık gülümseme|ağzı açık sırıtma|gülen yüz|gülme|gülümseme|lol|neşeli|yüz
 😄|ağzı açık gülen gözler|gülen gözlerle ağzı açık gülümseme|gülen gözlerle ağzı açık sırıtma|gülen yüz|gülme|gülümseme|lol|neşeli|yüz
 😁|gülen gözlerle sırıtan yüz|gülen gözlerle sırıtma|gülen yüz|gülme|gülümseme|gülümseyen gözler|lol|neşeli|yüz
-😆|32 diş|ağız açık|ahaha|çok komik|gözler kapalı|gülmekten ölmek|hahaha|inanılmaz|kahkaha|kapalı gözlerle ağzı açık sırıtma|kapalı gözlerle gülümseme|komik|lol|mutlu|yüz ifadesi
+😆|32 diş|ağız|ahaha|çok komik|gözler kapalı|gülmek|hahaha|kahkaha|komik|lol|mutlu|yüz
 😅|heyecanlı|soğuk terli ağzı açık gülümseme|stresli|yüz
-🤣|ahaha|aşırı komik|çok komik|eheh|gözümden yaş geldi|gözyaşı|gülmekten ölmek|gülmekten yerlere yatmak|hahaha|kahkaha|komik|lol|mutluluk|neşe|yerlere yatmak|yüz ifadesi
-😂|ağlamak|çok komik|gözyaşı|gözyaşları|gülmekten ağlamak|gülmekten ölmek|gülüş|haha|harika|inanılmaz|kahkaha|katılmak|komik|lol|mutluluk|neşe|sevinç
+🤣|ahaha|çok komik|gözümden yaş geldi|gözyaşı|gülme|hahaha|kahkaha|komik|mutluluk|neşe|yerlere yatmak|yüz
+😂|ağlamak|gözyaşı|gülmekten ağlamak|haha|inanılmaz|kahkaha|katılmak|komik|mutluluk|neşe|sevinç
 🙂|gülme|gülümseme|hafifçe gülümseme|hafifçe gülümseyen yüz|mutlu|neşeli|yüz
 🙃|gülme|gülümseme|hehe|ters yüz|yüz
-🫠|aşkından erimek|çözülme|eridim|erimek|eriyen yüz|eriyorum|ifade|kaybolma|sıcak|sıvılaşma|utanç|yüz ifadesi
+🫠|aşkından erimek|çözülme|eridim|erime|eriyen yüz|eriyorum|ifade|kaybolma|sıcak|sıvılaşma|utanç|yüz ifadesi
 😉|cilve|göz kırpan yüz|göz kırpma|yüz
 😊|ağzı açık gülme|gülen gözlerle gülümseme|gülümseyen gözler|gülümseyen yüz ve gözler|samimi|sevecen|yüz
 😇|gülümseme|hare|ışık halkalı gülümseme|ışık halkası|melek|yüz
-🥰|3 kalpli gülümseyen yüz|aşık olma|aşk|çarpılma|gülen yüz|hayranlık|ilk görüşte aşk|kalpler|kalpli gülümseyen yüz|mutluluk|romantik|seni seviyorum|sevgili|üç kalpli yüz|yüz ifadesi
+🥰|aşık|aşk|çarpılma|gülen yüz|hayranlık|ilk görüşte aşk|kalp|mutluluk|romantik|seni seviyorum|sevgi|üç kalpli yüz
 😍|aşk|değer verme|gözler|kalp gözlü gülümseme|kalpler|romantik|yüz
 🤩|gözler|heyecanlı|sırıtan|surat|vov|yıldız çarpmış|yüz
 😘|aşk|muah|muck|öptüm|öpücük gönderen yüz|romantik|sevgi|yüz
@@ -88,7 +88,7 @@
 ☺️|gülen yüz|içi boş gülen yüz|masum|mutlu|utandım|utanmış|yüz
 😚|aşk|gözler kapalı öpüşme|kapalı gözlerle öpen yüz|öpücük yollama|yüz
 😙|gülen gözlerle öpen yüz|gülümseme|gülümseyen gözler|gülümseyerek öpen yüz|öptüm|öpücük|yüz
-🥲|acı|duygulanmış|gözü yaşlı gülümseyen yüz|gözyaşı|gülümseme|gururlu|hislenmiş|memnun|minnettar|mutluluk|rahatlamış|sevinç|yüz ifadesi
+🥲|acı|duygulanmış|gözyaşı|gülümseme|gururlu|hislenmiş|memnun|minnettar|mutluluk|rahatlamış|sevinç|yüz ifadesi
 😋|gülümseyen yüz|harika yemek|keyifli yemek|lezzetli yiyecek beğenen yüz|oh oh harika|yüz
 😛|dil çıkarmış yüz|dil dışarıda kalmış|komik|şapşal|yüz
 😜|dil dışardayken göz kırpma|dili dışarda göz kırpma|göz kırpma|haylaz|kışkırtma|şaka|yaramaz|yüz
@@ -107,50 +107,51 @@
 😐|duygusuz|etkilenmemiş|nötr|umurumda değil|yorum yok|yüz
 😑|ifadesiz yüz|ifadesizlik|kıskanç|umurumda değil|yorum yok|yüz
 😶|ağız|ağzı olmayan yüz|ifadesiz|sakin|sesi kesilmiş|sessiz|sır|suskun|yüz
-🫥|bilinmez|depresif|eh|endişe|gizlenme|gizli|görünmez|içe dönük|ifade|kaybolma|kaygılı|neyse|noktalı çizgili yüz|yüz ifadesi
+🫥|bilinmez|depresif|endişe|gizlenme|gizli|görünmez|içe dönük|kaybolma|kaygılı|noktalı çizgili yüz|yüz ifadesi
 😶‍🌫️|bulutlardaki kafa|bulutlardaki yüz|dalgın|sisler arasındaki yüz
 😏|hin|imalı gülümseme|kuşkucu|sinsi|yapmacık gülümseme|yapmacık gülümseyen yüz|yüz
 😒|canı sıkkın|canım sıkıldı|garip|keyifsiz|mutsuz|neyse|sıkılmış|yüz
-🙄|bana ne|banane|beni ilgilendirmez|bilemiyorum|göz devirme|gözlerini deviren yüz|her neyse|hmm|neyse|yani|yüz ifadesi
+🙄|bana ne|banane|beni ilgilendirmez|bilemiyorum|göz devirme|gözlerini deviren yüz|her neyse|hmm|neyse|yani|yüz
 😬|dişçi|dişlerini gösteren yüz|dişlerini sıkmak|endişeli|tedirgin|yüzünü ekşitme
-😮‍💨|bitik|duman|fısıldama|iç çekme|ıslık|nefes veren yüz|nefes verme|off|rahatlama|sızlanma|üfleme|yorgun|yüz ifadesi
+😮‍💨|bitik|duman|fısıldama|iç çekme|ıslık|nefes verme|off|rahatlama|sızlanma|üfleme|yorgun
 🤥|pinokyo|yalan söyleme|yalan söyleyen yüz|yüz
-🫨|deprem|olamaz|panik|sallama|sallanan yüz|sallanma|sersemlik|şok|sürpriz|titreme|titreşim|titreyen yüz|yüz
+🫨|deprem|olamaz|panik|sallama|sallanma|sersemlik|şok|sürpriz|titreme|titreşim|titreyen yüz|yüz
 🙂‍↔️|hayır|sallama|yatay olarak sallanan yüz
 🙂‍↕️|dikey olarak sallanan yüz|evet|onay
 😌|huzur|rahatlamış|yüz
 😔|dargın|düşünceli|gemileri batmış|karamsar|üzgün|yüz
 😪|ağlayan yüz|uykulu yüz|yorgun|yüz
 🤤|ağzı sulanmış|salya akıtan yüz|salya akıtma|yüz
-😴|esnemek|geç oldu|iyi geceler|iyi uykular|kestirme|şekerleme|tatlı rüyalar|uyku saati|uykulu|uykum geldi|uyumak|uyuyan yüz|yatak|yatıyorum|yatmak|yorgun|yüz ifadesi|zzz
+😴|esnemek|iyi geceler|iyi uykular|şekerleme|tatlı rüyalar|uykulu|uyumak|yatak|yatmak|yorgun|zzz
+🫩|gözlerinin altı torbalı yüz|tükenmiş|uykulu|yorgun
 😷|grip|hasta|maskeli yüz|nezle|rahatsız|soğuk|tıbbi maske|yüz
 🤒|ağzında termometre olan yüz|ateş|grip|hasta|nezle|termometre|yüz
 🤕|bandaj|kafası sarılı yüz|yaralı|yüz
 🤢|iğrenç|istifra|kusmak üzere olan yüz|midesi bulanmış|yüz
 🤮|hasta|istifra|kusan yüz|kusmak|kusmuk|surat
 🤧|çok yaşa|grip|hapşıran yüz|hapşırma|hasta|nezle|yüz
-🥵|ateşi çıkmış|ateşlenmek|bitmek|çarpıntı|çok sıcak|hararet|kırmızı surat|kırmızı yüz|kızarmış yüz|nefes nefese|sıcak çarpması|sıcaklamak|surat|terlemek|tükenmek|yorgunluktan ölmek|yüz ifadesi
-🥶|buz gibi|buz kesme|donma|kış|mavi surat|morarmış yüz|sıfırın altı|soğuktan donmak|titremek|üşümek|üşümüş yüz
-🥴|akşamdan kalma|alkollü|baş dönmesi|çakırkeyif|kaymış gözler|şapşal|sarhoş yüz|şaşı|sersemlemiş|titreyen ağız|yamuk ağız|yamulmak|yüz ifadesi
+🥵|ateşlenmek|çarpıntı|hararet|kızarmış yüz|nefes nefese|sıcak çarpması|terleme|tükenmek|yorgun
+🥶|buz gibi|buz kesme|donma|kış|mavi surat|morarmış yüz|sıfırın altı|soğuktan donmak|titremek|üşümek
+🥴|akşamdan kalma|alkollü|baş dönmesi|çakırkeyif|kaymış gözler|sarhoş|şaşı|sersemlemiş|yamuk ağız|yamulmak|yüz ifadesi
 😵|başı dönen|baygınlık|hasta|sersemlemiş|yüz
-😵‍💫|aklı karışık|aman tanrım|başım döndü|gülen yüz|hipnotize|inanamıyorum|kafası bulanık|kafası karışık|mide bulantısı|sarmal gözlü yüz|sersem|sıkıntı|yüz ifadesi
+😵‍💫|aklı karışık|aman tanrım|başım döndü|gülen yüz|hipnotize|inanamıyorum|kafası bulanık|kafası karışık|mide bulantısı|sersem|sıkıntı|yüz ifadesi
 🤯|aklını başından almak|patlayan kafa|şaşırmış|şok olmuş|şoke|surat
 🤠|kadın kovboy|kovboy şapkalı yüz|kovboy şapkası yüzü|şapka|yüz
-🥳|doğum günü|eğlence|eğlenmek|iyi ki doğdun|konfeti|kutlamak|mutlu yıllar|neşeli|oley|parti düdüğü|parti şapkası|partide eğlenen yüz|şapka|yaşasın|yılbaşı
-🥸|ajan|bıyık|burun|casus|gizlenmiş yüz|gizli|gözlük|kalın kaşlar|kimliğini gizlemek|kimliğini gizleyen|kişi|kılık değiştirmek|maskeli|yüz ifadesi
+🥳|doğum günü|eğlence|iyi ki doğdun|konfeti|kutlama|mutlu yıllar|neşeli|oley|partide eğlenen yüz|şapka|yılbaşı
+🥸|ajan|bıyık|burun|casus|gözlük|kimliğini gizlemek|kılık değiştirmek|maskeli|yüz ifadesi
 😎|cool|gülümseme|güneş gözlüğü|güneş gözlükleriyle gülümseme|güneş gözlüklü gülümseme|havalı|janti|kanka|kanki|yüz
 🤓|akıllı|bilgili|bilmiş|çalışkan|gözlüklü|inek öğrenci|ukala|yüz|zeki
 🧐|havalı|kendini beğenmiş|klas|surat|tek cam gözlüklü yüz|varlıklı|zengin
 😕|bilmiyorum|emin olmayan|kafası karışık yüz|kafası karışmış|yüz
-🫤|eh|hayal kırıklığına uğramış|hüsran|ifade|kararsız|kırgın|meh|memnuniyetsiz|şüpheli yüz|yamuk ağızlı yüz|yüz ifadesi
+🫤|eh|hayal kırıklığı|hüsran|ifade|kararsız|kırgın|meh|memnuniyetsiz|şüpheli yüz|yüz ifadesi
 😟|endişeli|gergin|yüz
 🙁|asık surat|biraz asık surat|endişeli|yüz
 😮|ağız|ağzı açık yüz|şaşkın|şok|süpriz|yüz
 😯|şaşırmış|şaşkın yüz|şok olmuş|yüz
 😲|afallamış|şaşkın|şoke olmuş|tamamen şoke olmuş|yüz
 😳|kızarmış ve şaşkın yüz|şaşırmış|şaşkınlık içinde|şok|tuhaf|yüz
-🥺|acıklı bakışlar|af dilemek|gözleri dolmak|koca göz|lütfen|merhamet|pişmanlık|üzgün|üzülmek|yalvaran gözler|yalvaran yüz|yalvarırım|yalvarmak|yüz ifadesi
-🥹|ağlamaklı|direnme|duygusal|gözleri dolmak|gözleri dolmuş yüz|gözyaşı|gözyaşlarını tutan yüz|gurur|ifade|kızgın|mutlu|sevinç gözyaşları|sulugöz|üzgün|yüz ifadesi
+🥺|acıklı bakışlar|af dilemek|gözleri dolmak|koca göz|lütfen|merhamet|pişmanlık|üzgün|yalvaran gözler|yalvarırım|yüz ifadesi
+🥹|ağlamaklı|direnme|duygusal|gözyaşı|gurur|ifade|kızgın|mutlu|sevinç gözyaşları|sulugöz|üzgün|yüz ifadesi
 😦|açık ağızlı hoşnutsuz yüz|ağzı açık|boş bulunmuş|hoşnutsuz|korkmuş|yüz
 😧|acı çeken|kederli|mutsuz|şaşkın|yüz
 😨|endişeli|korkmuş|korkulu|yüz
@@ -165,7 +166,7 @@
 😓|baş ağrısı|endişeli|soğuk terli yüz|yüz
 😩|acıkmış|çok yorgun|hayır|olamaz|pişman|uykulu|yorgun yüz|yorulmuş|yüz
 😫|hapşuran yüz|perişan|pişman|üzgün|yorgun|yüz
-🥱|esnemek|esneyen yüz|gece|iyi geceler|iyi uykular|şekerleme|sıkıcı|sıkıldım|sıkılmış|uykulu|uykusuz|uyuklama|uyumak|yatıyorum|yatmak|yorgun|yüz ifadesi|zzz
+🥱|esneme|iyi geceler|iyi uykular|sıkıcı|sıkılmış|uykulu|uykusuz|uyuklama|uyumak|yatmak|yorgun|zzz
 😤|ben kazandım yüzü|burnundan soluyan yüz|kızgın|mutsuz|sinirli|yüz|zafer
 😡|deli gibi|kırmızı somurtkan yüz|kırmızı yüz|öfkeli|somurtkan|yüz
 😠|deli gibi|kızgın|mutsuz|öfkeli|yüz
@@ -241,7 +242,7 @@
 🫴|avuç içi yukarı bakan el|çağırmak|çağrı|davet|el etmek|el uzatmak|gel|sunmak|teklif|yakalamak|yardım
 🫷|bekletme|çakma|durdurma|itme|reddetme|sola iten el
 🫸|bekletme|çakma|durdurma|itme|reddetme|sağa iten el
-👌|anlaştık|budur|el|harika|inanılmaz|işaret|işte bu|kıstırma|leziz|mükemmel|müthiş|okey|süper|tam olarak|tamam el işareti|tamam işareti|tamamdır|yes
+👌|anlaştık|el|harika|işaret|işte bu|mükemmel|müthiş|ok|süper|tam olarak|tamamdır
 🤌|bravo|çok güzel|el hareketleri|harika|kıstırma hareketi yapan parmaklar|lezzetli|parmaklar
 🤏|azıcık|bir tutam|biraz|kıstırma hareketi yapan el|kıstırma hareketi yapan parmaklar|küçük|parmaklar
 ✌️|barış|el|oleey|zafer eli|zafer işareti
@@ -284,7 +285,7 @@
 🧠|akıllı|beyin|zeka|zeki
 🫀|anatomi|kalp atışı|kan|kardiyoloji|kırmızı|merkez|nabız|organ
 🫁|akciğer|beden|ciğerler|nefes almak|organ|soluk|solumak|solunum|vücut
-🦷|ağız sağlığı|ağrı|azı dişi|beyaz|diş ağrısı|diş hekimi|diş perisi|dişçi|inci gibi|köpek dişi|süt dişi
+🦷|ağız|ağrı|azı dişi|beyaz|diş ağrısı|diş hekimi|diş perisi|dişçi|inci gibi|köpek dişi|süt dişi
 🦴|iskelet|kemik|köpek kemiği|mama
 👀|bakmak|görmek|gözcü|gözetlemek|gözler|yüz
 👁️|beden|göz|kahverengi göz
@@ -313,16 +314,16 @@
 🙎|darılan kişi|darılma|hareket|hayal kırıklığı|kişi|kırgın|küsme|mimik|öfkeli|somurtma|surat asma|üzgün
 🙎‍♂️|adam|darılan erkek|darılma|erkek|mimik
 🙎‍♀️|bayan|darılan kadın|darılma|kadın|mimik
-🙅|asla|hareket|hayır hareketi|insan|iyi değil|izin vermiyorum|izinsiz|kişi|olmaz|vücut|yasak|yüz
+🙅|asla|hareket|hayır|insan|iyi değil|izin vermiyorum|izinsiz|kişi|olmaz|vücut|yasak|yüz
 🙅‍♂️|el|erkek|hareket|hayır hareketi yapan erkek|insan|iyi değil|yasak|yok
 🙅‍♀️|bayan|el|hareket|hayır hareketi yapan kadın|iyi değil|kadın|yasak
 🙆|aman tanrım|egzersiz|el|hareket|kişi|kocaman|oldu|tamam hareketi|vücut|yüz
 🙆‍♂️|adam|aman allah|aman tanrım|egzersiz|eller yukarı|erkek|hareket|insan|tamam hareketi yapan erkek
 🙆‍♀️|bayan|el|hareket|kadın|tamam hareketi yapan kadın
-💁|alaycı|bilgilendirme|dedikodu|elini yana yatırma|keyfin bilir|kişiler|neyse|saçını savurma|sen bilirsin|umurumda değil|yardım
+💁|alaycı|bilgilendirme|dedikodu|elini yana yatırma|keyfin bilir|kişiler|neyse|saçını savurma|sen bilirsin|umurumda değil
 💁‍♂️|adam|bilgi|dedikodu|elini yana yatıran erkek|erkek|insan|küstah|sarkastik|yana yatmış el
 💁‍♀️|bayan|elini yana yatıran kadın|kadın|küstah|yana yatmış el
-🙋|ben|burada|el kaldıran kişi|el kaldırma|elini kaldırma|hareket|kalkan el|kişi|merhaba|mutlu|selam|soru|söz isteme|vücut
+🙋|ben|burada|el kaldırma|hareket|kalkan el|kişi|merhaba|selam|soru|söz isteme
 🙋‍♂️|adam|el hareketi|el kaldırma|elini kaldıran erkek|erkek|hareket|insan|soru
 🙋‍♀️|bayan|el kaldırma|elini kaldıran kadın|hareket|kadın
 🧏|duyma|erişilebilirlik|işitme engelli kişi|kulak
@@ -331,11 +332,11 @@
 🙇|affetme|bağışlama|başını öne eğme|eğilme|hareket|kişi|merhamet|özür dilerim|üzgünüm|yakarma|yalvarma
 🙇‍♂️|adam|baş eğme|başını öne eğen erkek|erkek|hareket|lütuf|özür
 🙇‍♀️|baş eğme|başını öne eğen kadın|bayan|hareket|kadın|lütuf|özür
-🤦|aman tanrım|avuç|çileden çıkma|inanamıyorum|inanmama|inanmıyorum|kişi|kızgınlık|öfke|olamaz|şok|vücut|yüzünü eliyle kapama
-🤦‍♂️|adam|aman tanrım|çileden çıkma|eliyle yüzünü kapatan erkek|erkek|inanamıyorum|inanmama|kişi|öfke|olamaz|sinir|utancından eliyle yüzünü kapatma|utanma
-🤦‍♀️|aman tanrım|bayan|çileden çıkma|eliyle yüzünü kapatan kadın|inanamıyorum|inanmama|kadın|öfke|olamaz|pişman|sinir|utanç|utancından eliyle yüzünü kapatma
+🤦|aman tanrım|çileden çıkma|inanamıyorum|inanmama|inanmıyorum|kızgınlık|öfke|olamaz|şok|yüzünü eliyle kapama
+🤦‍♂️|adam|aman tanrım|çileden çıkma|eliyle yüzünü kapatan erkek|erkek|inanamıyorum|inanmama|öfke|olamaz|sinir|utancından eliyle yüzünü kapatma|utanma
+🤦‍♀️|aman tanrım|çileden çıkma|eliyle yüzünü kapatan kadın|inanamıyorum|inanmama|kadın|öfke|olamaz|sinir|utanç|utancından eliyle yüzünü kapatma
 🤷|bilemem|bilmeme|bilmiyorum|ilgisizlik|kararsız|kişi|ne bileyim|ne yapalım|omuz silkme|sanırım|vücut
-🤷‍♂️|adam|belki|bilmem|cahillik|cehalet|erkek|her neyse|ilgisizlik|kişi|kuşku|omuz silken erkek|omuz silkme|sanırım|şüphe|vücut
+🤷‍♂️|adam|belki|bilmem|erkek|her neyse|ilgisizlik|kişi|kuşku|omuz silken erkek|omuz silkme|sanırım|şüphe
 🤷‍♀️|bayan|belki|bilmem|cahillik|cehalet|her neyse|ilgisizlik|kadın|kişi|kuşku|omuz silken kadın|omuz silkme|sanırım|şüphe|vücut
 🧑‍⚕️|doktor|hasta bakıcı|hemşire|sağlık çalışanı|sağlık personeli|terapist
 👨‍⚕️|adam|doktor|erkek sağlık çalışanı|hastabakıcı|meslek|sağlık|terapist
@@ -518,8 +519,8 @@
 🚵|antrenman|atletik|bisikletçi|dağ bisikletçisi|kişi|spor|sürüş|vücut
 🚵‍♂️|adam|bisiklet sürme|bisikletçi|dağ bisikleti süren erkek|erkek
 🚵‍♀️|bayan|bisiklet sürme|bisikletçi|dağ bisikleti süren kadın|kadın
-🤸|aktif|birey|jimnastik|kişi|mutlu|neşe|perende atan kadın|perende atan kişi|sevinç|spor|vücut|yanlamasına takla
-🤸‍♂️|adam|aktif|çember hareketi|erkek|heyecanlı|jimnastik|kişi|mutlu|neşe|perende atan erkek|spor|vücut
+🤸|aktif|birey|jimnastik|perende atan kişi|spor|yanlamasına takla
+🤸‍♂️|adam|çember hareketi|erkek|jimnastik|kişi|perende atan erkek|spor
 🤸‍♀️|aktif|bayan|çember hareketi|heyecanlı|jimnastik|kadın|kişi|mutlu|neşe|oyun|perende atan kadın|sevinç|spor
 🤼|birey|dövüş|düello|güreş minderi|güreşçilik|güreşen kişiler|kişi|spor|vücut
 🤼‍♂️|adam|antrenman|dövüş|düello|er meydanı|erkek|güreş yapan erkek|kişi|kırkpınar|spor
@@ -537,7 +538,7 @@
 🧘‍♂️|lotus pozisyonundaki erkek|meditasyon|yoga
 🧘‍♀️|lotus pozisyonundaki kadın|meditasyon|yoga
 🛀|banyo yapan kişi|küvet
-🛌|gece|insan|iyi geceler|iyi uykular|kestirme|öğle uykusu|otel|uyku saati|uyumak|yastık|yatakta yatan kişi|yatan insan|yatıyorum|yatmak|zzz
+🛌|gece|insan|iyi geceler|iyi uykular|kestirme|otel|uyku saati|uyumak|yatan insan|yatmak|zzz
 🧑‍🤝‍🧑|çift|el ele tutuşan insanlar|kişi|tutmak|tutuşan eller
 👭|arkadaş|çift|dost|el ele tutuşan iki kadın|el ele tutuşan kadınlar|kadınlar|kanki|kişiler|kızkardeşler
 👫|çift|el ele tutuşan erkek ve kadın|el ele tutuşan kız ve erkek|erkek|kadın|kişiler|sevgili
@@ -554,6 +555,7 @@
 🧑‍🧒|aile|çocuk|yetişkin
 🧑‍🧒‍🧒|aile|çocuk|yetişkin
 👣|ayak izi|gövde|iz
+🫆|adli tıp|güvenlik|kimlik|parmak izi
 🐵|hayvan|komik|maymun yüzü|meraklı maymun|muz|neşeli|yüz
 🐒|hayvan|maymun|muz|orman
 🦍|goril|hayvan
@@ -663,6 +665,11 @@
 🐚|deniz kabuğu|deniz sesi|hayvan|midye|okyanus|spiral deniz kabuğu
 🪸|canlı|dalış|deniz|doğa|hayvan|iklim değişikliği|mercan|okyanus|resif|su altı
 🪼|ahh|akvaryum|çarpma|denizanası|dokunaç|hayvan|iğne|medüz|okyanus|omurgasız|plankton|sokma|yanma
+🦀|burç|deniz|ıstakoz|yengeç
+🦞|bisque|deniz ürünü|hayvan|ıstakoz|kabuklu|kırmızı|kıskaç
+🦐|deniz mahsulü|kabuklu deniz hayvanı|karides|küçük|okyanus|yiyecek
+🦑|mürekkep balığı|okyanus|yiyecek|yumuşakçalar sınıfı
+🦪|dalma|inci|istiridye
 🐌|böcek|hayvan|salyangoz|sümüklü böcek|yavaş
 🦋|böcek|kelebek|şirin
 🐛|böcek|hayvan|kırkayak|tırtıl
@@ -675,14 +682,14 @@
 🕷️|böcek|örümcek
 🕸️|örümcek ağı
 🦂|akrep|burç|hayvan|iğne|zehir
-🦟|ateş|böcek|hastalık|hayvan|ısırmak|kaşıntı|malarya|sinek ısırığı|sivrisinek|sıtma|virüs|vızıltı
+🦟|ateş|böcek|hastalık|sivrisinek|sıtma|virüs
 🪰|at sineği|böcek|çürüme|hastalık|hayvan|karasinek|kurt sineği|larva|sinek|uçmak
 🪱|hayvan|kurtçuk|parazit|solucan|sürüngen
 🦠|amip|bakteri|bilim|deney|hastalık|hücre|laboratuvar|mikrop|tek hücreli|virüs
 💐|aşk|buket|çiçek|doğum günü|gül|romantizm
 🌸|bahar|çiçek izleme|kiraz çiçeği
 💮|beyaz çiçek|çiçek damgası|damga|iyi çalışma damgası
-🪷|bitki|budizm|çiçek|hindistan|hinduizm|huzur|lotus|namaste|nilüfer|saflık|sakin|vietnam|yoga
+🪷|bitki|budizm|çiçek|hinduizm|huzur|lotus|namaste|nilüfer|saflık|sakin|yoga
 🏵️|bitki|çiçek rozet|gülce|sarı çiçek
 🌹|aşk|bitki|çiçek|gül|kırmızı gül
 🥀|boynu bükük|çiçek|gül|kırgın|kırmızı gül|solmuş|üzgün
@@ -706,6 +713,7 @@
 🪹|boş yuva|dal|doğa|ev|kuş|yuva
 🪺|dal|doğa|hayvan|huzur|kuş yuvası|yavru kuş|yumurta bulunan yuva|yuva
 🍄|bitki|kırmızı mantar|mantar|masal
+🪾|çorak|kış|kurak|yapraksız ağaç
 🍇|gıda|meyve|salkım|üzüm
 🍈|gıda|kavun|meyve|meze|rakı|yemek
 🍉|gıda|karpuz|meyve
@@ -744,6 +752,7 @@
 🫚|baharat|bira|bitki|çeşni|doğal|kök|sağlık|şifalı|yiyecek|yumru|zencefil
 🫛|baklagil|barbunya|bezelye|edamame|fasulye sırığı|kabuklu bezelye|sebze|vejetaryen
 🍄‍🟫|doğa|gıda|kahverengi mantar|mantar|pizza malzemesi|portobello|sebze|şitaki|trüf|yiyecek
+🫜|bahçe|kök|pancar|sebze|turp
 🍞|ekmek dilimi|gıda|kahvaltı|restoran|yemek
 🥐|ay çöreği|ekmek|fransız|gıda|kruvasan|pastane|yiyecek
 🥖|baget|ekmek|fransız|gıda|yiyecek
@@ -771,7 +780,7 @@
 🍳|gıda|kahvaltı|kızartma tavası|pişirme|restoran|sahanda yumurta|tavada yumurta|yemek|yiyecek|yumurta
 🥘|gıda|güveç|kahvaltı|krep tavası|küçük|menemen|paella|sahanda yemek|tava|yemek|yiyecek
 🍲|gıda|restoran|tencere yemeği|yahni|yemek tenceresi|yiyecek
-🫕|çikolata|çubuk|dağ|erimiş|fondü|isviçre|kap|kayak|peynir|raklet|yemek|yiyecek
+🫕|çikolata|çubuk|erimiş|fondü|kap|kayak|peynir|raklet|yemek|yiyecek
 🥣|çorba|gıda|kahvaltı|kase|kaşıklı kase|pirinç lapası|tahıl gevreği|yemek
 🥗|gıda|sağlıklı|salata|yemek|yeşil|yiyecek
 🍿|gıda|mısır|patlamış mısır|sinema
@@ -795,11 +804,6 @@
 🥟|empanada|gıda|gyōza|hamur köftesi|haşlanmış içli hamur|jiaozi|mantı|pierogi|potsticker
 🥠|fal kurabiyesi|gıda|içinden fal çıkan çin kurabiye|kehanet|şans kurabiyesi|talih kurabiyesi
 🥡|çin yemeği|eve servis|gıda|kutu|paket yemek|yemek|yiyecek paketi
-🦀|burç|deniz|ıstakoz|yengeç
-🦞|bisque|deniz ürünü|hayvan|ıstakoz|kabuklu|kırmızı|kıskaç
-🦐|deniz mahsulü|kabuklu deniz hayvanı|karides|küçük|okyanus|yiyecek
-🦑|mürekkep balığı|okyanus|yiyecek|yumuşakçalar sınıfı
-🦪|dalma|inci|istiridye
 🍦|dondurma külahı|gıda|krema|külah|restoran|vanilyalı dondurma|yumuşak dondurma
 🍧|buz|meyveli|restoran
 🍨|buz|dondurma|gıda|krema|kup|restoran|tatlı
@@ -807,7 +811,7 @@
 🍪|çikolatalı kurabiye|cookie|gıda|kurabiye|restoran
 🎂|dilek|doğum günü pastası|gıda|iyi ki doğdun|kek|krema|kutlama|mum|mutlu yıllar|nice senelere|parti|pasta|tatlı|üflemek|yaş günü|yemek|yiyecek
 🍰|dilim pasta|doğum günü|gıda|pasta dilimi|restoran
-🧁|cupcake|fırın|kapkek|kek|krema|muffin|pastane|pembe krema|şekerli|tatlı|top kek|yemek
+🧁|cupcake|fırın|kapkek|kek|krema|muffin|pasta|pembe krema|şekerli|tatlı|top kek|yemek
 🥧|elmalı pay|gıda|pasta|pay|poğaça|şeftalili pay|tart|tatlı|yemek
 🍫|bar|çikolata barı|gıda|restoran|tatlı
 🍬|bayram|restoran|şekerleme
@@ -1204,6 +1208,7 @@
 🪘|conga|davul çalmak|enstrüman|eşya|müzik aleti|perküsyon|ritim|ritm|tempo|tumba|uzun davul|vurmak|vuruş
 🪇|alet|çaça|çıngırak|dans|enstrüman|marakas|müzik aleti|nesne|parti|perküsyon|sallamalı|vurmalı
 🪈|ahşap üflemeli|bando|blokflüt|boru|enstrüman|fife|fifre|flüt|kaval|müzik|nefesli|orkestra|recorder|üflemeli
+🪉|arp|aşk|enstrüman|eros|müzik|orkestra
 📱|cep telefonu|iphone|mobil telefon|telefon
 📲|çağrı yapmak|cep telefonu|mobil telefon|ok işaretli cep telefonu|telefon
 ☎️|kırmızı telefon|telefon
@@ -1257,14 +1262,14 @@
 🔖|defter|işaret|kitap|not|yer işareti
 🏷️|etiket
 💰|çanta|dolar çantası|para çuvalı|para torbası|zengin
-🪙|altın|avro|bozuk para|dolar|eşya|euro|gümüş|hazine|jeton|madeni para|metal|para|sikke|zengin
+🪙|altın|avro|bozuk para|dolar|gümüş|hazine|jeton|madeni para|metal|para|sikke|zengin
 💴|banknot|döviz|para|yen
 💵|banknot|dolar|döviz|fatura|para
 💶|avro|banknot|döviz|euro|fatura|para
 💷|banknot|döviz|para|sterlin
 💸|banka|banknot|kanatlı para|para|uçan banknot
 💳|kart|kredi kartı
-🧾|bakiye|belge|defter tutma|dekont|ekstre|evrak|fatura|finans|fiş|hesap|irsaliye|kağıt|kanıt|kayıt|makbuz|maliyet|muhasebe|senet
+🧾|belge|defter tutma|dekont|ekstre|evrak|fatura|fiş|hesap|kanıt|maliye|muhasebe|senet
 💹|banka|grafik|para|piyasa|yen simgeli artış grafiği|yukarı giden grafik|yukarı yönlü
 📧|e-posta|iletişim|mektup|posta
 📨|alınan posta|e-posta|gelen|iletişim|mektup|posta|zarf
@@ -1318,7 +1323,7 @@
 🛠️|alet|çekiç ve ingiliz anahtarı|çekiç ve somun anahtarı|ingiliz anahtarı
 🗡️|bıçak|hançer|silah
 💣|bomba|çizgi roman|duygu
-🪃|aborjin|atmak|avustralya|boomerang|bumerang|eşya|fırlatmak|geri gelmek|geri tepme|oyun|sekme|silah|tepki
+🪃|aborjin|atmak|boomerang|bumerang|eşya|fırlatmak|geri gelmek|geri tepme|oyun|sekme|silah|tepki
 🏹|araç|burç|ok ve yay|okçu|silah|yay
 🛡️|kalkan|silah
 🪚|alet|eşya|kereste|kesmek|marangoz|odun|testere
@@ -1334,8 +1339,9 @@
 🧰|alet çantası|alet kutusu|çanta|ingiliz anahtarı|kırmızı|kutu|onarmak|sandık|tamirat|tamirci
 🧲|at nalı|çekim|çekmek|elektrik yükü|eş kutuplar|manyetik|mıknatıs|pozitif negatif|zıt kutuplar
 🪜|adım|aşağı|ayaklı merdiven|basamak|çıkmak|eşya|merdiven|tırmanış|tırmanmak|yukarı
-🧪|beher|bilim adamı|bilim insanı|bilim kadını|biyoloji|deney tüpü|deney yapmak|doktor|fizik|genetik|kimyacı|kimyager|laboratuvar|test|tüp|yeşil sıvı
-🧫|bakteri|bilim|biyolog|biyoloji|damlatmak|deney tüpü|kimya|kültür|laboratuvar|mikrop|petri kabı|tıp|virüs
+🪏|çukur|kazı|kazmak|kürek
+🧪|bilim|deney tüpü|kimyacı|laboratuvar
+🧫|bakteri|biyolog|biyoloji|kültür|laboratuvar|petri kabı
 🧬|biyolog|biyoloji|dna|evrim|genetik|sarmal|yaşam
 🔬|alet|bilim|labrotuar|mikroskop|test
 🔭|alet|teleskop|uzay gözlemleme
@@ -1477,6 +1483,7 @@
 ➰|döngü|dönüş|kıvrık döngü
 ➿|çift kıvrık döngü|japonya|kıvrık döngü|ücretsiz numara
 〽️|bölüm değiştirme işareti|işaret|parça değiştirme işareti
+🫟|boya|dökmek|holi|lekelemek|sıçratmak
 🔠|abcd|büyük harfler|latin büyük harfleriyle giriş
 🔡|abcd|alfabe|küçük harfler|latin küçük harfleriyle giriş
 🔢|1234|sayı girişi|sayılar

+ 18 - 11
app/assets/emojis/search-index/uk.csv

@@ -82,7 +82,7 @@
 😇|ангел|безневинність|казка|німб|обличчя|посмішка|усмішка|фантазія|янгол
 🥰|закоханість|кохання|любов|ніжність|обличчя|сердечка|серця|симпатія|усмішка|я кохаю тебе
 😍|з задоволенням|з радістю|закоханий|зворушений|кохання|любов|обличчя|очі|посмішка|серце|хочу
-🤩|веселий|виграш|зірка|обличчя|очі-зірочки|посмішка|щастя
+🤩|веселий|виграш|зірка|обличчя|очі|посмішка|радість|усмішка|щастя
 😘|обличчя|повітряний|поцілунок|серце|цілунок|цілую|цьом
 😗|кохання|обличчя|побачення|поцілунок|флірт|цілувати|цілує|цьом
 ☺️|задоволений|обличчя|посмішка|спокійний|усмішка
@@ -113,16 +113,17 @@
 😒|все одно|заздрість|невдоволене|незадоволений|нещасливий|нудно|обличчя|розчарований|фу
 🙄|байдуже|закочувати|о боже|обличчя|отакої|оце так|очі
 😬|гримаса|дантист|дивно|зуби|капець|кривляння|крінж|посмішка|скривлене|стоматолог|усмішка
-😮‍💨|вдих|видихає|виснажений|втомлений|обличчя, що видихає|полегшення|свист|смайл|стогін|туман|шепотіння|що видихає
+😮‍💨|вдих|видих|виснажений|втомлений|обличчя|полегшення|свист|смайл|стогін|туман|шепотіння
 🤥|брехло|брехня|брехун|збрехав|неправда|обличчя|обман|піноккіо
-🫨|боже мій!|вібрація|землетрус|несподіванка|обличчя|ошелешення|паніка|смайл|сюрприз|тремтіння|тремтливе обличчя|шок
-🙂‍↔️|заперечення|заперечливе хитання головою
+🫨|боже|вібрація|землетрус|несподіванка|обличчя|ошелешення|паніка|смайл|сюрприз|тремтіння|шок
+🙂‍↔️|відмова|заперечення|нєа|нізащо|хитав|хитала|хитати
 🙂‍↕️|кивання головою|ствердження
 😌|дзен|задоволення|обличчя|полегшення|спокій
 😔|задумливий|замислене обличчя|занепокоєння|засмучений|обличчя|роздуми|розчарований
 😪|втомлениий|засмучений|заспане обличчя|обличчя|сон
 🤤|голодний|обличчя|пускає слину|слина
 😴|втома|добраніч|заснув|ніч|обличчя|сонний|спати|спить|стомлений
+🫩|виснаження|замореність|мішки|нудьга|обличчя|очі|пізно|сонливість|утома
 😷|вірус|застуда|інфекція|лікар|маска|медицина|обличчя в медичній масці|хворий|холодний
 🤒|обличчя з термометром|термометр|хворий
 🤕|болить|голова|обличчя|пов’язка|поранений|рана|травма
@@ -170,7 +171,7 @@
 😡|гнів|дується|злий|насуплений|невдоволений|нещасний|обличчя|сердитий|червоний
 😠|злий|обличчя|сердите обличчя|сердитий
 🤬|гнів|лайка|лаятися|матюк|не скажу|обличчя|сердитий|суворий|цензура
-😈|диявольська посмішка|зла посмішка|казка|монстр|обличчя|посмішка|ріжки|усміхнене обличчя з рогами|фантазія
+😈|демон|диявольська посмішка|з рогами|зла посмішка|казка|монстр|обличчя|посмішка|ріжки|фантазія|фіолетовий
 👿|демон|диявол|дідько|з рогами|обличчя|фантазія|чортеня
 💀|казка|монстр|обличчя|смерть|тіло|череп
 💩|екскременти|жарт|кака|лайно|пупу|усміхнена купа лайна
@@ -192,7 +193,7 @@
 😾|кіт|котяча|морда|насуплений|сердита|сердитий кіт
 🙈|бачити|заборонено|зло|мавпа, що не бачить|не бачу зла|обличчя|що не бачить зла
 🙉|заборонено|зло|мавпа, що не чує|не чую зла|обличчя|чути|що не чує зла
-🙊|говорити|заборонено|зло|мавпа, що не говорить|мовчу|не говорю лихого|не скажу|обличчя|ой|секрет|що не висловлює зла|що не говорить
+🙊|говорити|заборонено|зло|мавпа|мовчу|не говорю лихого|не скажу|обличчя|ой|секрет|що не висловлює зла|що не говорить
 💌|закоханість|закохансіть|кохання|лист|любовний лист|пошта|серце
 💘|закоханість|купідон|пробите стрілою|серце зі стрілою|серце, пробите стрілою|стріла
 💝|валентин|кохання|серце зі стрічкою|стрічка
@@ -554,6 +555,7 @@
 🧑‍🧒|родина: дорослий і дитина
 🧑‍🧒‍🧒|родина: дорослий і двоє дітей|родина: дорослий і діти
 👣|відбитки|відбиток|нога|одяг|слід|стопи|ступні|тіло
+🫆|безпека|детектив|друк|злочин|ідентифікація|криміналістика|підказка|слід|таємниця
 🐵|мавпа|мавпяча морда|морда мавпи|тварина
 🐒|мавпа|тварина
 🦍|горила|мавпа|тварина
@@ -663,6 +665,11 @@
 🐚|морська мушля|мушля|спіральна мушля|спіральний
 🪸|зміна клімату|корал|море|океан|риф
 🪼|безхребетний|жало|медуза|море|морський|океан|опік|тварина|щупальці
+🦀|зодіак|краб|рак
+🦞|біск|дари моря|клешні|лобстер|морепродукти|омар|раковий суп|тварина|червоний лобстер
+🦐|їжа|креветка|морепродукт
+🦑|їжа|кальмар|молюск
+🦪|мушля|перлина|устриця|устричний
 🐌|павлик-равлик|петрик|природа|равлик|слимак|тварина
 🦋|гарний|комаха|метелик
 🐛|гусінь|комаха|комашина|комашка
@@ -706,6 +713,7 @@
 🪹|гілка|гніздечко|гніздо|гніздування|дім|порожнє гніздо
 🪺|гілка|гніздечко|гніздо з пташиними яйцями|гніздо з яйцями|гніздування|птах|яйце|яйця
 🍄|гриб із шапинкою|мухомор|плодове тіло
+🪾|безлистий|безплідний|гілки|голий|дерево|зима|мертвий|посуха|стовбур
 🍇|виноградина|виноградини|їжа|плід|ягоди
 🍈|диня|їжа|плід|фрукт
 🍉|їжа|кавун|літо|плід
@@ -744,6 +752,7 @@
 🫚|здоровʼя|імбирний|коріння|натуральний|пиво|спеції
 🫛|біб|бобові|горох|горошок|едамаме|зелений|овоч|стручкові|стручок гороху
 🍄‍🟫|вегетаріанська їжа|вегетаріанський|гарнір|гриби|їжа|коричневий гриб|печериця|трюфель|шампіньйон|шиїтаке
+🫜|буряк|веганство|вегетаріанство|їжа|корінь|редька|ріпа|рослина|сад|салат
 🍞|буханець|їжа|паляниця|хлібина
 🥐|булочний виріб|звій півмісяцем|їжа|круасан|пекарня|сніданок|франція|французький
 🥖|багет|булка|випічка|їжа|франція|французький|хліб
@@ -795,11 +804,6 @@
 🥟|вареник|вушко|галушка|їжа|пельмень|пиріжок|пироги
 🥠|печиво з передбаченням|печиво з повідомленням|печиво-пророцтво|пророцтво
 🥡|доставка їжі|їжа|коробка з їжею на винос|коробка з китайською їжею|палички для їжі
-🦀|зодіак|краб|рак
-🦞|біск|дари моря|клешні|лобстер|морепродукти|омар|раковий суп|тварина|червоний лобстер
-🦐|їжа|креветка|морепродукт
-🦑|їжа|кальмар|молюск
-🦪|мушля|перлина|устриця|устричний
 🍦|десерт|м’яке морозиво|м’який|морозиво в ріжку|пломбир|солодкий
 🍧|десерт|лід|льодова стружка|морозиво|солодкий|стружка
 🍨|десерт|їжа|морозиво|солодкий
@@ -1204,6 +1208,7 @@
 🪘|барабан|інструмент|конґа|музика|ритм|ударні|циліндричний барабан
 🪇|вечірка|інструмент|маракас|музика|танець|ударні інструменти|ча-ча-ча
 🪈|блокфлейта|деревʼяні духові інструменти|дудка|інструмент|музика|сопілка|флейта
+🪉|амур|інструмент|купідон|любов|музика|оркестр
 📱|мобільний|стільниковий звʼязок|телефон
 📲|вхідний дзвінок|доступний на мобільному|зателефонуй мені|мобільний телефон зі стрілкою|отримувати|стільниковий|стрілка|телефонувати
 ☎️|телефон
@@ -1334,6 +1339,7 @@
 🧰|інструменти|коробка|механіка|набір інструментів|скриня для інструментів|скриня з інструментами|червона скриня
 🧲|u-подібний|магнетизм|магніт|північний-південний|підкова|позитивний-негативний|притягання|притягувати|тяжіння
 🪜|вилізти|драбина|лізти|перекладина|приставна драбина|сходинка|щабель
+🪏|заступ|копати|могила|поховання|рослина|сад|сніг|совок|яма
 🧪|дослід|експеримент|лабораторія|наука|пробірка|хімік|хімія
 🧫|бактерії|бактерія|біологія|культура|лабораторія|чашка петрі
 🧬|біологія|генетика|днк|еволюція|життя|спіраль
@@ -1477,6 +1483,7 @@
 ➰|закручена петля|закручений|петля
 ➿|закручений|петля|подвійна закручена петля|подвійний
 〽️|значок|частина|японський знак початку частини пісні
+🫟|безлад|бризки|краплі|пляма|рідина|розливати|фарби|холі|чорнило
 🔠|введення великими латинськими літерами|великі|латинські|літери
 🔡|abcd|алфавіт|введення малими латинськими літерами|латинські|літери|малі
 🔢|1234|введення цифрами|цифри

BIN
app/assets/emojis/smileys-0.png


BIN
app/assets/emojis/smileys-1.png


BIN
app/assets/emojis/symbols-0.png


BIN
app/assets/emojis/travel-0.png


+ 4 - 75
app/assets/license.html

@@ -125,53 +125,6 @@ SUCH DAMAGE.</p>
 <p>Licensed under the Apache License, version 2.0 (copy below).</p>
 
 
-<h2>curve25519-donna</h2>
-
-<p>Copyright 2008, Google Inc. All rights reserved.</p>
-
-<p>Redistribution and use in source and binary forms, with or without modification, are permitted
-    provided that the following conditions are met:</p>
-
-<ul>
-    <li>Redistributions of source code must retain the above copyright notice, this list of
-        conditions and the following disclaimer.
-    </li>
-    <li>Redistributions in binary form must reproduce the above copyright notice, this list of
-        conditions and the following disclaimer in the documentation and/or other materials provided
-        with the distribution.
-    </li>
-    <li>Neither the name of Google Inc. nor the names of its contributors may be used to endorse or
-        promote products derived from this software without specific prior written permission.
-    </li>
-</ul>
-
-<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR
-    IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
-    FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-    SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-    OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-    POSSIBILITY OF SUCH DAMAGE.</p>
-
-<p>curve25519-donna: Curve25519 elliptic curve, public key function</p>
-
-<p>http://code.google.com/p/curve25519-donna/</p>
-
-<p>Adam Langley agl@imperialviolet.org</p>
-
-<p>Derived from public domain C code by Daniel J. Bernstein djb@cr.yp.to</p>
-
-<p>More information about curve25519 can be found here http://cr.yp.to/ecdh.html</p>
-
-<p>djb's sample implementation of curve25519 is written in a special assembly language called qhasm
-    and uses the floating point registers.</p>
-
-<p>This is, almost, a clean room reimplementation from the curve25519 paper. It uses many of the
-    tricks described therein. Only the crecip function is taken from the sample implementation.</p>
-
-
 <h2>Emoji art supplied by <a href="http://emojione.com">EmojiOne</a></h2>
 
 <p>Licensed under Creative Commons License (CC-BY 4.0).</p>
@@ -240,28 +193,11 @@ SUCH DAMAGE.</p>
 <p>Licensed under the MIT License (copy below).</p>
 
 
-<h2>jnacl</h2>
-
-<p>Copyright (c) 2011, Neil Alexander T. All rights reserved.</p>
-
-<p>Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:</p>
+<h2>Koin</h2>
 
-<ul>
-    <li>Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.</li>
-    <li>Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.</li>
-</ul>
+<p>Copyright (c) 2025 Kotzilla</p>
 
-<p>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
-AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
-INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGE.</p>
+<p>Licensed under the Apache License, version 2.0 (copy below).</p>
 
 
 <h2>libphonenumber</h2>
@@ -423,13 +359,6 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.</p>
 <p>Licensed under the Apache License, version 2.0 (copy below).</p>
 
 
-<h2>TrustKit-Android</h2>
-
-<p>Copyright (c) 2016 Data Theorem, Inc.</p>
-
-<p>Licensed under the MIT License (copy below).</p>
-
-
 <h2>WebRTC</h2>
 
 <p>Copyright (c) 2011, The WebRTC project authors. All rights reserved.</p>
@@ -677,4 +606,4 @@ POSSIBILITY OF SUCH DAMAGE.</p>
 </body>
 
 </html>
->
+

+ 65 - 32
app/build.gradle.kts

@@ -20,9 +20,13 @@
  */
 
 import com.android.build.gradle.internal.api.ApkVariantOutputImpl
+import com.android.build.gradle.internal.tasks.factory.dependsOn
+import config.BuildFeatureFlags
 import config.PublicKeys
 import config.setProductNames
 import org.gradle.api.tasks.testing.logging.TestExceptionFormat
+import org.gradle.kotlin.dsl.lintChecks
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 import utils.*
 
 plugins {
@@ -47,7 +51,7 @@ if (gradle.startParameter.taskRequests.toString().contains("Hms")) {
 /**
  * Only use the scheme "<major>.<minor>.<patch>" for the appVersion
  */
-val appVersion = "6.1.3"
+val appVersion = "6.2.0"
 
 /**
  * betaSuffix with leading dash (e.g. `-beta1`).
@@ -56,7 +60,7 @@ val appVersion = "6.1.3"
  */
 val betaSuffix = ""
 
-val defaultVersionCode = 1087
+val defaultVersionCode = 1095
 
 /**
  * Map with keystore paths (if found).
@@ -74,7 +78,7 @@ android {
     //       make sure to adjust them in `scripts/Dockerfile` as well!
     compileSdk = 35
     buildToolsVersion = "35.0.0"
-    ndkVersion = "25.2.9519653"
+    ndkVersion = "28.2.13676358"
 
     defaultConfig {
         // https://developer.android.com/training/testing/espresso/setup#analytics
@@ -82,9 +86,8 @@ android {
             put("notAnnotation", "ch.threema.app.DangerousTest")
             put("disableAnalytics", "true")
         }
-        minSdk = 21
-        //noinspection OldTargetApi
-        targetSdk = 34
+        minSdk = 24
+        targetSdk = 35
         vectorDrawables.useSupportLibrary = true
         applicationId = "ch.threema.app"
         testApplicationId = "$applicationId.test"
@@ -143,15 +146,13 @@ android {
 
         stringArrayBuildConfigField("ONPREM_CONFIG_TRUSTED_PUBLIC_KEYS", emptyArray())
         booleanBuildConfigField("MD_SYNC_DISTRIBUTION_LISTS", false)
-        booleanBuildConfigField("EDIT_MESSAGES_ENABLED", true)
-        booleanBuildConfigField("DELETE_MESSAGES_ENABLED", true)
-        booleanBuildConfigField("AVAILABILITY_STATUS_ENABLED", false)
+        booleanBuildConfigField("AVAILABILITY_STATUS_ENABLED", BuildFeatureFlags["availability_status"] ?: false)
+        booleanBuildConfigField("REMOTE_SECRETS_SUPPORTED", BuildFeatureFlags["remote_secrets"] ?: false)
 
         // config fields for action URLs / deep links
         stringBuildConfigField("uriScheme", "threema")
         stringBuildConfigField("actionUrl", "go.threema.ch")
         stringBuildConfigField("contactActionUrl", "threema.id")
-        stringBuildConfigField("groupLinkActionUrl", "threema.group")
 
         // The OPPF url must be null in the default config. Do not change this.
         stringBuildConfigField("PRESET_OPPF_URL", null)
@@ -159,7 +160,6 @@ android {
         with(manifestPlaceholders) {
             put("uriScheme", "threema")
             put("contactActionUrl", "threema.id")
-            put("groupLinkActionUrl", "threema.group")
             put("actionUrl", "go.threema.ch")
             put("callMimeType", "vnd.android.cursor.item/vnd.$applicationId.call")
         }
@@ -275,6 +275,10 @@ android {
             stringBuildConfigField("DIRECTORY_SERVER_URL", "https://apip.test.threema.ch/")
             stringBuildConfigField("DIRECTORY_SERVER_IPV6_URL", "https://ds-apip.test.threema.ch/")
             stringBuildConfigField("MEDIATOR_SERVER_URL", "wss://mediator-{deviceGroupIdPrefix4}.test.threema.ch/{deviceGroupIdPrefix8}")
+            stringBuildConfigField("BLOB_SERVER_URL", "https://blobp-{blobIdPrefix}.test.threema.ch")
+            stringBuildConfigField("BLOB_SERVER_IPV6_URL", "https://ds-blobp-{blobIdPrefix}.test.threema.ch")
+            stringBuildConfigField("BLOB_SERVER_URL_UPLOAD", "https://blobp-upload.test.threema.ch/upload")
+            stringBuildConfigField("BLOB_SERVER_IPV6_URL_UPLOAD", "https://ds-blobp-upload.test.threema.ch/upload")
             stringBuildConfigField("AVATAR_FETCH_URL", "https://avatar.test.threema.ch/")
             stringBuildConfigField("APP_RATING_URL", "https://test.threema.com/app-rating/android/{rating}")
             stringBuildConfigField("MAP_STYLES_URL", "https://map.test.threema.ch/styles/threema/style.json")
@@ -305,6 +309,10 @@ android {
             stringBuildConfigField("WORK_SERVER_URL", "https://apip-work.test.threema.ch/")
             stringBuildConfigField("WORK_SERVER_IPV6_URL", "https://ds-apip-work.test.threema.ch/")
             stringBuildConfigField("MEDIATOR_SERVER_URL", "wss://mediator-{deviceGroupIdPrefix4}.test.threema.ch/{deviceGroupIdPrefix8}")
+            stringBuildConfigField("BLOB_SERVER_URL", "https://blobp-{blobIdPrefix}.test.threema.ch")
+            stringBuildConfigField("BLOB_SERVER_IPV6_URL", "https://ds-blobp-{blobIdPrefix}.test.threema.ch")
+            stringBuildConfigField("BLOB_SERVER_URL_UPLOAD", "https://blobp-upload.test.threema.ch/upload")
+            stringBuildConfigField("BLOB_SERVER_IPV6_URL_UPLOAD", "https://ds-blobp-upload.test.threema.ch/upload")
             stringBuildConfigField("AVATAR_FETCH_URL", "https://avatar.test.threema.ch/")
             stringBuildConfigField("APP_RATING_URL", "https://test.threema.com/app-rating/android-work/{rating}")
             stringBuildConfigField("MAP_STYLES_URL", "https://map.test.threema.ch/styles/threema/style.json")
@@ -394,6 +402,10 @@ android {
             stringBuildConfigField("WORK_SERVER_URL", "https://apip-work.test.threema.ch/")
             stringBuildConfigField("WORK_SERVER_IPV6_URL", "https://ds-apip-work.test.threema.ch/")
             stringBuildConfigField("MEDIATOR_SERVER_URL", "wss://mediator-{deviceGroupIdPrefix4}.test.threema.ch/{deviceGroupIdPrefix8}")
+            stringBuildConfigField("BLOB_SERVER_URL", "https://blobp-{blobIdPrefix}.test.threema.ch")
+            stringBuildConfigField("BLOB_SERVER_IPV6_URL", "https://ds-blobp-{blobIdPrefix}.test.threema.ch")
+            stringBuildConfigField("BLOB_SERVER_URL_UPLOAD", "https://blobp-upload.test.threema.ch/upload")
+            stringBuildConfigField("BLOB_SERVER_IPV6_URL_UPLOAD", "https://ds-blobp-upload.test.threema.ch/upload")
             stringBuildConfigField("AVATAR_FETCH_URL", "https://avatar.test.threema.ch/")
             stringBuildConfigField("APP_RATING_URL", "https://test.threema.com/app-rating/android-work/{rating}")
             stringBuildConfigField("MAP_STYLES_URL", "https://map.test.threema.ch/styles/threema/style.json")
@@ -519,6 +531,8 @@ android {
             assets.srcDirs("assets")
             jniLibs.srcDirs("libs")
             res.srcDir("src/main/res-rendezvous")
+            java.srcDir("./build/generated/source/protobuf/main/java")
+            java.srcDir("./build/generated/source/protobuf/main/kotlin")
         }
 
         // Based on Google services
@@ -574,7 +588,6 @@ android {
     buildTypes {
         debug {
             isDebuggable = true
-            isJniDebuggable = false
             ndk {
                 debugSymbolLevel = "FULL"
             }
@@ -587,7 +600,6 @@ android {
         }
         release {
             isDebuggable = false
-            isJniDebuggable = false
             isMinifyEnabled = true
             isShrinkResources = false // Caused inconsistencies between local and CI builds
             vcsInfo.include = false // For reproducible builds independent from git history
@@ -624,12 +636,6 @@ android {
         }
     }
 
-    externalNativeBuild {
-        ndkBuild {
-            path("jni/Android.mk")
-        }
-    }
-
     packaging {
         jniLibs {
             // replacement for extractNativeLibs in AndroidManifest
@@ -678,7 +684,7 @@ android {
             }
             // By default, local unit tests throw an exception any time the code you are testing tries to access
             // Android platform APIs (unless you mock Android dependencies yourself or with a testing
-            // framework like Mockito). However, you can enable the following property so that the test
+            // framework like Mockk). However, you can enable the following property so that the test
             // returns either null or zero when accessing platform APIs, rather than throwing an exception.
             isReturnDefaultValues = true
         }
@@ -720,7 +726,7 @@ android {
         error.addAll(setOf("Wakelock", "TextViewEdits", "ResourceAsColor"))
         // Set the severity of the given issues to fatal (which means they will be
         // checked during release builds (even if the lint target is not included)
-        fatal.addAll(setOf("NewApi", "InlinedApi"))
+        fatal.addAll(setOf("NewApi", "InlinedApi", "LoggerName"))
         ignoreWarnings = false
         // if true, don't include source code lines in the error output
         noLines = false
@@ -742,6 +748,11 @@ android {
     }
 }
 
+composeCompiler {
+    includeSourceInformation = true
+    stabilityConfigurationFiles.add(rootProject.layout.projectDirectory.file("stability_config.conf"))
+}
+
 // Only build relevant buildType / flavor combinations
 androidComponents {
     beforeVariants { variant ->
@@ -766,6 +777,14 @@ dependencies {
 
     implementation(project(":domain"))
     implementation(project(":common"))
+    lintChecks(project(":lint-rules"))
+
+    // Dependency Injection
+    implementation(libs.koin.android)
+    implementation(libs.koin.androidCompat)
+    implementation(libs.koin.compose)
+    testImplementation(libs.koin.test)
+    testImplementation(libs.koin.test.junit4)
 
     implementation(libs.sqlcipher.android)
 
@@ -777,7 +796,6 @@ dependencies {
     implementation(libs.commonsText)
     implementation(libs.slf4j.api)
     implementation(libs.androidImageCropper)
-    implementation(libs.trustkit)
     implementation(libs.fastscroll)
     implementation(libs.ezVcard)
     implementation(libs.gestureViews)
@@ -878,11 +896,6 @@ dependencies {
     testImplementation(project(":test-helpers"))
     androidTestImplementation(project(":test-helpers"))
 
-    testImplementation(libs.mockito.powermock.api)
-    testImplementation(libs.mockito.powermock.junit4RuleAgent)
-    testImplementation(libs.mockito.powermock.junit4Rule)
-    testImplementation(libs.mockito.powermock.junit4)
-
     testImplementation(libs.mockk)
     androidTestImplementation(libs.mockkAndroid)
 
@@ -917,7 +930,6 @@ dependencies {
     }
     androidTestImplementation(libs.androidx.test.uiautomator)
     androidTestImplementation(libs.androidx.test.core)
-    androidTestImplementation(libs.mockito.core)
     androidTestImplementation(libs.kotlinx.coroutines.test)
     testImplementation(libs.kotlinx.coroutines.test)
 
@@ -997,7 +1009,7 @@ cargo {
     features {
         defaultAnd(arrayOf("uniffi"))
     }
-    extraCargoBuildArguments = listOf("--lib", "--target-dir", "$projectDir/build/generated/source/libthreema")
+    extraCargoBuildArguments = listOf("--lib", "--target-dir", "$projectDir/build/generated/source/libthreema", "--locked")
     verbose = false
 }
 
@@ -1029,6 +1041,14 @@ androidStem {
     includeLocalizedOnlyTemplates = true
 }
 
+tasks.register<Exec>("compileProto") {
+    group = "build"
+    description = "generate class bindings from protobuf files in the 'protobuf' directory"
+    workingDir(project.projectDir)
+    commandLine("./compile-proto.sh")
+}
+project.tasks.preBuild.dependsOn("compileProto")
+
 tasks.withType<Test> {
     // Necessary to load the dynamic libthreema library in unit tests
     systemProperty("jna.library.path", "${project.projectDir}/../domain/libthreema/target/release")
@@ -1038,16 +1058,16 @@ tasks.withType<Test> {
 // See https://medium.com/stepstone-tech/how-to-capture-screenshots-for-failed-ui-tests-9927eea6e1e4
 val reportsDirectory = "${layout.buildDirectory}/reports/androidTests/connected"
 val screenshotsDirectory = "/sdcard/testfailures/screenshots/"
-val clearScreenshotsTask = task<Exec>("clearScreenshots") {
+val clearScreenshotsTask = tasks.register<Exec>("clearScreenshots") {
     executable = android.adbExecutable.toString()
     args("shell", "rm", "-r", screenshotsDirectory)
 }
-val createScreenshotsDirectoryTask = task<Exec>("createScreenshotsDirectory") {
+val createScreenshotsDirectoryTask = tasks.register<Exec>("createScreenshotsDirectory") {
     group = "reporting"
     executable = android.adbExecutable.toString()
     args("shell", "mkdir", "-p", screenshotsDirectory)
 }
-val fetchScreenshotsTask = task<Exec>("fetchScreenshots") {
+val fetchScreenshotsTask = tasks.register<Exec>("fetchScreenshots") {
     group = "reporting"
     executable = android.adbExecutable.toString()
     args("pull", "$screenshotsDirectory.", reportsDirectory)
@@ -1062,3 +1082,16 @@ tasks.whenTaskAdded {
         finalizedBy(fetchScreenshotsTask)
     }
 }
+
+// Let the compose compiler generate stability reports
+tasks.withType<KotlinCompile>().configureEach {
+    compilerOptions {
+        val composeCompilerReportsPath = "${project.layout.buildDirectory.get().dir("compose_conpiler").asFile.absolutePath}/reports"
+        freeCompilerArgs.addAll(
+            listOf(
+                "-P",
+                "plugin:androidx.compose.compiler.plugins.kotlin:reportsDestination=$composeCompilerReportsPath",
+            ),
+        )
+    }
+}

+ 39 - 0
app/compile-proto.sh

@@ -0,0 +1,39 @@
+#!/usr/bin/env bash
+
+set -euo pipefail
+
+GREEN="\033[0;32m"
+RED="\033[0;31m"
+RESET="\033[0m"
+
+function log() {
+    echo -en "$1"
+    echo -n "$2 $3"
+    echo -e "$RESET"
+}
+
+function log_major() { log "$GREEN" "==>" "$1"; }
+function log_minor() { log "$GREEN" "--> " "$1"; }
+function log_error() { log "$RED" "!!!" "Error: $1"; }
+
+function fail() {
+    log_error "$1"
+    exit 1
+}
+
+DIR="./build/generated/source/protobuf/main"
+mkdir -p "$DIR"
+mkdir -p "$DIR/kotlin"
+mkdir -p "$DIR/java"
+
+log_major "Compiling protobuf"
+for file in protobuf/*.proto; do
+    log_minor "Building $file..."
+    protoc \
+      --proto_path=protobuf/ \
+      --kotlin_out=lite:"$DIR/kotlin" \
+      --java_out=lite:"$DIR/java" \
+      -I=protobuf/ \
+      "$file"
+    log_minor "  OK"
+done

+ 0 - 28
app/jni/Android.mk

@@ -1,28 +0,0 @@
-# Makefile for native JNI libraries. To be built with ndk-build.
-#
-# To view the commands that will be run when building the application, run
-#
-#     ndk-build -B --dry-run
-#
-# NOTE: Do not use `$(wildcard ...)` in this script! It makes the linking order
-#       non-deterministic.
-
-LOCAL_PATH       := $(call my-dir)
-
-TARGET_PLATFORM  := android-33
-
-# libnacl
-
-include $(CLEAR_VARS)
-
-LOCAL_MODULE     := nacl-jni
-
-LOCAL_SRC_FILES  := $(LOCAL_PATH)/nacl/salsa20-jni.c
-LOCAL_SRC_FILES  += $(LOCAL_PATH)/nacl/poly1305-jni.c
-LOCAL_SRC_FILES  += $(LOCAL_PATH)/nacl/curve25519-jni.c
-LOCAL_SRC_FILES  += $(LOCAL_PATH)/nacl/smult_donna.c
-LOCAL_SRC_FILES  += $(LOCAL_PATH)/nacl/smult_donna-c64.c
-
-LOCAL_LDFLAGS    += -Wl,--build-id=none  # Reproducible builds
-
-include $(BUILD_SHARED_LIBRARY)

+ 0 - 4
app/jni/Application.mk

@@ -1,4 +0,0 @@
-APP_ABI := armeabi-v7a x86 arm64-v8a x86_64
-APP_PLATFORM := android-21
-APP_CPPFLAGS += -fexceptions
-APP_OPTIM := debug

+ 0 - 41
app/jni/nacl/curve25519-jni.c

@@ -1,41 +0,0 @@
-/*  _____ _
- * |_   _| |_  _ _ ___ ___ _ __  __ _
- *   | | | ' \| '_/ -_) -_) '  \/ _` |_
- *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
- *
- * Threema Java Client
- * Copyright (c) 2015-2020 Threema GmbH
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-#include <string.h>
-#include <jni.h>
-
-int crypto_scalarmult_curve25519(uint8_t *mypublic, const uint8_t *secret, const uint8_t *basepoint);
-
-JNIEXPORT jint JNICALL Java_com_neilalexander_jnacl_crypto_curve25519_crypto_1scalarmult_1native(JNIEnv* env, jclass cls,
-	jbyteArray qarr, jbyteArray narr, jbyteArray parr) {
-
-	jbyte q[32], n[32], p[32];
-	int res;
-
-	(*env)->GetByteArrayRegion(env, narr, 0, 32, n);
-	(*env)->GetByteArrayRegion(env, parr, 0, 32, p);
-
-	res = crypto_scalarmult_curve25519((unsigned char *)q, (unsigned char *)n, (unsigned char *)p);
-
-	(*env)->SetByteArrayRegion(env, qarr, 0, 32, q);
-
-	return res;
-}

+ 0 - 210
app/jni/nacl/poly1305-jni.c

@@ -1,210 +0,0 @@
-/*  _____ _
- * |_   _| |_  _ _ ___ ___ _ __  __ _
- *   | | | ' \| '_/ -_) -_) '  \/ _` |_
- *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
- *
- * Threema Java Client
- * Copyright (c) 2015-2020 Threema GmbH
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-#include <string.h>
-#include <jni.h>
-
-int crypto_onetimeauth(unsigned char *out,const unsigned char *in,unsigned long long inlen,const unsigned char *k);
-int crypto_onetimeauth_verify(const unsigned char *h,const unsigned char *in,unsigned long long inlen,const unsigned char *k);
-
-JNIEXPORT jint JNICALL Java_com_neilalexander_jnacl_crypto_poly1305_crypto_1onetimeauth_1native(JNIEnv* env, jclass cls,
-	jbyteArray outvarr, jint outvoffset, jbyteArray invarr, jint invoffset, jlong inlen, jbyteArray karr)
-{
-	jbyte outv[16];
-	jbyte *inv;
-	jbyte k[32];
-	int res;
-
-	if ((*env)->GetArrayLength(env, invarr) < (inlen + invoffset)) {
-		/* bad length */
-		return 1;
-	}
-
-	(*env)->GetByteArrayRegion(env, karr, 0, 32, k);
-
-	inv = (*env)->GetPrimitiveArrayCritical(env, invarr, NULL);
-	if (inv == NULL)
-		return 4;
-
-	res = crypto_onetimeauth((unsigned char *)outv, (unsigned char *)(inv + invoffset), inlen, (unsigned char *)k);
-
-	(*env)->ReleasePrimitiveArrayCritical(env, invarr, inv, JNI_ABORT);
-
-	(*env)->SetByteArrayRegion(env, outvarr, outvoffset, 16, outv);
-
-	return res;
-}
-
-JNIEXPORT jint JNICALL Java_com_neilalexander_jnacl_crypto_poly1305_crypto_1onetimeauth_1verify_1native(JNIEnv* env, jclass cls,
-	jbyteArray harr, jint hoffset, jbyteArray invarr, jint invoffset, jlong inlen, jbyteArray karr)
-{
-	jbyte h[16];
-	jbyte *inv;
-	jbyte k[32];
-	int res;
-
-	if ((*env)->GetArrayLength(env, invarr) < (inlen + invoffset)) {
-		/* bad length */
-		return 1;
-	}
-
-	(*env)->GetByteArrayRegion(env, karr, 0, 32, k);
-	(*env)->GetByteArrayRegion(env, harr, hoffset, 16, h);
-
-	inv = (*env)->GetPrimitiveArrayCritical(env, invarr, NULL);
-	if (inv == NULL)
-		return 4;
-
-	res = crypto_onetimeauth_verify((unsigned char *)h, (unsigned char *)(inv + invoffset), inlen, (unsigned char *)k);
-
-	(*env)->ReleasePrimitiveArrayCritical(env, invarr, inv, JNI_ABORT);
-
-	return res;
-}
-
-/* Public Domain code copied verbatim from NaCl below */
-
-static void add(unsigned int h[17],const unsigned int c[17])
-{
-  unsigned int j;
-  unsigned int u;
-  u = 0;
-  for (j = 0;j < 17;++j) { u += h[j] + c[j]; h[j] = u & 255; u >>= 8; }
-}
-
-static void squeeze(unsigned int h[17])
-{
-  unsigned int j;
-  unsigned int u;
-  u = 0;
-  for (j = 0;j < 16;++j) { u += h[j]; h[j] = u & 255; u >>= 8; }
-  u += h[16]; h[16] = u & 3;
-  u = 5 * (u >> 2);
-  for (j = 0;j < 16;++j) { u += h[j]; h[j] = u & 255; u >>= 8; }
-  u += h[16]; h[16] = u;
-}
-
-static const unsigned int minusp[17] = {
-  5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 252
-} ;
-
-static void freeze(unsigned int h[17])
-{
-  unsigned int horig[17];
-  unsigned int j;
-  unsigned int negative;
-  for (j = 0;j < 17;++j) horig[j] = h[j];
-  add(h,minusp);
-  negative = -(h[16] >> 7);
-  for (j = 0;j < 17;++j) h[j] ^= negative & (horig[j] ^ h[j]);
-}
-
-static void mulmod(unsigned int h[17],const unsigned int r[17])
-{
-  unsigned int hr[17];
-  unsigned int i;
-  unsigned int j;
-  unsigned int u;
-
-  for (i = 0;i < 17;++i) {
-    u = 0;
-    for (j = 0;j <= i;++j) u += h[j] * r[i - j];
-    for (j = i + 1;j < 17;++j) u += 320 * h[j] * r[i + 17 - j];
-    hr[i] = u;
-  }
-  for (i = 0;i < 17;++i) h[i] = hr[i];
-  squeeze(h);
-}
-
-int crypto_verify_16(const unsigned char *x,const unsigned char *y)
-{
-  unsigned int differentbits = 0;
-#define F(i) differentbits |= x[i] ^ y[i];
-  F(0)
-  F(1)
-  F(2)
-  F(3)
-  F(4)
-  F(5)
-  F(6)
-  F(7)
-  F(8)
-  F(9)
-  F(10)
-  F(11)
-  F(12)
-  F(13)
-  F(14)
-  F(15)
-  return (1 & ((differentbits - 1) >> 8)) - 1;
-}
-
-int crypto_onetimeauth(unsigned char *out,const unsigned char *in,unsigned long long inlen,const unsigned char *k)
-{
-  unsigned int j;
-  unsigned int r[17];
-  unsigned int h[17];
-  unsigned int c[17];
-
-  r[0] = k[0];
-  r[1] = k[1];
-  r[2] = k[2];
-  r[3] = k[3] & 15;
-  r[4] = k[4] & 252;
-  r[5] = k[5];
-  r[6] = k[6];
-  r[7] = k[7] & 15;
-  r[8] = k[8] & 252;
-  r[9] = k[9];
-  r[10] = k[10];
-  r[11] = k[11] & 15;
-  r[12] = k[12] & 252;
-  r[13] = k[13];
-  r[14] = k[14];
-  r[15] = k[15] & 15;
-  r[16] = 0;
-
-  for (j = 0;j < 17;++j) h[j] = 0;
-
-  while (inlen > 0) {
-    for (j = 0;j < 17;++j) c[j] = 0;
-    for (j = 0;(j < 16) && (j < inlen);++j) c[j] = in[j];
-    c[j] = 1;
-    in += j; inlen -= j;
-    add(h,c);
-    mulmod(h,r);
-  }
-
-  freeze(h);
-
-  for (j = 0;j < 16;++j) c[j] = k[j + 16];
-  c[16] = 0;
-  add(h,c);
-  for (j = 0;j < 16;++j) out[j] = h[j];
-  return 0;
-}
-
-int crypto_onetimeauth_verify(const unsigned char *h,const unsigned char *in,unsigned long long inlen,const unsigned char *k)
-{
-  unsigned char correct[16];
-  crypto_onetimeauth(correct,in,inlen,k);
-  return crypto_verify_16(h,correct);
-}

+ 0 - 523
app/jni/nacl/salsa20-jni.c

@@ -1,523 +0,0 @@
-/*  _____ _
- * |_   _| |_  _ _ ___ ___ _ __  __ _
- *   | | | ' \| '_/ -_) -_) '  \/ _` |_
- *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
- *
- * Threema Java Client
- * Copyright (c) 2015-2020 Threema GmbH
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-#include <string.h>
-#include <jni.h>
-
-#define ROUNDS 20
-
-typedef unsigned int uint32;
-
-static const unsigned char sigma[16] = "expand 32-byte k";
-
-int crypto_stream_salsa20_ref(
-	unsigned char *c,unsigned long long clen,
-	const unsigned char *n,
-	const unsigned char *k
-);
-
-int crypto_stream_salsa20_ref_xor(
-	unsigned char *c,
-	const unsigned char *m,unsigned long long mlen,
-	const unsigned char *n,
-	const unsigned char *k
-);
-
-int crypto_stream_salsa20_ref_xor_skip32(
-		unsigned char *c0,
-        unsigned char *c,unsigned long coffset,
-  const unsigned char *m,unsigned long moffset,
-  unsigned long long mlen,
-  const unsigned char *n,
-  const unsigned char *k
-);
-
-JNIEXPORT jint JNICALL Java_com_neilalexander_jnacl_crypto_salsa20_crypto_1stream_1native(JNIEnv* env, jclass cls,
-	jbyteArray carr, jint clen, jbyteArray narr, jint noffset, jbyteArray karr)
-{
-	jbyte *c;
-	jbyte n[8];
-	jbyte k[32];
-	int res;
-
-	if ((*env)->GetArrayLength(env, carr) < clen) {
-		/* bad length */
-		return 1;
-	}
-
-	(*env)->GetByteArrayRegion(env, narr, noffset, 8, n);
-	(*env)->GetByteArrayRegion(env, karr, 0, 32, k);
-
-	c = (*env)->GetPrimitiveArrayCritical(env, carr, NULL);
-	if (c == NULL)
-		return 4;
-
-	res = crypto_stream_salsa20_ref((unsigned char *)c, clen, (unsigned char *)n, (unsigned char *)k);
-
-	(*env)->ReleasePrimitiveArrayCritical(env, carr, c, 0);
-
-	return res;
-}
-
-JNIEXPORT jint JNICALL Java_com_neilalexander_jnacl_crypto_salsa20_crypto_1stream_1xor_1native(JNIEnv* env, jclass cls,
-	jbyteArray carr, jbyteArray marr, jint mlen, jbyteArray narr, jint noffset, jbyteArray karr)
-{
-	jbyte *c, *m;
-	jbyte n[8];
-	jbyte k[32];
-	int res;
-
-	if ((*env)->GetArrayLength(env, marr) < mlen || (*env)->GetArrayLength(env, carr) < mlen) {
-		/* bad length */
-		return 1;
-	}
-
-	(*env)->GetByteArrayRegion(env, narr, noffset, 8, n);
-	(*env)->GetByteArrayRegion(env, karr, 0, 32, k);
-
-	c = (*env)->GetPrimitiveArrayCritical(env, carr, NULL);
-	if (c == NULL)
-		return 4;
-
-	m = (*env)->GetPrimitiveArrayCritical(env, marr, NULL);
-	if (m == NULL) {
-		(*env)->ReleasePrimitiveArrayCritical(env, carr, c, 0);
-		return 5;
-	}
-
-	res = crypto_stream_salsa20_ref_xor((unsigned char *)c, (unsigned char *)m, mlen, (unsigned char *)n, (unsigned char *)k);
-
-	(*env)->ReleasePrimitiveArrayCritical(env, marr, m, 0);
-	(*env)->ReleasePrimitiveArrayCritical(env, carr, c, 0);
-
-	return res;
-}
-
-JNIEXPORT jint JNICALL Java_com_neilalexander_jnacl_crypto_salsa20_crypto_1stream_1xor_1skip32_1native(JNIEnv* env, jclass cls,
-	jbyteArray c0arr, jbyteArray carr, jint coffset, jbyteArray marr, jint moffset, jint mlen, jbyteArray narr, jint noffset, jbyteArray karr)
-{
-	jbyte c0[32];
-	jbyte *c, *m;
-	jbyte n[8];
-	jbyte k[32];
-	int res;
-
-	if ((*env)->GetArrayLength(env, marr) < (moffset+mlen) || (*env)->GetArrayLength(env, carr) < (coffset+mlen)) {
-		/* bad length */
-		return 1;
-	}
-
-	(*env)->GetByteArrayRegion(env, narr, noffset, 8, n);
-	(*env)->GetByteArrayRegion(env, karr, 0, 32, k);
-
-	c = (*env)->GetPrimitiveArrayCritical(env, carr, NULL);
-	if (c == NULL)
-		return 4;
-
-	m = (*env)->GetPrimitiveArrayCritical(env, marr, NULL);
-	if (m == NULL) {
-		(*env)->ReleasePrimitiveArrayCritical(env, carr, c, 0);
-		return 5;
-	}
-
-	res = crypto_stream_salsa20_ref_xor_skip32((unsigned char *)c0, (unsigned char *)c, coffset, (unsigned char *)m, moffset, mlen, (unsigned char *)n, (unsigned char *)k);
-
-	(*env)->ReleasePrimitiveArrayCritical(env, marr, m, 0);
-	(*env)->ReleasePrimitiveArrayCritical(env, carr, c, 0);
-
-	if (c0arr != NULL)
-		(*env)->SetByteArrayRegion(env, c0arr, 0, 32, c0);
-
-	return res;
-}
-
-
-
-
-/* Public Domain code copied verbatim from NaCl below */
-
-static uint32 rotate(uint32 u,int c)
-{
-    return (u << c) | (u >> (32 - c));
-}
-
-static uint32 load_littleendian(const unsigned char *x)
-{
-    return
-    (uint32) (x[0]) \
-    | (((uint32) (x[1])) << 8) \
-    | (((uint32) (x[2])) << 16) \
-    | (((uint32) (x[3])) << 24)
-    ;
-}
-
-static void store_littleendian(unsigned char *x,uint32 u)
-{
-    x[0] = u; u >>= 8;
-    x[1] = u; u >>= 8;
-    x[2] = u; u >>= 8;
-    x[3] = u;
-}
-
-int crypto_core_salsa20_ref(
-        unsigned char *out,
-  const unsigned char *in,
-  const unsigned char *k,
-  const unsigned char *c
-)
-{
-  uint32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
-  uint32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
-  int i;
-
-  j0 = x0 = load_littleendian(c + 0);
-  j1 = x1 = load_littleendian(k + 0);
-  j2 = x2 = load_littleendian(k + 4);
-  j3 = x3 = load_littleendian(k + 8);
-  j4 = x4 = load_littleendian(k + 12);
-  j5 = x5 = load_littleendian(c + 4);
-  j6 = x6 = load_littleendian(in + 0);
-  j7 = x7 = load_littleendian(in + 4);
-  j8 = x8 = load_littleendian(in + 8);
-  j9 = x9 = load_littleendian(in + 12);
-  j10 = x10 = load_littleendian(c + 8);
-  j11 = x11 = load_littleendian(k + 16);
-  j12 = x12 = load_littleendian(k + 20);
-  j13 = x13 = load_littleendian(k + 24);
-  j14 = x14 = load_littleendian(k + 28);
-  j15 = x15 = load_littleendian(c + 12);
-
-  for (i = ROUNDS;i > 0;i -= 2) {
-     x4 ^= rotate( x0+x12, 7);
-     x8 ^= rotate( x4+ x0, 9);
-    x12 ^= rotate( x8+ x4,13);
-     x0 ^= rotate(x12+ x8,18);
-     x9 ^= rotate( x5+ x1, 7);
-    x13 ^= rotate( x9+ x5, 9);
-     x1 ^= rotate(x13+ x9,13);
-     x5 ^= rotate( x1+x13,18);
-    x14 ^= rotate(x10+ x6, 7);
-     x2 ^= rotate(x14+x10, 9);
-     x6 ^= rotate( x2+x14,13);
-    x10 ^= rotate( x6+ x2,18);
-     x3 ^= rotate(x15+x11, 7);
-     x7 ^= rotate( x3+x15, 9);
-    x11 ^= rotate( x7+ x3,13);
-    x15 ^= rotate(x11+ x7,18);
-     x1 ^= rotate( x0+ x3, 7);
-     x2 ^= rotate( x1+ x0, 9);
-     x3 ^= rotate( x2+ x1,13);
-     x0 ^= rotate( x3+ x2,18);
-     x6 ^= rotate( x5+ x4, 7);
-     x7 ^= rotate( x6+ x5, 9);
-     x4 ^= rotate( x7+ x6,13);
-     x5 ^= rotate( x4+ x7,18);
-    x11 ^= rotate(x10+ x9, 7);
-     x8 ^= rotate(x11+x10, 9);
-     x9 ^= rotate( x8+x11,13);
-    x10 ^= rotate( x9+ x8,18);
-    x12 ^= rotate(x15+x14, 7);
-    x13 ^= rotate(x12+x15, 9);
-    x14 ^= rotate(x13+x12,13);
-    x15 ^= rotate(x14+x13,18);
-  }
-
-  x0 += j0;
-  x1 += j1;
-  x2 += j2;
-  x3 += j3;
-  x4 += j4;
-  x5 += j5;
-  x6 += j6;
-  x7 += j7;
-  x8 += j8;
-  x9 += j9;
-  x10 += j10;
-  x11 += j11;
-  x12 += j12;
-  x13 += j13;
-  x14 += j14;
-  x15 += j15;
-
-  store_littleendian(out + 0,x0);
-  store_littleendian(out + 4,x1);
-  store_littleendian(out + 8,x2);
-  store_littleendian(out + 12,x3);
-  store_littleendian(out + 16,x4);
-  store_littleendian(out + 20,x5);
-  store_littleendian(out + 24,x6);
-  store_littleendian(out + 28,x7);
-  store_littleendian(out + 32,x8);
-  store_littleendian(out + 36,x9);
-  store_littleendian(out + 40,x10);
-  store_littleendian(out + 44,x11);
-  store_littleendian(out + 48,x12);
-  store_littleendian(out + 52,x13);
-  store_littleendian(out + 56,x14);
-  store_littleendian(out + 60,x15);
-
-  return 0;
-}
-
-int crypto_core_hsalsa20_ref(
-        unsigned char *out,
-  const unsigned char *in,
-  const unsigned char *k,
-  const unsigned char *c
-)
-{
-  uint32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;
-  uint32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;
-  int i;
-
-  j0 = x0 = load_littleendian(c + 0);
-  j1 = x1 = load_littleendian(k + 0);
-  j2 = x2 = load_littleendian(k + 4);
-  j3 = x3 = load_littleendian(k + 8);
-  j4 = x4 = load_littleendian(k + 12);
-  j5 = x5 = load_littleendian(c + 4);
-  j6 = x6 = load_littleendian(in + 0);
-  j7 = x7 = load_littleendian(in + 4);
-  j8 = x8 = load_littleendian(in + 8);
-  j9 = x9 = load_littleendian(in + 12);
-  j10 = x10 = load_littleendian(c + 8);
-  j11 = x11 = load_littleendian(k + 16);
-  j12 = x12 = load_littleendian(k + 20);
-  j13 = x13 = load_littleendian(k + 24);
-  j14 = x14 = load_littleendian(k + 28);
-  j15 = x15 = load_littleendian(c + 12);
-
-  for (i = ROUNDS;i > 0;i -= 2) {
-     x4 ^= rotate( x0+x12, 7);
-     x8 ^= rotate( x4+ x0, 9);
-    x12 ^= rotate( x8+ x4,13);
-     x0 ^= rotate(x12+ x8,18);
-     x9 ^= rotate( x5+ x1, 7);
-    x13 ^= rotate( x9+ x5, 9);
-     x1 ^= rotate(x13+ x9,13);
-     x5 ^= rotate( x1+x13,18);
-    x14 ^= rotate(x10+ x6, 7);
-     x2 ^= rotate(x14+x10, 9);
-     x6 ^= rotate( x2+x14,13);
-    x10 ^= rotate( x6+ x2,18);
-     x3 ^= rotate(x15+x11, 7);
-     x7 ^= rotate( x3+x15, 9);
-    x11 ^= rotate( x7+ x3,13);
-    x15 ^= rotate(x11+ x7,18);
-     x1 ^= rotate( x0+ x3, 7);
-     x2 ^= rotate( x1+ x0, 9);
-     x3 ^= rotate( x2+ x1,13);
-     x0 ^= rotate( x3+ x2,18);
-     x6 ^= rotate( x5+ x4, 7);
-     x7 ^= rotate( x6+ x5, 9);
-     x4 ^= rotate( x7+ x6,13);
-     x5 ^= rotate( x4+ x7,18);
-    x11 ^= rotate(x10+ x9, 7);
-     x8 ^= rotate(x11+x10, 9);
-     x9 ^= rotate( x8+x11,13);
-    x10 ^= rotate( x9+ x8,18);
-    x12 ^= rotate(x15+x14, 7);
-    x13 ^= rotate(x12+x15, 9);
-    x14 ^= rotate(x13+x12,13);
-    x15 ^= rotate(x14+x13,18);
-  }
-
-  x0 += j0;
-  x1 += j1;
-  x2 += j2;
-  x3 += j3;
-  x4 += j4;
-  x5 += j5;
-  x6 += j6;
-  x7 += j7;
-  x8 += j8;
-  x9 += j9;
-  x10 += j10;
-  x11 += j11;
-  x12 += j12;
-  x13 += j13;
-  x14 += j14;
-  x15 += j15;
-
-  x0 -= load_littleendian(c + 0);
-  x5 -= load_littleendian(c + 4);
-  x10 -= load_littleendian(c + 8);
-  x15 -= load_littleendian(c + 12);
-  x6 -= load_littleendian(in + 0);
-  x7 -= load_littleendian(in + 4);
-  x8 -= load_littleendian(in + 8);
-  x9 -= load_littleendian(in + 12);
-
-  store_littleendian(out + 0,x0);
-  store_littleendian(out + 4,x5);
-  store_littleendian(out + 8,x10);
-  store_littleendian(out + 12,x15);
-  store_littleendian(out + 16,x6);
-  store_littleendian(out + 20,x7);
-  store_littleendian(out + 24,x8);
-  store_littleendian(out + 28,x9);
-
-  return 0;
-}
-
-int crypto_stream_salsa20_ref_xor(
-        unsigned char *c,
-  const unsigned char *m,unsigned long long mlen,
-  const unsigned char *n,
-  const unsigned char *k
-)
-{
-  unsigned char in[16];
-  unsigned char block[64];
-  int i;
-  unsigned int u;
-
-  if (!mlen) return 0;
-
-  for (i = 0;i < 8;++i) in[i] = n[i];
-  for (i = 8;i < 16;++i) in[i] = 0;
-
-  while (mlen >= 64) {
-    crypto_core_salsa20_ref(block,in,k,sigma);
-    for (i = 0;i < 64;++i) c[i] = m[i] ^ block[i];
-
-    u = 1;
-    for (i = 8;i < 16;++i) {
-      u += (unsigned int) in[i];
-      in[i] = u;
-      u >>= 8;
-    }
-
-    mlen -= 64;
-    c += 64;
-    m += 64;
-  }
-
-  if (mlen) {
-    crypto_core_salsa20_ref(block,in,k,sigma);
-    for (i = 0;i < mlen;++i) c[i] = m[i] ^ block[i];
-  }
-  return 0;
-}
-
-int crypto_stream_salsa20_ref_xor_skip32(
-		unsigned char *c0,
-        unsigned char *c,unsigned long coffset,
-  const unsigned char *m,unsigned long moffset,
-  unsigned long long mlen,
-  const unsigned char *n,
-  const unsigned char *k
-)
-{
-  unsigned char in[16];
-  unsigned char blk1[64];
-  unsigned char blk2[64];
-  unsigned char *prevblock;
-  unsigned char *curblock;
-  unsigned char *tmpblock;
-  int i;
-  unsigned int u;
-
-  if (!mlen) return 0;
-
-  for (i = 0;i < 8;++i) in[i] = n[i];
-  for (i = 8;i < 16;++i) in[i] = 0;
-
-  prevblock = blk1;
-  curblock = blk2;
-  crypto_core_salsa20_ref(prevblock,in,k,sigma);
-  if (c0 != NULL) {
-	for (i = 0; i < 32; i++) c0[i] = prevblock[i];
-  }
-
-  while (mlen >= 64) {
-	u = 1;
-    for (i = 8;i < 16;++i) {
-      u += (unsigned int) in[i];
-      in[i] = u;
-      u >>= 8;
-    }
-
-    crypto_core_salsa20_ref(curblock,in,k,sigma);
-
-	for (i = 0;i < 32;++i) c[i+coffset] = m[i+moffset] ^ prevblock[i+32];
-	for (i = 32;i < 64;++i) c[i+coffset] = m[i+moffset] ^ curblock[i-32];
-
-    mlen -= 64;
-    c += 64;
-    m += 64;
-
-	tmpblock = prevblock;
-	prevblock = curblock;
-	curblock = tmpblock;
-  }
-
-  if (mlen) {
-	u = 1;
-    for (i = 8;i < 16;++i) {
-      u += (unsigned int) in[i];
-      in[i] = u;
-      u >>= 8;
-    }
-
-    crypto_core_salsa20_ref(curblock,in,k,sigma);
-    for (i = 0;i < mlen && i < 32;++i) c[i+coffset] = m[i+moffset] ^ prevblock[i+32];
-    for (i = 32;i < mlen && i < 64;++i) c[i+coffset] = m[i+moffset] ^ curblock[i-32];
-  }
-  return 0;
-}
-
-int crypto_stream_salsa20_ref(
-        unsigned char *c,unsigned long long clen,
-  const unsigned char *n,
-  const unsigned char *k
-)
-{
-  unsigned char in[16];
-  unsigned char block[64];
-  int i;
-  unsigned int u;
-
-  if (!clen) return 0;
-
-  for (i = 0;i < 8;++i) in[i] = n[i];
-  for (i = 8;i < 16;++i) in[i] = 0;
-
-  while (clen >= 64) {
-    crypto_core_salsa20_ref(c,in,k,sigma);
-
-    u = 1;
-    for (i = 8;i < 16;++i) {
-      u += (unsigned int) in[i];
-      in[i] = u;
-      u >>= 8;
-    }
-
-    clen -= 64;
-    c += 64;
-  }
-
-  if (clen) {
-    crypto_core_salsa20_ref(block,in,k,sigma);
-    for (i = 0;i < clen;++i) c[i] = block[i];
-  }
-  return 0;
-}

+ 0 - 451
app/jni/nacl/smult_donna-c64.c

@@ -1,451 +0,0 @@
-/* Copyright 2008, Google Inc.
- * All rights reserved.
- *
- * Code released into the public domain.
- *
- * curve25519-donna: Curve25519 elliptic curve, public key function
- *
- * http://code.google.com/p/curve25519-donna/
- *
- * Adam Langley <agl@imperialviolet.org>
- *
- * Derived from public domain C code by Daniel J. Bernstein <djb@cr.yp.to>
- *
- * More information about curve25519 can be found here
- *   http://cr.yp.to/ecdh.html
- *
- * djb's sample implementation of curve25519 is written in a special assembly
- * language called qhasm and uses the floating point registers.
- *
- * This is, almost, a clean room reimplementation from the curve25519 paper. It
- * uses many of the tricks described therein. Only the crecip function is taken
- * from the sample implementation.
- */
-
-#if defined(__aarch64__) || defined(__x86_64__)
-
-#include <string.h>
-#include <stdint.h>
-
-typedef uint8_t u8;
-typedef uint64_t limb;
-typedef limb felem[5];
-// This is a special gcc mode for 128-bit integers. It's implemented on 64-bit
-// platforms only as far as I know.
-typedef unsigned uint128_t __attribute__((mode(TI)));
-
-#undef force_inline
-#define force_inline __attribute__((always_inline))
-
-/* Sum two numbers: output += in */
-static inline void force_inline
-fsum(limb *output, const limb *in) {
-  output[0] += in[0];
-  output[1] += in[1];
-  output[2] += in[2];
-  output[3] += in[3];
-  output[4] += in[4];
-}
-
-/* Find the difference of two numbers: output = in - output
- * (note the order of the arguments!)
- *
- * Assumes that out[i] < 2**52
- * On return, out[i] < 2**55
- */
-static inline void force_inline
-fdifference_backwards(felem out, const felem in) {
-  /* 152 is 19 << 3 */
-  static const limb two54m152 = (((limb)1) << 54) - 152;
-  static const limb two54m8 = (((limb)1) << 54) - 8;
-
-  out[0] = in[0] + two54m152 - out[0];
-  out[1] = in[1] + two54m8 - out[1];
-  out[2] = in[2] + two54m8 - out[2];
-  out[3] = in[3] + two54m8 - out[3];
-  out[4] = in[4] + two54m8 - out[4];
-}
-
-/* Multiply a number by a scalar: output = in * scalar */
-static inline void force_inline
-fscalar_product(felem output, const felem in, const limb scalar) {
-  uint128_t a;
-
-  a = ((uint128_t) in[0]) * scalar;
-  output[0] = ((limb)a) & 0x7ffffffffffff;
-
-  a = ((uint128_t) in[1]) * scalar + ((limb) (a >> 51));
-  output[1] = ((limb)a) & 0x7ffffffffffff;
-
-  a = ((uint128_t) in[2]) * scalar + ((limb) (a >> 51));
-  output[2] = ((limb)a) & 0x7ffffffffffff;
-
-  a = ((uint128_t) in[3]) * scalar + ((limb) (a >> 51));
-  output[3] = ((limb)a) & 0x7ffffffffffff;
-
-  a = ((uint128_t) in[4]) * scalar + ((limb) (a >> 51));
-  output[4] = ((limb)a) & 0x7ffffffffffff;
-
-  output[0] += (a >> 51) * 19;
-}
-
-/* Multiply two numbers: output = in2 * in
- *
- * output must be distinct to both inputs. The inputs are reduced coefficient
- * form, the output is not.
- *
- * Assumes that in[i] < 2**55 and likewise for in2.
- * On return, output[i] < 2**52
- */
-static inline void force_inline
-fmul(felem output, const felem in2, const felem in) {
-  uint128_t t[5];
-  limb r0,r1,r2,r3,r4,s0,s1,s2,s3,s4,c;
-
-  r0 = in[0];
-  r1 = in[1];
-  r2 = in[2];
-  r3 = in[3];
-  r4 = in[4];
-
-  s0 = in2[0];
-  s1 = in2[1];
-  s2 = in2[2];
-  s3 = in2[3];
-  s4 = in2[4];
-
-  t[0]  =  ((uint128_t) r0) * s0;
-  t[1]  =  ((uint128_t) r0) * s1 + ((uint128_t) r1) * s0;
-  t[2]  =  ((uint128_t) r0) * s2 + ((uint128_t) r2) * s0 + ((uint128_t) r1) * s1;
-  t[3]  =  ((uint128_t) r0) * s3 + ((uint128_t) r3) * s0 + ((uint128_t) r1) * s2 + ((uint128_t) r2) * s1;
-  t[4]  =  ((uint128_t) r0) * s4 + ((uint128_t) r4) * s0 + ((uint128_t) r3) * s1 + ((uint128_t) r1) * s3 + ((uint128_t) r2) * s2;
-
-  r4 *= 19;
-  r1 *= 19;
-  r2 *= 19;
-  r3 *= 19;
-
-  t[0] += ((uint128_t) r4) * s1 + ((uint128_t) r1) * s4 + ((uint128_t) r2) * s3 + ((uint128_t) r3) * s2;
-  t[1] += ((uint128_t) r4) * s2 + ((uint128_t) r2) * s4 + ((uint128_t) r3) * s3;
-  t[2] += ((uint128_t) r4) * s3 + ((uint128_t) r3) * s4;
-  t[3] += ((uint128_t) r4) * s4;
-
-                  r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51);
-  t[1] += c;      r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51);
-  t[2] += c;      r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51);
-  t[3] += c;      r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51);
-  t[4] += c;      r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51);
-  r0 +=   c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff;
-  r1 +=   c;      c = r1 >> 51; r1 = r1 & 0x7ffffffffffff;
-  r2 +=   c;
-
-  output[0] = r0;
-  output[1] = r1;
-  output[2] = r2;
-  output[3] = r3;
-  output[4] = r4;
-}
-
-static inline void force_inline
-fsquare_times(felem output, const felem in, limb count) {
-  uint128_t t[5];
-  limb r0,r1,r2,r3,r4,c;
-  limb d0,d1,d2,d4,d419;
-
-  r0 = in[0];
-  r1 = in[1];
-  r2 = in[2];
-  r3 = in[3];
-  r4 = in[4];
-
-  do {
-    d0 = r0 * 2;
-    d1 = r1 * 2;
-    d2 = r2 * 2 * 19;
-    d419 = r4 * 19;
-    d4 = d419 * 2;
-
-    t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3     ));
-    t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19));
-    t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3     ));
-    t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419   ));
-    t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2     ));
-
-                    r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51);
-    t[1] += c;      r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51);
-    t[2] += c;      r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51);
-    t[3] += c;      r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51);
-    t[4] += c;      r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51);
-    r0 +=   c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff;
-    r1 +=   c;      c = r1 >> 51; r1 = r1 & 0x7ffffffffffff;
-    r2 +=   c;
-  } while(--count);
-
-  output[0] = r0;
-  output[1] = r1;
-  output[2] = r2;
-  output[3] = r3;
-  output[4] = r4;
-}
-
-/* Load a little-endian 64-bit number  */
-static limb
-load_limb(const u8 *in) {
-  return
-    ((limb)in[0]) |
-    (((limb)in[1]) << 8) |
-    (((limb)in[2]) << 16) |
-    (((limb)in[3]) << 24) |
-    (((limb)in[4]) << 32) |
-    (((limb)in[5]) << 40) |
-    (((limb)in[6]) << 48) |
-    (((limb)in[7]) << 56);
-}
-
-static void
-store_limb(u8 *out, limb in) {
-  out[0] = in & 0xff;
-  out[1] = (in >> 8) & 0xff;
-  out[2] = (in >> 16) & 0xff;
-  out[3] = (in >> 24) & 0xff;
-  out[4] = (in >> 32) & 0xff;
-  out[5] = (in >> 40) & 0xff;
-  out[6] = (in >> 48) & 0xff;
-  out[7] = (in >> 56) & 0xff;
-}
-
-/* Take a little-endian, 32-byte number and expand it into polynomial form */
-static void
-fexpand(limb *output, const u8 *in) {
-  output[0] = load_limb(in) & 0x7ffffffffffff;
-  output[1] = (load_limb(in+6) >> 3) & 0x7ffffffffffff;
-  output[2] = (load_limb(in+12) >> 6) & 0x7ffffffffffff;
-  output[3] = (load_limb(in+19) >> 1) & 0x7ffffffffffff;
-  output[4] = (load_limb(in+24) >> 12) & 0x7ffffffffffff;
-}
-
-/* Take a fully reduced polynomial form number and contract it into a
- * little-endian, 32-byte array
- */
-static void
-fcontract(u8 *output, const felem input) {
-  uint128_t t[5];
-
-  t[0] = input[0];
-  t[1] = input[1];
-  t[2] = input[2];
-  t[3] = input[3];
-  t[4] = input[4];
-
-  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;
-  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;
-  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;
-  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;
-  t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff;
-
-  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;
-  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;
-  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;
-  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;
-  t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff;
-
-  /* now t is between 0 and 2^255-1, properly carried. */
-  /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */
-
-  t[0] += 19;
-
-  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;
-  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;
-  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;
-  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;
-  t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff;
-
-  /* now between 19 and 2^255-1 in both cases, and offset by 19. */
-
-  t[0] += 0x8000000000000 - 19;
-  t[1] += 0x8000000000000 - 1;
-  t[2] += 0x8000000000000 - 1;
-  t[3] += 0x8000000000000 - 1;
-  t[4] += 0x8000000000000 - 1;
-
-  /* now between 2^255 and 2^256-20, and offset by 2^255. */
-
-  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;
-  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;
-  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;
-  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;
-  t[4] &= 0x7ffffffffffff;
-
-  store_limb(output,    t[0] | (t[1] << 51));
-  store_limb(output+8,  (t[1] >> 13) | (t[2] << 38));
-  store_limb(output+16, (t[2] >> 26) | (t[3] << 25));
-  store_limb(output+24, (t[3] >> 39) | (t[4] << 12));
-}
-
-/* Input: Q, Q', Q-Q'
- * Output: 2Q, Q+Q'
- *
- *   x2 z3: long form
- *   x3 z3: long form
- *   x z: short form, destroyed
- *   xprime zprime: short form, destroyed
- *   qmqp: short form, preserved
- */
-static void
-fmonty(limb *x2, limb *z2, /* output 2Q */
-       limb *x3, limb *z3, /* output Q + Q' */
-       limb *x, limb *z,   /* input Q */
-       limb *xprime, limb *zprime, /* input Q' */
-       const limb *qmqp /* input Q - Q' */) {
-  limb origx[5], origxprime[5], zzz[5], xx[5], zz[5], xxprime[5],
-        zzprime[5], zzzprime[5];
-
-  memcpy(origx, x, 5 * sizeof(limb));
-  fsum(x, z);
-  fdifference_backwards(z, origx);  // does x - z
-
-  memcpy(origxprime, xprime, sizeof(limb) * 5);
-  fsum(xprime, zprime);
-  fdifference_backwards(zprime, origxprime);
-  fmul(xxprime, xprime, z);
-  fmul(zzprime, x, zprime);
-  memcpy(origxprime, xxprime, sizeof(limb) * 5);
-  fsum(xxprime, zzprime);
-  fdifference_backwards(zzprime, origxprime);
-  fsquare_times(x3, xxprime, 1);
-  fsquare_times(zzzprime, zzprime, 1);
-  fmul(z3, zzzprime, qmqp);
-
-  fsquare_times(xx, x, 1);
-  fsquare_times(zz, z, 1);
-  fmul(x2, xx, zz);
-  fdifference_backwards(zz, xx);  // does zz = xx - zz
-  fscalar_product(zzz, zz, 121665);
-  fsum(zzz, xx);
-  fmul(z2, zz, zzz);
-}
-
-// -----------------------------------------------------------------------------
-// Maybe swap the contents of two limb arrays (@a and @b), each @len elements
-// long. Perform the swap iff @swap is non-zero.
-//
-// This function performs the swap without leaking any side-channel
-// information.
-// -----------------------------------------------------------------------------
-static void
-swap_conditional(limb a[5], limb b[5], limb iswap) {
-  unsigned i;
-  const limb swap = -iswap;
-
-  for (i = 0; i < 5; ++i) {
-    const limb x = swap & (a[i] ^ b[i]);
-    a[i] ^= x;
-    b[i] ^= x;
-  }
-}
-
-/* Calculates nQ where Q is the x-coordinate of a point on the curve
- *
- *   resultx/resultz: the x coordinate of the resulting curve point (short form)
- *   n: a little endian, 32-byte number
- *   q: a point of the curve (short form)
- */
-static void
-cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) {
-  limb a[5] = {0}, b[5] = {1}, c[5] = {1}, d[5] = {0};
-  limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t;
-  limb e[5] = {0}, f[5] = {1}, g[5] = {0}, h[5] = {1};
-  limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h;
-
-  unsigned i, j;
-
-  memcpy(nqpqx, q, sizeof(limb) * 5);
-
-  for (i = 0; i < 32; ++i) {
-    u8 byte = n[31 - i];
-    for (j = 0; j < 8; ++j) {
-      const limb bit = byte >> 7;
-
-      swap_conditional(nqx, nqpqx, bit);
-      swap_conditional(nqz, nqpqz, bit);
-      fmonty(nqx2, nqz2,
-             nqpqx2, nqpqz2,
-             nqx, nqz,
-             nqpqx, nqpqz,
-             q);
-      swap_conditional(nqx2, nqpqx2, bit);
-      swap_conditional(nqz2, nqpqz2, bit);
-
-      t = nqx;
-      nqx = nqx2;
-      nqx2 = t;
-      t = nqz;
-      nqz = nqz2;
-      nqz2 = t;
-      t = nqpqx;
-      nqpqx = nqpqx2;
-      nqpqx2 = t;
-      t = nqpqz;
-      nqpqz = nqpqz2;
-      nqpqz2 = t;
-
-      byte <<= 1;
-    }
-  }
-
-  memcpy(resultx, nqx, sizeof(limb) * 5);
-  memcpy(resultz, nqz, sizeof(limb) * 5);
-}
-
-
-// -----------------------------------------------------------------------------
-// Shamelessly copied from djb's code, tightened a little
-// -----------------------------------------------------------------------------
-static void
-crecip(felem out, const felem z) {
-  felem a,t0,b,c;
-
-  /* 2 */ fsquare_times(a, z, 1); // a = 2
-  /* 8 */ fsquare_times(t0, a, 2);
-  /* 9 */ fmul(b, t0, z); // b = 9
-  /* 11 */ fmul(a, b, a); // a = 11
-  /* 22 */ fsquare_times(t0, a, 1);
-  /* 2^5 - 2^0 = 31 */ fmul(b, t0, b);
-  /* 2^10 - 2^5 */ fsquare_times(t0, b, 5);
-  /* 2^10 - 2^0 */ fmul(b, t0, b);
-  /* 2^20 - 2^10 */ fsquare_times(t0, b, 10);
-  /* 2^20 - 2^0 */ fmul(c, t0, b);
-  /* 2^40 - 2^20 */ fsquare_times(t0, c, 20);
-  /* 2^40 - 2^0 */ fmul(t0, t0, c);
-  /* 2^50 - 2^10 */ fsquare_times(t0, t0, 10);
-  /* 2^50 - 2^0 */ fmul(b, t0, b);
-  /* 2^100 - 2^50 */ fsquare_times(t0, b, 50);
-  /* 2^100 - 2^0 */ fmul(c, t0, b);
-  /* 2^200 - 2^100 */ fsquare_times(t0, c, 100);
-  /* 2^200 - 2^0 */ fmul(t0, t0, c);
-  /* 2^250 - 2^50 */ fsquare_times(t0, t0, 50);
-  /* 2^250 - 2^0 */ fmul(t0, t0, b);
-  /* 2^255 - 2^5 */ fsquare_times(t0, t0, 5);
-  /* 2^255 - 21 */ fmul(out, t0, a);
-}
-
-int
-crypto_scalarmult_curve25519(u8 *mypublic, const u8 *secret, const u8 *basepoint) {
-  limb bp[5], x[5], z[5], zmone[5];
-  uint8_t e[32];
-  int i;
-
-  for (i = 0;i < 32;++i) e[i] = secret[i];
-  e[0] &= 248;
-  e[31] &= 127;
-  e[31] |= 64;
-
-  fexpand(bp, basepoint);
-  cmult(x, z, e, bp);
-  crecip(zmone, z);
-  fmul(z, x, zmone);
-  fcontract(mypublic, z);
-  return 0;
-}
-
-#endif

+ 0 - 864
app/jni/nacl/smult_donna.c

@@ -1,864 +0,0 @@
-/* Copyright 2008, Google Inc.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are
- * met:
- *
- *     * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- *     * Redistributions in binary form must reproduce the above
- * copyright notice, this list of conditions and the following disclaimer
- * in the documentation and/or other materials provided with the
- * distribution.
- *     * Neither the name of Google Inc. nor the names of its
- * contributors may be used to endorse or promote products derived from
- * this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- * curve25519-donna: Curve25519 elliptic curve, public key function
- *
- * http://code.google.com/p/curve25519-donna/
- *
- * Adam Langley <agl@imperialviolet.org>
- *
- * Derived from public domain C code by Daniel J. Bernstein <djb@cr.yp.to>
- *
- * More information about curve25519 can be found here
- *   http://cr.yp.to/ecdh.html
- *
- * djb's sample implementation of curve25519 is written in a special assembly
- * language called qhasm and uses the floating point registers.
- *
- * This is, almost, a clean room reimplementation from the curve25519 paper. It
- * uses many of the tricks described therein. Only the crecip function is taken
- * from the sample implementation. */
-
-#if defined(__arm__) || defined(__i386__)
-
-#include <string.h>
-#include <stdint.h>
-
-#ifdef _MSC_VER
-#define inline __inline
-#endif
-
-typedef uint8_t u8;
-typedef int32_t s32;
-typedef int64_t limb;
-
-/* Field element representation:
- *
- * Field elements are written as an array of signed, 64-bit limbs, least
- * significant first. The value of the field element is:
- *   x[0] + 2^26·x[1] + x^51·x[2] + 2^102·x[3] + ...
- *
- * i.e. the limbs are 26, 25, 26, 25, ... bits wide. */
-
-/* Sum two numbers: output += in */
-static void fsum(limb *output, const limb *in) {
-  unsigned i;
-  for (i = 0; i < 10; i += 2) {
-    output[0+i] = output[0+i] + in[0+i];
-    output[1+i] = output[1+i] + in[1+i];
-  }
-}
-
-/* Find the difference of two numbers: output = in - output
- * (note the order of the arguments!). */
-static void fdifference(limb *output, const limb *in) {
-  unsigned i;
-  for (i = 0; i < 10; ++i) {
-    output[i] = in[i] - output[i];
-  }
-}
-
-/* Multiply a number by a scalar: output = in * scalar */
-static void fscalar_product(limb *output, const limb *in, const limb scalar) {
-  unsigned i;
-  for (i = 0; i < 10; ++i) {
-    output[i] = in[i] * scalar;
-  }
-}
-
-/* Multiply two numbers: output = in2 * in
- *
- * output must be distinct to both inputs. The inputs are reduced coefficient
- * form, the output is not.
- *
- * output[x] <= 14 * the largest product of the input limbs. */
-static void fproduct(limb *output, const limb *in2, const limb *in) {
-  output[0] =       ((limb) ((s32) in2[0])) * ((s32) in[0]);
-  output[1] =       ((limb) ((s32) in2[0])) * ((s32) in[1]) +
-                    ((limb) ((s32) in2[1])) * ((s32) in[0]);
-  output[2] =  2 *  ((limb) ((s32) in2[1])) * ((s32) in[1]) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[2]) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[0]);
-  output[3] =       ((limb) ((s32) in2[1])) * ((s32) in[2]) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[1]) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[3])) * ((s32) in[0]);
-  output[4] =       ((limb) ((s32) in2[2])) * ((s32) in[2]) +
-               2 * (((limb) ((s32) in2[1])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[3])) * ((s32) in[1])) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[4]) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[0]);
-  output[5] =       ((limb) ((s32) in2[2])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[3])) * ((s32) in[2]) +
-                    ((limb) ((s32) in2[1])) * ((s32) in[4]) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[1]) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[5])) * ((s32) in[0]);
-  output[6] =  2 * (((limb) ((s32) in2[3])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[1])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[5])) * ((s32) in[1])) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[4]) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[2]) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[6]) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[0]);
-  output[7] =       ((limb) ((s32) in2[3])) * ((s32) in[4]) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[5])) * ((s32) in[2]) +
-                    ((limb) ((s32) in2[1])) * ((s32) in[6]) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[1]) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[7])) * ((s32) in[0]);
-  output[8] =       ((limb) ((s32) in2[4])) * ((s32) in[4]) +
-               2 * (((limb) ((s32) in2[3])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[5])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[1])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[7])) * ((s32) in[1])) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[6]) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[2]) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[0]);
-  output[9] =       ((limb) ((s32) in2[4])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[5])) * ((s32) in[4]) +
-                    ((limb) ((s32) in2[3])) * ((s32) in[6]) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[7])) * ((s32) in[2]) +
-                    ((limb) ((s32) in2[1])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[1]) +
-                    ((limb) ((s32) in2[0])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[0]);
-  output[10] = 2 * (((limb) ((s32) in2[5])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[3])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[7])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[1])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[1])) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[6]) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[4]) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[2]);
-  output[11] =      ((limb) ((s32) in2[5])) * ((s32) in[6]) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[7])) * ((s32) in[4]) +
-                    ((limb) ((s32) in2[3])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[3]) +
-                    ((limb) ((s32) in2[2])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[2]);
-  output[12] =      ((limb) ((s32) in2[6])) * ((s32) in[6]) +
-               2 * (((limb) ((s32) in2[5])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[7])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[3])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[3])) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[4]);
-  output[13] =      ((limb) ((s32) in2[6])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[7])) * ((s32) in[6]) +
-                    ((limb) ((s32) in2[5])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[5]) +
-                    ((limb) ((s32) in2[4])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[4]);
-  output[14] = 2 * (((limb) ((s32) in2[7])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[5])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[5])) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[6]);
-  output[15] =      ((limb) ((s32) in2[7])) * ((s32) in[8]) +
-                    ((limb) ((s32) in2[8])) * ((s32) in[7]) +
-                    ((limb) ((s32) in2[6])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[6]);
-  output[16] =      ((limb) ((s32) in2[8])) * ((s32) in[8]) +
-               2 * (((limb) ((s32) in2[7])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[7]));
-  output[17] =      ((limb) ((s32) in2[8])) * ((s32) in[9]) +
-                    ((limb) ((s32) in2[9])) * ((s32) in[8]);
-  output[18] = 2 *  ((limb) ((s32) in2[9])) * ((s32) in[9]);
-}
-
-/* Reduce a long form to a short form by taking the input mod 2^255 - 19.
- *
- * On entry: |output[i]| < 14*2^54
- * On exit: |output[0..8]| < 280*2^54 */
-static void freduce_degree(limb *output) {
-  /* Each of these shifts and adds ends up multiplying the value by 19.
-   *
-   * For output[0..8], the absolute entry value is < 14*2^54 and we add, at
-   * most, 19*14*2^54 thus, on exit, |output[0..8]| < 280*2^54. */
-  output[8] += output[18] << 4;
-  output[8] += output[18] << 1;
-  output[8] += output[18];
-  output[7] += output[17] << 4;
-  output[7] += output[17] << 1;
-  output[7] += output[17];
-  output[6] += output[16] << 4;
-  output[6] += output[16] << 1;
-  output[6] += output[16];
-  output[5] += output[15] << 4;
-  output[5] += output[15] << 1;
-  output[5] += output[15];
-  output[4] += output[14] << 4;
-  output[4] += output[14] << 1;
-  output[4] += output[14];
-  output[3] += output[13] << 4;
-  output[3] += output[13] << 1;
-  output[3] += output[13];
-  output[2] += output[12] << 4;
-  output[2] += output[12] << 1;
-  output[2] += output[12];
-  output[1] += output[11] << 4;
-  output[1] += output[11] << 1;
-  output[1] += output[11];
-  output[0] += output[10] << 4;
-  output[0] += output[10] << 1;
-  output[0] += output[10];
-}
-
-#if (-1 & 3) != 3
-#error "This code only works on a two's complement system"
-#endif
-
-/* return v / 2^26, using only shifts and adds.
- *
- * On entry: v can take any value. */
-static inline limb
-div_by_2_26(const limb v)
-{
-  /* High word of v; no shift needed. */
-  const uint32_t highword = (uint32_t) (((uint64_t) v) >> 32);
-  /* Set to all 1s if v was negative; else set to 0s. */
-  const int32_t sign = ((int32_t) highword) >> 31;
-  /* Set to 0x3ffffff if v was negative; else set to 0. */
-  const int32_t roundoff = ((uint32_t) sign) >> 6;
-  /* Should return v / (1<<26) */
-  return (v + roundoff) >> 26;
-}
-
-/* return v / (2^25), using only shifts and adds.
- *
- * On entry: v can take any value. */
-static inline limb
-div_by_2_25(const limb v)
-{
-  /* High word of v; no shift needed*/
-  const uint32_t highword = (uint32_t) (((uint64_t) v) >> 32);
-  /* Set to all 1s if v was negative; else set to 0s. */
-  const int32_t sign = ((int32_t) highword) >> 31;
-  /* Set to 0x1ffffff if v was negative; else set to 0. */
-  const int32_t roundoff = ((uint32_t) sign) >> 7;
-  /* Should return v / (1<<25) */
-  return (v + roundoff) >> 25;
-}
-
-/* Reduce all coefficients of the short form input so that |x| < 2^26.
- *
- * On entry: |output[i]| < 280*2^54 */
-static void freduce_coefficients(limb *output) {
-  unsigned i;
-
-  output[10] = 0;
-
-  for (i = 0; i < 10; i += 2) {
-    limb over = div_by_2_26(output[i]);
-    /* The entry condition (that |output[i]| < 280*2^54) means that over is, at
-     * most, 280*2^28 in the first iteration of this loop. This is added to the
-     * next limb and we can approximate the resulting bound of that limb by
-     * 281*2^54. */
-    output[i] -= over << 26;
-    output[i+1] += over;
-
-    /* For the first iteration, |output[i+1]| < 281*2^54, thus |over| <
-     * 281*2^29. When this is added to the next limb, the resulting bound can
-     * be approximated as 281*2^54.
-     *
-     * For subsequent iterations of the loop, 281*2^54 remains a conservative
-     * bound and no overflow occurs. */
-    over = div_by_2_25(output[i+1]);
-    output[i+1] -= over << 25;
-    output[i+2] += over;
-  }
-  /* Now |output[10]| < 281*2^29 and all other coefficients are reduced. */
-  output[0] += output[10] << 4;
-  output[0] += output[10] << 1;
-  output[0] += output[10];
-
-  output[10] = 0;
-
-  /* Now output[1..9] are reduced, and |output[0]| < 2^26 + 19*281*2^29
-   * So |over| will be no more than 2^16. */
-  {
-    limb over = div_by_2_26(output[0]);
-    output[0] -= over << 26;
-    output[1] += over;
-  }
-
-  /* Now output[0,2..9] are reduced, and |output[1]| < 2^25 + 2^16 < 2^26. The
-   * bound on |output[1]| is sufficient to meet our needs. */
-}
-
-/* A helpful wrapper around fproduct: output = in * in2.
- *
- * On entry: |in[i]| < 2^27 and |in2[i]| < 2^27.
- *
- * output must be distinct to both inputs. The output is reduced degree
- * (indeed, one need only provide storage for 10 limbs) and |output[i]| < 2^26. */
-static void
-fmul(limb *output, const limb *in, const limb *in2) {
-  limb t[19];
-  fproduct(t, in, in2);
-  /* |t[i]| < 14*2^54 */
-  freduce_degree(t);
-  freduce_coefficients(t);
-  /* |t[i]| < 2^26 */
-  memcpy(output, t, sizeof(limb) * 10);
-}
-
-/* Square a number: output = in**2
- *
- * output must be distinct from the input. The inputs are reduced coefficient
- * form, the output is not.
- *
- * output[x] <= 14 * the largest product of the input limbs. */
-static void fsquare_inner(limb *output, const limb *in) {
-  output[0] =       ((limb) ((s32) in[0])) * ((s32) in[0]);
-  output[1] =  2 *  ((limb) ((s32) in[0])) * ((s32) in[1]);
-  output[2] =  2 * (((limb) ((s32) in[1])) * ((s32) in[1]) +
-                    ((limb) ((s32) in[0])) * ((s32) in[2]));
-  output[3] =  2 * (((limb) ((s32) in[1])) * ((s32) in[2]) +
-                    ((limb) ((s32) in[0])) * ((s32) in[3]));
-  output[4] =       ((limb) ((s32) in[2])) * ((s32) in[2]) +
-               4 *  ((limb) ((s32) in[1])) * ((s32) in[3]) +
-               2 *  ((limb) ((s32) in[0])) * ((s32) in[4]);
-  output[5] =  2 * (((limb) ((s32) in[2])) * ((s32) in[3]) +
-                    ((limb) ((s32) in[1])) * ((s32) in[4]) +
-                    ((limb) ((s32) in[0])) * ((s32) in[5]));
-  output[6] =  2 * (((limb) ((s32) in[3])) * ((s32) in[3]) +
-                    ((limb) ((s32) in[2])) * ((s32) in[4]) +
-                    ((limb) ((s32) in[0])) * ((s32) in[6]) +
-               2 *  ((limb) ((s32) in[1])) * ((s32) in[5]));
-  output[7] =  2 * (((limb) ((s32) in[3])) * ((s32) in[4]) +
-                    ((limb) ((s32) in[2])) * ((s32) in[5]) +
-                    ((limb) ((s32) in[1])) * ((s32) in[6]) +
-                    ((limb) ((s32) in[0])) * ((s32) in[7]));
-  output[8] =       ((limb) ((s32) in[4])) * ((s32) in[4]) +
-               2 * (((limb) ((s32) in[2])) * ((s32) in[6]) +
-                    ((limb) ((s32) in[0])) * ((s32) in[8]) +
-               2 * (((limb) ((s32) in[1])) * ((s32) in[7]) +
-                    ((limb) ((s32) in[3])) * ((s32) in[5])));
-  output[9] =  2 * (((limb) ((s32) in[4])) * ((s32) in[5]) +
-                    ((limb) ((s32) in[3])) * ((s32) in[6]) +
-                    ((limb) ((s32) in[2])) * ((s32) in[7]) +
-                    ((limb) ((s32) in[1])) * ((s32) in[8]) +
-                    ((limb) ((s32) in[0])) * ((s32) in[9]));
-  output[10] = 2 * (((limb) ((s32) in[5])) * ((s32) in[5]) +
-                    ((limb) ((s32) in[4])) * ((s32) in[6]) +
-                    ((limb) ((s32) in[2])) * ((s32) in[8]) +
-               2 * (((limb) ((s32) in[3])) * ((s32) in[7]) +
-                    ((limb) ((s32) in[1])) * ((s32) in[9])));
-  output[11] = 2 * (((limb) ((s32) in[5])) * ((s32) in[6]) +
-                    ((limb) ((s32) in[4])) * ((s32) in[7]) +
-                    ((limb) ((s32) in[3])) * ((s32) in[8]) +
-                    ((limb) ((s32) in[2])) * ((s32) in[9]));
-  output[12] =      ((limb) ((s32) in[6])) * ((s32) in[6]) +
-               2 * (((limb) ((s32) in[4])) * ((s32) in[8]) +
-               2 * (((limb) ((s32) in[5])) * ((s32) in[7]) +
-                    ((limb) ((s32) in[3])) * ((s32) in[9])));
-  output[13] = 2 * (((limb) ((s32) in[6])) * ((s32) in[7]) +
-                    ((limb) ((s32) in[5])) * ((s32) in[8]) +
-                    ((limb) ((s32) in[4])) * ((s32) in[9]));
-  output[14] = 2 * (((limb) ((s32) in[7])) * ((s32) in[7]) +
-                    ((limb) ((s32) in[6])) * ((s32) in[8]) +
-               2 *  ((limb) ((s32) in[5])) * ((s32) in[9]));
-  output[15] = 2 * (((limb) ((s32) in[7])) * ((s32) in[8]) +
-                    ((limb) ((s32) in[6])) * ((s32) in[9]));
-  output[16] =      ((limb) ((s32) in[8])) * ((s32) in[8]) +
-               4 *  ((limb) ((s32) in[7])) * ((s32) in[9]);
-  output[17] = 2 *  ((limb) ((s32) in[8])) * ((s32) in[9]);
-  output[18] = 2 *  ((limb) ((s32) in[9])) * ((s32) in[9]);
-}
-
-/* fsquare sets output = in^2.
- *
- * On entry: The |in| argument is in reduced coefficients form and |in[i]| <
- * 2^27.
- *
- * On exit: The |output| argument is in reduced coefficients form (indeed, one
- * need only provide storage for 10 limbs) and |out[i]| < 2^26. */
-static void
-fsquare(limb *output, const limb *in) {
-  limb t[19];
-  fsquare_inner(t, in);
-  /* |t[i]| < 14*2^54 because the largest product of two limbs will be <
-   * 2^(27+27) and fsquare_inner adds together, at most, 14 of those
-   * products. */
-  freduce_degree(t);
-  freduce_coefficients(t);
-  /* |t[i]| < 2^26 */
-  memcpy(output, t, sizeof(limb) * 10);
-}
-
-/* Take a little-endian, 32-byte number and expand it into polynomial form */
-static void
-fexpand(limb *output, const u8 *input) {
-#define F(n,start,shift,mask) \
-  output[n] = ((((limb) input[start + 0]) | \
-                ((limb) input[start + 1]) << 8 | \
-                ((limb) input[start + 2]) << 16 | \
-                ((limb) input[start + 3]) << 24) >> shift) & mask;
-  F(0, 0, 0, 0x3ffffff);
-  F(1, 3, 2, 0x1ffffff);
-  F(2, 6, 3, 0x3ffffff);
-  F(3, 9, 5, 0x1ffffff);
-  F(4, 12, 6, 0x3ffffff);
-  F(5, 16, 0, 0x1ffffff);
-  F(6, 19, 1, 0x3ffffff);
-  F(7, 22, 3, 0x1ffffff);
-  F(8, 25, 4, 0x3ffffff);
-  F(9, 28, 6, 0x1ffffff);
-#undef F
-}
-
-#if (-32 >> 1) != -16
-#error "This code only works when >> does sign-extension on negative numbers"
-#endif
-
-/* s32_eq returns 0xffffffff iff a == b and zero otherwise. */
-static s32 s32_eq(s32 a, s32 b) {
-  a = ~(a ^ b);
-  a &= a << 16;
-  a &= a << 8;
-  a &= a << 4;
-  a &= a << 2;
-  a &= a << 1;
-  return a >> 31;
-}
-
-/* s32_gte returns 0xffffffff if a >= b and zero otherwise, where a and b are
- * both non-negative. */
-static s32 s32_gte(s32 a, s32 b) {
-  a -= b;
-  /* a >= 0 iff a >= b. */
-  return ~(a >> 31);
-}
-
-/* Take a fully reduced polynomial form number and contract it into a
- * little-endian, 32-byte array.
- *
- * On entry: |input_limbs[i]| < 2^26 */
-static void
-fcontract(u8 *output, limb *input_limbs) {
-  int i;
-  int j;
-  s32 input[10];
-  s32 mask;
-
-  /* |input_limbs[i]| < 2^26, so it's valid to convert to an s32. */
-  for (i = 0; i < 10; i++) {
-    input[i] = input_limbs[i];
-  }
-
-  for (j = 0; j < 2; ++j) {
-    for (i = 0; i < 9; ++i) {
-      if ((i & 1) == 1) {
-        /* This calculation is a time-invariant way to make input[i]
-         * non-negative by borrowing from the next-larger limb. */
-        const s32 mask = input[i] >> 31;
-        const s32 carry = -((input[i] & mask) >> 25);
-        input[i] = input[i] + (carry << 25);
-        input[i+1] = input[i+1] - carry;
-      } else {
-        const s32 mask = input[i] >> 31;
-        const s32 carry = -((input[i] & mask) >> 26);
-        input[i] = input[i] + (carry << 26);
-        input[i+1] = input[i+1] - carry;
-      }
-    }
-
-    /* There's no greater limb for input[9] to borrow from, but we can multiply
-     * by 19 and borrow from input[0], which is valid mod 2^255-19. */
-    {
-      const s32 mask = input[9] >> 31;
-      const s32 carry = -((input[9] & mask) >> 25);
-      input[9] = input[9] + (carry << 25);
-      input[0] = input[0] - (carry * 19);
-    }
-
-    /* After the first iteration, input[1..9] are non-negative and fit within
-     * 25 or 26 bits, depending on position. However, input[0] may be
-     * negative. */
-  }
-
-  /* The first borrow-propagation pass above ended with every limb
-     except (possibly) input[0] non-negative.
-
-     If input[0] was negative after the first pass, then it was because of a
-     carry from input[9]. On entry, input[9] < 2^26 so the carry was, at most,
-     one, since (2**26-1) >> 25 = 1. Thus input[0] >= -19.
-
-     In the second pass, each limb is decreased by at most one. Thus the second
-     borrow-propagation pass could only have wrapped around to decrease
-     input[0] again if the first pass left input[0] negative *and* input[1]
-     through input[9] were all zero.  In that case, input[1] is now 2^25 - 1,
-     and this last borrow-propagation step will leave input[1] non-negative. */
-  {
-    const s32 mask = input[0] >> 31;
-    const s32 carry = -((input[0] & mask) >> 26);
-    input[0] = input[0] + (carry << 26);
-    input[1] = input[1] - carry;
-  }
-
-  /* All input[i] are now non-negative. However, there might be values between
-   * 2^25 and 2^26 in a limb which is, nominally, 25 bits wide. */
-  for (j = 0; j < 2; j++) {
-    for (i = 0; i < 9; i++) {
-      if ((i & 1) == 1) {
-        const s32 carry = input[i] >> 25;
-        input[i] &= 0x1ffffff;
-        input[i+1] += carry;
-      } else {
-        const s32 carry = input[i] >> 26;
-        input[i] &= 0x3ffffff;
-        input[i+1] += carry;
-      }
-    }
-
-    {
-      const s32 carry = input[9] >> 25;
-      input[9] &= 0x1ffffff;
-      input[0] += 19*carry;
-    }
-  }
-
-  /* If the first carry-chain pass, just above, ended up with a carry from
-   * input[9], and that caused input[0] to be out-of-bounds, then input[0] was
-   * < 2^26 + 2*19, because the carry was, at most, two.
-   *
-   * If the second pass carried from input[9] again then input[0] is < 2*19 and
-   * the input[9] -> input[0] carry didn't push input[0] out of bounds. */
-
-  /* It still remains the case that input might be between 2^255-19 and 2^255.
-   * In this case, input[1..9] must take their maximum value and input[0] must
-   * be >= (2^255-19) & 0x3ffffff, which is 0x3ffffed. */
-  mask = s32_gte(input[0], 0x3ffffed);
-  for (i = 1; i < 10; i++) {
-    if ((i & 1) == 1) {
-      mask &= s32_eq(input[i], 0x1ffffff);
-    } else {
-      mask &= s32_eq(input[i], 0x3ffffff);
-    }
-  }
-
-  /* mask is either 0xffffffff (if input >= 2^255-19) and zero otherwise. Thus
-   * this conditionally subtracts 2^255-19. */
-  input[0] -= mask & 0x3ffffed;
-
-  for (i = 1; i < 10; i++) {
-    if ((i & 1) == 1) {
-      input[i] -= mask & 0x1ffffff;
-    } else {
-      input[i] -= mask & 0x3ffffff;
-    }
-  }
-
-  input[1] <<= 2;
-  input[2] <<= 3;
-  input[3] <<= 5;
-  input[4] <<= 6;
-  input[6] <<= 1;
-  input[7] <<= 3;
-  input[8] <<= 4;
-  input[9] <<= 6;
-#define F(i, s) \
-  output[s+0] |=  input[i] & 0xff; \
-  output[s+1]  = (input[i] >> 8) & 0xff; \
-  output[s+2]  = (input[i] >> 16) & 0xff; \
-  output[s+3]  = (input[i] >> 24) & 0xff;
-  output[0] = 0;
-  output[16] = 0;
-  F(0,0);
-  F(1,3);
-  F(2,6);
-  F(3,9);
-  F(4,12);
-  F(5,16);
-  F(6,19);
-  F(7,22);
-  F(8,25);
-  F(9,28);
-#undef F
-}
-
-/* Input: Q, Q', Q-Q'
- * Output: 2Q, Q+Q'
- *
- *   x2 z3: long form
- *   x3 z3: long form
- *   x z: short form, destroyed
- *   xprime zprime: short form, destroyed
- *   qmqp: short form, preserved
- *
- * On entry and exit, the absolute value of the limbs of all inputs and outputs
- * are < 2^26. */
-static void fmonty(limb *x2, limb *z2,  /* output 2Q */
-                   limb *x3, limb *z3,  /* output Q + Q' */
-                   limb *x, limb *z,    /* input Q */
-                   limb *xprime, limb *zprime,  /* input Q' */
-                   const limb *qmqp /* input Q - Q' */) {
-  limb origx[10], origxprime[10], zzz[19], xx[19], zz[19], xxprime[19],
-        zzprime[19], zzzprime[19], xxxprime[19];
-
-  memcpy(origx, x, 10 * sizeof(limb));
-  fsum(x, z);
-  /* |x[i]| < 2^27 */
-  fdifference(z, origx);  /* does x - z */
-  /* |z[i]| < 2^27 */
-
-  memcpy(origxprime, xprime, sizeof(limb) * 10);
-  fsum(xprime, zprime);
-  /* |xprime[i]| < 2^27 */
-  fdifference(zprime, origxprime);
-  /* |zprime[i]| < 2^27 */
-  fproduct(xxprime, xprime, z);
-  /* |xxprime[i]| < 14*2^54: the largest product of two limbs will be <
-   * 2^(27+27) and fproduct adds together, at most, 14 of those products.
-   * (Approximating that to 2^58 doesn't work out.) */
-  fproduct(zzprime, x, zprime);
-  /* |zzprime[i]| < 14*2^54 */
-  freduce_degree(xxprime);
-  freduce_coefficients(xxprime);
-  /* |xxprime[i]| < 2^26 */
-  freduce_degree(zzprime);
-  freduce_coefficients(zzprime);
-  /* |zzprime[i]| < 2^26 */
-  memcpy(origxprime, xxprime, sizeof(limb) * 10);
-  fsum(xxprime, zzprime);
-  /* |xxprime[i]| < 2^27 */
-  fdifference(zzprime, origxprime);
-  /* |zzprime[i]| < 2^27 */
-  fsquare(xxxprime, xxprime);
-  /* |xxxprime[i]| < 2^26 */
-  fsquare(zzzprime, zzprime);
-  /* |zzzprime[i]| < 2^26 */
-  fproduct(zzprime, zzzprime, qmqp);
-  /* |zzprime[i]| < 14*2^52 */
-  freduce_degree(zzprime);
-  freduce_coefficients(zzprime);
-  /* |zzprime[i]| < 2^26 */
-  memcpy(x3, xxxprime, sizeof(limb) * 10);
-  memcpy(z3, zzprime, sizeof(limb) * 10);
-
-  fsquare(xx, x);
-  /* |xx[i]| < 2^26 */
-  fsquare(zz, z);
-  /* |zz[i]| < 2^26 */
-  fproduct(x2, xx, zz);
-  /* |x2[i]| < 14*2^52 */
-  freduce_degree(x2);
-  freduce_coefficients(x2);
-  /* |x2[i]| < 2^26 */
-  fdifference(zz, xx);  // does zz = xx - zz
-  /* |zz[i]| < 2^27 */
-  memset(zzz + 10, 0, sizeof(limb) * 9);
-  fscalar_product(zzz, zz, 121665);
-  /* |zzz[i]| < 2^(27+17) */
-  /* No need to call freduce_degree here:
-     fscalar_product doesn't increase the degree of its input. */
-  freduce_coefficients(zzz);
-  /* |zzz[i]| < 2^26 */
-  fsum(zzz, xx);
-  /* |zzz[i]| < 2^27 */
-  fproduct(z2, zz, zzz);
-  /* |z2[i]| < 14*2^(26+27) */
-  freduce_degree(z2);
-  freduce_coefficients(z2);
-  /* |z2|i| < 2^26 */
-}
-
-/* Conditionally swap two reduced-form limb arrays if 'iswap' is 1, but leave
- * them unchanged if 'iswap' is 0.  Runs in data-invariant time to avoid
- * side-channel attacks.
- *
- * NOTE that this function requires that 'iswap' be 1 or 0; other values give
- * wrong results.  Also, the two limb arrays must be in reduced-coefficient,
- * reduced-degree form: the values in a[10..19] or b[10..19] aren't swapped,
- * and all all values in a[0..9],b[0..9] must have magnitude less than
- * INT32_MAX. */
-static void
-swap_conditional(limb a[19], limb b[19], limb iswap) {
-  unsigned i;
-  const s32 swap = (s32) -iswap;
-
-  for (i = 0; i < 10; ++i) {
-    const s32 x = swap & ( ((s32)a[i]) ^ ((s32)b[i]) );
-    a[i] = ((s32)a[i]) ^ x;
-    b[i] = ((s32)b[i]) ^ x;
-  }
-}
-
-/* Calculates nQ where Q is the x-coordinate of a point on the curve
- *
- *   resultx/resultz: the x coordinate of the resulting curve point (short form)
- *   n: a little endian, 32-byte number
- *   q: a point of the curve (short form) */
-static void
-cmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) {
-  limb a[19] = {0}, b[19] = {1}, c[19] = {1}, d[19] = {0};
-  limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t;
-  limb e[19] = {0}, f[19] = {1}, g[19] = {0}, h[19] = {1};
-  limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h;
-
-  unsigned i, j;
-
-  memcpy(nqpqx, q, sizeof(limb) * 10);
-
-  for (i = 0; i < 32; ++i) {
-    u8 byte = n[31 - i];
-    for (j = 0; j < 8; ++j) {
-      const limb bit = byte >> 7;
-
-      swap_conditional(nqx, nqpqx, bit);
-      swap_conditional(nqz, nqpqz, bit);
-      fmonty(nqx2, nqz2,
-             nqpqx2, nqpqz2,
-             nqx, nqz,
-             nqpqx, nqpqz,
-             q);
-      swap_conditional(nqx2, nqpqx2, bit);
-      swap_conditional(nqz2, nqpqz2, bit);
-
-      t = nqx;
-      nqx = nqx2;
-      nqx2 = t;
-      t = nqz;
-      nqz = nqz2;
-      nqz2 = t;
-      t = nqpqx;
-      nqpqx = nqpqx2;
-      nqpqx2 = t;
-      t = nqpqz;
-      nqpqz = nqpqz2;
-      nqpqz2 = t;
-
-      byte <<= 1;
-    }
-  }
-
-  memcpy(resultx, nqx, sizeof(limb) * 10);
-  memcpy(resultz, nqz, sizeof(limb) * 10);
-}
-
-// -----------------------------------------------------------------------------
-// Shamelessly copied from djb's code
-// -----------------------------------------------------------------------------
-static void
-crecip(limb *out, const limb *z) {
-  limb z2[10];
-  limb z9[10];
-  limb z11[10];
-  limb z2_5_0[10];
-  limb z2_10_0[10];
-  limb z2_20_0[10];
-  limb z2_50_0[10];
-  limb z2_100_0[10];
-  limb t0[10];
-  limb t1[10];
-  int i;
-
-  /* 2 */ fsquare(z2,z);
-  /* 4 */ fsquare(t1,z2);
-  /* 8 */ fsquare(t0,t1);
-  /* 9 */ fmul(z9,t0,z);
-  /* 11 */ fmul(z11,z9,z2);
-  /* 22 */ fsquare(t0,z11);
-  /* 2^5 - 2^0 = 31 */ fmul(z2_5_0,t0,z9);
-
-  /* 2^6 - 2^1 */ fsquare(t0,z2_5_0);
-  /* 2^7 - 2^2 */ fsquare(t1,t0);
-  /* 2^8 - 2^3 */ fsquare(t0,t1);
-  /* 2^9 - 2^4 */ fsquare(t1,t0);
-  /* 2^10 - 2^5 */ fsquare(t0,t1);
-  /* 2^10 - 2^0 */ fmul(z2_10_0,t0,z2_5_0);
-
-  /* 2^11 - 2^1 */ fsquare(t0,z2_10_0);
-  /* 2^12 - 2^2 */ fsquare(t1,t0);
-  /* 2^20 - 2^10 */ for (i = 2;i < 10;i += 2) { fsquare(t0,t1); fsquare(t1,t0); }
-  /* 2^20 - 2^0 */ fmul(z2_20_0,t1,z2_10_0);
-
-  /* 2^21 - 2^1 */ fsquare(t0,z2_20_0);
-  /* 2^22 - 2^2 */ fsquare(t1,t0);
-  /* 2^40 - 2^20 */ for (i = 2;i < 20;i += 2) { fsquare(t0,t1); fsquare(t1,t0); }
-  /* 2^40 - 2^0 */ fmul(t0,t1,z2_20_0);
-
-  /* 2^41 - 2^1 */ fsquare(t1,t0);
-  /* 2^42 - 2^2 */ fsquare(t0,t1);
-  /* 2^50 - 2^10 */ for (i = 2;i < 10;i += 2) { fsquare(t1,t0); fsquare(t0,t1); }
-  /* 2^50 - 2^0 */ fmul(z2_50_0,t0,z2_10_0);
-
-  /* 2^51 - 2^1 */ fsquare(t0,z2_50_0);
-  /* 2^52 - 2^2 */ fsquare(t1,t0);
-  /* 2^100 - 2^50 */ for (i = 2;i < 50;i += 2) { fsquare(t0,t1); fsquare(t1,t0); }
-  /* 2^100 - 2^0 */ fmul(z2_100_0,t1,z2_50_0);
-
-  /* 2^101 - 2^1 */ fsquare(t1,z2_100_0);
-  /* 2^102 - 2^2 */ fsquare(t0,t1);
-  /* 2^200 - 2^100 */ for (i = 2;i < 100;i += 2) { fsquare(t1,t0); fsquare(t0,t1); }
-  /* 2^200 - 2^0 */ fmul(t1,t0,z2_100_0);
-
-  /* 2^201 - 2^1 */ fsquare(t0,t1);
-  /* 2^202 - 2^2 */ fsquare(t1,t0);
-  /* 2^250 - 2^50 */ for (i = 2;i < 50;i += 2) { fsquare(t0,t1); fsquare(t1,t0); }
-  /* 2^250 - 2^0 */ fmul(t0,t1,z2_50_0);
-
-  /* 2^251 - 2^1 */ fsquare(t1,t0);
-  /* 2^252 - 2^2 */ fsquare(t0,t1);
-  /* 2^253 - 2^3 */ fsquare(t1,t0);
-  /* 2^254 - 2^4 */ fsquare(t0,t1);
-  /* 2^255 - 2^5 */ fsquare(t1,t0);
-  /* 2^255 - 21 */ fmul(out,t1,z11);
-}
-
-int
-crypto_scalarmult_curve25519(u8 *mypublic, const u8 *secret, const u8 *basepoint) {
-  limb bp[10], x[10], z[11], zmone[10];
-  uint8_t e[32];
-  int i;
-
-  for (i = 0; i < 32; ++i) e[i] = secret[i];
-  e[0] &= 248;
-  e[31] &= 127;
-  e[31] |= 64;
-
-  fexpand(bp, basepoint);
-  cmult(x, z, e, bp);
-  crecip(zmone, z);
-  fmul(z, x, zmone);
-  fcontract(mypublic, z);
-  return 0;
-}
-
-#endif

+ 1 - 1
app/libs/arm64-v8a/README.txt

@@ -1 +1 @@
-The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.13.0/dist/jna.aar
+The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.18.1/dist/jna.aar

BIN
app/libs/arm64-v8a/libjnidispatch.so


+ 1 - 1
app/libs/armeabi-v7a/README.txt

@@ -1 +1 @@
-The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.13.0/dist/jna.aar
+The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.18.1/dist/jna.aar

BIN
app/libs/armeabi-v7a/libjnidispatch.so


+ 1 - 1
app/libs/x86/README.txt

@@ -1 +1 @@
-The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.13.0/dist/jna.aar
+The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.18.1/dist/jna.aar

BIN
app/libs/x86/libjnidispatch.so


+ 1 - 1
app/libs/x86_64/README.txt

@@ -1 +1 @@
-The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.13.0/dist/jna.aar
+The file 'libjnidispatch.so' can also be extracted from https://github.com/java-native-access/jna/blob/5.18.1/dist/jna.aar

BIN
app/libs/x86_64/libjnidispatch.so


+ 0 - 4
app/proguard-project.txt

@@ -104,7 +104,6 @@ public static <fields>;
 -dontwarn com.google.common.collect.MinMaxPriorityQueue
 
 # threema-specific
--dontwarn org.mockito.**
 -dontwarn sun.reflect.**
 -dontwarn android.test.**
 -dontwarn class.org.junit.**
@@ -113,9 +112,6 @@ public static <fields>;
 -dontwarn android.view.**
 -dontwarn android.widget.**
 -dontwarn com.google.common.primitives.**
--dontwarn **CompatHoneycomb
--dontwarn **CompatHoneycombMR2
--dontwarn **CompatCreatorHoneycombMR2
 -dontwarn java.beans.**
 
 # WebRTC fails to build due to missing dependencies

+ 11 - 0
app/protobuf/extra.proto

@@ -0,0 +1,11 @@
+syntax = "proto3";
+
+package app;
+
+option java_package = "ch.threema.protobuf";
+option java_multiple_files = true;
+
+message EncryptedDataWithNonceAhead {
+  bytes nonce = 1;
+  bytes data = 2;
+}

+ 125 - 0
app/protobuf/key-storage.proto

@@ -0,0 +1,125 @@
+syntax = "proto3";
+
+package app;
+
+option java_package = "ch.threema.localcrypto.protobuf";
+option java_multiple_files = true;
+
+message InnerKeyStorage {
+  enum Version {
+    // Initial version
+    V1_0 = 0;
+  }
+}
+
+// Inner key storage V1, encoded in the following way:
+//
+// 1. Let `data` be the result of encoding this key storage to bytes.
+// 2. Let `version` be the selected `InnerKeyStorage.Version.V1_X` version.
+// 3. Return `u16-le(version) || data`.
+message InnerKeyStorageV1 {
+  // Master key, used for the database, files, encrypted settings, etc.
+  bytes master_key = 1;
+}
+
+message IntermediateKeyStorage {
+  enum Version {
+    // Initial version
+    V1_0 = 0;
+  }
+}
+
+// Intermediate key storage V1, encoded in the following way:
+//
+// 1. Let `data` be the result of encoding this key storage to bytes.
+// 2. Let `version` be the selected `IntermediateKeyStorage.Version.V1_X` version.
+// 3. Return `u16-le(version) || data`.
+message IntermediateKeyStorageV1 {
+  message RemoteSecretProtected {
+    // Associated remote secret authentication token
+    bytes remote_secret_authentication_token = 1;
+
+    // Associated remote secret hash
+    bytes remote_secret_hash = 2;
+
+    // Encapsulated compatible, version-prefixed inner key storage, encrypted
+    // and encoded in the following way:
+    //
+    // 1. Let `RS` be the remote secret.
+    // 2. Let `RSSK` be the result of
+    //    `BLAKE2b(key=RS, salt='rssk-a', personal='3ma-rs')`.
+    // 3. Let `inner` be the plaintext `Inner`, encoded to bytes.
+    // 4. Let `nonce` be a random nonce.
+    // 5. Let `encrypted-inner` be the result of encrypting `inner` by
+    //    `XChaCha20-Poly1305(key=RSSK, nonce)`.
+    // 6. Set this field to `nonce || encrypted-inner` (i.e. an
+    //    `extra.crypto.encrypted-data-with-nonce-ahead` struct).
+    bytes encrypted_inner = 3;
+  }
+
+  oneof inner {
+    // A compatible, version-prefixed inner key storage without any further
+    // protection
+    bytes plaintext_inner = 1;
+
+    // Inner key storage protected by the Remote Secret protocol
+    RemoteSecretProtected remote_secret_protected_inner = 2;
+  }
+}
+
+message OuterKeyStorage {
+  enum Version {
+    // Initial version
+    V1_0 = 0;
+  }
+}
+
+// Outer key storage V1, encoded in the following way:
+//
+// 1. Let `data` be the result of encoding this key storage to bytes.
+// 2. Let `version` be the selected `OuterKeyStorage.Version.V1_X` version.
+// 3. Return `u16-le(version) || data`.
+message OuterKeyStorageV1 {
+  message Argon2idProtected {
+    // Version of Argon2
+    enum Argon2Version {
+      VERSION_1_3 = 0;
+    }
+    Argon2Version version = 1;
+
+    // Random salt (16 bytes)
+    bytes salt = 2;
+
+    // Memory usage in bytes (≥ 128 MiB)
+    uint32 memory_bytes = 3;
+
+    // Number of iterations (≥ 3)
+    uint32 iterations = 4;
+
+    // Amount of parallelism (≥ 1, recommended to be 1)
+    uint32 parallelism = 5;
+
+    // Encapsulated compatible, version-prefixed intermediate key storage,
+    // encrypted and encoded in the following way:
+    //
+    // 1. Let `SK` be a 32 byte secret key derived by running Argon2id with the
+    //    given parameters and the user-provided passphrase.
+    // 2. Let `nonce` be a random nonce.
+    // 3. Let `intermediate` be a compatible, version-prefixed intermediate key
+    //    storage encoded to bytes.
+    // 4. Let `encrypted-intermediate` be the result of encrypting `intermediate`
+    //    by `XChaCha20-Poly1305(key=SK, nonce)`.
+    // 5. Set this field to `nonce || encrypted-intermediate` (i.e. an
+    //    `extra.crypto.encrypted-data-with-nonce-ahead` struct).
+    bytes encrypted_intermediate = 6;
+  }
+
+  oneof intermediate {
+    // A compatible, version-prefixed intermediate key storage without any
+    // further protection
+    bytes plaintext_intermediate = 1;
+
+    // Intermediate key storage protected by a passphrase, using Argon2id
+    Argon2idProtected argon2id_protected_intermediate = 2;
+  }
+}

+ 12 - 4
app/src/androidTest/java/ch/threema/app/TestCoreServiceManager.kt

@@ -29,8 +29,10 @@ import ch.threema.app.multidevice.PersistedMultiDeviceProperties
 import ch.threema.app.multidevice.linking.DeviceLinkingStatus
 import ch.threema.app.services.ContactService
 import ch.threema.app.services.UserService
-import ch.threema.app.stores.IdentityStore
-import ch.threema.app.stores.PreferenceStoreInterface
+import ch.threema.app.stores.EncryptedPreferenceStore
+import ch.threema.app.stores.IdentityProviderImpl
+import ch.threema.app.stores.IdentityStoreImpl
+import ch.threema.app.stores.PreferenceStore
 import ch.threema.app.tasks.TaskCreator
 import ch.threema.base.crypto.HashedNonce
 import ch.threema.base.crypto.Nonce
@@ -50,6 +52,7 @@ import ch.threema.domain.protocol.connection.data.InboundD2mMessage.DevicesInfo
 import ch.threema.domain.protocol.csp.fs.ForwardSecurityMessageProcessor
 import ch.threema.domain.protocol.multidevice.MultiDeviceKeys
 import ch.threema.domain.protocol.multidevice.MultiDeviceProperties
+import ch.threema.domain.stores.IdentityStore
 import ch.threema.domain.taskmanager.ActiveTaskCodec
 import ch.threema.domain.taskmanager.QueueSendCompleteListener
 import ch.threema.domain.taskmanager.Task
@@ -70,12 +73,17 @@ import kotlinx.coroutines.runBlocking
 class TestCoreServiceManager(
     override val version: AppVersion,
     override val databaseService: DatabaseService,
-    override val preferenceStore: PreferenceStoreInterface,
+    override val preferenceStore: PreferenceStore,
+    override val encryptedPreferenceStore: EncryptedPreferenceStore,
     override val taskArchiver: TaskArchiver = TestTaskArchiver(),
     override val deviceCookieManager: DeviceCookieManager = TestDeviceCookieManager(),
     override val taskManager: TaskManager = TestTaskManager(TransactionAckTaskCodec()),
     override val multiDeviceManager: MultiDeviceManager = TestMultiDeviceManager(),
-    override val identityStore: IdentityStore = IdentityStore(preferenceStore),
+    override val identityStore: IdentityStore = IdentityStoreImpl(
+        identityProvider = IdentityProviderImpl(preferenceStore),
+        preferenceStore = preferenceStore,
+        encryptedPreferenceStore = encryptedPreferenceStore,
+    ),
     override val nonceFactory: NonceFactory = NonceFactory(TestNonceStore()),
 ) : CoreServiceManager
 

+ 10 - 10
app/src/androidTest/java/ch/threema/app/backuprestore/csv/BackupServiceTest.java

@@ -74,7 +74,7 @@ import ch.threema.app.utils.CSVRow;
 import ch.threema.app.utils.executor.BackgroundExecutor;
 import ch.threema.base.ThreemaException;
 import ch.threema.data.repositories.ContactModelRepository;
-import ch.threema.domain.identitybackup.IdentityBackupDecoder;
+import ch.threema.domain.identitybackup.IdentityBackup;
 import ch.threema.domain.protocol.api.APIConnector;
 import ch.threema.storage.models.ContactModel;
 import ch.threema.storage.models.data.status.VoipStatusDataModel;
@@ -240,9 +240,7 @@ public class BackupServiceTest {
             .setBackupThumbnails(false)
             .setBackupNonces(false));
 
-        try {
-            final ZipFile zipFile = this.openBackupFile(backupFile, new String[]{"settings", "identity"});
-
+        try (final ZipFile zipFile = this.openBackupFile(backupFile, new String[]{"settings", "identity"})) {
             // Read identity backup
             final String identityBackup;
             try (final ZipInputStream stream = zipFile.getInputStream(zipFile.getFileHeader("identity"))) {
@@ -250,9 +248,11 @@ public class BackupServiceTest {
             }
 
             // Verify identity backup
-            final IdentityBackupDecoder identityBackupDecoder = new IdentityBackupDecoder(identityBackup);
-            Assert.assertTrue("Could not decode identity backup", identityBackupDecoder.decode(PASSWORD));
-            Assert.assertEquals(TEST_IDENTITY, identityBackupDecoder.getIdentity());
+            IdentityBackup.PlainBackupData decryptedBackupData = IdentityBackup.decryptIdentityBackup(
+                PASSWORD,
+                new IdentityBackup.EncryptedIdentityBackup(identityBackup)
+            );
+            Assert.assertEquals(TEST_IDENTITY, decryptedBackupData.getThreemaId());
         } finally {
             //noinspection ResultOfMethodCallIgnored
             backupFile.delete();
@@ -293,7 +293,7 @@ public class BackupServiceTest {
             .setBackupThumbnails(false)
             .setBackupNonces(false));
 
-        try {
+        try (
             final ZipFile zipFile = this.openBackupFile(backupFile, new String[]{
                 "settings",
                 "message_CDXVZ5E4.csv",
@@ -305,8 +305,8 @@ public class BackupServiceTest {
                 "ballot.csv",
                 "ballot_choice.csv",
                 "ballot_vote.csv",
-            });
-
+            })
+        ) {
             // Read contacts
             try (final ZipInputStream stream = zipFile.getInputStream(zipFile.getFileHeader("contacts.csv"))) {
                 final CSVReader csvReader = new CSVReader(new InputStreamReader(stream), true);

+ 46 - 49
app/src/androidTest/java/ch/threema/app/contacts/AddOrUpdateContactBackgroundTaskTest.kt

@@ -37,22 +37,21 @@ import ch.threema.app.asynctasks.RemotePublicKeyMismatch
 import ch.threema.app.asynctasks.UserIdentity
 import ch.threema.app.managers.CoreServiceManager
 import ch.threema.app.utils.AppVersionProvider
-import ch.threema.app.utils.ConfigUtils
 import ch.threema.app.utils.executor.BackgroundExecutor
+import ch.threema.base.crypto.NaCl
+import ch.threema.common.Http
 import ch.threema.data.TestDatabaseService
 import ch.threema.data.repositories.ContactModelRepository
 import ch.threema.data.repositories.ModelRepositories
 import ch.threema.domain.models.IdentityState
 import ch.threema.domain.models.IdentityType
 import ch.threema.domain.models.VerificationLevel
-import ch.threema.domain.protocol.SSLSocketFactoryFactory
 import ch.threema.domain.protocol.Version
 import ch.threema.domain.protocol.api.APIConnector
 import ch.threema.domain.protocol.api.APIConnector.FetchIdentityResult
 import ch.threema.domain.protocol.api.APIConnector.HttpConnectionException
+import ch.threema.domain.types.Identity
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
-import com.neilalexander.jnacl.NaCl
-import java.net.HttpURLConnection
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.assertContentEquals
@@ -62,6 +61,7 @@ import kotlin.test.assertNotEquals
 import kotlin.test.assertTrue
 import kotlin.test.fail
 import kotlinx.coroutines.runBlocking
+import okhttp3.OkHttpClient
 
 class AddOrUpdateContactBackgroundTaskTest {
     private val backgroundExecutor = BackgroundExecutor()
@@ -77,6 +77,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
         )
         contactModelRepository = ModelRepositories(coreServiceManager).contacts
     }
@@ -89,7 +90,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
                 FetchIdentityResult().also {
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
@@ -98,9 +99,9 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
                 assertTrue(it is ContactCreated)
                 assertEquals(newIdentity, it.contactModel.identity)
-                val data = it.contactModel.data.value!!
+                val data = it.contactModel.data!!
                 assertEquals(newIdentity, data.identity)
-                assertContentEquals(ByteArray(NaCl.PUBLICKEYBYTES), data.publicKey)
+                assertContentEquals(ByteArray(NaCl.PUBLIC_KEY_BYTES), data.publicKey)
                 assertEquals(12u, data.featureMask)
                 assertEquals(IdentityType.NORMAL, data.identityType)
                 assertEquals(IdentityState.ACTIVE, data.activityState)
@@ -118,7 +119,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             fetchIdentity = { identity ->
                 FetchIdentityResult().also {
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
@@ -128,9 +129,9 @@ class AddOrUpdateContactBackgroundTaskTest {
             runOnFinished = {
                 assertTrue(it is ContactCreated)
                 assertEquals(newIdentity, it.contactModel.identity)
-                val data = it.contactModel.data.value!!
+                val data = it.contactModel.data!!
                 assertEquals(newIdentity, data.identity)
-                assertContentEquals(ByteArray(NaCl.PUBLICKEYBYTES), data.publicKey)
+                assertContentEquals(ByteArray(NaCl.PUBLIC_KEY_BYTES), data.publicKey)
                 assertEquals(12u, data.featureMask)
                 assertEquals(IdentityType.NORMAL, data.identityType)
                 assertEquals(IdentityState.ACTIVE, data.activityState)
@@ -148,7 +149,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
                 FetchIdentityResult().also {
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 127
                     it.type = 1
                     it.state = IdentityState.INACTIVE.value
@@ -157,16 +158,16 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
                 assertTrue(it is ContactCreated)
                 assertEquals(newIdentity, it.contactModel.identity)
-                val data = it.contactModel.data.value!!
+                val data = it.contactModel.data!!
                 assertEquals(newIdentity, data.identity)
-                assertContentEquals(ByteArray(NaCl.PUBLICKEYBYTES), data.publicKey)
+                assertContentEquals(ByteArray(NaCl.PUBLIC_KEY_BYTES), data.publicKey)
                 assertEquals(127u, data.featureMask)
                 assertEquals(IdentityType.WORK, data.identityType)
                 assertEquals(IdentityState.INACTIVE, data.activityState)
                 assertEquals(VerificationLevel.FULLY_VERIFIED, data.verificationLevel)
                 assertEquals(AcquaintanceLevel.DIRECT, data.acquaintanceLevel)
             },
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         )
     }
 
@@ -177,7 +178,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
                 FetchIdentityResult().also {
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 127
                     it.type = 1
                     it.state = IdentityState.INACTIVE.value
@@ -197,7 +198,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
                 FetchIdentityResult().also {
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
@@ -206,7 +207,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
                 assertTrue(it is RemotePublicKeyMismatch)
             },
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES).also { it.fill(1) },
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES).also { it.fill(1) },
         )
     }
 
@@ -214,7 +215,7 @@ class AddOrUpdateContactBackgroundTaskTest {
     fun testAddInvalidId() {
         testAddingContact(
             {
-                throw HttpConnectionException(HttpURLConnection.HTTP_NOT_FOUND, Exception())
+                throw HttpConnectionException(Http.StatusCode.NOT_FOUND, Exception())
             },
             {
                 assertTrue(it is InvalidThreemaId)
@@ -224,10 +225,10 @@ class AddOrUpdateContactBackgroundTaskTest {
 
     @Test
     fun testAddExistingContact() {
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
@@ -253,9 +254,9 @@ class AddOrUpdateContactBackgroundTaskTest {
 
     @Test
     fun testVerifyTwice() {
-        val publicKey = ByteArray(NaCl.PUBLICKEYBYTES).apply { fill(2) }
+        val publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES).apply { fill(2) }
 
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
                 it.identity = identity
                 it.publicKey = publicKey
@@ -288,10 +289,10 @@ class AddOrUpdateContactBackgroundTaskTest {
     fun testUpgradeGroupContact() {
         val newIdentity = "01234567"
 
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
@@ -313,7 +314,7 @@ class AddOrUpdateContactBackgroundTaskTest {
         contactModel.setAcquaintanceLevelFromLocal(AcquaintanceLevel.GROUP)
 
         // Assert that the acquaintance level change worked
-        assertEquals(AcquaintanceLevel.GROUP, contactModel.data.value!!.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.GROUP, contactModel.data!!.acquaintanceLevel)
 
         // When adding the contact again, it should be converted back to a direct contact
         testAddingContact(
@@ -322,7 +323,7 @@ class AddOrUpdateContactBackgroundTaskTest {
                 assertTrue(it is ContactModified)
                 assertTrue(it.acquaintanceLevelChanged)
                 assertFalse(it.verificationLevelChanged)
-                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value!!.acquaintanceLevel)
+                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data!!.acquaintanceLevel)
             },
             newIdentity = newIdentity,
         )
@@ -332,10 +333,10 @@ class AddOrUpdateContactBackgroundTaskTest {
     fun testVerificationLevelUpgrade() {
         val newIdentity = "01234567"
 
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
@@ -354,7 +355,7 @@ class AddOrUpdateContactBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(newIdentity)!!
 
         // Assert that the verification level is unverified
-        assertEquals(VerificationLevel.UNVERIFIED, contactModel.data.value!!.verificationLevel)
+        assertEquals(VerificationLevel.UNVERIFIED, contactModel.data!!.verificationLevel)
 
         // When adding the contact again, it should be fully verified
         testAddingContact(
@@ -365,11 +366,11 @@ class AddOrUpdateContactBackgroundTaskTest {
                 assertFalse(it.acquaintanceLevelChanged)
                 assertEquals(
                     VerificationLevel.FULLY_VERIFIED,
-                    contactModel.data.value!!.verificationLevel,
+                    contactModel.data!!.verificationLevel,
                 )
             },
             newIdentity = newIdentity,
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         )
     }
 
@@ -377,10 +378,10 @@ class AddOrUpdateContactBackgroundTaskTest {
     fun testAddAndVerifyGroupContact() {
         val newIdentity = "01234567"
 
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
@@ -399,11 +400,11 @@ class AddOrUpdateContactBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(newIdentity)!!
 
         // Assert that the verification level is unverified
-        assertEquals(VerificationLevel.UNVERIFIED, contactModel.data.value!!.verificationLevel)
+        assertEquals(VerificationLevel.UNVERIFIED, contactModel.data!!.verificationLevel)
 
         // Downgrade the contact to acquaintance level group
         contactModel.setAcquaintanceLevelFromLocal(AcquaintanceLevel.GROUP)
-        assertEquals(AcquaintanceLevel.GROUP, contactModel.data.value!!.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.GROUP, contactModel.data!!.acquaintanceLevel)
 
         // When adding the contact again, it should be converted back to a direct contact
         testAddingContact(
@@ -412,14 +413,14 @@ class AddOrUpdateContactBackgroundTaskTest {
                 assertTrue(it is ContactModified)
                 assertTrue(it.acquaintanceLevelChanged)
                 assertTrue(it.verificationLevelChanged)
-                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value!!.acquaintanceLevel)
+                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data!!.acquaintanceLevel)
                 assertEquals(
                     VerificationLevel.FULLY_VERIFIED,
-                    contactModel.data.value!!.verificationLevel,
+                    contactModel.data!!.verificationLevel,
                 )
             },
             newIdentity = newIdentity,
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         )
     }
 
@@ -432,7 +433,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
                 FetchIdentityResult().also {
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
@@ -483,11 +484,11 @@ class AddOrUpdateContactBackgroundTaskTest {
     }
 
     private fun testAddingContact(
-        fetchIdentity: (identity: String) -> FetchIdentityResult,
+        fetchIdentity: (identity: Identity) -> FetchIdentityResult,
         runOnFinished: (result: ContactResult) -> Unit,
-        newIdentity: String = "01234567",
+        newIdentity: Identity = "01234567",
         acquaintanceLevel: AcquaintanceLevel = AcquaintanceLevel.DIRECT,
-        myIdentity: String = "00000000",
+        myIdentity: Identity = "00000000",
         publicKey: ByteArray? = null,
     ) {
         val apiConnector = getTestApiConnector {
@@ -520,13 +521,9 @@ class AddOrUpdateContactBackgroundTaskTest {
         }
     }
 
-    private fun getTestApiConnector(onIdentityFetchCalled: (identity: String) -> FetchIdentityResult): APIConnector {
-        val sslSocketFactoryFactory = SSLSocketFactoryFactory { host: String? ->
-            ConfigUtils.getSSLSocketFactory(host)
-        }
-
-        return object : APIConnector(false, null, false, sslSocketFactoryFactory, Version(), null) {
-            override fun fetchIdentity(identity: String) = onIdentityFetchCalled(identity)
+    private fun getTestApiConnector(onIdentityFetchCalled: (identity: Identity) -> FetchIdentityResult): APIConnector {
+        return object : APIConnector(false, null, false, OkHttpClient(), Version(), null, null) {
+            override fun fetchIdentity(identity: Identity) = onIdentityFetchCalled(identity)
         }
     }
 }

+ 7 - 6
app/src/androidTest/java/ch/threema/app/contacts/MarkContactAsDeletedBackgroundTaskTest.kt

@@ -41,6 +41,7 @@ import ch.threema.app.tasks.ReflectContactSyncUpdateTask
 import ch.threema.app.tasks.TaskCreator
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.executor.BackgroundExecutor
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.TestDatabaseService
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.repositories.ContactModelRepository
@@ -64,7 +65,6 @@ import ch.threema.domain.taskmanager.TaskCodec
 import ch.threema.domain.taskmanager.TaskManager
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.testhelpers.MUST_NOT_BE_CALLED
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import kotlin.test.BeforeTest
 import kotlin.test.Test
@@ -161,7 +161,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
     private lateinit var deleteContactServices: DeleteContactServices
     private val testContactModelData = ContactModelData(
         identity = "12345678",
-        publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+        publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         createdAt = Date(),
         firstName = "1234",
         lastName = "5678",
@@ -194,6 +194,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             multiDeviceManager = multiDeviceManager,
             taskManager = testTaskManager,
         )
@@ -222,7 +223,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         // Assert that the contact exists as "direct" contact
         assertNotNull(contactModel)
-        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data?.acquaintanceLevel)
 
         // Remove the contact
         backgroundExecutor.executeDeferred(
@@ -236,7 +237,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         ).await()
 
         // Assert that the contact's acquaintance level is "group" now
-        assertEquals(AcquaintanceLevel.GROUP, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.GROUP, contactModel.data?.acquaintanceLevel)
     }
 
     @Test
@@ -247,7 +248,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         // Assert that the contact exists as "direct" contact
         assertNotNull(contactModel)
-        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data?.acquaintanceLevel)
 
         // Remove the contact
         backgroundExecutor.executeDeferred(
@@ -272,7 +273,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         // Assert that the contact exists as "direct" contact
         assertNotNull(contactModel)
-        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data?.acquaintanceLevel)
 
         // Mark the contact as deleted
         backgroundExecutor.executeDeferred(

+ 10 - 8
app/src/androidTest/java/ch/threema/app/contacts/ReflectedContactSyncTaskTest.kt

@@ -28,10 +28,11 @@ import ch.threema.app.TestTaskManager
 import ch.threema.app.ThreemaApplication
 import ch.threema.app.processors.reflectedd2dsync.ReflectedContactSyncTask
 import ch.threema.app.utils.AppVersionProvider
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.TestDatabaseService
+import ch.threema.data.datatypes.IdColor
 import ch.threema.data.models.ContactModel
 import ch.threema.data.models.ContactModelData
-import ch.threema.data.models.ContactModelData.Companion.getIdColorIndex
 import ch.threema.data.repositories.ContactModelRepository
 import ch.threema.data.repositories.ModelRepositories
 import ch.threema.domain.helpers.TransactionAckTaskCodec
@@ -56,7 +57,6 @@ import ch.threema.protobuf.d2d.sync.contact
 import ch.threema.protobuf.unit
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import com.google.protobuf.kotlin.toByteString
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import kotlin.test.BeforeTest
 import kotlin.test.Test
@@ -82,7 +82,7 @@ class ReflectedContactSyncTaskTest {
         firstName = "",
         lastName = "",
         nickname = "Nick",
-        colorIndex = getIdColorIndex("01234567"),
+        idColor = IdColor.ofIdentity("01234567"),
         verificationLevel = VerificationLevel.UNVERIFIED,
         workVerificationLevel = WorkVerificationLevel.NONE,
         identityType = IdentityType.NORMAL,
@@ -106,10 +106,12 @@ class ReflectedContactSyncTaskTest {
     fun before() {
         databaseService = TestDatabaseService()
         taskCodec = TransactionAckTaskCodec()
+        val serviceManager = ThreemaApplication.requireServiceManager()
         coreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             multiDeviceManager = TestMultiDeviceManager(
                 isMultiDeviceActive = true,
                 isMdDisabledOrSupportsFs = false,
@@ -123,7 +125,7 @@ class ReflectedContactSyncTaskTest {
     fun testNewReflectedContact() {
         val contact = contact {
             identity = "01234567"
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES) { it.toByte() }.toByteString()
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES) { it.toByte() }.toByteString()
             createdAt = Date().time
             firstName = "0123"
             // No last name provided
@@ -151,9 +153,9 @@ class ReflectedContactSyncTaskTest {
         }
 
         testReflectedContactCreate(contact) { contactModel ->
-            val data = contactModel.data.value!!
+            val data = contactModel.data!!
             assertEquals(contact.identity, data.identity)
-            assertContentEquals(ByteArray(NaCl.PUBLICKEYBYTES) { it.toByte() }, data.publicKey)
+            assertContentEquals(ByteArray(NaCl.PUBLIC_KEY_BYTES) { it.toByte() }, data.publicKey)
             assertEquals(contact.createdAt, data.createdAt.time)
             assertEquals(contact.firstName, data.firstName)
             assertEquals("", data.lastName)
@@ -182,7 +184,7 @@ class ReflectedContactSyncTaskTest {
                 nickname = newNickname
             },
         ) { contactModel ->
-            assertEquals(newNickname, contactModel.data.value?.nickname)
+            assertEquals(newNickname, contactModel.data?.nickname)
         }
     }
 

+ 8 - 9
app/src/androidTest/java/ch/threema/app/groupmanagement/CreateGroupFlowTest.kt

@@ -26,7 +26,6 @@ import ch.threema.app.DangerousTest
 import ch.threema.app.ThreemaApplication
 import ch.threema.app.groupflows.GroupCreateProperties
 import ch.threema.app.groupflows.GroupFlowResult
-import ch.threema.app.groupflows.ProfilePicture
 import ch.threema.app.tasks.GroupCreateTask
 import ch.threema.app.tasks.ReflectGroupSyncCreateTask
 import ch.threema.app.testutils.TestHelpers
@@ -112,7 +111,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(memberIdentity),
             ),
             ReflectionExpectation.REFLECTION_SUCCESS,
@@ -129,7 +128,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(memberIdentity),
             ),
             ReflectionExpectation.REFLECTION_SKIPPED,
@@ -141,7 +140,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = emptySet(),
             ),
             ReflectionExpectation.REFLECTION_SUCCESS,
@@ -153,7 +152,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = emptySet(),
             ),
             ReflectionExpectation.REFLECTION_SKIPPED,
@@ -170,7 +169,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         val groupFlowResult: GroupFlowResult = testGroupCreation(
             GroupCreateProperties(
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(initialContactModelData.identity, unknownIdentity),
             ),
             ReflectionExpectation.REFLECTION_FAIL,
@@ -194,7 +193,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
             ThreemaApplication.getAppContext(),
             GroupCreateProperties(
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(initialContactModelData.identity),
             ),
         ).await()
@@ -262,7 +261,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
 
     private fun GroupModel?.assertCreatedFrom(groupCreateProperties: GroupCreateProperties) {
         assertNotNull(this)
-        data.value.assertCreatedFrom(groupCreateProperties)
+        data.assertCreatedFrom(groupCreateProperties)
     }
 
     private fun GroupModelData?.assertCreatedFrom(groupCreateProperties: GroupCreateProperties) {
@@ -273,7 +272,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
 
     private fun GroupModel?.assertNewGroup() {
         assertNotNull(this)
-        data.value.assertNewGroup()
+        data.assertNewGroup()
     }
 
     private fun GroupModelData?.assertNewGroup() {

+ 17 - 17
app/src/androidTest/java/ch/threema/app/groupmanagement/DisbandGroupFlowTest.kt

@@ -224,7 +224,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         val groupModel =
             groupModelRepository.getByGroupIdentity(myInitialLeftGroupModelData.groupIdentity)
         assertNotNull(groupModel)
-        assertEquals(UserState.LEFT, groupModel.data.value?.userState)
+        assertEquals(UserState.LEFT, groupModel.data?.userState)
         assertUnsuccessfulDisband(
             groupModel,
             GroupDisbandIntent.DISBAND,
@@ -237,7 +237,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         val groupModel =
             groupModelRepository.getByGroupIdentity(myInitialLeftGroupModelData.groupIdentity)
         assertNotNull(groupModel)
-        assertEquals(UserState.LEFT, groupModel.data.value?.userState)
+        assertEquals(UserState.LEFT, groupModel.data?.userState)
         assertUnsuccessfulDisband(
             groupModel,
             GroupDisbandIntent.DISBAND,
@@ -252,7 +252,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulDisband(
             groupModel,
@@ -268,7 +268,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulDisband(
             groupModel,
@@ -283,8 +283,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
-        assertEquals(emptySet(), groupModel.data.value?.otherMembers)
-        assertEquals(UserState.MEMBER, groupModel.data.value?.userState)
+        assertEquals(emptySet(), groupModel.data?.otherMembers)
+        assertEquals(UserState.MEMBER, groupModel.data?.userState)
 
         assertSuccessfulDisband(
             groupModel,
@@ -299,8 +299,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
-        assertEquals(emptySet(), groupModel.data.value?.otherMembers)
-        assertEquals(UserState.MEMBER, groupModel.data.value?.userState)
+        assertEquals(emptySet(), groupModel.data?.otherMembers)
+        assertEquals(UserState.MEMBER, groupModel.data?.userState)
 
         assertSuccessfulDisband(
             groupModel,
@@ -315,8 +315,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
-        assertEquals(emptySet(), groupModel.data.value?.otherMembers)
-        assertEquals(UserState.MEMBER, groupModel.data.value?.userState)
+        assertEquals(emptySet(), groupModel.data?.otherMembers)
+        assertEquals(UserState.MEMBER, groupModel.data?.userState)
 
         assertSuccessfulDisband(
             groupModel,
@@ -331,8 +331,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
-        assertEquals(emptySet(), groupModel.data.value?.otherMembers)
-        assertEquals(UserState.MEMBER, groupModel.data.value?.userState)
+        assertEquals(emptySet(), groupModel.data?.otherMembers)
+        assertEquals(UserState.MEMBER, groupModel.data?.userState)
 
         assertSuccessfulDisband(
             groupModel,
@@ -373,10 +373,10 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         when (intent) {
             GroupDisbandIntent.DISBAND -> assertEquals(
                 UserState.LEFT,
-                groupModel.data.value?.userState,
+                groupModel.data?.userState,
             )
 
-            GroupDisbandIntent.DISBAND_AND_REMOVE -> assertNull(groupModel.data.value)
+            GroupDisbandIntent.DISBAND_AND_REMOVE -> assertNull(groupModel.data)
         }
     }
 
@@ -385,11 +385,11 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         intent: GroupDisbandIntent,
         reflectionExpectation: ReflectionExpectation,
     ) {
-        val groupModelDataBefore = groupModel.data.value
+        val groupModelDataBefore = groupModel.data
         assertIs<GroupFlowResult.Failure>(
             runGroupDisband(groupModel, intent, reflectionExpectation),
         )
-        val groupModelDataAfter = groupModel.data.value
+        val groupModelDataAfter = groupModel.data
         // Assert that the group model has not changed
         assertEquals(groupModelDataBefore, groupModelDataAfter)
     }
@@ -399,7 +399,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         intent: GroupDisbandIntent,
         reflectionExpectation: ReflectionExpectation,
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(

+ 2 - 2
app/src/androidTest/java/ch/threema/app/groupmanagement/GroupControlTest.kt

@@ -36,7 +36,7 @@ import ch.threema.domain.protocol.csp.messages.AbstractGroupMessage
 import ch.threema.domain.protocol.csp.messages.GroupLeaveMessage
 import ch.threema.domain.protocol.csp.messages.GroupSetupMessage
 import ch.threema.domain.protocol.csp.messages.GroupSyncRequestMessage
-import ch.threema.domain.stores.IdentityStoreInterface
+import ch.threema.domain.stores.IdentityStore
 import kotlin.test.Test
 import kotlin.test.assertContentEquals
 import kotlin.test.assertEquals
@@ -208,7 +208,7 @@ abstract class GroupControlTest<T : AbstractGroupMessage> : MessageProcessorProv
 
     private suspend fun setupAndProcessMessage(
         message: AbstractGroupMessage,
-        identityStore: IdentityStoreInterface,
+        identityStore: IdentityStore,
     ) {
         // Start home activity and navigate to chat section
         launchActivity<HomeActivity>()

+ 1 - 1
app/src/androidTest/java/ch/threema/app/groupmanagement/GroupResyncFlowTest.kt

@@ -167,7 +167,7 @@ class GroupResyncFlowTest : GroupFlowTest() {
         groupModel: GroupModel,
         setupConfig: SetupConfig,
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(

+ 2 - 1
app/src/androidTest/java/ch/threema/app/groupmanagement/IncomingGroupLeaveTest.kt

@@ -33,6 +33,7 @@ import ch.threema.app.testutils.TestHelpers.TestGroup
 import ch.threema.data.models.GroupIdentity
 import ch.threema.domain.protocol.csp.messages.GroupLeaveMessage
 import ch.threema.domain.protocol.csp.messages.GroupSyncRequestMessage
+import ch.threema.domain.types.Identity
 import junit.framework.TestCase.assertEquals
 import junit.framework.TestCase.assertFalse
 import junit.framework.TestCase.assertTrue
@@ -273,7 +274,7 @@ class IncomingGroupLeaveTest : GroupControlTest<GroupLeaveMessage>() {
 
     private class GroupLeaveTracker(
         private val group: TestGroup?,
-        private val leavingIdentity: String?,
+        private val leavingIdentity: Identity?,
         private val expectStateChange: Boolean = false,
     ) {
         private var memberHasLeft = false

+ 2 - 1
app/src/androidTest/java/ch/threema/app/groupmanagement/IncomingGroupNameTest.kt

@@ -31,6 +31,7 @@ import ch.threema.app.testutils.TestHelpers.TestGroup
 import ch.threema.data.models.GroupIdentity
 import ch.threema.domain.models.GroupId
 import ch.threema.domain.protocol.csp.messages.GroupNameMessage
+import ch.threema.domain.types.Identity
 import junit.framework.TestCase.*
 import kotlin.test.AfterTest
 import kotlin.test.Test
@@ -172,7 +173,7 @@ class IncomingGroupNameTest : GroupConversationListTest<GroupNameMessage>() {
 
     private fun createEncryptedRenameMessage(
         newGroupName: String,
-        groupCreatorIdentity: String,
+        groupCreatorIdentity: Identity,
         apiGroupId: GroupId,
         fromContact: TestContact,
     ) = GroupNameMessage().apply {

+ 7 - 6
app/src/androidTest/java/ch/threema/app/groupmanagement/IncomingGroupSetupTest.kt

@@ -28,6 +28,7 @@ import ch.threema.app.listeners.GroupListener
 import ch.threema.app.managers.ListenerManager
 import ch.threema.app.testutils.TestHelpers.TestContact
 import ch.threema.app.testutils.TestHelpers.TestGroup
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.models.GroupIdentity
 import ch.threema.domain.models.ContactSyncState
@@ -38,9 +39,9 @@ import ch.threema.domain.models.TypingIndicatorPolicy
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 import ch.threema.domain.protocol.csp.messages.GroupSetupMessage
+import ch.threema.domain.types.Identity
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.storage.models.GroupModel
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import junit.framework.TestCase
 import kotlin.test.AfterTest
@@ -211,7 +212,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
             GroupIdentity(groupAB.groupCreator.identity, groupAB.apiGroupId.toLong()),
         )
         assertNotNull(afterKicked)
-        assertEquals(GroupModel.UserState.KICKED, afterKicked.data.value?.userState)
+        assertEquals(GroupModel.UserState.KICKED, afterKicked.data?.userState)
 
         // Assert that group conversations did not appear, disappear, or change their name
         assertGroupConversations(scenario, initialGroups, "no changes")
@@ -437,7 +438,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
         // Get the group model of the group and check that it exists and the revoked identity is not listed as a member
         val newGroupModel = groupModelRepository.getByCreatorIdentityAndId(newGroup.groupCreator.identity, newGroup.apiGroupId)
         assertNotNull(newGroupModel)
-        val data = newGroupModel.data.value
+        val data = newGroupModel.data
         assertNotNull(data)
         assertFalse(data.otherMembers.contains(revokedContactModelData.identity))
     }
@@ -447,7 +448,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
             groupModelRepository.getByCreatorIdentityAndId(
                 newGroup.groupCreator.identity,
                 newGroup.apiGroupId,
-            )?.data?.value,
+            )?.data,
         )
 
         val scenario = startScenario()
@@ -530,7 +531,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
 
     private class GroupSetupTracker(
         private val group: TestGroup?,
-        private val myIdentity: String,
+        private val myIdentity: Identity,
         private val expectCreate: Boolean,
         private val expectKick: Boolean,
         private val newMembers: List<String>,
@@ -646,7 +647,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
 
     private val revokedContactModelData = ContactModelData(
         identity = "01238765",
-        publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+        publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         createdAt = Date(),
         firstName = "1234",
         lastName = "8765",

+ 9 - 9
app/src/androidTest/java/ch/threema/app/groupmanagement/LeaveGroupFlowTest.kt

@@ -331,7 +331,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulLeave(
             groupModel,
@@ -347,7 +347,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulLeave(
             groupModel,
@@ -363,7 +363,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulLeave(
             groupModel,
@@ -379,7 +379,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulLeave(
             groupModel,
@@ -417,8 +417,8 @@ class LeaveGroupFlowTest : GroupFlowTest() {
             runGroupLeave(groupModel, intent, reflectionExpectation),
         )
         when (intent) {
-            GroupLeaveIntent.LEAVE -> assertEquals(UserState.LEFT, groupModel.data.value?.userState)
-            GroupLeaveIntent.LEAVE_AND_REMOVE -> assertNull(groupModel.data.value)
+            GroupLeaveIntent.LEAVE -> assertEquals(UserState.LEFT, groupModel.data?.userState)
+            GroupLeaveIntent.LEAVE_AND_REMOVE -> assertNull(groupModel.data)
         }
     }
 
@@ -427,11 +427,11 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         intent: GroupLeaveIntent,
         reflectionExpectation: ReflectionExpectation,
     ) {
-        val groupModelDataBefore = groupModel.data.value
+        val groupModelDataBefore = groupModel.data
         assertIs<GroupFlowResult.Failure>(
             runGroupLeave(groupModel, intent, reflectionExpectation),
         )
-        val groupModelDataAfter = groupModel.data.value
+        val groupModelDataAfter = groupModel.data
         // Assert that the group model has not changed
         assertEquals(groupModelDataBefore, groupModelDataAfter)
     }
@@ -441,7 +441,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         intent: GroupLeaveIntent,
         reflectionExpectation: ReflectionExpectation,
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(

+ 3 - 3
app/src/androidTest/java/ch/threema/app/groupmanagement/RemoveGroupFlowTest.kt

@@ -272,7 +272,7 @@ class RemoveGroupFlowTest : GroupFlowTest() {
         assertIs<GroupFlowResult.Success>(
             runGroupRemove(groupModel, reflectionExpectation),
         )
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
     }
 
     private suspend fun assertUnsuccessfulRemove(
@@ -282,14 +282,14 @@ class RemoveGroupFlowTest : GroupFlowTest() {
         assertIs<GroupFlowResult.Failure>(
             runGroupRemove(groupModel, reflectionExpectation),
         )
-        assertNotNull(groupModel.data.value)
+        assertNotNull(groupModel.data)
     }
 
     private suspend fun runGroupRemove(
         groupModel: GroupModel,
         reflectionExpectation: ReflectionExpectation,
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(

+ 13 - 13
app/src/androidTest/java/ch/threema/app/groupmanagement/UpdateGroupFlowTest.kt

@@ -208,7 +208,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
 
         // Assert that the new member is not yet a member of the group
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialContactData.identity) == false
+            groupModel.data?.otherMembers?.contains(initialContactData.identity) == false
         }
 
         val groupChanges = GroupChanges(
@@ -225,7 +225,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
 
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialContactData.identity) == true
+            groupModel.data?.otherMembers?.contains(initialContactData.identity) == true
         }
     }
 
@@ -247,7 +247,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
 
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialContactData.identity) == true
+            groupModel.data?.otherMembers?.contains(initialContactData.identity) == true
         }
     }
 
@@ -268,7 +268,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
             ReflectionExpectation.REFLECTION_SUCCESS,
         )
 
-        assertTrue { groupModel.data.value?.otherMembers?.isEmpty() == true }
+        assertTrue { groupModel.data?.otherMembers?.isEmpty() == true }
     }
 
     @Test
@@ -288,7 +288,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
             ReflectionExpectation.REFLECTION_SKIPPED,
         )
 
-        assertTrue { groupModel.data.value?.otherMembers?.isEmpty() == true }
+        assertTrue { groupModel.data?.otherMembers?.isEmpty() == true }
     }
 
     @Test
@@ -304,7 +304,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
 
         // Delete the group before updating it
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulGroupUpdate(
             groupModel,
@@ -312,7 +312,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
             ReflectionExpectation.REFLECTION_SUCCESS,
         )
 
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
     }
 
     @Test
@@ -328,7 +328,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
 
         // Delete the group before updating it
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
         assertUnsuccessfulGroupUpdate(
             groupModel,
@@ -336,7 +336,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
             ReflectionExpectation.REFLECTION_SKIPPED,
         )
 
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
     }
 
     @Test
@@ -357,7 +357,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
 
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialGroupMemberData.identity) == false
+            groupModel.data?.otherMembers?.contains(initialGroupMemberData.identity) == false
         }
     }
 
@@ -379,7 +379,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
 
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialGroupMemberData.identity) == false
+            groupModel.data?.otherMembers?.contains(initialGroupMemberData.identity) == false
         }
     }
 
@@ -422,7 +422,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
         assertIs<GroupFlowResult.Success>(groupFlowResult)
 
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
         assertNotNull(groupModelData)
         groupModelData.assertChangesApplied(groupChanges)
     }
@@ -447,7 +447,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         reflectionExpectation: ReflectionExpectation,
         successExpected: Boolean,
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(

+ 9 - 6
app/src/androidTest/java/ch/threema/app/processors/MessageProcessorProvider.kt

@@ -38,7 +38,6 @@ import ch.threema.app.testutils.TestHelpers.TestContact
 import ch.threema.app.testutils.TestHelpers.TestGroup
 import ch.threema.app.testutils.clearDatabaseAndCaches
 import ch.threema.app.utils.AppVersionProvider
-import ch.threema.app.utils.ConfigUtils
 import ch.threema.app.utils.ForwardSecurityStatusSender
 import ch.threema.base.crypto.HashedNonce
 import ch.threema.base.crypto.Nonce
@@ -68,7 +67,7 @@ import ch.threema.domain.protocol.csp.messages.TextMessage
 import ch.threema.domain.protocol.csp.messages.fs.ForwardSecurityDataInit
 import ch.threema.domain.protocol.csp.messages.fs.ForwardSecurityEnvelopeMessage
 import ch.threema.domain.stores.ContactStore
-import ch.threema.domain.stores.IdentityStoreInterface
+import ch.threema.domain.stores.IdentityStore
 import ch.threema.domain.taskmanager.ActiveTask
 import ch.threema.domain.taskmanager.QueueSendCompleteListener
 import ch.threema.domain.taskmanager.Task
@@ -86,6 +85,7 @@ import kotlin.test.BeforeTest
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.runBlocking
+import okhttp3.OkHttpClient
 import org.junit.Rule
 import org.junit.rules.Timeout
 
@@ -191,12 +191,14 @@ open class MessageProcessorProvider {
             null,
             /* isWork = */
             false,
-            /* sslSocketFactoryFactory = */
-            ConfigUtils::getSSLSocketFactory,
+            /* okHttpClient = */
+            OkHttpClient(),
             /* version = */
             Version(),
             /* language = */
             null,
+            /* authenticator= */
+            null,
         ),
         serviceManager.userService,
         serviceManager.modelRepositories.contacts,
@@ -417,6 +419,7 @@ open class MessageProcessorProvider {
             AppVersionProvider.appVersion,
             serviceManager.databaseService,
             serviceManager.preferenceStore,
+            serviceManager.encryptedPreferenceStore,
             TaskArchiverImpl(serviceManager.databaseService.taskArchiveFactory),
             serviceManager.deviceCookieManager,
             taskManager,
@@ -520,7 +523,7 @@ open class MessageProcessorProvider {
      */
     protected suspend fun processMessage(
         message: AbstractMessage,
-        identityStore: IdentityStoreInterface,
+        identityStore: IdentityStore,
     ) {
         val messageBox = createMessageBox(
             message,
@@ -556,7 +559,7 @@ open class MessageProcessorProvider {
      */
     private fun createMessageBox(
         msg: AbstractMessage,
-        identityStore: IdentityStoreInterface,
+        identityStore: IdentityStore,
         forwardSecurityMessageProcessor: ForwardSecurityMessageProcessor,
     ): MessageBox {
         val nonceFactory = NonceFactory(object : NonceStore {

+ 10 - 5
app/src/androidTest/java/ch/threema/app/protocol/IdentityBlockedStepsTest.kt

@@ -34,6 +34,7 @@ import ch.threema.app.testutils.TestHelpers.TestContact
 import ch.threema.app.testutils.clearDatabaseAndCaches
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.data.TestDatabaseService
+import ch.threema.data.datatypes.IdColor
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.repositories.ContactModelRepository
 import ch.threema.data.repositories.ModelRepositories
@@ -47,6 +48,7 @@ import ch.threema.domain.models.TypingIndicatorPolicy
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 import ch.threema.domain.stores.ContactStore
+import ch.threema.domain.types.Identity
 import ch.threema.storage.DatabaseService
 import ch.threema.storage.models.ContactModel
 import ch.threema.storage.models.GroupMemberModel
@@ -88,6 +90,7 @@ class IdentityBlockedStepsTest {
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         contactModelRepository = ModelRepositories(coreServiceManager).contacts
@@ -99,6 +102,7 @@ class IdentityBlockedStepsTest {
         blockUnknownPreferenceService = object : PreferenceServiceImpl(
             ThreemaApplication.getAppContext(),
             serviceManager.preferenceStore,
+            serviceManager.encryptedPreferenceStore,
             coreServiceManager.taskManager,
             coreServiceManager.multiDeviceManager,
             coreServiceManager.nonceFactory,
@@ -111,6 +115,7 @@ class IdentityBlockedStepsTest {
         noBlockPreferenceService = object : PreferenceServiceImpl(
             ThreemaApplication.getAppContext(),
             serviceManager.preferenceStore,
+            serviceManager.encryptedPreferenceStore,
             coreServiceManager.taskManager,
             coreServiceManager.multiDeviceManager,
             coreServiceManager.nonceFactory,
@@ -216,7 +221,7 @@ class IdentityBlockedStepsTest {
     }
 
     private fun runIdentityBlockedSteps(
-        identity: String,
+        identity: Identity,
         preferenceService: PreferenceService,
     ) = runIdentityBlockedSteps(
         identity,
@@ -236,7 +241,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 lastName = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,
@@ -264,7 +269,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 lastName = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,
@@ -292,7 +297,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 lastName = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,
@@ -320,7 +325,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 lastName = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,

+ 0 - 99
app/src/androidTest/java/ch/threema/app/service/GroupInviteServiceTest.kt

@@ -1,99 +0,0 @@
-/*  _____ _
- * |_   _| |_  _ _ ___ ___ _ __  __ _
- *   | | | ' \| '_/ -_) -_) '  \/ _` |_
- *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
- *
- * Threema for Android
- * Copyright (c) 2021-2025 Threema GmbH
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see <https://www.gnu.org/licenses/>.
- */
-
-package ch.threema.app.service
-
-import ch.threema.app.BuildConfig
-import ch.threema.app.ThreemaApplication
-import ch.threema.app.services.GroupService
-import ch.threema.app.services.UserService
-import ch.threema.app.services.group.GroupInviteService
-import ch.threema.app.services.group.GroupInviteServiceImpl
-import ch.threema.domain.protocol.csp.messages.group.GroupInviteData
-import ch.threema.domain.protocol.csp.messages.group.GroupInviteToken
-import ch.threema.protobuf.url_payloads.GroupInvite.ConfirmationMode
-import ch.threema.storage.models.group.GroupInviteModel
-import io.mockk.every
-import io.mockk.mockk
-import kotlin.test.BeforeTest
-import kotlin.test.Test
-import kotlin.test.assertEquals
-
-class GroupInviteServiceTest {
-    private lateinit var groupService: GroupService
-    private lateinit var groupInviteService: GroupInviteService
-
-    @BeforeTest
-    fun setUp() {
-        val userService = mockk<UserService> {
-            every { identity } returns TEST_IDENTITY
-        }
-        groupService = ThreemaApplication.requireServiceManager().groupService
-        val databaseService = ThreemaApplication.requireServiceManager().databaseService
-        groupInviteService = GroupInviteServiceImpl(userService, groupService, databaseService)
-    }
-
-    @Test
-    fun testEncodeDecodeGroupInvite() {
-        val encodedGroupInvite = groupInviteService.encodeGroupInviteLink(testInviteModel)
-
-        assertEquals("https", encodedGroupInvite.scheme)
-        assertEquals(BuildConfig.groupLinkActionUrl, encodedGroupInvite.authority)
-        assertEquals("/join", encodedGroupInvite.path)
-        assertEquals(TEST_ENCODED_INVITE, encodedGroupInvite.encodedFragment)
-    }
-
-    @Test
-    fun testDecodeGroupInvite() {
-        val inviteDataFromDecodedUri = groupInviteService.decodeGroupInviteLink(TEST_ENCODED_INVITE)
-
-        assertEquals(testInviteData.adminIdentity, inviteDataFromDecodedUri.adminIdentity)
-        assertEquals(testInviteData.token, inviteDataFromDecodedUri.token)
-        assertEquals(testInviteData.groupName, inviteDataFromDecodedUri.groupName)
-        assertEquals(testInviteData.confirmationMode, inviteDataFromDecodedUri.confirmationMode)
-    }
-
-    private companion object {
-        const val TEST_GROUP_NAME = "A nice little group"
-        const val TEST_INVITE_NAME = "New unnamed link"
-        const val TEST_IDENTITY = "ECHOECHO"
-        const val TEST_ENCODED_INVITE = "RUNIT0VDSE86MDAwMTAyMDMwNDA1MDYwNzA4MDkwYTBiMGMwZDBlMGY6QSBuaWNlIGxpdHRsZSBncm91cDow"
-        val testTokenValid: GroupInviteToken
-        val testInviteModel: GroupInviteModel
-        val testInviteData: GroupInviteData
-
-        init {
-            testTokenValid = GroupInviteToken(ByteArray(16) { it.toByte() })
-            testInviteModel = GroupInviteModel.Builder()
-                .withGroupName(TEST_GROUP_NAME)
-                .withInviteName(TEST_INVITE_NAME)
-                .withToken(testTokenValid)
-                .withManualConfirmation(false)
-                .build()
-            testInviteData = GroupInviteData(
-                TEST_IDENTITY,
-                testTokenValid,
-                TEST_GROUP_NAME,
-                ConfirmationMode.AUTOMATIC,
-            )
-        }
-    }
-}

+ 17 - 12
app/src/androidTest/java/ch/threema/app/services/BlockedIdentitiesServiceTest.kt

@@ -24,20 +24,21 @@ package ch.threema.app.services
 import ch.threema.app.TestMultiDeviceManager
 import ch.threema.app.TestNonceStore
 import ch.threema.app.TestTaskManager
-import ch.threema.app.ThreemaApplication
 import ch.threema.app.listeners.ContactListener
 import ch.threema.app.managers.ListenerManager
 import ch.threema.app.preference.service.PreferenceServiceImpl
-import ch.threema.app.stores.PreferenceStore
 import ch.threema.base.crypto.NonceFactory
 import ch.threema.domain.helpers.ServerAckTaskCodec
+import ch.threema.domain.types.Identity
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertFalse
 import kotlin.test.assertTrue
+import org.koin.core.component.KoinComponent
+import org.koin.core.component.get
 
-class BlockedIdentitiesServiceTest {
+class BlockedIdentitiesServiceTest : KoinComponent {
     private val multiDeviceManager = TestMultiDeviceManager(
         isMultiDeviceActive = false,
     )
@@ -46,27 +47,31 @@ class BlockedIdentitiesServiceTest {
 
     private val preferenceService =
         PreferenceServiceImpl(
-            ThreemaApplication.getAppContext(),
-            PreferenceStore(
-                ThreemaApplication.getAppContext(),
-                ThreemaApplication.getMasterKey(),
-            ),
+            /* context = */
+            get(),
+            /* preferenceStore = */
+            get(),
+            /* encryptedPreferenceStore = */
+            get(),
+            /* taskManager = */
             taskManager,
+            /* multiDeviceManager = */
             multiDeviceManager,
+            /* nonceFactory = */
             NonceFactory(TestNonceStore()),
         )
 
     private val blockedIdentitiesService: BlockedIdentitiesService = BlockedIdentitiesServiceImpl(
-        preferenceService,
-        multiDeviceManager,
-        ThreemaApplication.requireServiceManager().taskCreator,
+        preferenceService = preferenceService,
+        multiDeviceManager = multiDeviceManager,
+        taskCreator = get(),
     )
 
     private val onModified = ArrayDeque<String>()
 
     init {
         ListenerManager.contactListeners.add(object : ContactListener {
-            override fun onModified(identity: String) {
+            override fun onModified(identity: Identity) {
                 onModified.addLast(identity)
             }
         })

+ 200 - 0
app/src/androidTest/java/ch/threema/app/stores/EncryptedPreferenceStoreImplTest.kt

@@ -0,0 +1,200 @@
+/*  _____ _
+ * |_   _| |_  _ _ ___ ___ _ __  __ _
+ *   | | | ' \| '_/ -_) -_) '  \/ _` |_
+ *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
+ *
+ * Threema for Android
+ * Copyright (c) 2025 Threema GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package ch.threema.app.stores
+
+import ch.threema.app.ThreemaApplication
+import ch.threema.localcrypto.MasterKeyImpl
+import java.io.File
+import kotlin.test.BeforeTest
+import kotlin.test.Test
+import kotlin.test.assertContentEquals
+import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
+import kotlin.test.assertFalse
+import kotlin.test.assertNotNull
+import kotlin.test.assertNull
+import kotlin.test.assertTrue
+import org.json.JSONArray
+import org.json.JSONObject
+
+class EncryptedPreferenceStoreImplTest {
+
+    private var onChangedCalled = false
+    private lateinit var store: EncryptedPreferenceStore
+
+    @BeforeTest
+    fun setUp() {
+        val masterKeyData = ByteArray(32) { it.toByte() }
+        store = EncryptedPreferenceStoreImpl(
+            context = ThreemaApplication.getAppContext(),
+            masterKey = MasterKeyImpl(masterKeyData),
+            onChanged = { _, _ -> onChangedCalled = true },
+        )
+        store.clear()
+        onChangedCalled = false
+    }
+
+    @Test
+    fun checkingForAndRemovingKeys() {
+        assertFalse(store.containsKey("foo"))
+
+        store.save("foo", "Hello Wörld")
+
+        assertTrue(store.containsKey("foo"))
+
+        store.remove("foo")
+
+        assertFalse(store.containsKey("foo"))
+    }
+
+    @Test
+    fun clearDeletesEverything() {
+        assertFalse(store.containsKey("foo"))
+
+        store.save("foo", "Hello Wörld")
+        store.save("bar", arrayOf("a", "b", "c"))
+
+        store.clear()
+
+        assertFalse(store.containsKey("foo"))
+        assertFalse(store.containsKey("bar"))
+    }
+
+    @Test
+    fun saveAndRestoreString() {
+        assertEquals("", store.getString("foo"))
+
+        store.save("foo", "Hello Wörld")
+
+        assertEquals("Hello Wörld", store.getString("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreByteArray() {
+        val bytes = byteArrayOf(1, 2, 3)
+
+        store.save("foo", bytes)
+
+        assertContentEquals(bytes, store.getBytes("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreJsonArray() {
+        val jsonArray = JSONArray(arrayOf(1, true, "Hello"))
+
+        store.save("foo", jsonArray)
+
+        val readJsonArray = store.getJSONArray("foo")
+
+        assertEquals(3, readJsonArray.length())
+        assertEquals(1, readJsonArray.getInt(0))
+        assertEquals(true, readJsonArray.getBoolean(1))
+        assertEquals("Hello", readJsonArray.getString(2))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreJsonObject() {
+        val jsonObject = JSONObject(mapOf("a" to "Hello", "b" to 123))
+
+        store.save("foo", jsonObject)
+
+        val readJsonObject = store.getJSONObject("foo")
+
+        assertNotNull(readJsonObject)
+        assertEquals(setOf("a", "b"), readJsonObject.keys().asSequence().toSet())
+        assertEquals("Hello", readJsonObject.getString("a"))
+        assertEquals(123, readJsonObject.getInt("b"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreStringArray() {
+        val strings = arrayOf("Hello", "World")
+
+        store.save("foo", strings)
+
+        assertContentEquals(strings, store.getStringArray("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreStringQuietlyArray() {
+        val strings = arrayOf("Hello", "World")
+
+        store.saveQuietly("foo", strings)
+
+        assertContentEquals(strings, store.getStringArray("foo"))
+        assertFalse(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreMap() {
+        val map = mapOf("a" to "Hello", "b" to "World", "c" to null)
+
+        store.save("foo", map)
+
+        assertEquals(map, store.getMap("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun defaultValues() {
+        assertEquals("", store.getString("foo"))
+        assertNull(store.getStringArray("foo"))
+        assertEquals(emptyMap(), store.getMap("foo"))
+        assertContentEquals(ByteArray(0), store.getBytes("foo"))
+        assertEquals(JSONArray(), store.getJSONArray("foo"))
+        assertEquals(null, store.getJSONObject("foo"))
+    }
+
+    @Test
+    fun restoringFromPreviouslyEncryptedFile() {
+        File(ThreemaApplication.getAppContext().filesDir, ".crs-test")
+            .writeBytes(
+                byteArrayOf(
+                    -116, 41, -38, -100, 96, 67, -28, -11, -118, -59, -33, -25,
+                    58, -51, 27, -9, -84, -102, -29, 97, 97, 101, -124, 32, 111,
+                    57, -54, -68, 37, 100, 119, 42,
+                ),
+            )
+
+        assertEquals("Hello", store.getString("test"))
+    }
+
+    @Test
+    fun storingNewValueReplacesThePrevious() {
+        store.save("foo", "Hello Wörld! This is a long string, much longer than the second one.")
+        store.save("foo", "Hi")
+
+        assertEquals("Hi", store.getString("foo"))
+    }
+
+    @Test
+    fun stringArrayValuesCannotContainSemicolon() {
+        assertFailsWith<IllegalArgumentException> {
+            store.save("foo", arrayOf("Hi", "Hello;World"))
+        }
+    }
+}

+ 232 - 0
app/src/androidTest/java/ch/threema/app/stores/PreferencesStoreImplTest.kt

@@ -0,0 +1,232 @@
+/*  _____ _
+ * |_   _| |_  _ _ ___ ___ _ __  __ _
+ *   | | | ' \| '_/ -_) -_) '  \/ _` |_
+ *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
+ *
+ * Threema for Android
+ * Copyright (c) 2025 Threema GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package ch.threema.app.stores
+
+import androidx.core.content.edit
+import androidx.preference.PreferenceManager
+import ch.threema.app.ThreemaApplication
+import kotlin.test.BeforeTest
+import kotlin.test.Test
+import kotlin.test.assertContentEquals
+import kotlin.test.assertEquals
+import kotlin.test.assertFailsWith
+import kotlin.test.assertFalse
+import kotlin.test.assertNotNull
+import kotlin.test.assertNull
+import kotlin.test.assertTrue
+import org.json.JSONArray
+import org.json.JSONObject
+import org.koin.core.component.KoinComponent
+import org.koin.core.component.get
+
+class PreferencesStoreImplTest : KoinComponent {
+
+    private var onChangedCalled = false
+    private lateinit var store: PreferenceStore
+
+    @BeforeTest
+    fun setUp() {
+        store = PreferenceStoreImpl(
+            sharedPreferences = get(),
+            onChanged = { _, _ -> onChangedCalled = true },
+        )
+        store.clear()
+        onChangedCalled = false
+    }
+
+    @Test
+    fun checkingForAndRemovingKeys() {
+        assertFalse(store.containsKey("foo"))
+
+        store.save("foo", "Hello Wörld")
+
+        assertTrue(store.containsKey("foo"))
+
+        store.remove("foo")
+
+        assertFalse(store.containsKey("foo"))
+    }
+
+    @Test
+    fun clearDeletesEverything() {
+        assertFalse(store.containsKey("foo"))
+
+        store.save("foo", "Hello Wörld")
+        store.save("bar", arrayOf("a", "b", "c"))
+
+        store.clear()
+
+        assertFalse(store.containsKey("foo"))
+        assertFalse(store.containsKey("bar"))
+    }
+
+    @Test
+    fun saveAndRestoreString() {
+        assertNull(store.getString("foo"))
+
+        store.save("foo", "Hello Wörld")
+
+        assertEquals("Hello Wörld", store.getString("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreInt() {
+        assertEquals(-1, store.getInt("foo", defaultValue = -1))
+
+        store.save("foo", 123)
+
+        assertEquals(123, store.getInt("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreBoolean() {
+        assertEquals(false, store.getBoolean("foo"))
+
+        store.save("foo", true)
+
+        assertEquals(true, store.getBoolean("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreLong() {
+        assertEquals(-1L, store.getLong("foo", defaultValue = -1L))
+
+        store.save("foo", 123_000_000_000_000L)
+
+        assertEquals(123_000_000_000_000L, store.getLong("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreFloat() {
+        assertEquals(-1f, store.getFloat("foo", -1f))
+
+        store.save("foo", 123.456f)
+
+        assertEquals(123.456f, store.getFloat("foo", -1f))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreByteArray() {
+        val bytes = byteArrayOf(1, 2, 3)
+
+        store.save("foo", bytes)
+
+        assertContentEquals(bytes, store.getBytes("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreJsonArray() {
+        val jsonArray = JSONArray(arrayOf<Any>(1, true, "Hello"))
+
+        store.save("foo", jsonArray)
+
+        val readJsonArray = store.getJSONArray("foo")
+
+        assertEquals(3, readJsonArray.length())
+        assertEquals(1, readJsonArray.getInt(0))
+        assertEquals(true, readJsonArray.getBoolean(1))
+        assertEquals("Hello", readJsonArray.getString(2))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreJsonObject() {
+        val jsonObject = JSONObject(mapOf("a" to "Hello", "b" to 123))
+
+        store.save("foo", jsonObject)
+
+        val readJsonObject = store.getJSONObject("foo")
+
+        assertNotNull(readJsonObject)
+        assertEquals(setOf("a", "b"), readJsonObject.keys().asSequence().toSet())
+        assertEquals("Hello", readJsonObject.getString("a"))
+        assertEquals(123, readJsonObject.getInt("b"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreStringArray() {
+        val strings = arrayOf("Hello", "World")
+
+        store.save("foo", strings)
+
+        assertContentEquals(strings, store.getStringArray("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreStringQuietlyArray() {
+        val strings = arrayOf("Hello", "World")
+
+        store.saveQuietly("foo", strings)
+
+        assertContentEquals(strings, store.getStringArray("foo"))
+        assertFalse(onChangedCalled)
+    }
+
+    @Test
+    fun saveAndRestoreMap() {
+        val map = mapOf("a" to "Hello", "b" to "World", "c" to null)
+
+        store.save("foo", map)
+
+        assertEquals(map, store.getMap("foo"))
+        assertTrue(onChangedCalled)
+    }
+
+    @Test
+    fun defaultValues() {
+        assertNull(store.getString("foo"))
+        assertEquals(0f, store.getFloat("foo"))
+        assertEquals(0L, store.getLong("foo"))
+        assertEquals(0, store.getInt("foo"))
+        assertEquals(false, store.getBoolean("foo"))
+        assertNull(store.getStringArray("foo"))
+        assertEquals(emptyMap(), store.getMap("foo"))
+        assertContentEquals(ByteArray(0), store.getBytes("foo"))
+        assertEquals(JSONArray(), store.getJSONArray("foo"))
+        assertNull(store.getJSONObject("foo"))
+    }
+
+    @Test
+    fun restorePreviouslyStoredValue() {
+        PreferenceManager.getDefaultSharedPreferences(ThreemaApplication.getAppContext())
+            .edit {
+                putString("test", "Hello")
+            }
+
+        assertEquals("Hello", store.getString("test"))
+    }
+
+    @Test
+    fun stringArrayValuesCannotContainSemicolon() {
+        assertFailsWith<IllegalArgumentException> {
+            store.save("foo", arrayOf("Hi", "Hello;World"))
+        }
+    }
+}

+ 3 - 2
app/src/androidTest/java/ch/threema/app/tasks/GroupCreateTaskTest.kt

@@ -48,11 +48,12 @@ import ch.threema.domain.protocol.blob.BlobScope
 import ch.threema.domain.protocol.blob.BlobUploader
 import ch.threema.domain.protocol.connection.data.CspMessage
 import ch.threema.domain.protocol.connection.data.OutboundD2mMessage
+import ch.threema.domain.types.Identity
 import ch.threema.storage.models.ContactModel
 import ch.threema.storage.models.GroupModel
 import ch.threema.testhelpers.MUST_NOT_BE_CALLED
+import java.net.URL
 import java.util.Date
-import javax.net.ssl.HttpsURLConnection
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.assertEquals
@@ -112,7 +113,7 @@ class GroupCreateTaskTest {
             MUST_NOT_BE_CALLED()
         }
 
-        override fun createAvatarURLConnection(identity: String?): HttpsURLConnection {
+        override fun getAvatarURL(identity: Identity): URL {
             MUST_NOT_BE_CALLED()
         }
     }

+ 115 - 103
app/src/androidTest/java/ch/threema/app/tasks/PersistableTasksTest.kt

@@ -22,6 +22,8 @@
 package ch.threema.app.tasks
 
 import ch.threema.app.ThreemaApplication
+import ch.threema.base.crypto.NaCl
+import ch.threema.data.datatypes.IdColor
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.models.GroupIdentity
 import ch.threema.data.models.GroupModelData
@@ -32,14 +34,11 @@ import ch.threema.domain.models.ReadReceiptPolicy
 import ch.threema.domain.models.TypingIndicatorPolicy
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
-import ch.threema.domain.taskmanager.Task
-import ch.threema.domain.taskmanager.TaskCodec
 import ch.threema.storage.models.ContactModel
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import junit.framework.TestCase.assertEquals
 import junit.framework.TestCase.assertNotNull
-import junit.framework.TestCase.fail
+import kotlin.reflect.KClass
 import kotlin.test.Test
 import kotlinx.coroutines.runBlocking
 import kotlinx.serialization.json.Json
@@ -56,7 +55,7 @@ class PersistableTasksTest {
     @Test
     fun testContactDeliveryReceiptMessageTask() {
         assertValidEncoding(
-            OutgoingContactDeliveryReceiptMessageTask::class.java,
+            OutgoingContactDeliveryReceiptMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactDeliveryReceiptMessageTask.OutgoingDeliveryReceiptMessageData",""" +
                 """"receiptType":1,"messageIds":["0000000000000000"],"date":"1234567890","toIdentity":"01234567"}""",
         )
@@ -65,7 +64,7 @@ class PersistableTasksTest {
     @Test
     fun testFileMessageTask() {
         assertValidEncoding(
-            OutgoingFileMessageTask::class.java,
+            OutgoingFileMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingFileMessageTask.OutgoingFileMessageData","messageModelId":1,"receiverType":0,""" +
                 """"recipientIdentities":["01234567"],"thumbnailBlobId":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]}""",
         )
@@ -74,7 +73,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupDeleteProfilePictureTask() {
         assertValidEncoding(
-            OutgoingGroupDeleteProfilePictureTask::class.java,
+            OutgoingGroupDeleteProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeleteProfilePictureTask.OutgoingGroupDeleteProfilePictureData",""" +
                 """"groupId":[0,0,0,0,0,0,0,0],"creatorIdentity":"01234567","receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -84,7 +83,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupDeliveryReceiptMessageTask() {
         assertValidEncoding(
-            OutgoingGroupDeliveryReceiptMessageTask::class.java,
+            OutgoingGroupDeliveryReceiptMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeliveryReceiptMessageTask.OutgoingGroupDeliveryReceiptMessageData",""" +
                 """"messageModelId":0,"recipientIdentities":["01234567","01234567"],"receiptType":0}""",
         )
@@ -93,7 +92,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupLeaveTask() {
         assertValidEncoding(
-            OutgoingGroupLeaveTask::class.java,
+            OutgoingGroupLeaveTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupLeaveTask.OutgoingGroupLeaveTaskData",""" +
                 """"groupIdentity":{"creatorIdentity":"01234567","groupId":42},"memberIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -103,7 +102,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupNameTask() {
         assertValidEncoding(
-            OutgoingGroupNameTask::class.java,
+            OutgoingGroupNameTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupNameTask.OutgoingGroupNameData","groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567","groupName":"groupName","receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -113,7 +112,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupProfilePictureTask() {
         assertValidEncoding(
-            OutgoingGroupProfilePictureTask::class.java,
+            OutgoingGroupProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupProfilePictureTask.OutgoingGroupProfilePictureData",""" +
                 """"groupId":[0,0,0,0,0,0,0,0],"creatorIdentity":"01234567","receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -123,7 +122,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupSetupTask() {
         assertValidEncoding(
-            OutgoingGroupSetupTask::class.java,
+            OutgoingGroupSetupTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupSetupTask.OutgoingGroupSetupData","groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567","memberIdentities":["01234567"],"receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -133,7 +132,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupSyncRequestTask() {
         assertValidEncoding(
-            OutgoingGroupSyncRequestTask::class.java,
+            OutgoingGroupSyncRequestTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupSyncRequestTask.OutgoingGroupSyncRequestData",""" +
                 """"groupId":[0,0,0,0,0,0,0,0],"creatorIdentity":"01234567","messageId":[0,0,0,0,0,0,0,0]}""",
         )
@@ -142,7 +141,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupSyncTask() {
         assertValidEncoding(
-            OutgoingGroupSyncTask::class.java,
+            OutgoingGroupSyncTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupSyncTask.OutgoingGroupSyncData","groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567","receiverIdentities":["01234567"]}""",
         )
@@ -151,7 +150,7 @@ class PersistableTasksTest {
     @Test
     fun testLocationMessageTask() {
         assertValidEncoding(
-            OutgoingLocationMessageTask::class.java,
+            OutgoingLocationMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingLocationMessageTask.OutgoingLocationMessageTaskData","messageModelId":0,""" +
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0}""",
         )
@@ -160,7 +159,7 @@ class PersistableTasksTest {
     @Test
     fun testPollSetupMessageTask() {
         assertValidEncoding(
-            OutgoingPollSetupMessageTask::class.java,
+            OutgoingPollSetupMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingPollSetupMessageTask.OutgoingPollSetupMessageData","messageModelId":0,""" +
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0,"ballotId":[-58,11,102,-122,-119,-102,19,-10],""" +
                 """"ballotData":"{\"d\":\"description\",\"s\":0,\"a\":0,\"t\":1,\"o\":0,\"u\":0,""" +
@@ -171,7 +170,7 @@ class PersistableTasksTest {
     @Test
     fun testPollVoteContactMessageTask() {
         assertValidEncoding(
-            OutgoingPollVoteContactMessageTask::class.java,
+            OutgoingPollVoteContactMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingPollVoteContactMessageTask.OutgoingPollVoteContactMessageData",""" +
                 """"messageId":"0000000000000000","ballotId":[-127,-79,80,-109,-98,62,-3,81],"ballotCreator":"01234567",""" +
                 """"ballotVotes":[{"first":0,"second":0}],"toIdentity":"01234567"}""",
@@ -181,7 +180,7 @@ class PersistableTasksTest {
     @Test
     fun testPollVoteGroupMessageTask() {
         assertValidEncoding(
-            OutgoingPollVoteGroupMessageTask::class.java,
+            OutgoingPollVoteGroupMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingPollVoteGroupMessageTask.OutgoingPollVoteGroupMessageData",""" +
                 """"messageId":"0000000000000000","recipientIdentities":["01234567","01234567"],"ballotId":[52,64,-6,18,2,-71,124,-19],""" +
                 """"ballotCreator":"01234567","ballotVotes":[{"first":0,"second":0}],"ballotType":"INTERMEDIATE",""" +
@@ -192,7 +191,7 @@ class PersistableTasksTest {
     @Test
     fun testTextMessageTask() {
         assertValidEncoding(
-            OutgoingTextMessageTask::class.java,
+            OutgoingTextMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingTextMessageTask.OutgoingTextMessageData","messageModelId":0,""" +
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0}""",
         )
@@ -201,7 +200,7 @@ class PersistableTasksTest {
     @Test
     fun testSendProfilePictureTask() {
         assertValidEncoding(
-            SendProfilePictureTask::class.java,
+            SendProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.SendProfilePictureTask.SendProfilePictureData","toIdentity":"01234567"}""",
         )
     }
@@ -209,7 +208,7 @@ class PersistableTasksTest {
     @Test
     fun testSendPushTokenTask() {
         assertValidEncoding(
-            SendPushTokenTask::class.java,
+            SendPushTokenTask::class,
             """{"type":"ch.threema.app.tasks.SendPushTokenTask.SendPushTokenData","token":"token","tokenType":0}""",
         )
     }
@@ -217,7 +216,7 @@ class PersistableTasksTest {
     @Test
     fun testOutgoingContactRequestProfilePictureTask() {
         assertValidEncoding(
-            OutgoingContactRequestProfilePictureTask::class.java,
+            OutgoingContactRequestProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactRequestProfilePictureTask.OutgoingContactRequestProfilePictureData",""" +
                 """"toIdentity":"01234567"}""",
         )
@@ -229,22 +228,22 @@ class PersistableTasksTest {
         addTestData()
 
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"RESET"}""",
         )
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"UNKNOWN_SESSION"}""",
         )
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"DISABLED_BY_LOCAL"}""",
         )
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"DISABLED_BY_REMOTE"}""",
         )
@@ -253,7 +252,7 @@ class PersistableTasksTest {
     @Test
     fun testApplicationUpdateStepsTask() {
         assertValidEncoding(
-            ApplicationUpdateStepsTask::class.java,
+            ApplicationUpdateStepsTask::class,
             """{"type":"ch.threema.app.tasks.ApplicationUpdateStepsTask.ApplicationUpdateStepsData"}""",
         )
     }
@@ -261,7 +260,7 @@ class PersistableTasksTest {
     @Test
     fun testFSRefreshStepsTask() {
         assertValidEncoding(
-            FSRefreshStepsTask::class.java,
+            FSRefreshStepsTask::class,
             """{"type":"ch.threema.app.tasks.FSRefreshStepsTask.FSRefreshStepsTaskData","contactIdentities":["01234567"]}""",
         )
     }
@@ -269,7 +268,7 @@ class PersistableTasksTest {
     @Test
     fun testOutboundIncomingContactMessageUpdateReadTask() {
         assertValidEncoding(
-            OutboundIncomingContactMessageUpdateReadTask::class.java,
+            OutboundIncomingContactMessageUpdateReadTask::class,
             """{"type":"ch.threema.app.tasks.OutboundIncomingContactMessageUpdateReadTask.OutboundIncomingContactMessageUpdateReadData",""" +
                 """"messageIds":[[0,-1,2,3,4,5,6,7]],"timestamp":1704067200000,"recipientIdentity":"01234567"}""",
         )
@@ -278,7 +277,7 @@ class PersistableTasksTest {
     @Test
     fun testOutboundIncomingGroupMessageUpdateReadTask() {
         assertValidEncoding(
-            OutboundIncomingGroupMessageUpdateReadTask::class.java,
+            OutboundIncomingGroupMessageUpdateReadTask::class,
             """{"type":"ch.threema.app.tasks.OutboundIncomingGroupMessageUpdateReadTask.OutboundIncomingGroupMessageUpdateReadData",""" +
                 """"messageIds":[[0,-1,2,3,4,5,6,7]],"timestamp":1704067200000,"groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567"}""",
@@ -288,7 +287,7 @@ class PersistableTasksTest {
     @Test
     fun testOutgoingContactEditMessageTask() {
         assertValidEncoding(
-            OutgoingContactEditMessageTask::class.java,
+            OutgoingContactEditMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactEditMessageTask.OutgoingContactEditMessageData",""" +
                 """"toIdentity":"01234567","messageModelId":0, "messageId":[0,0,0,0,0,0,0,0], "editedText":"test", "editedAt":0}""",
         )
@@ -297,7 +296,7 @@ class PersistableTasksTest {
     @Test
     fun testOutgoingGroupEditMessageTask() {
         assertValidEncoding(
-            OutgoingGroupEditMessageTask::class.java,
+            OutgoingGroupEditMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupEditMessageTask.OutgoingGroupEditMessageData","messageModelId":0, """ +
                 """"messageId":[0,0,0,0,0,0,0,0], "editedText":"test", "editedAt":0,"recipientIdentities":["01234567","01234567"]}""",
         )
@@ -306,7 +305,7 @@ class PersistableTasksTest {
     @Test
     fun testOutgoingContactDeleteMessageTask() {
         assertValidEncoding(
-            OutgoingContactDeleteMessageTask::class.java,
+            OutgoingContactDeleteMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactDeleteMessageTask.OutgoingContactDeleteMessageData",""" +
                 """"toIdentity":"01234567","messageModelId":0, "messageId":[0,0,0,0,0,0,0,0], "deletedAt":0}""",
         )
@@ -315,7 +314,7 @@ class PersistableTasksTest {
     @Test
     fun testOutgoingGroupDeleteMessageTask() {
         assertValidEncoding(
-            OutgoingGroupDeleteMessageTask::class.java,
+            OutgoingGroupDeleteMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeleteMessageTask.OutgoingGroupDeleteMessageData",""" +
                 """"messageModelId":0,"messageId":[0,0,0,0,0,0,0,0],"deletedAt":0,"recipientIdentities":["01234567","01234567"]}""",
         )
@@ -324,7 +323,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectUserProfileNicknameSyncTask() {
         assertValidEncoding(
-            ReflectUserProfileNicknameSyncTask::class.java,
+            ReflectUserProfileNicknameSyncTask::class,
             """{"type":"ch.threema.app.tasks.ReflectUserProfileNicknameSyncTask.ReflectUserProfileNicknameSyncTaskData",""" +
                 """"newNickname":"nick"}""",
         )
@@ -333,7 +332,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectUserProfilePictureSyncTask() {
         assertValidEncoding(
-            ReflectUserProfilePictureSyncTask::class.java,
+            ReflectUserProfilePictureSyncTask::class,
             """{"type":"ch.threema.app.tasks.ReflectUserProfilePictureSyncTask.ReflectUserProfilePictureSyncTaskData"}""",
         )
     }
@@ -341,7 +340,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectUserProfileShareWithPolicySyncTask() {
         assertValidEncoding(
-            ReflectUserProfileShareWithPolicySyncTask::class.java,
+            ReflectUserProfileShareWithPolicySyncTask::class,
             """{"type":"ch.threema.app.tasks.ReflectUserProfileShareWithPolicySyncTask.ReflectUserProfileShareWithPolicySyncTaskData",""" +
                 """"newPolicy":"NOBODY"}""",
         )
@@ -350,7 +349,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectUserProfileShareWithAllowListSyncTask() {
         assertValidEncoding(
-            ReflectUserProfileShareWithAllowListSyncTask::class.java,
+            ReflectUserProfileShareWithAllowListSyncTask::class,
             """{"type":""" +
                 """"ch.threema.app.tasks.ReflectUserProfileShareWithAllowListSyncTask.ReflectUserProfileShareWithAllowListSyncTaskData",""" +
                 """"allowedIdentities":["01234567", "01234568"]}""",
@@ -360,7 +359,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectUserProfileIdentityLinksTask() {
         assertValidEncoding(
-            expectedTaskClass = ReflectUserProfileIdentityLinksTask::class.java,
+            expectedTaskClass = ReflectUserProfileIdentityLinksTask::class,
             encodedTask = """{"type":"ch.threema.app.tasks.ReflectUserProfileIdentityLinksTask.ReflectUserProfileIdentityLinksTaskData"}""",
         )
     }
@@ -368,17 +367,17 @@ class PersistableTasksTest {
     @Test
     fun testReflectNameUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNameUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNameUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
                 """"firstName":"A","lastName":"B","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNameUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNameUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
                 """"firstName":"A","lastName":"","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNameUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNameUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
                 """"firstName":"","lastName":"B","identity":"01234567"}""",
         )
@@ -387,17 +386,17 @@ class PersistableTasksTest {
     @Test
     fun testReflectReadReceiptPolicyUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
                 """"readReceiptPolicy":"DEFAULT","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
                 """"readReceiptPolicy":"SEND","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
                 """"readReceiptPolicy":"DONT_SEND","identity":"01234567"}""",
         )
@@ -406,17 +405,17 @@ class PersistableTasksTest {
     @Test
     fun testReflectTypingIndicatorPolicyUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"DEFAULT","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"SEND","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"DONT_SEND","identity":"01234567"}""",
         )
@@ -425,17 +424,17 @@ class PersistableTasksTest {
     @Test
     fun testReflectActivityStateUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
                 """"identityState":"ACTIVE","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
                 """"identityState":"INACTIVE","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
                 """"identityState":"INVALID","identity":"01234567"}""",
         )
@@ -444,7 +443,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectFeatureMaskUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectFeatureMaskUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectFeatureMaskUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectFeatureMaskUpdate.ReflectFeatureMaskUpdateData",""" +
                 """"featureMask":12345,"identity":"01234567"}""",
         )
@@ -453,17 +452,17 @@ class PersistableTasksTest {
     @Test
     fun testVerificationLevelUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
                 """"verificationLevel":"UNVERIFIED","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
                 """"verificationLevel":"SERVER_VERIFIED","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
                 """"verificationLevel":"FULLY_VERIFIED","identity":"01234567"}""",
         )
@@ -472,12 +471,12 @@ class PersistableTasksTest {
     @Test
     fun testWorkVerificationLevelUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate.""" +
                 """ReflectWorkVerificationLevelUpdateData","workVerificationLevel":"NONE","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate.""" +
                 """ReflectWorkVerificationLevelUpdateData","workVerificationLevel":"WORK_SUBSCRIPTION_VERIFIED","identity":"01234567"}""",
         )
@@ -486,12 +485,12 @@ class PersistableTasksTest {
     @Test
     fun testIdentityTypeUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate.ReflectIdentityTypeUpdateData",""" +
                 """"identityType":"NORMAL","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate.ReflectIdentityTypeUpdateData",""" +
                 """"identityType":"WORK","identity":"01234567"}""",
         )
@@ -500,12 +499,12 @@ class PersistableTasksTest {
     @Test
     fun testAcquaintanceLevelUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate.ReflectAcquaintanceLevelUpdateData",""" +
                 """"acquaintanceLevel":"DIRECT","identity":"01234567"}""",
         )
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate.ReflectAcquaintanceLevelUpdateData",""" +
                 """"acquaintanceLevel":"GROUP","identity":"01234567"}""",
         )
@@ -514,7 +513,7 @@ class PersistableTasksTest {
     @Test
     fun testUserDefinedProfilePictureUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectUserDefinedProfilePictureUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectUserDefinedProfilePictureUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectUserDefinedProfilePictureUpdate.""" +
                 """ReflectUserDefinedProfilePictureUpdateData","identity":"0BZYE2H9"}""",
         )
@@ -526,7 +525,7 @@ class PersistableTasksTest {
         addTestData()
 
         assertValidEncoding(
-            OnFSFeatureMaskDowngradedTask::class.java,
+            OnFSFeatureMaskDowngradedTask::class,
             """{"type":"ch.threema.app.tasks.OnFSFeatureMaskDowngradedTask.OnFSFeatureMaskDowngradedData","identity":"01234567"}""",
         )
     }
@@ -534,7 +533,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectContactSyncPolicyUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectContactSyncPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectContactSyncPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectContactSyncPolicySyncUpdate.""" +
                 """ReflectContactSyncPolicySyncUpdateData"}""",
         )
@@ -543,7 +542,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectUnknownContactPolicyUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectUnknownContactPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectUnknownContactPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectUnknownContactPolicySyncUpdate.""" +
                 """ReflectUnknownContactPolicySyncUpdateData"}""",
         )
@@ -552,7 +551,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectReadReceiptPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectReadReceiptPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectReadReceiptPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectReadReceiptPolicySyncUpdate.ReadReceiptPolicySyncUpdateData"}""",
         )
     }
@@ -560,7 +559,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectTypingIndicatorPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectTypingIndicatorPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectTypingIndicatorPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectTypingIndicatorPolicySyncUpdate.""" +
                 """ReflectTypingIndicatorPolicySyncUpdateData"}""",
         )
@@ -569,7 +568,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectO2oCallPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectO2oCallPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectO2oCallPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallPolicySyncUpdate.""" +
                 """ReflectO2oCallPolicySyncUpdateData"}""",
         )
@@ -578,7 +577,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectO2oCallConnectionPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectO2oCallConnectionPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectO2oCallConnectionPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallConnectionPolicySyncUpdate.""" +
                 """ReflectO2oCallConnectionPolicySyncUpdateData"}""",
         )
@@ -587,7 +586,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectO2oCallVideoPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectO2oCallVideoPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectO2oCallVideoPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallVideoPolicySyncUpdate.""" +
                 """ReflectO2oCallVideoPolicySyncUpdateData"}""",
         )
@@ -596,7 +595,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectGroupCallPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectGroupCallPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectGroupCallPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectGroupCallPolicySyncUpdate.""" +
                 """ReflectGroupCallPolicySyncUpdateData"}""",
         )
@@ -605,7 +604,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectScreenshotPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectScreenshotPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectScreenshotPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectScreenshotPolicySyncUpdate.""" +
                 """ReflectScreenshotPolicySyncUpdateData"}""",
         )
@@ -614,7 +613,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectKeyboardDataCollectionPolicySyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectKeyboardDataCollectionPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectKeyboardDataCollectionPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectKeyboardDataCollectionPolicySyncUpdate.""" +
                 """ReflectKeyboardDataCollectionPolicySyncUpdateData"}""",
         )
@@ -623,7 +622,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectBlockedIdentitiesSyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectBlockedIdentitiesSyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectBlockedIdentitiesSyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectBlockedIdentitiesSyncUpdate.ReflectBlockedIdentitiesSyncUpdateData"}""",
         )
     }
@@ -631,7 +630,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectExcludeFromSyncIdentitiesSyncUpdate() {
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectExcludeFromSyncIdentitiesSyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectExcludeFromSyncIdentitiesSyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectExcludeFromSyncIdentitiesSyncUpdate.""" +
                 """ReflectExcludeFromSyncIdentitiesSyncUpdateData"}""",
         )
@@ -640,7 +639,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupCreateTask() {
         assertValidEncoding(
-            GroupCreateTask::class.java,
+            GroupCreateTask::class,
             """{"type":"ch.threema.app.tasks.GroupCreateTask.GroupCreateTaskData","name":"Name","profilePictureChange":""" +
                 """{"type":"ch.threema.app.protocol.RemoveProfilePicture"},"members":["TESTTEST","01234567"],"groupIdentity":""" +
                 """{"creatorIdentity":"01234567","groupId":42},"predefinedMessageIds":{"messageIdBytes1":[-121,-57,86,-82,-126,8,80,89],""" +
@@ -652,7 +651,7 @@ class PersistableTasksTest {
     @Test
     fun testGroupUpdateTask() {
         assertValidEncoding(
-            GroupUpdateTask::class.java,
+            GroupUpdateTask::class,
             """{"type":"ch.threema.app.tasks.GroupUpdateTask.GroupUpdateTaskData","name":"Name","profilePictureChange":""" +
                 """{"type":"ch.threema.app.protocol.RemoveProfilePicture"},"updatedMembers":["01234567"],"addedMembers":["TESTTEST",""" +
                 """"01234567"],"removedMembers":["01234567"],"groupIdentity":{"creatorIdentity":"01234567","groupId":42},""" +
@@ -664,7 +663,7 @@ class PersistableTasksTest {
     @Test
     fun testOutgoingGroupDisbandTask() {
         assertValidEncoding(
-            OutgoingGroupDisbandTask::class.java,
+            OutgoingGroupDisbandTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDisbandTask.OutgoingGroupDisbandTaskData","groupIdentity":""" +
                 """{"creatorIdentity":"TESTTEST","groupId":42},"members":["01234567"],"messageId":[0,1,2,3,4,5,6,7]}""",
         )
@@ -673,7 +672,7 @@ class PersistableTasksTest {
     @Test
     fun testContactNotificationTriggerPolicyOverrideUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate.""" +
                 """ReflectNotificationTriggerPolicyOverrideUpdateData","notificationTriggerPolicyOverride":1740396679447,""" +
                 """"contactIdentity":"01234567"}""",
@@ -684,7 +683,7 @@ class PersistableTasksTest {
     fun testGroupNotificationTriggerPolicyOverrideUpdate() {
         addTestData()
         assertValidEncoding(
-            ReflectGroupSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class.java,
+            ReflectGroupSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate.""" +
                 """ReflectNotificationTriggerPolicyOverrideUpdateData","newNotificationTriggerPolicyOverride":""" +
                 """{"type":"ch.threema.data.datatypes.NotificationTriggerPolicyOverride.MutedUntil","dbValue":1740396953761,""" +
@@ -695,7 +694,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectContactConversationCategoryUpdate() {
         assertValidEncoding(
-            expectedTaskClass = ReflectContactSyncUpdateTask.ReflectConversationCategoryUpdate::class.java,
+            expectedTaskClass = ReflectContactSyncUpdateTask.ReflectConversationCategoryUpdate::class,
             encodedTask = "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationCategoryUpdate" +
                 ".ReflectContactConversationCategoryUpdateData\",\"contactIdentity\":\"01234567\",\"isPrivateChat\":true}",
         )
@@ -705,7 +704,7 @@ class PersistableTasksTest {
     fun testReflectGroupConversationCategoryUpdate() {
         addTestData()
         assertValidEncoding(
-            expectedTaskClass = ReflectGroupSyncUpdateTask.ReflectGroupConversationCategoryUpdateTask::class.java,
+            expectedTaskClass = ReflectGroupSyncUpdateTask.ReflectGroupConversationCategoryUpdateTask::class,
             encodedTask = "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationCategoryUpdateTask" +
                 ".ReflectGroupConversationCategoryData\",\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}" +
                 "\"isPrivateChat\":true}",
@@ -715,7 +714,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectContactConversationVisibilityArchiveUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectConversationVisibilityArchiveUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectConversationVisibilityArchiveUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationVisibilityArchiveUpdate" +
                 ".ReflectConversationVisibilityArchiveUpdateData\",\"isArchived\":true,\"contactIdentity\":\"01234567\"}",
         )
@@ -725,7 +724,7 @@ class PersistableTasksTest {
     fun testReflectGroupConversationVisibilityArchiveUpdate() {
         addTestData()
         assertValidEncoding(
-            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityArchiveUpdate::class.java,
+            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityArchiveUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityArchiveUpdate" +
                 ".ReflectGroupConversationVisibilityArchiveUpdateData\",\"isArchived\":true," +
                 "\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}}",
@@ -735,7 +734,7 @@ class PersistableTasksTest {
     @Test
     fun testReflectContactConversationVisibilityPinnedUpdate() {
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectConversationVisibilityPinnedUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectConversationVisibilityPinnedUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationVisibilityPinnedUpdate" +
                 ".ReflectConversationVisibilityPinnedUpdateData\",\"isPinned\":true,\"contactIdentity\":\"01234567\"}",
         )
@@ -745,17 +744,25 @@ class PersistableTasksTest {
     fun testReflectGroupConversationVisibilityPinnedUpdate() {
         addTestData()
         assertValidEncoding(
-            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityPinnedUpdate::class.java,
+            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityPinnedUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityPinnedUpdate" +
                 ".ReflectGroupConversationVisibilityPinnedUpdateData\",\"isPinned\":true," +
                 "\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}}",
         )
     }
 
+    @Test
+    fun testSyncFormerlyOrphanedGroupsTask() {
+        assertValidEncoding(
+            SyncFormerlyOrphanedGroupsTask::class,
+            """{"type":"ch.threema.app.tasks.SyncFormerlyOrphanedGroupsTask.SyncFormerlyOrphanedGroupsTaskData"}""",
+        )
+    }
+
     @Test
     fun testDeactivateMultiDeviceTask() {
         assertValidEncoding(
-            expectedTaskClass = DeactivateMultiDeviceTask::class.java,
+            expectedTaskClass = DeactivateMultiDeviceTask::class,
             encodedTask = """{"type":"ch.threema.app.tasks.DeactivateMultiDeviceTask.DeactivateMultiDeviceTaskData"}""",
         )
     }
@@ -763,11 +770,20 @@ class PersistableTasksTest {
     @Test
     fun testDeactivateMultiDeviceIfAloneTask() {
         assertValidEncoding(
-            expectedTaskClass = DeactivateMultiDeviceIfAloneTask::class.java,
+            expectedTaskClass = DeactivateMultiDeviceIfAloneTask::class,
             encodedTask = """{"type":"ch.threema.app.tasks.DeactivateMultiDeviceIfAloneTask.DeactivateMultiDeviceIfAloneTaskData"}""",
         )
     }
 
+    @Test
+    fun testConvertGroupProfilePictureTask() {
+        assertValidEncoding(
+            expectedTaskClass = ConvertGroupProfilePictureTask::class,
+            encodedTask = """{"type":"ch.threema.app.tasks.ConvertGroupProfilePictureTask.ConvertGroupProfilePictureTaskData",""" +
+                """"groupIdentity":{"creatorIdentity":"01234567","groupId":42}}""",
+        )
+    }
+
     private fun addTestData() = runBlocking {
         val identity = "01234567"
         if (serviceManager.modelRepositories.contacts.getByIdentity(identity) != null) {
@@ -775,12 +791,17 @@ class PersistableTasksTest {
             return@runBlocking
         }
 
-        serviceManager.identityStore.storeIdentity(identity, "", byteArrayOf(), byteArrayOf())
+        val keyPair = NaCl.generateKeypair()
+        serviceManager.identityStore.storeIdentity(
+            identity = identity,
+            serverGroup = "",
+            privateKey = keyPair.privateKey,
+        )
 
         serviceManager.modelRepositories.contacts.createFromLocal(
             ContactModelData(
                 identity = identity,
-                publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+                publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
                 createdAt = Date(42),
                 firstName = "0123",
                 lastName = "4567",
@@ -816,7 +837,7 @@ class PersistableTasksTest {
                 synchronizedAt = null,
                 lastUpdate = null,
                 isArchived = false,
-                precomputedColorIndex = null,
+                precomputedIdColor = IdColor.invalid(),
                 groupDescription = null,
                 groupDescriptionChangedAt = null,
                 otherMembers = setOf(identity),
@@ -826,18 +847,9 @@ class PersistableTasksTest {
         )
     }
 
-    private fun <T> assertValidEncoding(expectedTaskClass: Class<T>, encodedTask: String) {
-        val decodedTask = encodedTask.decodeToTask()
+    private fun assertValidEncoding(expectedTaskClass: KClass<*>, encodedTask: String) {
+        val decodedTask = Json.decodeFromString<SerializableTaskData>(encodedTask).createTask(serviceManager)
         assertNotNull(decodedTask)
-        assertEquals(expectedTaskClass, decodedTask!!::class.java)
-    }
-
-    private fun String.decodeToTask(): Task<*, TaskCodec>? {
-        return try {
-            Json.decodeFromString<SerializableTaskData>(this).createTask(serviceManager)
-        } catch (e: Exception) {
-            fail("Task data decoding error for task '$this'. Error: $e")
-            null
-        }
+        assertEquals(expectedTaskClass, decodedTask::class)
     }
 }

+ 1 - 1
app/src/androidTest/java/ch/threema/app/testutils/AndroidTestUtils.kt

@@ -54,7 +54,7 @@ fun clearDatabaseAndCaches(serviceManager: ServiceManager) {
 
     // Clear caches in services and trigger listeners to refresh the new models from database
     val contactService = serviceManager.contactService
-    val myIdentity = serviceManager.identityStore.identity
+    val myIdentity = serviceManager.identityStore.getIdentity()
     contactIdentities.forEach { identity ->
         contactService.invalidateCache(identity)
         ListenerManager.contactListeners.handle { it.onRemoved(identity) }

+ 8 - 10
app/src/androidTest/java/ch/threema/app/testutils/TestHelpers.java

@@ -26,7 +26,7 @@ import android.app.ActivityManager.RunningServiceInfo;
 import android.content.Context;
 import android.util.Log;
 
-import com.neilalexander.jnacl.NaCl;
+import ch.threema.base.crypto.NaCl;
 
 import java.util.Collection;
 import java.util.Date;
@@ -50,7 +50,7 @@ import ch.threema.domain.models.IdentityState;
 import ch.threema.domain.models.IdentityType;
 import ch.threema.domain.models.VerificationLevel;
 import ch.threema.domain.protocol.ThreemaFeature;
-import ch.threema.domain.stores.IdentityStoreInterface;
+import ch.threema.domain.stores.IdentityStore;
 import ch.threema.storage.models.ContactModel;
 import ch.threema.storage.models.GroupModel;
 
@@ -75,10 +75,10 @@ public class TestHelpers {
 
         public TestContact(@NonNull String identity) {
             this.identity = identity;
-            publicKey = new byte[NaCl.PUBLICKEYBYTES];
-            privateKey = new byte[NaCl.SECRETKEYBYTES];
+            publicKey = new byte[NaCl.PUBLIC_KEY_BYTES];
+            privateKey = new byte[NaCl.SECRET_KEY_BYTES];
 
-            NaCl.genkeypair(publicKey, privateKey);
+            NaCl.generateKeypairInPlace(publicKey, privateKey);
         }
 
         public TestContact(@NonNull String identity, @NonNull byte[] publicKey, @NonNull byte[] privateKey) {
@@ -98,7 +98,7 @@ public class TestHelpers {
         }
 
         @NonNull
-        public IdentityStoreInterface getIdentityStore() {
+        public IdentityStore getIdentityStore() {
             return new InMemoryIdentityStore(
                 this.identity,
                 "",
@@ -256,8 +256,7 @@ public class TestHelpers {
 
         userService.restoreIdentity(
             user.identity,
-            user.privateKey,
-            user.publicKey
+            user.privateKey
         );
     }
 
@@ -276,8 +275,7 @@ public class TestHelpers {
         // Otherwise, create identity
         userService.restoreIdentity(
             TEST_CONTACT.identity,
-            TEST_CONTACT.privateKey,
-            TEST_CONTACT.publicKey
+            TEST_CONTACT.privateKey
         );
         Log.i(TAG, "Test identity restored: " + TEST_CONTACT.identity);
         return TEST_CONTACT.identity;

+ 21 - 0
app/src/androidTest/java/ch/threema/app/utils/TextUtilTest.java

@@ -23,6 +23,7 @@ package ch.threema.app.utils;
 
 import android.content.Context;
 
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
@@ -68,4 +69,24 @@ public class TextUtilTest {
         assertTrue(TextUtil.checkBadPassword(context, "apples123"));
         assertFalse(TextUtil.checkBadPassword(context, "kajsdlfkjalskdjflkajsdfl"));
     }
+
+    @Test
+    public void testMatchesQueryDiacriticInsensitive() {
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("aàáâãäå", "aaaaaaa"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("eèéêë", "eeeee"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("iíìîï", "iiiii"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("oóòôöõ", "oooooo"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("uüúùû", "uuuuu"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("ñ", "n"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("ç", "c"));
+
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("ä", "A"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("ä", "a"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("Ä", "a"));
+        Assert.assertTrue(TextUtil.matchesQueryDiacriticInsensitive("Ä", "A"));
+        Assert.assertFalse(TextUtil.matchesQueryDiacriticInsensitive("a", "Ä"));
+
+        Assert.assertFalse(TextUtil.matchesQueryDiacriticInsensitive("a", null));
+        Assert.assertFalse(TextUtil.matchesQueryDiacriticInsensitive(null, "a"));
+    }
 }

+ 1 - 1
app/src/androidTest/java/ch/threema/data/TestDatabaseService.kt

@@ -30,5 +30,5 @@ import ch.threema.storage.DatabaseService
 class TestDatabaseService : DatabaseService(
     context = ApplicationProvider.getApplicationContext(),
     databaseName = null,
-    databaseKey = "test-database-key",
+    password = "test-database-key".toByteArray(),
 )

+ 26 - 22
app/src/androidTest/java/ch/threema/data/repositories/ContactModelRepositoryTest.kt

@@ -27,9 +27,10 @@ import ch.threema.app.TestTaskManager
 import ch.threema.app.ThreemaApplication
 import ch.threema.app.testutils.TestHelpers
 import ch.threema.app.utils.AppVersionProvider
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.TestDatabaseService
+import ch.threema.data.datatypes.IdColor
 import ch.threema.data.models.ContactModelData
-import ch.threema.data.models.ContactModelData.Companion.getIdColorIndex
 import ch.threema.domain.helpers.TransactionAckTaskCodec
 import ch.threema.domain.helpers.UnusedTaskCodec
 import ch.threema.domain.models.ContactSyncState
@@ -39,11 +40,11 @@ import ch.threema.domain.models.ReadReceiptPolicy
 import ch.threema.domain.models.TypingIndicatorPolicy
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
+import ch.threema.domain.types.Identity
 import ch.threema.storage.models.ContactModel
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.testhelpers.nonSecureRandomArray
 import ch.threema.testhelpers.randomIdentity
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import junit.framework.TestCase.assertNotNull
 import kotlin.test.BeforeTest
@@ -78,10 +79,10 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
 
     companion object {
         @JvmStatic
-        @Parameterized.Parameters()
+        @Parameterized.Parameters
         fun initialValuesSet() = setOf(
             getInitialContactModelData(),
-            getInitialContactModelData(publicKey = ByteArray(NaCl.PUBLICKEYBYTES) { it.toByte() }),
+            getInitialContactModelData(publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES) { it.toByte() }),
             getInitialContactModelData(createdAt = Date(42)),
             getInitialContactModelData(identityType = IdentityType.WORK),
             getInitialContactModelData(acquaintanceLevel = AcquaintanceLevel.GROUP),
@@ -90,8 +91,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         )
 
         private fun getInitialContactModelData(
-            identity: String = "ABCDEFGH",
-            publicKey: ByteArray = ByteArray(NaCl.PUBLICKEYBYTES),
+            identity: Identity = "ABCDEFGH",
+            publicKey: ByteArray = ByteArray(NaCl.PUBLIC_KEY_BYTES),
             createdAt: Date = Date(),
             firstName: String = "",
             lastName: String = "",
@@ -118,7 +119,7 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
             firstName = firstName,
             lastName = lastName,
             nickname = nickname,
-            colorIndex = getIdColorIndex(identity),
+            idColor = IdColor.ofIdentity(identity),
             verificationLevel = verificationLevel,
             workVerificationLevel = workVerificationLevel,
             identityType = identityType,
@@ -141,8 +142,9 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
 
     @BeforeTest
     fun before() {
+        val serviceManager = ThreemaApplication.requireServiceManager()
         TestHelpers.setIdentity(
-            ThreemaApplication.requireServiceManager(),
+            serviceManager,
             TestHelpers.TEST_CONTACT,
         )
 
@@ -151,7 +153,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         this.coreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         this.contactModelRepository = ModelRepositories(coreServiceManager).contacts
@@ -162,7 +165,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         this.coreServiceManagerMd = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             databaseService = databaseServiceMd,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             multiDeviceManager = TestMultiDeviceManager(
                 isMultiDeviceActive = true,
                 isMdDisabledOrSupportsFs = false,
@@ -244,10 +248,10 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         val model = contactModelRepository.getByIdentity(identity)!!
         val modelMd = contactModelRepositoryMd.getByIdentity(identity)!!
         assertEquals(model.identity, modelMd.identity)
-        assertContentEquals(model.data.value, modelMd.data.value)
+        assertContentEquals(model.data, modelMd.data)
         assertTrue { model.identity == identity }
-        assertTrue { model.data.value?.identity == identity }
-        assertContentEquals(publicKey, model.data.value?.publicKey)
+        assertTrue { model.data?.identity == identity }
+        assertContentEquals(publicKey, model.data?.publicKey)
     }
 
     private fun testCreateFromLocalOrRemote(
@@ -287,8 +291,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         val queriedModelMd = contactModelRepositoryMd.getByIdentity(contactModelData.identity)
         assertEquals(newModelMd, queriedModelMd)
 
-        assertContentEquals(contactModelData, newModel.data.value)
-        assertContentEquals(contactModelData, newModelMd.data.value)
+        assertContentEquals(contactModelData, newModel.data)
+        assertContentEquals(contactModelData, newModelMd.data)
 
         // Reset transaction count in case this test is run several times
         taskCodecMd.transactionBeginCount = 0
@@ -348,8 +352,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         val queriedModelMd = contactModelRepositoryMd.getByIdentity(contactModelData.identity)
         assertEquals(newModelMd, queriedModelMd)
 
-        assertContentEquals(contactModelData, newModel.data.value)
-        assertContentEquals(contactModelData, newModelMd.data.value)
+        assertContentEquals(contactModelData, newModel.data)
+        assertContentEquals(contactModelData, newModelMd.data)
 
         // Insert for the second time and assert that an exception is thrown
         assertFailsWith<ContactStoreException> { runBlocking { runCreation() } }
@@ -378,7 +382,7 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         assertTrue(taskCodecMd.outboundMessages.isEmpty())
 
         // Assert that the contact data has been inserted correctly
-        val addedData = contactModel.data.value!!
+        val addedData = contactModel.data!!
         assertContentEquals(contactModelData, addedData)
 
         // Reset transaction count in case this test is run several times
@@ -403,7 +407,7 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         assertTrue(taskCodecMd.outboundMessages.isEmpty())
 
         // Assert that the contact data has been inserted correctly
-        val addedData = contactModel.data.value!!
+        val addedData = contactModel.data!!
         assertContentEquals(contactModelData, addedData)
 
         // Assert that the contact data cannot be inserted again (as it already exists)
@@ -431,9 +435,9 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         val model: ch.threema.data.models.ContactModel? =
             contactModelRepository.getByIdentity(identity)
         assertNotNull(model)
-        assertEquals(null, model!!.data.value?.nickname)
+        assertEquals(null, model!!.data?.nickname)
         model.setNicknameFromSync("testnick")
-        assertEquals("testnick", model.data.value?.nickname)
+        assertEquals("testnick", model.data?.nickname)
     }
 
     private fun assertContentEquals(expected: ContactModelData?, actual: ContactModelData?) {
@@ -455,7 +459,7 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         assertEquals(expected.firstName, actual.firstName)
         assertEquals(expected.lastName, actual.lastName)
         assertEquals(expected.nickname, actual.nickname)
-        assertEquals(expected.colorIndex, actual.colorIndex)
+        assertEquals(expected.idColor, actual.idColor)
         assertEquals(expected.verificationLevel, actual.verificationLevel)
         assertEquals(expected.workVerificationLevel, actual.workVerificationLevel)
         assertEquals(expected.identityType, actual.identityType)

+ 3 - 1
app/src/androidTest/java/ch/threema/data/repositories/EditHistoryRepositoryTest.kt

@@ -53,10 +53,12 @@ class EditHistoryRepositoryTest {
         )
 
         databaseService = TestDatabaseService()
+        val serviceManager = ThreemaApplication.requireServiceManager()
         val testCoreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         editHistoryRepository = ModelRepositories(testCoreServiceManager).editHistory

+ 12 - 10
app/src/androidTest/java/ch/threema/data/repositories/EmojiReactionsRepositoryTest.kt

@@ -38,7 +38,7 @@ import ch.threema.storage.models.DistributionListMessageModel
 import ch.threema.storage.models.GroupMessageModel
 import ch.threema.storage.models.MessageModel
 import ch.threema.storage.models.MessageType
-import java.util.Date
+import java.time.Instant
 import java.util.UUID
 import kotlin.test.BeforeTest
 import kotlin.test.Test
@@ -57,11 +57,13 @@ class EmojiReactionsRepositoryTest {
 
     @BeforeTest
     fun before() {
+        val serviceManager = ThreemaApplication.requireServiceManager()
         databaseService = TestDatabaseService()
         testCoreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
 
@@ -139,7 +141,7 @@ class EmojiReactionsRepositoryTest {
         val reactions = emojiReactionsRepository.getReactionsByMessage(message)
         Assert.assertNotNull(reactions)
 
-        val reaction = reactions!!.data.value!![0]
+        val reaction = reactions!!.data!![0]
         Assert.assertEquals("⚽", reaction.emojiSequence)
 
         databaseService.messageModelFactory.delete(message)
@@ -170,9 +172,9 @@ class EmojiReactionsRepositoryTest {
         groupMessage.assertEmojiReactionSize(1)
 
         val contactReaction =
-            emojiReactionsRepository.getReactionsByMessage(contactMessage)!!.data.value!![0]
+            emojiReactionsRepository.getReactionsByMessage(contactMessage)!!.data!![0]
         val groupReaction =
-            emojiReactionsRepository.getReactionsByMessage(groupMessage)!!.data.value!![0]
+            emojiReactionsRepository.getReactionsByMessage(groupMessage)!!.data!![0]
 
         Assert.assertEquals("⚾", contactReaction.emojiSequence)
         Assert.assertEquals("⛵", groupReaction.emojiSequence)
@@ -241,14 +243,14 @@ class EmojiReactionsRepositoryTest {
             contactMessage.id,
             senderIdentity = "ABCD1234",
             emojiSequence = "⛵",
-            reactedAt = Date(),
+            reactedAt = Instant.now(),
         )
         val emojiReactionsModel = EmojiReactionsModel(
             data = listOf(emojiReactionData),
             coreServiceManager = testCoreServiceManager,
         )
         cachedEntry = testEmojiCache.getOrCreate(reactionMessageIdentifier) { emojiReactionsModel }
-        assertContentEquals(listOf(emojiReactionData), cachedEntry!!.data.value)
+        assertContentEquals(listOf(emojiReactionData), cachedEntry!!.data)
 
         // Test should read the cached value
         testEmojiCache.getOrCreate(reactionMessageIdentifier) {
@@ -258,7 +260,7 @@ class EmojiReactionsRepositoryTest {
 
         // Test removing from cache
         val removedEmojiReactionsModel = testEmojiCache.remove(reactionMessageIdentifier)
-        assertContentEquals(listOf(emojiReactionData), removedEmojiReactionsModel!!.data.value)
+        assertContentEquals(listOf(emojiReactionData), removedEmojiReactionsModel!!.data)
         assertNull(testEmojiCache.get(reactionMessageIdentifier))
     }
 
@@ -281,7 +283,7 @@ class EmojiReactionsRepositoryTest {
             messageId = contactMessageId,
             senderIdentity = "ABCD1234",
             emojiSequence = "⛵",
-            reactedAt = Date(),
+            reactedAt = Instant.now(),
         )
         val emojiReactionsModelContact = EmojiReactionsModel(
             data = listOf(emojiReactionDataForContactMessage),
@@ -293,7 +295,7 @@ class EmojiReactionsRepositoryTest {
 
         assertContentEquals(
             listOf(emojiReactionDataForContactMessage),
-            cachedEntryContact!!.data.value,
+            cachedEntryContact!!.data,
         )
         assertNull(testEmojiCache.get(reactionMessageIdentifierGroup))
 

+ 8 - 6
app/src/androidTest/java/ch/threema/data/repositories/GroupModelRepositoryTest.kt

@@ -57,7 +57,7 @@ class GroupModelRepositoryTest {
             synchronizedAt = Date(),
             lastUpdate = null,
             isArchived = false,
-            colorIndex = 0.toUByte(),
+            colorIndex = 0,
             groupDescription = "Description",
             groupDescriptionChangedAt = Date(),
             members = setOf("AAAAAAAA", "BBBBBBBB"),
@@ -75,10 +75,12 @@ class GroupModelRepositoryTest {
 
         this.databaseService = TestDatabaseService()
         this.databaseBackend = SqliteDatabaseBackend(databaseService)
+        val serviceManager = ThreemaApplication.requireServiceManager()
         this.coreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         this.groupModelRepository = ModelRepositories(coreServiceManager).groups
@@ -142,7 +144,7 @@ class GroupModelRepositoryTest {
         // This should work because the database is initially empty and the local group id starts
         // with 1.
         val fetchedGroup = groupModelRepository.getByLocalGroupDbId(1)
-        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data?.value)
+        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data)
     }
 
     @Test
@@ -155,7 +157,7 @@ class GroupModelRepositoryTest {
             groupIdentity.creatorIdentity,
             GroupId(groupIdentity.groupId),
         )
-        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data?.value)
+        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data)
     }
 
     @Test
@@ -183,7 +185,7 @@ class GroupModelRepositoryTest {
         val defaultGroup = createTestDbGroup(groupIdentity)
         testInsertAndGet(groupIdentity, defaultGroup)
 
-        val testData = groupModelRepository.getByGroupIdentity(groupIdentity)!!.data.value!!
+        val testData = groupModelRepository.getByGroupIdentity(groupIdentity)!!.data!!
         assertFailsWith<UnsupportedOperationException> {
             // Casting the set to a mutable set will work, but adding a new member to the set should
             // result in a runtime exception. Note that this is mainly in java code a problem, as
@@ -197,6 +199,6 @@ class GroupModelRepositoryTest {
         databaseBackend.createGroup(testGroup)
 
         val fetchedGroup = groupModelRepository.getByGroupIdentity(groupIdentity)
-        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data?.value)
+        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data)
     }
 }

+ 13 - 5
app/src/androidTest/java/ch/threema/storage/DatabaseNonceStoreTest.kt

@@ -27,7 +27,8 @@ import ch.threema.base.crypto.HashedNonce
 import ch.threema.base.crypto.Nonce
 import ch.threema.base.crypto.NonceScope
 import ch.threema.base.crypto.NonceStore
-import ch.threema.domain.stores.IdentityStoreInterface
+import ch.threema.domain.stores.IdentityStore
+import ch.threema.domain.types.Identity
 import javax.crypto.Mac
 import javax.crypto.spec.SecretKeySpec
 import kotlin.test.AfterTest
@@ -235,8 +236,8 @@ fun hashNonce(nonce: Nonce): HashedNonce {
 
 const val USER_IDENTITY = "01234567"
 
-private class TestIdentityStore : IdentityStoreInterface {
-    override fun getIdentity(): String = USER_IDENTITY
+private class TestIdentityStore : IdentityStore {
+    override fun getIdentity(): Identity = USER_IDENTITY
 
     override fun encryptData(
         plaintext: ByteArray,
@@ -262,9 +263,16 @@ private class TestIdentityStore : IdentityStoreInterface {
     override fun getPublicNickname(): String = throw UnsupportedOperationException()
 
     override fun storeIdentity(
-        identity: String,
+        identity: Identity,
         serverGroup: String,
-        publicKey: ByteArray,
         privateKey: ByteArray,
     ) = throw UnsupportedOperationException()
+
+    override fun setPublicNickname(publicNickname: String) {
+        throw UnsupportedOperationException()
+    }
+
+    override fun clear() {
+        throw UnsupportedOperationException()
+    }
 }

+ 13 - 14
app/src/androidTest/java/ch/threema/storage/SQLDHSessionStoreTest.java

@@ -37,13 +37,12 @@ import ch.threema.domain.fs.DHSession;
 import ch.threema.domain.fs.DHSessionId;
 import ch.threema.domain.helpers.DummyUsers;
 import ch.threema.domain.helpers.UnusedTaskCodec;
-import ch.threema.domain.protocol.csp.messages.BadMessageException;
 import ch.threema.domain.stores.DHSessionStoreException;
 import ch.threema.domain.taskmanager.TaskCodec;
 
 public class SQLDHSessionStoreTest {
 
-    private static final byte[] DATABASE_KEY = "dummyKey".getBytes(StandardCharsets.UTF_8);
+    private static final byte[] PASSWORD = "dummyKey".getBytes(StandardCharsets.UTF_8);
     private static final int NUM_RANDOM_RUNS = 20;
 
     private String tempDbFileName;
@@ -57,7 +56,7 @@ public class SQLDHSessionStoreTest {
         tempDbFileName = "threema-fs-test-" + System.currentTimeMillis() + ".db";
         store = new SQLDHSessionStore(
             ApplicationProvider.getApplicationContext(),
-            DATABASE_KEY,
+            PASSWORD,
             tempDbFileName
         );
     }
@@ -69,7 +68,7 @@ public class SQLDHSessionStoreTest {
         ApplicationProvider.getApplicationContext().deleteDatabase(tempDbFileName);
     }
 
-    public void createSessions() throws BadMessageException {
+    public void createSessions() throws Exception {
         // Alice is the initiator (= us)
         this.initiatorDHSession = new DHSession(
             DummyUsers.getContactForUser(DummyUsers.BOB),
@@ -79,7 +78,7 @@ public class SQLDHSessionStoreTest {
         // Bob gets an init message from Alice with her ephemeral public key
         this.responderDHSession = new DHSession(
             this.initiatorDHSession.getId(),
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             this.initiatorDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.ALICE),
             DummyUsers.getIdentityStoreForUser(DummyUsers.BOB)
@@ -87,7 +86,7 @@ public class SQLDHSessionStoreTest {
     }
 
     @Test
-    public void testStoreInitiatorSession() throws DHSessionStoreException, DHSession.MissingEphemeralPrivateKeyException, BadMessageException {
+    public void testStoreInitiatorSession() throws Exception {
         // Assume that we are Alice = the initiator, and Bob is the responder
         createSessions();
 
@@ -110,7 +109,7 @@ public class SQLDHSessionStoreTest {
 
         // Now Bob sends his ephemeral public key back to Alice
         this.initiatorDHSession.processAccept(
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             this.responderDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)
@@ -132,7 +131,7 @@ public class SQLDHSessionStoreTest {
     }
 
     @Test
-    public void testStoreResponderSession() throws DHSessionStoreException, BadMessageException {
+    public void testStoreResponderSession() throws Exception {
         // Assume that we are Bob = the responder
         createSessions();
 
@@ -157,7 +156,7 @@ public class SQLDHSessionStoreTest {
     }
 
     @Test
-    public void testDiscardRatchet() throws DHSessionStoreException, BadMessageException {
+    public void testDiscardRatchet() throws Exception {
         // Assume that we are Bob = the responder
         createSessions();
 
@@ -186,7 +185,7 @@ public class SQLDHSessionStoreTest {
     }
 
     @Test
-    public void testRaceCondition() throws DHSession.MissingEphemeralPrivateKeyException, DHSessionStoreException, BadMessageException {
+    public void testRaceCondition() throws Exception {
         // Repeat the test several times, as random session IDs are involved
         for (int i = 0; i < NUM_RANDOM_RUNS; i++) {
             if (i > 0) {
@@ -198,7 +197,7 @@ public class SQLDHSessionStoreTest {
     }
 
     @Test
-    public void testGetAllSessions() throws DHSessionStoreException {
+    public void testGetAllSessions() throws Exception {
         // Create sessions and its id's hashes
         List<DHSession> dhSessions = new ArrayList<>();
         for (int i = 0; i < 5; i++) {
@@ -230,7 +229,7 @@ public class SQLDHSessionStoreTest {
         MatcherAssert.assertThat(storedDHSessionIdHashes, Matchers.containsInAnyOrder(dhSessionIdHashes.toArray()));
     }
 
-    private void testRaceConditionOnce() throws DHSession.MissingEphemeralPrivateKeyException, DHSessionStoreException, BadMessageException {
+    private void testRaceConditionOnce() throws Exception, DHSessionStoreException {
         createSessions();
 
         // Alice stores the session that she initiated (still in 2DH mode)
@@ -245,7 +244,7 @@ public class SQLDHSessionStoreTest {
         // Alice gets the Init for Bob's new session first and processes it
         DHSession raceResponderDHSession = new DHSession(
             raceInitiatorDHSession.getId(),
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             raceInitiatorDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)
@@ -255,7 +254,7 @@ public class SQLDHSessionStoreTest {
 
         // Alice then processes the Accept from Bob and stores the session
         this.initiatorDHSession.processAccept(
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             this.responderDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)

+ 3 - 3
app/src/androidTest/java/ch/threema/storage/DatabaseExtensionsTest.kt → app/src/androidTest/java/ch/threema/storage/databaseupdate/DatabaseUpdateExtensionsTest.kt

@@ -4,7 +4,7 @@
  *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
  *
  * Threema for Android
- * Copyright (c) 2023-2025 Threema GmbH
+ * Copyright (c) 2025 Threema GmbH
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License, version 3,
@@ -19,7 +19,7 @@
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
  */
 
-package ch.threema.storage
+package ch.threema.storage.databaseupdate
 
 import kotlin.test.BeforeTest
 import kotlin.test.Test
@@ -27,7 +27,7 @@ import kotlin.test.assertFalse
 import kotlin.test.assertTrue
 import net.zetetic.database.sqlcipher.SQLiteDatabase
 
-class DatabaseExtensionsTest {
+class DatabaseUpdateExtensionsTest {
     private var inMemoryDatabase: SQLiteDatabase = SQLiteDatabase.create(null)
 
     @BeforeTest

+ 97 - 77
app/src/blue/res/layout/activity_enter_serial.xml

@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/top_view"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:fillViewport="true"
-    android:background="@android:color/black">
+    android:background="@android:color/black"
+    android:fillViewport="true">
 
     <FrameLayout
         android:layout_width="match_parent"
@@ -17,147 +18,166 @@
             android:layout_height="fill_parent"
             android:adjustViewBounds="true"
             android:clickable="false"
-            android:src="@drawable/background_pic"
-            android:scaleType="centerCrop" />
+            android:scaleType="centerCrop"
+            android:src="@drawable/background_pic" />
 
-        <RelativeLayout
+        <LinearLayout
             android:id="@+id/layout_parent_top"
-            android:orientation="vertical"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
-            android:paddingLeft="@dimen/wizard_contents_padding_horizontal"
-            android:paddingRight="@dimen/wizard_contents_padding_horizontal"
-            android:paddingTop="@dimen/wizard_contents_padding"
-            android:paddingBottom="@dimen/wizard_contents_padding">
-
-            <ImageView
-                android:id="@+id/enter_serial_welcome_title"
-                android:src="@drawable/logo_main_white"
-                android:layout_width="wrap_content"
-                android:layout_height="64dp"
-                android:importantForAccessibility="no"
-                android:scaleX="1.5"
-                android:scaleY="1.5"
-                android:layout_centerHorizontal="true" />
+            android:gravity="center_horizontal"
+            android:orientation="vertical"
+            android:paddingHorizontal="@dimen/wizard_contents_padding_horizontal"
+            android:paddingVertical="@dimen/wizard_contents_padding">
+
+            <androidx.constraintlayout.widget.ConstraintLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/grid_unit_x2">
+
+                <ImageView
+                    android:id="@+id/enter_serial_welcome_title"
+                    android:layout_width="0dp"
+                    android:layout_height="58dp"
+                    android:layout_marginHorizontal="@dimen/grid_unit_x5"
+                    android:adjustViewBounds="true"
+                    android:importantForAccessibility="no"
+                    android:src="@drawable/logo_main_white"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:layout_constraintWidth_percent="0.7" />
+
+            </androidx.constraintlayout.widget.ConstraintLayout>
 
             <TextView
-                style="@style/WizardMediumText"
                 android:id="@+id/layout_top"
-                android:layout_below="@id/enter_serial_welcome_title"
+                style="@style/WizardMediumText"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/grid_unit_x4"
+                android:autoLink="web"
                 android:gravity="center_horizontal"
-                android:layout_centerHorizontal="true"
                 android:linksClickable="true"
-                android:autoLink="web"
-                android:text="@string/flavored__enter_serial_body"
-                android:layout_marginBottom="5dp" />
+                android:text="@string/flavored__enter_serial_body" />
 
-            <LinearLayout
+            <androidx.constraintlayout.widget.ConstraintLayout
                 android:id="@+id/unlock_layout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="32dp"
-                android:gravity="center_vertical"
-                android:layout_below="@id/layout_top"
-                android:orientation="horizontal">
+                android:layout_marginTop="@dimen/grid_unit_x5">
 
                 <ImageView
-                    style="@style/WizardEditTextIcon"
                     android:id="@+id/unlock_logo"
-                    android:layout_width="@dimen/wizard_default_view_height"
-                    android:layout_height="@dimen/wizard_default_view_height"
+                    style="@style/WizardEditTextIcon"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    app:layout_constraintBottom_toBottomOf="@+id/license_key"
+                    app:layout_constraintDimensionRatio="1"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="@+id/license_key"
                     app:srcCompat="@drawable/ic_person_outline" />
 
                 <ch.threema.app.emojis.EmojiEditText
+                    android:id="@+id/license_key"
                     style="@style/WizardEditText"
-                    android:layout_width="fill_parent"
-                    android:layout_height="@dimen/wizard_default_view_height"
-                    android:layout_weight="2"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
                     android:hint="@string/username_hint"
-                    android:id="@+id/license_key"
-                    android:inputType="textNoSuggestions"
                     android:imeOptions="actionNext"
+                    android:inputType="textNoSuggestions"
+                    android:minHeight="48dp"
                     android:nextFocusRight="@+id/password"
-                    android:singleLine="true">
+                    android:singleLine="true"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@+id/unlock_logo"
+                    app:layout_constraintTop_toTopOf="parent">
 
                     <requestFocus />
 
                 </ch.threema.app.emojis.EmojiEditText>
 
-            </LinearLayout>
+            </androidx.constraintlayout.widget.ConstraintLayout>
 
-            <LinearLayout
+            <androidx.constraintlayout.widget.ConstraintLayout
                 android:id="@+id/password_layout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="16dp"
-                android:gravity="center_vertical"
-                android:layout_below="@id/unlock_layout"
-                android:orientation="horizontal">
+                android:layout_marginTop="@dimen/grid_unit_x2">
 
                 <ImageView
-                    style="@style/WizardEditTextIcon"
                     android:id="@+id/password_logo"
-                    android:layout_gravity="bottom"
-                    android:layout_width="@dimen/wizard_default_view_height"
-                    android:layout_height="@dimen/wizard_default_view_height"
+                    style="@style/WizardEditTextIcon"
+                    android:layout_width="0dp"
+                    android:layout_height="0dp"
+                    app:layout_constraintBottom_toBottomOf="@id/password_container"
+                    app:layout_constraintDimensionRatio="1"
+                    app:layout_constraintStart_toStartOf="parent"
+                    app:layout_constraintTop_toTopOf="@+id/password_container"
                     app:srcCompat="@drawable/ic_key_outline" />
 
                 <com.google.android.material.textfield.TextInputLayout
                     android:id="@+id/password_container"
-                    android:layout_width="match_parent"
+                    android:layout_width="0dp"
                     android:layout_height="wrap_content"
-                    app:hintAnimationEnabled="false"
+                    android:minHeight="48dp"
                     app:counterEnabled="false"
-                    app:hintEnabled="false"
-                    app:passwordToggleEnabled="true"
                     app:errorEnabled="false"
-                    app:hintTextAppearance="@style/NoHintTextAppearance">
+                    app:hintAnimationEnabled="false"
+                    app:hintEnabled="false"
+                    app:hintTextAppearance="@style/NoHintTextAppearance"
+                    app:layout_constraintBottom_toTopOf="@+id/unlock_state"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toEndOf="@+id/password_logo"
+                    app:layout_constraintTop_toTopOf="parent"
+                    app:passwordToggleEnabled="true">
 
                     <ch.threema.app.ui.ThreemaTextInputEditText
+                        android:id="@+id/password"
                         style="@style/WizardEditText"
                         android:layout_width="match_parent"
-                        android:layout_height="@dimen/wizard_default_view_height"
+                        android:layout_height="wrap_content"
                         android:hint="@string/password_hint"
-                        android:id="@+id/password"
-                        android:inputType="textNoSuggestions|textPassword"
                         android:imeOptions="actionDone"
+                        android:inputType="textNoSuggestions|textPassword"
+                        android:minHeight="48dp"
                         android:singleLine="true" />
 
                 </com.google.android.material.textfield.TextInputLayout>
 
-            </LinearLayout>
+                <TextView
+                    android:id="@+id/unlock_state"
+                    android:layout_width="0dp"
+                    android:layout_height="wrap_content"
+                    android:layout_marginVertical="@dimen/grid_unit_x1"
+                    android:textColor="@color/material_red"
+                    android:textSize="@dimen/wizard_text_medium"
+                    app:layout_constraintBottom_toBottomOf="parent"
+                    app:layout_constraintEnd_toEndOf="parent"
+                    app:layout_constraintStart_toStartOf="@+id/password_container"
+                    tools:text="@string/invalid_input" />
 
-            <TextView
-                android:id="@+id/unlock_state"
-                android:layout_width="fill_parent"
-                android:layout_height="wrap_content"
-                android:layout_below="@id/password_layout"
-                android:layout_marginLeft="@dimen/wizard_default_view_height"
-                android:layout_marginTop="8dp"
-                android:layout_marginBottom="8dp"
-                android:textSize="@dimen/wizard_text_medium"
-                android:textColor="@color/material_red" />
+            </androidx.constraintlayout.widget.ConstraintLayout>
 
             <ch.threema.app.activities.wizard.components.WizardButtonXml
                 android:id="@+id/unlock_button_work_compose"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_alignParentRight="true"
-                android:layout_below="@id/unlock_state"
-                app:wizardButton_text="@string/next"/>
+                android:layout_gravity="end"
+                app:wizardButton_text="@string/next" />
 
             <TextView
-                style="@style/WizardMediumText"
                 android:id="@+id/work_lost_credential_help"
-                android:layout_width="fill_parent"
+                style="@style/WizardMediumText"
+                android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_below="@id/unlock_button_work_compose"
+                android:layout_marginTop="@dimen/grid_unit_x4"
                 android:gravity="center_horizontal"
-                android:layout_marginTop="32dp" />
+                tools:text="@string/work_lost_credentials_help" />
 
-        </RelativeLayout>
+        </LinearLayout>
 
     </FrameLayout>
 

Unele fișiere nu au fost afișate deoarece prea multe fișiere au fost modificate în acest diff