浏览代码

Version 6.2.0-1095

Threema 3 周之前
父节点
当前提交
0437b0468a
共有 100 个文件被更改,包括 7392 次插入6998 次删除
  1. 1 0
      .gitignore
  2. 31 38
      README.md
  3. 二进制
      app/assets/emojis/activity-0.png
  4. 二进制
      app/assets/emojis/flags-0.png
  5. 二进制
      app/assets/emojis/flags-1.png
  6. 二进制
      app/assets/emojis/food-0.png
  7. 二进制
      app/assets/emojis/nature-0.png
  8. 二进制
      app/assets/emojis/objects-0.png
  9. 二进制
      app/assets/emojis/people-0.png
  10. 二进制
      app/assets/emojis/people-1.png
  11. 二进制
      app/assets/emojis/people-10.png
  12. 二进制
      app/assets/emojis/people-2.png
  13. 二进制
      app/assets/emojis/people-3.png
  14. 二进制
      app/assets/emojis/people-4.png
  15. 二进制
      app/assets/emojis/people-5.png
  16. 二进制
      app/assets/emojis/people-6.png
  17. 二进制
      app/assets/emojis/people-7.png
  18. 二进制
      app/assets/emojis/people-8.png
  19. 二进制
      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. 二进制
      app/assets/emojis/smileys-0.png
  42. 二进制
      app/assets/emojis/smileys-1.png
  43. 二进制
      app/assets/emojis/symbols-0.png
  44. 二进制
      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. 二进制
      app/libs/arm64-v8a/libjnidispatch.so
  57. 1 1
      app/libs/armeabi-v7a/README.txt
  58. 二进制
      app/libs/armeabi-v7a/libjnidispatch.so
  59. 1 1
      app/libs/x86/README.txt
  60. 二进制
      app/libs/x86/libjnidispatch.so
  61. 1 1
      app/libs/x86_64/README.txt
  62. 二进制
      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/
 .cxx/
 **/.DS_Store
 **/.DS_Store
 .kotlin
 .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">
 <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>
 </div>
 
 
 # Threema for Android
 # Threema for Android
@@ -9,7 +15,6 @@
 This repository contains the complete source code of
 This repository contains the complete source code of
 [Threema](https://threema.com/) for Android.
 [Threema](https://threema.com/) for Android.
 
 
-
 ## Table of Contents
 ## Table of Contents
 
 
 - [Bug Reports / Feature Requests / Security Issues](#issues)
 - [Bug Reports / Feature Requests / Security Issues](#issues)
@@ -24,7 +29,6 @@ This repository contains the complete source code of
 - [Translating](#translating)
 - [Translating](#translating)
 - [License](#license)
 - [License](#license)
 
 
-
 ## <a name="issues"></a>Bug Reports / Feature Requests / Security Issues
 ## <a name="issues"></a>Bug Reports / Feature Requests / Security Issues
 
 
 To report bugs and request new features, please contact the Threema support
 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
 details, see [threema.com/contact](https://threema.com/en/contact) (section
 “Security”).
 “Security”).
 
 
-
 ## <a name="release-policy"></a>Source Code Release Policy
 ## <a name="release-policy"></a>Source Code Release Policy
 
 
 This source code repository will be updated for every public non-beta release.
 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
 Commits are signed using PGP. See [SECURITY.md](SECURITY.md) for more
 information.
 information.
 
 
-
 ## <a name="license-checks"></a>License Checks
 ## <a name="license-checks"></a>License Checks
 
 
 While the source code for Threema for Android is published under an open source
 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
 new Threema IDs if the random Device ID has been put on an “allow list” by a
 Threema employee.
 Threema employee.
 
 
-
 ## <a name="build-variants"></a>Build Variants
 ## <a name="build-variants"></a>Build Variants
 
 
 **Private**
 **Private**
@@ -111,48 +112,46 @@ Threema employee.
 There are currently the following product flavors relevant for the private
 There are currently the following product flavors relevant for the private
 version of Threema:
 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`
 For local testing, we recommend building the `store_google` or `store_threema`
 build variants.
 build variants.
 
 
 ¹ The main difference between `store_threema` and `libre` is that the former
 ¹ 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**
 **Threema Work / OnPrem**
 
 
 Additionally, these build variants are only relevant for Threema Work or
 Additionally, these build variants are only relevant for Threema Work or
 Threema OnPrem customers:
 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**
 **Internal Development**
 
 
 The following variants are only used for development and testing within Threema:
 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
 ¹ *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
 ## <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/).
 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.
 To build and deploy it to a device, click the green “Play” icon.
 
 
-
 ## <a name="testing"></a>Testing
 ## <a name="testing"></a>Testing
 
 
 ### Via Command Line
 ### Via Command Line
@@ -220,14 +218,12 @@ emulator.
 
 
 You can also run tests through Android Studio.
 You can also run tests through Android Studio.
 
 
-
 ## <a name="reproducible-builds"></a>Reproducible Builds
 ## <a name="reproducible-builds"></a>Reproducible Builds
 
 
 Instructions on how to reproduce the build process used to publish the official
 Instructions on how to reproduce the build process used to publish the official
 Threema app can be found at
 Threema app can be found at
 [threema.com/open-source/reproducible-builds/](https://threema.com/open-source/reproducible-builds/).
 [threema.com/open-source/reproducible-builds/](https://threema.com/open-source/reproducible-builds/).
 
 
-
 ## <a name="architecture"></a>Code Organization / Architecture
 ## <a name="architecture"></a>Code Organization / Architecture
 
 
 Before digging into the codebase, you should read the [Cryptography
 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 code not specific to Threema is located in the
 `common/src/main/java/ch/threema/` directory.
 `common/src/main/java/ch/threema/` directory.
 
 
-
 ## <a name="contributions"></a>Contributions
 ## <a name="contributions"></a>Contributions
 
 
 We accept GitHub pull requests. Please refer to
 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
 Note that translation fixes should not be contributed through GitHub but
 on Crowdin, see next section.
 on Crowdin, see next section.
 
 
-
 ## <a name="translating"></a>Translating
 ## <a name="translating"></a>Translating
 
 
 We manage our app translations on Crowdin. If you’re interested in
 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
 improving translations, or if you would like to translate Threema to a new
 language, please contact us at `support at threema dot ch`.
 language, please contact us at `support at threema dot ch`.
 
 
-
 ## <a name="license"></a>License
 ## <a name="license"></a>License
 
 
 Threema for Android is licensed under the GNU Affero General Public License v3.
 Threema for Android is licensed under the GNU Affero General Public License v3.

二进制
app/assets/emojis/activity-0.png


二进制
app/assets/emojis/flags-0.png


二进制
app/assets/emojis/flags-1.png


二进制
app/assets/emojis/food-0.png


二进制
app/assets/emojis/nature-0.png


二进制
app/assets/emojis/objects-0.png


二进制
app/assets/emojis/people-0.png


二进制
app/assets/emojis/people-1.png


二进制
app/assets/emojis/people-10.png


二进制
app/assets/emojis/people-2.png


二进制
app/assets/emojis/people-3.png


二进制
app/assets/emojis/people-4.png


二进制
app/assets/emojis/people-5.png


二进制
app/assets/emojis/people-6.png


二进制
app/assets/emojis/people-7.png


二进制
app/assets/emojis/people-8.png


二进制
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|лічбы|увод лічбаў
 🔢|1234|лічбы|увод лічбаў
 🔣|сімвалы|увод сімвалаў
 🔣|сімвалы|увод сімвалаў
 🔤|алфавіт|лацінскі|літары|увод лацінскіх літар
 🔤|алфавіт|лацінскі|літары|увод лацінскіх літар
-🅰️|a|група|другая|значок «група крыві a»|кроў
+🅰️|кнопка|кроў|тып
 🆎|ab (група крыві)|група|кроў|чацвёртая
 🆎|ab (група крыві)|група|кроў|чацвёртая
 🅱️|b|група|значок «група крыві b»|кроў|трэцяя
 🅱️|b|група|значок «група крыві b»|кроў|трэцяя
 🆑|ачыстка|кнопка «ачысціць»
 🆑|ачыстка|кнопка «ачысціць»
 🆒|слова «файна» ў квадраце|файна
 🆒|слова «файна» ў квадраце|файна
 🆓|бясплатна|слова «бясплатна» ў квадраце
 🆓|бясплатна|слова «бясплатна» ў квадраце
 🆔|асоба|ідэнтыфікацыя|ідэнтычнасць|пасведчанне|слова «пасведчанне» ў квадраце
 🆔|асоба|ідэнтыфікацыя|ідэнтычнасць|пасведчанне|слова «пасведчанне» ў квадраце
-Ⓜ️|m|кола|круг|літара «m» у коле
+Ⓜ️|m|круг|у коле
 🆕|новы|слова «новы» ў квадраце
 🆕|новы|слова «новы» ў квадраце
 🆖|блага|дрэнна|нічога добрага|скарачэнне «нічога добрага» ў квадраце
 🆖|блага|дрэнна|нічога добрага|скарачэнне «нічога добрага» ў квадраце
 🅾️|0|група|значок «група крыві 0»|кроў|першая
 🅾️|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
 😪|cansada|cansat|cara de son|dormint|dormir|plorant|son|trista
 🤤|bava|bavejant|cara que baveja
 🤤|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
 😴|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 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
 🤒|cara amb termòmetre|malalta|malaltia|termòmetre
 🤕|ai|bena|cap embenat|cara amb el cap embenat|ferida|ferit|lesió
 🤕|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|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
 🫸|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à
 👌|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
 🤏|dits|mà que pessiga|petit|quantitat petita|una mica
 ✌️|mà|pau|senyal de la victòria|victòria
 ✌️|mà|pau|senyal de la victòria|victòria
 🤞|creuar|creuats|dits|mà|sort
 🤞|creuar|creuats|dits|mà|sort
@@ -281,7 +282,7 @@
 👂|cos|escoltar|oïda|orella|orelles|sentir|so
 👂|cos|escoltar|oïda|orella|orelles|sentir|so
 🦻|accessibilitat|orella amb audiòfon|problema d’audició
 🦻|accessibilitat|orella amb audiòfon|problema d’audició
 👃|cos|nassos|olors|pudor|tafanera
 👃|cos|nassos|olors|pudor|tafanera
-🧠|cervell|intel·ligent
+🧠|cervell|coneixement|intel·ligent|llest|saviesa
 🫀|anatomia|batec|cardiologia|cor real|òrgan|pols|vermell
 🫀|anatomia|batec|cardiologia|cor real|òrgan|pols|vermell
 🫁|exhalació|inhalació|òrgan|pulmó|pulmons|respiració|respirar
 🫁|exhalació|inhalació|òrgan|pulmó|pulmons|respiració|respirar
 🦷|blanc|dentista|dents|perlí|perlina
 🦷|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
 ⛹️|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
 ⛹️‍♂️|home amb una pilota|masculí|pilota
 ⛹️‍♀️|dona amb una pilota|femení|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|esport|persona amb bicicleta|persona en bicicleta|persona pedalejant
 🚴‍♂️|bicicleta|ciclisme|ciclista|home|masculí
 🚴‍♂️|bicicleta|ciclisme|ciclista|home|masculí
 🚴‍♀️|anar amb bicicleta|bicicleta|ciclisme|ciclista|dona amb bicicleta|femení
 🚴‍♀️|anar amb bicicleta|bicicleta|ciclisme|ciclista|dona amb bicicleta|femení
@@ -554,6 +555,7 @@
 🧑‍🧒|adult|família|infant
 🧑‍🧒|adult|família|infant
 🧑‍🧒‍🧒|adult|família|infant
 🧑‍🧒‍🧒|adult|família|infant
 👣|caminar|cos|descalça|empremta|petjades|roba|vestit
 👣|caminar|cos|descalça|empremta|petjades|roba|vestit
+🫆|empremta dactilar|empremta digital|forense|identitat|seguretat
 🐵|animal|cara de mona|curiosa|mona
 🐵|animal|cara de mona|curiosa|mona
 🐒|animal|mico|mona
 🐒|animal|mico|mona
 🦍|animal|goril·la|simi
 🦍|animal|goril·la|simi
@@ -592,7 +594,7 @@
 🐏|animals|àries|banyes|mardà|marrà|ovella|zodíac|zoo
 🐏|animals|àries|banyes|mardà|marrà|ovella|zodíac|zoo
 🐑|animal|bel|femella|granja|llana|ovella|pècora|xai
 🐑|animal|bel|femella|granja|llana|ovella|pècora|xai
 🐐|animals|cabra|capricorn|granja|llet|zodíac
 🐐|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
 🐫|animal|camell amb dues gepes|camell bactrià|dues gepes|gepa|gepes
 🦙|alpaca|animal|guanac|llama|llana|vicunya
 🦙|alpaca|animal|guanac|llama|llana|vicunya
 🦒|girafa|taques
 🦒|girafa|taques
@@ -660,9 +662,14 @@
 🐡|animal|globus|peix
 🐡|animal|globus|peix
 🦈|animal|peix|tauró
 🦈|animal|peix|tauró
 🐙|animal|criatura|mar|oceà|pop
 🐙|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à
 🪸|canvi climàtic|corall|escullera|mar|oceà
 🪼|animal|aquari|coïssor|cremada|dolor|invertebrat|marí|medusa|oceà|picada|plàncton|tentacles
 🪼|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|caragol|cargol|jardí|llimac|natura
 🦋|animal|bonica|insecte|papallona
 🦋|animal|bonica|insecte|papallona
 🐛|animal|bestiola|eruga|insecte|jardí
 🐛|animal|bestiola|eruga|insecte|jardí
@@ -706,9 +713,10 @@
 🪹|branca|covar|llar|niu buit
 🪹|branca|covar|llar|niu buit
 🪺|covar|niu amb ous|ocell|ous
 🪺|covar|niu amb ous|ocell|ous
 🍄|bolet verinós|fong|mario|planta
 🍄|bolet verinós|fong|mario|planta
+🪾|caiguda de la fulla|fulla caduca|hivern|sequera
 🍇|dionís|dionisi|fruita|planta|raïm
 🍇|dionís|dionisi|fruita|planta|raïm
 🍈|cantalup|fruita|meló|planta
 🍈|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
 🍊|cítric|fruita|mandarina|nectarina|planta|taronja|vitamina c
 🍋|àcida|cítric|fruita|llimona|planta
 🍋|àcida|cítric|fruita|llimona|planta
 🍋‍🟩|àcid|aliment|cítric|fruita|llima|menjar|planta|refrescant|tropical|verd
 🍋‍🟩|à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
 🫚|arrel de gingebre|beguda|espècia|gingebre|gínger|herba|natural|salut
 🫛|beina de pèsol|edamame|fesol|llegum|mongeta|pèsol|soja|verdura
 🫛|beina de pèsol|edamame|fesol|llegum|mongeta|pèsol|soja|verdura
 🍄‍🟫|aliment|bolet marró|fong|menjar|natura|vegetal|vegetarià|xampinyó
 🍄‍🟫|aliment|bolet marró|fong|menjar|natura|vegetal|vegetarià|xampinyó
+🫜|arrel|hort|rave|remolatxa|verdura
 🍞|blat|gra|llesca|menjar|pa|restaurant|torrada
 🍞|blat|gra|llesca|menjar|pa|restaurant|torrada
 🥐|brioixeria|croissant|francès|menjar|pa
 🥐|brioixeria|croissant|francès|menjar|pa
 🥖|baguet|barra|menjar|pa
 🥖|baguet|barra|menjar|pa
@@ -795,11 +804,6 @@
 🥟|cresta japonesa|cresta xinesa|empanada|gyōza|jiaozi|pierogui
 🥟|cresta japonesa|cresta xinesa|empanada|gyōza|jiaozi|pierogui
 🥠|fortuna|futur|galeta de la sort|profecia|sort
 🥠|fortuna|futur|galeta de la sort|profecia|sort
 🥡|bastonets|emportar|envàs|menjar a domicili|menjar per emportar|menjar xinès|paper
 🥡|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 de màquina|màquina|menjar|postres|restaurant
 🍧|dolç|gelat|granissat|picat|postres
 🍧|dolç|gelat|granissat|picat|postres
 🍨|crema|dolç|gelat|menjar|postres|restaurant
 🍨|crema|dolç|gelat|menjar|postres|restaurant
@@ -945,7 +949,7 @@
 🛹|monopatí|patí|patinadora|rodes
 🛹|monopatí|patí|patinadora|rodes
 🛼|esport|patí de rodes|rodes
 🛼|esport|patí de rodes|rodes
 🚏|autobús|bus|parada d’autobús|parada de bus
 🚏|autobús|bus|parada d’autobús|parada de bus
-🛣️|autopista|autovia|carretera
+🛣️|autopista|autovia|carretera|via ràpida
 🛤️|ferrocarril|tren|via de tren
 🛤️|ferrocarril|tren|via de tren
 🛢️|barril de petroli|bidó de petroli|petroli
 🛢️|barril de petroli|bidó de petroli|petroli
 ⛽|assortidor de gasolina|benzina|benzinera|combustible|gasolina
 ⛽|assortidor de gasolina|benzina|benzinera|combustible|gasolina
@@ -1068,7 +1072,7 @@
 🎗️|celebració|cinta|commemorar|llaç commemoratiu
 🎗️|celebració|cinta|commemorar|llaç commemoratiu
 🎟️|accés|admissió|bitllet d’entrada|bitllets d’entrada|entrada
 🎟️|accés|admissió|bitllet d’entrada|bitllets d’entrada|entrada
 🎫|admissió|entrada|resguard|tiquet
 🎫|admissió|entrada|resguard|tiquet
-🎖️|celebració|medalla|militar|premi
+🎖️|celebració|condecoració|condecorar|medalla|militar|premi
 🏆|campió|campiona|esport|guanyar|premi|trofeu|victòria
 🏆|campió|campiona|esport|guanyar|premi|trofeu|victòria
 🏅|esport|guanyadora|medalla|or|premi
 🏅|esport|guanyadora|medalla|or|premi
 🥇|medalla d’or|or|posició|primer
 🥇|medalla d’or|or|posició|primer
@@ -1097,7 +1101,7 @@
 ⛸️|gel|patí|patinar sobre gel|patinatge sobre gel|patins
 ⛸️|gel|patí|patinar sobre gel|patinatge sobre gel|patins
 🎣|canya de pescar|entreteniment|esport|peix|pescar
 🎣|canya de pescar|entreteniment|esport|peix|pescar
 🤿|busseig|immersió lleugera|submarinisme amb tub|ulleres de busseig
 🤿|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
 🎿|esport|esquiar|esquís|neu
 🛷|lliscar|neu|trineu
 🛷|lliscar|neu|trineu
 🥌|esport|gel|joc|pedra de cúrling
 🥌|esport|gel|joc|pedra de cúrling
@@ -1204,6 +1208,7 @@
 🪘|conga|instrument|percussió|ritme|timbal
 🪘|conga|instrument|percussió|ritme|timbal
 🪇|ball|diversió|festa|instrument|maraques|música|percussió|ritme|sacsejar|sonall
 🪇|ball|diversió|festa|instrument|maraques|música|percussió|ritme|sacsejar|sonall
 🪈|flauta dolça|flautista|instrument de vent de fusta|música|orquestra|vent
 🪈|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ó|mòbil|telèfon
 📲|comunicació|fletxa|mòbil|rebre|telèfon mòbil amb fletxa|trucar
 📲|comunicació|fletxa|mòbil|rebre|telèfon mòbil amb fletxa|trucar
 ☎️|telèfon
 ☎️|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 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
 📉|a la baixa|cap avall|dades|descendent|disminució|gràfic de disminució|negatiu|tendència
 📊|barres|dades|gràfic de barres
 📊|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
 📌|agulla|collage|xinxeta
 📍|mapa|rodona|ubicació|xinxeta
 📍|mapa|rodona|ubicació|xinxeta
 📎|clip
 📎|clip
@@ -1334,6 +1339,7 @@
 🧰|caixa d’eines|caixa vermella|eines|mecànic
 🧰|caixa d’eines|caixa vermella|eines|mecànic
 🧲|atracció|ferradura|forma d’u|imant|magnètic|positiu negatiu
 🧲|atracció|ferradura|forma d’u|imant|magnètic|positiu negatiu
 🪜|escala de mà|esglaó|graó|pujar
 🪜|escala de mà|esglaó|graó|pujar
+🪏|cavar|forat|pala
 🧪|ciència|experiment|laboratori|química|tub d’assaig
 🧪|ciència|experiment|laboratori|química|tub d’assaig
 🧫|bacteri|biòleg|biòloga|biologia|cultiu|laboratori|placa de cultiu|placa de petri
 🧫|bacteri|biòleg|biòloga|biologia|cultiu|laboratori|placa de cultiu|placa de petri
 🧬|adn|biòleg|biòloga|evolució|genètica|vida
 🧬|adn|biòleg|biòloga|evolució|genètica|vida
@@ -1477,6 +1483,7 @@
 ➰|bucle|llaç arrissat
 ➰|bucle|llaç arrissat
 ➿|bucle|doble|enrotllat|llaç
 ➿|bucle|doble|enrotllat|llaç
 〽️|alternança|marca d’alternança de la part|part|signe d’alternança
 〽️|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 majúscules|llatines|lletres|majúscules
 🔡|abcd|botó de lletres llatines en minúscules|entrada|llatines|lletres|minú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
 🔢|1234|botó de números|dígits|entrada|números per introduir|xifres
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbàbue
 🇿🇼|zimbàbue
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|anglaterra
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|anglaterra
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|escòcia
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|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
 😪|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
 🤤|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
 😴|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ř
 😷|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
 🤒|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ý
 🤕|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ě|rodina: dospělý, dítě, 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
 👣|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|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
 🐒|banán|džungle|opice|opička|zvíře
 🦍|gorila|hlava|opice|prales|primát|příroda|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
 🐚|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
 🪸|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
 🪼|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
 🐌|hlemýžď|příroda|slimák|šneček|šnek|ulita|zahrada|zvíře
 🦋|hmyz|krásný|modrásek|modrý motýl|motýl|zvíře
 🦋|hmyz|krásný|modrásek|modrý motýl|motýl|zvíře
 🐛|brouk|hmyz|housenka|příroda|stonožka|zahrada|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í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
 🪺|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
 🍄|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
 🍇|č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
 🍈|ananasový meloun|cukrový meloun|jídlo|meloun|ovoce|rostlina|žlutý meloun
 🍉|červený|jídlo|meloun|ovoce|rostlina|vodní
 🍉|červený|jídlo|meloun|ovoce|rostlina|vodní
@@ -744,6 +752,7 @@
 🫚|čaj|koření|pivo|zázvor
 🫚|čaj|koření|pivo|zázvor
 🫛|edamame|hrách|hrachový lusk|hrášek|kulička|lusk|luštěniny|sója|zelenina
 🫛|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
 🍄‍🟫|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
 🍞|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
 🥐|croissant|francouzské|francouzský|jídlo|kroasant|loupáček|loupák|pečivo|rohlík
 🥖|bageta|francouzské|jídlo|pečivo|veka
 🥖|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
 🥟|čí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
 🥠|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
 🥡|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|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|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ý
 🍨|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
 🪘|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
 🪇|chrastítko|hudba|maracas|nástroj|perkuse|rumbakoule
 🪈|dechový nástroj|flétna|hudba|pikola|píšťala|zobcová flétna
 🪈|dechový nástroj|flétna|hudba|pikola|píšťala|zobcová flétna
+🪉|amor|harfa|hudba|láska|nástroj|orchestr
 📱|komunikace|mobilní|smartphone|telefon
 📱|komunikace|mobilní|smartphone|telefon
 📲|hovor|komunikace|mobil se šipkou|mobilní|příjem|přijmout|šipka|telefon|volání
 📲|hovor|komunikace|mobil se šipkou|mobilní|příjem|přijmout|šipka|telefon|volání
 ☎️|červená|číselník|sluchátko|telefonovat|volat
 ☎️|č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
 🧰|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ý
 🧲|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
 🪜|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
 🧪|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
 🧫|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
 🧬|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ý
 ➰|kadeř|kudrna|lokna|smyčka|spirálka|zatočený
 ➿|dvojitá|dvojitý|kadeř|kudrlinka|kudrna|smyčka|spirálka
 ➿|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
 〽️|čá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|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
 🔡|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
 🔢|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|gute|müde|nacht|schläfrig|smiley|traurig
 🤤|gesicht|sabbern|smiley
 🤤|gesicht|sabbern|smiley
 😴|dösen|einschlafen|gähnen|gesicht|gute nacht|langweilig|mittagsschlaf|müde|nickerchen|schlafen|smiley|zzz
 😴|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
 😷|arzt|atemschutzmaske|bazillen|erkältet|gesicht|krankheit|mundschutz|schutzmaske|smiley|viren|virus
 🤒|fieber|gesicht|krank|messen|smiley|thermometer
 🤒|fieber|gesicht|krank|messen|smiley|thermometer
 🤕|aua|autsch|gesicht|kopf|schmerzen|smiley|verband|verletzung
 🤕|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
 🫄|aufgebläht|bauch|dicker bauch|person|schwangere person|schwangerschaft|überfressen|zu viel gegessen
 🤱|baby|brust|frau|person|stillen
 🤱|baby|brust|frau|person|stillen
 👩‍🍼|baby|eltern|flasche gebende frau|frau|füttern|mama|milch|mutter|neugeborenes|person|säugling|weiblich
 👩‍🍼|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
 👼|engel|gesicht|kind|märchen|putte
 🎅|weihnachten|weihnachtsmann|samichlaus
 🎅|weihnachten|weihnachtsmann|samichlaus
 🤶|weihnachten|weihnachtsfrau
 🤶|weihnachten|weihnachtsfrau
@@ -453,7 +454,7 @@
 🧌|fantasy|gruslig|kobold|märchen|monster|ork|troll|ungeheuer
 🧌|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
 💆|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
 💆‍♂️|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)
 💇|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
 💇‍♂️|friseur|frisur|haarschnitt|mann beim haareschneiden|salon|schere|coiffeur|männlich
 💇‍♀️|frau beim haareschneiden|friseur|haarschnitt|schere|coiffeur|weiblich
 💇‍♀️|frau beim haareschneiden|friseur|haarschnitt|schere|coiffeur|weiblich
@@ -478,11 +479,11 @@
 🏃|eilig|joggen|laufende person|läuferin|marathon|person|rennen|schnell|sport
 🏃|eilig|joggen|laufende person|läuferin|marathon|person|rennen|schnell|sport
 🏃‍♂️|joggen|jogger|laufender mann|marathon|rennen|männlich
 🏃‍♂️|joggen|jogger|laufender mann|marathon|rennen|männlich
 🏃‍♀️|athletin|frau|joggen|joggerin|laufende frau|läuferin|marathon|rennen|rennerin|rennt|schell|weiblich
 🏃‍♀️|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
 🕴️|anzug|geschäftlich|mann|schwebender mann im anzug|männlich
 👯|bunnys|doppelt|hasenohren|leute|party|personen mit hasenohren|seelenverwandt|tanzen|tänzerinnen|zwillinge
 👯|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
 👯‍♀️|bunnys|frauen mit hasenohren|hasenohren|party|weiblich
 🧖|abschalten|dampfbad|dampfsauna|entspannen|frau|luxuriös|person in dampfsauna|relaxen|sauna|spa
 🧖|abschalten|dampfbad|dampfsauna|entspannen|frau|luxuriös|person in dampfsauna|relaxen|sauna|spa
 🧖‍♂️|dampfsauna|mann in dampfsauna|sauna|männlich
 🧖‍♂️|dampfsauna|mann in dampfsauna|sauna|männlich
@@ -549,11 +550,12 @@
 👥|büsten|personen|silhouette mehrerer büsten
 👥|büsten|personen|silhouette mehrerer büsten
 🫂|abschied|danke|drücken|drücker|freundschaft|hallo|liebe|sich umarmende personen|tschüss|umarmung
 🫂|abschied|danke|drücken|drücker|freundschaft|hallo|liebe|sich umarmende personen|tschüss|umarmung
 👪|familie|junge|kind|mutter|vater
 👪|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
 👣|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
 🐵|affengesicht|banane|dschungel|gesicht|tier|zoo
 🐒|affe|tier
 🐒|affe|tier
 🦍|affe|gesicht|gorilla|tier
 🦍|affe|gesicht|gorilla|tier
@@ -649,7 +651,7 @@
 🐍|schlangenträger|sternzeichen|tierkreis
 🐍|schlangenträger|sternzeichen|tierkreis
 🐲|drachengesicht|gesicht|märchen|tier
 🐲|drachengesicht|gesicht|märchen|tier
 🐉|chinesisch neujahr|drache|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
 🦖|dinosaurier|saurier|t-rex|tree|tyrannosaurus rex
 🐳|blasender wal|meer|ozean|tier|wal
 🐳|blasender wal|meer|ozean|tier|wal
 🐋|ozean|tier|wal
 🐋|ozean|tier|wal
@@ -663,6 +665,11 @@
 🐚|muschel|schneckenhaus|strand|tier
 🐚|muschel|schneckenhaus|strand|tier
 🪸|great barrier reef|klimawandel|korallenriff|meer|ozean|riff|tier
 🪸|great barrier reef|klimawandel|korallenriff|meer|ozean|riff|tier
 🪼|autsch|brennen|gallert|glibber|meeresbewohner|meerestier|nesseltier|ozean|qualle|tentakeln
 🪼|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
 🐌|langsam|schnecke|tier
 🦋|insekt|schmetterling|schön
 🦋|insekt|schmetterling|schön
 🐛|gefräßig|insekt|raupe|tier|gefrässig
 🐛|gefräßig|insekt|raupe|tier|gefrässig
@@ -706,6 +713,7 @@
 🪹|heim|leeres nest|nestbau|nisten|vogelnest|zuhause
 🪹|heim|leeres nest|nestbau|nisten|vogelnest|zuhause
 🪺|heim|nest mit blauen eiern|nest mit eiern|nestbau|nisten|vogelnest|zuhause
 🪺|heim|nest mit blauen eiern|nest mit eiern|nestbau|nisten|vogelnest|zuhause
 🍄|fliegenpilz|giftig|pilz
 🍄|fliegenpilz|giftig|pilz
+🪾|kahler baum|karg|trocken|winter|baum ohne blätter|blätterlos|dürre|herbst
 🍇|frucht|obst|trauben|wein
 🍇|frucht|obst|trauben|wein
 🍈|cantaloupe|frucht|honigmelone|melone|obst
 🍈|cantaloupe|frucht|honigmelone|melone|obst
 🍉|frucht|melone|obst|wassermelone
 🍉|frucht|melone|obst|wassermelone
@@ -744,6 +752,7 @@
 🫚|gesund|gewürz|ginger ale|ingwerbier|scharf|wurzel|würzig|ginger beer|ingwerwurzel
 🫚|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
 🫛|bohne|edamame|erbsenschote|essen|gemüse|hülsenfrucht|hülsenfrüchte|schote
 🍄‍🟫|braun|essen|fungus|gemüse|lebensmittel|natur|pflanze|pilz|wald
 🍄‍🟫|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
 🍞|brotlaib|essen|kohlenhydrate|laib brot|toast|weißbrot|weizen|weissbrot
 🥐|corissant|croissant|französisch|frühstückshörnchen|brot
 🥐|corissant|croissant|französisch|frühstückshörnchen|brot
 🥖|baguette|brot|französisch|frühstück
 🥖|baguette|brot|französisch|frühstück
@@ -795,11 +804,6 @@
 🥟|chinesische teigtasche|dumpling|empanada|essen|gyōza|jiaozi|kloß|pierogi|potsticker|teigtasche|kloss
 🥟|chinesische teigtasche|dumpling|empanada|essen|gyōza|jiaozi|kloß|pierogi|potsticker|teigtasche|kloss
 🥠|essen|glückskeks|prophezeiung
 🥠|essen|glückskeks|prophezeiung
 🥡|chinesisches essen|essen|stäbchen|takeaway-box|takeaway-schachtel
 🥡|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|softeis
 🍧|eis|sorbet|wassereis|zerstoßen|zerstossen
 🍧|eis|sorbet|wassereis|zerstoßen|zerstossen
 🍨|eisbecher|eiscreme|eisdiele
 🍨|eisbecher|eiscreme|eisdiele
@@ -1204,6 +1208,7 @@
 🪘|afrikanische trommel|conga|handtrommel|instrument|musikinstrument|rhythmus|trommeln
 🪘|afrikanische trommel|conga|handtrommel|instrument|musikinstrument|rhythmus|trommeln
 🪇|cha-cha-cha|instrument|maracas|musikinstrument|musizieren|party|percussion|rasseln|tanzen|schütteln|trommel
 🪇|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
 🪈|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
 📱|handy|iphone|mobiltelefon|smartphone|telefonieren
 📲|anrufen|handy|iphone|kommunikation|mobiltelefon mit pfeil|pfeil|whatsapp
 📲|anrufen|handy|iphone|kommunikation|mobiltelefon mit pfeil|pfeil|whatsapp
 ☎️|anrufen|festnetz|telefon
 ☎️|anrufen|festnetz|telefon
@@ -1334,6 +1339,7 @@
 🧰|box|handkasten|kasten|kiste|mechaniker|rote kiste|werkzeugkasten|werkzeugkiste|werkzeugkoffer
 🧰|box|handkasten|kasten|kiste|mechaniker|rote kiste|werkzeugkasten|werkzeugkiste|werkzeugkoffer
 🧲|anziehungskraft|hufeisen|magnetisch|pole|positiv negativ|u-form
 🧲|anziehungskraft|hufeisen|magnetisch|pole|positiv negativ|u-form
 🪜|hochsteigen|holzleiter|klettern|leiter|sprosse|stufe
 🪜|hochsteigen|holzleiter|klettern|leiter|sprosse|stufe
+🪏|graben|loch|schippe|spaten|ausgraben|schaufeln|vergraben
 🧪|chemie|chemikalie|chemiker|experiment|labor|reagenzglas|substanz|versuche|wissenschaft
 🧪|chemie|chemikalie|chemiker|experiment|labor|reagenzglas|substanz|versuche|wissenschaft
 🧫|bakterienkultur|biologe|biologie|biologin|kultur|labor|petrischale|pipette|probe
 🧫|bakterienkultur|biologe|biologie|biologin|kultur|labor|petrischale|pipette|probe
 🧬|biologe|biologie|biologin|dna|dns|evolution|genetik|genmanipulation|leben
 🧬|biologe|biologie|biologin|dna|dns|evolution|genetik|genmanipulation|leben
@@ -1477,6 +1483,7 @@
 ➰|schleife|looping
 ➰|schleife|looping
 ➿|blau|doppelschleife|rechteck|schleife
 ➿|blau|doppelschleife|rechteck|schleife
 〽️|japanisch|teilalternationszeichen|zeichensetzung
 〽️|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
 🔠|abcd|buchstaben|großbuchstaben|großschreiben|eingabesymbol lateinische grossbuchstaben|grossbuchstaben|lateinische grossbuchstaben
 🔡|eingabesymbol lateinische kleinbuchstaben|kleinbuchstaben|lateinische kleinbuchstaben
 🔡|eingabesymbol lateinische kleinbuchstaben|kleinbuchstaben|lateinische kleinbuchstaben
 🔢|1234|eingabesymbol|symbol|zahlen|ziffern
 🔢|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
 🈳|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
 🈺|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
 🈵|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|kreis|orange scheibe|oranger kreis|oranger punkt|punkt
 🟡|form|gelbe scheibe|gelber kreis|gelber punkt|kreis|punkt|scheibe
 🟡|form|gelbe scheibe|gelber kreis|gelber punkt|kreis|punkt|scheibe
 🟢|form|grüne scheibe|grüner kreis|grüner punkt|kreis|punkt
 🟢|form|grüne scheibe|grüner kreis|grüner punkt|kreis|punkt
@@ -1804,4 +1811,4 @@
 🇿🇼|simbabwe|zimbabwe
 🇿🇼|simbabwe|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|schottland
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|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-right|intercardinal|southeast
 ↙️|arrow|direction|down-left|intercardinal|southwest
 ↙️|arrow|direction|down-left|intercardinal|southwest
 ⌨️|computer|keyboard
 ⌨️|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
 ☃️|cold|man|snowman
 ☄️|comet|space
 ☄️|comet|space
 ☑️|✓|ballot|box|checked|done|off|tick box with tick|check box with check
 ☑️|✓|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
 ☕|beverage|cafe|caffeine|chai|coffee|drink|hot|morning|steaming|tea
 ☘️|irish|plant|shamrock
 ☘️|irish|plant|shamrock
 ☠️|bone|crossbones|dead|death|face|monster|skull
 ☠️|bone|crossbones|dead|death|face|monster|skull
@@ -67,16 +67,16 @@
 ㊗️|button|congratulations|ideograph|japanese
 ㊗️|button|congratulations|ideograph|japanese
 ㊙️|button|ideograph|japanese|secret
 ㊙️|button|ideograph|japanese|secret
 😀|cheerful|cheery|face|grinning|happy|laugh|nice|smile|smiling|teeth
 😀|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
 😄|eyes|face|grinning|happy|laugh|lol|mouth|open|smile|smiling
 😁|beaming|eyes|face|grinning|happy|nice|smile|smiling|teeth
 😁|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|happy|slightly|smile|smiling
 🙃|face|hehe|smile|upside down|upside-down face
 🙃|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
 😉|face|flirt|heartbreaker|sexy|slide|tease|winking|winks
 😊|blush|eyes|face|glad|satisfied|smile|smiling
 😊|blush|eyes|face|glad|satisfied|smile|smiling
 😇|angelic|angels|blessed|face|fairytale|fantasy|halo|happy|innocent|peaceful|smile|smiling|spirit|tale
 😇|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
 😘|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
 😗|143|date|dating|face|flirt|ily|kiss|love|smooches|xoxo|you
 ☺️|face|happy|outlined|relaxed|smile|smiling
 ☺️|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
 🥲|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
 😋|delicious|eat|food|full|hungry|smile|smiling|tasty|um|yummy|face savouring food|savouring|savoring
 😛|awesome|cool|face|nice|party|stuck-out|sweet|tongue
 😛|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
 🤪|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|money-mouth|mouth|paid
 🤗|face|hands|hugging|open|smiling
 🤗|face|hands|hugging|open|smiling
 🤭|giggle|giggling|hand|mouth|oops|realization|secret|shock|sudden|surprise|whoops|embarrassed|realisation|face with hand over mouth
 🤭|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
 🫣|captivated|embarrass|eye|face|hide|hiding|peeking|peep|scared|shy|stare
 🤫|face|quiet|shh|shooshing face|shushing face
 🤫|face|quiet|shh|shooshing face|shushing face
 🤔|chin|consider|face|hmm|pondering|thinking|wondering
 🤔|chin|consider|face|hmm|pondering|thinking|wondering
 🫡|face|good|luck|ma’am|ok|respect|salute|saluting|sir|troops|yes
 🫡|face|good|luck|ma’am|ok|respect|salute|saluting|sir|troops|yes
 🤐|face|keep|mouth|quiet|secret|shut|zipper-mouth
 🤐|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
 😶|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
 🫥|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
 😶‍🌫️|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
 😏|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
 🙄|eyeroll|eyes|face|rolling|shade|ugh|whatever
 😬|awkward|dentist|face|grimace|grimacing|grinning|smile|smiling
 😬|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
 🤥|face|liar|lie|pinocchio|lying face
 🫨|crazy|daze|earthquake|face|omg|panic|shaking|shock|surprise|vibrate|whoa|wow
 🫨|crazy|daze|earthquake|face|omg|panic|shaking|shock|surprise|vibrate|whoa|wow
 🙂‍↔️|head|horizontally|no|shake|shaking
 🙂‍↔️|head|horizontally|no|shake|shaking
@@ -122,10 +122,11 @@
 😔|awful|bored|dejected|died|disappointed|face|losing|lost|pensive|sad|sucks
 😔|awful|bored|dejected|died|disappointed|face|losing|lost|pensive|sad|sucks
 😪|crying|face|good|night|sad|sleeping|sleepy|tired
 😪|crying|face|good|night|sad|sleeping|sleepy|tired
 🤤|drooling|face
 🤤|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
 😷|cold|dentist|dermatologist|doctor|dr|germs|mask|medical|medicine|sick|poorly|face with medical mask|ill
 🤒|face|ill|sick|thermometer
 🤒|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
 🤢|face|gross|nasty|nauseated|sick|vomit
 🤮|barf|ew|face|gross|puke|sick|spew|throw|up|vomiting
 🤮|barf|ew|face|gross|puke|sick|spew|throw|up|vomiting
 🤧|face|fever|flu|gesundheit|sick|sneeze|bless you|sneezing face
 🤧|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
 🫤|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
 😟|anxious|butterflies|face|nerves|nervous|sad|stressed|surprised|worried|worry
 🙁|face|frowning|sad|slightly
 🙁|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
 😯|epic|face|hushed|omg|stunned|surprised|whoa|woah
 😲|astonished|cost|face|no|omg|shocked|totally|way
 😲|astonished|cost|face|no|omg|shocked|totally|way
 😳|amazed|awkward|crazy|dazed|dead|disbelief|embarrassed|face|flushed|geez|heat|hot|impressed|jeez|what|wow
 😳|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
 🥺|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
 😦|caught|face|frowning|guard|mouth|open|scared|scary|surprise|what|wow
 😧|anguished|face|forgot|scared|scary|stressed|surprise|unhappy|what|wow
 😧|anguished|face|forgot|scared|scary|stressed|surprise|unhappy|what|wow
 😨|afraid|anxious|blame|face|fearful|scared|worried
 😨|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|enraged|face|feels|maddening|pouting|rage|red|shade|unhappy|upset
 😠|anger|angry|blame|face|feels|frustrated|maddening|rage|shade|unhappy|upset
 😠|anger|angry|blame|face|feels|frustrated|maddening|rage|shade|unhappy|upset
 🤬|censor|cursing|cussing|face|mad|mouth|pissed|swearing|symbols
 🤬|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
 👿|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
 💀|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
 🤡|clown|face
 👹|creature|devil|face|fairytale|fantasy|mask|monster|ogre|scary|tale
 👹|creature|devil|face|fairytale|fantasy|mask|monster|ogre|scary|tale
 👺|angry|creature|face|fairytale|fantasy|goblin|mask|mean|monster|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|monster|space|tale|ufo|et
 👾|alien|creature|extraterrestrial|face|fairytale|fantasy|gamer|games|monster|pixelated|space|tale|ufo|et
 👾|alien|creature|extraterrestrial|face|fairytale|fantasy|gamer|games|monster|pixelated|space|tale|ufo|et
 🤖|face|monster|robot
 🤖|face|monster|robot
@@ -190,9 +191,9 @@
 🙀|animal|cat|face|oh|surprised|weary
 🙀|animal|cat|face|oh|surprised|weary
 😿|animal|cat|crying|face|sad|tear
 😿|animal|cat|crying|face|sad|tear
 😾|animal|cat|face|pouting
 😾|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
 💌|heart|letter|love|mail|romance|valentine
 💘|143|adorbs|arrow|cupid|date|emotion|heart|ily|love|romance|valentine
 💘|143|adorbs|arrow|cupid|date|emotion|heart|ily|love|romance|valentine
 💝|143|anniversary|emotion|heart|ily|kisses|ribbon|valentine|xoxo
 💝|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|emotion|excited|growing|heartpulse|ily|kisses|muah|nervous|pulse|xoxo|mwah
 💓|143|beating|cardio|emotion|heartbeat|ily|love|pulsating|pulse
 💓|143|beating|cardio|emotion|heartbeat|ily|love|pulsating|pulse
 💞|143|adorbs|anniversary|emotion|hearts|revolving
 💞|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
 💟|143|decoration|emotion|hearth|purple|white
 💔|break|broken|crushed|emotion|heartbroken|lonely|sad
 💔|break|broken|crushed|emotion|heartbroken|lonely|sad
 ❤️‍🔥|burn|fire|heart|love|lust|sacred
 ❤️‍🔥|burn|fire|heart|love|lust|sacred
@@ -210,7 +211,7 @@
 💛|143|cardiac|emotion|heart|ily|love|yellow
 💛|143|cardiac|emotion|heart|ily|love|yellow
 💚|143|emotion|green|heart|ily|love|romantic
 💚|143|emotion|green|heart|ily|love|romantic
 💙|143|blue|emotion|heart|ily|love|romance
 💙|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|bestest|emotion|heart|ily|love|purple
 🤎|143|brown|heart
 🤎|143|brown|heart
 🖤|black|evil|heart|wicked
 🖤|black|evil|heart|wicked
@@ -239,10 +240,10 @@
 🫲|handshake|hold|leftwards|reach|shake
 🫲|handshake|hold|leftwards|reach|shake
 🫳|dismiss|down|dropped|hand|pick|shoo|up|palm down hand|palm-down hand
 🫳|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
 🫴|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
 🤏|amount|bit|fingers|hand|little|pinching|small|sort
 ✌️|hand|peace|victory
 ✌️|hand|peace|victory
 🤞|fingers|hand|luck|crossed fingers|good luck
 🤞|fingers|hand|luck|crossed fingers|good luck
@@ -260,20 +261,20 @@
 👍|+1|good|hand|like|thumb|up|yes
 👍|+1|good|hand|like|thumb|up|yes
 👎|-1|bad|dislike|down|good|hand|nope|thumbs
 👎|-1|bad|dislike|down|good|hand|nope|thumbs
 ✊|clenched|fist|hand|punch|raised|solidarity
 ✊|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|leftwards|left-facing fist
 🤜|fist|rightwards|right-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
 🙌|celebration|gesture|hands|hooray|praise|raised|raising hands|woo hoo|yay
 🫶|<3|hands|heart|love|you
 🫶|<3|hands|heart|love|you
 👐|hands|hug|jazz|open|swerve
 👐|hands|hug|jazz|open|swerve
 🤲|cupped|dua|hands|palms|prayer|together|up|wish
 🤲|cupped|dua|hands|palms|prayer|together|up|wish
 🤝|agreement|deal|handshake|meeting|shake
 🤝|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
 ✍️|hand|write|writing
 💅|bored|care|cosmetics|done|makeup|manicure|nail|polish|whatever
 💅|bored|care|cosmetics|done|makeup|manicure|nail|polish|whatever
 🤳|camera|phone|selfie
 🤳|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|arm|mechanical|prosthetic
 🦿|accessibility|leg|mechanical|prosthetic
 🦿|accessibility|leg|mechanical|prosthetic
 🦵|bent|foot|kick|knee|leg|limb
 🦵|bent|foot|kick|knee|leg|limb
@@ -328,15 +329,15 @@
 🧏|accessibility|ear|gesture|person|deaf person|hard of hearing|hearing impaired
 🧏|accessibility|ear|gesture|person|deaf person|hard of hearing|hearing impaired
 🧏‍♂️|accessibility|deaf|ear|gesture|hear|man|male
 🧏‍♂️|accessibility|deaf|ear|gesture|hear|man|male
 🧏‍♀️|accessibility|deaf|ear|gesture|hear|woman|female
 🧏‍♀️|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|not|oh|omg|person|shock|smh
 🤦‍♂️|again|bewilder|disbelief|exasperation|facepalm|man|not|oh|omg|shock|smh|male
 🤦‍♂️|again|bewilder|disbelief|exasperation|facepalm|man|not|oh|omg|shock|smh|male
 🤦‍♀️|again|bewilder|disbelief|exasperation|facepalm|not|oh|omg|shock|smh|woman|female
 🤦‍♀️|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|health worker
 👨‍⚕️|doctor|healthcare|nurse|therapist|worker|health care|man health worker
 👨‍⚕️|doctor|healthcare|nurse|therapist|worker|health care|man health worker
 👩‍⚕️|doctor|healthcare|nurse|therapist|worker|health care|woman 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|man|scary|undead|walking|zombie|male
 🧟‍♀️|apocalypse|dead|halloween|horror|scary|undead|walking|woman|zombie|female
 🧟‍♀️|apocalypse|dead|halloween|horror|scary|undead|walking|woman|zombie|female
 🧌|fairy|fantasy|monster|tale|trolling
 🧌|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|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|person|stride|stroll|walking
 🚶‍♂️|amble|gait|hike|man|pace|pedestrian|stride|stroll|walking|male
 🚶‍♂️|amble|gait|hike|man|pace|pedestrian|stride|stroll|walking|male
 🚶‍♀️|amble|gait|hike|man|pace|pedestrian|stride|stroll|walking|woman|female
 🚶‍♀️|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|man|marathon|move|quick|race|racing|run|rush|speed|male
 🏃‍♀️|fast|hurry|marathon|move|quick|race|racing|run|rush|speed|woman|female
 🏃‍♀️|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|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
 🕴️|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|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|man|pamper|relax|room|sauna|spa|steambath|unwind|steam bath|male
 🧖‍♀️|day|luxurious|pamper|relax|room|sauna|spa|steambath|unwind|woman|steam bath|female
 🧖‍♀️|day|luxurious|pamper|relax|room|sauna|spa|steambath|unwind|woman|steam bath|female
@@ -527,19 +528,19 @@
 🤽|person|playing|polo|sport|swimming|waterpolo
 🤽|person|playing|polo|sport|swimming|waterpolo
 🤽‍♂️|man|playing|polo|sport|swimming|waterpolo
 🤽‍♂️|man|playing|polo|sport|swimming|waterpolo
 🤽‍♀️|playing|polo|sport|swimming|waterpolo|woman
 🤽‍♀️|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|person juggling
 🤹‍♂️|act|balance|balancing|handle|juggle|juggling|manage|multitask|skill|multi-task|male
 🤹‍♂️|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
 🤹‍♀️|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
 🛀|bathtub|taking|tub|person taking bath
 🛌|bedtime|goodnight|hotel|nap|night|tired|zzz|person in bed|sleeping
 🛌|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|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|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
 👬|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
 💏|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
 🧑‍🧒‍🧒|adult|child|family
 🧑‍🧒‍🧒|adult|child|family
 👣|barefoot|clothing|footprints|omw|print|walk
 👣|barefoot|clothing|footprints|omw|print|walk
+🫆|clue|crime|detective|fingerprint|forensics|identity|mystery|print|safety|trace|security
 🐵|animal|banana|face|monkey
 🐵|animal|banana|face|monkey
 🐒|animal|banana|monkey
 🐒|animal|banana|monkey
 🦍|animal|gorilla
 🦍|animal|gorilla
@@ -662,7 +664,12 @@
 🐙|animal|creature|ocean|octopus
 🐙|animal|creature|ocean|octopus
 🐚|animal|beach|conch|sea|shell|spiral
 🐚|animal|beach|conch|sea|shell|spiral
 🪸|change|climate|coral|ocean|reef|sea
 🪸|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
 🐌|animal|escargot|garden|nature|slug|snail|mollusc
 🦋|butterfly|insect|pretty|moth
 🦋|butterfly|insect|pretty|moth
 🐛|animal|bug|garden|insect|caterpillar|worm
 🐛|animal|bug|garden|insect|caterpillar|worm
@@ -706,14 +713,15 @@
 🪹|branch|empty|home|nesting
 🪹|branch|empty|home|nesting
 🪺|bird|branch|eggs|nesting
 🪺|bird|branch|eggs|nesting
 🍄|fungus|mushroom|toadstool
 🍄|fungus|mushroom|toadstool
+🪾|bare|barren|branches|dead|drought|leafless|tree|trunk|winter|wood
 🍇|dionysus|fruit|grapes
 🍇|dionysus|fruit|grapes
 🍈|cantaloupe|fruit|melon
 🍈|cantaloupe|fruit|melon
 🍉|fruit|watermelon
 🍉|fruit|watermelon
 🍊|citrus|fruit|nectarine|orange|tangerine|vitamin|mandarin
 🍊|citrus|fruit|nectarine|orange|tangerine|vitamin|mandarin
 🍋|citrus|fruit|lemon|sour
 🍋|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
 🍌|banana|fruit|potassium
-🍍|colada|fruit|pina|pineapple|tropical
+🍍|colada|fruit|pina|pineapple|tropical|piña
 🥭|food|fruit|mango|tropical
 🥭|food|fruit|mango|tropical
 🍎|apple|diet|food|fruit|health|red|ripe
 🍎|apple|diet|food|fruit|health|red|ripe
 🍏|apple|fruit|green
 🍏|apple|fruit|green
@@ -734,7 +742,7 @@
 🌶️|pepper|chilli|hot pepper
 🌶️|pepper|chilli|hot pepper
 🫑|capsicum|food|pepper|vegetable|bell pepper|sweet pepper
 🫑|capsicum|food|pepper|vegetable|bell pepper|sweet pepper
 🥒|cucumber|food|pickle|vegetable
 🥒|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
 🥦|broccoli|cabbage|wild
 🧄|flavoring|garlic|flavouring
 🧄|flavoring|garlic|flavouring
 🧅|flavoring|onion|flavouring
 🧅|flavoring|onion|flavouring
@@ -742,12 +750,13 @@
 🫘|beans|food|legume|small|kidney beans
 🫘|beans|food|legume|small|kidney beans
 🌰|almond|chestnut|plant|nut
 🌰|almond|chestnut|plant|nut
 🫚|beer|health|herb|natural|spice|ginger root|root ginger
 🫚|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|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|carbs|food|grain|loaf|restaurant|toast|wheat
 🥐|bread|breakfast|crescent|croissant|food|french|roll
 🥐|bread|breakfast|crescent|croissant|food|french|roll
 🥖|baguette|bread|food|french stick
 🥖|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
 🥨|convoluted|pretzel|twisted
 🥯|bagel|bakery|bread|breakfast|schmear
 🥯|bagel|bakery|bread|breakfast|schmear
 🥞|breakfast|crêpe|food|hotcake|pancakes|crepe
 🥞|breakfast|crêpe|food|hotcake|pancakes|crepe
@@ -768,16 +777,16 @@
 🥙|falafel|flatbread|food|gyro|kebab|stuffed|pita roll
 🥙|falafel|flatbread|food|gyro|kebab|stuffed|pita roll
 🧆|chickpea|falafel|meatball|chick pea
 🧆|chickpea|falafel|meatball|chick pea
 🥚|breakfast|egg|food
 🥚|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
 🥘|casserole|food|paella|pan|shallow
 🍲|food|pot|soup|stew
 🍲|food|pot|soup|stew
 🫕|cheese|chocolate|fondue|food|melted|pot|ski
 🫕|cheese|chocolate|fondue|food|melted|pot|ski
 🥣|bowl|breakfast|cereal|congee|oatmeal|porridge|spoon
 🥣|bowl|breakfast|cereal|congee|oatmeal|porridge|spoon
 🥗|food|green|salad|garden
 🥗|food|green|salad|garden
-🍿|corn|movie|popcorn
+🍿|corn|movie|popcorn|film
 🧈|butter|dairy
 🧈|butter|dairy
 🧂|condiment|flavor|mad|salty|shaker|taste|upset|flavour
 🧂|condiment|flavor|mad|salty|shaker|taste|upset|flavour
-🥫|canned|food
+🥫|canned|food|tin
 🍱|bento|box|food
 🍱|bento|box|food
 🍘|cracker|food|rice
 🍘|cracker|food|rice
 🍙|ball|food|japanese|rice
 🍙|ball|food|japanese|rice
@@ -789,17 +798,12 @@
 🍢|food|kebab|oden|restaurant|seafood|skewer|stick
 🍢|food|kebab|oden|restaurant|seafood|skewer|stick
 🍣|food|sushi
 🍣|food|sushi
 🍤|fried|prawn|shrimp|tempura|battered
 🍤|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
 🍡|dango|dessert|japanese|skewer|stick|sweet
 🥟|dumpling|empanada|gyōza|jiaozi|pierogi|potsticker|pastie|samosa
 🥟|dumpling|empanada|gyōza|jiaozi|pierogi|potsticker|pastie|samosa
 🥠|cookie|fortune|prophecy
 🥠|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
 🍦|cream|dessert|food|icecream|restaurant|serve|sweet|ice cream|soft serve|soft-serve ice cream
 🍧|dessert|ice|restaurant|shaved|sweet|granita
 🍧|dessert|ice|restaurant|shaved|sweet|granita
 🍨|cream|dessert|food|restaurant|sweet|ice cream
 🍨|cream|dessert|food|restaurant|sweet|ice cream
@@ -822,15 +826,15 @@
 🍾|bar|cork|drink|popping|bottle with popping cork|bubbly
 🍾|bar|cork|drink|popping|bottle with popping cork|bubbly
 🍷|alcohol|bar|beverage|booze|club|drinking|drinks|glass|restaurant|wine
 🍷|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|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|ale|bar|beer|booze|drinking|drinks|mug|octoberfest|oktoberfest|pint|stein|summer
 🍻|alcohol|bar|beer|booze|bottoms|cheers|drinking|drinks|mugs|clinking beer mugs
 🍻|alcohol|bar|beer|booze|bottoms|cheers|drinking|drinks|mugs|clinking beer mugs
 🥂|celebrate|drink|glasses|cheers|clinking glasses
 🥂|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
 🫗|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
 🧋|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é
 🧉|drink|mate|maté
 🧊|cold|cube|iceberg
 🧊|cold|cube|iceberg
 🥢|chopsticks|hashi|jeotgarak|kuaizi|pair of chopsticks
 🥢|chopsticks|hashi|jeotgarak|kuaizi|pair of chopsticks
@@ -851,17 +855,17 @@
 ⛰️|mountain
 ⛰️|mountain
 🌋|eruption|mountain|nature|volcano
 🌋|eruption|mountain|nature|volcano
 🗻|fuji|mountain|nature|mount fuji
 🗻|fuji|mountain|nature|mount fuji
-🏕️|camping
+🏕️|camping|tent
 🏖️|beach|umbrella
 🏖️|beach|umbrella
-🏜️|desert
-🏝️|desert|island
-🏞️|national|park
+🏜️|desert|cactus
+🏝️|desert|island|palm|tree
+🏞️|national|park|mountain|river|tree
 🏟️|stadium|arena
 🏟️|stadium|arena
 🏛️|building|classical building|column
 🏛️|building|classical building|column
-🏗️|building|construction|crane
+🏗️|building|construction|crane|site
 🧱|bricks|clay|mortar|wall
 🧱|bricks|clay|mortar|wall
 🪨|boulder|heavy|rock|solid|stone|tough
 🪨|boulder|heavy|rock|solid|stone|tough
-🪵|log|lumber|timber|wood
+🪵|log|lumber|timber|wood|stump
 🛖|home|house|hut|roundhouse|shelter|yurt
 🛖|home|house|hut|roundhouse|shelter|yurt
 🏘️|houses
 🏘️|houses
 🏚️|derelict|home|house
 🏚️|derelict|home|house
@@ -874,7 +878,7 @@
 🏦|bank|building
 🏦|bank|building
 🏨|building|hotel
 🏨|building|hotel
 🏩|building|hotel|love
 🏩|building|hotel|love
-🏪|24|building|convenience|hours|store|dépanneur
+🏪|24|building|convenience|hours|store|dépanneur|shop
 🏫|building|school
 🏫|building|school
 🏬|building|department|store
 🏬|building|department|store
 🏭|building|factory
 🏭|building|factory
@@ -887,7 +891,7 @@
 🕌|islam|masjid|mosque|muslim|religion
 🕌|islam|masjid|mosque|muslim|religion
 🛕|hindu|temple
 🛕|hindu|temple
 🕍|jewish|judaism|religion|synagogue|temple|shul
 🕍|jewish|judaism|religion|synagogue|temple|shul
-⛩️|religion|shinto|shrine
+⛩️|religion|shinto|shrine|torii
 🕋|hajj|islam|kaaba|muslim|religion|umrah
 🕋|hajj|islam|kaaba|muslim|religion|umrah
 ⛲|fountain
 ⛲|fountain
 ⛺|camping|tent
 ⛺|camping|tent
@@ -897,7 +901,7 @@
 🌄|morning|mountains|over|sunrise
 🌄|morning|mountains|over|sunrise
 🌅|morning|nature|sunrise
 🌅|morning|nature|sunrise
 🌆|at|building|dusk|evening|landscape|sunset|cityscape at dusk|skyline at dusk
 🌆|at|building|dusk|evening|landscape|sunset|cityscape at dusk|skyline at dusk
-🌇|building|dusk|sunset
+🌇|building|dusk|sunset|cityscape
 🌉|at|bridge|night
 🌉|at|bridge|night
 🎠|carousel|entertainment|horse|merry-go-round
 🎠|carousel|entertainment|horse|merry-go-round
 🛝|park|playing|slide|sliding|amusement park|playground slide|theme park
 🛝|park|playing|slide|sliding|amusement park|playground slide|theme park
@@ -906,8 +910,8 @@
 💈|barber|cut|fresh|haircut|pole|shave
 💈|barber|cut|fresh|haircut|pole|shave
 🎪|circus|tent|big top
 🎪|circus|tent|big top
 🚂|caboose|engine|locomotive|railway|steam|trains|travel
 🚂|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
 🚅|bullet|high-speed|nose|railway|shinkansen|speed|train|travel
 🚆|arrived|choo|railway|train
 🚆|arrived|choo|railway|train
 🚇|metro|subway|travel|tube|underground
 🚇|metro|subway|travel|tube|underground
@@ -915,10 +919,10 @@
 🚉|railway|station|train
 🚉|railway|station|train
 🚊|trolleybus|light rail|oncoming light rail|car|streetcar|tramcar|trolley bus
 🚊|trolleybus|light rail|oncoming light rail|car|streetcar|tramcar|trolley bus
 🚝|monorail|vehicle
 🚝|monorail|vehicle
-🚞|car|mountain|railway|trip
+🚞|mountain|railway|trip|carriage
 🚋|bus|car|trolleybus|trolley bus|streetcar|tramcar
 🚋|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|tram|trolleybus|streetcar
 🚐|bus|drive|minibus|van|vehicle
 🚐|bus|drive|minibus|van|vehicle
 🚑|ambulance|emergency|vehicle
 🚑|ambulance|emergency|vehicle
@@ -926,16 +930,16 @@
 🚓|5–0|car|cops|patrol|police
 🚓|5–0|car|cops|patrol|police
 🚔|car|oncoming|police
 🚔|car|oncoming|police
 🚕|cabbie|car|drive|taxi|vehicle|yellow
 🚕|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|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
 🚙|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
 🛻|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
 🚛|car|drive|lorry|move|semi|truck|vehicle|articulated truck
 🚜|tractor|vehicle
 🚜|tractor|vehicle
 🏎️|car|racing|zoom
 🏎️|car|racing|zoom
-🏍️|motorcycle|racing
+🏍️|motorcycle|racing|motorbike
 🛵|motor|scooter
 🛵|motor|scooter
 🦽|accessibility|manual|wheelchair
 🦽|accessibility|manual|wheelchair
 🦼|accessibility|motorized|wheelchair|powered wheelchair|mobility scooter
 🦼|accessibility|motorized|wheelchair|powered wheelchair|mobility scooter
@@ -951,76 +955,76 @@
 ⛽|diesel|fuelpump|gasoline|pump|station|petrol pump
 ⛽|diesel|fuelpump|gasoline|pump|station|petrol pump
 🛞|car|circle|tire|turn|vehicle|wheel|tyre
 🛞|car|circle|tire|turn|vehicle|wheel|tyre
 🚨|alarm|alert|beacon|car|emergency|light|police|revolving|siren
 🚨|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
 🛑|octagonal|sign|stop
 🚧|barrier|construction
 🚧|barrier|construction
 🛟|buoy|float|lifesaver|preserver|rescue|safety|saver|swim|life preserver|life saver|lifebuoy|ring buoy
 🛟|buoy|float|lifesaver|preserver|rescue|safety|saver|swim|life preserver|life saver|lifebuoy|ring buoy
 ⛵|boat|resort|sailboat|sailing|sea|yacht
 ⛵|boat|resort|sailboat|sailing|sea|yacht
-🛶|boat|canoe
+🛶|boat|canoe|kayak
 🚤|billionaire|boat|lake|luxury|millionaire|speedboat|summer|travel
 🚤|billionaire|boat|lake|luxury|millionaire|speedboat|summer|travel
-🛳️|passenger|ship
+🛳️|passenger|ship|cruise|liner
 ⛴️|boat|ferry|passenger
 ⛴️|boat|ferry|passenger
 🛥️|boat|motorboat
 🛥️|boat|motorboat
 🚢|boat|passenger|ship|travel
 🚢|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|check-in|departures|take-off|flight departure|plane departure
 🛬|aeroplane|airplane|arrivals|arriving|landing|plane
 🛬|aeroplane|airplane|arrivals|arriving|landing|plane
 🪂|hang-glide|parachute|parasail|skydive|parascend
 🪂|hang-glide|parachute|parasail|skydive|parascend
 💺|chair|seat
 💺|chair|seat
 🚁|copter|helicopter|roflcopter|travel|vehicle
 🚁|copter|helicopter|roflcopter|travel|vehicle
-🚟|railway|suspension|cable
+🚟|railway|suspension|cable|monorail
 🚠|cableway|gondola|lift|mountain|ski
 🚠|cableway|gondola|lift|mountain|ski
 🚡|aerial|cable|car|gondola|ropeway|tramway
 🚡|aerial|cable|car|gondola|ropeway|tramway
 🛰️|satellite|space
 🛰️|satellite|space
 🚀|launch|rockets|space|travel
 🚀|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
 🧳|bag|luggage|packing|roller|suitcase|travel
 ⌛|done|sand|timer|hourglass done
 ⌛|done|sand|timer|hourglass done
 ⏳|done|flowing|hourglass|hours|not|sand|timer|waiting|yolo
 ⏳|done|flowing|hourglass|hours|not|sand|timer|waiting|yolo
-⌚|clock|time|watch
+⌚|clock|time|watch|wristwatch
 ⏰|alarm|clock|hours|hrs|late|time|waiting
 ⏰|alarm|clock|hours|hrs|late|time|waiting
 ⏱️|clock|stopwatch|time
 ⏱️|clock|stopwatch|time
 ⏲️|clock|timer
 ⏲️|clock|timer
 🕰️|clock|mantelpiece|time
 🕰️|clock|mantelpiece|time
 🕛|12:00|clock|o’clock|time|twelve
 🕛|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: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: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: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
 🕓|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
 🕔|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
 🕕|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
 🕗|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
 🕘|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: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
 🌑|dark|moon|new|space
 🌒|crescent|dreams|moon|space|waxing
 🌒|crescent|dreams|moon|space|waxing
 🌓|first|moon|quarter|space
 🌓|first|moon|quarter|space
 🌔|gibbous|moon|space|waxing
 🌔|gibbous|moon|space|waxing
 🌕|full|moon|space
 🌕|full|moon|space
 🌖|gibbous|moon|space|waning
 🌖|gibbous|moon|space|waning
-🌗|last|moon|quarter|space
+🌗|last|moon|quarter|space|half|third
 🌘|crescent|moon|space|waning
 🌘|crescent|moon|space|waning
 🌙|crescent|moon|ramadan|space
 🌙|crescent|moon|ramadan|space
 🌚|face|moon|new|space
 🌚|face|moon|new|space
 🌛|face|first|moon|quarter|space
 🌛|face|first|moon|quarter|space
 🌜|dreams|face|last|moon|quarter
 🌜|dreams|face|last|moon|quarter
-🌡️|thermometer|weather
+🌡️|thermometer|weather|temperature
 🌝|bright|face|moon|full-moon face
 🌝|bright|face|moon|full-moon face
 🌞|beach|bright|day|face|heat|shine|sunny|sunshine|weather
 🌞|beach|bright|day|face|heat|shine|sunny|sunshine|weather
 🪐|planet|ringed|saturnine
 🪐|planet|ringed|saturnine
@@ -1029,7 +1033,7 @@
 🌠|falling|night|shooting|space|star
 🌠|falling|night|shooting|space|star
 🌌|space|way|milky way
 🌌|space|way|milky way
 ⛅|behind|cloudy|sun|weather
 ⛅|behind|cloudy|sun|weather
-⛈️|cloud|lightning|rain|thunderstorm
+⛈️|cloud|lightning|rain|thunderstorm|weather
 🌤️|behind|cloud|sun|weather
 🌤️|behind|cloud|sun|weather
 🌥️|behind|cloud|sun|weather
 🌥️|behind|cloud|sun|weather
 🌦️|behind|cloud|rain|sun|weather
 🌦️|behind|cloud|rain|sun|weather
@@ -1040,14 +1044,14 @@
 🌫️|cloud|fog|weather
 🌫️|cloud|fog|weather
 🌬️|blow|cloud|face|wind
 🌬️|blow|cloud|face|wind
 🌀|cyclone|dizzy|hurricane|twister|typhoon|weather
 🌀|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
 🌂|closed|clothing|rain|umbrella
-⛱️|ground|rain|sun|umbrella|beach|sand
+⛱️|ground|rain|umbrella|beach|sand|sunshade
 ⚡|danger|electricity|high|lightning|nature|thunderbolt|voltage|zap
 ⚡|danger|electricity|high|lightning|nature|thunderbolt|voltage|zap
 ⛄|cold|man|snowman
 ⛄|cold|man|snowman
 🔥|af|burn|fire|flame|hot|litaf|tool
 🔥|af|burn|fire|flame|hot|litaf|tool
 💧|cold|comic|droplet|nature|sad|sweat|tear|water|weather
 💧|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|halloween|jack-o-lantern|lantern|pumpkin|jack-o’-lantern
 🎄|celebration|christmas|tree
 🎄|celebration|christmas|tree
 🎆|boom|celebration|entertainment|fireworks|yolo
 🎆|boom|celebration|entertainment|fireworks|yolo
@@ -1059,13 +1063,13 @@
 🎋|banner|celebration|japanese|tree|tanabata tree
 🎋|banner|celebration|japanese|tree|tanabata tree
 🎍|bamboo|celebration|decoration|japanese|pine|plant
 🎍|bamboo|celebration|decoration|japanese|pine|plant
 🎎|celebration|dolls|festival|japanese
 🎎|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
 🎐|bell|celebration|chime|wind
 🎑|celebration|ceremony|viewing|moon viewing ceremony|moon-viewing ceremony
 🎑|celebration|ceremony|viewing|moon viewing ceremony|moon-viewing ceremony
 🧧|envelope|gift|good|hóngbāo|lai|luck|money|red|see
 🧧|envelope|gift|good|hóngbāo|lai|luck|money|red|see
 🎀|celebration|ribbon
 🎀|celebration|ribbon
 🎁|birthday|bow|box|celebration|christmas|gift|present|surprise|wrapped
 🎁|birthday|bow|box|celebration|christmas|gift|present|surprise|wrapped
-🎗️|celebration|reminder|ribbon
+🎗️|celebration|reminder|ribbon|awareness
 🎟️|tickets|admission tickets|entry
 🎟️|tickets|admission tickets|entry
 🎫|admission|stub|ticket
 🎫|admission|stub|ticket
 🎖️|award|celebration|medal|military
 🎖️|award|celebration|medal|military
@@ -1134,7 +1138,7 @@
 🥼|clothes|coat|doctor|dr|experiment|jacket|lab|scientist|white
 🥼|clothes|coat|doctor|dr|experiment|jacket|lab|scientist|white
 🦺|emergency|safety|vest|hi-vis|high-vis|jacket|life jacket
 🦺|emergency|safety|vest|hi-vis|high-vis|jacket|life jacket
 👔|clothing|employed|necktie|serious|shirt|tie
 👔|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
 👖|blue|casual|clothes|clothing|denim|dressed|jeans|pants|shopping|trousers|weekend
 🧣|bundle|cold|neck|scarf|up
 🧣|bundle|cold|neck|scarf|up
 🧤|gloves|hand
 🧤|gloves|hand
@@ -1204,6 +1208,7 @@
 🪘|beat|conga|drum|instrument|long|rhythm
 🪘|beat|conga|drum|instrument|long|rhythm
 🪇|cha|dance|instrument|maracas|music|party|percussion|rattle|shaker
 🪇|cha|dance|instrument|maracas|music|party|percussion|rattle|shaker
 🪈|band|fife|flautist|flute|instrument|marching|music|orchestra|piccolo|pipe|recorder|woodwind
 🪈|band|fife|flautist|flute|instrument|marching|music|orchestra|piccolo|pipe|recorder|woodwind
+🪉|cupid|harp|instrument|love|music|orchestra
 📱|cell|communication|mobile|phone|telephone
 📱|cell|communication|mobile|phone|telephone
 📲|arrow|build|call|cell|communication|mobile|phone|receive|telephone
 📲|arrow|build|call|cell|communication|mobile|phone|receive|telephone
 ☎️|phone|telephone|landline
 ☎️|phone|telephone|landline
@@ -1334,6 +1339,7 @@
 🧰|box|chest|mechanic|red|toolbox
 🧰|box|chest|mechanic|red|toolbox
 🧲|attraction|horseshoe|magnetic|negative|positive|shape|u
 🧲|attraction|horseshoe|magnetic|negative|positive|shape|u
 🪜|climb|ladder|rung|step
 🪜|climb|ladder|rung|step
+🪏|bury|dig|garden|hole|plant|scoop|shovel|snow|spade
 🧪|chemistry|experiment|lab|science|test|tube
 🧪|chemistry|experiment|lab|science|test|tube
 🧫|bacteria|biologist|biology|culture|dish|lab|petri
 🧫|bacteria|biologist|biology|culture|dish|lab|petri
 🧬|biologist|dna|evolution|genetics|life
 🧬|biologist|dna|evolution|genetics|life
@@ -1400,7 +1406,7 @@
 🚫|entry|forbidden|not|prohibited|smoke|denied
 🚫|entry|forbidden|not|prohibited|smoke|denied
 🚳|bicycles|bike|forbidden|not|prohibited
 🚳|bicycles|bike|forbidden|not|prohibited
 🚭|forbidden|not|prohibited|smoke|smoking|denied
 🚭|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
 🚱|dry|non-drinking|non-potable|prohibited|water|non-drinkable water
 🚷|forbidden|not|pedestrians|prohibited|denied|no pedestrians
 🚷|forbidden|not|pedestrians|prohibited|denied|no pedestrians
 📵|cell|forbidden|mobile|not|phones|prohibited|telephone
 📵|cell|forbidden|mobile|not|phones|prohibited|telephone
@@ -1477,6 +1483,7 @@
 ➰|curly|loop
 ➰|curly|loop
 ➿|curly|double|loop
 ➿|curly|double|loop
 〽️|alternation|mark|part
 〽️|alternation|mark|part
+🫟|drip|holi|ink|liquid|mess|paint|spill|splatter|stain
 🔠|abcd|latin|letters|uppercase|input latin uppercase
 🔠|abcd|latin|letters|uppercase|input latin uppercase
 🔡|abcd|latin|letters|lowercase|input latin lowercase
 🔡|abcd|latin|letters|lowercase|input latin lowercase
 🔢|1234|input|numbers
 🔢|1234|input|numbers
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|scotland
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|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
 😪|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
 🤤|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
 😴|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 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 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
 🤕|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
 🧑‍🧒‍🧒|adulto|niño|familia: adulto, infante, infante|infante
 🧑‍🧒‍🧒|adulto|niño|familia: adulto, infante, infante|infante
 👣|huellas de pies|pies|pisada|cuerpo|ropa
 👣|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
 🐵|cara de mono|mono|animal|chango|chimpancé|simio
 🐒|macaco|mono|simio|animal|cara de mono|chango|chimpancé
 🐒|macaco|mono|simio|animal|cara de mono|chango|chimpancé
 🦍|gorila|primate|simio|animal|king kong|zoo|cara
 🦍|gorila|primate|simio|animal|king kong|zoo|cara
@@ -663,6 +665,11 @@
 🐚|espiral|animal|caracola marina|concha de caracol|marino|oceano|playa|caracol marino
 🐚|espiral|animal|caracola marina|concha de caracol|marino|oceano|playa|caracol marino
 🪸|arrecife|coral|océano|animales y naturaleza|cambio climático|mar|planta
 🪸|arrecife|coral|océano|animales y naturaleza|cambio climático|mar|planta
 🪼|invertebrado|marino|medusa|picadura|picar|acuario|jalea|océano|plancton|tentáculos
 🪼|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
 🐌|caracola|molusco|animal|babosa|baboso|insecto
 🦋|bonito|insecto|mariposa|azul|bonita|animal
 🦋|bonito|insecto|mariposa|azul|bonita|animal
 🐛|bicho|gusano|insecto|animal|naturaleza|oruga
 🐛|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 vacío|animales y naturaleza|hogar|rama
 🪺|anidación|anidamiento|anidar|nido con huevos|animales y naturaleza|ave|huevos|pájaro|rama
 🪺|anidación|anidamiento|anidar|nido con huevos|animales y naturaleza|ave|huevos|pájaro|rama
 🍄|champiñón|hongo|seta|alucinar|mario
 🍄|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
 🍇|agracejo|fruta|racimo|uvas|fruto
 🍈|fruta|melón|planta
 🍈|fruta|melón|planta
 🍉|fruta|sandía|comida|patilla|planta
 🍉|fruta|sandía|comida|patilla|planta
@@ -744,6 +752,7 @@
 🫚|cerveza|especia|garganta|raíz de jengibre|hierba|jengibre|natural|salud
 🫚|cerveza|especia|garganta|raíz de jengibre|hierba|jengibre|natural|salud
 🫛|edamame|guisante|judías|legumbre|soja|vaina|verdura|porotos|vegetal
 🫛|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
 🍄‍🟫|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
 🍞|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
 🥐|bollo|comida|croissant|cruasán|francés|cachito|desayuno|medialuna|cuernito|pan
 🥖|baguete|baguette|barra|comida|francés|desayuno|pan francés
 🥖|baguete|baguette|barra|comida|francés|desayuno|pan francés
@@ -795,11 +804,6 @@
 🥟|comida|dumpling|gyōza|jiaozi|masa|empanada
 🥟|comida|dumpling|gyōza|jiaozi|masa|empanada
 🥠|adivinación|galleta de la fortuna|profecía|superstición|comida|galleta de la suerte|galletita
 🥠|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
 🥡|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
 🍦|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
 🍧|granizado hawaiano|helado|postre|raspado|comida|dulce|frío|hielo molido|nieve|restaurante
 🍨|helado|postre|sorbete
 🍨|helado|postre|sorbete
@@ -1155,7 +1159,7 @@
 🛍️|bolsas de compras|compras|rebajas|regalo|hotel
 🛍️|bolsas de compras|compras|rebajas|regalo|hotel
 🎒|colegio|mochila escolar|bolso|escuela|estudiar|maletín|backpack
 🎒|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
 🩴|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
 👟|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
 🥾|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
 🥿|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é
 🪘|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
 🪇|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
 🪈|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
 📱|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
 📲|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
 ☎️|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
 🧰|armario|caja de herramientas|mecánico|cajón|herramientas|cofre
 🧲|atracción|herradura|imán|magnético|forma de u|polos|positivo y negativo
 🧲|atracción|herradura|imán|magnético|forma de u|polos|positivo y negativo
 🪜|escalar|escalera|escalerilla|escalón|peldaño|bajar|subir
 🪜|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
 🧪|experimento|laboratorio|química|químico|tubo de ensayo|ciencias|sustancia
 🧫|bacterias|biología|biólogo|cultivo|laboratorio|placa de petri|bióloga|microbio
 🧫|bacterias|biología|biólogo|cultivo|laboratorio|placa de petri|bióloga|microbio
 🧬|adn|biólogo|evolución|genética|vida|bióloga|genes
 🧬|adn|biólogo|evolución|genética|vida|bióloga|genes
@@ -1477,6 +1483,7 @@
 ➰|bucle|giro|tirabuzón
 ➰|bucle|giro|tirabuzón
 ➿|doble|bucle doble|japón|llamada gratuita|giro
 ➿|doble|bucle doble|japón|llamada gratuita|giro
 〽️|alternancia|marca de alternancia
 〽️|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 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
 🔡|abcd|letras latinas minúsculas|abecesario|alfabeto|letras minúsculas latinas|minúsculas latinas|entrada|latín
 🔢|1234|dígitos|números|entrada
 🔢|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
 🫠|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
 😉|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
 😊|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
 😍|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
 🤩|é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
 😘|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é
 😒|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
 🙄|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
 😬|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
 🤥|é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é
 🫨|choc|étourdi|fou|omg|ouah|panique|secoué|surprenant|tremblement de terre|vibration|visage secoué
 🙂‍↔️|non|secouer|tête secouée horizontalement
 🙂‍↔️|non|secouer|tête secouée horizontalement
@@ -123,6 +123,7 @@
 😪|émoticône|fatigué|larme|pleurer|sommeil|triste|visage endormi|endormi
 😪|émoticône|fatigué|larme|pleurer|sommeil|triste|visage endormi|endormi
 🤤|baver|délicieux|émoticône|mmh|visage qui bave|saliver
 🤤|baver|délicieux|émoticône|mmh|visage qui bave|saliver
 😴|bonne nuit|coucher|dormir|émoticône|endormi|fatigué|sieste|sommeil|visage somnolent|zzz
 😴|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
 😷|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
 🤒|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é
 🤕|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é
 😮|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
 😯|é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
 😲|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
 🥺|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
 🥹|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é
 😦|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 jaune|sentiment|jaune
 💚|amour|cœur|sentiment|vert
 💚|amour|cœur|sentiment|vert
 💙|amour|cœur bleu|sentiment|bleu
 💙|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
 💜|amour|cœur|sentiment|violet
 🤎|brun|cœur|marron
 🤎|brun|cœur|marron
 🖤|cœur|noir
 🖤|cœur|noir
@@ -554,6 +555,7 @@
 🧑‍🧒|enfant|famille : adulte, enfant|famille monoparentale
 🧑‍🧒|enfant|famille : adulte, enfant|famille monoparentale
 🧑‍🧒‍🧒|enfant|famille : adulte, enfant, enfant|famille monoparentale
 🧑‍🧒‍🧒|enfant|famille : adulte, enfant, enfant|famille monoparentale
 👣|empreintes|pieds nus|traces de pas|pas
 👣|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|georges le petit curieux|singe|sourire|tête de singe|visage
 🐒|animal|primate|singe
 🐒|animal|primate|singe
 🦍|animal|gorille|primate
 🦍|animal|gorille|primate
@@ -663,6 +665,11 @@
 🐚|animal|conque|coquillage|coquille en spirale|mer|plage|spirale
 🐚|animal|conque|coquillage|coquille en spirale|mer|plage|spirale
 🪸|corail|océan|réchauffement climatique|récif
 🪸|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
 🪼|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|escargot|jardin|lentement|nature
 🦋|animal|insecte|mignon|papillon|printemps
 🦋|animal|insecte|mignon|papillon|printemps
 🐛|animal|chenille|insecte|jardin
 🐛|animal|chenille|insecte|jardin
@@ -706,6 +713,7 @@
 🪹|branches|faire son nid|maison|nid vide
 🪹|branches|faire son nid|maison|nid vide
 🪺|branches|faire son nid|nid avec œufs|oiseau
 🪺|branches|faire son nid|nid avec œufs|oiseau
 🍄|champignon vénéneux|mario|plante|vénéneux
 🍄|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|nourriture|raisin
 🍈|fruit|melon
 🍈|fruit|melon
 🍉|fruit|pastèque|melon d’eau
 🍉|fruit|pastèque|melon d’eau
@@ -744,6 +752,7 @@
 🫚|bière|épice|gingembre|naturel|racine de gingembre|santé
 🫚|bière|épice|gingembre|naturel|racine de gingembre|santé
 🫛|cosse de petits pois|edamame|fève|haricot|légume|légumineuse|pois|soja
 🫛|cosse de petits pois|edamame|fève|haricot|légume|légumineuse|pois|soja
 🍄‍🟫|automne|brun|cèpe|champignon|fongus|marron|nature|nourriture
 🍄‍🟫|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
 🍞|miche|nourriture|pain de mie|baguette
 🥐|croissant|nourriture|pain|petit-déjeuner|viennoiserie
 🥐|croissant|nourriture|pain|petit-déjeuner|viennoiserie
 🥖|baguette|nourriture|pain
 🥖|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
 🍥|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
 🥮|automne|festival|gâteau de lune|moon cake|yuèbǐng
 🍡|bonbons|brochette de bonbons|dango|dessert|japonais|nourriture|sucré
 🍡|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
 🥠|biscuit chinois|nourriture|prophétie
 🥡|baguettes|boîte à emporter|carton|chinois|nourriture à emporter
 🥡|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
 🍦|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|granité|nourriture|restaurant|sucré|pilée
 🍨|coupe de glace|crème glacée|dessert|glace|nourriture|restaurant|sucré
 🍨|coupe de glace|crème glacée|dessert|glace|nourriture|restaurant|sucré
@@ -885,7 +889,7 @@
 🗽|liberté|new york|statue de la liberté|voyage
 🗽|liberté|new york|statue de la liberté|voyage
 ⛪|bâtiment|chapelle|chrétien|croix|église|religion|voyage
 ⛪|bâtiment|chapelle|chrétien|croix|église|religion|voyage
 🕌|islam|mosquée|musulmane|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
 🕍|judaïsme|juif|juive|religion|synagogue|temple|voyage
 ⛩️|religion|sanctuaire shinto|shinto|voyage
 ⛩️|religion|sanctuaire shinto|shinto|voyage
 🕋|islam|kaaba|musulmane|religion|voyage
 🕋|islam|kaaba|musulmane|religion|voyage
@@ -1040,13 +1044,13 @@
 🌫️|brouillard|brume|fog|météo|nuage
 🌫️|brouillard|brume|fog|météo|nuage
 🌬️|météo|nuage|souffle|vent avec visage|visage du vent
 🌬️|météo|nuage|souffle|vent avec visage|visage du vent
 🌀|cyclone|spirale|tourbillon|typhon|vertige|ouragan
 🌀|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 fermé|pluie|fermé|vêtement
 ⛱️|météo|parapluie au sol|parasol sur le sol|plage|pluie|soleil|voyage
 ⛱️|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
 ⚡|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
 ⛄|bonhomme de neige sans flocons|bonhomme de neige sans neige|froid|neige|sans
 🔥|allumer|brûler|chaud|feu|flamme|fournaise|incendie|outil
 🔥|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
 🌊|eau|kanagawa|lame|large|marée|mer|nature|océan|remous|rouleau|surf|vague
 🎃|citrouille|halloween|lanterne
 🎃|citrouille|halloween|lanterne
 🎄|arbre|fêtes|guirlandes|noël|sapin de noël|célébration
 🎄|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
 🪘|battement|conga|djembé|instrument|musique|percussions|rythme|tambour
 🪇|cha cha cha|danser|fête|hochet|instrument|maracas|musique|percussion|secouer
 🪇|cha cha cha|danser|fête|hochet|instrument|maracas|musique|percussion|secouer
 🪈|bois|fanfare|fifre|flûte à bec|flûtiste|instrument|musique|orchestre|piccolo
 🪈|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
 📱|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
 📲|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
 ☎️|téléphone rouge
@@ -1334,6 +1339,7 @@
 🧰|boîte à outils|caisse à outils|coffre|mécanique|mécano|outils
 🧰|boîte à outils|caisse à outils|coffre|mécanique|mécano|outils
 🧲|aimanter|attirer|attraction|fer à cheval|magnet|magnétique|positif négatif
 🧲|aimanter|attirer|attraction|fer à cheval|magnet|magnétique|positif négatif
 🪜|ascension|barreau|échelle|échelon|escabeau|grimper|monter
 🪜|ascension|barreau|échelle|échelon|escabeau|grimper|monter
+🪏|bêche|creuser|pelle|trou
 🧪|chimie|chimiste|expérience|expérimentation|laboratoire|réaction|sciences|tube à essai
 🧪|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
 🧫|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
 🧬|adn|biologie|biologiste|évolution|gène|génétique|science|vie
@@ -1477,6 +1483,7 @@
 ➰|bouclette
 ➰|bouclette
 ➿|boucle|double boucle
 ➿|boucle|double boucle
 〽️|alternance|symbole|marque
 〽️|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|majuscules|saisie en lettres majuscules|latin
 🔡|abcd|alphabet latin|lettres latines|minuscules|saisie de lettres minuscules|latin
 🔡|abcd|alphabet latin|lettres latines|minuscules|saisie de lettres minuscules|latin
 🔢|1234|chiffres|saisie de chiffres|nombres
 🔢|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|gute|müde|nacht|schläfrig|smiley|traurig
 🤤|gesicht|sabbern|smiley
 🤤|gesicht|sabbern|smiley
 😴|dösen|einschlafen|gähnen|gesicht|gute nacht|langweilig|mittagsschlaf|müde|nickerchen|schlafen|smiley|zzz
 😴|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
 😷|arzt|atemschutzmaske|bazillen|erkältet|gesicht|krankheit|mundschutz|schutzmaske|smiley|viren|virus
 🤒|fieber|gesicht|krank|messen|smiley|thermometer
 🤒|fieber|gesicht|krank|messen|smiley|thermometer
 🤕|aua|autsch|gesicht|kopf|schmerzen|smiley|verband|verletzung
 🤕|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
 🫄|aufgebläht|bauch|dicker bauch|person|schwangere person|schwangerschaft|überfressen|zu viel gegessen
 🤱|baby|brust|frau|person|stillen
 🤱|baby|brust|frau|person|stillen
 👩‍🍼|baby|eltern|flasche gebende frau|frau|füttern|mama|milch|mutter|neugeborenes|person|säugling|weiblich
 👩‍🍼|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
 👼|engel|gesicht|kind|märchen|putte
 🎅|weihnachten|weihnachtsmann|samichlaus
 🎅|weihnachten|weihnachtsmann|samichlaus
 🤶|weihnachten|weihnachtsfrau
 🤶|weihnachten|weihnachtsfrau
@@ -453,7 +454,7 @@
 🧌|fantasy|gruslig|kobold|märchen|monster|ork|troll|ungeheuer
 🧌|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
 💆|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
 💆‍♂️|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)
 💇|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
 💇‍♂️|friseur|frisur|haarschnitt|mann beim haareschneiden|salon|schere|coiffeur|männlich
 💇‍♀️|frau beim haareschneiden|friseur|haarschnitt|schere|coiffeur|weiblich
 💇‍♀️|frau beim haareschneiden|friseur|haarschnitt|schere|coiffeur|weiblich
@@ -478,11 +479,11 @@
 🏃|eilig|joggen|laufende person|läuferin|marathon|person|rennen|schnell|sport
 🏃|eilig|joggen|laufende person|läuferin|marathon|person|rennen|schnell|sport
 🏃‍♂️|joggen|jogger|laufender mann|marathon|rennen|männlich
 🏃‍♂️|joggen|jogger|laufender mann|marathon|rennen|männlich
 🏃‍♀️|athletin|frau|joggen|joggerin|laufende frau|läuferin|marathon|rennen|rennerin|rennt|schell|weiblich
 🏃‍♀️|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
 🕴️|anzug|geschäftlich|mann|schwebender mann im anzug|männlich
 👯|bunnys|doppelt|hasenohren|leute|party|personen mit hasenohren|seelenverwandt|tanzen|tänzerinnen|zwillinge
 👯|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
 👯‍♀️|bunnys|frauen mit hasenohren|hasenohren|party|weiblich
 🧖|abschalten|dampfbad|dampfsauna|entspannen|frau|luxuriös|person in dampfsauna|relaxen|sauna|spa
 🧖|abschalten|dampfbad|dampfsauna|entspannen|frau|luxuriös|person in dampfsauna|relaxen|sauna|spa
 🧖‍♂️|dampfsauna|mann in dampfsauna|sauna|männlich
 🧖‍♂️|dampfsauna|mann in dampfsauna|sauna|männlich
@@ -549,11 +550,12 @@
 👥|büsten|personen|silhouette mehrerer büsten
 👥|büsten|personen|silhouette mehrerer büsten
 🫂|abschied|danke|drücken|drücker|freundschaft|hallo|liebe|sich umarmende personen|tschüss|umarmung
 🫂|abschied|danke|drücken|drücker|freundschaft|hallo|liebe|sich umarmende personen|tschüss|umarmung
 👪|familie|junge|kind|mutter|vater
 👪|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
 👣|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
 🐵|affengesicht|banane|dschungel|gesicht|tier|zoo
 🐒|affe|tier
 🐒|affe|tier
 🦍|affe|gesicht|gorilla|tier
 🦍|affe|gesicht|gorilla|tier
@@ -649,7 +651,7 @@
 🐍|schlangenträger|sternzeichen|tierkreis
 🐍|schlangenträger|sternzeichen|tierkreis
 🐲|drachengesicht|gesicht|märchen|tier
 🐲|drachengesicht|gesicht|märchen|tier
 🐉|chinesisch neujahr|drache|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
 🦖|dinosaurier|saurier|t-rex|tree|tyrannosaurus rex
 🐳|blasender wal|meer|ozean|tier|wal
 🐳|blasender wal|meer|ozean|tier|wal
 🐋|ozean|tier|wal
 🐋|ozean|tier|wal
@@ -663,6 +665,11 @@
 🐚|muschel|schneckenhaus|strand|tier
 🐚|muschel|schneckenhaus|strand|tier
 🪸|great barrier reef|klimawandel|korallenriff|meer|ozean|riff|tier
 🪸|great barrier reef|klimawandel|korallenriff|meer|ozean|riff|tier
 🪼|autsch|brennen|gallert|glibber|meeresbewohner|meerestier|nesseltier|ozean|qualle|tentakeln
 🪼|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
 🐌|langsam|schnecke|tier
 🦋|insekt|schmetterling|schön
 🦋|insekt|schmetterling|schön
 🐛|gefräßig|insekt|raupe|tier|gefrässig
 🐛|gefräßig|insekt|raupe|tier|gefrässig
@@ -706,6 +713,7 @@
 🪹|heim|leeres nest|nestbau|nisten|vogelnest|zuhause
 🪹|heim|leeres nest|nestbau|nisten|vogelnest|zuhause
 🪺|heim|nest mit blauen eiern|nest mit eiern|nestbau|nisten|vogelnest|zuhause
 🪺|heim|nest mit blauen eiern|nest mit eiern|nestbau|nisten|vogelnest|zuhause
 🍄|fliegenpilz|giftig|pilz
 🍄|fliegenpilz|giftig|pilz
+🪾|kahler baum|karg|trocken|winter|baum ohne blätter|blätterlos|dürre|herbst
 🍇|frucht|obst|trauben|wein
 🍇|frucht|obst|trauben|wein
 🍈|cantaloupe|frucht|honigmelone|melone|obst
 🍈|cantaloupe|frucht|honigmelone|melone|obst
 🍉|frucht|melone|obst|wassermelone
 🍉|frucht|melone|obst|wassermelone
@@ -744,6 +752,7 @@
 🫚|gesund|gewürz|ginger ale|ingwerbier|scharf|wurzel|würzig|ginger beer|ingwerwurzel
 🫚|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
 🫛|bohne|edamame|erbsenschote|essen|gemüse|hülsenfrucht|hülsenfrüchte|schote
 🍄‍🟫|braun|essen|fungus|gemüse|lebensmittel|natur|pflanze|pilz|wald
 🍄‍🟫|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
 🍞|brotlaib|essen|kohlenhydrate|laib brot|toast|weißbrot|weizen|weissbrot
 🥐|corissant|croissant|französisch|frühstückshörnchen|brot
 🥐|corissant|croissant|französisch|frühstückshörnchen|brot
 🥖|baguette|brot|französisch|frühstück
 🥖|baguette|brot|französisch|frühstück
@@ -795,11 +804,6 @@
 🥟|chinesische teigtasche|dumpling|empanada|essen|gyōza|jiaozi|kloß|pierogi|potsticker|teigtasche|kloss
 🥟|chinesische teigtasche|dumpling|empanada|essen|gyōza|jiaozi|kloß|pierogi|potsticker|teigtasche|kloss
 🥠|essen|glückskeks|prophezeiung
 🥠|essen|glückskeks|prophezeiung
 🥡|chinesisches essen|essen|stäbchen|takeaway-box|takeaway-schachtel
 🥡|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|softeis
 🍧|eis|sorbet|wassereis|zerstoßen|zerstossen
 🍧|eis|sorbet|wassereis|zerstoßen|zerstossen
 🍨|eisbecher|eiscreme|eisdiele
 🍨|eisbecher|eiscreme|eisdiele
@@ -1204,6 +1208,7 @@
 🪘|afrikanische trommel|conga|handtrommel|instrument|musikinstrument|rhythmus|trommeln
 🪘|afrikanische trommel|conga|handtrommel|instrument|musikinstrument|rhythmus|trommeln
 🪇|cha-cha-cha|instrument|maracas|musikinstrument|musizieren|party|percussion|rasseln|tanzen|schütteln|trommel
 🪇|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
 🪈|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
 📱|handy|iphone|mobiltelefon|smartphone|telefonieren
 📲|anrufen|handy|iphone|kommunikation|mobiltelefon mit pfeil|pfeil|whatsapp
 📲|anrufen|handy|iphone|kommunikation|mobiltelefon mit pfeil|pfeil|whatsapp
 ☎️|anrufen|festnetz|telefon
 ☎️|anrufen|festnetz|telefon
@@ -1334,6 +1339,7 @@
 🧰|box|handkasten|kasten|kiste|mechaniker|rote kiste|werkzeugkasten|werkzeugkiste|werkzeugkoffer
 🧰|box|handkasten|kasten|kiste|mechaniker|rote kiste|werkzeugkasten|werkzeugkiste|werkzeugkoffer
 🧲|anziehungskraft|hufeisen|magnetisch|pole|positiv negativ|u-form
 🧲|anziehungskraft|hufeisen|magnetisch|pole|positiv negativ|u-form
 🪜|hochsteigen|holzleiter|klettern|leiter|sprosse|stufe
 🪜|hochsteigen|holzleiter|klettern|leiter|sprosse|stufe
+🪏|graben|loch|schippe|spaten|ausgraben|schaufeln|vergraben
 🧪|chemie|chemikalie|chemiker|experiment|labor|reagenzglas|substanz|versuche|wissenschaft
 🧪|chemie|chemikalie|chemiker|experiment|labor|reagenzglas|substanz|versuche|wissenschaft
 🧫|bakterienkultur|biologe|biologie|biologin|kultur|labor|petrischale|pipette|probe
 🧫|bakterienkultur|biologe|biologie|biologin|kultur|labor|petrischale|pipette|probe
 🧬|biologe|biologie|biologin|dna|dns|evolution|genetik|genmanipulation|leben
 🧬|biologe|biologie|biologin|dna|dns|evolution|genetik|genmanipulation|leben
@@ -1477,6 +1483,7 @@
 ➰|schleife|looping
 ➰|schleife|looping
 ➿|blau|doppelschleife|rechteck|schleife
 ➿|blau|doppelschleife|rechteck|schleife
 〽️|japanisch|teilalternationszeichen|zeichensetzung
 〽️|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
 🔠|abcd|buchstaben|großbuchstaben|großschreiben|eingabesymbol lateinische grossbuchstaben|grossbuchstaben|lateinische grossbuchstaben
 🔡|eingabesymbol lateinische kleinbuchstaben|kleinbuchstaben|lateinische kleinbuchstaben
 🔡|eingabesymbol lateinische kleinbuchstaben|kleinbuchstaben|lateinische kleinbuchstaben
 🔢|1234|eingabesymbol|symbol|zahlen|ziffern
 🔢|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
 🈳|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
 🈺|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
 🈵|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|kreis|orange scheibe|oranger kreis|oranger punkt|punkt
 🟡|form|gelbe scheibe|gelber kreis|gelber punkt|kreis|punkt|scheibe
 🟡|form|gelbe scheibe|gelber kreis|gelber punkt|kreis|punkt|scheibe
 🟢|form|grüne scheibe|grüner kreis|grüner punkt|kreis|punkt
 🟢|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|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|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ó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|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|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
 😙|arc|csókoló arc mosolygó szemmel|puszi|szem|szmájli
@@ -98,7 +98,7 @@
 🤗|arc|kezek|ölelés|szmájli
 🤗|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
 🤭|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
 🫢|á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|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ő
 🤔|arc|elgondolkodó|gondolkodó arc|gondolkozik|megfontol|szmájli|tűnődő
 🫡|derűs|igen|katonák|oké|tisztelgés|tisztelgő arc
 🫡|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|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|hazudik|hazudó fej|hazudós|hazug|hosszú orr|orr|pinokkió|szmájli
 🫨|arc|földrengés|meglepődés|rázkódó|rezeg
 🫨|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|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
 😔|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ú
 😪|álmos|arc|ásít|fáradt|sír|szmájli|szomorú
 🤤|arc|fej|folyik a nyála|nyáladzó|szmájli
 🤤|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|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 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 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
 🤕|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
 🩶|ezüst|pala|szív|szürke
 🤍|fehér|szív
 🤍|fehér|szív
 💋|ajkak|csóknyom|romantika|rúzsfolt|rúzsnyom|szenvedély
 💋|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
 💢|a düh szimbóluma|dühös|képregény|mérges
 💥|bumm|csattanás|képregény|robbanás|ütközés
 💥|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
 💫|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
 💨|elillan|ereget|ereszt|felhő|füst|futás|gyors|képregény|pukizik|púzik|rohanás|szellent
 🕳️|lyuk
 🕳️|lyuk
 💬|beszéd|buborék|gépel|képregény|párbeszéd|sms|szövegbuborék|üzenet
 💬|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ú
 👁️‍🗨️|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
 💭|á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
 👋|hello|integetés|integető kéz|kéz|szia|test|viszlát
 🤚|felemelt|kézfej
 🤚|felemelt|kézfej
 🖐️|állj|felemelt kéz szétálló ujjakkal|kéz|ne tovább|stop|szétálló|test|ujj
 🖐️|á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
 🧔|szakállas ember
 🧔‍♂️|férfi: szakáll|szakáll
 🧔‍♂️|férfi: szakáll|szakáll
 👱‍♂️|férfi|szőke
 👱‍♂️|férfi|szőke
-👩|hölgy|nő|szőke
+👩|felnőtt|hölgy|nő
 🧔‍♀️|nő: szakáll|szakáll
 🧔‍♀️|nő: szakáll|szakáll
 👱‍♀️|nő|szőke
 👱‍♀️|nő|szőke
 🧓|idősebb felnőtt|nemi szempontból semleges|öreg
 🧓|idősebb felnőtt|nemi szempontból semleges|öreg
@@ -319,7 +320,7 @@
 🙆|beleegyezés mutatása|kézjel|oké|rendben|tornázik
 🙆|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ó férfi|férfi|gesztus|kézmozdulat|oké|rendben|tornázik
 🙆‍♀️|beleegyezést mutató nő|gesztus|kézmozdulat|nő|oké
 🙆‍♀️|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
 💁‍♂️|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
 💁‍♀️|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
 🙋|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
 👨‍🏫|férfi|foglalkozás|oktató|professzor|tanár
 👩‍🏫|foglalkozás|nő|oktató|professzorasszony|tanárnő|tanítónő
 👩‍🏫|foglalkozás|nő|oktató|professzorasszony|tanárnő|tanítónő
 🧑‍⚖️|bíró / bírónő|mérleg
 🧑‍⚖️|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ő
 🧑‍🌾|földműves|gazda / női gazda|növénytermesztő
 👨‍🌾|farmer|férfi|foglalkozás|földműves|gazda|kertész
 👨‍🌾|farmer|férfi|foglalkozás|földműves|gazda|kertész
 👩‍🌾|farmer|foglalkozás|földműves|gazda|kertész|női gazda
 👩‍🌾|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
 🎅|arc|fej|karácsony|mikulás|télapó|ünneplés
 🤶|anyó|karácsony|mikulás felesége|mikulás ruhás anyó|ünnep
 🤶|anyó|karácsony|mikulás felesége|mikulás ruhás anyó|ünnep
 🧑‍🎄|ember|karácsony|mikulás|sapka|télapó|ünnepek
 🧑‍🎄|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
 🦸‍♂️|férfi szuperhős|hősnő|jó|szuperképesség
 🦸‍♀️|hősnő|jó|női szuperhős|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
 🦹|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
 🏃|futás|futó|gyors|maraton|siet|sport
 🏃‍♂️|férfi|futás|futó férfi|maraton|verseny
 🏃‍♂️|férfi|futás|futó férfi|maraton|verseny
 🏃‍♀️|futás|futónő|gyorsaság|maraton|női futó|sebesség|siet|sport|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
 🕴️|lebegő ember|öltönyös, lebegő ember|üzletember
 👯|bulizó emberek|lányok|nő|nyuszifül|parti
 👯|bulizó emberek|lányok|nő|nyuszifül|parti
 👯‍♂️|buil|bulizó férfiak|férfiak|ikrek|nyuszifül|partizik|party|táncol|táncos
 👯‍♂️|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
 🛀|fürdés|fürdik|fürdő ember|fürdőkád
 🛌|ágy|álmos|alszik|alvás|ember az ágyban|szálloda
 🛌|ágy|álmos|alszik|alvás|ember az ágyban|szálloda
 🧑‍🤝‍🧑|egymás kezét fogó emberek|fogás|kézenfogva|pár
 🧑‍🤝‍🧑|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|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
 💏|barátnő|csók|évforduló|pár|randevú|randi|romantika|szerelem|szív
 💑|csók|évforduló|pár szívvel|romantika|szerelem|szív
 💑|csók|évforduló|pár szívvel|romantika|szerelem|szív
 🗣️|arc|beszéd|beszélő fej|fej|sziluett
 🗣️|arc|beszéd|beszélő fej|fej|sziluett
 👤|árnyék|ember sziluettje melltől felfelé|mellszobor|sziluett
 👤|árnyék|ember sziluettje melltől felfelé|mellszobor|sziluett
 👥|emberek|két 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
 🫂|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
 👣|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|fej|majomfej
-🐒|állat|kismajom|majom
+🐒|állat|banán|majom
 🦍|állat|gorilla
 🦍|állat|gorilla
-🦧|emberszabású majom|majom|orangután
+🦧|állat|emberszabású majom|majom|orangután
 🐶|állat|fej|kedvenc|kisállat|kiskutya|kutyafej
 🐶|állat|fej|kedvenc|kisállat|kiskutya|kutyafej
 🐕|állat|háziállat|kisállat|kutya
 🐕|állat|háziállat|kisállat|kutya
 🦮|akadálymentesség|vakvezető kutya
 🦮|akadálymentesség|vakvezető kutya
@@ -578,7 +580,7 @@
 🫏|állat|csacsi|emlős|makacs|öszvér|szamár
 🫏|állat|csacsi|emlős|makacs|öszvér|szamár
 🐎|állat|derbi|fogadás|lovaglás|lovassport|lóverseny|lovi|sportfogadás|versenyló|versenyzés
 🐎|állat|derbi|fogadás|lovaglás|lovassport|lóverseny|lovi|sportfogadás|versenyló|versenyzés
 🦄|egyszarvú|fej|unikornisfej
 🦄|egyszarvú|fej|unikornisfej
-🦓|csík|zebra, állat, csík, csíkos
+🦓|állat|csíkos|zebra
 🦌|agancs|állat|szarvas
 🦌|agancs|állat|szarvas
 🦬|állat|bölény|csorda
 🦬|állat|bölény|csorda
 🐮|állat|fej|tehénfej|tej
 🐮|állat|fej|tehénfej|tej
@@ -595,8 +597,8 @@
 🐪|állat|dromedár|egypúpú teve|púposteve|sivatag|teve
 🐪|állat|dromedár|egypúpú teve|púposteve|sivatag|teve
 🐫|állat|kétpú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
 🦙|á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|gyapjas|kihalt|mamut|nagy|ormányos
 🦏|állat|orrszarvú|rinocérosz
 🦏|állat|orrszarvú|rinocérosz
 🦛|állat|víziló
 🦛|állat|víziló
@@ -608,7 +610,7 @@
 🐇|állat|háziállat|kedvenc|kisállat|nyúl|nyuszi
 🐇|állat|háziállat|kedvenc|kisállat|nyúl|nyuszi
 🐿️|állat|mogyoró|mókus
 🐿️|állat|mogyoró|mókus
 🦫|állat|fog|gát|hód
 🦫|á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|denevér|drakula|vámpír
 🐻|állat|fej|maci|medvefej
 🐻|állat|fej|maci|medvefej
 🐻‍❄️|fehér|jegesmedve|medve|sarkvidék
 🐻‍❄️|fehér|jegesmedve|medve|sarkvidék
@@ -652,17 +654,22 @@
 🦕|állat|brachiosaurus|brontosaurus|dínó|dinoszaurusz|diplodocus|kihalt|őslény|sauropoda
 🦕|á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|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|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|fóka|oroszlánfóka|tenger
 🐟|állatöv|csillagjegy|étel|halak|halászat|halászik|horoszkóp
 🐟|állatöv|csillagjegy|étel|halak|halászat|halászik|horoszkóp
 🐠|állat|díszhal|hal|trópusi
 🐠|állat|díszhal|hal|trópusi
 🐡|állat|gömbhal|hal
 🐡|állat|gömbhal|hal
 🦈|állat|cápa|hal
 🦈|állat|cápa|hal
-🐙|állat|oktopusz|polip
+🐙|állat|óceán|oktopusz|polip
 🐚|kagyló|spirális|tengeri csiga|tengerpart
 🐚|kagyló|spirális|tengeri csiga|tengerpart
 🪸|korallzátony|óceán|zátony
 🪸|korallzátony|óceán|zátony
 🪼|csíp|gerinctelen|jaj|kocsonyás|medúza|szúrószerv|tengeri
 🪼|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|csiga|lassú
 🦋|állat|lepke|pillangó|rovar|szép
 🦋|állat|lepke|pillangó|rovar|szép
 🐛|állat|bogár|hernyó|kukac|rovar|százlábú
 🐛|állat|bogár|hernyó|kukac|rovar|százlábú
@@ -706,13 +713,14 @@
 🪹|fészekrakás|üres fészek
 🪹|fészekrakás|üres fészek
 🪺|fészek tojásokkal|fészekrakás|tojások
 🪺|fészek tojásokkal|fészekrakás|tojások
 🍄|gomba|növény
 🍄|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|szőlő
 🍈|étel|gyümölcs|növény|sárgadinnye
 🍈|étel|gyümölcs|növény|sárgadinnye
 🍉|dinnye|étel|görögdinnye|gyümölcs|növény
 🍉|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
 🍋|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
 🍋‍🟩|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
 🍍|ananász|étel|gyümölcs|növény
 🥭|déligyümölcs|étel|gyümölcs|mangó|trópusi
 🥭|déligyümölcs|étel|gyümölcs|mangó|trópusi
 🍎|alma|egészség|érett|étel|gyümölcs|növény|piros
 🍎|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
 🫚|fűszer|gyökér|gyömbérgyökér|sör
 🫛|bab|borsóhüvely|edamame|hüvelyes|zöldség
 🫛|bab|borsóhüvely|edamame|hüvelyes|zöldség
 🍄‍🟫|barna gomba|étel|gomba|portobello|szarvasgomba|természet|vega|vegán|vegetariánus
 🍄‍🟫|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
 🍞|étel|kenyér|vekni
 🥐|croissant|étel|francia|kifli|péksütemény|péksüti|reggeli
 🥐|croissant|étel|francia|kifli|péksütemény|péksüti|reggeli
 🥖|bagett|étel|francia|kenyér
 🥖|bagett|étel|francia|kenyér
@@ -761,7 +770,7 @@
 🍟|étel|gyorsétel|gyorskaja|hasábburgonya|krumpli|sült krumpli|sültkrumpli
 🍟|étel|gyorsétel|gyorskaja|hasábburgonya|krumpli|sült krumpli|sültkrumpli
 🍕|étel|pepperoni|pizza|sajtos|szelet
 🍕|étel|pepperoni|pizza|sajtos|szelet
 🌭|étel|hot dog|hotdog|kifli|kolbász|mustár|virsli
 🌭|étel|hot dog|hotdog|kifli|kolbász|mustár|virsli
-🥪|kenyér|szendvics, kenyér, étel
+🥪|kenyér|szendvics
 🌮|étel|mexikói|taco
 🌮|étel|mexikói|taco
 🌯|burrito|étel|mexikói
 🌯|burrito|étel|mexikói
 🫔|étel|felcsavart|mexikói|tamale
 🫔|étel|felcsavart|mexikói|tamale
@@ -777,7 +786,7 @@
 🍿|étel|kukorica|mozi|pattogatott kukorica
 🍿|étel|kukorica|mozi|pattogatott kukorica
 🧈|tejtermék|vaj
 🧈|tejtermék|vaj
 🧂|dühös|fűszer|íz|sószóró
 🧂|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
 🍱|bento|doboz|ételdoboz|japán ételdoboz
 🍘|étel|japán|keksz|rizskeksz
 🍘|étel|japán|keksz|rizskeksz
 🍙|étel|golyó|japán|rizsgolyó
 🍙|é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
 🥟|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
 🥠|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
 🥡|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|gépi fagylalt|lágyfagylalt|tölcséres fagylalt
 🍧|desszert|édesség|étel|fagyi|fagylalt öntettel|öntet
 🍧|desszert|édesség|étel|fagyi|fagylalt öntettel|öntet
 🍨|desszert|édesség|étel|fagyi|fagylaltkehely
 🍨|desszert|édesség|étel|fagyi|fagylaltkehely
@@ -1139,7 +1143,7 @@
 🧣|hideg|nyak|ruházat|sál
 🧣|hideg|nyak|ruházat|sál
 🧤|kesztyű, kék kesztyű, kéz|kéz
 🧤|kesztyű, kék kesztyű, kéz|kéz
 🧥|dzseki|hideg|kabát|ruházat|télikabát
 🧥|dzseki|hideg|kabát|ruházat|télikabát
-🧦|harisnya|zokni, harisnya
+🧦|harisnya|zokni
 👗|ruha|ruházat|vásárlás
 👗|ruha|ruházat|vásárlás
 👘|japán|kimonó|ruha|ruházat
 👘|japán|kimonó|ruha|ruházat
 🥻|indiai ruha|ruha|ruházat|szári
 🥻|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
 💎|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
 🔇|csendes|elnémított hangszóró|hangerő|hangszóró|néma|némított
 🔈|hangerő|hangszóró
 🔈|hangerő|hangszóró
-🔉|alacsony hangerő|bekapcsolt hangszóró|hangerő|hangszóró
+🔉|hangerő|hangszóró|közepes
 🔊|hangos|hangszóró|nagy hangerő|zene
 🔊|hangos|hangszóró|nagy hangerő|zene
 📢|hangosbeszélő|kikiált|közhírré tesz|közlemények|megafon
 📢|hangosbeszélő|kikiált|közhírré tesz|közlemények|megafon
 📣|hangosbeszélő|megafon|szurkolás
 📣|hangosbeszélő|megafon|szurkolás
@@ -1204,6 +1208,7 @@
 🪘|dob|hangszer|hosszú dob|konga|ritmus|ütem
 🪘|dob|hangszer|hosszú dob|konga|ritmus|ütem
 🪇|csörgő|hangszer|ráz|rumbatök|ütőhangszer|zene
 🪇|csörgő|hangszer|ráz|rumbatök|ütőhangszer|zene
 🪈|blockflöte|fafúvós|fife|furulya|fuvola|zene
 🪈|blockflöte|fafúvós|fife|furulya|fuvola|zene
+🪉|ámor|hangszer|hárfa|szerelem|zenekar
 📱|kommunikáció|mobiltelefon|rádiótelefon|telefon
 📱|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
 📲|hívás|kommunikáció, hívásfogadás|mobiltelefon nyíllal|nyíl|rádiótelefon|telefon
 ☎️|telefon
 ☎️|telefon
@@ -1264,7 +1269,7 @@
 💷|bankjegy|bankó|font|gazdag|készpénz|papírpénz|pénznem|valuta
 💷|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
 💸|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
 💳|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
 💹|bank|diagram|emelkedés|felfelé|jen|növekedés|növekvő jendiagram|pénznem|piac|trend|valuta
 📧|e-mail|email|levél
 📧|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
 📨|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
 🧰|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
 🧲|mágneses|negatív|patkómágnes|pozitív|vonzás|vonzódás
 🪜|fok|létrafok|mászá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
 🧪|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
 🧫|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
 🧬|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ő|sötétítés gomb
 🔆|fényerő|világosítás gomb
 🔆|fényerő|világosítás gomb
 📶|antennasávok|mobiltelefon|térerő
 📶|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
 📳|mobiltelefon|rádiótelefon|rezgés|rezgő mód|telefon|tiltott
 📴|kikapcsolva|mobiltelefon|rádiótelefon|telefon|tiltott
 📴|kikapcsolva|mobiltelefon|rádiótelefon|telefon|tiltott
 ⚧️|transznemű szimbólum
 ⚧️|transznemű szimbólum
@@ -1477,6 +1483,7 @@
 ➰|hurok
 ➰|hurok
 ➿|dupla|hurok
 ➿|dupla|hurok
 〽️|jel|részelválasztó|választó
 〽️|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|latin|nagybetűs
 🔡|abcd|betűk|bevitel|kisbetűs|latin
 🔡|abcd|betűk|bevitel|kisbetűs|latin
 🔢|1234|bevitel|számbevitel|számok
 🔢|1234|bevitel|számbevitel|számok
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|anglia
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|anglia
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|skócia
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|skócia
-🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🏴󠁧󠁢󠁷󠁬󠁳󠁿|wales
+🇨🇶|sark

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

@@ -66,50 +66,50 @@
 〰️|onda|ondulato|trattino
 〰️|onda|ondulato|trattino
 ㊗️|cinese|congratulazioni|giapponese|ideogramma giapponese di congratulazioni
 ㊗️|cinese|congratulazioni|giapponese|ideogramma giapponese di congratulazioni
 ㊙️|cinese|giapponese|ideogramma giapponese di segreto|segreto
 ㊙️|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
 😄|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
 😁|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
 😆|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
 🙂|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
 🙃|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
 😉|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
 😊|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|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
 😍|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
 😗|appuntamento|bacio|bocca|buona notte|faccina che manda bacio|flirt|sbaciucchiare
 ☺️|contorno faccina sorridente|delineata|emozionarsi|faccina|felice|rilassata|sorridente
 ☺️|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
 😚|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
 😙|appuntamento|bacetti|buona notte|faccina che manda baci|occhi chiusi|occhi sorridenti|sorriso
 🥲|commosso|dolore|emozionato|faccina sorridente con lacrima|felice|lacrima|orgoglioso|rincuorato
 🥲|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
 😛|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
 🤪|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
 😝|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
 🤗|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
 🫣|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
 🤫|dito|faccina che zittisce|muto|non parlare|segreto|silenzioso|zittire|zitto
 🤔|arrovellarsi|concentrarsi|dubbio|faccina che pensa|faccina concentrata|mmm|pensare|scervellarsi
 🤔|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
 🫡|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
 🤐|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
 🤨|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
 😑|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
 😶|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
 🫥|depresso|faccina tratteggiata|introverso|invisibile|nascondersi|scomparire|sparire
 😶‍🌫️|annebbiato|distratto|sbadato|testa tra le nuvole
 😶‍🌫️|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
 😒|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è
 🙄|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
 😬|dentista|digrignare i denti|faccina con smorfia|smorfia
@@ -119,33 +119,34 @@
 🙂‍↔️|no|scuotere la testa in senso orizzontale
 🙂‍↔️|no|scuotere la testa in senso orizzontale
 🙂‍↕️|annuire|scuotere la testa in senso verticale|sì
 🙂‍↕️|annuire|scuotere la testa in senso verticale|sì
 😌|faccina con sorriso|pace|sollevato|sollievo|tranquillità|tranquillo|zen
 😌|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
 😪|assonnato|dormire|faccina assonnata|goccia|sonno|stanco|zzz
 🤤|bava|che buono|faccina che sbava|felice|figata|sbavare
 🤤|bava|che buono|faccina che sbava|felice|figata|sbavare
 😴|assonnato|buona notte|dormire|faccina che dorme|pisolino|sonno|stanco|zzz
 😴|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
 🤒|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
 🤕|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|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 vomita|malato|male|nausea|sputare|sto male|verde|vomitare|vomito
 🤧|faccina che starnutisce|faccina con fazzoletto|faccina con raffreddore|fazzoletto|malato|raffreddore|starnutire|starnuto
 🤧|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
 😵|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
 😵‍💫|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
 🤠|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
 🥸|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
 🤓|faccina|nerd|occhiali da nerd|secchione|studioso
 🧐|antico|classe|faccina con monocolo|fighetto|monocolo|occhiale|ricco|sospetto
 🧐|antico|classe|faccina con monocolo|fighetto|monocolo|occhiale|ricco|sospetto
 😕|confuso|deluso|faccina|forse|non so|peccato|triste|uffa
 😕|confuso|deluso|faccina|forse|non so|peccato|triste|uffa
 🫤|confuso|così così|deluso|dubbioso|faccina perplessa|mah|meh|perplesso|scettico
 🫤|confuso|così così|deluso|dubbioso|faccina perplessa|mah|meh|perplesso|scettico
 😟|ansioso|faccina|nodo allo stomaco|preoccupato|preoccupazione|triste
 😟|ansioso|faccina|nodo allo stomaco|preoccupato|preoccupazione|triste
 🙁|corrucciato|faccina leggermente imbronciata|imbronciato|mettere il muso|mi dispiace|triste|un po’ imbronciato
 🙁|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
 😯|faccina|incredulo|omg|sbalordito|sorpresa|sorpreso|wow
 😲|cosa?|davvero|faccina|non ci credo|oddio|omg|scioccato|sorpresa|sorpreso|stupito
 😲|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
 😳|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
 😦|bocca aperta|corrucciata|faccina imbronciata con bocca aperta|male|noo|paura|sorpresa|wow
 😧|angosciato|ansia|ansioso|faccina|infelice|paura|sofferente|stressato|triste
 😧|angosciato|ansia|ansioso|faccina|infelice|paura|sofferente|stressato|triste
 😨|ansia|ansioso|esami|faccina|fifa blu|impaurito|paura|preoccupato|spaventato|spavento
 😨|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
 😥|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
 😢|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
 😭|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
 😱|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
 😖|arrabbiato|concentrato|confuso|doh|faccia|faccina|frustrato|scontento|stressato|triste|uffa
 😣|concentrato|faccina che pensa|faccina concentrata|pensare|perseverante
 😣|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
 😓|ci è mancato poco|delusione|faccina abbattuta sudata|faccina sudata|goccia|malato|sudore|triste
 😩|arrabbiato|disperato|esausto|faccina che piange|nooo|piangere|sfinito|stanco
 😩|arrabbiato|disperato|esausto|faccina che piange|nooo|piangere|sfinito|stanco
 😫|disperato|faccina|stanco|triste
 😫|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
 😤|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|broncio|faccina accigliata|faccina rossa|furioso|imbronciato|male|muso|odio
 😠|arrabbiato|che odio|faccina|frustrato|furia|infuriato|non mi piace|odio|rabbia
 😠|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
 🤡|carnevale|circo|clown|faccina del clown|it|maschera|pagliaccio|teatro
 👹|creature|diavolo|faccina|favola|fiaba|finzione|maschera|mostro|orco|paura
 👹|creature|diavolo|faccina|favola|fiaba|finzione|maschera|mostro|orco|paura
 👺|arrabbiato|carnevale|cattivo|crudele|diavolo|favola|fiaba|folletto|goblin|malefico|mostro
 👺|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|et|extraterrestre|faccina|favola|marziani|mostro|spazio|ufo
 👾|alieno|arcade|creatura|faccina viola|favola|gif|mostro|pixel|ufo|video gioco|videogioco
 👾|alieno|arcade|creatura|faccina viola|favola|gif|mostro|pixel|ufo|video gioco|videogioco
 🤖|faccina di robot|robot|tecnologia
 🤖|faccina di robot|robot|tecnologia
@@ -192,9 +193,9 @@
 😾|arrabbiato|broncio|faccina|gatto imbronciato|infelice|muso
 😾|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
 🙈|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|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
 💌|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 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|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
 💗|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
 💤|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
 👋|a dopo|ci sei?|ci vediamo|ciaone|gesto di saluto|mano aperta|mano che saluta|salutare|schiaffo
 🤚|alzata|ciaone|dorso mano alzata|mano
 🤚|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
 ✋|alzata|carta|cinque|mano aperta
 🖖|mano aperta|mano di spock|saluto vulcaniano|spock
 🖖|mano aperta|mano di spock|saluto vulcaniano|spock
 🫱|dare la mano|destra|mano rivolta a destra|verso destra
 🫱|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
 🫲|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ò
 🫳|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
 🫴|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
 👌|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
 🤏|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
 ✌️|due|forbice|mano|segno di vittoria|vittoria|yeah
 🤞|buona fortuna|dita incrociate|fortuna|incrociare le dita|mano
 🤞|buona fortuna|dita incrociate|fortuna|incrociare le dita|mano
 🫰|amore|caro|costa|costoso|cuore|denaro|mano con indice e pollice incrociati|schioccare|soldi
 🫰|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
 🤟|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
 🤙|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
 👈|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
 👉|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 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 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
 🫵|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
 👎|giù|in basso|mano|non mi piace|pollice abbassato|pollice in giù|pollice verso|segno
 ✊|alzato|lotta|mano|pugno chiuso|sasso|solidarietà
 ✊|alzato|lotta|mano|pugno chiuso|sasso|solidarietà
 👊|d’accordo|mano|ok|patto|pugno chiuso|rock|sì
 👊|d’accordo|mano|ok|patto|pugno chiuso|rock|sì
 🤛|mano chiusa|pugno a sinistra|sinistra
 🤛|mano chiusa|pugno a sinistra|sinistra
 🤜|destra|pugno a destra
 🤜|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
 🫶|amore|cuore|mani a cuore|mano|ti amo|ti voglio bene
 👐|abbracciare|abbraccio|accogliere|aperta|aperte|mani|mano|segno delle mani aperte
 👐|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
 🤲|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
 🙏|gesto|grazie|mani giunte|mano|per favore|pregare|preghiera|ti prego
 ✍️|disegnare|mano che scrive|penna|scrivere a mano
 ✍️|disegnare|mano che scrive|penna|scrivere a mano
 💅|cosmetici|make up|manicure|noia|smalto per unghie|spa|unghie con smalto
 💅|cosmetici|make up|manicure|noia|smalto per unghie|spa|unghie con smalto
 🤳|autoscatto|fare un selfie|fotocamera|fotografare|fotografia|scattare|selfie|smartphone|telefono
 🤳|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à|braccio meccanico|protesi robotica per il braccio
 🦿|accessibilità|gamba meccanica|protesi robotica per la gamba
 🦿|accessibilità|gamba meccanica|protesi robotica per la gamba
 🦵|arto|calcio|gamba piegata|ginocchio piegato|piede|polpaccio
 🦵|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
 👴|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
 👵|anziana|capelli bianchi|donna|nonna|nonnina|persone|saggezza|saggia|signora|vecchia|vecchietta
 🙍|arrabbiata|corrucciata|delusa|donna|faccia|frustrata|gesto|infelice|persona|triste
 🙍|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
 🙍‍♀️|corrucciata|donna|femmina|gesto
 🙎|arrabbiata|broncio|delusa|donna|gesto|imbronciata|persona|seccata|sguardo arrabbiato
 🙎|arrabbiata|broncio|delusa|donna|gesto|imbronciata|persona|seccata|sguardo arrabbiato
 🙎‍♂️|arrabbiato|broncio|disappunto|gesto|imbronciato|maschio|person|uomo
 🙎‍♂️|arrabbiato|broncio|disappunto|gesto|imbronciato|maschio|person|uomo
 🙎‍♀️|donna|femmina|gesto|imbronciata
 🙎‍♀️|donna|femmina|gesto|imbronciata
 🙅|donna|escluso|faccina|gesto di rifiuto|non bene|persona che fa segno di no|rifiuto|stop|vietato
 🙅|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 gesto di rifiuto|no|proibito|rifiuto
 🙆|donna con braccia alzate|esercizio|fitness|gesto|mani|ok|persona con gesto ok|tutto bene|yoga
 🙆|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
 🙆‍♀️|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|sfacciataggine|sul serio
 💁‍♂️|aiuto|capovolgere la mano|gesto con i capelli|gossip|informazioni|mano all’insù|pettegolezzo|sarcasmo|sarcastico|sfacciato
 💁‍♂️|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
 🤦‍♂️|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
 🤦‍♀️|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|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
 🧑‍⚕️|infermiera|infermiere|medico|persona che lavora nella sanità|sanità|terapista
 👨‍⚕️|camice|dottore|infermiere|lavoro|medicina|medico|operatore sanitario|ospedale|sanità|terapista|uomo
 👨‍⚕️|camice|dottore|infermiere|lavoro|medicina|medico|operatore sanitario|ospedale|sanità|terapista|uomo
 👩‍⚕️|camice|donna|dottoressa|infermiera|lavoro|medicina|medico|operatrice sanitaria|ospedale|sanità|terapista
 👩‍⚕️|camice|donna|dottoressa|infermiera|lavoro|medicina|medico|operatrice sanitaria|ospedale|sanità|terapista
@@ -452,7 +453,7 @@
 🧟‍♀️|morto vivente|zombie donna
 🧟‍♀️|morto vivente|zombie donna
 🧌|fantasia|favola|fiaba|mostro|troll
 🧌|fantasia|favola|fiaba|mostro|troll
 💆|centro estetico|estetista|faccia|mal di testa|massaggio facciale|persona che riceve un massaggio|relax|spa|testa
 💆|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
 💆‍♀️|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|parrucchiera|parrucchiere|persona|salone di bellezza|tagliare|taglio di capelli
 💇‍♂️|acconciatura|bellezza|capelli|parrucchiere|persona|salone di bellezza|tagliare|taglio di capelli|uomo
 💇‍♂️|acconciatura|bellezza|capelli|parrucchiere|persona|salone di bellezza|tagliare|taglio di capelli|uomo
@@ -482,7 +483,7 @@
 🕺|ballare|ballo|discoteca|lavoro|uomo che balla
 🕺|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
 🕴️|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
 👯|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
 👯‍♀️|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|benessere|hammam|persona in sauna|persona nella sauna|relax|sauna|spa
 🧖‍♂️|bagno turco|sauna|uomo in sauna
 🧖‍♂️|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
 🏌️‍♀️|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
 🏄|mare|onde|persona che fa surf|spiaggia|sport|surfare|tavola
 🏄‍♂️|sport|surfista uomo|tavola da surf|uomo
 🏄‍♂️|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 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|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
 🚣‍♀️|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
 🛀|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
 🛌|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
 🧑‍🤝‍🧑|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
 👫|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|appuntamento|baciarsi|bacio tra coppia|coppia|coppietta|fidanzati|persone|romanticismo|romantico
 💑|amore|anniversario|bacio|coppia con cuore|cuore|innamorati|insieme|persone|romanticismo
 💑|amore|anniversario|bacio|coppia con cuore|cuore|innamorati|insieme|persone|romanticismo
 🗣️|parlare|persona che parla|profilo|urlare
 🗣️|parlare|persona che parla|profilo|urlare
@@ -554,6 +555,7 @@
 🧑‍🧒|famiglia: persona adulta, minore|minore
 🧑‍🧒|famiglia: persona adulta, minore|minore
 🧑‍🧒‍🧒|famiglia: persona adulta, minore, minore|minore
 🧑‍🧒‍🧒|famiglia: persona adulta, minore, minore|minore
 👣|camminare|corpo|impronta di piedi|impronte|passi|passo|piede|piedi nudi
 👣|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|faccina|scimmia|scimmietta
 🐒|animale|scimmietta|selvatico
 🐒|animale|scimmietta|selvatico
 🦍|animale|foresta|scimmia|selvatico
 🦍|animale|foresta|scimmia|selvatico
@@ -569,7 +571,7 @@
 🐱|animale|animali|faccina|gatto|muso di gatto
 🐱|animale|animali|faccina|gatto|muso di gatto
 🐈|animale|cucciolo|domestico|gatta|gattina|gattino|miao|micino|micio
 🐈|animale|cucciolo|domestico|gatta|gattina|gattino|miao|micino|micio
 🐈‍⬛|animale|felino|gatto|halloween|miao|micio|nero|sfiga|sfortuna
 🐈‍⬛|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|faccina|felino|muso di tigre|tigre
 🐅|animale|animali|felino|predatore|tigre
 🐅|animale|animali|felino|predatore|tigre
 🐆|animale|felino|leopardo|predatore|selvatico
 🐆|animale|felino|leopardo|predatore|selvatico
@@ -642,7 +644,7 @@
 🐦‍⬛|animale|cornacchia|corvo|merlo|nero|uccello
 🐦‍⬛|animale|cornacchia|corvo|merlo|nero|uccello
 🪿|animale|oca|papera|pollame|starnazzare|stupidità|uccello
 🪿|animale|oca|papera|pollame|starnazzare|stupidità|uccello
 🐦‍🔥|fantasia|fenice|immortale|mitologia|personaggio|reincarnazione|reinventarsi|rinascita|trasformazione|uccello di fuoco
 🐦‍🔥|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|coccodrillo|lacrime di coccodrillo|rettile|selvatico
 🐢|animale|animali|lenta|lentezza|lento|tartaruga
 🐢|animale|animali|lenta|lentezza|lento|tartaruga
 🦎|animale|animali|lucertola|rettile
 🦎|animale|animali|lucertola|rettile
@@ -663,6 +665,11 @@
 🐚|animale|conchiglia a spirale|mare|oceano|spiaggia
 🐚|animale|conchiglia a spirale|mare|oceano|spiaggia
 🪸|barriera corallina|cambiamento climatico|corallo|mare|oceano
 🪸|barriera corallina|cambiamento climatico|corallo|mare|oceano
 🪼|animale|bruciatura|dolore|invertebrato|mare|medusa|puntura|trasparente|urticante
 🪼|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
 🐌|animale|giardino|lentezza|lento|lumachina|lumacone|natura
 🦋|ali|animale|colorata|insetto
 🦋|ali|animale|colorata|insetto
 🐛|animale|bruco|giardino|millepiedi
 🐛|animale|bruco|giardino|millepiedi
@@ -679,7 +686,7 @@
 🪰|animale|decomposizione|infestante|insetto volante|larva|malattia|mosca|moscone|volare
 🪰|animale|decomposizione|infestante|insetto volante|larva|malattia|mosca|moscone|volare
 🪱|anellide|animale|lombrico|parassita|strisciare|verme
 🪱|anellide|animale|lombrico|parassita|strisciare|verme
 🦠|ameba|batterio|microbo|scienza|virus
 🦠|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
 🌸|ciliegio|fiore di ciliegio|fiorito|natura|pianta|primavera|primula|rosa
 💮|fiore bianco|fiorellino|simbolo ben fatto
 💮|fiore bianco|fiorellino|simbolo ben fatto
 🪷|bellezza|buddhismo|fior di loto|fiore|india|induismo|loto|purezza|serenità|vietnam|yoga
 🪷|bellezza|buddhismo|fior di loto|fiore|india|induismo|loto|purezza|serenità|vietnam|yoga
@@ -706,6 +713,7 @@
 🪹|nidificazione|nido vuoto
 🪹|nidificazione|nido vuoto
 🪺|nidificazione|nido con uova|nido di uccelli|uccelli|uova
 🪺|nidificazione|nido con uova|nido di uccelli|uccelli|uova
 🍄|amanita|autunno|biancaneve|bosco|favola|fiaba|funghetto|fungo|natura|velenoso
 🍄|amanita|autunno|biancaneve|bosco|favola|fiaba|funghetto|fungo|natura|velenoso
+🪾|inverno|senza foglie|siccità
 🍇|cibo|dioniso|frutta|frutto|grappolo d’uva|uva|vino|viola
 🍇|cibo|dioniso|frutta|frutto|grappolo d’uva|uva|vino|viola
 🍈|cantaloupe|cibo|frutta|frutto|melone|oliva
 🍈|cantaloupe|cibo|frutta|frutto|melone|oliva
 🍉|anguria|cibo|frutta|frutto
 🍉|anguria|cibo|frutta|frutto
@@ -744,13 +752,14 @@
 🫚|birra|radice di zenzero|salute|spezia|zenzero
 🫚|birra|radice di zenzero|salute|spezia|zenzero
 🫛|baccello di piselli|cibo|edamame|legume|pisello|vegetale|verdura
 🫛|baccello di piselli|cibo|edamame|legume|pisello|vegetale|verdura
 🍄‍🟫|autunno|bosco|champignon|cibo|fungo marrone|natura|porcino|vegano|vegetale|vegetariano
 🍄‍🟫|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
 🍞|carboidrati|cereali|cibo|pancarré|pane a cassetta|pane in cassetta|ristorante|toast
 🥐|bar|cibo|colazione|cornetto|croissant|dolce|francese|zucchero
 🥐|bar|cibo|colazione|cornetto|croissant|dolce|francese|zucchero
 🥖|baguette|carboidrati|cibo|filone|francese|francia|pane
 🥖|baguette|carboidrati|cibo|filone|francese|francia|pane
 🫓|arepa|cibo|focaccia|lavash|naan|pane|piadina|pita|tigella
 🫓|arepa|cibo|focaccia|lavash|naan|pane|piadina|pita|tigella
 🥨|brezel|cibo|pane|pretzel
 🥨|brezel|cibo|pane|pretzel
 🥯|bagel|ciambella di pane|colazione|panetteria|panificio|spalmare formaggio sul bagel
 🥯|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
 🧇|cialda|cibo|colazione|gaufre|waffle
 🧀|cibo|fetta di formaggio|formaggio|gruviera
 🧀|cibo|fetta di formaggio|formaggio|gruviera
 🍖|barbecue|carne con osso|cibo|fame|osso|ristorante
 🍖|barbecue|carne con osso|cibo|fame|osso|ristorante
@@ -790,16 +799,11 @@
 🍣|cibo|cucina|giapponese|riso|ristorante|salmone|sushi
 🍣|cibo|cucina|giapponese|riso|ristorante|salmone|sushi
 🍤|cibo|gamberetto|gambero fritto|ristorante|tempura
 🍤|cibo|gamberetto|gambero fritto|ristorante|tempura
 🍥|cibo|crocchetta di pesce|cucina giapponese|giapponese|pesce|ristorante|rotolo di pesce|spirale|tortino di pesce a spirale
 🍥|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
 🍡|dango|dolcetto|palline di mochi|ristorante|spiedino di mochi
 🥟|cibo|dumpling|empanada|fagottino|gyoza|jiaozi|pierogi|ravioli|raviolo
 🥟|cibo|dumpling|empanada|fagottino|gyoza|jiaozi|pierogi|ravioli|raviolo
 🥠|biscotto della fortuna|cibo|cinese|consiglio|profezia|suggerimento
 🥠|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
 🥡|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
 🍦|bar|cono|crema|dessert|dolce|estate|gelateria|gelato|ristorante|zucchero
 🍧|cibo|estate|ghiaccio|granita siciliana|sicilia
 🍧|cibo|estate|ghiaccio|granita siciliana|sicilia
 🍨|cibo|coppa di gelato|crema|dessert|dolce|estate|gelateria|gelato|ristorante|zucchero
 🍨|cibo|coppa di gelato|crema|dessert|dolce|estate|gelateria|gelato|ristorante|zucchero
@@ -819,13 +823,13 @@
 🫖|bere|cibo|tè|teiera|thè
 🫖|bere|cibo|tè|teiera|thè
 🍵|bere|bevanda|pomeriggio|sete|tazza da tè senza manico|tazza di tè|tazzina|tè
 🍵|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è
 🍶|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
 🍷|alcool|bar|bere|bicchiere di vino|calice|enoteca|ristorante|vino
 🍸|alcolico|bar|bere|bevanda|bicchiere da cocktail|calice|cocktail|drink|ristorante
 🍸|alcolico|bar|bere|bevanda|bicchiere da cocktail|calice|cocktail|drink|ristorante
 🍹|alcool|bar|bere|club|cocktail|drink|ristorante|tropicale
 🍹|alcool|bar|bere|club|cocktail|drink|ristorante|tropicale
 🍺|alcool|bar|bere|birra|boccale di birra|estate|germania|octoberfest|pinta|pub|ristorante|sete
 🍺|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
 🥃|alcool|bevanda|bicchiere|drink|liquore|tumbler|whisky
 🫗|bevanda|bicchiere rovesciato|drink|liquido versato|rovesciare|svuotare|versare
 🫗|bevanda|bicchiere rovesciato|drink|liquido versato|rovesciare|svuotare|versare
 🥤|acqua|bevanda|bevande|bibita gasata|bicchiere con cannuccia|cannuccia|succo
 🥤|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
 🧊|cubetto di ghiaccio|freddo|gelo|ghiaccio in cubetti|ghiaccio in cubi
 🥢|bacchette|bastoncini|cibo asiatico|hashi|jeotgarak|kuaizi
 🥢|bacchette|bastoncini|cibo asiatico|hashi|jeotgarak|kuaizi
 🍽️|apparecchiare|cena|coltello|fame|forchetta|mangiare|piatto e posate|posate|pranzo|tavola
 🍽️|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
 🥄|cucchiaino|cucchiaio|cucina|posate|stoviglie|utensili
 🔪|arma|chef|coltello da cucina|cucina|fame|posate
 🔪|arma|chef|coltello da cucina|cucina|fame|posate
 🫙|barattolo|condimento|conservare|contenitore|dispensa|salsa|sugo|vuoto
 🫙|barattolo|condimento|conservare|contenitore|dispensa|salsa|sugo|vuoto
@@ -864,7 +868,7 @@
 🪵|ceppo|ciocco|legname|legno|tronco
 🪵|ceppo|ciocco|legname|legno|tronco
 🛖|capanna|capanno|casa|iurta|rifugio
 🛖|capanna|capanno|casa|iurta|rifugio
 🏘️|casa|casetta|casette|cittadina|edifici|quartiere|residenziale|via|vicinato|vicini|vicino
 🏘️|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 di campagna|casetta|edificio|fattoria|villetta
 🏡|abitazione|casa con giardino|casa di campagna|casetta|edificio|giardino|nido|villa|villetta
 🏡|abitazione|casa con giardino|casa di campagna|casetta|edificio|giardino|nido|villa|villetta
 🏢|edificio di uffici|edifico di uffici|palazzo|ufficio
 🏢|edificio di uffici|edifico di uffici|palazzo|ufficio
@@ -913,7 +917,7 @@
 🚇|metropolitana|mezzo|trasporti|trasporto|veicolo|viaggiare
 🚇|metropolitana|mezzo|trasporti|trasporto|veicolo|viaggiare
 🚈|arrivare|ferrovia|metrotranvia|mezzo|monorotaia|tram|trasporti|trasporto|treno|veicolo|viaggiare
 🚈|arrivare|ferrovia|metrotranvia|mezzo|monorotaia|tram|trasporti|trasporto|treno|veicolo|viaggiare
 🚉|arrivo|fermata|ferrovia|ritardo|stazione|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
 🚝|mezzo|monorotaia|trasporti|trasporto|veicolo|veloce|viaggiare
 🚞|ferrovia di montagna|montagna|trasporti|treno di montagna|veicolo|viaggiare
 🚞|ferrovia di montagna|montagna|trasporti|treno di montagna|veicolo|viaggiare
 🚋|filobus|mezzo|tram|trasporti|trasporto|vagone del tram|veicolo
 🚋|filobus|mezzo|tram|trasporti|trasporto|vagone del tram|veicolo
@@ -924,7 +928,7 @@
 🚑|ambulanza|croce rossa|emergenza|incidente|mezzo|ospedale|trasporto|veicolo
 🚑|ambulanza|croce rossa|emergenza|incidente|mezzo|ospedale|trasporto|veicolo
 🚒|autopompa|camion dei pompieri|emergenza|incendio|mezzo|pompieri|veicolo|vigili del fuoco
 🚒|autopompa|camion dei pompieri|emergenza|incendio|mezzo|pompieri|veicolo|vigili del fuoco
 🚓|auto|carabinieri|gazzella|macchina della polizia|polizia|veicolo
 🚓|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
 🚕|auto|guidare|mezzo|tassì|taxi giallo|trasporto|veicolo
 🚖|mezzo|tassì|taxi giallo|taxi in arrivo|trasporti|trasporto|veicolo
 🚖|mezzo|tassì|taxi giallo|taxi in arrivo|trasporti|trasporto|veicolo
 🚗|automobile|guidare|macchina|mezzo|trasporti|veicolo|viaggiare
 🚗|automobile|guidare|macchina|mezzo|trasporti|veicolo|viaggiare
@@ -965,7 +969,7 @@
 🚢|barca|crociera|imbarcazione|mare|nave|titanic|trasporti|trasporto|veicolo|viaggiare
 🚢|barca|crociera|imbarcazione|mare|nave|titanic|trasporti|trasporto|veicolo|viaggiare
 🛩️|aereo turistico|aeroplano|jet|velivolo|viaggiare|viaggio
 🛩️|aereo turistico|aeroplano|jet|velivolo|viaggiare|viaggio
 🛫|aereo|andare|check-in|decollo|partenza|partenze|partire|pista di decollo|trasporti|trasporto|vacanza|viaggiare
 🛫|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
 🪂|parà|paracadute ascensionale|paracadutismo|paracadutista|parasailing|skydiving|sport
 💺|sedia|sedile
 💺|sedia|sedile
 🚁|elicottero|trasporti|veicolo|velivolo|viaggiare|volare
 🚁|elicottero|trasporti|veicolo|velivolo|viaggiare|volare
@@ -1054,7 +1058,7 @@
 🎇|boom|esplosione|festa|fuoco d’artificio|stella filante|stellina scintillante|stelline scintillanti
 🎇|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
 🧨|botto|dinamite|esplodere|esplosivo|far esplodere|fuochi artificiali|fuochi d’artificio|petardo|scintilla|scoppiare|scoppio
 🎈|auguri|compleanno|festa|palloncino
 🎈|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
 🎊|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
 🎋|albero decorato|albero di tanabata|decorazioni di carta|festa delle stelle|giapponese|natura
 🎍|bambù decorato|decorazione kadomatsu|festa|giapponese|pianta|pino
 🎍|bambù decorato|decorazione kadomatsu|festa|giapponese|pianta|pino
@@ -1062,7 +1066,7 @@
 🎏|aquilone a forma di carpa|carpa|festa|giapponese|pesce
 🎏|aquilone a forma di carpa|carpa|festa|giapponese|pesce
 🎐|campana al vento|campanelle a vento|festa|scacciapensieri|vento
 🎐|campana al vento|campanelle a vento|festa|scacciapensieri|vento
 🎑|contemplazione della luna|contemplazione festa|festa della contemplazione della luna|festa della luna|festeggiare|luna
 🎑|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
 🎀|auguri|bambina|bebé|festa|fiocco rosa|neonata
 🎁|dono|festa|fiocco|natale|pacchetto|regalino|regalo|sorpresa
 🎁|dono|festa|fiocco|natale|pacchetto|regalino|regalo|sorpresa
 🎗️|festa|festeggiamenti|fiocchetto|fiocco giallo|nastro giallo|nodo
 🎗️|festa|festeggiamenti|fiocchetto|fiocco giallo|nastro giallo|nodo
@@ -1121,7 +1125,7 @@
 🃏|carta da gioco|gioco|joker|jolly
 🃏|carta da gioco|gioco|joker|jolly
 🀄|drago rosso|mahjong|tessera
 🀄|drago rosso|mahjong|tessera
 🎴|carta da gioco hanafuda|carta dei fiori|giapponese|gioco di carte|hanafuda
 🎴|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|cornice|dipinto|disegno|galleria|museo|opera d’arte|paesaggio|quadretto|quadro incorniciato
 🎨|arte|artista|colori|creativo|dipingere|palette|pittore|pittura|tavolozza dei colori
 🎨|arte|artista|colori|creativo|dipingere|palette|pittore|pittura|tavolozza dei colori
 🧵|ago|bobina|corda|cucire|filo|rocchetto|rotolo
 🧵|ago|bobina|corda|cucire|filo|rocchetto|rotolo
@@ -1173,9 +1177,9 @@
 ⛑️|bianca|croce|elmetto con croce bianca|salvataggio|soccorso
 ⛑️|bianca|croce|elmetto con croce bianca|salvataggio|soccorso
 📿|grani|perle|pregare|religione
 📿|grani|perle|pregare|religione
 💄|appuntamento|bellezza|cosmetici|make up|makeup|rossetto|rosso|serata|trucco
 💄|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
 💎|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 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 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
 🔊|altoparlante a volume alto|audio|megafono|musica|speaker|suono|volume
@@ -1204,6 +1208,7 @@
 🪘|bongo|conga|musica|percussioni|ritmo|strumento musicale|tamburo lungo
 🪘|bongo|conga|musica|percussioni|ritmo|strumento musicale|tamburo lungo
 🪇|agitare|ballare|maracas|musica|percussioni|ritmo|scuotere|strumento
 🪇|agitare|ballare|maracas|musica|percussioni|ritmo|scuotere|strumento
 🪈|fiati|fiato|flautista|flauto|legno|musica|pifferaio|piffero|strumento|zufolo
 🪈|fiati|fiato|flautista|flauto|legno|musica|pifferaio|piffero|strumento|zufolo
+🪉|amore|arpa|cupido|musica|orchestra|strumento
 📱|cellulare|chiamare|comunicare|smartphone|telefono
 📱|cellulare|chiamare|comunicare|smartphone|telefono
 📲|cellulare con freccia|chiamami|chiamare|ricevere|smartphone|telefonare|telefono cellulare con freccia
 📲|cellulare con freccia|chiamami|chiamare|ricevere|smartphone|telefonare|telefono cellulare con freccia
 ☎️|fisso|telefono di casa
 ☎️|fisso|telefono di casa
@@ -1225,7 +1230,7 @@
 🧮|abaco|abbaco|calcolare|calcolatrice|calcolo|fare i calcoli|pallottoliere
 🧮|abaco|abbaco|calcolare|calcolatrice|calcolo|fare i calcoli|pallottoliere
 🎥|cinema|cinepresa|filmare|hollywood|intrattenimento|registrare|telecamera
 🎥|cinema|cinepresa|filmare|hollywood|intrattenimento|registrare|telecamera
 🎞️|cinema paradiso|film|fotogrammi di film|pellicola cinematografica
 🎞️|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
 🎬|ciak si gira|cinema|filmare|intrattenimento|lavagna|regista|scena|tavoletta
 📺|arredamento|televisione|televisore|tv
 📺|arredamento|televisione|televisore|tv
 📷|fotocamera|fotografare|instagram|macchina fotografica|ricordi|scattare foto|selfie|viaggiare|video
 📷|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|libreria|libro verde|quaderno|scuola
 📘|biblioteca|compiti|istruzione|leggere|libreria|libro blu|quaderno blu|scuola|studiare
 📘|biblioteca|compiti|istruzione|leggere|libreria|libro blu|quaderno blu|scuola|studiare
 📙|biblioteca|compiti|istruzione|leggere|libreria|libro arancione|quaderno|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
 📓|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
 📒|annotazioni|appunti|blocco|block notes|libro mastro|note|quaderno ad anelli|registro scolastico|scuola|taccuino
 📃|carta|documento|lettera|pagina arricciata|pagina con piega|ufficio
 📃|carta|documento|lettera|pagina arricciata|pagina con piega|ufficio
@@ -1256,16 +1261,16 @@
 📑|etichette segnalibro|linguette|segnalibro|ufficio
 📑|etichette segnalibro|linguette|segnalibro|ufficio
 🔖|etichetta|leggere|lettura|libro|segnalibro
 🔖|etichetta|leggere|lettura|libro|segnalibro
 🏷️|etichetta|identificativo|prezzo|talloncino
 🏷️|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
 🪙|argento|denaro|dollaro|euro|metallo|moneta|oro|ricco|soldi|tesoro
 💴|banca|banconota|denaro|giappone|soldi|valuta|yen
 💴|banca|banconota|denaro|giappone|soldi|valuta|yen
 💵|banca|banconota|banconote|contanti|denaro|dollaro|moneta|soldi|valuta
 💵|banca|banconota|banconote|contanti|denaro|dollaro|moneta|soldi|valuta
 💶|banca|banconota|cash|crisi|denaro|euro|millionario|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
 💸|banconota con le ali|soldi che volano|soldi con le ali
 💳|addebito|banca|carta di credito|credito|denaro|pagare|soldi
 💳|addebito|banca|carta di credito|credito|denaro|pagare|soldi
 🧾|contabilità|fattura|invoice|prova|ricevuta di pagamento|scontrino|tenuta dei libri
 🧾|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|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|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
 📩|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
 🧰|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
 🧲|a forma di u|attrazione|calamita|ferro di cavallo|magnete|magnetica|magnetico|positivo negativo
 🪜|arrampicarsi|oggetto|piolo|scala a pioli|scalino
 🪜|arrampicarsi|oggetto|piolo|scala a pioli|scalino
+🪏|buco|pala|scavare|spalare|vanga
 🧪|chimica|chimico|esperimenti|esperimento|laboratorio|provetta|scienza
 🧪|chimica|chimico|esperimenti|esperimento|laboratorio|provetta|scienza
 🧫|batterio|biologa|biologia|biologo|capsula di petri|coltura|cultura|laboratorio|piastra di petri
 🧫|batterio|biologa|biologia|biologo|capsula di petri|coltura|cultura|laboratorio|piastra di petri
 🧬|biologo|dna|evoluzione|genetica|geni|vita
 🧬|biologo|dna|evoluzione|genetica|geni|vita
 🔬|analisi|esperimento|microrganismo|microscopio|ricerca|scienza|scienziata|scienziato|strumento
 🔬|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
 📡|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
 🩸|ciclo mestruale|donare il sangue|donazione di sangue|goccia di sangue|medicinale|mestruazioni
 💊|dottore|farmaco|malato|malattia|medicina|pillola|pillole|vitaminca
 💊|dottore|farmaco|malato|malattia|medicina|pillola|pillole|vitaminca
 🩹|cerotto adesivo
 🩹|cerotto adesivo
@@ -1392,7 +1398,7 @@
 🚾|bagni|bagno|gabinetto|segnale|servizi|simbolo del wc|toilette|wc
 🚾|bagni|bagno|gabinetto|segnale|servizi|simbolo del wc|toilette|wc
 🛂|aeroporto|controllo|dogana|immigrazione|passaporti|passaporto|segnale|simbolo del controllo passaporti
 🛂|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
 🛃|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
 🛅|aeroporto|bagagli|deposito|servizio bagagli|sicurezza|simbolo del deposito bagagli|viaggiare
 ⚠️|attenzione|pericolo|punto esclamativo|simbolo di avviso|triangolo
 ⚠️|attenzione|pericolo|punto esclamativo|simbolo di avviso|triangolo
 🚸|attraversamento pedonale|attraversare|bambini|pedoni|scuola|segnale|simbolo|strada|traffico
 🚸|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
 🚯|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
 🚱|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
 🚷|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
 🔞|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
 ⬆️|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
 ➡️|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
 💲|cash|contanti|denaro|dollaro|pagare|simbolo del dollaro|soldi|valuta
 ♻️|raccolta differenziata|riciclaggio|riciclare|riciclo|simbolo del riciclaggio
 ♻️|raccolta differenziata|riciclaggio|riciclare|riciclo|simbolo del riciclaggio
 ⚜️|araldica|fiore|giglio araldico|simbolo|stemma
 ⚜️|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
 📛|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
 🔰|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
 ⭕|cerchio rosso vuoto|gioco|pallino|tris
@@ -1477,6 +1483,7 @@
 ➰|cerchio|nodo|occhiello
 ➰|cerchio|nodo|occhiello
 ➿|doppio|occhiello
 ➿|doppio|occhiello
 〽️|canzone|divisione spartito|parti musicali|segno|simbolo di alternanza delle parti|suddivisione parti
 〽️|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
 🔠|abcd|caratteri latini|inserire|lettere|maiuscole|pulsante con lettere latine maiuscole|tasto
 🔡|caratteri latini|inserire|lettere|minuscole|pulsante con lettere latine minuscole|tasto
 🔡|caratteri latini|inserire|lettere|minuscole|pulsante con lettere latine minuscole|tasto
 🔢|1234|inserire|numeri|pulsante con numeri|tastierino numerico
 🔢|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
 🆘|aiuto|pulsante sos|segnale di sos|simbolo di sos|simbolo sos|soccorsi|soccorso|sos
 🆙|alto|in alto|pulsante|simbolo up!|sù|tasto up!|up!
 🆙|alto|in alto|pulsante|simbolo up!|sù|tasto up!|up!
 🆚|contro|pulsante|simbolo contro|tasto|versus|vs
 🆚|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
 🈂️|ideogramma giapponese di costo del servizio|ideogramma katakana sa|katakana|parola|sa
 🈷️|cinese|giapponese|ideogramma giapponese di importo mensile|luna|mese
 🈷️|cinese|giapponese|ideogramma giapponese di importo mensile|luna|mese
 🈶|esistere|giapponese|ideogramma giapponese di a pagamento
 🈶|esistere|giapponese|ideogramma giapponese di a pagamento
@@ -1508,11 +1515,11 @@
 🈚|giapponese|gratis|ideogramma giapponese di gratis|negazione
 🈚|giapponese|gratis|ideogramma giapponese di gratis|negazione
 🈲|giapponese|ideogramma giapponese di proibito|proibito
 🈲|giapponese|ideogramma giapponese di proibito|proibito
 🉑|accettabile|accettare|cinese|giapponese|ideogramma giapponese di accettabile
 🉑|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|giapponese|ideogramma giapponese di voto di sufficienza|insieme|sufficienza
 🈳|cinese|disponibilità|giapponese|ideogramma giapponese di posto libero|libero|posto libero|vuoto
 🈳|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
 🈺|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
 🔴|cerchio rosso grande|geometria|rosso|stop
 🟠|arancione|cerchio arancio|cerchio di colore arancione|forma
 🟠|arancione|cerchio arancio|cerchio di colore arancione|forma
 🟡|cerchio di colore giallo|colore giallo|forma|giallo
 🟡|cerchio di colore giallo|colore giallo|forma|giallo
@@ -1552,7 +1559,7 @@
 🎌|bandiere del giappone incrociate|festa|festeggiamenti|giapponese|giapponesi|incrociate
 🎌|bandiere del giappone incrociate|festa|festeggiamenti|giapponese|giapponesi|incrociate
 🏴|bandiera che sventola|bandiera nera
 🏴|bandiera che sventola|bandiera nera
 🏳️|arrendersi|bandiera bianca|bandiera che sventola|sos|sventolare bandiera bianca
 🏳️|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
 🏳️‍⚧️|azzurro|bandiera|bianco|rosa|transgender
 🏴‍☠️|bandiera dei pirati|corsari|corsaro|pirata|pirati
 🏴‍☠️|bandiera dei pirati|corsari|corsaro|pirata|pirati
 🇦🇩|andorra
 🇦🇩|andorra

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

@@ -12,7 +12,7 @@
 ☂️|geopende paraplu|kleding|open paraplu|paraplu|regen|weer
 ☂️|geopende paraplu|kleding|open paraplu|paraplu|regen|weer
 ☃️|koud|sneeuwpop|weer
 ☃️|koud|sneeuwpop|weer
 ☄️|komeet|ruimte|vuurbal
 ☄️|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
 ☔|druppels|kleding|paraplu met regendruppels|regen|weer
 ☕|café|cafeïne|chai|drank|drinken|koffie|ochtend|stomen|thee|warm
 ☕|café|cafeïne|chai|drank|drinken|koffie|ochtend|stomen|thee|warm
 ☘️|iers|klavertjedrie|plant
 ☘️|iers|klavertjedrie|plant
@@ -66,28 +66,28 @@
 〰️|golvend|interpunctie|streepje
 〰️|golvend|interpunctie|streepje
 ㊗️|gefeliciteerd|ideogram|japans|knop
 ㊗️|gefeliciteerd|ideogram|japans|knop
 ㊙️|geheim|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
 🙃|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
 😍|gevoelens|gezicht|hartjesogen|kussen|lach|liefde|oog|romantiek|schatje
 🤩|gezicht|grijnzend|lach|ogen|opgewonden|sterren als ogen|sterren in de ogen|wauw
 🤩|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
 😘|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
 😗|afspraakje|date|gezicht|hou van jou|hvj|kussend gezicht|smiley|xoxo|zoen
 ☺️|blij|gezicht|lachen|omtrek|ontspannen
 ☺️|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
 😚|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
 🥲|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
 😋|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
 😛|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|huilen|slaap|slaperig gezicht|smiley|traan
 🤤|gezicht|kwijlend
 🤤|gezicht|kwijlend
 😴|bedtijd|dutje|gapen|gezicht|moe|slaap lekker|slapend gezicht|smiley|vermoeid|welterusten|zzz
 😴|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
 😷|besmet|doktersmasker|gezicht met doktersmasker|gezicht met masker|koud|masker|medicijn|medisch masker|smiley|virus|ziek
 🤒|gezicht met thermometer|niet lekker|thermometer|ziek
 🤒|gezicht met thermometer|niet lekker|thermometer|ziek
 🤕|gewond|gezicht met hoofdverband|pijn|verband|verwonding
 🤕|gewond|gezicht met hoofdverband|pijn|verband|verwonding
@@ -183,7 +184,7 @@
 🤖|gezicht|monster|robot
 🤖|gezicht|monster|robot
 😺|dier|gezicht|grijnzen|kat|lachen|mond|open
 😺|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|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
 😻|dier|gezicht|hartjesogen|kat|lachen|liefde|oog
 😼|gezicht|gniffelende kat|grimas|ironische lach|kattenkwaad|lach|ondeugend kattengezicht|smiley|spottend
 😼|gezicht|gniffelende kat|grimas|ironische lach|kattenkwaad|lach|ondeugend kattengezicht|smiley|spottend
 😽|dier|gezicht|kat|kussend kattengezicht met gesloten ogen|kussende kat|oog|smiley
 😽|dier|gezicht|kat|kussend kattengezicht met gesloten ogen|kussende kat|oog|smiley
@@ -341,7 +342,7 @@
 👨‍⚕️|arts|gezondheidszorg|man|therapeut|verpleger|werknemer
 👨‍⚕️|arts|gezondheidszorg|man|therapeut|verpleger|werknemer
 👩‍⚕️|arts|gezondheidszorg|therapeute|verpleegster|vrouw|werknemer
 👩‍⚕️|arts|gezondheidszorg|therapeute|verpleegster|vrouw|werknemer
 🧑‍🎓|scholier|student
 🧑‍🎓|scholier|student
-👨‍🎓|scholier|student|vrouw
+👨‍🎓|man|scholier|student
 👩‍🎓|scholier|student|vrouw
 👩‍🎓|scholier|student|vrouw
 🧑‍🏫|docent|leraar|professor
 🧑‍🏫|docent|leraar|professor
 👨‍🏫|docent|instructeur|leraar|man|professor
 👨‍🏫|docent|instructeur|leraar|man|professor
@@ -551,15 +552,16 @@
 👪|gezin|kind
 👪|gezin|kind
 🧑‍🧑‍🧒|gezin|kind|volwassene
 🧑‍🧑‍🧒|gezin|kind|volwassene
 🧑‍🧑‍🧒‍🧒|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
 👣|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
 🦍|dier|gorilla
 🦧|aap|dier|orang-oetang
 🦧|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
 🦮|blind|dier|geleide|hond|toegankelijkheid
 🐕‍🦺|assistentie|dier|hond|hulp|toegankelijkheid
 🐕‍🦺|assistentie|dier|hond|hulp|toegankelijkheid
 🐩|dier|hond|pluizig|poedel
 🐩|dier|hond|pluizig|poedel
@@ -567,33 +569,33 @@
 🦊|dier|gezicht|vos
 🦊|dier|gezicht|vos
 🦝|dier|nieuwsgierig|sluw|wasbeer
 🦝|dier|nieuwsgierig|sluw|wasbeer
 🐱|dier|gezicht|huisdier|kat|kitten
 🐱|dier|gezicht|huisdier|kat|kitten
-🐈|dier|huisdier|kat|kitten
+🐈|dieren|huisdier|katten|kitten
 🐈‍⬛|dier|halloween|katachtig|miauw|pech|zwart
 🐈‍⬛|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|eland|gewei|zoogdier
 🫏|dier|ezel|grauwtje|koppig|muildier|pakezel|zoogdier
 🫏|dier|ezel|grauwtje|koppig|muildier|pakezel|zoogdier
-🐎|dier|paard|racen|racepaard|renpaard|ruitersport
+🐎|boerderij|dier|paard|racen|renpaard|ruitersport
 🦄|eenhoorn|gezicht
 🦄|eenhoorn|gezicht
 🦓|dier|streep|zebra
 🦓|dier|streep|zebra
 🦌|dier|hert
 🦌|dier|hert
 🦬|bizon|buffel|dier|kudde|wisent
 🦬|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
 🐗|dier|varken|zwijn
 🐽|gezicht|neus|varkensneus
 🐽|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
 🦙|alpaca|dier|guanaco|lama|vicuña|wol
 🦒|dier|giraffe|vlekken
 🦒|dier|giraffe|vlekken
 🐘|dier|olifant
 🐘|dier|olifant
@@ -601,7 +603,7 @@
 🦏|dier|neushoorn
 🦏|dier|neushoorn
 🦛|dier|hippopotamus|nijlpaard
 🦛|dier|hippopotamus|nijlpaard
 🐭|dier|gezicht|muis
 🐭|dier|gezicht|muis
-🐁|dier|knaagdier|muis
+🐁|dieren|muis
 🐀|dier|rat
 🐀|dier|rat
 🐹|dier|gezicht|hamster|huisdier
 🐹|dier|gezicht|hamster|huisdier
 🐰|dier|gezicht|huisdier|konijn
 🐰|dier|gezicht|huisdier|konijn
@@ -610,9 +612,9 @@
 🦫|bever|dam|dier|tanden
 🦫|bever|dam|dier|tanden
 🦔|dier|egel|stekelig
 🦔|dier|egel|stekelig
 🦇|dier|vampier|vleermuis
 🦇|dier|vampier|vleermuis
-🐻|beer|berengezicht|dier|gezicht|knuffel
+🐻|beer|dier|gezicht|grizzly|grommen|honing
 🐻‍❄️|beer|ijsbeer|noordpool|wit
 🐻‍❄️|beer|ijsbeer|noordpool|wit
-🐨|australië|beer|dier|down under|koala
+🐨|australië|beer|buideldier|dier|down|gezicht|koala|under
 🐼|bamboe|dier|gezicht|panda
 🐼|bamboe|dier|gezicht|panda
 🦥|luiaard|traag
 🦥|luiaard|traag
 🦦|dier|otter|speels|vissen
 🦦|dier|otter|speels|vissen
@@ -651,61 +653,67 @@
 🐉|dier|draak|ridders|sprookje
 🐉|dier|draak|ridders|sprookje
 🦕|brachiosaurus|brontosaurus|dinosaurus|diplodocus|sauropode
 🦕|brachiosaurus|brontosaurus|dinosaurus|diplodocus|sauropode
 🦖|dinosaurus|rex|t-rex|tyrannosaurus
 🦖|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|leeuw|oceaan|zeehond
-🐟|dier|horoscoop|sterrenbeeld|vissen
-🐠|dier|tropische vis|vis
+🐟|dier|eten|pisces|sterrenbeeld|vissen
+🐠|dier|tropisch|vissen
 🐡|dier|kogelvis|vis
 🐡|dier|kogelvis|vis
 🦈|dier|haai|vis
 🦈|dier|haai|vis
-🐙|dier|oceaan|octopus|zee
+🐙|dier|oceaan|octopus|wezen
 🐚|dier|schelp|spiraal|strand|zee
 🐚|dier|schelp|spiraal|strand|zee
 🪸|klimaat|koraal|oceaan|rif|verandering|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
 🐌|dier|escargot|naaktslak|natuur|slak|tuin
 🦋|insect|mooi|vlinder
 🦋|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
 🪲|beestje|dier|insect|kever
-🐞|dier|insect|kever|lieveheersbeestje
+🐞|dier|insect|kever|lieveheersbeestje|natuur|tuin
 🦗|dier|insect|krekel|orthoptera|sprinkhaan
 🦗|dier|insect|krekel|orthoptera|sprinkhaan
 🪳|bakkerstor|dier|insect|kakkerlak|plaag
 🪳|bakkerstor|dier|insect|kakkerlak|plaag
-🕷️|dier|geleedpotigen|insect|spin
+🕷️|dier|insect|spin
 🕸️|spinnenweb|web
 🕸️|spinnenweb|web
-🦂|dier|horoscoop|schorpioen|scorpio|sterrenbeeld
+🦂|schorpioen|scorpio|scorpius|sterrenbeeld
 🦟|beet|insect|koorts|malaria|mug|ongedierte|virus|ziekte
 🦟|beet|insect|koorts|malaria|mug|ongedierte|virus|ziekte
 🪰|dier|insect|made|ongedierte|rottend|vlieg|ziekte
 🪰|dier|insect|made|ongedierte|rottend|vlieg|ziekte
 🪱|dier|parasiet|regenworm|ringworm|worm
 🪱|dier|parasiet|regenworm|ringworm|worm
 🦠|amoebe|bacteriën|microbe|virus|wetenschap
 🦠|amoebe|bacteriën|microbe|virus|wetenschap
 💐|afspraakje|bedankt|beterschap|bloem|boeket|date|jubileum|romantiek|verjaardag
 💐|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
 🪷|bloem|boeddhisme|hindoeïsme|lotus|puurheid|rust|schoonheid|sereen|vrede
 🏵️|plant|rozet
 🏵️|plant|rozet
-🌹|bloem|liefde|plant|roos|valentijn
+🌹|bloem|elegant|liefde|plant|rood|roos|schoonheid|valentijn
 🥀|bloem|sterven|verwelkt
 🥀|bloem|sterven|verwelkt
 🌺|bloem|hibiscus|plant
 🌺|bloem|hibiscus|plant
-🌻|bloem|plant|zonnebloem
+🌻|bloem|buiten|plant|zonnebloem
 🌼|bloem|bloesem|boterbloem|paardenbloem|plant
 🌼|bloem|bloesem|boterbloem|paardenbloem|plant
-🌷|bloem|plant|tulp
+🌷|bloem|bloesem|groei|plant|tulp
 🪻|bloem|hyacint|lavendel|leeuwenbek|lupine|vlinderbloemige
 🪻|bloem|hyacint|lavendel|leeuwenbek|lupine|vlinderbloemige
 🌱|jong|plant|spruit|stekje|zaailing
 🌱|jong|plant|spruit|stekje|zaailing
 🪴|decor|groeien|huis|plant|potplant|verzorgen
 🪴|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
 🌿|blad|kruid|plant
-🍀|4|blad|geluk|klavertjevier|plant|vier
+🍀|4|blad|geluk|iers|klavertjevier|plant|vier
 🍁|blad|esdoorn|vallend
 🍁|blad|esdoorn|vallend
 🍂|blad|gevallen|herfst|vallend
 🍂|blad|gevallen|herfst|vallend
 🍃|blad|blazen|fladderen|wind
 🍃|blad|blazen|fladderen|wind
 🪹|leeg|nestelen|tak|thuis
 🪹|leeg|nestelen|tak|thuis
 🪺|eieren|nestelen|tak|vogel
 🪺|eieren|nestelen|tak|vogel
 🍄|paddenstoel|schimmel|zwam
 🍄|paddenstoel|schimmel|zwam
+🪾|boomstam|dood|droogte|hout|kaal|leeg|takken|winter|zonder bladeren
 🍇|dionysus|druif|druiven|fruit
 🍇|dionysus|druif|druiven|fruit
 🍈|fruit|kanteloep|meloen
 🍈|fruit|kanteloep|meloen
 🍉|fruit|watermeloen
 🍉|fruit|watermeloen
@@ -744,6 +752,7 @@
 🫚|bier|gemberwortel|specerij|wortel
 🫚|bier|gemberwortel|specerij|wortel
 🫛|bonen|dop|edamame|erwtendop|groente|peulvrucht
 🫛|bonen|dop|edamame|erwtendop|groente|peulvrucht
 🍄‍🟫|bruine paddenstoel|bruine paddestoel|champignon|eten|groente|natuur|paddenstoel|paddo|pizza|schimmel|shiitake
 🍄‍🟫|bruine paddenstoel|bruine paddestoel|champignon|eten|groente|natuur|paddenstoel|paddo|pizza|schimmel|shiitake
+🫜|biet|groente|raap|tuin|wortel
 🍞|brood|eten|koolhydraten|tarwe|voedsel
 🍞|brood|eten|koolhydraten|tarwe|voedsel
 🥐|brood|croissant|eten|frans|ontbijt|voedsel
 🥐|brood|croissant|eten|frans|ontbijt|voedsel
 🥖|brood|eten|frans|stokbrood
 🥖|brood|eten|frans|stokbrood
@@ -767,10 +776,10 @@
 🫔|eten|mexicaans|pamonha|tamale|verpakt
 🫔|eten|mexicaans|pamonha|tamale|verpakt
 🥙|eten|falafel|gevuld|gyros|kebab|pitabrood
 🥙|eten|falafel|gevuld|gyros|kebab|pitabrood
 🧆|falafel|gehaktbal|kikkererwt
 🧆|falafel|gehaktbal|kikkererwt
-🥚|ei|eten|voedsel
+🥚|ei|ontbijt|voedsel
 🍳|bakken|ei|gemakkelijk|koken|ontbijt|pan|restaurant|spiegelei
 🍳|bakken|ei|gemakkelijk|koken|ontbijt|pan|restaurant|spiegelei
 🥘|braadpan|eten|ondiep|paella|pan
 🥘|braadpan|eten|ondiep|paella|pan
-🍲|eenpansgerecht|eten|stoofschotel|voedsel
+🍲|pan|soep|stoofschotel|voedsel
 🫕|chocolade|eten|fondue|gesmolten|kaas|pot|ski
 🫕|chocolade|eten|fondue|gesmolten|kaas|pot|ski
 🥣|cornflakes|eten|kom met lepel|muesli|ontbijtgranen|pap|soep|voedsel
 🥣|cornflakes|eten|kom met lepel|muesli|ontbijtgranen|pap|soep|voedsel
 🥗|eten|groen|salade
 🥗|eten|groen|salade
@@ -795,11 +804,6 @@
 🥟|dumpling|empanada|gyōza|jiaozi|pierogi|potsticker
 🥟|dumpling|empanada|gyōza|jiaozi|pierogi|potsticker
 🥠|geluk|koekje|profetie
 🥠|geluk|koekje|profetie
 🥡|afhaalmaaltijd|bezorgen|doggybag|eten|oesteremmer|stokjes|voedsel
 🥡|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|eten|ijs|restaurant|room|softijs|zoet
 🍧|dessert|geschaafd|ijs|restaurant|zoet
 🍧|dessert|geschaafd|ijs|restaurant|zoet
 🍨|dessert|eten|ijs|restaurant|room|zoet
 🍨|dessert|eten|ijs|restaurant|room|zoet
@@ -1201,9 +1205,10 @@
 🎻|instrument|muziekinstrument|stradivarius|viool
 🎻|instrument|muziekinstrument|stradivarius|viool
 🪕|banjo|besnaard|instrument|muziek|snaarinstrument|spelen
 🪕|banjo|besnaard|instrument|muziek|snaarinstrument|spelen
 🥁|drummen|drumsticks|muziekinstrument|trommelen|trommelstokken
 🥁|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
 🪇|instrument|muziek|percussie|ratelen|sambaballen|schudden
 🪈|blokfluit|dwarsfluit|fluit|houtblazer|muziek|pijperfluit
 🪈|blokfluit|dwarsfluit|fluit|houtblazer|muziek|pijperfluit
+🪉|cupido|harp|instrument|liefde|muziek|orkestra
 📱|bellen|communicatie|mobiele telefoon|smartphone|telefoon
 📱|bellen|communicatie|mobiele telefoon|smartphone|telefoon
 📲|bellen|mobiel met pijl|mobiele telefoon|ontvangen|pijl|smartphone|telefoon
 📲|bellen|mobiel met pijl|mobiele telefoon|ontvangen|pijl|smartphone|telefoon
 ☎️|rode telefoon met hoorn|telefoon|vaste telefoon
 ☎️|rode telefoon met hoorn|telefoon|vaste telefoon
@@ -1334,6 +1339,7 @@
 🧰|doos|gereedschapskist|kist|monteur|rode kist
 🧰|doos|gereedschapskist|kist|monteur|rode kist
 🧲|aantrekkingskracht|hoefijzer|magneet|magnetisch|positief negatief|uvormig
 🧲|aantrekkingskracht|hoefijzer|magneet|magnetisch|positief negatief|uvormig
 🪜|klimmen|ladder|omhoog|omlaag|sport|trede|voorwerp
 🪜|klimmen|ladder|omhoog|omlaag|sport|trede|voorwerp
+🪏|gat|graven|schep|schop|spade
 🧪|chemicus|experiment|laboratorium|reageerbuis|scheikunde|scheikundige|wetenschap
 🧪|chemicus|experiment|laboratorium|reageerbuis|scheikunde|scheikundige|wetenschap
 🧫|bacterie|bacteriën|biologe|biologie|bioloog|cultuur|kweek|laboratorium|petrischaal
 🧫|bacterie|bacteriën|biologe|biologie|bioloog|cultuur|kweek|laboratorium|petrischaal
 🧬|biologe|bioloog|dna|evolutie|genetica|genetisch|leven
 🧬|biologe|bioloog|dna|evolutie|genetica|genetisch|leven
@@ -1383,25 +1389,25 @@
 🪪|beveiliging|id-kaart|identificatie|identiteitskaart|legitimatiebewijs|overheid|vergunning
 🪪|beveiliging|id-kaart|identificatie|identiteitskaart|legitimatiebewijs|overheid|vergunning
 🏧|atm|automaat|bank|geld|pinautomaat|pinnen
 🏧|atm|automaat|bank|geld|pinautomaat|pinnen
 🚮|afval|prullenbak|teken|vuilnisbak
 🚮|afval|prullenbak|teken|vuilnisbak
-🚰|drinkwatersymbool|kraan met glas|kraanwater
+🚰|drinkbaar|water
 ♿|handicap|rolstoel|symbool|toegang
 ♿|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
 🚼|baby|symbool|verschonen
 🚾|toilet|wasgelegenheid|water|wc
 🚾|toilet|wasgelegenheid|water|wc
 🛂|controle|paspoort
 🛂|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
 🛅|achtergelaten|bagage|kluisje|koffer
 ⚠️|voorzichtig|waarschuwing
 ⚠️|voorzichtig|waarschuwing
 🚸|kinderen|oversteekplaats|verkeer|voetganger
 🚸|kinderen|oversteekplaats|verkeer|voetganger
-⛔|geen toegang|nee|symbool|verboden toegang
+⛔|belemmerd|doorgang|geen|ingang|mislukt|niet|toegang|verboden|verkeer
 🚫|nee|niet|roken|toegang|verboden
 🚫|nee|niet|roken|toegang|verboden
 🚳|fietsen|nee|niet|verboden
 🚳|fietsen|nee|niet|verboden
 🚭|nee|niet|roken|verboden
 🚭|nee|niet|roken|verboden
 🚯|geen|niet|verboden|zwerfvuil
 🚯|geen|niet|verboden|zwerfvuil
-🚱|drinken verboden|geen drinkwater|niet drinkbaar|niet drinken|water
+🚱|droog|geen drinkwater|niet drinkbaar|verboden|water
 🚷|nee|niet|verboden|voetgangers
 🚷|nee|niet|verboden|voetgangers
 📵|mobiel|nee|niet|telefoons|verboden
 📵|mobiel|nee|niet|telefoons|verboden
 🔞|18|achttien|beperking|één|leeftijd|minderjarig|nee|niet|verboden
 🔞|18|achttien|beperking|één|leeftijd|minderjarig|nee|niet|verboden
@@ -1418,13 +1424,13 @@
 🔛|on!|pijl|teken
 🔛|on!|pijl|teken
 🔜|onderweg|pijl|soon|zo terug
 🔜|onderweg|pijl|soon|zo terug
 🔝|omhoog|pijl|top
 🔝|omhoog|pijl|top
-🛐|bidden|gebedsruimte|geloof|religie|tempel
+🛐|bidden|godsdienst|plaats|religie
 ⚛️|atheïst|atoom|symbool
 ⚛️|atheïst|atoom|symbool
 🕉️|hindoeïsme|om|religie
 🕉️|hindoeïsme|om|religie
 ☯️|leven|moeilijk|religie|taoist|totaal|yang|yin en yang
 ☯️|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
 🕎|hannuka|jodendom|joods|kandelaar|menora|religie
 🔯|geluk|jodendom|joods|met stip|ster|zespuntig
 🔯|geluk|jodendom|joods|met stip|ster|zespuntig
 🪯|khanda|religie|sikh
 🪯|khanda|religie|sikh
@@ -1444,10 +1450,10 @@
 ⏯️|driehoek|knop|pauzeren|pijl|rechts|spelen
 ⏯️|driehoek|knop|pauzeren|pijl|rechts|spelen
 ◀️|achteruit|driehoek|knop|links|pijl
 ◀️|achteruit|driehoek|knop|links|pijl
 ⏪|dubbele pijl links|knop voor versneld terugspoelen|links|pijl|terugspoelen
 ⏪|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
 🔼|knop|omhoog|pijl|rood
 ⏫|dubbel|knop|omhoog|pijl|snel
 ⏫|dubbel|knop|omhoog|pijl|snel
-🔽|driehoek|knop voor omlaag|omlaag|pijl|rood
+🔽|beneden|knop|omlaag|pijl|rood
 ⏬|dubbel|knop|omlaag|pijl|snel
 ⏬|dubbel|knop|omlaag|pijl|snel
 ⏸️|dubbel|knop|pauze|streep|verticaal
 ⏸️|dubbel|knop|pauze|streep|verticaal
 ⏹️|knop voor stoppen|stoppen|vierkant
 ⏹️|knop voor stoppen|stoppen|vierkant
@@ -1470,21 +1476,22 @@
 ⚜️|fleur-de-lis|ridders
 ⚜️|fleur-de-lis|ridders
 🔱|anker|drietand|embleem|gereedschap|poseidon|schip
 🔱|anker|drietand|embleem|gereedschap|poseidon|schip
 📛|badge|kaartje|naamkaartje
 📛|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
 ❌|×|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
 ➰|gedraaid|gekrulde lus|lus
 ➿|dubbel|krullend|lus
 ➿|dubbel|krullend|lus
 〽️|markering|rolwisselingsmarkering|teken
 〽️|markering|rolwisselingsmarkering|teken
+🫟|druppel|geknoei|gemors|gespat|holi|inkt|verf|vlek|vloeistof
 🔠|abcd|hoofdletters|invoeren|latijns|letters
 🔠|abcd|hoofdletters|invoeren|latijns|letters
 🔡|abcd|invoeren|kleine letters|latijns|letters
 🔡|abcd|invoeren|kleine letters|latijns|letters
 🔢|1234|cijfers|invoeren
 🔢|1234|cijfers|invoeren
 🔣|&|%|♪|〒|invoeren|symbolen
 🔣|&|%|♪|〒|invoeren|symbolen
 🔤|abc|alfabet|invoeren|latijns|letters
 🔤|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
 🆑|cl|knop
 🆒|cool|knop
 🆒|cool|knop
 🆓|free|knop
 🆓|free|knop
@@ -1492,7 +1499,7 @@
 Ⓜ️|cirkel|in cirkel|m
 Ⓜ️|cirkel|in cirkel|m
 🆕|knop|new
 🆕|knop|new
 🆖|knop|ng
 🆖|knop|ng
-🅾️|bloedgroep|o-knop
+🅾️|bloed|groep|knop|o
 🆗|knop|oké
 🆗|knop|oké
 🅿️|knop|parkeren
 🅿️|knop|parkeren
 🆘|help|knop|sos
 🆘|help|knop|sos
@@ -1524,19 +1531,19 @@
 ⚪|cirkel|geometrisch|wit
 ⚪|cirkel|geometrisch|wit
 🟥|kaart|penalty|rood|vierkant
 🟥|kaart|penalty|rood|vierkant
 🟧|oranje|vierkant
 🟧|oranje|vierkant
-🟨|geel|gele kaart|kaart|kleur|penalty|vierkant
+🟨|geel|kaart|penalty|vierkant
 🟩|groen|vierkant
 🟩|groen|vierkant
 🟦|blauw|vierkant
 🟦|blauw|vierkant
 🟪|paars|vierkant
 🟪|paars|vierkant
 🟫|bruin|vierkant
 🟫|bruin|vierkant
 ⬛|geometrisch|groot|vierkant|zwart
 ⬛|geometrisch|groot|vierkant|zwart
-⬜|geometrisch|groot wit vierkant|vierkant|vorm
+⬜|geometrisch|groot|vierkant|wit
 ◼️|geometrisch|middelgroot|vierkant|zwart
 ◼️|geometrisch|middelgroot|vierkant|zwart
 ◻️|middelgroot|vierkant|wit
 ◻️|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 tot middelgroot|vierkant|wit
 ▪️|geometrisch|klein|vierkant|zwart
 ▪️|geometrisch|klein|vierkant|zwart
-▫️|geometrisch|klein wit vierkant|vierkant|vorm
+▫️|geometrisch|klein|vierkant|wit
 🔶|diamant|geometrisch|groot|oranje
 🔶|diamant|geometrisch|groot|oranje
 🔷|blauw|diamant|geometrisch|groot
 🔷|blauw|diamant|geometrisch|groot
 🔸|diamant|geometrisch|klein|oranje
 🔸|diamant|geometrisch|klein|oranje
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|engeland
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|engeland
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|schotland
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|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 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
 😅|å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
 🤣|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|smiler litt
 🙃|fjes som er opp-ned|opp-ned
 🙃|fjes som er opp-ned|opp-ned
 🫠|fjes som smelter|flau|forsvinner|går i oppløsning|haha|lol|sarkasme|sarkastisk|smelter
 🫠|fjes som smelter|flau|forsvinner|går i oppløsning|haha|lol|sarkasme|sarkastisk|smelter
@@ -97,8 +97,8 @@
 🤑|fjes|munn|pengegal|penger
 🤑|fjes|munn|pengegal|penger
 🤗|fjes som gir klem|klem
 🤗|fjes som gir klem|klem
 🤭|flire|hand over munnen|hånd over munnen|handa over munnen|hånden over munnen|oi|oops|ops|ups
 🤭|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
 🤫|hysj|stillhet|vær stille
 🤔|fjes|tankefull|tenkefjes|tenker
 🤔|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
 🫡|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|grimase
 😮‍💨|fjes|gisper|hviske|lettet|plystre|pust|sliten|sukk|utpust|utslitt
 😮‍💨|fjes|gisper|hviske|lettet|plystre|pust|sliten|sukk|utpust|utslitt
 🤥|fjes|løgn|lyver|pinocchio
 🤥|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
 🙂‍↔️|nei|ristende hode|rister på hodet
 🙂‍↕️|ja|nikkende hode|nikker
 🙂‍↕️|ja|nikkende hode|nikker
 😌|fjes|lettet
 😌|fjes|lettet
@@ -123,6 +123,7 @@
 😪|fjes|søvnig
 😪|fjes|søvnig
 🤤|fjes|sikler
 🤤|fjes|sikler
 😴|fjes|gjesp|god natt|godnatt|natt|snork|sove|søvn|trett|trøtt
 😴|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
 😷|bakteriemaske|fjes med munnbind|sykdom
 🤒|fjes med termometer|syk|termometer
 🤒|fjes med termometer|syk|termometer
 🤕|bandasjert hode|fjes|skadet
 🤕|bandasjert hode|fjes|skadet
@@ -230,7 +231,7 @@
 🗯️|ballong|boble|sint snakkeboble mot høyre|sur
 🗯️|ballong|boble|sint snakkeboble mot høyre|sur
 💭|boble|tankeboble|tegneserie
 💭|boble|tankeboble|tegneserie
 💤|følelse|god natt|snorker|sover|soving|søvnig|tegneserie|trett|trøtt|zzz
 💤|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
 🤚|håndbak|løftet
 🖐️|finger|flat hånd med spredte fingre|hånd|spredt
 🖐️|finger|flat hånd med spredte fingre|hånd|spredt
 ✋|flat hånd|håndflate|hevet hånd
 ✋|flat hånd|håndflate|hevet hånd
@@ -238,7 +239,7 @@
 🫱|håndhilse|håndtrykk|høyrevendt|rekke ut
 🫱|håndhilse|håndtrykk|høyrevendt|rekke ut
 🫲|håndhilse|håndtrykk|rekke ut|venstrevendt
 🫲|håndhilse|håndtrykk|rekke ut|venstrevendt
 🫳|avfeie|hand|hånd|husj|ned|opp|plukke|slapp|slippe
 🫳|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 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
 🫸|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
 👌|ålreit|bra|glimrende|greit|hand|hånd|klart|kult|okay|perfekt|supert
@@ -290,7 +291,7 @@
 👁️|kropp|øye
 👁️|kropp|øye
 👅|fjes|kropp|tunge
 👅|fjes|kropp|tunge
 👄|fjes|kropp|lepper|munn
 👄|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
 👶|baby|menneske|ung
 🧒|barn|kjønnsnøytral|menneske|ung
 🧒|barn|kjønnsnøytral|menneske|ung
 👦|gutt|menneske|ung
 👦|gutt|menneske|ung
@@ -395,9 +396,9 @@
 💂‍♂️|gardist|mannlig gardist|vakt
 💂‍♂️|gardist|mannlig gardist|vakt
 💂‍♀️|gardist|kvinnelig gardist|vakt
 💂‍♀️|gardist|kvinnelig gardist|vakt
 🥷|hemmelig|kampkunst|kampsport|kriger|ninja|skjult|slåss|snikende
 🥷|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
 🫅|adelig|høyhet|kongelig|krone|majestetisk|monark|person|royal
 🤴|prins
 🤴|prins
 👸|eventyr|fantasy|menneske|prinsesse
 👸|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|ø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|mann|ønsker
 🧞‍♀️|aladdin|ånd i lampe|ånden i flasken|djinn|fantasy|flaskeånd|genie|gni på lampen|kvinne|ø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
 🧟‍♂️|mannlig zombie|udød|vandød
 🧟‍♀️|kvinnelig zombie|udød|vandød
 🧟‍♀️|kvinnelig zombie|udød|vandød
 🧌|eventyr|fantasi|fantasy|monster|nettroll|troll
 🧌|eventyr|fantasi|fantasy|monster|nettroll|troll
@@ -494,7 +495,7 @@
 🏇|galopp|hesteveddeløp|jockey|løp|sport|veddeløpshest
 🏇|galopp|hesteveddeløp|jockey|løp|sport|veddeløpshest
 ⛷️|skiløper|snø
 ⛷️|skiløper|snø
 🏂|snøbrettkjøring|snowboarder|snowboarding|vintersport
 🏂|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|mannlig golfspiller
 🏌️‍♀️|golfspiller|kvinnelig golfspiller
 🏌️‍♀️|golfspiller|kvinnelig golfspiller
 🏄|hav|sport|strand|surfebrett|surfer|surfing
 🏄|hav|sport|strand|surfebrett|surfer|surfing
@@ -539,9 +540,9 @@
 🛀|badekar|person i badekar
 🛀|badekar|person i badekar
 🛌|god natt|hotell|overnatting|person i seng|sengetid|sove
 🛌|god natt|hotell|overnatting|person i seng|sengetid|sove
 🧑‍🤝‍🧑|hånd|holde hender|par|personer som leier
 🧑‍🤝‍🧑|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|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
 💏|kyssing|mennesker|romantikk
 💑|hjerte|kjærlighet|mennesker|par med hjerte|romantikk
 💑|hjerte|kjærlighet|mennesker|par med hjerte|romantikk
 🗣️|fjes|hode|silhuett|snakkende hode i profil|snakker
 🗣️|fjes|hode|silhuett|snakkende hode i profil|snakker
@@ -554,6 +555,7 @@
 🧑‍🧒|barn|familie|voksen
 🧑‍🧒|barn|familie|voksen
 🧑‍🧒‍🧒|barn|familie|voksen
 🧑‍🧒‍🧒|barn|familie|voksen
 👣|avtrykk|fotavtrykk|fotspor|kropp|spor
 👣|avtrykk|fotavtrykk|fotspor|kropp|spor
+🫆|avtrykk|etterforskning|fingeravtrykk|identitet|innbrudd|krim|sikkerhet|spor|teknisk|tyveri
 🐵|apefjes|dyr|fjes
 🐵|apefjes|dyr|fjes
 🐒|ape|dyr
 🐒|ape|dyr
 🦍|ape|dyr|gorilla
 🦍|ape|dyr|gorilla
@@ -653,7 +655,7 @@
 🦖|dinosaur|t-rex|tyrannosaurus rex
 🦖|dinosaur|t-rex|tyrannosaurus rex
 🐳|dyr|hval|sprutende hval|spruter
 🐳|dyr|hval|sprutende hval|spruter
 🐋|dyr|hval
 🐋|dyr|hval
-🐬|delfin|dyr
+🐬|delfin|dyr|flipper|hav|strand
 🦭|dyr|hav|sel|sjøløve
 🦭|dyr|hav|sel|sjøløve
 🐟|dyr|fiskene|stjernebilde|stjernetegn
 🐟|dyr|fiskene|stjernebilde|stjernetegn
 🐠|dyr|fisk|tropisk
 🐠|dyr|fisk|tropisk
@@ -663,6 +665,11 @@
 🐚|dyr|skjell|spiralskjell
 🐚|dyr|skjell|spiralskjell
 🪸|dyr|hav|klimaendringer|korallrev|rev
 🪸|dyr|hav|klimaendringer|korallrev|rev
 🪼|au|brennmanet|dyr|glassmanet|havdyr|manet|plankton|sjø|tentakler
 🪼|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|snegle
 🦋|dyr|insekt|pen|sommerfugl
 🦋|dyr|insekt|pen|sommerfugl
 🐛|åme|dyr|insekt|kryp|larve
 🐛|åme|dyr|insekt|kryp|larve
@@ -706,12 +713,13 @@
 🪹|bygge|grein|gren|heim|hjem|rede|reir|tomt
 🪹|bygge|grein|gren|heim|hjem|rede|reir|tomt
 🪺|egg|fugl|grein|gren|heim|hjem|rede|reir|tomt
 🪺|egg|fugl|grein|gren|heim|hjem|rede|reir|tomt
 🍄|fluesopp|sopp
 🍄|fluesopp|sopp
+🪾|dødt|stamme|tørke|tørt|tre|ufruktbart|vinter
 🍇|drueklase|druer|frukt
 🍇|drueklase|druer|frukt
 🍈|cantaloupe|frukt|honningmelon|melon
 🍈|cantaloupe|frukt|honningmelon|melon
 🍉|frukt|melon|vannmelon
 🍉|frukt|melon|vannmelon
 🍊|appelsin|c|frukt|klementin|mandarin|sitrus|vitamin
 🍊|appelsin|c|frukt|klementin|mandarin|sitrus|vitamin
 🍋|frukt|sitron|sitrus
 🍋|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
 🍌|banan|frukt
 🍍|ananas|frukt
 🍍|ananas|frukt
 🥭|frukt|mango|tropisk
 🥭|frukt|mango|tropisk
@@ -744,6 +752,7 @@
 🫚|helse|ingefærrot|krydder|naturlig|øl|rot|sunn|urt
 🫚|helse|ingefærrot|krydder|naturlig|øl|rot|sunn|urt
 🫛|belg|bønner|ertebelg|erter|grønnsak|soyabønne|sukkerert
 🫛|belg|bønner|ertebelg|erter|grønnsak|soyabønne|sukkerert
 🍄‍🟫|brun sopp|matsopp|natur|pizzafyll|portobello|sjampinjong|sopp|trøffel|vegetarianer
 🍄‍🟫|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|loff
 🥐|brød|croissant|fransk|mat
 🥐|brød|croissant|fransk|mat
 🥖|bagett|baguette|brød|fransk|mat
 🥖|bagett|baguette|brød|fransk|mat
@@ -795,11 +804,6 @@
 🥟|dumpling|empanada|gyoza|jiaozi|melbolle|pirog
 🥟|dumpling|empanada|gyoza|jiaozi|melbolle|pirog
 🥠|fortune cookie|lykkekake|spådom
 🥠|fortune cookie|lykkekake|spådom
 🥡|bestille|boks|eske|hentemat|kinesisk|mat|spisepinner|takeaway
 🥡|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|iskrem|restaurant|soft-is|softis
 🍧|dessert|is|restaurant|shave-ice|slush-is
 🍧|dessert|is|restaurant|shave-ice|slush-is
 🍨|dessert|iskrem|restaurant
 🍨|dessert|iskrem|restaurant
@@ -835,7 +839,7 @@
 🧊|chill|isbit|isterning|kald
 🧊|chill|isbit|isterning|kald
 🥢|hashi|spisepinner
 🥢|hashi|spisepinner
 🍽️|gaffel|kniv|matlaging|tallerken med kniv og gaffel
 🍽️|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
 🥄|bestikk|skje
 🔪|kniv|kokkekniv|matlaging|våpen|verktøy
 🔪|kniv|kokkekniv|matlaging|våpen|verktøy
 🫙|beholder|ingenting|krukke|mos|oppbevare|pålegg|syltetøy|tom
 🫙|beholder|ingenting|krukke|mos|oppbevare|pålegg|syltetøy|tom
@@ -1204,6 +1208,7 @@
 🪘|beat|conga|langtromme|musikk|perkusjon|rytme|tromme
 🪘|beat|conga|langtromme|musikk|perkusjon|rytme|tromme
 🪇|cha|dans|fest|instrument|maracas|marakas|musikk|perkusjon|riste|rytme
 🪇|cha|dans|fest|instrument|maracas|marakas|musikk|perkusjon|riste|rytme
 🪈|band|blokkfløyte|fløyte|instrument|korps|musikk|orkester|treblåseinstrument|treblåser
 🪈|band|blokkfløyte|fløyte|instrument|korps|musikk|orkester|treblåseinstrument|treblåser
+🪉|amor|harpe|instrument|kjærlighet|musikk|orkester
 📱|mobiltelefon|telefon
 📱|mobiltelefon|telefon
 📲|anrop|mobiltelefon med pil|pil|ring|telefon
 📲|anrop|mobiltelefon med pil|pil|ring|telefon
 ☎️|fasttelefon|ringe|telefon
 ☎️|fasttelefon|ringe|telefon
@@ -1334,6 +1339,7 @@
 🧰|kasse|rød boks|skrin|verktøykasse
 🧰|kasse|rød boks|skrin|verktøykasse
 🧲|hestesko|magnetisk|tiltrekning
 🧲|hestesko|magnetisk|tiltrekning
 🪜|klatre|steg|stige|trinn
 🪜|klatre|steg|stige|trinn
+🪏|grave|hull|skuffe|spade
 🧪|eksperiment|forskning|kjemiker|lab|prøverør|reagensrør
 🧪|eksperiment|forskning|kjemiker|lab|prøverør|reagensrør
 🧫|bakterie|biologi|kultur|lab|petriskål
 🧫|bakterie|biologi|kultur|lab|petriskål
 🧬|biologi|dna|evolusjon|gener|genetikk|liv
 🧬|biologi|dna|evolusjon|gener|genetikk|liv
@@ -1477,6 +1483,7 @@
 ➰|løkketegn
 ➰|løkketegn
 ➿|dobbel løkke-tegn
 ➿|dobbel løkke-tegn
 〽️|merke for nytt parti|nytt|parti
 〽️|merke for nytt parti|nytt|parti
+🫟|farge|flekk|holi|maling|søl|sprut
 🔠|abcd|bokstaver|inndata|store bokstaver
 🔠|abcd|bokstaver|inndata|store bokstaver
 🔡|abcd|bokstaver|inndata|små bokstaver
 🔡|abcd|bokstaver|inndata|små bokstaver
 🔢|1234|inndata|numeriske data|tall
 🔢|1234|inndata|numeriske data|tall
@@ -1804,4 +1811,5 @@
 🇿🇼|zimbabwe
 🇿🇼|zimbabwe
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁥󠁮󠁧󠁿|england
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|skottland
 🏴󠁧󠁢󠁳󠁣󠁴󠁿|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
 😀|1
 😃|2
 😃|2
 😄|3
 😄|3
@@ -123,3354 +123,3372 @@
 😪|59
 😪|59
 🤤|60
 🤤|60
 😴|61
 😴|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
 🤔|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
 🫡|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
 🤐|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
 😐|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
 😑|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
 😶|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|senna twarz|senność|spać|śpiąca buźka
 🤤|buźka|cieknie mi ślinka|głodny|mniam|ślina|śliniąca się twarz|ślinka
 🤤|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
 😴|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|lekarz|maska|operacja|pielęgniarka|twarz w masce medycznej
 🤒|buźka|choroba|gorączka|smutek|temperatura|termometr|twarz z termometrem
 🤒|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
 🤕|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
 🛀|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
 🛌|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
 🧑‍🤝‍🧑|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
 👫|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
 👬|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
 💏|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
 🧑‍🧒‍🧒|dorosły|dziecko|rodzina: dorosły, dziecko, dziecko
 🧑‍🧒‍🧒|dorosły|dziecko|rodzina: dorosły, dziecko, dziecko
 👣|odciski stóp|ślady stóp|stopy
 👣|odciski stóp|ślady stóp|stopy
+🫆|bezpieczeństwo|odcisk palca|tożsamość
 🐵|buźka|głowa małpy|małpka|zwierzę
 🐵|buźka|głowa małpy|małpka|zwierzę
 🐒|małpa|małpka|zwierzę
 🐒|małpa|małpka|zwierzę
 🦍|goryl|zwierzę
 🦍|goryl|zwierzę
@@ -663,6 +665,11 @@
 🐚|morze|muszelka|muszla spiralna|plaża|spirala|zwierzę
 🐚|morze|muszelka|muszla spiralna|plaża|spirala|zwierzę
 🪸|koralowa|koralowiec|ocean|rafa
 🪸|koralowa|koralowiec|ocean|rafa
 🪼|akwarium|bezkręgowiec|galareta|macki|meduza|morskie|morze|ocean|parzyć|plankton|zwierzę
 🪼|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ę
 🐌|mięczak|muszla|powolny|ślimak|wolny|zwierzę
 🦋|kolorowy|motyl|owad|zwierzę
 🦋|kolorowy|motyl|owad|zwierzę
 🐛|gąsienica|owad|robak|zwierzę
 🐛|gąsienica|owad|robak|zwierzę
@@ -706,6 +713,7 @@
 🪹|gniazdowanie|gnieżdżenie|ptasie|puste
 🪹|gniazdowanie|gnieżdżenie|ptasie|puste
 🪺|gniazdowanie|gnieżdżenie|jajka|ptasie|z jajkami|zniesione jaja
 🪺|gniazdowanie|gnieżdżenie|jajka|ptasie|z jajkami|zniesione jaja
 🍄|grzyb|muchomorek|trujący
 🍄|grzyb|muchomorek|trujący
+🪾|bez liści|drzewo|susza|zima
 🍇|jedzenie|owoce|winogrona
 🍇|jedzenie|owoce|winogrona
 🍈|jedzenie|melon|owoc
 🍈|jedzenie|melon|owoc
 🍉|arbuza|jedzenie|kawałek|lato|owoc
 🍉|arbuza|jedzenie|kawałek|lato|owoc
@@ -744,6 +752,7 @@
 🫚|imbiru|korzeń|naturalne|przyprawa|zdrowie|zioła|zioło
 🫚|imbiru|korzeń|naturalne|przyprawa|zdrowie|zioła|zioło
 🫛|edamame|fasola|grochu|łuskać|roślina|soja|sojowa|strączek|strączkowa|strąk|warzywo
 🫛|edamame|fasola|grochu|łuskać|roślina|soja|sojowa|strączek|strączkowa|strąk|warzywo
 🍄‍🟫|borowik|brązowy|grzyb|jedzenie|natura|shiitake|warzywo
 🍄‍🟫|borowik|brązowy|grzyb|jedzenie|natura|shiitake|warzywo
+🫜|burak|korzeń|ogród|rzepa|warzywo
 🍞|bochenek|chleba|jedzenie|kawałek|pieczywo
 🍞|bochenek|chleba|jedzenie|kawałek|pieczywo
 🥐|croissant|francuski|jedzenie|pieczywo|rogalik
 🥐|croissant|francuski|jedzenie|pieczywo|rogalik
 🥖|bagietka|bułka|chleb|jedzenie|pieczywo
 🥖|bagietka|bułka|chleb|jedzenie|pieczywo
@@ -795,11 +804,6 @@
 🥟|gyoza|jedzenie|pieróg|pierogi
 🥟|gyoza|jedzenie|pieróg|pierogi
 🥠|ciasteczko|ciastko|przepowiednia|szczęście|wróżba|z wróżbą
 🥠|ciasteczko|ciastko|przepowiednia|szczęście|wróżba|z wróżbą
 🥡|jedzenie|na wynos|pałeczki|pudełko|ryż
 🥡|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
 🍦|jedzenie|lody|śmietankowe|świderek|w kubku|włoskie
 🍧|deser|hawajskie|jedzenie|lody
 🍧|deser|hawajskie|jedzenie|lody
 🍨|deser|jedzenie|lody
 🍨|deser|jedzenie|lody
@@ -1204,6 +1208,7 @@
 🪘|bębenek|bębnić|instrument|konga|muzyka|rytm|tamburyn
 🪘|bębenek|bębnić|instrument|konga|muzyka|rytm|tamburyn
 🪇|cza cza|grzechotać|grzechotki|impreza|instrument|marakasy|muzyka|perkusja|perkusyjny|potrząsać|taniec
 🪇|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
 🪈|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
 📱|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ą
 📲|dzwonić|komórka|odebrać|połączenie|smartfon ze strzałką|strzałka|telefon komórkowy ze strzałką
 ☎️|aparat telefoniczny|telefon
 ☎️|aparat telefoniczny|telefon
@@ -1334,6 +1339,7 @@
 🧰|czerwona|klucze|kombinerki|mechanik|na narzędzia|narzędzia|narzędzie|skrzynka|z narzędziami
 🧰|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
 🧲|kształt u|magnes|magnetyczny|magnetyzm|odpychanie|podkowa|przyciąganie
 🪜|do góry|drabina|hierarchia|ranking|stopnie|szczebel|wspinać się
 🪜|do góry|drabina|hierarchia|ranking|stopnie|szczebel|wspinać się
+🪏|dziura|kopać|łopata|szpadel
 🧪|chemia|chemik|eksperyment|laboratorium|nauka|probówka
 🧪|chemia|chemik|eksperyment|laboratorium|nauka|probówka
 🧫|badania|bakteria|bakterie|biologia|kultura|laboratorium|płytka petriego|szalka petriego
 🧫|badania|bakteria|bakterie|biologia|kultura|laboratorium|płytka petriego|szalka petriego
 🧬|biolog|dna|ewolucja|genetyka|geny|życie
 🧬|biolog|dna|ewolucja|genetyka|geny|życie
@@ -1477,6 +1483,7 @@
 ➰|pętla|zawijas|znak
 ➰|pętla|zawijas|znak
 ➿|pętla|podwójna|zawijas
 ➿|pętla|podwójna|zawijas
 〽️|m|początek partii wokalnej|znak|zygzak
 〽️|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|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ć
 🔡|abcd|alfabet łaciński|łacińskie|litery|małe litery|małymi literami|pisać|wprowadzać
 🔢|1234|cyfry|kalkulator|liczby|wprowadzać
 🔢|1234|cyfry|kalkulator|liczby|wprowadzać

文件差异内容过多而无法显示
+ 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ý
 😪|ospalá|plakať|smajlík|smutný|spánok|tvár|únava|unavený
 🤤|blaho|chutné|hlad|slintajúca tvár|slintať|smajlík|tvár
 🤤|blaho|chutné|hlad|slintajúca tvár|slintať|smajlík|tvár
 😴|spánok|spať|spiaca tvár|tvár|unavený|znudený|zzz
 😴|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
 😷|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
 🤒|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
 🤕|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
 🧑‍🧒|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
 🧑‍🧒‍🧒|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
 👣|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án|hlava opice|opica|príroda|tvár opice|zvedavá|zvedavý george|zviera
 🐒|banány|džungľa|opica|opička|príroda|zviera
 🐒|banány|džungľa|opica|opička|príroda|zviera
 🦍|gorila|opica|príroda|zviera
 🦍|gorila|opica|príroda|zviera
@@ -663,6 +665,11 @@
 🐚|mušľa|oceán|pláž|príroda|škebľa|špirálovitá
 🐚|mušľa|oceán|pláž|príroda|škebľa|špirálovitá
 🪸|klíma|klimatické zmeny|koral|more|oceán|útes
 🪸|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
 🪼|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
 🐌|príroda|slimák|záhrada|zviera
 🦋|hmyz|krása|modrý motýľ|motýľ|pekný|príroda|zviera
 🦋|hmyz|krása|modrý motýľ|motýľ|pekný|príroda|zviera
 🐛|chrobák|hmyz|húsenica|príroda|záhrada|zviera
 🐛|chrobák|hmyz|húsenica|príroda|záhrada|zviera
@@ -706,6 +713,7 @@
 🪹|domov|hniezdenie|hniezdo|prázdne hniezdo
 🪹|domov|hniezdenie|hniezdo|prázdne hniezdo
 🪺|hniezdenie|hniezdo s vajcami|vajce|vajíčko|vtáča|vták
 🪺|hniezdenie|hniezdo s vajcami|vajce|vajíčko|vtáča|vták
 🍄|hríb|huba|mario|muchotrávka|príroda|rastlina
 🍄|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
 🍇|dionýzos|hrozno|jedlo|ovocie|rastlina|réva|vinná réva
 🍈|cukrový melón|jedlo|melón|ovocie|rastlina|žltá dyňa
 🍈|cukrový melón|jedlo|melón|ovocie|rastlina|žltá dyňa
 🍉|červený melón|dyňa|jedlo|melón|ovocie|rastlina|vodný melón
 🍉|č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
 🫚|koreň ďumbiera|korenina|pivo|rastlina|štipľavý|zázvor|zdravie
 🫛|edamame|fazuľa|hrachový struk|strukovina|vegetariánske|zelenina
 🫛|edamame|fazuľa|hrachový struk|strukovina|vegetariánske|zelenina
 🍄‍🟫|hnedý hríb|huba|huby|jedlo|príroda|vegetarián|výhonok|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
 🍞|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
 🥐|croissant|francúzske|francúzsky|jedlo|pečivo|rožok
 🥖|bageta|chlieb|francúzske|jedlo|pečivo
 🥖|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
 🥟|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
 🥠|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
 🥡|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
 🍦|č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|dreň|hlad|jedlo|mrazená dreň|ochutená ľadová drť|reštaurácia|sladkosť|zmrzlina
 🍨|dezert|jedlo|krém|sladkosť|sorbet|zmrzlina
 🍨|dezert|jedlo|krém|sladkosť|sorbet|zmrzlina
@@ -1204,6 +1208,7 @@
 🪘|bubenícke|bubon|hudobný nástroj|kongo|rytmus
 🪘|bubenícke|bubon|hudobný nástroj|kongo|rytmus
 🪇|hrkať|hudba|nástroj|párty|perkusie|rumbagule|tancovať|triasť
 🪇|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
 🪈|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
 📱|komunikácia|mobilný|telefón
 📲|hovor|mobil so šípkou|mobilný telefón so šípkou|prijímať|šípka|telefón
 📲|hovor|mobil so šípkou|mobilný telefón so šípkou|prijímať|šípka|telefón
 ☎️|červená|pevná linka|telefón|volať
 ☎️|č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
 🧰|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ť
 🧲|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
 🪜|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
 🧪|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
 🧫|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
 🧬|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
 ⭕|č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|matematika|násobenie|násobiť|x|znak|zrušiť
 ❎|×|krát|krížik|násobenie|štvorec|tlačidlo s krížikom|x|znak
 ❎|×|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
 ➿|cyklus|dvojitá|slučka
 〽️|časť|graf|krivka|part|značka striedania častí|znak začiatku partu
 〽️|č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|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
 🔡|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
 🔢|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 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
 😄|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
 😁|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
 😅|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|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
 🙃|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
 😉|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
 😊|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
 😇|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
 😍|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
 🤩|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
 😘|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
 ☺️|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
 😚|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
 😙|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
 😋|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 çı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
 😜|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
 😐|duygusuz|etkilenmemiş|nötr|umurumda değil|yorum yok|yüz
 😑|ifadesiz yüz|ifadesizlik|kıskanç|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
 😶|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
 😶‍🌫️|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
 😏|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
 😒|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
 😬|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
 🤥|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
 🙂‍↔️|hayır|sallama|yatay olarak sallanan yüz
 🙂‍↕️|dikey olarak sallanan yüz|evet|onay
 🙂‍↕️|dikey olarak sallanan yüz|evet|onay
 😌|huzur|rahatlamış|yüz
 😌|huzur|rahatlamış|yüz
 😔|dargın|düşünceli|gemileri batmış|karamsar|üzgün|yüz
 😔|dargın|düşünceli|gemileri batmış|karamsar|üzgün|yüz
 😪|ağlayan yüz|uykulu yüz|yorgun|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
 🤤|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
 😷|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
 🤒|ağzında termometre olan yüz|ateş|grip|hasta|nezle|termometre|yüz
 🤕|bandaj|kafası sarılı yüz|yaralı|yüz
 🤕|bandaj|kafası sarılı yüz|yaralı|yüz
 🤢|iğrenç|istifra|kusmak üzere olan yüz|midesi bulanmış|yüz
 🤢|iğrenç|istifra|kusmak üzere olan yüz|midesi bulanmış|yüz
 🤮|hasta|istifra|kusan yüz|kusmak|kusmuk|surat
 🤮|hasta|istifra|kusan yüz|kusmak|kusmuk|surat
 🤧|çok yaşa|grip|hapşıran yüz|hapşırma|hasta|nezle|yüz
 🤧|ç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
 😵|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
 🤯|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
 🤠|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
 😎|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
 🤓|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
 🧐|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
 😕|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
 😟|endişeli|gergin|yüz
 🙁|asık surat|biraz asık surat|endişeli|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ğı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
 😯|şaşırmış|şaşkın yüz|şok olmuş|yüz
 😲|afallamış|şaşkın|şoke olmuş|tamamen şoke 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
 😳|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
 😦|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
 😧|acı çeken|kederli|mutsuz|şaşkın|yüz
 😨|endişeli|korkmuş|korkulu|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
 😓|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
 😩|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
 😫|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
 😤|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ırmızı somurtkan yüz|kırmızı yüz|öfkeli|somurtkan|yüz
 😠|deli gibi|kızgın|mutsuz|öfkeli|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
 🫴|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|sola iten el
 🫸|bekletme|çakma|durdurma|itme|reddetme|sağa 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
 🤌|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
 🤏|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
 ✌️|barış|el|oleey|zafer eli|zafer işareti
@@ -284,7 +285,7 @@
 🧠|akıllı|beyin|zeka|zeki
 🧠|akıllı|beyin|zeka|zeki
 🫀|anatomi|kalp atışı|kan|kardiyoloji|kırmızı|merkez|nabız|organ
 🫀|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
 🫁|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
 🦴|iskelet|kemik|köpek kemiği|mama
 👀|bakmak|görmek|gözcü|gözetlemek|gözler|yüz
 👀|bakmak|görmek|gözcü|gözetlemek|gözler|yüz
 👁️|beden|göz|kahverengi gö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
 🙎|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
 🙎‍♂️|adam|darılan erkek|darılma|erkek|mimik
 🙎‍♀️|bayan|darılan kadın|darılma|kadın|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
 🙅‍♂️|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
 🙅‍♀️|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
 🙆|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
 🙆‍♂️|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
 🙆‍♀️|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
 💁‍♂️|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
 💁‍♀️|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
 🙋‍♂️|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
 🙋‍♀️|bayan|el kaldırma|elini kaldıran kadın|hareket|kadın
 🧏|duyma|erişilebilirlik|işitme engelli kişi|kulak
 🧏|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
 🙇|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
 🙇‍♂️|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
 🙇‍♀️|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
 🤷|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
 🤷‍♀️|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
 🧑‍⚕️|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
 👨‍⚕️|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
 🚵|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
 🚵‍♂️|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
 🚵‍♀️|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
 🤸‍♀️|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
 🤼|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
 🤼‍♂️|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 erkek|meditasyon|yoga
 🧘‍♀️|lotus pozisyonundaki kadın|meditasyon|yoga
 🧘‍♀️|lotus pozisyonundaki kadın|meditasyon|yoga
 🛀|banyo yapan kişi|küvet
 🛀|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
 🧑‍🤝‍🧑|ç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
 👭|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
 👫|ç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
 🧑‍🧒‍🧒|aile|çocuk|yetişkin
 🧑‍🧒‍🧒|aile|çocuk|yetişkin
 👣|ayak izi|gövde|iz
 👣|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|komik|maymun yüzü|meraklı maymun|muz|neşeli|yüz
 🐒|hayvan|maymun|muz|orman
 🐒|hayvan|maymun|muz|orman
 🦍|goril|hayvan
 🦍|goril|hayvan
@@ -663,6 +665,11 @@
 🐚|deniz kabuğu|deniz sesi|hayvan|midye|okyanus|spiral deniz kabuğu
 🐚|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ı
 🪸|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
 🪼|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|hayvan|salyangoz|sümüklü böcek|yavaş
 🦋|böcek|kelebek|şirin
 🦋|böcek|kelebek|şirin
 🐛|böcek|hayvan|kırkayak|tırtıl
 🐛|böcek|hayvan|kırkayak|tırtıl
@@ -675,14 +682,14 @@
 🕷️|böcek|örümcek
 🕷️|böcek|örümcek
 🕸️|örümcek ağı
 🕸️|örümcek ağı
 🦂|akrep|burç|hayvan|iğne|zehir
 🦂|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
 🪰|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
 🪱|hayvan|kurtçuk|parazit|solucan|sürüngen
 🦠|amip|bakteri|bilim|deney|hastalık|hücre|laboratuvar|mikrop|tek hücreli|virüs
 🦠|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
 💐|aşk|buket|çiçek|doğum günü|gül|romantizm
 🌸|bahar|çiçek izleme|kiraz çiçeği
 🌸|bahar|çiçek izleme|kiraz çiçeği
 💮|beyaz çiçek|çiçek damgası|damga|iyi çalışma damgası
 💮|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
 🏵️|bitki|çiçek rozet|gülce|sarı çiçek
 🌹|aşk|bitki|çiçek|gül|kırmızı gül
 🌹|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
 🥀|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
 🪹|boş yuva|dal|doğa|ev|kuş|yuva
 🪺|dal|doğa|hayvan|huzur|kuş yuvası|yavru kuş|yumurta bulunan yuva|yuva
 🪺|dal|doğa|hayvan|huzur|kuş yuvası|yavru kuş|yumurta bulunan yuva|yuva
 🍄|bitki|kırmızı mantar|mantar|masal
 🍄|bitki|kırmızı mantar|mantar|masal
+🪾|çorak|kış|kurak|yapraksız ağaç
 🍇|gıda|meyve|salkım|üzüm
 🍇|gıda|meyve|salkım|üzüm
 🍈|gıda|kavun|meyve|meze|rakı|yemek
 🍈|gıda|kavun|meyve|meze|rakı|yemek
 🍉|gıda|karpuz|meyve
 🍉|gıda|karpuz|meyve
@@ -744,6 +752,7 @@
 🫚|baharat|bira|bitki|çeşni|doğal|kök|sağlık|şifalı|yiyecek|yumru|zencefil
 🫚|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
 🫛|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
 🍄‍🟫|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
 🍞|ekmek dilimi|gıda|kahvaltı|restoran|yemek
 🥐|ay çöreği|ekmek|fransız|gıda|kruvasan|pastane|yiyecek
 🥐|ay çöreği|ekmek|fransız|gıda|kruvasan|pastane|yiyecek
 🥖|baget|ekmek|fransız|gıda|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|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|güveç|kahvaltı|krep tavası|küçük|menemen|paella|sahanda yemek|tava|yemek|yiyecek
 🍲|gıda|restoran|tencere yemeği|yahni|yemek tenceresi|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
 🥣|ç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|sağlıklı|salata|yemek|yeşil|yiyecek
 🍿|gıda|mısır|patlamış mısır|sinema
 🍿|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
 🥟|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
 🥠|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
 🥡|ç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
 🍦|dondurma külahı|gıda|krema|külah|restoran|vanilyalı dondurma|yumuşak dondurma
 🍧|buz|meyveli|restoran
 🍧|buz|meyveli|restoran
 🍨|buz|dondurma|gıda|krema|kup|restoran|tatlı
 🍨|buz|dondurma|gıda|krema|kup|restoran|tatlı
@@ -807,7 +811,7 @@
 🍪|çikolatalı kurabiye|cookie|gıda|kurabiye|restoran
 🍪|ç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
 🎂|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
 🍰|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
 🥧|elmalı pay|gıda|pasta|pay|poğaça|şeftalili pay|tart|tatlı|yemek
 🍫|bar|çikolata barı|gıda|restoran|tatlı
 🍫|bar|çikolata barı|gıda|restoran|tatlı
 🍬|bayram|restoran|şekerleme
 🍬|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ş
 🪘|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ı
 🪇|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
 🪈|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
 📱|cep telefonu|iphone|mobil telefon|telefon
 📲|çağrı yapmak|cep telefonu|mobil telefon|ok işaretli cep telefonu|telefon
 📲|çağrı yapmak|cep telefonu|mobil telefon|ok işaretli cep telefonu|telefon
 ☎️|kırmızı telefon|telefon
 ☎️|kırmızı telefon|telefon
@@ -1257,14 +1262,14 @@
 🔖|defter|işaret|kitap|not|yer işareti
 🔖|defter|işaret|kitap|not|yer işareti
 🏷️|etiket
 🏷️|etiket
 💰|çanta|dolar çantası|para çuvalı|para torbası|zengin
 💰|ç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|döviz|para|yen
 💵|banknot|dolar|döviz|fatura|para
 💵|banknot|dolar|döviz|fatura|para
 💶|avro|banknot|döviz|euro|fatura|para
 💶|avro|banknot|döviz|euro|fatura|para
 💷|banknot|döviz|para|sterlin
 💷|banknot|döviz|para|sterlin
 💸|banka|banknot|kanatlı para|para|uçan banknot
 💸|banka|banknot|kanatlı para|para|uçan banknot
 💳|kart|kredi kartı
 💳|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ü
 💹|banka|grafik|para|piyasa|yen simgeli artış grafiği|yukarı giden grafik|yukarı yönlü
 📧|e-posta|iletişim|mektup|posta
 📧|e-posta|iletişim|mektup|posta
 📨|alınan posta|e-posta|gelen|iletişim|mektup|posta|zarf
 📨|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ı
 🛠️|alet|çekiç ve ingiliz anahtarı|çekiç ve somun anahtarı|ingiliz anahtarı
 🗡️|bıçak|hançer|silah
 🗡️|bıçak|hançer|silah
 💣|bomba|çizgi roman|duygu
 💣|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
 🏹|araç|burç|ok ve yay|okçu|silah|yay
 🛡️|kalkan|silah
 🛡️|kalkan|silah
 🪚|alet|eşya|kereste|kesmek|marangoz|odun|testere
 🪚|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
 🧰|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
 🧲|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ı
 🪜|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
 🧬|biyolog|biyoloji|dna|evrim|genetik|sarmal|yaşam
 🔬|alet|bilim|labrotuar|mikroskop|test
 🔬|alet|bilim|labrotuar|mikroskop|test
 🔭|alet|teleskop|uzay gözlemleme
 🔭|alet|teleskop|uzay gözlemleme
@@ -1477,6 +1483,7 @@
 ➰|döngü|dönüş|kıvrık döngü
 ➰|döngü|dönüş|kıvrık döngü
 ➿|çift kıvrık döngü|japonya|kıvrık döngü|ücretsiz numara
 ➿|ç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
 〽️|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|büyük harfler|latin büyük harfleriyle giriş
 🔡|abcd|alfabe|küçük harfler|latin küçük harfleriyle giriş
 🔡|abcd|alfabe|küçük harfler|latin küçük harfleriyle giriş
 🔢|1234|sayı girişi|sayılar
 🔢|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-подібний|магнетизм|магніт|північний-південний|підкова|позитивний-негативний|притягання|притягувати|тяжіння
 🧲|u-подібний|магнетизм|магніт|північний-південний|підкова|позитивний-негативний|притягання|притягувати|тяжіння
 🪜|вилізти|драбина|лізти|перекладина|приставна драбина|сходинка|щабель
 🪜|вилізти|драбина|лізти|перекладина|приставна драбина|сходинка|щабель
+🪏|заступ|копати|могила|поховання|рослина|сад|сніг|совок|яма
 🧪|дослід|експеримент|лабораторія|наука|пробірка|хімік|хімія
 🧪|дослід|експеримент|лабораторія|наука|пробірка|хімік|хімія
 🧫|бактерії|бактерія|біологія|культура|лабораторія|чашка петрі
 🧫|бактерії|бактерія|біологія|культура|лабораторія|чашка петрі
 🧬|біологія|генетика|днк|еволюція|життя|спіраль
 🧬|біологія|генетика|днк|еволюція|життя|спіраль
@@ -1477,6 +1483,7 @@
 ➰|закручена петля|закручений|петля
 ➰|закручена петля|закручений|петля
 ➿|закручений|петля|подвійна закручена петля|подвійний
 ➿|закручений|петля|подвійна закручена петля|подвійний
 〽️|значок|частина|японський знак початку частини пісні
 〽️|значок|частина|японський знак початку частини пісні
+🫟|безлад|бризки|краплі|пляма|рідина|розливати|фарби|холі|чорнило
 🔠|введення великими латинськими літерами|великі|латинські|літери
 🔠|введення великими латинськими літерами|великі|латинські|літери
 🔡|abcd|алфавіт|введення малими латинськими літерами|латинські|літери|малі
 🔡|abcd|алфавіт|введення малими латинськими літерами|латинські|літери|малі
 🔢|1234|введення цифрами|цифри
 🔢|1234|введення цифрами|цифри

二进制
app/assets/emojis/smileys-0.png


二进制
app/assets/emojis/smileys-1.png


二进制
app/assets/emojis/symbols-0.png


二进制
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>
 <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>
 <h2>Emoji art supplied by <a href="http://emojione.com">EmojiOne</a></h2>
 
 
 <p>Licensed under Creative Commons License (CC-BY 4.0).</p>
 <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>
 <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>
 <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>
 <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>
 <h2>WebRTC</h2>
 
 
 <p>Copyright (c) 2011, The WebRTC project authors. All rights reserved.</p>
 <p>Copyright (c) 2011, The WebRTC project authors. All rights reserved.</p>
@@ -677,4 +606,4 @@ POSSIBILITY OF SUCH DAMAGE.</p>
 </body>
 </body>
 
 
 </html>
 </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.api.ApkVariantOutputImpl
+import com.android.build.gradle.internal.tasks.factory.dependsOn
+import config.BuildFeatureFlags
 import config.PublicKeys
 import config.PublicKeys
 import config.setProductNames
 import config.setProductNames
 import org.gradle.api.tasks.testing.logging.TestExceptionFormat
 import org.gradle.api.tasks.testing.logging.TestExceptionFormat
+import org.gradle.kotlin.dsl.lintChecks
+import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 import utils.*
 import utils.*
 
 
 plugins {
 plugins {
@@ -47,7 +51,7 @@ if (gradle.startParameter.taskRequests.toString().contains("Hms")) {
 /**
 /**
  * Only use the scheme "<major>.<minor>.<patch>" for the appVersion
  * 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`).
  * betaSuffix with leading dash (e.g. `-beta1`).
@@ -56,7 +60,7 @@ val appVersion = "6.1.3"
  */
  */
 val betaSuffix = ""
 val betaSuffix = ""
 
 
-val defaultVersionCode = 1087
+val defaultVersionCode = 1095
 
 
 /**
 /**
  * Map with keystore paths (if found).
  * Map with keystore paths (if found).
@@ -74,7 +78,7 @@ android {
     //       make sure to adjust them in `scripts/Dockerfile` as well!
     //       make sure to adjust them in `scripts/Dockerfile` as well!
     compileSdk = 35
     compileSdk = 35
     buildToolsVersion = "35.0.0"
     buildToolsVersion = "35.0.0"
-    ndkVersion = "25.2.9519653"
+    ndkVersion = "28.2.13676358"
 
 
     defaultConfig {
     defaultConfig {
         // https://developer.android.com/training/testing/espresso/setup#analytics
         // https://developer.android.com/training/testing/espresso/setup#analytics
@@ -82,9 +86,8 @@ android {
             put("notAnnotation", "ch.threema.app.DangerousTest")
             put("notAnnotation", "ch.threema.app.DangerousTest")
             put("disableAnalytics", "true")
             put("disableAnalytics", "true")
         }
         }
-        minSdk = 21
-        //noinspection OldTargetApi
-        targetSdk = 34
+        minSdk = 24
+        targetSdk = 35
         vectorDrawables.useSupportLibrary = true
         vectorDrawables.useSupportLibrary = true
         applicationId = "ch.threema.app"
         applicationId = "ch.threema.app"
         testApplicationId = "$applicationId.test"
         testApplicationId = "$applicationId.test"
@@ -143,15 +146,13 @@ android {
 
 
         stringArrayBuildConfigField("ONPREM_CONFIG_TRUSTED_PUBLIC_KEYS", emptyArray())
         stringArrayBuildConfigField("ONPREM_CONFIG_TRUSTED_PUBLIC_KEYS", emptyArray())
         booleanBuildConfigField("MD_SYNC_DISTRIBUTION_LISTS", false)
         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
         // config fields for action URLs / deep links
         stringBuildConfigField("uriScheme", "threema")
         stringBuildConfigField("uriScheme", "threema")
         stringBuildConfigField("actionUrl", "go.threema.ch")
         stringBuildConfigField("actionUrl", "go.threema.ch")
         stringBuildConfigField("contactActionUrl", "threema.id")
         stringBuildConfigField("contactActionUrl", "threema.id")
-        stringBuildConfigField("groupLinkActionUrl", "threema.group")
 
 
         // The OPPF url must be null in the default config. Do not change this.
         // The OPPF url must be null in the default config. Do not change this.
         stringBuildConfigField("PRESET_OPPF_URL", null)
         stringBuildConfigField("PRESET_OPPF_URL", null)
@@ -159,7 +160,6 @@ android {
         with(manifestPlaceholders) {
         with(manifestPlaceholders) {
             put("uriScheme", "threema")
             put("uriScheme", "threema")
             put("contactActionUrl", "threema.id")
             put("contactActionUrl", "threema.id")
-            put("groupLinkActionUrl", "threema.group")
             put("actionUrl", "go.threema.ch")
             put("actionUrl", "go.threema.ch")
             put("callMimeType", "vnd.android.cursor.item/vnd.$applicationId.call")
             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_URL", "https://apip.test.threema.ch/")
             stringBuildConfigField("DIRECTORY_SERVER_IPV6_URL", "https://ds-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("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("AVATAR_FETCH_URL", "https://avatar.test.threema.ch/")
             stringBuildConfigField("APP_RATING_URL", "https://test.threema.com/app-rating/android/{rating}")
             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")
             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_URL", "https://apip-work.test.threema.ch/")
             stringBuildConfigField("WORK_SERVER_IPV6_URL", "https://ds-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("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("AVATAR_FETCH_URL", "https://avatar.test.threema.ch/")
             stringBuildConfigField("APP_RATING_URL", "https://test.threema.com/app-rating/android-work/{rating}")
             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")
             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_URL", "https://apip-work.test.threema.ch/")
             stringBuildConfigField("WORK_SERVER_IPV6_URL", "https://ds-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("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("AVATAR_FETCH_URL", "https://avatar.test.threema.ch/")
             stringBuildConfigField("APP_RATING_URL", "https://test.threema.com/app-rating/android-work/{rating}")
             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")
             stringBuildConfigField("MAP_STYLES_URL", "https://map.test.threema.ch/styles/threema/style.json")
@@ -519,6 +531,8 @@ android {
             assets.srcDirs("assets")
             assets.srcDirs("assets")
             jniLibs.srcDirs("libs")
             jniLibs.srcDirs("libs")
             res.srcDir("src/main/res-rendezvous")
             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
         // Based on Google services
@@ -574,7 +588,6 @@ android {
     buildTypes {
     buildTypes {
         debug {
         debug {
             isDebuggable = true
             isDebuggable = true
-            isJniDebuggable = false
             ndk {
             ndk {
                 debugSymbolLevel = "FULL"
                 debugSymbolLevel = "FULL"
             }
             }
@@ -587,7 +600,6 @@ android {
         }
         }
         release {
         release {
             isDebuggable = false
             isDebuggable = false
-            isJniDebuggable = false
             isMinifyEnabled = true
             isMinifyEnabled = true
             isShrinkResources = false // Caused inconsistencies between local and CI builds
             isShrinkResources = false // Caused inconsistencies between local and CI builds
             vcsInfo.include = false // For reproducible builds independent from git history
             vcsInfo.include = false // For reproducible builds independent from git history
@@ -624,12 +636,6 @@ android {
         }
         }
     }
     }
 
 
-    externalNativeBuild {
-        ndkBuild {
-            path("jni/Android.mk")
-        }
-    }
-
     packaging {
     packaging {
         jniLibs {
         jniLibs {
             // replacement for extractNativeLibs in AndroidManifest
             // 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
             // 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
             // 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.
             // returns either null or zero when accessing platform APIs, rather than throwing an exception.
             isReturnDefaultValues = true
             isReturnDefaultValues = true
         }
         }
@@ -720,7 +726,7 @@ android {
         error.addAll(setOf("Wakelock", "TextViewEdits", "ResourceAsColor"))
         error.addAll(setOf("Wakelock", "TextViewEdits", "ResourceAsColor"))
         // Set the severity of the given issues to fatal (which means they will be
         // 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)
         // 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
         ignoreWarnings = false
         // if true, don't include source code lines in the error output
         // if true, don't include source code lines in the error output
         noLines = false
         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
 // Only build relevant buildType / flavor combinations
 androidComponents {
 androidComponents {
     beforeVariants { variant ->
     beforeVariants { variant ->
@@ -766,6 +777,14 @@ dependencies {
 
 
     implementation(project(":domain"))
     implementation(project(":domain"))
     implementation(project(":common"))
     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)
     implementation(libs.sqlcipher.android)
 
 
@@ -777,7 +796,6 @@ dependencies {
     implementation(libs.commonsText)
     implementation(libs.commonsText)
     implementation(libs.slf4j.api)
     implementation(libs.slf4j.api)
     implementation(libs.androidImageCropper)
     implementation(libs.androidImageCropper)
-    implementation(libs.trustkit)
     implementation(libs.fastscroll)
     implementation(libs.fastscroll)
     implementation(libs.ezVcard)
     implementation(libs.ezVcard)
     implementation(libs.gestureViews)
     implementation(libs.gestureViews)
@@ -878,11 +896,6 @@ dependencies {
     testImplementation(project(":test-helpers"))
     testImplementation(project(":test-helpers"))
     androidTestImplementation(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)
     testImplementation(libs.mockk)
     androidTestImplementation(libs.mockkAndroid)
     androidTestImplementation(libs.mockkAndroid)
 
 
@@ -917,7 +930,6 @@ dependencies {
     }
     }
     androidTestImplementation(libs.androidx.test.uiautomator)
     androidTestImplementation(libs.androidx.test.uiautomator)
     androidTestImplementation(libs.androidx.test.core)
     androidTestImplementation(libs.androidx.test.core)
-    androidTestImplementation(libs.mockito.core)
     androidTestImplementation(libs.kotlinx.coroutines.test)
     androidTestImplementation(libs.kotlinx.coroutines.test)
     testImplementation(libs.kotlinx.coroutines.test)
     testImplementation(libs.kotlinx.coroutines.test)
 
 
@@ -997,7 +1009,7 @@ cargo {
     features {
     features {
         defaultAnd(arrayOf("uniffi"))
         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
     verbose = false
 }
 }
 
 
@@ -1029,6 +1041,14 @@ androidStem {
     includeLocalizedOnlyTemplates = true
     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> {
 tasks.withType<Test> {
     // Necessary to load the dynamic libthreema library in unit tests
     // Necessary to load the dynamic libthreema library in unit tests
     systemProperty("jna.library.path", "${project.projectDir}/../domain/libthreema/target/release")
     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
 // See https://medium.com/stepstone-tech/how-to-capture-screenshots-for-failed-ui-tests-9927eea6e1e4
 val reportsDirectory = "${layout.buildDirectory}/reports/androidTests/connected"
 val reportsDirectory = "${layout.buildDirectory}/reports/androidTests/connected"
 val screenshotsDirectory = "/sdcard/testfailures/screenshots/"
 val screenshotsDirectory = "/sdcard/testfailures/screenshots/"
-val clearScreenshotsTask = task<Exec>("clearScreenshots") {
+val clearScreenshotsTask = tasks.register<Exec>("clearScreenshots") {
     executable = android.adbExecutable.toString()
     executable = android.adbExecutable.toString()
     args("shell", "rm", "-r", screenshotsDirectory)
     args("shell", "rm", "-r", screenshotsDirectory)
 }
 }
-val createScreenshotsDirectoryTask = task<Exec>("createScreenshotsDirectory") {
+val createScreenshotsDirectoryTask = tasks.register<Exec>("createScreenshotsDirectory") {
     group = "reporting"
     group = "reporting"
     executable = android.adbExecutable.toString()
     executable = android.adbExecutable.toString()
     args("shell", "mkdir", "-p", screenshotsDirectory)
     args("shell", "mkdir", "-p", screenshotsDirectory)
 }
 }
-val fetchScreenshotsTask = task<Exec>("fetchScreenshots") {
+val fetchScreenshotsTask = tasks.register<Exec>("fetchScreenshots") {
     group = "reporting"
     group = "reporting"
     executable = android.adbExecutable.toString()
     executable = android.adbExecutable.toString()
     args("pull", "$screenshotsDirectory.", reportsDirectory)
     args("pull", "$screenshotsDirectory.", reportsDirectory)
@@ -1062,3 +1082,16 @@ tasks.whenTaskAdded {
         finalizedBy(fetchScreenshotsTask)
         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

二进制
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

二进制
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

二进制
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

二进制
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
 -dontwarn com.google.common.collect.MinMaxPriorityQueue
 
 
 # threema-specific
 # threema-specific
--dontwarn org.mockito.**
 -dontwarn sun.reflect.**
 -dontwarn sun.reflect.**
 -dontwarn android.test.**
 -dontwarn android.test.**
 -dontwarn class.org.junit.**
 -dontwarn class.org.junit.**
@@ -113,9 +112,6 @@ public static <fields>;
 -dontwarn android.view.**
 -dontwarn android.view.**
 -dontwarn android.widget.**
 -dontwarn android.widget.**
 -dontwarn com.google.common.primitives.**
 -dontwarn com.google.common.primitives.**
--dontwarn **CompatHoneycomb
--dontwarn **CompatHoneycombMR2
--dontwarn **CompatCreatorHoneycombMR2
 -dontwarn java.beans.**
 -dontwarn java.beans.**
 
 
 # WebRTC fails to build due to missing dependencies
 # 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.multidevice.linking.DeviceLinkingStatus
 import ch.threema.app.services.ContactService
 import ch.threema.app.services.ContactService
 import ch.threema.app.services.UserService
 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.app.tasks.TaskCreator
 import ch.threema.base.crypto.HashedNonce
 import ch.threema.base.crypto.HashedNonce
 import ch.threema.base.crypto.Nonce
 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.csp.fs.ForwardSecurityMessageProcessor
 import ch.threema.domain.protocol.multidevice.MultiDeviceKeys
 import ch.threema.domain.protocol.multidevice.MultiDeviceKeys
 import ch.threema.domain.protocol.multidevice.MultiDeviceProperties
 import ch.threema.domain.protocol.multidevice.MultiDeviceProperties
+import ch.threema.domain.stores.IdentityStore
 import ch.threema.domain.taskmanager.ActiveTaskCodec
 import ch.threema.domain.taskmanager.ActiveTaskCodec
 import ch.threema.domain.taskmanager.QueueSendCompleteListener
 import ch.threema.domain.taskmanager.QueueSendCompleteListener
 import ch.threema.domain.taskmanager.Task
 import ch.threema.domain.taskmanager.Task
@@ -70,12 +73,17 @@ import kotlinx.coroutines.runBlocking
 class TestCoreServiceManager(
 class TestCoreServiceManager(
     override val version: AppVersion,
     override val version: AppVersion,
     override val databaseService: DatabaseService,
     override val databaseService: DatabaseService,
-    override val preferenceStore: PreferenceStoreInterface,
+    override val preferenceStore: PreferenceStore,
+    override val encryptedPreferenceStore: EncryptedPreferenceStore,
     override val taskArchiver: TaskArchiver = TestTaskArchiver(),
     override val taskArchiver: TaskArchiver = TestTaskArchiver(),
     override val deviceCookieManager: DeviceCookieManager = TestDeviceCookieManager(),
     override val deviceCookieManager: DeviceCookieManager = TestDeviceCookieManager(),
     override val taskManager: TaskManager = TestTaskManager(TransactionAckTaskCodec()),
     override val taskManager: TaskManager = TestTaskManager(TransactionAckTaskCodec()),
     override val multiDeviceManager: MultiDeviceManager = TestMultiDeviceManager(),
     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()),
     override val nonceFactory: NonceFactory = NonceFactory(TestNonceStore()),
 ) : CoreServiceManager
 ) : 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.app.utils.executor.BackgroundExecutor;
 import ch.threema.base.ThreemaException;
 import ch.threema.base.ThreemaException;
 import ch.threema.data.repositories.ContactModelRepository;
 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.domain.protocol.api.APIConnector;
 import ch.threema.storage.models.ContactModel;
 import ch.threema.storage.models.ContactModel;
 import ch.threema.storage.models.data.status.VoipStatusDataModel;
 import ch.threema.storage.models.data.status.VoipStatusDataModel;
@@ -240,9 +240,7 @@ public class BackupServiceTest {
             .setBackupThumbnails(false)
             .setBackupThumbnails(false)
             .setBackupNonces(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
             // Read identity backup
             final String identityBackup;
             final String identityBackup;
             try (final ZipInputStream stream = zipFile.getInputStream(zipFile.getFileHeader("identity"))) {
             try (final ZipInputStream stream = zipFile.getInputStream(zipFile.getFileHeader("identity"))) {
@@ -250,9 +248,11 @@ public class BackupServiceTest {
             }
             }
 
 
             // Verify identity backup
             // 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 {
         } finally {
             //noinspection ResultOfMethodCallIgnored
             //noinspection ResultOfMethodCallIgnored
             backupFile.delete();
             backupFile.delete();
@@ -293,7 +293,7 @@ public class BackupServiceTest {
             .setBackupThumbnails(false)
             .setBackupThumbnails(false)
             .setBackupNonces(false));
             .setBackupNonces(false));
 
 
-        try {
+        try (
             final ZipFile zipFile = this.openBackupFile(backupFile, new String[]{
             final ZipFile zipFile = this.openBackupFile(backupFile, new String[]{
                 "settings",
                 "settings",
                 "message_CDXVZ5E4.csv",
                 "message_CDXVZ5E4.csv",
@@ -305,8 +305,8 @@ public class BackupServiceTest {
                 "ballot.csv",
                 "ballot.csv",
                 "ballot_choice.csv",
                 "ballot_choice.csv",
                 "ballot_vote.csv",
                 "ballot_vote.csv",
-            });
-
+            })
+        ) {
             // Read contacts
             // Read contacts
             try (final ZipInputStream stream = zipFile.getInputStream(zipFile.getFileHeader("contacts.csv"))) {
             try (final ZipInputStream stream = zipFile.getInputStream(zipFile.getFileHeader("contacts.csv"))) {
                 final CSVReader csvReader = new CSVReader(new InputStreamReader(stream), true);
                 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.asynctasks.UserIdentity
 import ch.threema.app.managers.CoreServiceManager
 import ch.threema.app.managers.CoreServiceManager
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.AppVersionProvider
-import ch.threema.app.utils.ConfigUtils
 import ch.threema.app.utils.executor.BackgroundExecutor
 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.TestDatabaseService
 import ch.threema.data.repositories.ContactModelRepository
 import ch.threema.data.repositories.ContactModelRepository
 import ch.threema.data.repositories.ModelRepositories
 import ch.threema.data.repositories.ModelRepositories
 import ch.threema.domain.models.IdentityState
 import ch.threema.domain.models.IdentityState
 import ch.threema.domain.models.IdentityType
 import ch.threema.domain.models.IdentityType
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.VerificationLevel
-import ch.threema.domain.protocol.SSLSocketFactoryFactory
 import ch.threema.domain.protocol.Version
 import ch.threema.domain.protocol.Version
 import ch.threema.domain.protocol.api.APIConnector
 import ch.threema.domain.protocol.api.APIConnector
 import ch.threema.domain.protocol.api.APIConnector.FetchIdentityResult
 import ch.threema.domain.protocol.api.APIConnector.FetchIdentityResult
 import ch.threema.domain.protocol.api.APIConnector.HttpConnectionException
 import ch.threema.domain.protocol.api.APIConnector.HttpConnectionException
+import ch.threema.domain.types.Identity
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
-import com.neilalexander.jnacl.NaCl
-import java.net.HttpURLConnection
 import kotlin.test.BeforeTest
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.Test
 import kotlin.test.assertContentEquals
 import kotlin.test.assertContentEquals
@@ -62,6 +61,7 @@ import kotlin.test.assertNotEquals
 import kotlin.test.assertTrue
 import kotlin.test.assertTrue
 import kotlin.test.fail
 import kotlin.test.fail
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.runBlocking
+import okhttp3.OkHttpClient
 
 
 class AddOrUpdateContactBackgroundTaskTest {
 class AddOrUpdateContactBackgroundTaskTest {
     private val backgroundExecutor = BackgroundExecutor()
     private val backgroundExecutor = BackgroundExecutor()
@@ -77,6 +77,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
             preferenceStore = serviceManager.preferenceStore,
             preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
         )
         )
         contactModelRepository = ModelRepositories(coreServiceManager).contacts
         contactModelRepository = ModelRepositories(coreServiceManager).contacts
     }
     }
@@ -89,7 +90,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
             { identity ->
                 FetchIdentityResult().also {
                 FetchIdentityResult().also {
                     it.identity = identity
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.featureMask = 12
                     it.type = 0
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
                     it.state = IdentityState.ACTIVE.value
@@ -98,9 +99,9 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
             {
                 assertTrue(it is ContactCreated)
                 assertTrue(it is ContactCreated)
                 assertEquals(newIdentity, it.contactModel.identity)
                 assertEquals(newIdentity, it.contactModel.identity)
-                val data = it.contactModel.data.value!!
+                val data = it.contactModel.data!!
                 assertEquals(newIdentity, data.identity)
                 assertEquals(newIdentity, data.identity)
-                assertContentEquals(ByteArray(NaCl.PUBLICKEYBYTES), data.publicKey)
+                assertContentEquals(ByteArray(NaCl.PUBLIC_KEY_BYTES), data.publicKey)
                 assertEquals(12u, data.featureMask)
                 assertEquals(12u, data.featureMask)
                 assertEquals(IdentityType.NORMAL, data.identityType)
                 assertEquals(IdentityType.NORMAL, data.identityType)
                 assertEquals(IdentityState.ACTIVE, data.activityState)
                 assertEquals(IdentityState.ACTIVE, data.activityState)
@@ -118,7 +119,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             fetchIdentity = { identity ->
             fetchIdentity = { identity ->
                 FetchIdentityResult().also {
                 FetchIdentityResult().also {
                     it.identity = identity
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.featureMask = 12
                     it.type = 0
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
                     it.state = IdentityState.ACTIVE.value
@@ -128,9 +129,9 @@ class AddOrUpdateContactBackgroundTaskTest {
             runOnFinished = {
             runOnFinished = {
                 assertTrue(it is ContactCreated)
                 assertTrue(it is ContactCreated)
                 assertEquals(newIdentity, it.contactModel.identity)
                 assertEquals(newIdentity, it.contactModel.identity)
-                val data = it.contactModel.data.value!!
+                val data = it.contactModel.data!!
                 assertEquals(newIdentity, data.identity)
                 assertEquals(newIdentity, data.identity)
-                assertContentEquals(ByteArray(NaCl.PUBLICKEYBYTES), data.publicKey)
+                assertContentEquals(ByteArray(NaCl.PUBLIC_KEY_BYTES), data.publicKey)
                 assertEquals(12u, data.featureMask)
                 assertEquals(12u, data.featureMask)
                 assertEquals(IdentityType.NORMAL, data.identityType)
                 assertEquals(IdentityType.NORMAL, data.identityType)
                 assertEquals(IdentityState.ACTIVE, data.activityState)
                 assertEquals(IdentityState.ACTIVE, data.activityState)
@@ -148,7 +149,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
             { identity ->
                 FetchIdentityResult().also {
                 FetchIdentityResult().also {
                     it.identity = identity
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 127
                     it.featureMask = 127
                     it.type = 1
                     it.type = 1
                     it.state = IdentityState.INACTIVE.value
                     it.state = IdentityState.INACTIVE.value
@@ -157,16 +158,16 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
             {
                 assertTrue(it is ContactCreated)
                 assertTrue(it is ContactCreated)
                 assertEquals(newIdentity, it.contactModel.identity)
                 assertEquals(newIdentity, it.contactModel.identity)
-                val data = it.contactModel.data.value!!
+                val data = it.contactModel.data!!
                 assertEquals(newIdentity, data.identity)
                 assertEquals(newIdentity, data.identity)
-                assertContentEquals(ByteArray(NaCl.PUBLICKEYBYTES), data.publicKey)
+                assertContentEquals(ByteArray(NaCl.PUBLIC_KEY_BYTES), data.publicKey)
                 assertEquals(127u, data.featureMask)
                 assertEquals(127u, data.featureMask)
                 assertEquals(IdentityType.WORK, data.identityType)
                 assertEquals(IdentityType.WORK, data.identityType)
                 assertEquals(IdentityState.INACTIVE, data.activityState)
                 assertEquals(IdentityState.INACTIVE, data.activityState)
                 assertEquals(VerificationLevel.FULLY_VERIFIED, data.verificationLevel)
                 assertEquals(VerificationLevel.FULLY_VERIFIED, data.verificationLevel)
                 assertEquals(AcquaintanceLevel.DIRECT, data.acquaintanceLevel)
                 assertEquals(AcquaintanceLevel.DIRECT, data.acquaintanceLevel)
             },
             },
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         )
         )
     }
     }
 
 
@@ -177,7 +178,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
             { identity ->
                 FetchIdentityResult().also {
                 FetchIdentityResult().also {
                     it.identity = identity
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 127
                     it.featureMask = 127
                     it.type = 1
                     it.type = 1
                     it.state = IdentityState.INACTIVE.value
                     it.state = IdentityState.INACTIVE.value
@@ -197,7 +198,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             { identity ->
             { identity ->
                 FetchIdentityResult().also {
                 FetchIdentityResult().also {
                     it.identity = identity
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.featureMask = 12
                     it.type = 0
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
                     it.state = IdentityState.ACTIVE.value
@@ -206,7 +207,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
             {
                 assertTrue(it is RemotePublicKeyMismatch)
                 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() {
     fun testAddInvalidId() {
         testAddingContact(
         testAddingContact(
             {
             {
-                throw HttpConnectionException(HttpURLConnection.HTTP_NOT_FOUND, Exception())
+                throw HttpConnectionException(Http.StatusCode.NOT_FOUND, Exception())
             },
             },
             {
             {
                 assertTrue(it is InvalidThreemaId)
                 assertTrue(it is InvalidThreemaId)
@@ -224,10 +225,10 @@ class AddOrUpdateContactBackgroundTaskTest {
 
 
     @Test
     @Test
     fun testAddExistingContact() {
     fun testAddExistingContact() {
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
             FetchIdentityResult().also {
                 it.identity = identity
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.featureMask = 12
                 it.type = 0
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
                 it.state = IdentityState.ACTIVE.value
@@ -253,9 +254,9 @@ class AddOrUpdateContactBackgroundTaskTest {
 
 
     @Test
     @Test
     fun testVerifyTwice() {
     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 {
             FetchIdentityResult().also {
                 it.identity = identity
                 it.identity = identity
                 it.publicKey = publicKey
                 it.publicKey = publicKey
@@ -288,10 +289,10 @@ class AddOrUpdateContactBackgroundTaskTest {
     fun testUpgradeGroupContact() {
     fun testUpgradeGroupContact() {
         val newIdentity = "01234567"
         val newIdentity = "01234567"
 
 
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
             FetchIdentityResult().also {
                 it.identity = identity
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.featureMask = 12
                 it.type = 0
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
                 it.state = IdentityState.ACTIVE.value
@@ -313,7 +314,7 @@ class AddOrUpdateContactBackgroundTaskTest {
         contactModel.setAcquaintanceLevelFromLocal(AcquaintanceLevel.GROUP)
         contactModel.setAcquaintanceLevelFromLocal(AcquaintanceLevel.GROUP)
 
 
         // Assert that the acquaintance level change worked
         // 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
         // When adding the contact again, it should be converted back to a direct contact
         testAddingContact(
         testAddingContact(
@@ -322,7 +323,7 @@ class AddOrUpdateContactBackgroundTaskTest {
                 assertTrue(it is ContactModified)
                 assertTrue(it is ContactModified)
                 assertTrue(it.acquaintanceLevelChanged)
                 assertTrue(it.acquaintanceLevelChanged)
                 assertFalse(it.verificationLevelChanged)
                 assertFalse(it.verificationLevelChanged)
-                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value!!.acquaintanceLevel)
+                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data!!.acquaintanceLevel)
             },
             },
             newIdentity = newIdentity,
             newIdentity = newIdentity,
         )
         )
@@ -332,10 +333,10 @@ class AddOrUpdateContactBackgroundTaskTest {
     fun testVerificationLevelUpgrade() {
     fun testVerificationLevelUpgrade() {
         val newIdentity = "01234567"
         val newIdentity = "01234567"
 
 
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
             FetchIdentityResult().also {
                 it.identity = identity
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.featureMask = 12
                 it.type = 0
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
                 it.state = IdentityState.ACTIVE.value
@@ -354,7 +355,7 @@ class AddOrUpdateContactBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(newIdentity)!!
         val contactModel = contactModelRepository.getByIdentity(newIdentity)!!
 
 
         // Assert that the verification level is unverified
         // 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
         // When adding the contact again, it should be fully verified
         testAddingContact(
         testAddingContact(
@@ -365,11 +366,11 @@ class AddOrUpdateContactBackgroundTaskTest {
                 assertFalse(it.acquaintanceLevelChanged)
                 assertFalse(it.acquaintanceLevelChanged)
                 assertEquals(
                 assertEquals(
                     VerificationLevel.FULLY_VERIFIED,
                     VerificationLevel.FULLY_VERIFIED,
-                    contactModel.data.value!!.verificationLevel,
+                    contactModel.data!!.verificationLevel,
                 )
                 )
             },
             },
             newIdentity = newIdentity,
             newIdentity = newIdentity,
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         )
         )
     }
     }
 
 
@@ -377,10 +378,10 @@ class AddOrUpdateContactBackgroundTaskTest {
     fun testAddAndVerifyGroupContact() {
     fun testAddAndVerifyGroupContact() {
         val newIdentity = "01234567"
         val newIdentity = "01234567"
 
 
-        val apiConnectorResult: (identity: String) -> FetchIdentityResult = { identity ->
+        val apiConnectorResult: (identity: Identity) -> FetchIdentityResult = { identity ->
             FetchIdentityResult().also {
             FetchIdentityResult().also {
                 it.identity = identity
                 it.identity = identity
-                it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                 it.featureMask = 12
                 it.featureMask = 12
                 it.type = 0
                 it.type = 0
                 it.state = IdentityState.ACTIVE.value
                 it.state = IdentityState.ACTIVE.value
@@ -399,11 +400,11 @@ class AddOrUpdateContactBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(newIdentity)!!
         val contactModel = contactModelRepository.getByIdentity(newIdentity)!!
 
 
         // Assert that the verification level is unverified
         // 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
         // Downgrade the contact to acquaintance level group
         contactModel.setAcquaintanceLevelFromLocal(AcquaintanceLevel.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
         // When adding the contact again, it should be converted back to a direct contact
         testAddingContact(
         testAddingContact(
@@ -412,14 +413,14 @@ class AddOrUpdateContactBackgroundTaskTest {
                 assertTrue(it is ContactModified)
                 assertTrue(it is ContactModified)
                 assertTrue(it.acquaintanceLevelChanged)
                 assertTrue(it.acquaintanceLevelChanged)
                 assertTrue(it.verificationLevelChanged)
                 assertTrue(it.verificationLevelChanged)
-                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value!!.acquaintanceLevel)
+                assertEquals(AcquaintanceLevel.DIRECT, contactModel.data!!.acquaintanceLevel)
                 assertEquals(
                 assertEquals(
                     VerificationLevel.FULLY_VERIFIED,
                     VerificationLevel.FULLY_VERIFIED,
-                    contactModel.data.value!!.verificationLevel,
+                    contactModel.data!!.verificationLevel,
                 )
                 )
             },
             },
             newIdentity = newIdentity,
             newIdentity = newIdentity,
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         )
         )
     }
     }
 
 
@@ -432,7 +433,7 @@ class AddOrUpdateContactBackgroundTaskTest {
             {
             {
                 FetchIdentityResult().also {
                 FetchIdentityResult().also {
                     it.identity = identity
                     it.identity = identity
-                    it.publicKey = ByteArray(NaCl.PUBLICKEYBYTES)
+                    it.publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES)
                     it.featureMask = 12
                     it.featureMask = 12
                     it.type = 0
                     it.type = 0
                     it.state = IdentityState.ACTIVE.value
                     it.state = IdentityState.ACTIVE.value
@@ -483,11 +484,11 @@ class AddOrUpdateContactBackgroundTaskTest {
     }
     }
 
 
     private fun testAddingContact(
     private fun testAddingContact(
-        fetchIdentity: (identity: String) -> FetchIdentityResult,
+        fetchIdentity: (identity: Identity) -> FetchIdentityResult,
         runOnFinished: (result: ContactResult) -> Unit,
         runOnFinished: (result: ContactResult) -> Unit,
-        newIdentity: String = "01234567",
+        newIdentity: Identity = "01234567",
         acquaintanceLevel: AcquaintanceLevel = AcquaintanceLevel.DIRECT,
         acquaintanceLevel: AcquaintanceLevel = AcquaintanceLevel.DIRECT,
-        myIdentity: String = "00000000",
+        myIdentity: Identity = "00000000",
         publicKey: ByteArray? = null,
         publicKey: ByteArray? = null,
     ) {
     ) {
         val apiConnector = getTestApiConnector {
         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.tasks.TaskCreator
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.executor.BackgroundExecutor
 import ch.threema.app.utils.executor.BackgroundExecutor
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.TestDatabaseService
 import ch.threema.data.TestDatabaseService
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.repositories.ContactModelRepository
 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.domain.taskmanager.TaskManager
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.testhelpers.MUST_NOT_BE_CALLED
 import ch.threema.testhelpers.MUST_NOT_BE_CALLED
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import java.util.Date
 import kotlin.test.BeforeTest
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.Test
@@ -161,7 +161,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
     private lateinit var deleteContactServices: DeleteContactServices
     private lateinit var deleteContactServices: DeleteContactServices
     private val testContactModelData = ContactModelData(
     private val testContactModelData = ContactModelData(
         identity = "12345678",
         identity = "12345678",
-        publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+        publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         createdAt = Date(),
         createdAt = Date(),
         firstName = "1234",
         firstName = "1234",
         lastName = "5678",
         lastName = "5678",
@@ -194,6 +194,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
             preferenceStore = serviceManager.preferenceStore,
             preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             multiDeviceManager = multiDeviceManager,
             multiDeviceManager = multiDeviceManager,
             taskManager = testTaskManager,
             taskManager = testTaskManager,
         )
         )
@@ -222,7 +223,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         // Assert that the contact exists as "direct" contact
         // Assert that the contact exists as "direct" contact
         assertNotNull(contactModel)
         assertNotNull(contactModel)
-        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data?.acquaintanceLevel)
 
 
         // Remove the contact
         // Remove the contact
         backgroundExecutor.executeDeferred(
         backgroundExecutor.executeDeferred(
@@ -236,7 +237,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         ).await()
         ).await()
 
 
         // Assert that the contact's acquaintance level is "group" now
         // Assert that the contact's acquaintance level is "group" now
-        assertEquals(AcquaintanceLevel.GROUP, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.GROUP, contactModel.data?.acquaintanceLevel)
     }
     }
 
 
     @Test
     @Test
@@ -247,7 +248,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         // Assert that the contact exists as "direct" contact
         // Assert that the contact exists as "direct" contact
         assertNotNull(contactModel)
         assertNotNull(contactModel)
-        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data?.acquaintanceLevel)
 
 
         // Remove the contact
         // Remove the contact
         backgroundExecutor.executeDeferred(
         backgroundExecutor.executeDeferred(
@@ -272,7 +273,7 @@ class MarkContactAsDeletedBackgroundTaskTest {
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         val contactModel = contactModelRepository.getByIdentity(testContactModelData.identity)
         // Assert that the contact exists as "direct" contact
         // Assert that the contact exists as "direct" contact
         assertNotNull(contactModel)
         assertNotNull(contactModel)
-        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data.value?.acquaintanceLevel)
+        assertEquals(AcquaintanceLevel.DIRECT, contactModel.data?.acquaintanceLevel)
 
 
         // Mark the contact as deleted
         // Mark the contact as deleted
         backgroundExecutor.executeDeferred(
         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.ThreemaApplication
 import ch.threema.app.processors.reflectedd2dsync.ReflectedContactSyncTask
 import ch.threema.app.processors.reflectedd2dsync.ReflectedContactSyncTask
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.AppVersionProvider
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.TestDatabaseService
 import ch.threema.data.TestDatabaseService
+import ch.threema.data.datatypes.IdColor
 import ch.threema.data.models.ContactModel
 import ch.threema.data.models.ContactModel
 import ch.threema.data.models.ContactModelData
 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.ContactModelRepository
 import ch.threema.data.repositories.ModelRepositories
 import ch.threema.data.repositories.ModelRepositories
 import ch.threema.domain.helpers.TransactionAckTaskCodec
 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.protobuf.unit
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import com.google.protobuf.kotlin.toByteString
 import com.google.protobuf.kotlin.toByteString
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import java.util.Date
 import kotlin.test.BeforeTest
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.Test
@@ -82,7 +82,7 @@ class ReflectedContactSyncTaskTest {
         firstName = "",
         firstName = "",
         lastName = "",
         lastName = "",
         nickname = "Nick",
         nickname = "Nick",
-        colorIndex = getIdColorIndex("01234567"),
+        idColor = IdColor.ofIdentity("01234567"),
         verificationLevel = VerificationLevel.UNVERIFIED,
         verificationLevel = VerificationLevel.UNVERIFIED,
         workVerificationLevel = WorkVerificationLevel.NONE,
         workVerificationLevel = WorkVerificationLevel.NONE,
         identityType = IdentityType.NORMAL,
         identityType = IdentityType.NORMAL,
@@ -106,10 +106,12 @@ class ReflectedContactSyncTaskTest {
     fun before() {
     fun before() {
         databaseService = TestDatabaseService()
         databaseService = TestDatabaseService()
         taskCodec = TransactionAckTaskCodec()
         taskCodec = TransactionAckTaskCodec()
+        val serviceManager = ThreemaApplication.requireServiceManager()
         coreServiceManager = TestCoreServiceManager(
         coreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             multiDeviceManager = TestMultiDeviceManager(
             multiDeviceManager = TestMultiDeviceManager(
                 isMultiDeviceActive = true,
                 isMultiDeviceActive = true,
                 isMdDisabledOrSupportsFs = false,
                 isMdDisabledOrSupportsFs = false,
@@ -123,7 +125,7 @@ class ReflectedContactSyncTaskTest {
     fun testNewReflectedContact() {
     fun testNewReflectedContact() {
         val contact = contact {
         val contact = contact {
             identity = "01234567"
             identity = "01234567"
-            publicKey = ByteArray(NaCl.PUBLICKEYBYTES) { it.toByte() }.toByteString()
+            publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES) { it.toByte() }.toByteString()
             createdAt = Date().time
             createdAt = Date().time
             firstName = "0123"
             firstName = "0123"
             // No last name provided
             // No last name provided
@@ -151,9 +153,9 @@ class ReflectedContactSyncTaskTest {
         }
         }
 
 
         testReflectedContactCreate(contact) { contactModel ->
         testReflectedContactCreate(contact) { contactModel ->
-            val data = contactModel.data.value!!
+            val data = contactModel.data!!
             assertEquals(contact.identity, data.identity)
             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.createdAt, data.createdAt.time)
             assertEquals(contact.firstName, data.firstName)
             assertEquals(contact.firstName, data.firstName)
             assertEquals("", data.lastName)
             assertEquals("", data.lastName)
@@ -182,7 +184,7 @@ class ReflectedContactSyncTaskTest {
                 nickname = newNickname
                 nickname = newNickname
             },
             },
         ) { contactModel ->
         ) { 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.ThreemaApplication
 import ch.threema.app.groupflows.GroupCreateProperties
 import ch.threema.app.groupflows.GroupCreateProperties
 import ch.threema.app.groupflows.GroupFlowResult
 import ch.threema.app.groupflows.GroupFlowResult
-import ch.threema.app.groupflows.ProfilePicture
 import ch.threema.app.tasks.GroupCreateTask
 import ch.threema.app.tasks.GroupCreateTask
 import ch.threema.app.tasks.ReflectGroupSyncCreateTask
 import ch.threema.app.tasks.ReflectGroupSyncCreateTask
 import ch.threema.app.testutils.TestHelpers
 import ch.threema.app.testutils.TestHelpers
@@ -112,7 +111,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
             GroupCreateProperties(
                 name = "Test",
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(memberIdentity),
                 members = setOf(memberIdentity),
             ),
             ),
             ReflectionExpectation.REFLECTION_SUCCESS,
             ReflectionExpectation.REFLECTION_SUCCESS,
@@ -129,7 +128,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
             GroupCreateProperties(
                 name = "Test",
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(memberIdentity),
                 members = setOf(memberIdentity),
             ),
             ),
             ReflectionExpectation.REFLECTION_SKIPPED,
             ReflectionExpectation.REFLECTION_SKIPPED,
@@ -141,7 +140,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
             GroupCreateProperties(
                 name = "Test",
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = emptySet(),
                 members = emptySet(),
             ),
             ),
             ReflectionExpectation.REFLECTION_SUCCESS,
             ReflectionExpectation.REFLECTION_SUCCESS,
@@ -153,7 +152,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         testAndAssertSuccessfulGroupCreation(
         testAndAssertSuccessfulGroupCreation(
             GroupCreateProperties(
             GroupCreateProperties(
                 name = "Test",
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = emptySet(),
                 members = emptySet(),
             ),
             ),
             ReflectionExpectation.REFLECTION_SKIPPED,
             ReflectionExpectation.REFLECTION_SKIPPED,
@@ -170,7 +169,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
         val groupFlowResult: GroupFlowResult = testGroupCreation(
         val groupFlowResult: GroupFlowResult = testGroupCreation(
             GroupCreateProperties(
             GroupCreateProperties(
                 name = "Test",
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(initialContactModelData.identity, unknownIdentity),
                 members = setOf(initialContactModelData.identity, unknownIdentity),
             ),
             ),
             ReflectionExpectation.REFLECTION_FAIL,
             ReflectionExpectation.REFLECTION_FAIL,
@@ -194,7 +193,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
             ThreemaApplication.getAppContext(),
             ThreemaApplication.getAppContext(),
             GroupCreateProperties(
             GroupCreateProperties(
                 name = "Test",
                 name = "Test",
-                profilePicture = ProfilePicture(null as ByteArray?),
+                profilePicture = null,
                 members = setOf(initialContactModelData.identity),
                 members = setOf(initialContactModelData.identity),
             ),
             ),
         ).await()
         ).await()
@@ -262,7 +261,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
 
 
     private fun GroupModel?.assertCreatedFrom(groupCreateProperties: GroupCreateProperties) {
     private fun GroupModel?.assertCreatedFrom(groupCreateProperties: GroupCreateProperties) {
         assertNotNull(this)
         assertNotNull(this)
-        data.value.assertCreatedFrom(groupCreateProperties)
+        data.assertCreatedFrom(groupCreateProperties)
     }
     }
 
 
     private fun GroupModelData?.assertCreatedFrom(groupCreateProperties: GroupCreateProperties) {
     private fun GroupModelData?.assertCreatedFrom(groupCreateProperties: GroupCreateProperties) {
@@ -273,7 +272,7 @@ class CreateGroupFlowTest : GroupFlowTest() {
 
 
     private fun GroupModel?.assertNewGroup() {
     private fun GroupModel?.assertNewGroup() {
         assertNotNull(this)
         assertNotNull(this)
-        data.value.assertNewGroup()
+        data.assertNewGroup()
     }
     }
 
 
     private fun GroupModelData?.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 =
         val groupModel =
             groupModelRepository.getByGroupIdentity(myInitialLeftGroupModelData.groupIdentity)
             groupModelRepository.getByGroupIdentity(myInitialLeftGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertNotNull(groupModel)
-        assertEquals(UserState.LEFT, groupModel.data.value?.userState)
+        assertEquals(UserState.LEFT, groupModel.data?.userState)
         assertUnsuccessfulDisband(
         assertUnsuccessfulDisband(
             groupModel,
             groupModel,
             GroupDisbandIntent.DISBAND,
             GroupDisbandIntent.DISBAND,
@@ -237,7 +237,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         val groupModel =
         val groupModel =
             groupModelRepository.getByGroupIdentity(myInitialLeftGroupModelData.groupIdentity)
             groupModelRepository.getByGroupIdentity(myInitialLeftGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertNotNull(groupModel)
-        assertEquals(UserState.LEFT, groupModel.data.value?.userState)
+        assertEquals(UserState.LEFT, groupModel.data?.userState)
         assertUnsuccessfulDisband(
         assertUnsuccessfulDisband(
             groupModel,
             groupModel,
             GroupDisbandIntent.DISBAND,
             GroupDisbandIntent.DISBAND,
@@ -252,7 +252,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
         assertNotNull(groupModel)
 
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulDisband(
         assertUnsuccessfulDisband(
             groupModel,
             groupModel,
@@ -268,7 +268,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
         assertNotNull(groupModel)
 
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulDisband(
         assertUnsuccessfulDisband(
             groupModel,
             groupModel,
@@ -283,8 +283,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
         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(
         assertSuccessfulDisband(
             groupModel,
             groupModel,
@@ -299,8 +299,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
         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(
         assertSuccessfulDisband(
             groupModel,
             groupModel,
@@ -315,8 +315,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
         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(
         assertSuccessfulDisband(
             groupModel,
             groupModel,
@@ -331,8 +331,8 @@ class DisbandGroupFlowTest : GroupFlowTest() {
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
             groupModelRepository.getByGroupIdentity(myInitialNotesGroupModelData.groupIdentity)
         assertNotNull(groupModel)
         assertNotNull(groupModel)
         assertEquals(myContact.identity, groupModel.groupIdentity.creatorIdentity)
         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(
         assertSuccessfulDisband(
             groupModel,
             groupModel,
@@ -373,10 +373,10 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         when (intent) {
         when (intent) {
             GroupDisbandIntent.DISBAND -> assertEquals(
             GroupDisbandIntent.DISBAND -> assertEquals(
                 UserState.LEFT,
                 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,
         intent: GroupDisbandIntent,
         reflectionExpectation: ReflectionExpectation,
         reflectionExpectation: ReflectionExpectation,
     ) {
     ) {
-        val groupModelDataBefore = groupModel.data.value
+        val groupModelDataBefore = groupModel.data
         assertIs<GroupFlowResult.Failure>(
         assertIs<GroupFlowResult.Failure>(
             runGroupDisband(groupModel, intent, reflectionExpectation),
             runGroupDisband(groupModel, intent, reflectionExpectation),
         )
         )
-        val groupModelDataAfter = groupModel.data.value
+        val groupModelDataAfter = groupModel.data
         // Assert that the group model has not changed
         // Assert that the group model has not changed
         assertEquals(groupModelDataBefore, groupModelDataAfter)
         assertEquals(groupModelDataBefore, groupModelDataAfter)
     }
     }
@@ -399,7 +399,7 @@ class DisbandGroupFlowTest : GroupFlowTest() {
         intent: GroupDisbandIntent,
         intent: GroupDisbandIntent,
         reflectionExpectation: ReflectionExpectation,
         reflectionExpectation: ReflectionExpectation,
     ): GroupFlowResult {
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
 
         // Prepare task manager and group flow dispatcher
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(
         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.GroupLeaveMessage
 import ch.threema.domain.protocol.csp.messages.GroupSetupMessage
 import ch.threema.domain.protocol.csp.messages.GroupSetupMessage
 import ch.threema.domain.protocol.csp.messages.GroupSyncRequestMessage
 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.Test
 import kotlin.test.assertContentEquals
 import kotlin.test.assertContentEquals
 import kotlin.test.assertEquals
 import kotlin.test.assertEquals
@@ -208,7 +208,7 @@ abstract class GroupControlTest<T : AbstractGroupMessage> : MessageProcessorProv
 
 
     private suspend fun setupAndProcessMessage(
     private suspend fun setupAndProcessMessage(
         message: AbstractGroupMessage,
         message: AbstractGroupMessage,
-        identityStore: IdentityStoreInterface,
+        identityStore: IdentityStore,
     ) {
     ) {
         // Start home activity and navigate to chat section
         // Start home activity and navigate to chat section
         launchActivity<HomeActivity>()
         launchActivity<HomeActivity>()

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

@@ -167,7 +167,7 @@ class GroupResyncFlowTest : GroupFlowTest() {
         groupModel: GroupModel,
         groupModel: GroupModel,
         setupConfig: SetupConfig,
         setupConfig: SetupConfig,
     ): GroupFlowResult {
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
 
         // Prepare task manager and group flow dispatcher
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(
         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.data.models.GroupIdentity
 import ch.threema.domain.protocol.csp.messages.GroupLeaveMessage
 import ch.threema.domain.protocol.csp.messages.GroupLeaveMessage
 import ch.threema.domain.protocol.csp.messages.GroupSyncRequestMessage
 import ch.threema.domain.protocol.csp.messages.GroupSyncRequestMessage
+import ch.threema.domain.types.Identity
 import junit.framework.TestCase.assertEquals
 import junit.framework.TestCase.assertEquals
 import junit.framework.TestCase.assertFalse
 import junit.framework.TestCase.assertFalse
 import junit.framework.TestCase.assertTrue
 import junit.framework.TestCase.assertTrue
@@ -273,7 +274,7 @@ class IncomingGroupLeaveTest : GroupControlTest<GroupLeaveMessage>() {
 
 
     private class GroupLeaveTracker(
     private class GroupLeaveTracker(
         private val group: TestGroup?,
         private val group: TestGroup?,
-        private val leavingIdentity: String?,
+        private val leavingIdentity: Identity?,
         private val expectStateChange: Boolean = false,
         private val expectStateChange: Boolean = false,
     ) {
     ) {
         private var memberHasLeft = 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.data.models.GroupIdentity
 import ch.threema.domain.models.GroupId
 import ch.threema.domain.models.GroupId
 import ch.threema.domain.protocol.csp.messages.GroupNameMessage
 import ch.threema.domain.protocol.csp.messages.GroupNameMessage
+import ch.threema.domain.types.Identity
 import junit.framework.TestCase.*
 import junit.framework.TestCase.*
 import kotlin.test.AfterTest
 import kotlin.test.AfterTest
 import kotlin.test.Test
 import kotlin.test.Test
@@ -172,7 +173,7 @@ class IncomingGroupNameTest : GroupConversationListTest<GroupNameMessage>() {
 
 
     private fun createEncryptedRenameMessage(
     private fun createEncryptedRenameMessage(
         newGroupName: String,
         newGroupName: String,
-        groupCreatorIdentity: String,
+        groupCreatorIdentity: Identity,
         apiGroupId: GroupId,
         apiGroupId: GroupId,
         fromContact: TestContact,
         fromContact: TestContact,
     ) = GroupNameMessage().apply {
     ) = 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.managers.ListenerManager
 import ch.threema.app.testutils.TestHelpers.TestContact
 import ch.threema.app.testutils.TestHelpers.TestContact
 import ch.threema.app.testutils.TestHelpers.TestGroup
 import ch.threema.app.testutils.TestHelpers.TestGroup
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.models.GroupIdentity
 import ch.threema.data.models.GroupIdentity
 import ch.threema.domain.models.ContactSyncState
 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.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 import ch.threema.domain.protocol.csp.messages.GroupSetupMessage
 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.ContactModel.AcquaintanceLevel
 import ch.threema.storage.models.GroupModel
 import ch.threema.storage.models.GroupModel
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import java.util.Date
 import junit.framework.TestCase
 import junit.framework.TestCase
 import kotlin.test.AfterTest
 import kotlin.test.AfterTest
@@ -211,7 +212,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
             GroupIdentity(groupAB.groupCreator.identity, groupAB.apiGroupId.toLong()),
             GroupIdentity(groupAB.groupCreator.identity, groupAB.apiGroupId.toLong()),
         )
         )
         assertNotNull(afterKicked)
         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
         // Assert that group conversations did not appear, disappear, or change their name
         assertGroupConversations(scenario, initialGroups, "no changes")
         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
         // 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)
         val newGroupModel = groupModelRepository.getByCreatorIdentityAndId(newGroup.groupCreator.identity, newGroup.apiGroupId)
         assertNotNull(newGroupModel)
         assertNotNull(newGroupModel)
-        val data = newGroupModel.data.value
+        val data = newGroupModel.data
         assertNotNull(data)
         assertNotNull(data)
         assertFalse(data.otherMembers.contains(revokedContactModelData.identity))
         assertFalse(data.otherMembers.contains(revokedContactModelData.identity))
     }
     }
@@ -447,7 +448,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
             groupModelRepository.getByCreatorIdentityAndId(
             groupModelRepository.getByCreatorIdentityAndId(
                 newGroup.groupCreator.identity,
                 newGroup.groupCreator.identity,
                 newGroup.apiGroupId,
                 newGroup.apiGroupId,
-            )?.data?.value,
+            )?.data,
         )
         )
 
 
         val scenario = startScenario()
         val scenario = startScenario()
@@ -530,7 +531,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
 
 
     private class GroupSetupTracker(
     private class GroupSetupTracker(
         private val group: TestGroup?,
         private val group: TestGroup?,
-        private val myIdentity: String,
+        private val myIdentity: Identity,
         private val expectCreate: Boolean,
         private val expectCreate: Boolean,
         private val expectKick: Boolean,
         private val expectKick: Boolean,
         private val newMembers: List<String>,
         private val newMembers: List<String>,
@@ -646,7 +647,7 @@ class IncomingGroupSetupTest : GroupConversationListTest<GroupSetupMessage>() {
 
 
     private val revokedContactModelData = ContactModelData(
     private val revokedContactModelData = ContactModelData(
         identity = "01238765",
         identity = "01238765",
-        publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+        publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
         createdAt = Date(),
         createdAt = Date(),
         firstName = "1234",
         firstName = "1234",
         lastName = "8765",
         lastName = "8765",

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

@@ -331,7 +331,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
         assertNotNull(groupModel)
 
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulLeave(
         assertUnsuccessfulLeave(
             groupModel,
             groupModel,
@@ -347,7 +347,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
         assertNotNull(groupModel)
 
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulLeave(
         assertUnsuccessfulLeave(
             groupModel,
             groupModel,
@@ -363,7 +363,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
         assertNotNull(groupModel)
 
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulLeave(
         assertUnsuccessfulLeave(
             groupModel,
             groupModel,
@@ -379,7 +379,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         assertNotNull(groupModel)
         assertNotNull(groupModel)
 
 
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulLeave(
         assertUnsuccessfulLeave(
             groupModel,
             groupModel,
@@ -417,8 +417,8 @@ class LeaveGroupFlowTest : GroupFlowTest() {
             runGroupLeave(groupModel, intent, reflectionExpectation),
             runGroupLeave(groupModel, intent, reflectionExpectation),
         )
         )
         when (intent) {
         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,
         intent: GroupLeaveIntent,
         reflectionExpectation: ReflectionExpectation,
         reflectionExpectation: ReflectionExpectation,
     ) {
     ) {
-        val groupModelDataBefore = groupModel.data.value
+        val groupModelDataBefore = groupModel.data
         assertIs<GroupFlowResult.Failure>(
         assertIs<GroupFlowResult.Failure>(
             runGroupLeave(groupModel, intent, reflectionExpectation),
             runGroupLeave(groupModel, intent, reflectionExpectation),
         )
         )
-        val groupModelDataAfter = groupModel.data.value
+        val groupModelDataAfter = groupModel.data
         // Assert that the group model has not changed
         // Assert that the group model has not changed
         assertEquals(groupModelDataBefore, groupModelDataAfter)
         assertEquals(groupModelDataBefore, groupModelDataAfter)
     }
     }
@@ -441,7 +441,7 @@ class LeaveGroupFlowTest : GroupFlowTest() {
         intent: GroupLeaveIntent,
         intent: GroupLeaveIntent,
         reflectionExpectation: ReflectionExpectation,
         reflectionExpectation: ReflectionExpectation,
     ): GroupFlowResult {
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
 
         // Prepare task manager and group flow dispatcher
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(
         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>(
         assertIs<GroupFlowResult.Success>(
             runGroupRemove(groupModel, reflectionExpectation),
             runGroupRemove(groupModel, reflectionExpectation),
         )
         )
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
     }
     }
 
 
     private suspend fun assertUnsuccessfulRemove(
     private suspend fun assertUnsuccessfulRemove(
@@ -282,14 +282,14 @@ class RemoveGroupFlowTest : GroupFlowTest() {
         assertIs<GroupFlowResult.Failure>(
         assertIs<GroupFlowResult.Failure>(
             runGroupRemove(groupModel, reflectionExpectation),
             runGroupRemove(groupModel, reflectionExpectation),
         )
         )
-        assertNotNull(groupModel.data.value)
+        assertNotNull(groupModel.data)
     }
     }
 
 
     private suspend fun runGroupRemove(
     private suspend fun runGroupRemove(
         groupModel: GroupModel,
         groupModel: GroupModel,
         reflectionExpectation: ReflectionExpectation,
         reflectionExpectation: ReflectionExpectation,
     ): GroupFlowResult {
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
 
         // Prepare task manager and group flow dispatcher
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(
         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
         // Assert that the new member is not yet a member of the group
         assertTrue {
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialContactData.identity) == false
+            groupModel.data?.otherMembers?.contains(initialContactData.identity) == false
         }
         }
 
 
         val groupChanges = GroupChanges(
         val groupChanges = GroupChanges(
@@ -225,7 +225,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
         )
 
 
         assertTrue {
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialContactData.identity) == true
+            groupModel.data?.otherMembers?.contains(initialContactData.identity) == true
         }
         }
     }
     }
 
 
@@ -247,7 +247,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
         )
 
 
         assertTrue {
         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,
             ReflectionExpectation.REFLECTION_SUCCESS,
         )
         )
 
 
-        assertTrue { groupModel.data.value?.otherMembers?.isEmpty() == true }
+        assertTrue { groupModel.data?.otherMembers?.isEmpty() == true }
     }
     }
 
 
     @Test
     @Test
@@ -288,7 +288,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
             ReflectionExpectation.REFLECTION_SKIPPED,
             ReflectionExpectation.REFLECTION_SKIPPED,
         )
         )
 
 
-        assertTrue { groupModel.data.value?.otherMembers?.isEmpty() == true }
+        assertTrue { groupModel.data?.otherMembers?.isEmpty() == true }
     }
     }
 
 
     @Test
     @Test
@@ -304,7 +304,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
 
 
         // Delete the group before updating it
         // Delete the group before updating it
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulGroupUpdate(
         assertUnsuccessfulGroupUpdate(
             groupModel,
             groupModel,
@@ -312,7 +312,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
             ReflectionExpectation.REFLECTION_SUCCESS,
             ReflectionExpectation.REFLECTION_SUCCESS,
         )
         )
 
 
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
     }
     }
 
 
     @Test
     @Test
@@ -328,7 +328,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
 
 
         // Delete the group before updating it
         // Delete the group before updating it
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
         groupModelRepository.persistRemovedGroup(groupModel.groupIdentity)
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
 
 
         assertUnsuccessfulGroupUpdate(
         assertUnsuccessfulGroupUpdate(
             groupModel,
             groupModel,
@@ -336,7 +336,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
             ReflectionExpectation.REFLECTION_SKIPPED,
             ReflectionExpectation.REFLECTION_SKIPPED,
         )
         )
 
 
-        assertNull(groupModel.data.value)
+        assertNull(groupModel.data)
     }
     }
 
 
     @Test
     @Test
@@ -357,7 +357,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
         )
 
 
         assertTrue {
         assertTrue {
-            groupModel.data.value?.otherMembers?.contains(initialGroupMemberData.identity) == false
+            groupModel.data?.otherMembers?.contains(initialGroupMemberData.identity) == false
         }
         }
     }
     }
 
 
@@ -379,7 +379,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         )
         )
 
 
         assertTrue {
         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)
         assertIs<GroupFlowResult.Success>(groupFlowResult)
 
 
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
         assertNotNull(groupModelData)
         assertNotNull(groupModelData)
         groupModelData.assertChangesApplied(groupChanges)
         groupModelData.assertChangesApplied(groupChanges)
     }
     }
@@ -447,7 +447,7 @@ class UpdateGroupFlowTest : GroupFlowTest() {
         reflectionExpectation: ReflectionExpectation,
         reflectionExpectation: ReflectionExpectation,
         successExpected: Boolean,
         successExpected: Boolean,
     ): GroupFlowResult {
     ): GroupFlowResult {
-        val groupModelData = groupModel.data.value
+        val groupModelData = groupModel.data
 
 
         // Prepare task manager and group flow dispatcher
         // Prepare task manager and group flow dispatcher
         val taskManager = ControlledTaskManager(
         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.TestHelpers.TestGroup
 import ch.threema.app.testutils.clearDatabaseAndCaches
 import ch.threema.app.testutils.clearDatabaseAndCaches
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.AppVersionProvider
-import ch.threema.app.utils.ConfigUtils
 import ch.threema.app.utils.ForwardSecurityStatusSender
 import ch.threema.app.utils.ForwardSecurityStatusSender
 import ch.threema.base.crypto.HashedNonce
 import ch.threema.base.crypto.HashedNonce
 import ch.threema.base.crypto.Nonce
 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.ForwardSecurityDataInit
 import ch.threema.domain.protocol.csp.messages.fs.ForwardSecurityEnvelopeMessage
 import ch.threema.domain.protocol.csp.messages.fs.ForwardSecurityEnvelopeMessage
 import ch.threema.domain.stores.ContactStore
 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.ActiveTask
 import ch.threema.domain.taskmanager.QueueSendCompleteListener
 import ch.threema.domain.taskmanager.QueueSendCompleteListener
 import ch.threema.domain.taskmanager.Task
 import ch.threema.domain.taskmanager.Task
@@ -86,6 +85,7 @@ import kotlin.test.BeforeTest
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.Deferred
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.runBlocking
+import okhttp3.OkHttpClient
 import org.junit.Rule
 import org.junit.Rule
 import org.junit.rules.Timeout
 import org.junit.rules.Timeout
 
 
@@ -191,12 +191,14 @@ open class MessageProcessorProvider {
             null,
             null,
             /* isWork = */
             /* isWork = */
             false,
             false,
-            /* sslSocketFactoryFactory = */
-            ConfigUtils::getSSLSocketFactory,
+            /* okHttpClient = */
+            OkHttpClient(),
             /* version = */
             /* version = */
             Version(),
             Version(),
             /* language = */
             /* language = */
             null,
             null,
+            /* authenticator= */
+            null,
         ),
         ),
         serviceManager.userService,
         serviceManager.userService,
         serviceManager.modelRepositories.contacts,
         serviceManager.modelRepositories.contacts,
@@ -417,6 +419,7 @@ open class MessageProcessorProvider {
             AppVersionProvider.appVersion,
             AppVersionProvider.appVersion,
             serviceManager.databaseService,
             serviceManager.databaseService,
             serviceManager.preferenceStore,
             serviceManager.preferenceStore,
+            serviceManager.encryptedPreferenceStore,
             TaskArchiverImpl(serviceManager.databaseService.taskArchiveFactory),
             TaskArchiverImpl(serviceManager.databaseService.taskArchiveFactory),
             serviceManager.deviceCookieManager,
             serviceManager.deviceCookieManager,
             taskManager,
             taskManager,
@@ -520,7 +523,7 @@ open class MessageProcessorProvider {
      */
      */
     protected suspend fun processMessage(
     protected suspend fun processMessage(
         message: AbstractMessage,
         message: AbstractMessage,
-        identityStore: IdentityStoreInterface,
+        identityStore: IdentityStore,
     ) {
     ) {
         val messageBox = createMessageBox(
         val messageBox = createMessageBox(
             message,
             message,
@@ -556,7 +559,7 @@ open class MessageProcessorProvider {
      */
      */
     private fun createMessageBox(
     private fun createMessageBox(
         msg: AbstractMessage,
         msg: AbstractMessage,
-        identityStore: IdentityStoreInterface,
+        identityStore: IdentityStore,
         forwardSecurityMessageProcessor: ForwardSecurityMessageProcessor,
         forwardSecurityMessageProcessor: ForwardSecurityMessageProcessor,
     ): MessageBox {
     ): MessageBox {
         val nonceFactory = NonceFactory(object : NonceStore {
         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.testutils.clearDatabaseAndCaches
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.data.TestDatabaseService
 import ch.threema.data.TestDatabaseService
+import ch.threema.data.datatypes.IdColor
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.models.ContactModelData
 import ch.threema.data.repositories.ContactModelRepository
 import ch.threema.data.repositories.ContactModelRepository
 import ch.threema.data.repositories.ModelRepositories
 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.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 import ch.threema.domain.stores.ContactStore
 import ch.threema.domain.stores.ContactStore
+import ch.threema.domain.types.Identity
 import ch.threema.storage.DatabaseService
 import ch.threema.storage.DatabaseService
 import ch.threema.storage.models.ContactModel
 import ch.threema.storage.models.ContactModel
 import ch.threema.storage.models.GroupMemberModel
 import ch.threema.storage.models.GroupMemberModel
@@ -88,6 +90,7 @@ class IdentityBlockedStepsTest {
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
             preferenceStore = serviceManager.preferenceStore,
             preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         )
         contactModelRepository = ModelRepositories(coreServiceManager).contacts
         contactModelRepository = ModelRepositories(coreServiceManager).contacts
@@ -99,6 +102,7 @@ class IdentityBlockedStepsTest {
         blockUnknownPreferenceService = object : PreferenceServiceImpl(
         blockUnknownPreferenceService = object : PreferenceServiceImpl(
             ThreemaApplication.getAppContext(),
             ThreemaApplication.getAppContext(),
             serviceManager.preferenceStore,
             serviceManager.preferenceStore,
+            serviceManager.encryptedPreferenceStore,
             coreServiceManager.taskManager,
             coreServiceManager.taskManager,
             coreServiceManager.multiDeviceManager,
             coreServiceManager.multiDeviceManager,
             coreServiceManager.nonceFactory,
             coreServiceManager.nonceFactory,
@@ -111,6 +115,7 @@ class IdentityBlockedStepsTest {
         noBlockPreferenceService = object : PreferenceServiceImpl(
         noBlockPreferenceService = object : PreferenceServiceImpl(
             ThreemaApplication.getAppContext(),
             ThreemaApplication.getAppContext(),
             serviceManager.preferenceStore,
             serviceManager.preferenceStore,
+            serviceManager.encryptedPreferenceStore,
             coreServiceManager.taskManager,
             coreServiceManager.taskManager,
             coreServiceManager.multiDeviceManager,
             coreServiceManager.multiDeviceManager,
             coreServiceManager.nonceFactory,
             coreServiceManager.nonceFactory,
@@ -216,7 +221,7 @@ class IdentityBlockedStepsTest {
     }
     }
 
 
     private fun runIdentityBlockedSteps(
     private fun runIdentityBlockedSteps(
-        identity: String,
+        identity: Identity,
         preferenceService: PreferenceService,
         preferenceService: PreferenceService,
     ) = runIdentityBlockedSteps(
     ) = runIdentityBlockedSteps(
         identity,
         identity,
@@ -236,7 +241,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 firstName = "",
                 lastName = "",
                 lastName = "",
                 nickname = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,
                 identityType = IdentityType.NORMAL,
@@ -264,7 +269,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 firstName = "",
                 lastName = "",
                 lastName = "",
                 nickname = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,
                 identityType = IdentityType.NORMAL,
@@ -292,7 +297,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 firstName = "",
                 lastName = "",
                 lastName = "",
                 nickname = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,
                 identityType = IdentityType.NORMAL,
@@ -320,7 +325,7 @@ class IdentityBlockedStepsTest {
                 firstName = "",
                 firstName = "",
                 lastName = "",
                 lastName = "",
                 nickname = "",
                 nickname = "",
-                colorIndex = 0u,
+                idColor = IdColor(0),
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 verificationLevel = VerificationLevel.UNVERIFIED,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 workVerificationLevel = WorkVerificationLevel.NONE,
                 identityType = IdentityType.NORMAL,
                 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.TestMultiDeviceManager
 import ch.threema.app.TestNonceStore
 import ch.threema.app.TestNonceStore
 import ch.threema.app.TestTaskManager
 import ch.threema.app.TestTaskManager
-import ch.threema.app.ThreemaApplication
 import ch.threema.app.listeners.ContactListener
 import ch.threema.app.listeners.ContactListener
 import ch.threema.app.managers.ListenerManager
 import ch.threema.app.managers.ListenerManager
 import ch.threema.app.preference.service.PreferenceServiceImpl
 import ch.threema.app.preference.service.PreferenceServiceImpl
-import ch.threema.app.stores.PreferenceStore
 import ch.threema.base.crypto.NonceFactory
 import ch.threema.base.crypto.NonceFactory
 import ch.threema.domain.helpers.ServerAckTaskCodec
 import ch.threema.domain.helpers.ServerAckTaskCodec
+import ch.threema.domain.types.Identity
 import kotlin.test.BeforeTest
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertEquals
 import kotlin.test.assertFalse
 import kotlin.test.assertFalse
 import kotlin.test.assertTrue
 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(
     private val multiDeviceManager = TestMultiDeviceManager(
         isMultiDeviceActive = false,
         isMultiDeviceActive = false,
     )
     )
@@ -46,27 +47,31 @@ class BlockedIdentitiesServiceTest {
 
 
     private val preferenceService =
     private val preferenceService =
         PreferenceServiceImpl(
         PreferenceServiceImpl(
-            ThreemaApplication.getAppContext(),
-            PreferenceStore(
-                ThreemaApplication.getAppContext(),
-                ThreemaApplication.getMasterKey(),
-            ),
+            /* context = */
+            get(),
+            /* preferenceStore = */
+            get(),
+            /* encryptedPreferenceStore = */
+            get(),
+            /* taskManager = */
             taskManager,
             taskManager,
+            /* multiDeviceManager = */
             multiDeviceManager,
             multiDeviceManager,
+            /* nonceFactory = */
             NonceFactory(TestNonceStore()),
             NonceFactory(TestNonceStore()),
         )
         )
 
 
     private val blockedIdentitiesService: BlockedIdentitiesService = BlockedIdentitiesServiceImpl(
     private val blockedIdentitiesService: BlockedIdentitiesService = BlockedIdentitiesServiceImpl(
-        preferenceService,
-        multiDeviceManager,
-        ThreemaApplication.requireServiceManager().taskCreator,
+        preferenceService = preferenceService,
+        multiDeviceManager = multiDeviceManager,
+        taskCreator = get(),
     )
     )
 
 
     private val onModified = ArrayDeque<String>()
     private val onModified = ArrayDeque<String>()
 
 
     init {
     init {
         ListenerManager.contactListeners.add(object : ContactListener {
         ListenerManager.contactListeners.add(object : ContactListener {
-            override fun onModified(identity: String) {
+            override fun onModified(identity: Identity) {
                 onModified.addLast(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.blob.BlobUploader
 import ch.threema.domain.protocol.connection.data.CspMessage
 import ch.threema.domain.protocol.connection.data.CspMessage
 import ch.threema.domain.protocol.connection.data.OutboundD2mMessage
 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.ContactModel
 import ch.threema.storage.models.GroupModel
 import ch.threema.storage.models.GroupModel
 import ch.threema.testhelpers.MUST_NOT_BE_CALLED
 import ch.threema.testhelpers.MUST_NOT_BE_CALLED
+import java.net.URL
 import java.util.Date
 import java.util.Date
-import javax.net.ssl.HttpsURLConnection
 import kotlin.test.BeforeTest
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.Test
 import kotlin.test.assertEquals
 import kotlin.test.assertEquals
@@ -112,7 +113,7 @@ class GroupCreateTaskTest {
             MUST_NOT_BE_CALLED()
             MUST_NOT_BE_CALLED()
         }
         }
 
 
-        override fun createAvatarURLConnection(identity: String?): HttpsURLConnection {
+        override fun getAvatarURL(identity: Identity): URL {
             MUST_NOT_BE_CALLED()
             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
 package ch.threema.app.tasks
 
 
 import ch.threema.app.ThreemaApplication
 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.ContactModelData
 import ch.threema.data.models.GroupIdentity
 import ch.threema.data.models.GroupIdentity
 import ch.threema.data.models.GroupModelData
 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.TypingIndicatorPolicy
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 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 ch.threema.storage.models.ContactModel
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import java.util.Date
 import junit.framework.TestCase.assertEquals
 import junit.framework.TestCase.assertEquals
 import junit.framework.TestCase.assertNotNull
 import junit.framework.TestCase.assertNotNull
-import junit.framework.TestCase.fail
+import kotlin.reflect.KClass
 import kotlin.test.Test
 import kotlin.test.Test
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.runBlocking
 import kotlinx.serialization.json.Json
 import kotlinx.serialization.json.Json
@@ -56,7 +55,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testContactDeliveryReceiptMessageTask() {
     fun testContactDeliveryReceiptMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingContactDeliveryReceiptMessageTask::class.java,
+            OutgoingContactDeliveryReceiptMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactDeliveryReceiptMessageTask.OutgoingDeliveryReceiptMessageData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingContactDeliveryReceiptMessageTask.OutgoingDeliveryReceiptMessageData",""" +
                 """"receiptType":1,"messageIds":["0000000000000000"],"date":"1234567890","toIdentity":"01234567"}""",
                 """"receiptType":1,"messageIds":["0000000000000000"],"date":"1234567890","toIdentity":"01234567"}""",
         )
         )
@@ -65,7 +64,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testFileMessageTask() {
     fun testFileMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingFileMessageTask::class.java,
+            OutgoingFileMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingFileMessageTask.OutgoingFileMessageData","messageModelId":1,"receiverType":0,""" +
             """{"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]}""",
                 """"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
     @Test
     fun testGroupDeleteProfilePictureTask() {
     fun testGroupDeleteProfilePictureTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupDeleteProfilePictureTask::class.java,
+            OutgoingGroupDeleteProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeleteProfilePictureTask.OutgoingGroupDeleteProfilePictureData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeleteProfilePictureTask.OutgoingGroupDeleteProfilePictureData",""" +
                 """"groupId":[0,0,0,0,0,0,0,0],"creatorIdentity":"01234567","receiverIdentities":["01234567"],""" +
                 """"groupId":[0,0,0,0,0,0,0,0],"creatorIdentity":"01234567","receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -84,7 +83,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupDeliveryReceiptMessageTask() {
     fun testGroupDeliveryReceiptMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupDeliveryReceiptMessageTask::class.java,
+            OutgoingGroupDeliveryReceiptMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeliveryReceiptMessageTask.OutgoingGroupDeliveryReceiptMessageData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeliveryReceiptMessageTask.OutgoingGroupDeliveryReceiptMessageData",""" +
                 """"messageModelId":0,"recipientIdentities":["01234567","01234567"],"receiptType":0}""",
                 """"messageModelId":0,"recipientIdentities":["01234567","01234567"],"receiptType":0}""",
         )
         )
@@ -93,7 +92,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupLeaveTask() {
     fun testGroupLeaveTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupLeaveTask::class.java,
+            OutgoingGroupLeaveTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupLeaveTask.OutgoingGroupLeaveTaskData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupLeaveTask.OutgoingGroupLeaveTaskData",""" +
                 """"groupIdentity":{"creatorIdentity":"01234567","groupId":42},"memberIdentities":["01234567"],""" +
                 """"groupIdentity":{"creatorIdentity":"01234567","groupId":42},"memberIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -103,7 +102,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupNameTask() {
     fun testGroupNameTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupNameTask::class.java,
+            OutgoingGroupNameTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupNameTask.OutgoingGroupNameData","groupId":[0,0,0,0,0,0,0,0],""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupNameTask.OutgoingGroupNameData","groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567","groupName":"groupName","receiverIdentities":["01234567"],""" +
                 """"creatorIdentity":"01234567","groupName":"groupName","receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -113,7 +112,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupProfilePictureTask() {
     fun testGroupProfilePictureTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupProfilePictureTask::class.java,
+            OutgoingGroupProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupProfilePictureTask.OutgoingGroupProfilePictureData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupProfilePictureTask.OutgoingGroupProfilePictureData",""" +
                 """"groupId":[0,0,0,0,0,0,0,0],"creatorIdentity":"01234567","receiverIdentities":["01234567"],""" +
                 """"groupId":[0,0,0,0,0,0,0,0],"creatorIdentity":"01234567","receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -123,7 +122,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupSetupTask() {
     fun testGroupSetupTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupSetupTask::class.java,
+            OutgoingGroupSetupTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupSetupTask.OutgoingGroupSetupData","groupId":[0,0,0,0,0,0,0,0],""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupSetupTask.OutgoingGroupSetupData","groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567","memberIdentities":["01234567"],"receiverIdentities":["01234567"],""" +
                 """"creatorIdentity":"01234567","memberIdentities":["01234567"],"receiverIdentities":["01234567"],""" +
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
                 """"messageId":[0,0,0,0,0,0,0,0]}""",
@@ -133,7 +132,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupSyncRequestTask() {
     fun testGroupSyncRequestTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupSyncRequestTask::class.java,
+            OutgoingGroupSyncRequestTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupSyncRequestTask.OutgoingGroupSyncRequestData",""" +
             """{"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]}""",
                 """"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
     @Test
     fun testGroupSyncTask() {
     fun testGroupSyncTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupSyncTask::class.java,
+            OutgoingGroupSyncTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupSyncTask.OutgoingGroupSyncData","groupId":[0,0,0,0,0,0,0,0],""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupSyncTask.OutgoingGroupSyncData","groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567","receiverIdentities":["01234567"]}""",
                 """"creatorIdentity":"01234567","receiverIdentities":["01234567"]}""",
         )
         )
@@ -151,7 +150,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testLocationMessageTask() {
     fun testLocationMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingLocationMessageTask::class.java,
+            OutgoingLocationMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingLocationMessageTask.OutgoingLocationMessageTaskData","messageModelId":0,""" +
             """{"type":"ch.threema.app.tasks.OutgoingLocationMessageTask.OutgoingLocationMessageTaskData","messageModelId":0,""" +
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0}""",
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0}""",
         )
         )
@@ -160,7 +159,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testPollSetupMessageTask() {
     fun testPollSetupMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingPollSetupMessageTask::class.java,
+            OutgoingPollSetupMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingPollSetupMessageTask.OutgoingPollSetupMessageData","messageModelId":0,""" +
             """{"type":"ch.threema.app.tasks.OutgoingPollSetupMessageTask.OutgoingPollSetupMessageData","messageModelId":0,""" +
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0,"ballotId":[-58,11,102,-122,-119,-102,19,-10],""" +
                 """"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,""" +
                 """"ballotData":"{\"d\":\"description\",\"s\":0,\"a\":0,\"t\":1,\"o\":0,\"u\":0,""" +
@@ -171,7 +170,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testPollVoteContactMessageTask() {
     fun testPollVoteContactMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingPollVoteContactMessageTask::class.java,
+            OutgoingPollVoteContactMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingPollVoteContactMessageTask.OutgoingPollVoteContactMessageData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingPollVoteContactMessageTask.OutgoingPollVoteContactMessageData",""" +
                 """"messageId":"0000000000000000","ballotId":[-127,-79,80,-109,-98,62,-3,81],"ballotCreator":"01234567",""" +
                 """"messageId":"0000000000000000","ballotId":[-127,-79,80,-109,-98,62,-3,81],"ballotCreator":"01234567",""" +
                 """"ballotVotes":[{"first":0,"second":0}],"toIdentity":"01234567"}""",
                 """"ballotVotes":[{"first":0,"second":0}],"toIdentity":"01234567"}""",
@@ -181,7 +180,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testPollVoteGroupMessageTask() {
     fun testPollVoteGroupMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingPollVoteGroupMessageTask::class.java,
+            OutgoingPollVoteGroupMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingPollVoteGroupMessageTask.OutgoingPollVoteGroupMessageData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingPollVoteGroupMessageTask.OutgoingPollVoteGroupMessageData",""" +
                 """"messageId":"0000000000000000","recipientIdentities":["01234567","01234567"],"ballotId":[52,64,-6,18,2,-71,124,-19],""" +
                 """"messageId":"0000000000000000","recipientIdentities":["01234567","01234567"],"ballotId":[52,64,-6,18,2,-71,124,-19],""" +
                 """"ballotCreator":"01234567","ballotVotes":[{"first":0,"second":0}],"ballotType":"INTERMEDIATE",""" +
                 """"ballotCreator":"01234567","ballotVotes":[{"first":0,"second":0}],"ballotType":"INTERMEDIATE",""" +
@@ -192,7 +191,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testTextMessageTask() {
     fun testTextMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingTextMessageTask::class.java,
+            OutgoingTextMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingTextMessageTask.OutgoingTextMessageData","messageModelId":0,""" +
             """{"type":"ch.threema.app.tasks.OutgoingTextMessageTask.OutgoingTextMessageData","messageModelId":0,""" +
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0}""",
                 """"recipientIdentities":["01234567","01234567"],"receiverType":0}""",
         )
         )
@@ -201,7 +200,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testSendProfilePictureTask() {
     fun testSendProfilePictureTask() {
         assertValidEncoding(
         assertValidEncoding(
-            SendProfilePictureTask::class.java,
+            SendProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.SendProfilePictureTask.SendProfilePictureData","toIdentity":"01234567"}""",
             """{"type":"ch.threema.app.tasks.SendProfilePictureTask.SendProfilePictureData","toIdentity":"01234567"}""",
         )
         )
     }
     }
@@ -209,7 +208,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testSendPushTokenTask() {
     fun testSendPushTokenTask() {
         assertValidEncoding(
         assertValidEncoding(
-            SendPushTokenTask::class.java,
+            SendPushTokenTask::class,
             """{"type":"ch.threema.app.tasks.SendPushTokenTask.SendPushTokenData","token":"token","tokenType":0}""",
             """{"type":"ch.threema.app.tasks.SendPushTokenTask.SendPushTokenData","token":"token","tokenType":0}""",
         )
         )
     }
     }
@@ -217,7 +216,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutgoingContactRequestProfilePictureTask() {
     fun testOutgoingContactRequestProfilePictureTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingContactRequestProfilePictureTask::class.java,
+            OutgoingContactRequestProfilePictureTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactRequestProfilePictureTask.OutgoingContactRequestProfilePictureData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingContactRequestProfilePictureTask.OutgoingContactRequestProfilePictureData",""" +
                 """"toIdentity":"01234567"}""",
                 """"toIdentity":"01234567"}""",
         )
         )
@@ -229,22 +228,22 @@ class PersistableTasksTest {
         addTestData()
         addTestData()
 
 
         assertValidEncoding(
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"RESET"}""",
                 """"identity":"01234567","cause":"RESET"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"UNKNOWN_SESSION"}""",
                 """"identity":"01234567","cause":"UNKNOWN_SESSION"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"DISABLED_BY_LOCAL"}""",
                 """"identity":"01234567","cause":"DISABLED_BY_LOCAL"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            DeleteAndTerminateFSSessionsTask::class.java,
+            DeleteAndTerminateFSSessionsTask::class,
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
             """{"type":"ch.threema.app.tasks.DeleteAndTerminateFSSessionsTask.DeleteAndTerminateFSSessionsTaskData",""" +
                 """"identity":"01234567","cause":"DISABLED_BY_REMOTE"}""",
                 """"identity":"01234567","cause":"DISABLED_BY_REMOTE"}""",
         )
         )
@@ -253,7 +252,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testApplicationUpdateStepsTask() {
     fun testApplicationUpdateStepsTask() {
         assertValidEncoding(
         assertValidEncoding(
-            ApplicationUpdateStepsTask::class.java,
+            ApplicationUpdateStepsTask::class,
             """{"type":"ch.threema.app.tasks.ApplicationUpdateStepsTask.ApplicationUpdateStepsData"}""",
             """{"type":"ch.threema.app.tasks.ApplicationUpdateStepsTask.ApplicationUpdateStepsData"}""",
         )
         )
     }
     }
@@ -261,7 +260,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testFSRefreshStepsTask() {
     fun testFSRefreshStepsTask() {
         assertValidEncoding(
         assertValidEncoding(
-            FSRefreshStepsTask::class.java,
+            FSRefreshStepsTask::class,
             """{"type":"ch.threema.app.tasks.FSRefreshStepsTask.FSRefreshStepsTaskData","contactIdentities":["01234567"]}""",
             """{"type":"ch.threema.app.tasks.FSRefreshStepsTask.FSRefreshStepsTaskData","contactIdentities":["01234567"]}""",
         )
         )
     }
     }
@@ -269,7 +268,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutboundIncomingContactMessageUpdateReadTask() {
     fun testOutboundIncomingContactMessageUpdateReadTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutboundIncomingContactMessageUpdateReadTask::class.java,
+            OutboundIncomingContactMessageUpdateReadTask::class,
             """{"type":"ch.threema.app.tasks.OutboundIncomingContactMessageUpdateReadTask.OutboundIncomingContactMessageUpdateReadData",""" +
             """{"type":"ch.threema.app.tasks.OutboundIncomingContactMessageUpdateReadTask.OutboundIncomingContactMessageUpdateReadData",""" +
                 """"messageIds":[[0,-1,2,3,4,5,6,7]],"timestamp":1704067200000,"recipientIdentity":"01234567"}""",
                 """"messageIds":[[0,-1,2,3,4,5,6,7]],"timestamp":1704067200000,"recipientIdentity":"01234567"}""",
         )
         )
@@ -278,7 +277,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutboundIncomingGroupMessageUpdateReadTask() {
     fun testOutboundIncomingGroupMessageUpdateReadTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutboundIncomingGroupMessageUpdateReadTask::class.java,
+            OutboundIncomingGroupMessageUpdateReadTask::class,
             """{"type":"ch.threema.app.tasks.OutboundIncomingGroupMessageUpdateReadTask.OutboundIncomingGroupMessageUpdateReadData",""" +
             """{"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],""" +
                 """"messageIds":[[0,-1,2,3,4,5,6,7]],"timestamp":1704067200000,"groupId":[0,0,0,0,0,0,0,0],""" +
                 """"creatorIdentity":"01234567"}""",
                 """"creatorIdentity":"01234567"}""",
@@ -288,7 +287,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutgoingContactEditMessageTask() {
     fun testOutgoingContactEditMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingContactEditMessageTask::class.java,
+            OutgoingContactEditMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactEditMessageTask.OutgoingContactEditMessageData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingContactEditMessageTask.OutgoingContactEditMessageData",""" +
                 """"toIdentity":"01234567","messageModelId":0, "messageId":[0,0,0,0,0,0,0,0], "editedText":"test", "editedAt":0}""",
                 """"toIdentity":"01234567","messageModelId":0, "messageId":[0,0,0,0,0,0,0,0], "editedText":"test", "editedAt":0}""",
         )
         )
@@ -297,7 +296,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutgoingGroupEditMessageTask() {
     fun testOutgoingGroupEditMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupEditMessageTask::class.java,
+            OutgoingGroupEditMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupEditMessageTask.OutgoingGroupEditMessageData","messageModelId":0, """ +
             """{"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"]}""",
                 """"messageId":[0,0,0,0,0,0,0,0], "editedText":"test", "editedAt":0,"recipientIdentities":["01234567","01234567"]}""",
         )
         )
@@ -306,7 +305,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutgoingContactDeleteMessageTask() {
     fun testOutgoingContactDeleteMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingContactDeleteMessageTask::class.java,
+            OutgoingContactDeleteMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingContactDeleteMessageTask.OutgoingContactDeleteMessageData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingContactDeleteMessageTask.OutgoingContactDeleteMessageData",""" +
                 """"toIdentity":"01234567","messageModelId":0, "messageId":[0,0,0,0,0,0,0,0], "deletedAt":0}""",
                 """"toIdentity":"01234567","messageModelId":0, "messageId":[0,0,0,0,0,0,0,0], "deletedAt":0}""",
         )
         )
@@ -315,7 +314,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutgoingGroupDeleteMessageTask() {
     fun testOutgoingGroupDeleteMessageTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupDeleteMessageTask::class.java,
+            OutgoingGroupDeleteMessageTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeleteMessageTask.OutgoingGroupDeleteMessageData",""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupDeleteMessageTask.OutgoingGroupDeleteMessageData",""" +
                 """"messageModelId":0,"messageId":[0,0,0,0,0,0,0,0],"deletedAt":0,"recipientIdentities":["01234567","01234567"]}""",
                 """"messageModelId":0,"messageId":[0,0,0,0,0,0,0,0],"deletedAt":0,"recipientIdentities":["01234567","01234567"]}""",
         )
         )
@@ -324,7 +323,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectUserProfileNicknameSyncTask() {
     fun testReflectUserProfileNicknameSyncTask() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectUserProfileNicknameSyncTask::class.java,
+            ReflectUserProfileNicknameSyncTask::class,
             """{"type":"ch.threema.app.tasks.ReflectUserProfileNicknameSyncTask.ReflectUserProfileNicknameSyncTaskData",""" +
             """{"type":"ch.threema.app.tasks.ReflectUserProfileNicknameSyncTask.ReflectUserProfileNicknameSyncTaskData",""" +
                 """"newNickname":"nick"}""",
                 """"newNickname":"nick"}""",
         )
         )
@@ -333,7 +332,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectUserProfilePictureSyncTask() {
     fun testReflectUserProfilePictureSyncTask() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectUserProfilePictureSyncTask::class.java,
+            ReflectUserProfilePictureSyncTask::class,
             """{"type":"ch.threema.app.tasks.ReflectUserProfilePictureSyncTask.ReflectUserProfilePictureSyncTaskData"}""",
             """{"type":"ch.threema.app.tasks.ReflectUserProfilePictureSyncTask.ReflectUserProfilePictureSyncTaskData"}""",
         )
         )
     }
     }
@@ -341,7 +340,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectUserProfileShareWithPolicySyncTask() {
     fun testReflectUserProfileShareWithPolicySyncTask() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectUserProfileShareWithPolicySyncTask::class.java,
+            ReflectUserProfileShareWithPolicySyncTask::class,
             """{"type":"ch.threema.app.tasks.ReflectUserProfileShareWithPolicySyncTask.ReflectUserProfileShareWithPolicySyncTaskData",""" +
             """{"type":"ch.threema.app.tasks.ReflectUserProfileShareWithPolicySyncTask.ReflectUserProfileShareWithPolicySyncTaskData",""" +
                 """"newPolicy":"NOBODY"}""",
                 """"newPolicy":"NOBODY"}""",
         )
         )
@@ -350,7 +349,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectUserProfileShareWithAllowListSyncTask() {
     fun testReflectUserProfileShareWithAllowListSyncTask() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectUserProfileShareWithAllowListSyncTask::class.java,
+            ReflectUserProfileShareWithAllowListSyncTask::class,
             """{"type":""" +
             """{"type":""" +
                 """"ch.threema.app.tasks.ReflectUserProfileShareWithAllowListSyncTask.ReflectUserProfileShareWithAllowListSyncTaskData",""" +
                 """"ch.threema.app.tasks.ReflectUserProfileShareWithAllowListSyncTask.ReflectUserProfileShareWithAllowListSyncTaskData",""" +
                 """"allowedIdentities":["01234567", "01234568"]}""",
                 """"allowedIdentities":["01234567", "01234568"]}""",
@@ -360,7 +359,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectUserProfileIdentityLinksTask() {
     fun testReflectUserProfileIdentityLinksTask() {
         assertValidEncoding(
         assertValidEncoding(
-            expectedTaskClass = ReflectUserProfileIdentityLinksTask::class.java,
+            expectedTaskClass = ReflectUserProfileIdentityLinksTask::class,
             encodedTask = """{"type":"ch.threema.app.tasks.ReflectUserProfileIdentityLinksTask.ReflectUserProfileIdentityLinksTaskData"}""",
             encodedTask = """{"type":"ch.threema.app.tasks.ReflectUserProfileIdentityLinksTask.ReflectUserProfileIdentityLinksTaskData"}""",
         )
         )
     }
     }
@@ -368,17 +367,17 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectNameUpdate() {
     fun testReflectNameUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNameUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNameUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
                 """"firstName":"A","lastName":"B","identity":"01234567"}""",
                 """"firstName":"A","lastName":"B","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNameUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNameUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
                 """"firstName":"A","lastName":"","identity":"01234567"}""",
                 """"firstName":"A","lastName":"","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNameUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNameUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNameUpdate.ReflectNameUpdateData",""" +
                 """"firstName":"","lastName":"B","identity":"01234567"}""",
                 """"firstName":"","lastName":"B","identity":"01234567"}""",
         )
         )
@@ -387,17 +386,17 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectReadReceiptPolicyUpdate() {
     fun testReflectReadReceiptPolicyUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
                 """"readReceiptPolicy":"DEFAULT","identity":"01234567"}""",
                 """"readReceiptPolicy":"DEFAULT","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
                 """"readReceiptPolicy":"SEND","identity":"01234567"}""",
                 """"readReceiptPolicy":"SEND","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectReadReceiptPolicyUpdate.ReflectReadReceiptPolicyUpdateData",""" +
                 """"readReceiptPolicy":"DONT_SEND","identity":"01234567"}""",
                 """"readReceiptPolicy":"DONT_SEND","identity":"01234567"}""",
         )
         )
@@ -406,17 +405,17 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectTypingIndicatorPolicyUpdate() {
     fun testReflectTypingIndicatorPolicyUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"DEFAULT","identity":"01234567"}""",
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"DEFAULT","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"SEND","identity":"01234567"}""",
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"SEND","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectTypingIndicatorPolicyUpdate.""" +
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"DONT_SEND","identity":"01234567"}""",
                 """ReflectTypingIndicatorPolicyUpdateData","typingIndicatorPolicy":"DONT_SEND","identity":"01234567"}""",
         )
         )
@@ -425,17 +424,17 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectActivityStateUpdate() {
     fun testReflectActivityStateUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
                 """"identityState":"ACTIVE","identity":"01234567"}""",
                 """"identityState":"ACTIVE","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
                 """"identityState":"INACTIVE","identity":"01234567"}""",
                 """"identityState":"INACTIVE","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectActivityStateUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectActivityStateUpdate.ReflectActivityStateUpdateData",""" +
                 """"identityState":"INVALID","identity":"01234567"}""",
                 """"identityState":"INVALID","identity":"01234567"}""",
         )
         )
@@ -444,7 +443,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectFeatureMaskUpdate() {
     fun testReflectFeatureMaskUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectFeatureMaskUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectFeatureMaskUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectFeatureMaskUpdate.ReflectFeatureMaskUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectFeatureMaskUpdate.ReflectFeatureMaskUpdateData",""" +
                 """"featureMask":12345,"identity":"01234567"}""",
                 """"featureMask":12345,"identity":"01234567"}""",
         )
         )
@@ -453,17 +452,17 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testVerificationLevelUpdate() {
     fun testVerificationLevelUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
                 """"verificationLevel":"UNVERIFIED","identity":"01234567"}""",
                 """"verificationLevel":"UNVERIFIED","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
                 """"verificationLevel":"SERVER_VERIFIED","identity":"01234567"}""",
                 """"verificationLevel":"SERVER_VERIFIED","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectVerificationLevelUpdate.ReflectVerificationLevelUpdateData",""" +
                 """"verificationLevel":"FULLY_VERIFIED","identity":"01234567"}""",
                 """"verificationLevel":"FULLY_VERIFIED","identity":"01234567"}""",
         )
         )
@@ -472,12 +471,12 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testWorkVerificationLevelUpdate() {
     fun testWorkVerificationLevelUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate.""" +
                 """ReflectWorkVerificationLevelUpdateData","workVerificationLevel":"NONE","identity":"01234567"}""",
                 """ReflectWorkVerificationLevelUpdateData","workVerificationLevel":"NONE","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectWorkVerificationLevelUpdate.""" +
                 """ReflectWorkVerificationLevelUpdateData","workVerificationLevel":"WORK_SUBSCRIPTION_VERIFIED","identity":"01234567"}""",
                 """ReflectWorkVerificationLevelUpdateData","workVerificationLevel":"WORK_SUBSCRIPTION_VERIFIED","identity":"01234567"}""",
         )
         )
@@ -486,12 +485,12 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testIdentityTypeUpdate() {
     fun testIdentityTypeUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate.ReflectIdentityTypeUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate.ReflectIdentityTypeUpdateData",""" +
                 """"identityType":"NORMAL","identity":"01234567"}""",
                 """"identityType":"NORMAL","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate.ReflectIdentityTypeUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectIdentityTypeUpdate.ReflectIdentityTypeUpdateData",""" +
                 """"identityType":"WORK","identity":"01234567"}""",
                 """"identityType":"WORK","identity":"01234567"}""",
         )
         )
@@ -500,12 +499,12 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testAcquaintanceLevelUpdate() {
     fun testAcquaintanceLevelUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate.ReflectAcquaintanceLevelUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate.ReflectAcquaintanceLevelUpdateData",""" +
                 """"acquaintanceLevel":"DIRECT","identity":"01234567"}""",
                 """"acquaintanceLevel":"DIRECT","identity":"01234567"}""",
         )
         )
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate.ReflectAcquaintanceLevelUpdateData",""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectAcquaintanceLevelUpdate.ReflectAcquaintanceLevelUpdateData",""" +
                 """"acquaintanceLevel":"GROUP","identity":"01234567"}""",
                 """"acquaintanceLevel":"GROUP","identity":"01234567"}""",
         )
         )
@@ -514,7 +513,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testUserDefinedProfilePictureUpdate() {
     fun testUserDefinedProfilePictureUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectUserDefinedProfilePictureUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectUserDefinedProfilePictureUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectUserDefinedProfilePictureUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectUserDefinedProfilePictureUpdate.""" +
                 """ReflectUserDefinedProfilePictureUpdateData","identity":"0BZYE2H9"}""",
                 """ReflectUserDefinedProfilePictureUpdateData","identity":"0BZYE2H9"}""",
         )
         )
@@ -526,7 +525,7 @@ class PersistableTasksTest {
         addTestData()
         addTestData()
 
 
         assertValidEncoding(
         assertValidEncoding(
-            OnFSFeatureMaskDowngradedTask::class.java,
+            OnFSFeatureMaskDowngradedTask::class,
             """{"type":"ch.threema.app.tasks.OnFSFeatureMaskDowngradedTask.OnFSFeatureMaskDowngradedData","identity":"01234567"}""",
             """{"type":"ch.threema.app.tasks.OnFSFeatureMaskDowngradedTask.OnFSFeatureMaskDowngradedData","identity":"01234567"}""",
         )
         )
     }
     }
@@ -534,7 +533,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectContactSyncPolicyUpdate() {
     fun testReflectContactSyncPolicyUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectContactSyncPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectContactSyncPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectContactSyncPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectContactSyncPolicySyncUpdate.""" +
                 """ReflectContactSyncPolicySyncUpdateData"}""",
                 """ReflectContactSyncPolicySyncUpdateData"}""",
         )
         )
@@ -543,7 +542,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectUnknownContactPolicyUpdate() {
     fun testReflectUnknownContactPolicyUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectUnknownContactPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectUnknownContactPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectUnknownContactPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectUnknownContactPolicySyncUpdate.""" +
                 """ReflectUnknownContactPolicySyncUpdateData"}""",
                 """ReflectUnknownContactPolicySyncUpdateData"}""",
         )
         )
@@ -552,7 +551,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectReadReceiptPolicySyncUpdate() {
     fun testReflectReadReceiptPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectReadReceiptPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectReadReceiptPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectReadReceiptPolicySyncUpdate.ReadReceiptPolicySyncUpdateData"}""",
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectReadReceiptPolicySyncUpdate.ReadReceiptPolicySyncUpdateData"}""",
         )
         )
     }
     }
@@ -560,7 +559,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectTypingIndicatorPolicySyncUpdate() {
     fun testReflectTypingIndicatorPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectTypingIndicatorPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectTypingIndicatorPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectTypingIndicatorPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectTypingIndicatorPolicySyncUpdate.""" +
                 """ReflectTypingIndicatorPolicySyncUpdateData"}""",
                 """ReflectTypingIndicatorPolicySyncUpdateData"}""",
         )
         )
@@ -569,7 +568,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectO2oCallPolicySyncUpdate() {
     fun testReflectO2oCallPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectO2oCallPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectO2oCallPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallPolicySyncUpdate.""" +
                 """ReflectO2oCallPolicySyncUpdateData"}""",
                 """ReflectO2oCallPolicySyncUpdateData"}""",
         )
         )
@@ -578,7 +577,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectO2oCallConnectionPolicySyncUpdate() {
     fun testReflectO2oCallConnectionPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectO2oCallConnectionPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectO2oCallConnectionPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallConnectionPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallConnectionPolicySyncUpdate.""" +
                 """ReflectO2oCallConnectionPolicySyncUpdateData"}""",
                 """ReflectO2oCallConnectionPolicySyncUpdateData"}""",
         )
         )
@@ -587,7 +586,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectO2oCallVideoPolicySyncUpdate() {
     fun testReflectO2oCallVideoPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectO2oCallVideoPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectO2oCallVideoPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallVideoPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectO2oCallVideoPolicySyncUpdate.""" +
                 """ReflectO2oCallVideoPolicySyncUpdateData"}""",
                 """ReflectO2oCallVideoPolicySyncUpdateData"}""",
         )
         )
@@ -596,7 +595,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectGroupCallPolicySyncUpdate() {
     fun testReflectGroupCallPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectGroupCallPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectGroupCallPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectGroupCallPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectGroupCallPolicySyncUpdate.""" +
                 """ReflectGroupCallPolicySyncUpdateData"}""",
                 """ReflectGroupCallPolicySyncUpdateData"}""",
         )
         )
@@ -605,7 +604,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectScreenshotPolicySyncUpdate() {
     fun testReflectScreenshotPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectScreenshotPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectScreenshotPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectScreenshotPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectScreenshotPolicySyncUpdate.""" +
                 """ReflectScreenshotPolicySyncUpdateData"}""",
                 """ReflectScreenshotPolicySyncUpdateData"}""",
         )
         )
@@ -614,7 +613,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectKeyboardDataCollectionPolicySyncUpdate() {
     fun testReflectKeyboardDataCollectionPolicySyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectKeyboardDataCollectionPolicySyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectKeyboardDataCollectionPolicySyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectKeyboardDataCollectionPolicySyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectKeyboardDataCollectionPolicySyncUpdate.""" +
                 """ReflectKeyboardDataCollectionPolicySyncUpdateData"}""",
                 """ReflectKeyboardDataCollectionPolicySyncUpdateData"}""",
         )
         )
@@ -623,7 +622,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectBlockedIdentitiesSyncUpdate() {
     fun testReflectBlockedIdentitiesSyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectBlockedIdentitiesSyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectBlockedIdentitiesSyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectBlockedIdentitiesSyncUpdate.ReflectBlockedIdentitiesSyncUpdateData"}""",
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectBlockedIdentitiesSyncUpdate.ReflectBlockedIdentitiesSyncUpdateData"}""",
         )
         )
     }
     }
@@ -631,7 +630,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectExcludeFromSyncIdentitiesSyncUpdate() {
     fun testReflectExcludeFromSyncIdentitiesSyncUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectSettingsSyncTask.ReflectExcludeFromSyncIdentitiesSyncUpdate::class.java,
+            ReflectSettingsSyncTask.ReflectExcludeFromSyncIdentitiesSyncUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectExcludeFromSyncIdentitiesSyncUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectSettingsSyncTask.ReflectExcludeFromSyncIdentitiesSyncUpdate.""" +
                 """ReflectExcludeFromSyncIdentitiesSyncUpdateData"}""",
                 """ReflectExcludeFromSyncIdentitiesSyncUpdateData"}""",
         )
         )
@@ -640,7 +639,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupCreateTask() {
     fun testGroupCreateTask() {
         assertValidEncoding(
         assertValidEncoding(
-            GroupCreateTask::class.java,
+            GroupCreateTask::class,
             """{"type":"ch.threema.app.tasks.GroupCreateTask.GroupCreateTaskData","name":"Name","profilePictureChange":""" +
             """{"type":"ch.threema.app.tasks.GroupCreateTask.GroupCreateTaskData","name":"Name","profilePictureChange":""" +
                 """{"type":"ch.threema.app.protocol.RemoveProfilePicture"},"members":["TESTTEST","01234567"],"groupIdentity":""" +
                 """{"type":"ch.threema.app.protocol.RemoveProfilePicture"},"members":["TESTTEST","01234567"],"groupIdentity":""" +
                 """{"creatorIdentity":"01234567","groupId":42},"predefinedMessageIds":{"messageIdBytes1":[-121,-57,86,-82,-126,8,80,89],""" +
                 """{"creatorIdentity":"01234567","groupId":42},"predefinedMessageIds":{"messageIdBytes1":[-121,-57,86,-82,-126,8,80,89],""" +
@@ -652,7 +651,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testGroupUpdateTask() {
     fun testGroupUpdateTask() {
         assertValidEncoding(
         assertValidEncoding(
-            GroupUpdateTask::class.java,
+            GroupUpdateTask::class,
             """{"type":"ch.threema.app.tasks.GroupUpdateTask.GroupUpdateTaskData","name":"Name","profilePictureChange":""" +
             """{"type":"ch.threema.app.tasks.GroupUpdateTask.GroupUpdateTaskData","name":"Name","profilePictureChange":""" +
                 """{"type":"ch.threema.app.protocol.RemoveProfilePicture"},"updatedMembers":["01234567"],"addedMembers":["TESTTEST",""" +
                 """{"type":"ch.threema.app.protocol.RemoveProfilePicture"},"updatedMembers":["01234567"],"addedMembers":["TESTTEST",""" +
                 """"01234567"],"removedMembers":["01234567"],"groupIdentity":{"creatorIdentity":"01234567","groupId":42},""" +
                 """"01234567"],"removedMembers":["01234567"],"groupIdentity":{"creatorIdentity":"01234567","groupId":42},""" +
@@ -664,7 +663,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testOutgoingGroupDisbandTask() {
     fun testOutgoingGroupDisbandTask() {
         assertValidEncoding(
         assertValidEncoding(
-            OutgoingGroupDisbandTask::class.java,
+            OutgoingGroupDisbandTask::class,
             """{"type":"ch.threema.app.tasks.OutgoingGroupDisbandTask.OutgoingGroupDisbandTaskData","groupIdentity":""" +
             """{"type":"ch.threema.app.tasks.OutgoingGroupDisbandTask.OutgoingGroupDisbandTaskData","groupIdentity":""" +
                 """{"creatorIdentity":"TESTTEST","groupId":42},"members":["01234567"],"messageId":[0,1,2,3,4,5,6,7]}""",
                 """{"creatorIdentity":"TESTTEST","groupId":42},"members":["01234567"],"messageId":[0,1,2,3,4,5,6,7]}""",
         )
         )
@@ -673,7 +672,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testContactNotificationTriggerPolicyOverrideUpdate() {
     fun testContactNotificationTriggerPolicyOverrideUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate.""" +
                 """ReflectNotificationTriggerPolicyOverrideUpdateData","notificationTriggerPolicyOverride":1740396679447,""" +
                 """ReflectNotificationTriggerPolicyOverrideUpdateData","notificationTriggerPolicyOverride":1740396679447,""" +
                 """"contactIdentity":"01234567"}""",
                 """"contactIdentity":"01234567"}""",
@@ -684,7 +683,7 @@ class PersistableTasksTest {
     fun testGroupNotificationTriggerPolicyOverrideUpdate() {
     fun testGroupNotificationTriggerPolicyOverrideUpdate() {
         addTestData()
         addTestData()
         assertValidEncoding(
         assertValidEncoding(
-            ReflectGroupSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class.java,
+            ReflectGroupSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate::class,
             """{"type":"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate.""" +
             """{"type":"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectNotificationTriggerPolicyOverrideUpdate.""" +
                 """ReflectNotificationTriggerPolicyOverrideUpdateData","newNotificationTriggerPolicyOverride":""" +
                 """ReflectNotificationTriggerPolicyOverrideUpdateData","newNotificationTriggerPolicyOverride":""" +
                 """{"type":"ch.threema.data.datatypes.NotificationTriggerPolicyOverride.MutedUntil","dbValue":1740396953761,""" +
                 """{"type":"ch.threema.data.datatypes.NotificationTriggerPolicyOverride.MutedUntil","dbValue":1740396953761,""" +
@@ -695,7 +694,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectContactConversationCategoryUpdate() {
     fun testReflectContactConversationCategoryUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            expectedTaskClass = ReflectContactSyncUpdateTask.ReflectConversationCategoryUpdate::class.java,
+            expectedTaskClass = ReflectContactSyncUpdateTask.ReflectConversationCategoryUpdate::class,
             encodedTask = "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationCategoryUpdate" +
             encodedTask = "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationCategoryUpdate" +
                 ".ReflectContactConversationCategoryUpdateData\",\"contactIdentity\":\"01234567\",\"isPrivateChat\":true}",
                 ".ReflectContactConversationCategoryUpdateData\",\"contactIdentity\":\"01234567\",\"isPrivateChat\":true}",
         )
         )
@@ -705,7 +704,7 @@ class PersistableTasksTest {
     fun testReflectGroupConversationCategoryUpdate() {
     fun testReflectGroupConversationCategoryUpdate() {
         addTestData()
         addTestData()
         assertValidEncoding(
         assertValidEncoding(
-            expectedTaskClass = ReflectGroupSyncUpdateTask.ReflectGroupConversationCategoryUpdateTask::class.java,
+            expectedTaskClass = ReflectGroupSyncUpdateTask.ReflectGroupConversationCategoryUpdateTask::class,
             encodedTask = "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationCategoryUpdateTask" +
             encodedTask = "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationCategoryUpdateTask" +
                 ".ReflectGroupConversationCategoryData\",\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}" +
                 ".ReflectGroupConversationCategoryData\",\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}" +
                 "\"isPrivateChat\":true}",
                 "\"isPrivateChat\":true}",
@@ -715,7 +714,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectContactConversationVisibilityArchiveUpdate() {
     fun testReflectContactConversationVisibilityArchiveUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectConversationVisibilityArchiveUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectConversationVisibilityArchiveUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationVisibilityArchiveUpdate" +
             "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationVisibilityArchiveUpdate" +
                 ".ReflectConversationVisibilityArchiveUpdateData\",\"isArchived\":true,\"contactIdentity\":\"01234567\"}",
                 ".ReflectConversationVisibilityArchiveUpdateData\",\"isArchived\":true,\"contactIdentity\":\"01234567\"}",
         )
         )
@@ -725,7 +724,7 @@ class PersistableTasksTest {
     fun testReflectGroupConversationVisibilityArchiveUpdate() {
     fun testReflectGroupConversationVisibilityArchiveUpdate() {
         addTestData()
         addTestData()
         assertValidEncoding(
         assertValidEncoding(
-            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityArchiveUpdate::class.java,
+            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityArchiveUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityArchiveUpdate" +
             "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityArchiveUpdate" +
                 ".ReflectGroupConversationVisibilityArchiveUpdateData\",\"isArchived\":true," +
                 ".ReflectGroupConversationVisibilityArchiveUpdateData\",\"isArchived\":true," +
                 "\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}}",
                 "\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}}",
@@ -735,7 +734,7 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testReflectContactConversationVisibilityPinnedUpdate() {
     fun testReflectContactConversationVisibilityPinnedUpdate() {
         assertValidEncoding(
         assertValidEncoding(
-            ReflectContactSyncUpdateTask.ReflectConversationVisibilityPinnedUpdate::class.java,
+            ReflectContactSyncUpdateTask.ReflectConversationVisibilityPinnedUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationVisibilityPinnedUpdate" +
             "{\"type\":\"ch.threema.app.tasks.ReflectContactSyncUpdateTask.ReflectConversationVisibilityPinnedUpdate" +
                 ".ReflectConversationVisibilityPinnedUpdateData\",\"isPinned\":true,\"contactIdentity\":\"01234567\"}",
                 ".ReflectConversationVisibilityPinnedUpdateData\",\"isPinned\":true,\"contactIdentity\":\"01234567\"}",
         )
         )
@@ -745,17 +744,25 @@ class PersistableTasksTest {
     fun testReflectGroupConversationVisibilityPinnedUpdate() {
     fun testReflectGroupConversationVisibilityPinnedUpdate() {
         addTestData()
         addTestData()
         assertValidEncoding(
         assertValidEncoding(
-            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityPinnedUpdate::class.java,
+            ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityPinnedUpdate::class,
             "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityPinnedUpdate" +
             "{\"type\":\"ch.threema.app.tasks.ReflectGroupSyncUpdateTask.ReflectGroupConversationVisibilityPinnedUpdate" +
                 ".ReflectGroupConversationVisibilityPinnedUpdateData\",\"isPinned\":true," +
                 ".ReflectGroupConversationVisibilityPinnedUpdateData\",\"isPinned\":true," +
                 "\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}}",
                 "\"groupIdentity\":{\"creatorIdentity\":\"01234567\",\"groupId\":6361180283070237492}}",
         )
         )
     }
     }
 
 
+    @Test
+    fun testSyncFormerlyOrphanedGroupsTask() {
+        assertValidEncoding(
+            SyncFormerlyOrphanedGroupsTask::class,
+            """{"type":"ch.threema.app.tasks.SyncFormerlyOrphanedGroupsTask.SyncFormerlyOrphanedGroupsTaskData"}""",
+        )
+    }
+
     @Test
     @Test
     fun testDeactivateMultiDeviceTask() {
     fun testDeactivateMultiDeviceTask() {
         assertValidEncoding(
         assertValidEncoding(
-            expectedTaskClass = DeactivateMultiDeviceTask::class.java,
+            expectedTaskClass = DeactivateMultiDeviceTask::class,
             encodedTask = """{"type":"ch.threema.app.tasks.DeactivateMultiDeviceTask.DeactivateMultiDeviceTaskData"}""",
             encodedTask = """{"type":"ch.threema.app.tasks.DeactivateMultiDeviceTask.DeactivateMultiDeviceTaskData"}""",
         )
         )
     }
     }
@@ -763,11 +770,20 @@ class PersistableTasksTest {
     @Test
     @Test
     fun testDeactivateMultiDeviceIfAloneTask() {
     fun testDeactivateMultiDeviceIfAloneTask() {
         assertValidEncoding(
         assertValidEncoding(
-            expectedTaskClass = DeactivateMultiDeviceIfAloneTask::class.java,
+            expectedTaskClass = DeactivateMultiDeviceIfAloneTask::class,
             encodedTask = """{"type":"ch.threema.app.tasks.DeactivateMultiDeviceIfAloneTask.DeactivateMultiDeviceIfAloneTaskData"}""",
             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 {
     private fun addTestData() = runBlocking {
         val identity = "01234567"
         val identity = "01234567"
         if (serviceManager.modelRepositories.contacts.getByIdentity(identity) != null) {
         if (serviceManager.modelRepositories.contacts.getByIdentity(identity) != null) {
@@ -775,12 +791,17 @@ class PersistableTasksTest {
             return@runBlocking
             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(
         serviceManager.modelRepositories.contacts.createFromLocal(
             ContactModelData(
             ContactModelData(
                 identity = identity,
                 identity = identity,
-                publicKey = ByteArray(NaCl.PUBLICKEYBYTES),
+                publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES),
                 createdAt = Date(42),
                 createdAt = Date(42),
                 firstName = "0123",
                 firstName = "0123",
                 lastName = "4567",
                 lastName = "4567",
@@ -816,7 +837,7 @@ class PersistableTasksTest {
                 synchronizedAt = null,
                 synchronizedAt = null,
                 lastUpdate = null,
                 lastUpdate = null,
                 isArchived = false,
                 isArchived = false,
-                precomputedColorIndex = null,
+                precomputedIdColor = IdColor.invalid(),
                 groupDescription = null,
                 groupDescription = null,
                 groupDescriptionChangedAt = null,
                 groupDescriptionChangedAt = null,
                 otherMembers = setOf(identity),
                 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)
         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
     // Clear caches in services and trigger listeners to refresh the new models from database
     val contactService = serviceManager.contactService
     val contactService = serviceManager.contactService
-    val myIdentity = serviceManager.identityStore.identity
+    val myIdentity = serviceManager.identityStore.getIdentity()
     contactIdentities.forEach { identity ->
     contactIdentities.forEach { identity ->
         contactService.invalidateCache(identity)
         contactService.invalidateCache(identity)
         ListenerManager.contactListeners.handle { it.onRemoved(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.content.Context;
 import android.util.Log;
 import android.util.Log;
 
 
-import com.neilalexander.jnacl.NaCl;
+import ch.threema.base.crypto.NaCl;
 
 
 import java.util.Collection;
 import java.util.Collection;
 import java.util.Date;
 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.IdentityType;
 import ch.threema.domain.models.VerificationLevel;
 import ch.threema.domain.models.VerificationLevel;
 import ch.threema.domain.protocol.ThreemaFeature;
 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.ContactModel;
 import ch.threema.storage.models.GroupModel;
 import ch.threema.storage.models.GroupModel;
 
 
@@ -75,10 +75,10 @@ public class TestHelpers {
 
 
         public TestContact(@NonNull String identity) {
         public TestContact(@NonNull String identity) {
             this.identity = 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) {
         public TestContact(@NonNull String identity, @NonNull byte[] publicKey, @NonNull byte[] privateKey) {
@@ -98,7 +98,7 @@ public class TestHelpers {
         }
         }
 
 
         @NonNull
         @NonNull
-        public IdentityStoreInterface getIdentityStore() {
+        public IdentityStore getIdentityStore() {
             return new InMemoryIdentityStore(
             return new InMemoryIdentityStore(
                 this.identity,
                 this.identity,
                 "",
                 "",
@@ -256,8 +256,7 @@ public class TestHelpers {
 
 
         userService.restoreIdentity(
         userService.restoreIdentity(
             user.identity,
             user.identity,
-            user.privateKey,
-            user.publicKey
+            user.privateKey
         );
         );
     }
     }
 
 
@@ -276,8 +275,7 @@ public class TestHelpers {
         // Otherwise, create identity
         // Otherwise, create identity
         userService.restoreIdentity(
         userService.restoreIdentity(
             TEST_CONTACT.identity,
             TEST_CONTACT.identity,
-            TEST_CONTACT.privateKey,
-            TEST_CONTACT.publicKey
+            TEST_CONTACT.privateKey
         );
         );
         Log.i(TAG, "Test identity restored: " + TEST_CONTACT.identity);
         Log.i(TAG, "Test identity restored: " + TEST_CONTACT.identity);
         return 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 android.content.Context;
 
 
+import org.junit.Assert;
 import org.junit.Test;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runner.RunWith;
 
 
@@ -68,4 +69,24 @@ public class TextUtilTest {
         assertTrue(TextUtil.checkBadPassword(context, "apples123"));
         assertTrue(TextUtil.checkBadPassword(context, "apples123"));
         assertFalse(TextUtil.checkBadPassword(context, "kajsdlfkjalskdjflkajsdfl"));
         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(
 class TestDatabaseService : DatabaseService(
     context = ApplicationProvider.getApplicationContext(),
     context = ApplicationProvider.getApplicationContext(),
     databaseName = null,
     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.ThreemaApplication
 import ch.threema.app.testutils.TestHelpers
 import ch.threema.app.testutils.TestHelpers
 import ch.threema.app.utils.AppVersionProvider
 import ch.threema.app.utils.AppVersionProvider
+import ch.threema.base.crypto.NaCl
 import ch.threema.data.TestDatabaseService
 import ch.threema.data.TestDatabaseService
+import ch.threema.data.datatypes.IdColor
 import ch.threema.data.models.ContactModelData
 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.TransactionAckTaskCodec
 import ch.threema.domain.helpers.UnusedTaskCodec
 import ch.threema.domain.helpers.UnusedTaskCodec
 import ch.threema.domain.models.ContactSyncState
 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.TypingIndicatorPolicy
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.VerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
 import ch.threema.domain.models.WorkVerificationLevel
+import ch.threema.domain.types.Identity
 import ch.threema.storage.models.ContactModel
 import ch.threema.storage.models.ContactModel
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.storage.models.ContactModel.AcquaintanceLevel
 import ch.threema.testhelpers.nonSecureRandomArray
 import ch.threema.testhelpers.nonSecureRandomArray
 import ch.threema.testhelpers.randomIdentity
 import ch.threema.testhelpers.randomIdentity
-import com.neilalexander.jnacl.NaCl
 import java.util.Date
 import java.util.Date
 import junit.framework.TestCase.assertNotNull
 import junit.framework.TestCase.assertNotNull
 import kotlin.test.BeforeTest
 import kotlin.test.BeforeTest
@@ -78,10 +79,10 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
 
 
     companion object {
     companion object {
         @JvmStatic
         @JvmStatic
-        @Parameterized.Parameters()
+        @Parameterized.Parameters
         fun initialValuesSet() = setOf(
         fun initialValuesSet() = setOf(
             getInitialContactModelData(),
             getInitialContactModelData(),
-            getInitialContactModelData(publicKey = ByteArray(NaCl.PUBLICKEYBYTES) { it.toByte() }),
+            getInitialContactModelData(publicKey = ByteArray(NaCl.PUBLIC_KEY_BYTES) { it.toByte() }),
             getInitialContactModelData(createdAt = Date(42)),
             getInitialContactModelData(createdAt = Date(42)),
             getInitialContactModelData(identityType = IdentityType.WORK),
             getInitialContactModelData(identityType = IdentityType.WORK),
             getInitialContactModelData(acquaintanceLevel = AcquaintanceLevel.GROUP),
             getInitialContactModelData(acquaintanceLevel = AcquaintanceLevel.GROUP),
@@ -90,8 +91,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         )
         )
 
 
         private fun getInitialContactModelData(
         private fun getInitialContactModelData(
-            identity: String = "ABCDEFGH",
-            publicKey: ByteArray = ByteArray(NaCl.PUBLICKEYBYTES),
+            identity: Identity = "ABCDEFGH",
+            publicKey: ByteArray = ByteArray(NaCl.PUBLIC_KEY_BYTES),
             createdAt: Date = Date(),
             createdAt: Date = Date(),
             firstName: String = "",
             firstName: String = "",
             lastName: String = "",
             lastName: String = "",
@@ -118,7 +119,7 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
             firstName = firstName,
             firstName = firstName,
             lastName = lastName,
             lastName = lastName,
             nickname = nickname,
             nickname = nickname,
-            colorIndex = getIdColorIndex(identity),
+            idColor = IdColor.ofIdentity(identity),
             verificationLevel = verificationLevel,
             verificationLevel = verificationLevel,
             workVerificationLevel = workVerificationLevel,
             workVerificationLevel = workVerificationLevel,
             identityType = identityType,
             identityType = identityType,
@@ -141,8 +142,9 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
 
 
     @BeforeTest
     @BeforeTest
     fun before() {
     fun before() {
+        val serviceManager = ThreemaApplication.requireServiceManager()
         TestHelpers.setIdentity(
         TestHelpers.setIdentity(
-            ThreemaApplication.requireServiceManager(),
+            serviceManager,
             TestHelpers.TEST_CONTACT,
             TestHelpers.TEST_CONTACT,
         )
         )
 
 
@@ -151,7 +153,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         this.coreServiceManager = TestCoreServiceManager(
         this.coreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         )
         this.contactModelRepository = ModelRepositories(coreServiceManager).contacts
         this.contactModelRepository = ModelRepositories(coreServiceManager).contacts
@@ -162,7 +165,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         this.coreServiceManagerMd = TestCoreServiceManager(
         this.coreServiceManagerMd = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseServiceMd,
             databaseService = databaseServiceMd,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             multiDeviceManager = TestMultiDeviceManager(
             multiDeviceManager = TestMultiDeviceManager(
                 isMultiDeviceActive = true,
                 isMultiDeviceActive = true,
                 isMdDisabledOrSupportsFs = false,
                 isMdDisabledOrSupportsFs = false,
@@ -244,10 +248,10 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         val model = contactModelRepository.getByIdentity(identity)!!
         val model = contactModelRepository.getByIdentity(identity)!!
         val modelMd = contactModelRepositoryMd.getByIdentity(identity)!!
         val modelMd = contactModelRepositoryMd.getByIdentity(identity)!!
         assertEquals(model.identity, modelMd.identity)
         assertEquals(model.identity, modelMd.identity)
-        assertContentEquals(model.data.value, modelMd.data.value)
+        assertContentEquals(model.data, modelMd.data)
         assertTrue { model.identity == identity }
         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(
     private fun testCreateFromLocalOrRemote(
@@ -287,8 +291,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         val queriedModelMd = contactModelRepositoryMd.getByIdentity(contactModelData.identity)
         val queriedModelMd = contactModelRepositoryMd.getByIdentity(contactModelData.identity)
         assertEquals(newModelMd, queriedModelMd)
         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
         // Reset transaction count in case this test is run several times
         taskCodecMd.transactionBeginCount = 0
         taskCodecMd.transactionBeginCount = 0
@@ -348,8 +352,8 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         val queriedModelMd = contactModelRepositoryMd.getByIdentity(contactModelData.identity)
         val queriedModelMd = contactModelRepositoryMd.getByIdentity(contactModelData.identity)
         assertEquals(newModelMd, queriedModelMd)
         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
         // Insert for the second time and assert that an exception is thrown
         assertFailsWith<ContactStoreException> { runBlocking { runCreation() } }
         assertFailsWith<ContactStoreException> { runBlocking { runCreation() } }
@@ -378,7 +382,7 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         assertTrue(taskCodecMd.outboundMessages.isEmpty())
         assertTrue(taskCodecMd.outboundMessages.isEmpty())
 
 
         // Assert that the contact data has been inserted correctly
         // Assert that the contact data has been inserted correctly
-        val addedData = contactModel.data.value!!
+        val addedData = contactModel.data!!
         assertContentEquals(contactModelData, addedData)
         assertContentEquals(contactModelData, addedData)
 
 
         // Reset transaction count in case this test is run several times
         // 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())
         assertTrue(taskCodecMd.outboundMessages.isEmpty())
 
 
         // Assert that the contact data has been inserted correctly
         // Assert that the contact data has been inserted correctly
-        val addedData = contactModel.data.value!!
+        val addedData = contactModel.data!!
         assertContentEquals(contactModelData, addedData)
         assertContentEquals(contactModelData, addedData)
 
 
         // Assert that the contact data cannot be inserted again (as it already exists)
         // 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? =
         val model: ch.threema.data.models.ContactModel? =
             contactModelRepository.getByIdentity(identity)
             contactModelRepository.getByIdentity(identity)
         assertNotNull(model)
         assertNotNull(model)
-        assertEquals(null, model!!.data.value?.nickname)
+        assertEquals(null, model!!.data?.nickname)
         model.setNicknameFromSync("testnick")
         model.setNicknameFromSync("testnick")
-        assertEquals("testnick", model.data.value?.nickname)
+        assertEquals("testnick", model.data?.nickname)
     }
     }
 
 
     private fun assertContentEquals(expected: ContactModelData?, actual: ContactModelData?) {
     private fun assertContentEquals(expected: ContactModelData?, actual: ContactModelData?) {
@@ -455,7 +459,7 @@ class ContactModelRepositoryTest(private val contactModelData: ContactModelData)
         assertEquals(expected.firstName, actual.firstName)
         assertEquals(expected.firstName, actual.firstName)
         assertEquals(expected.lastName, actual.lastName)
         assertEquals(expected.lastName, actual.lastName)
         assertEquals(expected.nickname, actual.nickname)
         assertEquals(expected.nickname, actual.nickname)
-        assertEquals(expected.colorIndex, actual.colorIndex)
+        assertEquals(expected.idColor, actual.idColor)
         assertEquals(expected.verificationLevel, actual.verificationLevel)
         assertEquals(expected.verificationLevel, actual.verificationLevel)
         assertEquals(expected.workVerificationLevel, actual.workVerificationLevel)
         assertEquals(expected.workVerificationLevel, actual.workVerificationLevel)
         assertEquals(expected.identityType, actual.identityType)
         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()
         databaseService = TestDatabaseService()
+        val serviceManager = ThreemaApplication.requireServiceManager()
         val testCoreServiceManager = TestCoreServiceManager(
         val testCoreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         )
         editHistoryRepository = ModelRepositories(testCoreServiceManager).editHistory
         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.GroupMessageModel
 import ch.threema.storage.models.MessageModel
 import ch.threema.storage.models.MessageModel
 import ch.threema.storage.models.MessageType
 import ch.threema.storage.models.MessageType
-import java.util.Date
+import java.time.Instant
 import java.util.UUID
 import java.util.UUID
 import kotlin.test.BeforeTest
 import kotlin.test.BeforeTest
 import kotlin.test.Test
 import kotlin.test.Test
@@ -57,11 +57,13 @@ class EmojiReactionsRepositoryTest {
 
 
     @BeforeTest
     @BeforeTest
     fun before() {
     fun before() {
+        val serviceManager = ThreemaApplication.requireServiceManager()
         databaseService = TestDatabaseService()
         databaseService = TestDatabaseService()
         testCoreServiceManager = TestCoreServiceManager(
         testCoreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         )
 
 
@@ -139,7 +141,7 @@ class EmojiReactionsRepositoryTest {
         val reactions = emojiReactionsRepository.getReactionsByMessage(message)
         val reactions = emojiReactionsRepository.getReactionsByMessage(message)
         Assert.assertNotNull(reactions)
         Assert.assertNotNull(reactions)
 
 
-        val reaction = reactions!!.data.value!![0]
+        val reaction = reactions!!.data!![0]
         Assert.assertEquals("⚽", reaction.emojiSequence)
         Assert.assertEquals("⚽", reaction.emojiSequence)
 
 
         databaseService.messageModelFactory.delete(message)
         databaseService.messageModelFactory.delete(message)
@@ -170,9 +172,9 @@ class EmojiReactionsRepositoryTest {
         groupMessage.assertEmojiReactionSize(1)
         groupMessage.assertEmojiReactionSize(1)
 
 
         val contactReaction =
         val contactReaction =
-            emojiReactionsRepository.getReactionsByMessage(contactMessage)!!.data.value!![0]
+            emojiReactionsRepository.getReactionsByMessage(contactMessage)!!.data!![0]
         val groupReaction =
         val groupReaction =
-            emojiReactionsRepository.getReactionsByMessage(groupMessage)!!.data.value!![0]
+            emojiReactionsRepository.getReactionsByMessage(groupMessage)!!.data!![0]
 
 
         Assert.assertEquals("⚾", contactReaction.emojiSequence)
         Assert.assertEquals("⚾", contactReaction.emojiSequence)
         Assert.assertEquals("⛵", groupReaction.emojiSequence)
         Assert.assertEquals("⛵", groupReaction.emojiSequence)
@@ -241,14 +243,14 @@ class EmojiReactionsRepositoryTest {
             contactMessage.id,
             contactMessage.id,
             senderIdentity = "ABCD1234",
             senderIdentity = "ABCD1234",
             emojiSequence = "⛵",
             emojiSequence = "⛵",
-            reactedAt = Date(),
+            reactedAt = Instant.now(),
         )
         )
         val emojiReactionsModel = EmojiReactionsModel(
         val emojiReactionsModel = EmojiReactionsModel(
             data = listOf(emojiReactionData),
             data = listOf(emojiReactionData),
             coreServiceManager = testCoreServiceManager,
             coreServiceManager = testCoreServiceManager,
         )
         )
         cachedEntry = testEmojiCache.getOrCreate(reactionMessageIdentifier) { emojiReactionsModel }
         cachedEntry = testEmojiCache.getOrCreate(reactionMessageIdentifier) { emojiReactionsModel }
-        assertContentEquals(listOf(emojiReactionData), cachedEntry!!.data.value)
+        assertContentEquals(listOf(emojiReactionData), cachedEntry!!.data)
 
 
         // Test should read the cached value
         // Test should read the cached value
         testEmojiCache.getOrCreate(reactionMessageIdentifier) {
         testEmojiCache.getOrCreate(reactionMessageIdentifier) {
@@ -258,7 +260,7 @@ class EmojiReactionsRepositoryTest {
 
 
         // Test removing from cache
         // Test removing from cache
         val removedEmojiReactionsModel = testEmojiCache.remove(reactionMessageIdentifier)
         val removedEmojiReactionsModel = testEmojiCache.remove(reactionMessageIdentifier)
-        assertContentEquals(listOf(emojiReactionData), removedEmojiReactionsModel!!.data.value)
+        assertContentEquals(listOf(emojiReactionData), removedEmojiReactionsModel!!.data)
         assertNull(testEmojiCache.get(reactionMessageIdentifier))
         assertNull(testEmojiCache.get(reactionMessageIdentifier))
     }
     }
 
 
@@ -281,7 +283,7 @@ class EmojiReactionsRepositoryTest {
             messageId = contactMessageId,
             messageId = contactMessageId,
             senderIdentity = "ABCD1234",
             senderIdentity = "ABCD1234",
             emojiSequence = "⛵",
             emojiSequence = "⛵",
-            reactedAt = Date(),
+            reactedAt = Instant.now(),
         )
         )
         val emojiReactionsModelContact = EmojiReactionsModel(
         val emojiReactionsModelContact = EmojiReactionsModel(
             data = listOf(emojiReactionDataForContactMessage),
             data = listOf(emojiReactionDataForContactMessage),
@@ -293,7 +295,7 @@ class EmojiReactionsRepositoryTest {
 
 
         assertContentEquals(
         assertContentEquals(
             listOf(emojiReactionDataForContactMessage),
             listOf(emojiReactionDataForContactMessage),
-            cachedEntryContact!!.data.value,
+            cachedEntryContact!!.data,
         )
         )
         assertNull(testEmojiCache.get(reactionMessageIdentifierGroup))
         assertNull(testEmojiCache.get(reactionMessageIdentifierGroup))
 
 

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

@@ -57,7 +57,7 @@ class GroupModelRepositoryTest {
             synchronizedAt = Date(),
             synchronizedAt = Date(),
             lastUpdate = null,
             lastUpdate = null,
             isArchived = false,
             isArchived = false,
-            colorIndex = 0.toUByte(),
+            colorIndex = 0,
             groupDescription = "Description",
             groupDescription = "Description",
             groupDescriptionChangedAt = Date(),
             groupDescriptionChangedAt = Date(),
             members = setOf("AAAAAAAA", "BBBBBBBB"),
             members = setOf("AAAAAAAA", "BBBBBBBB"),
@@ -75,10 +75,12 @@ class GroupModelRepositoryTest {
 
 
         this.databaseService = TestDatabaseService()
         this.databaseService = TestDatabaseService()
         this.databaseBackend = SqliteDatabaseBackend(databaseService)
         this.databaseBackend = SqliteDatabaseBackend(databaseService)
+        val serviceManager = ThreemaApplication.requireServiceManager()
         this.coreServiceManager = TestCoreServiceManager(
         this.coreServiceManager = TestCoreServiceManager(
             version = AppVersionProvider.appVersion,
             version = AppVersionProvider.appVersion,
             databaseService = databaseService,
             databaseService = databaseService,
-            preferenceStore = ThreemaApplication.requireServiceManager().preferenceStore,
+            preferenceStore = serviceManager.preferenceStore,
+            encryptedPreferenceStore = serviceManager.encryptedPreferenceStore,
             taskManager = TestTaskManager(UnusedTaskCodec()),
             taskManager = TestTaskManager(UnusedTaskCodec()),
         )
         )
         this.groupModelRepository = ModelRepositories(coreServiceManager).groups
         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
         // This should work because the database is initially empty and the local group id starts
         // with 1.
         // with 1.
         val fetchedGroup = groupModelRepository.getByLocalGroupDbId(1)
         val fetchedGroup = groupModelRepository.getByLocalGroupDbId(1)
-        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data?.value)
+        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data)
     }
     }
 
 
     @Test
     @Test
@@ -155,7 +157,7 @@ class GroupModelRepositoryTest {
             groupIdentity.creatorIdentity,
             groupIdentity.creatorIdentity,
             GroupId(groupIdentity.groupId),
             GroupId(groupIdentity.groupId),
         )
         )
-        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data?.value)
+        assertEquals(GroupModelDataFactory.toDataType(testGroup), fetchedGroup?.data)
     }
     }
 
 
     @Test
     @Test
@@ -183,7 +185,7 @@ class GroupModelRepositoryTest {
         val defaultGroup = createTestDbGroup(groupIdentity)
         val defaultGroup = createTestDbGroup(groupIdentity)
         testInsertAndGet(groupIdentity, defaultGroup)
         testInsertAndGet(groupIdentity, defaultGroup)
 
 
-        val testData = groupModelRepository.getByGroupIdentity(groupIdentity)!!.data.value!!
+        val testData = groupModelRepository.getByGroupIdentity(groupIdentity)!!.data!!
         assertFailsWith<UnsupportedOperationException> {
         assertFailsWith<UnsupportedOperationException> {
             // Casting the set to a mutable set will work, but adding a new member to the set should
             // 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
             // 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)
         databaseBackend.createGroup(testGroup)
 
 
         val fetchedGroup = groupModelRepository.getByGroupIdentity(groupIdentity)
         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.Nonce
 import ch.threema.base.crypto.NonceScope
 import ch.threema.base.crypto.NonceScope
 import ch.threema.base.crypto.NonceStore
 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.Mac
 import javax.crypto.spec.SecretKeySpec
 import javax.crypto.spec.SecretKeySpec
 import kotlin.test.AfterTest
 import kotlin.test.AfterTest
@@ -235,8 +236,8 @@ fun hashNonce(nonce: Nonce): HashedNonce {
 
 
 const val USER_IDENTITY = "01234567"
 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(
     override fun encryptData(
         plaintext: ByteArray,
         plaintext: ByteArray,
@@ -262,9 +263,16 @@ private class TestIdentityStore : IdentityStoreInterface {
     override fun getPublicNickname(): String = throw UnsupportedOperationException()
     override fun getPublicNickname(): String = throw UnsupportedOperationException()
 
 
     override fun storeIdentity(
     override fun storeIdentity(
-        identity: String,
+        identity: Identity,
         serverGroup: String,
         serverGroup: String,
-        publicKey: ByteArray,
         privateKey: ByteArray,
         privateKey: ByteArray,
     ) = throw UnsupportedOperationException()
     ) = 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.fs.DHSessionId;
 import ch.threema.domain.helpers.DummyUsers;
 import ch.threema.domain.helpers.DummyUsers;
 import ch.threema.domain.helpers.UnusedTaskCodec;
 import ch.threema.domain.helpers.UnusedTaskCodec;
-import ch.threema.domain.protocol.csp.messages.BadMessageException;
 import ch.threema.domain.stores.DHSessionStoreException;
 import ch.threema.domain.stores.DHSessionStoreException;
 import ch.threema.domain.taskmanager.TaskCodec;
 import ch.threema.domain.taskmanager.TaskCodec;
 
 
 public class SQLDHSessionStoreTest {
 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 static final int NUM_RANDOM_RUNS = 20;
 
 
     private String tempDbFileName;
     private String tempDbFileName;
@@ -57,7 +56,7 @@ public class SQLDHSessionStoreTest {
         tempDbFileName = "threema-fs-test-" + System.currentTimeMillis() + ".db";
         tempDbFileName = "threema-fs-test-" + System.currentTimeMillis() + ".db";
         store = new SQLDHSessionStore(
         store = new SQLDHSessionStore(
             ApplicationProvider.getApplicationContext(),
             ApplicationProvider.getApplicationContext(),
-            DATABASE_KEY,
+            PASSWORD,
             tempDbFileName
             tempDbFileName
         );
         );
     }
     }
@@ -69,7 +68,7 @@ public class SQLDHSessionStoreTest {
         ApplicationProvider.getApplicationContext().deleteDatabase(tempDbFileName);
         ApplicationProvider.getApplicationContext().deleteDatabase(tempDbFileName);
     }
     }
 
 
-    public void createSessions() throws BadMessageException {
+    public void createSessions() throws Exception {
         // Alice is the initiator (= us)
         // Alice is the initiator (= us)
         this.initiatorDHSession = new DHSession(
         this.initiatorDHSession = new DHSession(
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getContactForUser(DummyUsers.BOB),
@@ -79,7 +78,7 @@ public class SQLDHSessionStoreTest {
         // Bob gets an init message from Alice with her ephemeral public key
         // Bob gets an init message from Alice with her ephemeral public key
         this.responderDHSession = new DHSession(
         this.responderDHSession = new DHSession(
             this.initiatorDHSession.getId(),
             this.initiatorDHSession.getId(),
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             this.initiatorDHSession.getMyEphemeralPublicKey(),
             this.initiatorDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.ALICE),
             DummyUsers.getContactForUser(DummyUsers.ALICE),
             DummyUsers.getIdentityStoreForUser(DummyUsers.BOB)
             DummyUsers.getIdentityStoreForUser(DummyUsers.BOB)
@@ -87,7 +86,7 @@ public class SQLDHSessionStoreTest {
     }
     }
 
 
     @Test
     @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
         // Assume that we are Alice = the initiator, and Bob is the responder
         createSessions();
         createSessions();
 
 
@@ -110,7 +109,7 @@ public class SQLDHSessionStoreTest {
 
 
         // Now Bob sends his ephemeral public key back to Alice
         // Now Bob sends his ephemeral public key back to Alice
         this.initiatorDHSession.processAccept(
         this.initiatorDHSession.processAccept(
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             this.responderDHSession.getMyEphemeralPublicKey(),
             this.responderDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)
@@ -132,7 +131,7 @@ public class SQLDHSessionStoreTest {
     }
     }
 
 
     @Test
     @Test
-    public void testStoreResponderSession() throws DHSessionStoreException, BadMessageException {
+    public void testStoreResponderSession() throws Exception {
         // Assume that we are Bob = the responder
         // Assume that we are Bob = the responder
         createSessions();
         createSessions();
 
 
@@ -157,7 +156,7 @@ public class SQLDHSessionStoreTest {
     }
     }
 
 
     @Test
     @Test
-    public void testDiscardRatchet() throws DHSessionStoreException, BadMessageException {
+    public void testDiscardRatchet() throws Exception {
         // Assume that we are Bob = the responder
         // Assume that we are Bob = the responder
         createSessions();
         createSessions();
 
 
@@ -186,7 +185,7 @@ public class SQLDHSessionStoreTest {
     }
     }
 
 
     @Test
     @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
         // Repeat the test several times, as random session IDs are involved
         for (int i = 0; i < NUM_RANDOM_RUNS; i++) {
         for (int i = 0; i < NUM_RANDOM_RUNS; i++) {
             if (i > 0) {
             if (i > 0) {
@@ -198,7 +197,7 @@ public class SQLDHSessionStoreTest {
     }
     }
 
 
     @Test
     @Test
-    public void testGetAllSessions() throws DHSessionStoreException {
+    public void testGetAllSessions() throws Exception {
         // Create sessions and its id's hashes
         // Create sessions and its id's hashes
         List<DHSession> dhSessions = new ArrayList<>();
         List<DHSession> dhSessions = new ArrayList<>();
         for (int i = 0; i < 5; i++) {
         for (int i = 0; i < 5; i++) {
@@ -230,7 +229,7 @@ public class SQLDHSessionStoreTest {
         MatcherAssert.assertThat(storedDHSessionIdHashes, Matchers.containsInAnyOrder(dhSessionIdHashes.toArray()));
         MatcherAssert.assertThat(storedDHSessionIdHashes, Matchers.containsInAnyOrder(dhSessionIdHashes.toArray()));
     }
     }
 
 
-    private void testRaceConditionOnce() throws DHSession.MissingEphemeralPrivateKeyException, DHSessionStoreException, BadMessageException {
+    private void testRaceConditionOnce() throws Exception, DHSessionStoreException {
         createSessions();
         createSessions();
 
 
         // Alice stores the session that she initiated (still in 2DH mode)
         // 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
         // Alice gets the Init for Bob's new session first and processes it
         DHSession raceResponderDHSession = new DHSession(
         DHSession raceResponderDHSession = new DHSession(
             raceInitiatorDHSession.getId(),
             raceInitiatorDHSession.getId(),
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             raceInitiatorDHSession.getMyEphemeralPublicKey(),
             raceInitiatorDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)
@@ -255,7 +254,7 @@ public class SQLDHSessionStoreTest {
 
 
         // Alice then processes the Accept from Bob and stores the session
         // Alice then processes the Accept from Bob and stores the session
         this.initiatorDHSession.processAccept(
         this.initiatorDHSession.processAccept(
-            DHSession.SUPPORTED_VERSION_RANGE,
+            DHSession.getSupportedVersionRange(),
             this.responderDHSession.getMyEphemeralPublicKey(),
             this.responderDHSession.getMyEphemeralPublicKey(),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getContactForUser(DummyUsers.BOB),
             DummyUsers.getIdentityStoreForUser(DummyUsers.ALICE)
             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
  * 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
  * 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,
  * 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/>.
  * 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.BeforeTest
 import kotlin.test.Test
 import kotlin.test.Test
@@ -27,7 +27,7 @@ import kotlin.test.assertFalse
 import kotlin.test.assertTrue
 import kotlin.test.assertTrue
 import net.zetetic.database.sqlcipher.SQLiteDatabase
 import net.zetetic.database.sqlcipher.SQLiteDatabase
 
 
-class DatabaseExtensionsTest {
+class DatabaseUpdateExtensionsTest {
     private var inMemoryDatabase: SQLiteDatabase = SQLiteDatabase.create(null)
     private var inMemoryDatabase: SQLiteDatabase = SQLiteDatabase.create(null)
 
 
     @BeforeTest
     @BeforeTest

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

@@ -1,11 +1,12 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
 <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
     android:id="@+id/top_view"
     android:id="@+id/top_view"
     android:layout_width="match_parent"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:layout_height="match_parent"
-    android:fillViewport="true"
-    android:background="@android:color/black">
+    android:background="@android:color/black"
+    android:fillViewport="true">
 
 
     <FrameLayout
     <FrameLayout
         android:layout_width="match_parent"
         android:layout_width="match_parent"
@@ -17,147 +18,166 @@
             android:layout_height="fill_parent"
             android:layout_height="fill_parent"
             android:adjustViewBounds="true"
             android:adjustViewBounds="true"
             android:clickable="false"
             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:id="@+id/layout_parent_top"
-            android:orientation="vertical"
             android:layout_width="fill_parent"
             android:layout_width="fill_parent"
             android:layout_height="wrap_content"
             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
             <TextView
-                style="@style/WizardMediumText"
                 android:id="@+id/layout_top"
                 android:id="@+id/layout_top"
-                android:layout_below="@id/enter_serial_welcome_title"
+                style="@style/WizardMediumText"
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/grid_unit_x4"
+                android:autoLink="web"
                 android:gravity="center_horizontal"
                 android:gravity="center_horizontal"
-                android:layout_centerHorizontal="true"
                 android:linksClickable="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:id="@+id/unlock_layout"
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 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
                 <ImageView
-                    style="@style/WizardEditTextIcon"
                     android:id="@+id/unlock_logo"
                     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" />
                     app:srcCompat="@drawable/ic_person_outline" />
 
 
                 <ch.threema.app.emojis.EmojiEditText
                 <ch.threema.app.emojis.EmojiEditText
+                    android:id="@+id/license_key"
                     style="@style/WizardEditText"
                     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:hint="@string/username_hint"
-                    android:id="@+id/license_key"
-                    android:inputType="textNoSuggestions"
                     android:imeOptions="actionNext"
                     android:imeOptions="actionNext"
+                    android:inputType="textNoSuggestions"
+                    android:minHeight="48dp"
                     android:nextFocusRight="@+id/password"
                     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 />
                     <requestFocus />
 
 
                 </ch.threema.app.emojis.EmojiEditText>
                 </ch.threema.app.emojis.EmojiEditText>
 
 
-            </LinearLayout>
+            </androidx.constraintlayout.widget.ConstraintLayout>
 
 
-            <LinearLayout
+            <androidx.constraintlayout.widget.ConstraintLayout
                 android:id="@+id/password_layout"
                 android:id="@+id/password_layout"
                 android:layout_width="match_parent"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 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
                 <ImageView
-                    style="@style/WizardEditTextIcon"
                     android:id="@+id/password_logo"
                     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" />
                     app:srcCompat="@drawable/ic_key_outline" />
 
 
                 <com.google.android.material.textfield.TextInputLayout
                 <com.google.android.material.textfield.TextInputLayout
                     android:id="@+id/password_container"
                     android:id="@+id/password_container"
-                    android:layout_width="match_parent"
+                    android:layout_width="0dp"
                     android:layout_height="wrap_content"
                     android:layout_height="wrap_content"
-                    app:hintAnimationEnabled="false"
+                    android:minHeight="48dp"
                     app:counterEnabled="false"
                     app:counterEnabled="false"
-                    app:hintEnabled="false"
-                    app:passwordToggleEnabled="true"
                     app:errorEnabled="false"
                     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
                     <ch.threema.app.ui.ThreemaTextInputEditText
+                        android:id="@+id/password"
                         style="@style/WizardEditText"
                         style="@style/WizardEditText"
                         android:layout_width="match_parent"
                         android:layout_width="match_parent"
-                        android:layout_height="@dimen/wizard_default_view_height"
+                        android:layout_height="wrap_content"
                         android:hint="@string/password_hint"
                         android:hint="@string/password_hint"
-                        android:id="@+id/password"
-                        android:inputType="textNoSuggestions|textPassword"
                         android:imeOptions="actionDone"
                         android:imeOptions="actionDone"
+                        android:inputType="textNoSuggestions|textPassword"
+                        android:minHeight="48dp"
                         android:singleLine="true" />
                         android:singleLine="true" />
 
 
                 </com.google.android.material.textfield.TextInputLayout>
                 </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
             <ch.threema.app.activities.wizard.components.WizardButtonXml
                 android:id="@+id/unlock_button_work_compose"
                 android:id="@+id/unlock_button_work_compose"
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"
                 android:layout_height="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
             <TextView
-                style="@style/WizardMediumText"
                 android:id="@+id/work_lost_credential_help"
                 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_height="wrap_content"
-                android:layout_below="@id/unlock_button_work_compose"
+                android:layout_marginTop="@dimen/grid_unit_x4"
                 android:gravity="center_horizontal"
                 android:gravity="center_horizontal"
-                android:layout_marginTop="32dp" />
+                tools:text="@string/work_lost_credentials_help" />
 
 
-        </RelativeLayout>
+        </LinearLayout>
 
 
     </FrameLayout>
     </FrameLayout>
 
 

部分文件因为文件数量过多而无法显示