From 21c379bf3d3030e19c22adc0e1642fb37822ca88 Mon Sep 17 00:00:00 2001 From: Maxwell Mapako Date: Tue, 20 Jun 2023 00:01:57 +0200 Subject: [PATCH] Refactor/update emoji data and cleanup (#113) * Apply auto formatting * Apply app module code style * Apply buildScr code style and exclude test sources from ktlint * Reformat and align with v5.1.1 of `emoji-java` See: https://github.com/vdurmont/emoji-java/releases/tag/v5.1.1 * Remove unused resources - Deletes duplicate `EmojiTransformer` - Removes unused complier flags * Add new emoji test data cases --- .editorconfig | 27 + .github/FUNDING.yml | 2 +- .github/ISSUE_TEMPLATE/bug-report.md | 11 +- .github/ISSUE_TEMPLATE/feature-request.md | 10 +- .github/ISSUE_TEMPLATE/question.md | 6 +- .github/PULL_REQUEST_TEMPLATE.md | 13 +- .github/release-drafter-config.yml | 2 +- .github/renovate.json | 12 +- .github/workflows/android-spotless.yml | 22 +- .github/workflows/android-test.yml | 46 +- .../first-time-contributer-greeting.yml | 12 +- .github/workflows/gradle-dokka.yml | 30 +- .../workflows/gradle-wrapper-validation.yml | 4 +- .github/workflows/release-drafter.yml | 6 +- .idea/misc.xml | 6 +- CODE_OF_CONDUCT.md | 36 +- CONTRIBUTING.md | 44 +- LICENSE.md | 118 +- README.md | 137 +- app/src/main/AndroidManifest.xml | 5 +- .../io/wax911/emojifysample/MainActivity.kt | 17 +- app/src/main/res/layout/activity_main.xml | 10 +- app/src/main/res/layout/content_main.xml | 52 +- buildSrc/build.gradle.kts | 4 +- .../emoji/buildSrc/plugin/CorePlugin.kt | 4 +- .../plugin/components/AndroidConfiguration.kt | 17 +- .../plugin/components/AndroidDependencies.kt | 6 +- .../plugin/components/AndroidOptions.kt | 14 +- .../plugin/components/AndroidPlugins.kt | 5 +- .../plugin/components/ProjectProperties.kt | 4 +- .../extensions/DependencyHandlerExtensions.kt | 32 +- .../plugin/extensions/ProjectExtensions.kt | 15 +- .../plugin/strategy/DependencyStrategy.kt | 5 +- emojify/build.gradle.kts | 11 +- emojify/src/main/AndroidManifest.xml | 3 +- emojify/src/main/assets/emoticons/emoji.json | 2 +- .../kotlin/io/wax911/emojify/EmojiManager.kt | 16 +- .../kotlin/io/wax911/emojify/model/Emoji.kt | 11 +- .../io/wax911/emojify/parser/EmojiParser.kt | 187 +- .../parser/candidate/AliasCandidate.kt | 20 +- .../parser/candidate/UnicodeCandidate.kt | 2 +- .../emojify/parser/common/EmojiTransformer.kt | 23 - .../parser/transformer/EmojiTransformer.kt | 2 +- .../io/wax911/emojify/util/EmojiTrie.kt | 48 +- .../io/wax911/emojify/util/Fitzpatrick.kt | 2 +- .../io/wax911/emojify/EmojiManagerTest.kt | 30 +- .../io/wax911/emojify/EmojiParseTest.kt | 332 +- .../kotlin/io/wax911/emojify/EmojiTest.kt | 126 + .../kotlin/io/wax911/emojify/EmojiUtilTest.kt | 119 +- .../io/wax911/emojify/core/emoji-test.txt | 3793 +++++++++++++++++ gradle.properties | 14 +- gradle/libs.versions.toml | 30 +- settings.gradle.kts | 4 +- 53 files changed, 4815 insertions(+), 694 deletions(-) create mode 100644 .editorconfig delete mode 100644 emojify/src/main/kotlin/io/wax911/emojify/parser/common/EmojiTransformer.kt create mode 100644 emojify/src/test/kotlin/io/wax911/emojify/EmojiTest.kt create mode 100644 emojify/src/test/resources/io/wax911/emojify/core/emoji-test.txt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 00000000..e115075d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,27 @@ +# https://editorconfig.org/ + +[*] +indent_style = space +indent_size = 2 + +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{java,kt,kts,xml}] +indent_size = 4 +max_line_length = 150 + +[*.{kt,kts}] +ij_kotlin_allow_trailing_comma = true +ij_kotlin_allow_trailing_comma_on_call_site = true + +# Don't allow any wildcard imports +ij_kotlin_packages_to_use_import_on_demand = unset + +[*.md] +trim_trailing_whitespace = false + +[*.toml] +indent_size = 1 diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index d192be30..9a4e0dbc 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: [wax911] +github: [ wax911 ] patreon: wax911 ko_fi: anitrend issuehunt: anitrend diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md index 39673a59..9f2868dc 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.md +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -6,24 +6,27 @@ labels: ["bug"] # AniTrend Issue Guidelines -Before opening a new issue, please take a moment to review our [**community guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) to make the contribution process easy and effective for everyone involved. +Before opening a new issue, please take a moment to review our [**community +guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) to make the +contribution process easy and effective for everyone involved. **You may find an answer in already closed issues**: https://github.com/AniTrend/android-emojify/issues?q=is%3Aissue+is%3Aclosed ## Description of Bug - + ## Reproduction Steps - + ## Screenshots/Videos - + ## Additional Context + + ## Solution Information + - ## Additional Context + I would like to know if... I have also searched in the closed issues and... ## Additional Context + I am currently using... diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 1a15f7ac..3125f31a 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,6 +1,7 @@ # AniTrend Pull Request -Thank you for contributing! Please take a moment to review our [**contributing guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) +Thank you for contributing! Please take a moment to review our [**contributing +guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) to make the process easy and effective for everyone involved. **Please open an issue** before embarking on any significant pull request, especially those that @@ -10,18 +11,21 @@ on something that might not end up being merged into the project. Before opening a pull request, please ensure you've done the following: -- You have followed our [**contributing guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) +- You have followed our [**contributing + guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) - Double checked that your branch is based on `develop` and targets `develop` (where applicable) - Pull request has tests (if applicable) - Documentation is updated (if necessary) - Description explains the issue/use-case resolved - ## Description + ## Types of changes + + - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [ ] Enhancement (Improves existing functionality) @@ -29,4 +33,5 @@ Before opening a pull request, please ensure you've done the following: **IMPORTANT**: By submitting a patch, you agree to allow the project -owners to license your work under the terms of the [Apache License 2.0](https://github.com/AniTrend/android-emojify/blob/develop/LICENSE.md). +owners to license your work under the terms of +the [Apache License 2.0](https://github.com/AniTrend/android-emojify/blob/develop/LICENSE.md). diff --git a/.github/release-drafter-config.yml b/.github/release-drafter-config.yml index 0243c559..a0c2b622 100644 --- a/.github/release-drafter-config.yml +++ b/.github/release-drafter-config.yml @@ -9,7 +9,7 @@ categories: labels: - 'bug fix' - title: '๐Ÿงฐ Maintenance' - labels: + labels: - 'refactor' - 'dependencies' autolabeler: diff --git a/.github/renovate.json b/.github/renovate.json index 9d6ea46b..9abde40d 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -3,7 +3,13 @@ "extends": [ "config:base" ], - "labels": ["dependencies"], - "baseBranches": ["develop"], - "schedule": ["every weekend"] + "labels": [ + "dependencies" + ], + "baseBranches": [ + "develop" + ], + "schedule": [ + "every weekend" + ] } diff --git a/.github/workflows/android-spotless.yml b/.github/workflows/android-spotless.yml index 8aa7f7b3..cb60f9eb 100644 --- a/.github/workflows/android-spotless.yml +++ b/.github/workflows/android-spotless.yml @@ -1,6 +1,6 @@ name: android-spotless -on: +on: push: branches: [ develop ] pull_request: @@ -11,14 +11,14 @@ jobs: spotless: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'adopt' + - uses: actions/checkout@v3 + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'adopt' - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Run spotless check - run: ./gradlew spotlessCheck + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run spotless check + run: ./gradlew spotlessCheck diff --git a/.github/workflows/android-test.yml b/.github/workflows/android-test.yml index aeb807df..1f7a4db0 100644 --- a/.github/workflows/android-test.yml +++ b/.github/workflows/android-test.yml @@ -1,6 +1,6 @@ name: android-test -on: +on: push: branches: [ develop ] pull_request: @@ -13,25 +13,25 @@ jobs: unit: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - uses: gradle/wrapper-validation-action@v1 - - name: set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'adopt' - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Run tests - run: | - ./gradlew emojify:preTest - ./gradlew emojify:test --stacktrace - ./gradlew emojify:postTest - - name: Publish Test Report - uses: mikepenz/action-junit-report@v3 - if: always() # always run even if the previous step fails - with: - report_paths: '**/build/test-results/test/TEST-*.xml' + - uses: actions/checkout@v3 + - uses: gradle/wrapper-validation-action@v1 + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'adopt' + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Run tests + run: | + ./gradlew emojify:preTest + ./gradlew emojify:test --stacktrace + ./gradlew emojify:postTest + - name: Publish Test Report + uses: mikepenz/action-junit-report@v3 + if: always() # always run even if the previous step fails + with: + report_paths: '**/build/test-results/**/TEST-*.xml' instrumented: runs-on: macos-latest @@ -56,4 +56,8 @@ jobs: script: ./gradlew connectedCheck env: API_LEVEL: ${{ matrix.api-level }} - + - name: Publish Integrated Test Report + uses: mikepenz/action-junit-report@v3 + if: always() # always run even if the previous step fails + with: + report_paths: '**/build/test-results/**/TEST-*.xml' diff --git a/.github/workflows/first-time-contributer-greeting.yml b/.github/workflows/first-time-contributer-greeting.yml index c2a541fa..5c5cde82 100644 --- a/.github/workflows/first-time-contributer-greeting.yml +++ b/.github/workflows/first-time-contributer-greeting.yml @@ -1,6 +1,6 @@ name: greeting-first-time-contributor -on: [pull_request_target, issues] +on: [ pull_request_target, issues ] jobs: greeting: @@ -9,8 +9,8 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/first-interaction@v1 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - issue-message: "Hey there! Thank you for creating an issue :) Please take a moment to review our [**community guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) to make the contribution process easy and effective for everyone involved." - pr-message: "Hey there! Thank you for this PR :) Please take a moment to review our [**community guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) to make the contribution process easy and effective for everyone involved." \ No newline at end of file + - uses: actions/first-interaction@v1 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + issue-message: "Hey there! Thank you for creating an issue :) Please take a moment to review our [**community guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) to make the contribution process easy and effective for everyone involved." + pr-message: "Hey there! Thank you for this PR :) Please take a moment to review our [**community guidelines**](https://github.com/AniTrend/android-emojify/blob/develop/CONTRIBUTING.md) to make the contribution process easy and effective for everyone involved." diff --git a/.github/workflows/gradle-dokka.yml b/.github/workflows/gradle-dokka.yml index ec99aa43..493af3a0 100644 --- a/.github/workflows/gradle-dokka.yml +++ b/.github/workflows/gradle-dokka.yml @@ -8,20 +8,20 @@ jobs: generate-and-deploy-docs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - name: set up JDK 17 - uses: actions/setup-java@v3 - with: - java-version: '17' - distribution: 'adopt' + - uses: actions/checkout@v3 + - name: set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'adopt' - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Generate docs with dokka - run: ./gradlew emojify:dokkaHtml + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Generate docs with dokka + run: ./gradlew emojify:dokkaHtml - - name: Deploy ๐Ÿš€ - uses: JamesIves/github-pages-deploy-action@v4.4.2 - with: - branch: docs # The branch the action should deploy to. - folder: emojify/build/docs/dokka # The folder the action should deploy. + - name: Deploy ๐Ÿš€ + uses: JamesIves/github-pages-deploy-action@v4.4.2 + with: + branch: docs # The branch the action should deploy to. + folder: emojify/build/docs/dokka # The folder the action should deploy. diff --git a/.github/workflows/gradle-wrapper-validation.yml b/.github/workflows/gradle-wrapper-validation.yml index 716f64b6..0cb7f45d 100644 --- a/.github/workflows/gradle-wrapper-validation.yml +++ b/.github/workflows/gradle-wrapper-validation.yml @@ -1,5 +1,5 @@ name: gradle-wrapper-validation -on: [push, pull_request] +on: [ push, pull_request ] jobs: validation: @@ -7,4 +7,4 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: gradle/wrapper-validation-action@v1 \ No newline at end of file + - uses: gradle/wrapper-validation-action@v1 diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index 3ff351bc..e7e50cea 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -3,14 +3,14 @@ name: release-drafter on: push: branches: - - 'develop' + - 'develop' pull_request: # Only following types are handled by the action, but one can default to all as well - types: [opened, reopened, synchronize] + types: [ opened, reopened, synchronize ] permissions: contents: read - + jobs: update-draft-release: permissions: diff --git a/.idea/misc.xml b/.idea/misc.xml index 5c5052a1..02a4a24d 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -4,7 +4,7 @@ diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index da555542..df3ea20e 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -2,7 +2,10 @@ ## Our Pledge -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. +In the interest of fostering an open and welcoming environment, we as contributors and maintainers +pledge to making participation in our project and our community a harassment-free experience for +everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level +of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ## Our Standards @@ -19,28 +22,45 @@ Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Publishing others' private information, such as a physical or electronic address, without explicit + permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Our Responsibilities -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. +Project maintainers are responsible for clarifying the standards of acceptable behavior and are +expected to take appropriate and fair corrective action in response to any instances of unacceptable +behavior. -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, +code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or +to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. ## Scope -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. +This Code of Conduct applies both within project spaces and in public spaces when an individual is +representing the project or its community. Examples of representing a project or community include +using an official project e-mail address, posting via an official social media account, or acting as +an appointed representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. ## Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at anitrendapp@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting +the project team at anitrendapp@gmail.com. The project team will review and investigate all +complaints, and will respond in a way that it deems appropriate to the circumstances. The project +team is obligated to maintain confidentiality with regard to the reporter of an incident. Further +details of specific enforcement policies may be posted separately. -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face +temporary or permanent repercussions as determined by other members of the project's leadership. ## Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available +at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org + [version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 004ca59a..76ddb5bc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,8 @@ # Contributing -When contributing to this repository, please first discuss the change you wish to make via issue, email, or any other method with the owners of this repository before making a change via a pull request. +When contributing to this repository, please first discuss the change you wish to make via issue, +email, or any other method with the owners of this repository before making a change via a pull +request. Please note we have a code of conduct, please follow it in all your interactions with the project. @@ -11,7 +13,9 @@ Please ensure your pull request adheres to the following guidelines: - Search previous suggestions for duplicates before making a new one. - Make an individual pull request for each suggestion or feature. - Use the following format: `- [Bookmark Title](link): Description.` -- Titles should be [capitalized](http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html). +- Titles should + be [capitalized](http://grammar.yourdictionary.com/capitalization/rules-for-capitalization-in-titles.html) + . - New categories or improvements to the existing categorization are welcome. - Be sure not to stage any files in excluded in .gitignore - Check your spelling and grammar. @@ -20,7 +24,10 @@ Please ensure your pull request adheres to the following guidelines: ### Our Pledge -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. +In the interest of fostering an open and welcoming environment, we as contributors and maintainers +pledge to making participation in our project and our community a harassment-free experience for +everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level +of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. ### Our Standards @@ -37,30 +44,47 @@ Examples of unacceptable behavior by participants include: * The use of sexualized language or imagery and unwelcome sexual attention or advances * Trolling, insulting/derogatory comments, and personal or political attacks * Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Publishing others' private information, such as a physical or electronic address, without explicit + permission * Other conduct which could reasonably be considered inappropriate in a professional setting ### Our Responsibilities -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. +Project maintainers are responsible for clarifying the standards of acceptable behavior and are +expected to take appropriate and fair corrective action in response to any instances of unacceptable +behavior. -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, +code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or +to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. ### Scope -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. +This Code of Conduct applies both within project spaces and in public spaces when an individual is +representing the project or its community. Examples of representing a project or community include +using an official project e-mail address, posting via an official social media account, or acting as +an appointed representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. ### Enforcement -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at anitrendapp@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting +the project team at anitrendapp@gmail.com. The project team will review and investigate all +complaints, and will respond in a way that it deems appropriate to the circumstances. The project +team is obligated to maintain confidentiality with regard to the reporter of an incident. Further +details of specific enforcement policies may be posted separately. -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face +temporary or permanent repercussions as determined by other members of the project's leadership. ### Attribution -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available +at [http://contributor-covenant.org/version/1/4][version] [homepage]: http://contributor-covenant.org + [version]: http://contributor-covenant.org/version/1/4/ diff --git a/LICENSE.md b/LICENSE.md index 5bacf079..5de187cc 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -64,32 +64,32 @@ on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the -Work and such Derivative Works in Source or Object form. + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -(except as stated in this section) patent license to make, have made, -use, offer to sell, sell, import, and otherwise transfer the Work, -where such license applies only to those patent claims licensable -by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) -with the Work to which such Contribution(s) was submitted. If You -institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work -or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses -granted to You under this License for that Work shall terminate -as of the date such litigation is filed. + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the -Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You -meet the following conditions: + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and @@ -128,50 +128,50 @@ reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the Work -by You to the Licensor shall be under the terms and conditions of -this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify -the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions. + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing the -origin of the Work and reproducing the content of the NOTICE file. + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or -agreed to in writing, Licensor provides the Work (and each -Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied, including, without limitation, any warranties or conditions -of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any -risks associated with Your exercise of permissions under this License. + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, -unless required by applicable law (such as deliberate and grossly -negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, -incidental, or consequential damages of any character arising as a -result of this License or out of the use or inability to use the -Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all -other commercial damages or losses), even if such Contributor -has been advised of the possibility of such damages. + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing -the Work or Derivative Works thereof, You may choose to offer, -and charge a fee for, acceptance of support, warranty, indemnity, -or other liability obligations and/or rights consistent with this -License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf -of any other Contributor, and only if You agree to indemnify, -defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason -of your accepting any such warranty or additional liability. + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS @@ -198,4 +198,4 @@ Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and -limitations under the License. \ No newline at end of file +limitations under the License. diff --git a/README.md b/README.md index d471e2e6..01646b27 100644 --- a/README.md +++ b/README.md @@ -2,32 +2,50 @@ [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2FAniTrend%2Fandroid-emojify.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2FAniTrend%2Fandroid-emojify?ref=badge_large) -This project is an android port of [vdurmont/emoji-java](https://github.com/vdurmont/emoji-java) which is a lightweight java library that helps you use Emojis in your java applications re-written in Kotlin, with some extra tweaks. +This project is an android port of [vdurmont/emoji-java](https://github.com/vdurmont/emoji-java) +which is a lightweight java library that helps you use Emojis in your java applications re-written +in Kotlin, with some extra tweaks. -**This project is already being used in [AniTrend](https://anitrend.co/) and only aims to provide emojis from [emojipedia](https://emojipedia.org/)** +**This project is already being used in [AniTrend](https://anitrend.co/) and only aims to provide +emojis from [emojipedia](https://emojipedia.org/)** -- All class and function documentation on the **emojify** module can be found [here](https://anitrend.github.io/android-emojify/) +- All class and function documentation on the **emojify** module can be + found [here](https://anitrend.github.io/android-emojify/) - All supported emojis can be found [here](./SUPPORTED.md) ## Known Issues -- Converting of html entities to emojis may not always display the emoji on a given android device if the target device does not have the suggested emoticons e.g. android 4.3 does not have some emoticons available in android 5.0+ +- Converting of html entities to emojis may not always display the emoji on a given android device + if the target device does not have the suggested emoticons e.g. android 4.3 does not have some + emoticons available in android 5.0+ ## Suggestions -- From v1.X the project was reworked and should be able to handle conversion from emoji to **hexHtml**, **decHtml** or short codes on the main thread with a slight improvement on processing speed (depending on the length of text of course), - however I would highly recommend moving all convention work to a background thread (consider [Coroutines - Kotlin](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html)) between network requests for a smoother experience for your users (read up on the repository pattern). -- If you are using a markdown library like [txtmark](https://github.com/rjeschke/txtmark), [markwon]([GitHub - noties/Markwon: Android markdown library (no WebView)](https://github.com/noties/Markwon)) or using just `Html.fromHtml()` you can skip the conversion of __HexHtml__ & __HtmlCodes__ to emoji and just pass the returned [Spanned](https://developer.android.com/reference/android/text/Spanned.html) from whichever framework you're using. (See sample in project) +- From v1.X the project was reworked and should be able to handle conversion from emoji to ** + hexHtml**, **decHtml** or short codes on the main thread with a slight improvement on processing + speed (depending on the length of text of course), + however I would highly recommend moving all convention work to a background thread ( + consider [Coroutines - Kotlin](https://kotlinlang.org/docs/reference/coroutines/coroutines-guide.html)) + between network requests for a smoother experience for your users (read up on the repository + pattern). +- If you are using a markdown library like [txtmark](https://github.com/rjeschke/txtmark) + , [markwon]([GitHub - noties/Markwon: Android markdown library (no WebView)](https://github.com/noties/Markwon)) + or using just `Html.fromHtml()` you can skip the conversion of __HexHtml__ & __HtmlCodes__ to + emoji and just pass the + returned [Spanned](https://developer.android.com/reference/android/text/Spanned.html) from + whichever framework you're using. (See sample in project) ## Migration ### From v0.x.x - v1.x.x -A quick run overview of some of the changes, see the rest of the changes under __Examples__ section. `EmojiManager.initEmojiData` has also been refactored -to throw exceptions rather than consuming them. +A quick run overview of some of the changes, see the rest of the changes under __Examples__ +section. `EmojiManager.initEmojiData` has also been refactored +to throw exceptions rather than consuming them. -> See the __Getting Started__ section, and you can find more example in the library unit tests, e.g. `EmojiUtilTest.kt` +> See the __Getting Started__ section, and you can find more example in the library unit tests, +> e.g. `EmojiUtilTest.kt` ```java import io.wax911.emojify.EmojiUtils; //becomes -> io.wax911.emojify.parser.EmojiParser; @@ -38,9 +56,10 @@ EmojiUtils.hexHtmlify(); //becomes -> EmojiParser.parseToHtmlHexadecimal(); EmojiUtils.shortCodify(); //becomes -> EmojiParser.parseToAliases(); ``` -> Starting v1.X conversion is only possible from `emoji -> hexHtml, decHtml or shortCodes` and `hexHtml, decHtml or shortCodes -> emoji` +> Starting v1.X conversion is only possible from `emoji -> hexHtml, decHtml or shortCodes` +> and `hexHtml, decHtml or shortCodes -> emoji` > unlike in previous versions where you could convert hexHtml to decHtml or shortCodes & vice-versa. -> +> > ``` > . > โ”œโ”€โ”€ io @@ -55,22 +74,29 @@ EmojiUtils.shortCodify(); //becomes -> EmojiParser.parseToAliases(); > โ”‚ย ย  โ”œโ”€โ”€ EmojiTrie.kt > โ”‚ย ย  โ””โ”€โ”€ Fitzpatrick.kt > ``` -> +> > __N.B Package names have been changed and would require refactoring, except for `EmojiManager`__ -### +### ### From v1.x.x - v1.6.0 -Starting from **v1.6.0** the project has had some parts rewritten, specifically `EmojiParser`, `EmojiManager` and added support for **[androidx.startup](https://developer.android.com/topic/libraries/app-startup#kotlin)** please take the time to read the short description on what this does. +Starting from **v1.6.0** the project has had some parts rewritten, specifically `EmojiParser` +, `EmojiManager` and added support +for **[androidx.startup](https://developer.android.com/topic/libraries/app-startup#kotlin)** please +take the time to read the short description on what this does. -> __See [CHANGELOG.md](./CHANGELOG.md) for a detailed list of changes__ +> __See [CHANGELOG.md](./CHANGELOG.md) for a detailed list of changes__ #### Summary of changes -- `EmojiManager` has been converted from an `object` to a class with the following signature: `class EmojiManager(val emojiList: Collection)`. This has been done to allow **you** to use your own emoji list and no longer required to explicitly initialize anything as previously with a call to `EmojiManager.initEmojiData` -- `EmojiParser` has been converted to a set of extension function that are applied on the `EmojiManager` see examples below: - +- `EmojiManager` has been converted from an `object` to a class with the following + signature: `class EmojiManager(val emojiList: Collection)`. This has been done to allow ** + you** to use your own emoji list and no longer required to explicitly initialize anything as + previously with a call to `EmojiManager.initEmojiData` +- `EmojiParser` has been converted to a set of extension function that are applied on + the `EmojiManager` see examples below: + ```kotlin // getting our emoji manager from our application class through an extension function // see ./app/src/main/java/io/wax911/emojifysample/App.kt @@ -82,6 +108,7 @@ Starting from **v1.6.0** the project has had some parts rewritten, specifically ``` ##### New project structure + > ```sh > . > โ””โ”€โ”€ io @@ -112,16 +139,17 @@ Starting from **v1.6.0** the project has had some parts rewritten, specifically > โ”œโ”€โ”€ Matches.kt > โ””โ”€โ”€ Node.kt > ``` -> __N.B `EmojiManger` has been converted to class, thus an instance needs to be obtained from `EmojiInitializer` through [androidx.startup](https://developer.android.com/topic/libraries/app-startup#disable-individual#kotlin) or manually create an instance of the class on your own__. - - +> __N.B `EmojiManger` has been converted to class, thus an instance needs to be obtained +from `EmojiInitializer` +through [androidx.startup](https://developer.android.com/topic/libraries/app-startup#disable-individual#kotlin) +or manually create an instance of the class on your own__. ## Use Case -Trying to get emoji support in your application in a way that is both compatible with a browser and mobile, you might even be trying to create a github client with reaction support? Then this library is for you, your backend stores is the html entities or aliases in text and this library will take care of everything for you. - - - +Trying to get emoji support in your application in a way that is both compatible with a browser and +mobile, you might even be trying to create a github client with reaction support? Then this library +is for you, your backend stores is the html entities or aliases in text and this library will take +care of everything for you. ## Getting Started @@ -146,7 +174,8 @@ dependencies { ### Step 3. Create an application class in your android project and add: -Don't know how to do that?? Take a look at the [application class example](./app/src/main/java/io/wax911/emojifysample/App.kt) +Don't know how to do that?? Take a look at +the [application class example](./app/src/main/java/io/wax911/emojifysample/App.kt) ```kotlin class App : Application() { @@ -168,8 +197,6 @@ class App : Application() { - - ## Examples: ### EmojiManager @@ -200,11 +227,13 @@ An `Emoji` is a data class, which provides the following methods: * `htmlDec` an html decimal representation of the emoji * `htmlHex` an html decimal representation of the emoji * `supportsFitzpatrick` true if the emoji supports the Fitzpatrick modifiers, else false -* `getUnicode(fitzpatrick: Fitzpatrick?): String` Returns the unicode representation of the emoji associated with the provided Fitzpatrick modifier. +* `getUnicode(fitzpatrick: Fitzpatrick?): String` Returns the unicode representation of the emoji + associated with the provided Fitzpatrick modifier. ### Fitzpatrick modifiers -Some emojis now support the use of Fitzpatrick modifiers that gives the choice between 5 shades of skin tones: +Some emojis now support the use of Fitzpatrick modifiers that gives the choice between 5 shades of +skin tones: | Modifier | Type | |:--------:| -------- | @@ -228,11 +257,12 @@ A few examples: :santa|type_6: ``` -### +### ### EmojiParser -Is a set of extension methods to act on `EmojiManager`, so given an instance of `EmojiManger` we can achieve the following: +Is a set of extension methods to act on `EmojiManager`, so given an instance of `EmojiManger` we can +achieve the following: ```kotlin val emojiManager: EmojiManger = ... @@ -240,7 +270,8 @@ val emojiManager: EmojiManger = ... #### To unicode -To replace all the aliases and the html representations found in a string by their unicode, use `EmojiParser#parseToUnicode(String)`. +To replace all the aliases and the html representations found in a string by their unicode, +use `EmojiParser#parseToUnicode(String)`. For example: @@ -252,7 +283,8 @@ val result = emojiManager.parseToUnicode(str) #### To aliases -To replace all the emoji's unicodes found in a string by their aliases, use `EmojiParser#parseToAliases(String)`. +To replace all the emoji's unicodes found in a string by their aliases, +use `EmojiParser#parseToAliases(String)`. For example: @@ -262,7 +294,9 @@ val result = emojiManager.parseToAliases(str) // "An :grinning:awesome :smiley:string with a few :wink:emojis!" ``` -By default, the aliases will parse and include any Fitzpatrick modifier that would be provided. If you want to remove or ignore the Fitzpatrick modifiers, use `EmojiParser#parseToAliases(String, FitzpatrickAction)`. Examples: +By default, the aliases will parse and include any Fitzpatrick modifier that would be provided. If +you want to remove or ignore the Fitzpatrick modifiers, +use `EmojiParser#parseToAliases(String, FitzpatrickAction)`. Examples: ```kotlin val str = "Here is a boy: \uD83D\uDC66\uD83C\uDFFF!" @@ -276,7 +310,8 @@ emojiManager.parseToAliases(str, FitzpatrickAction.IGNORE) #### To html -To replace all the emoji's unicodes found in a string by their html representation, use `EmojiParser#parseToHtmlDecimal(String)` or `EmojiParser#parseToHtmlHexadecimal(String)`. +To replace all the emoji's unicodes found in a string by their html representation, +use `EmojiParser#parseToHtmlDecimal(String)` or `EmojiParser#parseToHtmlHexadecimal(String)`. For example: @@ -291,7 +326,8 @@ val resultHexadecimal = emojiManager.parseToHtmlHexadecimal(str) // "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring with a few ๐Ÿ˜‰emojis!" ``` -By default, any Fitzpatrick modifier will be removed. If you want to ignore the Fitzpatrick modifiers, use `emojiManager.parseToAliases(String, FitzpatrickAction)`. Examples: +By default, any Fitzpatrick modifier will be removed. If you want to ignore the Fitzpatrick +modifiers, use `emojiManager.parseToAliases(String, FitzpatrickAction)`. Examples: ```kotlin val str = "Here is a boy: \uD83D\uDC66\uD83C\uDFFF!" @@ -303,15 +339,18 @@ emojiManager.parseToHtmlDecimal(str, FitzpatrickAction.IGNORE) // Returns: "Here is a boy: ๐Ÿ‘ฆ๐Ÿฟ!" ``` -The same applies for the methods `emojiManager.parseToHtmlHexadecimal(String)` and `emojiManager.parseToHtmlHexadecimal(String, FitzpatrickAction)`. +The same applies for the methods `emojiManager.parseToHtmlHexadecimal(String)` +and `emojiManager.parseToHtmlHexadecimal(String, FitzpatrickAction)`. #### Remove emojis You can easily remove emojis from a string using one of the following methods: * `emojiManager.removeAllEmojis(String)`: removes all the emojis from the String -* `emojiManager.removeAllEmojisExcept(String, Collection)`: removes all the emojis from the String, except the ones in the Collection -* `emojiManager.removeEmojis(String, Collection)`: removes the emojis in the Collection from the String +* `emojiManager.removeAllEmojisExcept(String, Collection)`: removes all the emojis from the + String, except the ones in the Collection +* `emojiManager.removeEmojis(String, Collection)`: removes the emojis in the Collection from + the String For example: @@ -332,17 +371,19 @@ emojiManager.removeEmojis(str, collection); #### Extract Emojis from a string -You can search a string of mixed emoji/non-emoji characters and have all of the emoji characters returned as a Collection. +You can search a string of mixed emoji/non-emoji characters and have all of the emoji characters +returned as a Collection. -* `emojiManager.extractEmojis(String)`: returns all emojis as a Collection. This will include duplicates if emojis are present more than once. +* `emojiManager.extractEmojis(String)`: returns all emojis as a Collection. This will include + duplicates if emojis are present more than once. -## +## ## Credits -**emoji-java** originally used the data provided by the [github/gemoji project](https://github.com/github/gemoji). It is still based on it but has evolved since. - - +**emoji-java** originally used the data provided by +the [github/gemoji project](https://github.com/github/gemoji). It is still based on it but has +evolved since. # License @@ -360,4 +401,4 @@ distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -``` \ No newline at end of file +``` diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 3d123c10..ebadac45 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -10,7 +10,8 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> - @@ -19,4 +20,4 @@ - \ No newline at end of file + diff --git a/app/src/main/java/io/wax911/emojifysample/MainActivity.kt b/app/src/main/java/io/wax911/emojifysample/MainActivity.kt index ab77317c..44c62db0 100644 --- a/app/src/main/java/io/wax911/emojifysample/MainActivity.kt +++ b/app/src/main/java/io/wax911/emojifysample/MainActivity.kt @@ -1,14 +1,16 @@ package io.wax911.emojifysample import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.AppCompatEditText import android.text.Editable import android.text.Spanned import android.text.SpannedString import android.view.View import android.widget.Toast -import io.wax911.emojify.parser.* +import androidx.appcompat.app.AppCompatActivity +import io.wax911.emojify.parser.parseToAliases +import io.wax911.emojify.parser.parseToHtmlDecimal +import io.wax911.emojify.parser.parseToHtmlHexadecimal +import io.wax911.emojify.parser.parseToUnicode import io.wax911.emojifysample.databinding.ActivityMainBinding import io.wax911.emojifysample.ext.emojiManager @@ -43,12 +45,17 @@ class MainActivity : AppCompatActivity(), View.OnClickListener { // alternatively you could convert your hexHtml to emoji by using Html.fromHtml() //e.g. convertedText = Html.fromHtml(EmojiParser.parseToHtmlHexadecimal(textContent.toString())); convertedText = SpannedString(emojiManager().parseToUnicode(textContent.toString())) + R.id.toHtml -> // alternatively you could convert your hexHtml to emoji by using Html.fromHtml() //e.g. convertedText = Html.fromHtml(EmojiParser.parseToHtmlDecimal(textContent.toString())); - convertedText = SpannedString(emojiManager().parseToHtmlDecimal(textContent.toString())) + convertedText = + SpannedString(emojiManager().parseToHtmlDecimal(textContent.toString())) + R.id.toHexHtml -> - convertedText = SpannedString(emojiManager().parseToHtmlHexadecimal(textContent.toString())) + convertedText = + SpannedString(emojiManager().parseToHtmlHexadecimal(textContent.toString())) + R.id.toShortCode -> convertedText = SpannedString(emojiManager().parseToAliases(textContent.toString())) } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 577b8071..ada497f7 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,12 +1,12 @@ - - + - \ No newline at end of file + diff --git a/app/src/main/res/layout/content_main.xml b/app/src/main/res/layout/content_main.xml index d7326692..323ef805 100644 --- a/app/src/main/res/layout/content_main.xml +++ b/app/src/main/res/layout/content_main.xml @@ -2,24 +2,24 @@ + android:orientation="vertical" + app:layout_behavior="@string/appbar_scrolling_view_behavior" + tools:showIn="@layout/activity_main"> + android:padding="10dp" + android:textSize="14sp" /> + android:layout_height="wrap_content" + android:orientation="horizontal"> + android:textStyle="bold" /> + android:textStyle="bold" /> + android:textStyle="bold" /> + android:textStyle="bold" /> @@ -97,4 +97,4 @@ android:layout_height="0.6dp" android:background="@color/colorPrimaryDark" /> - \ No newline at end of file + diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index e5fece51..b847afd6 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -1,5 +1,3 @@ -import org.gradle.accessors.dm.LibrariesForLibs - plugins { `kotlin-dsl` `maven-publish` @@ -39,4 +37,4 @@ dependencies { /** Work around to include ../.gradle/LibrariesForLibs generated file for version catalog */ implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location)) -} \ No newline at end of file +} diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/CorePlugin.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/CorePlugin.kt index 9f696038..c7536e34 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/CorePlugin.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/CorePlugin.kt @@ -1,10 +1,10 @@ package io.wax911.emoji.buildSrc.plugin import io.wax911.emoji.buildSrc.plugin.components.configureAndroid -import io.wax911.emoji.buildSrc.plugin.components.configureSpotless import io.wax911.emoji.buildSrc.plugin.components.configureDependencies import io.wax911.emoji.buildSrc.plugin.components.configureOptions import io.wax911.emoji.buildSrc.plugin.components.configurePlugins +import io.wax911.emoji.buildSrc.plugin.components.configureSpotless import org.gradle.api.Plugin import org.gradle.api.Project @@ -41,4 +41,4 @@ open class CorePlugin : Plugin { project.availableExtensions() project.availableComponents() } -} \ No newline at end of file +} diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt index 8278d3de..401a44f6 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidConfiguration.kt @@ -2,9 +2,6 @@ package io.wax911.emoji.buildSrc.plugin.components import com.android.build.gradle.internal.dsl.DefaultConfig import io.wax911.emoji.buildSrc.plugin.extensions.* -import io.wax911.emoji.buildSrc.plugin.extensions.baseAppExtension -import io.wax911.emoji.buildSrc.plugin.extensions.baseExtension -import io.wax911.emoji.buildSrc.plugin.extensions.spotlessExtension import org.gradle.api.JavaVersion import org.gradle.api.Project import org.jetbrains.kotlin.gradle.dsl.KotlinCompile @@ -16,9 +13,9 @@ internal fun Project.configureSpotless() { spotlessExtension().run { kotlin { target("**/kotlin/**/*.kt") - targetExclude("$buildDir/**/*.kt", "bin/**/*.kt") + targetExclude("$buildDir/**/*.kt", "**/test/**/*.kt", "bin/**/*.kt") ktlint(libs.versions.ktlint.get()).userData( - mapOf("android" to "true") + mapOf("android" to "true"), ) licenseHeaderFile(rootProject.file("spotless/copyright.kt")) } @@ -42,8 +39,7 @@ private fun DefaultConfig.applyAdditionalConfiguration(project: Project) { } println("Applying vector drawables configuration for module -> ${project.path}") vectorDrawables.useSupportLibrary = true - } - else + } else consumerProguardFiles.add(File("consumer-rules.pro")) } @@ -79,7 +75,7 @@ internal fun Project.configureAndroid(): Unit = baseExtension().run { sourceSets { map { androidSourceSet -> androidSourceSet.java.srcDir( - "src/${androidSourceSet.name}/kotlin" + "src/${androidSourceSet.name}/kotlin", ) } } @@ -108,11 +104,10 @@ internal fun Project.configureAndroid(): Unit = baseExtension().run { allWarningsAsErrors = false kotlinOptions { allWarningsAsErrors = false - val compileArgs = mutableListOf("-opt-in=kotlin.Experimental") + val compileArgs = mutableListOf() if (isSampleModule()) { compileArgs.add("-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi") compileArgs.add("-opt-in=kotlinx.coroutines.FlowPreview") - compileArgs.add("-opt-in=kotlin.Experimental") } else compileArgs.add("-opt-in=kotlinx.serialization.ExperimentalSerializationApi") // Filter out modules that won't be using coroutines @@ -120,4 +115,4 @@ internal fun Project.configureAndroid(): Unit = baseExtension().run { } } } -} \ No newline at end of file +} diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidDependencies.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidDependencies.kt index cdd95c22..faa10c67 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidDependencies.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidDependencies.kt @@ -1,7 +1,7 @@ package io.wax911.emoji.buildSrc.plugin.components -import io.wax911.emoji.buildSrc.plugin.strategy.DependencyStrategy import io.wax911.emoji.buildSrc.plugin.extensions.implementation +import io.wax911.emoji.buildSrc.plugin.strategy.DependencyStrategy import org.gradle.api.Project internal fun Project.configureDependencies() { @@ -9,7 +9,7 @@ internal fun Project.configureDependencies() { dependencies.implementation( fileTree("libs") { include("*.jar") - } + }, ) dependencyStrategy.applyDependenciesOn(dependencies) -} \ No newline at end of file +} diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt index bde20c51..007f0739 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidOptions.kt @@ -1,17 +1,17 @@ package io.wax911.emoji.buildSrc.plugin.components -import org.gradle.api.Project -import org.gradle.api.tasks.bundling.Jar -import org.gradle.kotlin.dsl.get -import org.jetbrains.dokka.gradle.DokkaTask import io.wax911.emoji.buildSrc.plugin.extensions.baseExtension -import io.wax911.emoji.buildSrc.plugin.extensions.publishingExtension -import io.wax911.emoji.buildSrc.plugin.extensions.props import io.wax911.emoji.buildSrc.plugin.extensions.isLibraryModule +import io.wax911.emoji.buildSrc.plugin.extensions.props +import io.wax911.emoji.buildSrc.plugin.extensions.publishingExtension +import org.gradle.api.Project import org.gradle.api.publish.maven.MavenPublication +import org.gradle.api.tasks.bundling.Jar +import org.gradle.kotlin.dsl.get import org.gradle.kotlin.dsl.getValue import org.gradle.kotlin.dsl.invoke import org.gradle.kotlin.dsl.named +import org.jetbrains.dokka.gradle.DokkaTask import java.net.URL private fun Project.createMavenPublicationUsing(sourcesJar: Jar) { @@ -171,4 +171,4 @@ internal fun Project.configureOptions() { createMavenPublicationUsing(sourcesJar) } -} \ No newline at end of file +} diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidPlugins.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidPlugins.kt index 2b3cdd28..dadef7c7 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidPlugins.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/AndroidPlugins.kt @@ -9,12 +9,11 @@ private fun Project.applyModulePlugin() { plugins.apply("org.jetbrains.dokka") plugins.apply("com.diffplug.spotless") plugins.apply("maven-publish") - } - else + } else plugins.apply("com.android.application") } internal fun Project.configurePlugins() { applyModulePlugin() plugins.apply("kotlin-android") -} \ No newline at end of file +} diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/ProjectProperties.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/ProjectProperties.kt index 9b6f4159..ac77ad2d 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/ProjectProperties.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/components/ProjectProperties.kt @@ -2,7 +2,7 @@ package io.wax911.emoji.buildSrc.plugin.components import org.gradle.api.Project import java.io.File -import java.util.* +import java.util.Properties enum class PropertyTypes(val key: String) { @@ -28,4 +28,4 @@ class PropertiesReader(project: Project) { return properties.getProperty(type.key) ?: throw IllegalStateException("$type properties were not initialized") } -} \ No newline at end of file +} diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/DependencyHandlerExtensions.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/DependencyHandlerExtensions.kt index 563de030..11203b12 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/DependencyHandlerExtensions.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/DependencyHandlerExtensions.kt @@ -30,7 +30,7 @@ private enum class DependencyType(val configurationName: String) { private inline fun DependencyHandler.add( configuration: String, dependency: T, - dependencyConfiguration: T.() -> Unit + dependencyConfiguration: T.() -> Unit, ): T = dependency.apply { dependencyConfiguration() add(configuration, this) @@ -48,11 +48,11 @@ private inline fun DependencyHandler.add( private inline fun DependencyHandler.add( configuration: String, dependencyNotation: String, - dependencyConfiguration: ExternalModuleDependency.() -> Unit + dependencyConfiguration: ExternalModuleDependency.() -> Unit, ): Dependency = add( configuration, create(dependencyNotation) as ExternalModuleDependency, - dependencyConfiguration + dependencyConfiguration, ) @@ -85,13 +85,13 @@ fun T.exclude(group: String? = null, module: String? = nu private fun DependencyHandler.addDependency( dependencyNotation: Any, dependencyType: DependencyType, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = when (dependencyConfiguration) { null -> add(dependencyType.configurationName, dependencyNotation) else -> add( configuration = dependencyType.configurationName, dependencyNotation = dependencyNotation.toString(), - dependencyConfiguration = dependencyConfiguration + dependencyConfiguration = dependencyConfiguration, ) } @@ -105,7 +105,7 @@ private fun DependencyHandler.addDependency( */ internal fun DependencyHandler.kapt( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.KAPT, dependencyConfiguration) /** @@ -118,7 +118,7 @@ internal fun DependencyHandler.kapt( */ internal fun DependencyHandler.api( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.API, dependencyConfiguration) /** @@ -131,7 +131,7 @@ internal fun DependencyHandler.api( */ internal fun DependencyHandler.compile( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.COMPILE, dependencyConfiguration) /** @@ -144,7 +144,7 @@ internal fun DependencyHandler.compile( */ internal fun DependencyHandler.debug( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.DEBUG, dependencyConfiguration) /** @@ -157,7 +157,7 @@ internal fun DependencyHandler.debug( */ internal fun DependencyHandler.implementation( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.IMPLEMENTATION, dependencyConfiguration) /** @@ -170,7 +170,7 @@ internal fun DependencyHandler.implementation( */ internal fun DependencyHandler.debugImplementation( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.DEBUG_IMPLEMENTATION, dependencyConfiguration) /** @@ -183,7 +183,7 @@ internal fun DependencyHandler.debugImplementation( */ internal fun DependencyHandler.releaseImplementation( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.RELEASE_IMPLEMENTATION, dependencyConfiguration) /** @@ -196,7 +196,7 @@ internal fun DependencyHandler.releaseImplementation( */ internal fun DependencyHandler.runtime( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.RUNTIME, dependencyConfiguration) /** @@ -209,7 +209,7 @@ internal fun DependencyHandler.runtime( */ internal fun DependencyHandler.testImplementation( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, ) = addDependency(dependencyNotation, DependencyType.TEST, dependencyConfiguration) /** @@ -222,5 +222,5 @@ internal fun DependencyHandler.testImplementation( */ internal fun DependencyHandler.androidTestImplementation( dependencyNotation: Any, - dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null -) = addDependency(dependencyNotation, DependencyType.ANDROID_TEST, dependencyConfiguration) \ No newline at end of file + dependencyConfiguration: (ExternalModuleDependency.() -> Unit)? = null, +) = addDependency(dependencyNotation, DependencyType.ANDROID_TEST, dependencyConfiguration) diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/ProjectExtensions.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/ProjectExtensions.kt index 45fcc507..11b2b742 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/ProjectExtensions.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/extensions/ProjectExtensions.kt @@ -1,10 +1,13 @@ package io.wax911.emoji.buildSrc.plugin.extensions -import org.gradle.api.Project import com.android.build.gradle.BaseExtension import com.android.build.gradle.LibraryExtension import com.android.build.gradle.internal.dsl.BaseAppModuleExtension import com.diffplug.gradle.spotless.SpotlessExtension +import io.wax911.emoji.buildSrc.module.Modules +import io.wax911.emoji.buildSrc.plugin.components.PropertiesReader +import org.gradle.accessors.dm.LibrariesForLibs +import org.gradle.api.Project import org.gradle.api.internal.plugins.DefaultArtifactPublicationSet import org.gradle.api.plugins.ExtraPropertiesExtension import org.gradle.api.plugins.JavaPluginExtension @@ -12,11 +15,8 @@ import org.gradle.api.publish.PublishingExtension import org.gradle.api.reporting.ReportingExtension import org.gradle.api.tasks.SourceSetContainer import org.gradle.kotlin.dsl.getByType -import org.gradle.accessors.dm.LibrariesForLibs import org.jetbrains.kotlin.gradle.dsl.KotlinAndroidProjectExtension import org.jetbrains.kotlin.gradle.testing.internal.KotlinTestsRegistry -import io.wax911.emoji.buildSrc.module.Modules -import io.wax911.emoji.buildSrc.plugin.components.PropertiesReader fun Project.isSampleModule() = name == Modules.App.Sample.id @@ -24,8 +24,9 @@ fun Project.isSampleModule() = fun Project.isLibraryModule() = name == Modules.Library.Emojify.id -internal val Project.libs: LibrariesForLibs get() = - extensions.getByType() +internal val Project.libs: LibrariesForLibs + get() = + extensions.getByType() internal val Project.props: PropertiesReader get() = PropertiesReader(this) @@ -67,4 +68,4 @@ internal fun Project.publishingExtension() = extensions.getByType() internal fun Project.spotlessExtension() = - extensions.getByType() \ No newline at end of file + extensions.getByType() diff --git a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/strategy/DependencyStrategy.kt b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/strategy/DependencyStrategy.kt index bab560b3..4fd4cf3e 100644 --- a/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/strategy/DependencyStrategy.kt +++ b/buildSrc/src/main/java/io/wax911/emoji/buildSrc/plugin/strategy/DependencyStrategy.kt @@ -1,8 +1,9 @@ package io.wax911.emoji.buildSrc.plugin.strategy -import io.wax911.emoji.buildSrc.plugin.extensions.* import io.wax911.emoji.buildSrc.plugin.extensions.androidTestImplementation import io.wax911.emoji.buildSrc.plugin.extensions.implementation +import io.wax911.emoji.buildSrc.plugin.extensions.isSampleModule +import io.wax911.emoji.buildSrc.plugin.extensions.libs import io.wax911.emoji.buildSrc.plugin.extensions.testImplementation import org.gradle.api.Project import org.gradle.api.artifacts.dsl.DependencyHandler @@ -52,4 +53,4 @@ internal class DependencyStrategy(private val project: Project) { handler.applyCoroutinesDependencies() } } -} \ No newline at end of file +} diff --git a/emojify/build.gradle.kts b/emojify/build.gradle.kts index bf6ea9f4..731fdfb9 100644 --- a/emojify/build.gradle.kts +++ b/emojify/build.gradle.kts @@ -1,6 +1,3 @@ -import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.Delete - plugins { id("io.wax911.emojify") id("kotlinx-serialization") @@ -22,7 +19,9 @@ tasks.register("preTest") { } tasks.register("postTest") { - delete(fileTree("src/test/resources/io/wax911/emojify/core/") { - include("emoji.json") - }) + delete( + fileTree("src/test/resources/io/wax911/emojify/core/") { + include("emoji.json") + }, + ) } diff --git a/emojify/src/main/AndroidManifest.xml b/emojify/src/main/AndroidManifest.xml index e932e7e9..eecb3684 100644 --- a/emojify/src/main/AndroidManifest.xml +++ b/emojify/src/main/AndroidManifest.xml @@ -7,7 +7,8 @@ android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> - diff --git a/emojify/src/main/assets/emoticons/emoji.json b/emojify/src/main/assets/emoticons/emoji.json index 860d1e5e..f17abedc 100644 --- a/emojify/src/main/assets/emoticons/emoji.json +++ b/emojify/src/main/assets/emoticons/emoji.json @@ -16803,4 +16803,4 @@ "zimbabwe" ] } -] \ No newline at end of file +] diff --git a/emojify/src/main/kotlin/io/wax911/emojify/EmojiManager.kt b/emojify/src/main/kotlin/io/wax911/emojify/EmojiManager.kt index f97c11b6..6a2c8a53 100644 --- a/emojify/src/main/kotlin/io/wax911/emojify/EmojiManager.kt +++ b/emojify/src/main/kotlin/io/wax911/emojify/EmojiManager.kt @@ -19,7 +19,7 @@ package io.wax911.emojify import androidx.annotation.VisibleForTesting import io.wax911.emojify.manager.IEmojiManager import io.wax911.emojify.model.Emoji -import io.wax911.emojify.parser.getNextUnicodeCandidate +import io.wax911.emojify.parser.nextUnicodeCandidate import io.wax911.emojify.parser.removeAllEmojis import io.wax911.emojify.util.EmojiTrie import io.wax911.emojify.util.trie.Matches @@ -58,7 +58,7 @@ class EmojiManager( emojiTagMap } - private val emojiTrie: EmojiTrie by lazy { + internal val emojiTrie: EmojiTrie by lazy { EmojiTrie(emojiList) } @@ -83,7 +83,13 @@ class EmojiManager( alias?.let { emojiByAlias[trimAlias(it)] } @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - fun trimAlias(alias: String): String = alias.trim { it == ':' } + fun trimAlias(alias: String): String { + val len = alias.length + return alias.substring( + if (alias.first() == ':') 1 else 0, + if (alias.last() == ':') len - 1 else len, + ) + } /** * Returns the [Emoji] for a given unicode. @@ -93,7 +99,7 @@ class EmojiManager( * @return the associated [Emoji], null if the unicode is unknown */ override fun getByUnicode(unicode: String?): Emoji? = - unicode?.let { emojiTrie.getEmoji(it) } + unicode?.let { emojiTrie.getEmoji(it.toCharArray()) } /** * Tests if a given String is an emoji. @@ -105,7 +111,7 @@ class EmojiManager( override fun isEmoji(string: String?): Boolean { if (string == null) return false - val unicodeCandidate = getNextUnicodeCandidate(string.toCharArray(), 0) + val unicodeCandidate = nextUnicodeCandidate(string.toCharArray(), 0) return unicodeCandidate != null && unicodeCandidate.emojiStartIndex == 0 && unicodeCandidate.fitzpatrickEndIndex == string.length diff --git a/emojify/src/main/kotlin/io/wax911/emojify/model/Emoji.kt b/emojify/src/main/kotlin/io/wax911/emojify/model/Emoji.kt index 6326991f..91dd7458 100644 --- a/emojify/src/main/kotlin/io/wax911/emojify/model/Emoji.kt +++ b/emojify/src/main/kotlin/io/wax911/emojify/model/Emoji.kt @@ -19,6 +19,7 @@ package io.wax911.emojify.model import io.wax911.emojify.util.Fitzpatrick import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import java.io.UnsupportedEncodingException import java.nio.charset.Charset /** @@ -51,7 +52,13 @@ data class Emoji( runCatching { /** Upon init, we initialize optional properties: [unicode], [htmlDec] and [htmlHex] */ initializeProperties() - }.onFailure { it.printStackTrace() } + }.onFailure { + if (it is UnsupportedEncodingException) { + throw RuntimeException(it) + } else { + it.printStackTrace() + } + } } @Throws(Exception::class) @@ -93,7 +100,7 @@ data class Emoji( if (!supportsFitzpatrick) { throw UnsupportedOperationException( """ - Cannot get the unicode with a fitzpatrick modifier, + Cannot get the unicode with a fitzpatrick modifier, the emoji doesn't support fitzpatrick. """.trimIndent(), ) diff --git a/emojify/src/main/kotlin/io/wax911/emojify/parser/EmojiParser.kt b/emojify/src/main/kotlin/io/wax911/emojify/parser/EmojiParser.kt index bb069492..528b9733 100644 --- a/emojify/src/main/kotlin/io/wax911/emojify/parser/EmojiParser.kt +++ b/emojify/src/main/kotlin/io/wax911/emojify/parser/EmojiParser.kt @@ -22,11 +22,7 @@ import io.wax911.emojify.parser.action.FitzpatrickAction import io.wax911.emojify.parser.candidate.AliasCandidate import io.wax911.emojify.parser.candidate.UnicodeCandidate import io.wax911.emojify.parser.transformer.EmojiTransformer -import java.util.regex.Pattern - -private val ALIAS_CANDIDATE_PATTERN = Pattern.compile( - "(?<=:)\\+?(\\w|\\||\\-)+(?=:)", -) +import io.wax911.emojify.util.Fitzpatrick /** * Replaces the emoji's unicode occurrences by one of their alias @@ -64,7 +60,7 @@ fun EmojiManager.parseToAliases( fitzpatrickAction: FitzpatrickAction = FitzpatrickAction.PARSE, ): String { val emojiTransformer = object : EmojiTransformer { - override fun transform(unicodeCandidate: UnicodeCandidate): String { + override fun invoke(unicodeCandidate: UnicodeCandidate): String { val alias = unicodeCandidate.emoji?.aliases?.get(0) val fitzpatrickType = unicodeCandidate.fitzpatrickType val fitzpatrickUnicode = unicodeCandidate.fitzpatrickUnicode @@ -76,6 +72,7 @@ fun EmojiManager.parseToAliases( ":$alias:" } } + FitzpatrickAction.REMOVE -> return ":$alias:" FitzpatrickAction.IGNORE -> return ":$alias:$fitzpatrickUnicode" else -> { @@ -101,9 +98,7 @@ fun EmojiManager.parseToAliases( */ fun EmojiManager.replaceAllEmojis(str: String, replacementString: String): String { val emojiTransformer = object : EmojiTransformer { - override fun transform(unicodeCandidate: UnicodeCandidate): String { - return replacementString - } + override fun invoke(unicodeCandidate: UnicodeCandidate) = replacementString } return parseFromUnicode(str, emojiTransformer) @@ -125,53 +120,100 @@ fun EmojiManager.replaceAllEmojis(str: String, replacementString: String): Strin * their unicode. */ fun EmojiManager.parseToUnicode(input: String): String { - // Get all the potential aliases - val candidates = getAliasCandidates(input) - - // Replace the aliases by their unicode - var result = input - for (candidate in candidates) { - getForAlias(candidate.alias)?.apply { - if (supportsFitzpatrick || !supportsFitzpatrick && candidate.fitzpatrick == null) { - var replacement = unicode - if (candidate.fitzpatrick != null) { - replacement += candidate.fitzpatrick.unicode - } - result = result.replace(":${candidate.fullString}:", replacement) + val sb = StringBuilder(input.length) + + var last = 0 + while (last < input.length) { + var alias: AliasCandidate? = aliasCandidateAt(input, last) + if (alias == null) { + alias = htmlEncodedEmojiAt(input, last) + } + + if (alias != null) { + sb.append(alias.emoji.unicode) + last = alias.endIndex + + if (alias.fitzpatrick != null) { + sb.append(alias.fitzpatrick!!.unicode) } + } else { + sb.append(input[last]) } + last++ } - // Replace the html - for (emoji in emojiList) { - result = result.replace(emoji.htmlHex, emoji.unicode) - result = result.replace(emoji.htmlDec, emoji.unicode) + return sb.toString() +} + +internal fun EmojiManager.aliasCandidateAt(input: String, start: Int): AliasCandidate? { + if (input.length < start + 2 || input[start] != ':') return null; // Aliases start with : + val aliasEnd: Int = input.indexOf(':', start + 2) // Alias must be at least 1 char in length + if (aliasEnd == -1) return null // No alias end found + + val fitzpatrickStart: Int = input.indexOf('|', start + 2) + if (fitzpatrickStart != -1 && fitzpatrickStart < aliasEnd) { + val emoji = getForAlias(input.substring(start, fitzpatrickStart)) ?: return null // Not a valid alias + if (!emoji.supportsFitzpatrick) return null // Fitzpatrick was specified, but the emoji does not support it + val fitzpatrick = + Fitzpatrick.fitzpatrickFromType(input.substring(fitzpatrickStart + 1, aliasEnd)) + return AliasCandidate(emoji, fitzpatrick, start, aliasEnd) } - return result + val emoji = getForAlias(input.substring(start, aliasEnd)) ?: return null // Not a valid alias + + return AliasCandidate( + emoji = emoji, + fitzpatrick = null, + startIndex = start, + endIndex = aliasEnd, + ) } -internal fun getAliasCandidates(input: String): List { - val candidates = ArrayList() +internal fun EmojiManager.htmlEncodedEmojiAt(input: String, start: Int): AliasCandidate? { + if (input.length < start + 4 || input[start] != '&' || input[start + 1] != '#') return null - var matcher = ALIAS_CANDIDATE_PATTERN.matcher(input) - matcher = matcher.useTransparentBounds(true) - while (matcher.find()) { - val match = matcher.group() - if (!match.contains("|")) { - candidates.add(AliasCandidate(match, match, null)) - } else { - val splits = match.split("\\|".toRegex()) - .dropLastWhile { it.isEmpty() } - .toTypedArray() - if (splits.size == 2 || splits.size > 2) { - candidates.add(AliasCandidate(match, splits.first(), splits[1])) - } else { - candidates.add(AliasCandidate(match, match, null)) - } + var longestEmoji: Emoji? = null + var longestCodePointEnd = -1 + val chars = CharArray(emojiTrie.maxDepth) + var charsIndex = 0 + var codePointStart = start + do { + val codePointEnd = + input.indexOf(';', codePointStart + 3) // Code point must be at least 1 char in length + if (codePointEnd == -1) break + + try { + val radix = if (input[codePointStart + 2] == 'x') 16 else 10 + val codePoint = + input.substring(codePointStart + 2 + radix / 16, codePointEnd).toInt(radix) + charsIndex += Character.toChars(codePoint, chars, charsIndex) + } catch (e: NumberFormatException) { + break + } catch (e: IllegalArgumentException) { + break } - } - return candidates + val foundEmoji = emojiTrie.getEmoji(chars, 0, charsIndex) + if (foundEmoji != null) { + longestEmoji = foundEmoji + longestCodePointEnd = codePointEnd + } + codePointStart = codePointEnd + 1 + } while ( + input.length > codePointStart + 4 && + input[codePointStart] == '&' && + input[codePointStart + 1] == '#' && + charsIndex < chars.size && + !emojiTrie.isEmoji(chars, 0, charsIndex).impossibleMatch() + ) + + if (longestEmoji == null) return null + + return AliasCandidate( + emoji = longestEmoji, + fitzpatrick = null, + startIndex = start, + endIndex = longestCodePointEnd, + ) } /** @@ -203,12 +245,13 @@ fun EmojiManager.parseToHtmlDecimal( fitzpatrickAction: FitzpatrickAction = FitzpatrickAction.PARSE, ): String { val emojiTransformer = object : EmojiTransformer { - override fun transform(unicodeCandidate: UnicodeCandidate): String? { + override fun invoke(unicodeCandidate: UnicodeCandidate): String? { return when (fitzpatrickAction) { FitzpatrickAction.PARSE, FitzpatrickAction.REMOVE, -> unicodeCandidate.emoji?.htmlDec + FitzpatrickAction.IGNORE -> unicodeCandidate.emoji?.htmlDec + unicodeCandidate.fitzpatrickUnicode } @@ -244,14 +287,15 @@ fun EmojiManager.parseToHtmlDecimal( fun EmojiManager.parseToHtmlHexadecimal( input: String, fitzpatrickAction: FitzpatrickAction = FitzpatrickAction.PARSE, -): String? { +): String { val emojiTransformer = object : EmojiTransformer { - override fun transform(unicodeCandidate: UnicodeCandidate): String? { + override fun invoke(unicodeCandidate: UnicodeCandidate): String? { return when (fitzpatrickAction) { FitzpatrickAction.PARSE, FitzpatrickAction.REMOVE, -> unicodeCandidate.emoji?.htmlHex + FitzpatrickAction.IGNORE -> unicodeCandidate.emoji?.htmlHex + unicodeCandidate.fitzpatrickUnicode } @@ -270,9 +314,7 @@ fun EmojiManager.parseToHtmlHexadecimal( */ fun EmojiManager.removeAllEmojis(str: String): String { val emojiTransformer = object : EmojiTransformer { - override fun transform(unicodeCandidate: UnicodeCandidate): String { - return "" - } + override fun invoke(unicodeCandidate: UnicodeCandidate) = "" } return parseFromUnicode(str, emojiTransformer) @@ -288,7 +330,7 @@ fun EmojiManager.removeAllEmojis(str: String): String { */ fun EmojiManager.removeEmojis(str: String, emojisToRemove: Collection): String { val emojiTransformer = object : EmojiTransformer { - override fun transform(unicodeCandidate: UnicodeCandidate): String { + override fun invoke(unicodeCandidate: UnicodeCandidate): String { return if (!emojisToRemove.contains(unicodeCandidate.emoji)) { unicodeCandidate.emoji?.unicode + unicodeCandidate.fitzpatrickUnicode } else { @@ -310,7 +352,7 @@ fun EmojiManager.removeEmojis(str: String, emojisToRemove: Collection): S */ fun EmojiManager.removeAllEmojisExcept(str: String, emojisToKeep: Collection): String { val emojiTransformer = object : EmojiTransformer { - override fun transform(unicodeCandidate: UnicodeCandidate): String { + override fun invoke(unicodeCandidate: UnicodeCandidate): String { return if (emojisToKeep.contains(unicodeCandidate.emoji)) { unicodeCandidate.emoji?.unicode + unicodeCandidate.fitzpatrickUnicode } else { @@ -333,12 +375,12 @@ fun EmojiManager.removeAllEmojisExcept(str: String, emojisToKeep: Collection { - val emojis = getUnicodeCandidates(input) - val result = ArrayList() - for (emoji in emojis) { - emoji.emoji?.also { - result.add(it.unicode) + return unicodeCandidates(input) + .mapNotNull { unicodeCandidate -> + val emoji = unicodeCandidate.emoji + if (emoji?.supportsFitzpatrick == true && unicodeCandidate.hasFitzpatrick()) { + emoji.getUnicode(unicodeCandidate.fitzpatrick) + } else { + emoji?.unicode + } } - } - return result } /** @@ -367,13 +410,13 @@ fun EmojiManager.extractEmojis(input: String): List { * @param input String to find all unicode emojis in * @return List of UnicodeCandidates for each unicode emote in text */ -internal fun EmojiManager.getUnicodeCandidates(input: String): List { +internal fun EmojiManager.unicodeCandidates(input: String): List { val inputCharArray = input.toCharArray() val candidates = ArrayList() var next: UnicodeCandidate? var i = 0 do { - next = getNextUnicodeCandidate(inputCharArray, i)?.apply { + next = nextUnicodeCandidate(inputCharArray, i)?.apply { candidates.add(this) i = fitzpatrickEndIndex } @@ -389,21 +432,21 @@ internal fun EmojiManager.getUnicodeCandidates(input: String): List) { private val root = Node() + var maxDepth = 0 + init { + var maximumDepth = 0 emojis.forEach { emoji -> var tree: Node? = root - emoji.unicode.toCharArray().forEach { c -> + val chars = emoji.unicode.toCharArray() + maximumDepth = maximumDepth.coerceAtLeast(chars.size) + chars.forEach { c -> if (tree?.hasChild(c) == false) { tree?.addChild(c) } @@ -34,6 +39,7 @@ class EmojiTrie(emojis: Collection) { } tree?.emoji = emoji } + maxDepth = maximumDepth } /** @@ -47,17 +53,29 @@ class EmojiTrie(emojis: Collection) { * - [Matches.POSSIBLY] if char sequence matches prefix of an emoji * - [Matches.IMPOSSIBLE] if char sequence matches no emoji or prefix of an emoji */ - fun isEmoji(sequence: CharArray?): Matches { + @Throws(ArrayIndexOutOfBoundsException::class) + @JvmOverloads + fun isEmoji( + sequence: CharArray?, + start: Int = 0, + end: Int = sequence?.size ?: 0, + ): Matches { if (sequence == null) { return Matches.POSSIBLY } + if (start < 0 || start > end || end > sequence.size) { + throw ArrayIndexOutOfBoundsException( + "start " + start + ", end " + end + ", length " + sequence.size, + ) + } + var tree: Node? = root - sequence.forEach { c -> - if (tree?.hasChild(c) == false) { + for (index in start until end) { + if (tree?.hasChild(sequence[index]) == false) { return Matches.IMPOSSIBLE } - tree = tree?.getChild(c) + tree = tree?.getChild(sequence[index]) } return if (tree?.isEndOfEmoji == true) { @@ -74,13 +92,25 @@ class EmojiTrie(emojis: Collection) { * * @return Emoji instance if unicode matches and emoji, null otherwise. */ - fun getEmoji(unicode: String): Emoji? { + @Throws(ArrayIndexOutOfBoundsException::class) + @JvmOverloads + fun getEmoji( + unicode: CharArray, + start: Int = 0, + end: Int = unicode.size, + ): Emoji? { + if (start < 0 || start > end || end > unicode.size) { + throw ArrayIndexOutOfBoundsException( + "start " + start + ", end " + end + ", length " + unicode.size, + ) + } + var tree: Node? = root - unicode.toCharArray().forEach { c -> - if (tree?.hasChild(c) == false) { + for (index in start until end) { + if (tree?.hasChild(unicode[index]) == false) { return null } - tree = tree?.getChild(c) + tree = tree?.getChild(unicode[index]) } return tree?.emoji } diff --git a/emojify/src/main/kotlin/io/wax911/emojify/util/Fitzpatrick.kt b/emojify/src/main/kotlin/io/wax911/emojify/util/Fitzpatrick.kt index f86e14b4..20a3b7e1 100644 --- a/emojify/src/main/kotlin/io/wax911/emojify/util/Fitzpatrick.kt +++ b/emojify/src/main/kotlin/io/wax911/emojify/util/Fitzpatrick.kt @@ -64,6 +64,6 @@ enum class Fitzpatrick constructor(val unicode: String) { fun fitzpatrickFromType(type: String): Fitzpatrick? = runCatching { valueOf(type.uppercase(Locale.ROOT)) - }.onFailure { it.printStackTrace() }.getOrNull() + }.onFailure(Throwable::printStackTrace).getOrNull() } } diff --git a/emojify/src/test/kotlin/io/wax911/emojify/EmojiManagerTest.kt b/emojify/src/test/kotlin/io/wax911/emojify/EmojiManagerTest.kt index 6a888349..f87b1b8a 100644 --- a/emojify/src/test/kotlin/io/wax911/emojify/EmojiManagerTest.kt +++ b/emojify/src/test/kotlin/io/wax911/emojify/EmojiManagerTest.kt @@ -18,7 +18,9 @@ package io.wax911.emojify import io.wax911.emojify.core.EmojiLoader import io.wax911.emojify.model.Emoji -import org.junit.Assert +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Test @@ -33,7 +35,7 @@ class EmojiManagerTest : EmojiLoader() { val trimmed = emojiManager.trimAlias(alias) // THEN - Assert.assertEquals("smile", trimmed) + assertEquals("smile", trimmed) } @Test @@ -44,7 +46,7 @@ class EmojiManagerTest : EmojiLoader() { val emojis = emojiManager.getForTag("jkahsgdfjksghfjkshf") // THEN - Assert.assertNull(emojis) + assertNull(emojis) } @Test @@ -55,7 +57,7 @@ class EmojiManagerTest : EmojiLoader() { val emojis = emojiManager.getForTag("happy") // THEN - Assert.assertEquals(4, emojis!!.size) + assertEquals(4, emojis!!.size) assertTrue( emojis.containsAliases( "smile", @@ -74,7 +76,7 @@ class EmojiManagerTest : EmojiLoader() { val emoji = emojiManager.getForAlias("jkahsgdfjksghfjkshf") // THEN - Assert.assertNull(emoji) + assertNull(emoji) } @Test @@ -85,7 +87,7 @@ class EmojiManagerTest : EmojiLoader() { val emoji = emojiManager.getForAlias("smile") // THEN - Assert.assertEquals( + assertEquals( "smiling face with open mouth and smiling eyes", emoji!!.description, ) @@ -99,7 +101,7 @@ class EmojiManagerTest : EmojiLoader() { val emoji = emojiManager.getForAlias(":smile:") // THEN - Assert.assertEquals( + assertEquals( "smiling face with open mouth and smiling eyes", emoji!!.description, ) @@ -138,7 +140,7 @@ class EmojiManagerTest : EmojiLoader() { val isEmoji = emojiManager.isEmoji(str) // THEN - Assert.assertFalse(isEmoji) + assertFalse(isEmoji) } @Test @@ -150,7 +152,7 @@ class EmojiManagerTest : EmojiLoader() { val isEmoji = emojiManager.isEmoji(str) // THEN - Assert.assertFalse(isEmoji) + assertFalse(isEmoji) } @Test @@ -186,7 +188,7 @@ class EmojiManagerTest : EmojiLoader() { val isEmoji = emojiManager.isOnlyEmojis(str) // THEN - Assert.assertFalse(isEmoji) + assertFalse(isEmoji) } @Test @@ -198,7 +200,7 @@ class EmojiManagerTest : EmojiLoader() { // THEN // We know the number of distinct tags int the...! - Assert.assertEquals(656, tags.size) + assertEquals(656, tags.size) } @Test @@ -211,13 +213,13 @@ class EmojiManagerTest : EmojiLoader() { // THEN val unicodes = HashSet() for (emoji in emojis) { - Assert.assertFalse( + assertFalse( "Duplicate: " + emoji.description!!, unicodes.contains(emoji.unicode), ) unicodes.add(emoji.unicode) } - Assert.assertEquals(unicodes.size, emojis.size) + assertEquals(unicodes.size, emojis.size) } @Test @@ -238,7 +240,7 @@ class EmojiManagerTest : EmojiLoader() { aliases.add(alias) } } - Assert.assertEquals("Duplicates: $duplicates", duplicates.size, 0) + assertEquals("Duplicates: $duplicates", duplicates.size, 0) } companion object { diff --git a/emojify/src/test/kotlin/io/wax911/emojify/EmojiParseTest.kt b/emojify/src/test/kotlin/io/wax911/emojify/EmojiParseTest.kt index 34ad6239..366ab62d 100644 --- a/emojify/src/test/kotlin/io/wax911/emojify/EmojiParseTest.kt +++ b/emojify/src/test/kotlin/io/wax911/emojify/EmojiParseTest.kt @@ -19,8 +19,8 @@ package io.wax911.emojify import io.wax911.emojify.core.EmojiLoader import io.wax911.emojify.model.Emoji import io.wax911.emojify.parser.action.FitzpatrickAction +import io.wax911.emojify.parser.aliasCandidateAt import io.wax911.emojify.parser.extractEmojis -import io.wax911.emojify.parser.getAliasCandidates import io.wax911.emojify.parser.parseToAliases import io.wax911.emojify.parser.parseToHtmlDecimal import io.wax911.emojify.parser.parseToHtmlHexadecimal @@ -30,9 +30,12 @@ import io.wax911.emojify.parser.removeAllEmojisExcept import io.wax911.emojify.parser.removeEmojis import io.wax911.emojify.parser.replaceAllEmojis import io.wax911.emojify.util.Fitzpatrick -import org.junit.Assert +import org.junit.Assert.assertEquals +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Test + class EmojiParseTest : EmojiLoader() { @Test @@ -41,10 +44,10 @@ class EmojiParseTest : EmojiLoader() { val str = "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring with a few ๐Ÿ˜‰emojis!" // WHEN - val result = emojiManager.parseToAliases(str) + val result: String = emojiManager.parseToAliases(str) // THEN - Assert.assertEquals( + assertEquals( "An :grinning:awesome :smiley:string with a few :wink:emojis!", result, ) @@ -57,25 +60,26 @@ class EmojiParseTest : EmojiLoader() { val str = "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring with a few ๐Ÿ˜‰emojis!" // WHEN - val result = emojiManager.replaceAllEmojis(str, ":)") + val result: String = emojiManager.replaceAllEmojis(str, ":)") // THEN - Assert.assertEquals( + assertEquals( "An :)awesome :)string with a few :)emojis!", result, ) } + @Test fun parseToAliases_REPLACE_with_a_fitzpatrick_modifier() { // GIVEN val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToAliases(str) + val result: String = emojiManager.parseToAliases(str) // THEN - Assert.assertEquals(":boy|type_6:", result) + assertEquals(":boy|type_6:", result) } @Test @@ -84,10 +88,10 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToAliases(str, FitzpatrickAction.REMOVE) + val result: String = emojiManager.parseToAliases(str, FitzpatrickAction.REMOVE) // THEN - Assert.assertEquals(":boy:", result) + assertEquals(":boy:", result) } @Test @@ -96,10 +100,10 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66" // WHEN - val result = emojiManager.parseToAliases(str, FitzpatrickAction.REMOVE) + val result: String = emojiManager.parseToAliases(str, FitzpatrickAction.REMOVE) // THEN - Assert.assertEquals(":boy:", result) + assertEquals(":boy:", result) } @Test @@ -108,10 +112,10 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToAliases(str, FitzpatrickAction.IGNORE) + val result: String = emojiManager.parseToAliases(str, FitzpatrickAction.IGNORE) // THEN - Assert.assertEquals(":boy:\uD83C\uDFFF", result) + assertEquals(":boy:\uD83C\uDFFF", result) } @Test @@ -120,10 +124,10 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66" // WHEN - val result = emojiManager.parseToAliases(str, FitzpatrickAction.IGNORE) + val result: String = emojiManager.parseToAliases(str, FitzpatrickAction.IGNORE) // THEN - Assert.assertEquals(":boy:", result) + assertEquals(":boy:", result) } @Test @@ -132,11 +136,11 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC68\u200D\uD83D\uDC69\u200D\uD83D\uDC66" // WHEN - val result = emojiManager.parseToAliases(str) + val result: String = emojiManager.parseToAliases(str) - // With greedy parsing, this will give :man::woman::boy: - // THEN - Assert.assertEquals(":family_man_woman_boy:", result) + //With greedy parsing, this will give :man::woman::boy: + //THEN + assertEquals(":family_man_woman_boy:", result) } @Test @@ -145,10 +149,10 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC69\uD83D\uDC68\uD83D\uDC66" // WHEN - val result = emojiManager.parseToAliases(str) + val result: String = emojiManager.parseToAliases(str) - // THEN - Assert.assertEquals(":woman::man::boy:", result) + //THEN + assertEquals(":woman::man::boy:", result) } @Test @@ -157,10 +161,10 @@ class EmojiParseTest : EmojiLoader() { val str = "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring with a few ๐Ÿ˜‰emojis!" // WHEN - val result = emojiManager.parseToHtmlDecimal(str) + val result: String = emojiManager.parseToHtmlDecimal(str) // THEN - Assert.assertEquals( + assertEquals( "An 😀awesome 😃string with a few 😉emojis!", result, ) @@ -172,13 +176,13 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToHtmlDecimal( + val result: String = emojiManager.parseToHtmlDecimal( str, FitzpatrickAction.PARSE, ) // THEN - Assert.assertEquals("👦", result) + assertEquals("👦", result) } @Test @@ -187,13 +191,13 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToHtmlDecimal( + val result: String = emojiManager.parseToHtmlDecimal( str, FitzpatrickAction.REMOVE, ) // THEN - Assert.assertEquals("👦", result) + assertEquals("👦", result) } @Test @@ -202,13 +206,13 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToHtmlDecimal( + val result: String = emojiManager.parseToHtmlDecimal( str, FitzpatrickAction.IGNORE, ) // THEN - Assert.assertEquals("👦\uD83C\uDFFF", result) + assertEquals("👦\uD83C\uDFFF", result) } @Test @@ -217,10 +221,10 @@ class EmojiParseTest : EmojiLoader() { val str = "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring with a few ๐Ÿ˜‰emojis!" // WHEN - val result = emojiManager.parseToHtmlHexadecimal(str) + val result: String = emojiManager.parseToHtmlHexadecimal(str) // THEN - Assert.assertEquals( + assertEquals( "An 😀awesome 😃string with a few 😉emojis!", result, ) @@ -232,13 +236,13 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToHtmlHexadecimal( + val result: String = emojiManager.parseToHtmlHexadecimal( str, FitzpatrickAction.PARSE, ) // THEN - Assert.assertEquals("👦", result) + assertEquals("👦", result) } @Test @@ -247,13 +251,13 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToHtmlHexadecimal( + val result: String = emojiManager.parseToHtmlHexadecimal( str, FitzpatrickAction.REMOVE, ) // THEN - Assert.assertEquals("👦", result) + assertEquals("👦", result) } @Test @@ -262,37 +266,39 @@ class EmojiParseTest : EmojiLoader() { val str = "\uD83D\uDC66\uD83C\uDFFF" // WHEN - val result = emojiManager.parseToHtmlHexadecimal( + val result: String = emojiManager.parseToHtmlHexadecimal( str, FitzpatrickAction.IGNORE, ) // THEN - Assert.assertEquals("👦\uD83C\uDFFF", result) + assertEquals("👦\uD83C\uDFFF", result) } @Test fun parseToUnicode_replaces_the_aliases_and_the_html_by_their_emoji() { // GIVEN - val str = "An :grinning:awesome :smiley:string " + "😄with a few 😉emojis!" + val str = "An :grinning:awesome :smiley:string " + + "😄with a few 😉emojis!" // WHEN - val result = emojiManager.parseToUnicode(str) + val result: String = emojiManager.parseToUnicode(str) // THEN - Assert.assertEquals("An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring ๐Ÿ˜„with a few ๐Ÿ˜‰emojis!", result) + assertEquals("An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring ๐Ÿ˜„with a few ๐Ÿ˜‰emojis!", result) } @Test - fun parseToUnicode_with_the_thumbs_up_emoji_replaces_the_alias_by_the_emoji() { + fun parseToUnicode_with_the_thumbsup_emoji_replaces_the_alias_by_the_emoji() { // GIVEN - val str = "An :+1:awesome :smiley:string " + "😄with a few :wink:emojis!" + val str = "An :+1:awesome :smiley:string " + + "😄with a few :wink:emojis!" // WHEN - val result = emojiManager.parseToUnicode(str) + val result: String = emojiManager.parseToUnicode(str) // THEN - Assert.assertEquals( + assertEquals( "An \uD83D\uDC4Dawesome ๐Ÿ˜ƒstring ๐Ÿ˜„with a few ๐Ÿ˜‰emojis!", result, ) @@ -301,28 +307,30 @@ class EmojiParseTest : EmojiLoader() { @Test fun parseToUnicode_with_the_thumbsdown_emoji_replaces_the_alias_by_the_emoji() { // GIVEN - val str = "An :-1:awesome :smiley:string 😄" + "with a few :wink:emojis!" + val str = "An :-1:awesome :smiley:string 😄" + + "with a few :wink:emojis!" // WHEN - val result = emojiManager.parseToUnicode(str) + val result: String = emojiManager.parseToUnicode(str) // THEN - Assert.assertEquals( - "An \uD83D\uDC4Eawesome ๐Ÿ˜ƒstring ๐Ÿ˜„with a few ๐Ÿ˜‰emojis!", + assertEquals( + "An \uD83D\uDC4Eawesome \uD83D\uDE03string \uD83D\uDE04with a few \uD83D\uDE09emojis!", result, ) } @Test - fun parseToUnicode_with_the_thumbs_up_emoji_in_hex_replaces_the_alias_by_the_emoji() { + fun parseToUnicode_with_the_thumbsup_emoji_in_hex_replaces_the_alias_by_the_emoji() { // GIVEN - val str = "An :+1:awesome :smiley:string 😄" + "with a few :wink:emojis!" + val str = "An :+1:awesome :smiley:string 😄" + + "with a few :wink:emojis!" // WHEN - val result = emojiManager.parseToUnicode(str) + val result: String = emojiManager.parseToUnicode(str) // THEN - Assert.assertEquals( + assertEquals( "An \uD83D\uDC4Dawesome ๐Ÿ˜ƒstring ๐Ÿ˜„with a few ๐Ÿ˜‰emojis!", result, ) @@ -334,205 +342,159 @@ class EmojiParseTest : EmojiLoader() { val str = ":boy|type_6:" // WHEN - val result = emojiManager.parseToUnicode(str) + val result: String = emojiManager.parseToUnicode(str) // THEN - Assert.assertEquals("\uD83D\uDC66\uD83C\uDFFF", result) + assertEquals("\uD83D\uDC66\uD83C\uDFFF", result) } @Test - fun parseToUnicode_with_an_unsupported_fitzpatrick_modifier_does_not_replace() { + fun parseToUnicode_with_an_unsupported_fitzpatrick_modifier_doesnt_replace() { // GIVEN val str = ":grinning|type_6:" // WHEN - val result = emojiManager.parseToUnicode(str) - - // THEN - Assert.assertEquals(str, result) - } - - @Test - fun getAliasCanditates_with_one_alias() { - // GIVEN - val str = "test :candidate: test" - - // WHEN - val candidates = getAliasCandidates(str) + val result: String = emojiManager.parseToUnicode(str) // THEN - Assert.assertEquals(1, candidates.size) - Assert.assertEquals("candidate", candidates.first().alias) - Assert.assertNull(candidates.first().fitzpatrick) + assertEquals(str, result) } @Test - fun getAliasCanditates_with_one_alias_an_another_colon_after() { + fun aliasCandidateAt_with_one_alias() { // GIVEN - val str = "test :candidate: test:" + val str = "test :boy: test" // WHEN - val candidates = getAliasCandidates(str) + val candidate = emojiManager.aliasCandidateAt(str, 5) // THEN - Assert.assertEquals(1, candidates.size) - Assert.assertEquals("candidate", candidates.first().alias) - Assert.assertNull(candidates.first().fitzpatrick) + assertTrue(candidate!!.emoji.aliases!!.contains("boy")) + assertNull(candidate.fitzpatrick) } @Test - fun getAliasCanditates_with_one_alias_an_another_colon_right_after() { + fun aliasCandidateAt_with_one_alias_an_another_colon_after() { // GIVEN - val str = "test :candidate::test" + val str = "test :boy: test:" // WHEN - val candidates = getAliasCandidates(str) + val candidate = emojiManager.aliasCandidateAt(str, 5) // THEN - Assert.assertEquals(1, candidates.size) - Assert.assertEquals("candidate", candidates.first().alias) - Assert.assertNull(candidates.first().fitzpatrick) + assertTrue(candidate!!.emoji.aliases!!.contains("boy")) + assertNull(candidate.fitzpatrick) } @Test - fun getAliasCanditates_with_one_alias_an_another_colon_before_after() { + fun aliasCandidateAt_with_one_alias_an_another_colon_right_after() { // GIVEN - val str = "test ::candidate: test" + val str = "test :boy::test" // WHEN - val candidates = getAliasCandidates(str) + val candidate = emojiManager.aliasCandidateAt(str, 5) // THEN - Assert.assertEquals(1, candidates.size) - Assert.assertEquals("candidate", candidates.first().alias) - Assert.assertNull(candidates.first().fitzpatrick) + assertTrue(candidate!!.emoji.aliases!!.contains("boy")) + assertNull(candidate.fitzpatrick) } @Test - fun getAliasCanditates_with_two_aliases() { + fun aliasCandidateAt_with_one_alias_an_another_colon_before_after() { // GIVEN - val str = "test :candi: :candidate: test" + val str = "test ::boy: test" // WHEN - val candidates = getAliasCandidates(str) + var candidate = emojiManager.aliasCandidateAt(str, 5) + assertNull(candidate) + candidate = emojiManager.aliasCandidateAt(str, 6) // THEN - Assert.assertEquals(2, candidates.size) - Assert.assertEquals("candi", candidates.first().alias) - Assert.assertNull(candidates.first().fitzpatrick) - Assert.assertEquals("candidate", candidates[1].alias) - Assert.assertNull(candidates[1].fitzpatrick) + assertTrue(candidate!!.emoji.aliases!!.contains("boy")) + assertNull(candidate.fitzpatrick) } @Test - fun getAliasCanditates_with_two_aliases_sharing_a_colon() { + fun aliasCandidateAt_with_a_fitzpatrick_modifier() { // GIVEN - val str = "test :candi:candidate: test" + val str = "test :boy|type_3: test" // WHEN - val candidates = getAliasCandidates(str) + val candidate = emojiManager.aliasCandidateAt(str, 5) // THEN - Assert.assertEquals(2, candidates.size) - Assert.assertEquals("candi", candidates.first().alias) - Assert.assertNull(candidates.first().fitzpatrick) - Assert.assertEquals("candidate", candidates[1].alias) - Assert.assertNull(candidates[1].fitzpatrick) - } - - @Test - fun getAliasCanditates_with_a_fitzpatrick_modifier() { - // GIVEN - val str = "test :candidate|type_3: test" - - // WHEN - val candidates = getAliasCandidates(str) - - // THEN - Assert.assertEquals(1, candidates.size) - Assert.assertEquals("candidate", candidates.first().alias) - Assert.assertEquals(Fitzpatrick.TYPE_3, candidates.first().fitzpatrick) + assertTrue(candidate?.emoji?.aliases?.contains("boy")!!) + assertEquals(Fitzpatrick.TYPE_3, candidate.fitzpatrick) } @Test fun test_with_a_new_flag() { val input = "Cuba has a new flag! :cu:" val expected = "Cuba has a new flag! \uD83C\uDDE8\uD83C\uDDFA" - - Assert.assertEquals(expected, emojiManager.parseToUnicode(input)) - Assert.assertEquals(input, emojiManager.parseToAliases(expected)) + assertEquals(expected, emojiManager.parseToUnicode(input)) + assertEquals(input, emojiManager.parseToAliases(expected)) } @Test fun removeAllEmojis_removes_all_the_emojis_from_the_string() { // GIVEN - val input = "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring ๐Ÿ˜„with " + "a \uD83D\uDC66\uD83C\uDFFFfew ๐Ÿ˜‰emojis!" + val input = "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring ๐Ÿ˜„with " + + "a \uD83D\uDC66\uD83C\uDFFFfew ๐Ÿ˜‰emojis!" // WHEN - val result = emojiManager.removeAllEmojis(input) + val result: String = emojiManager.removeAllEmojis(input) // THEN val expected = "An awesome string with a few emojis!" - Assert.assertEquals(expected, result) + assertEquals(expected, result) } @Test fun removeEmojis_only_removes_the_emojis_in_the_iterable_from_the_string() { // GIVEN - val input = "An\uD83D\uDE03 awesome\uD83D\uDE04 string" + "\uD83D\uDC4D\uD83C\uDFFF with\uD83D\uDCAA\uD83C\uDFFD a few emojis!" - - val emojis = ArrayList() - - val smile = emojiManager.getForAlias("smile") - val onePlus = emojiManager.getForAlias("+1") - - Assert.assertNotNull(smile) - Assert.assertNotNull(onePlus) - - emojis.add(smile!!) - emojis.add(onePlus!!) + val input = "An\uD83D\uDE03 awesome\uD83D\uDE04 string" + + "\uD83D\uDC4D\uD83C\uDFFF with\uD83D\uDCAA\uD83C\uDFFD a few emojis!" + val emojis: MutableList = ArrayList() + emojis.add(emojiManager.getForAlias("smile")!!) + emojis.add(emojiManager.getForAlias("+1")!!) // WHEN - val result = emojiManager.removeEmojis(input, emojis) + val result: String = emojiManager.removeEmojis(input, emojis) // THEN - val expected = "An\uD83D\uDE03 awesome string with" + "\uD83D\uDCAA\uD83C\uDFFD a few emojis!" - Assert.assertEquals(expected, result) + val expected = "An\uD83D\uDE03 awesome string with" + + "\uD83D\uDCAA\uD83C\uDFFD a few emojis!" + assertEquals(expected, result) } @Test fun removeAllEmojisExcept_removes_all_the_emojis_from_the_string_except_those_in_the_iterable() { // GIVEN - val input = "An\uD83D\uDE03 awesome\uD83D\uDE04 string" + "\uD83D\uDC4D\uD83C\uDFFF with\uD83D\uDCAA\uD83C\uDFFD a few emojis!" - - val emojis = ArrayList() - - val smile = emojiManager.getForAlias("smile") - val onePlus = emojiManager.getForAlias("+1") - - Assert.assertNotNull(smile) - Assert.assertNotNull(onePlus) - - emojis.add(smile!!) - emojis.add(onePlus!!) + val input = "An\uD83D\uDE03 awesome\uD83D\uDE04 string" + + "\uD83D\uDC4D\uD83C\uDFFF with\uD83D\uDCAA\uD83C\uDFFD a few emojis!" + val emojis: MutableList = ArrayList() + emojis.add(emojiManager.getForAlias("smile")!!) + emojis.add(emojiManager.getForAlias("+1")!!) // WHEN - val result = emojiManager.removeAllEmojisExcept(input, emojis) + val result: String = emojiManager.removeAllEmojisExcept(input, emojis) // THEN - val expected = "An awesome\uD83D\uDE04 string\uD83D\uDC4D\uD83C\uDFFF " + "with a few emojis!" - Assert.assertEquals(expected, result) + val expected = "An awesome\uD83D\uDE04 string\uD83D\uDC4D\uD83C\uDFFF " + + "with a few emojis!" + assertEquals(expected, result) } @Test fun parseToUnicode_with_the_keycap_asterisk_emoji_replaces_the_alias_by_the_emoji() { // GIVEN - val str = "Let's test the :keycap_asterisk: emoji and " + "its other alias :star_keycap:" + val str = "Let's test the :keycap_asterisk: emoji and " + + "its other alias :star_keycap:" // WHEN - val result = emojiManager.parseToUnicode(str) + val result: String = emojiManager.parseToUnicode(str) // THEN - Assert.assertEquals("Let's test the *โƒฃ emoji and its other alias *โƒฃ", result) + assertEquals("Let's test the *โƒฃ emoji and its other alias *โƒฃ", result) } @Test @@ -541,10 +503,10 @@ class EmojiParseTest : EmojiLoader() { val str = "Nigeria is ๐Ÿ‡ณ๐Ÿ‡ฌ, NG is ๐Ÿ†–" // WHEN - val result = emojiManager.parseToAliases(str) + val result: String = emojiManager.parseToAliases(str) // THEN - Assert.assertEquals("Nigeria is :ng:, NG is :squared_ng:", result) + assertEquals("Nigeria is :ng:, NG is :squared_ng:", result) } @Test @@ -553,10 +515,10 @@ class EmojiParseTest : EmojiLoader() { val str = "๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ" // WHEN - val result = emojiManager.parseToAliases(str) + val result: String = emojiManager.parseToAliases(str) // THEN - Assert.assertEquals(":couplekiss_woman_woman:", result) + assertEquals(":couplekiss_woman_woman:", result) } @Test @@ -565,11 +527,45 @@ class EmojiParseTest : EmojiLoader() { val str = "An ๐Ÿ˜€awesome ๐Ÿ˜ƒstring with a few ๐Ÿ˜‰emojis!" // WHEN - val result = emojiManager.extractEmojis(str) + val result: List = emojiManager.extractEmojis(str) + + // THEN + assertEquals("๐Ÿ˜€", result[0]) + assertEquals("๐Ÿ˜ƒ", result[1]) + assertEquals("๐Ÿ˜‰", result[2]) + } + + @Test + fun extractEmojis_withFitzpatrickModifiers() { + // GIVEN + val surfer = emojiManager.getForAlias("surfer")?.unicode + val surfer3 = emojiManager.getForAlias("surfer")?.getUnicode(Fitzpatrick.TYPE_3) + val surfer4 = emojiManager.getForAlias("surfer")?.getUnicode(Fitzpatrick.TYPE_4) + val surfer5 = emojiManager.getForAlias("surfer")?.getUnicode(Fitzpatrick.TYPE_5) + val surfer6 = emojiManager.getForAlias("surfer")?.getUnicode(Fitzpatrick.TYPE_6) + val surfers = "$surfer $surfer3 $surfer4 $surfer5 $surfer6" + + // WHEN + val result: List = emojiManager.extractEmojis(surfers) + + // THEN + assertEquals(5, result.size) + assertEquals(surfer, result[0]) + assertEquals(surfer3, result[1]) + assertEquals(surfer4, result[2]) + assertEquals(surfer5, result[3]) + assertEquals(surfer6, result[4]) + } + + @Test + fun parseToAliases_with_first_medal() { + // GIVEN + val str = "๐Ÿฅ‡" + + // WHEN + val result: String = emojiManager.parseToAliases(str) // THEN - Assert.assertEquals("๐Ÿ˜€", result[0]) - Assert.assertEquals("๐Ÿ˜ƒ", result[1]) - Assert.assertEquals("๐Ÿ˜‰", result[2]) + assertEquals(":first_place_medal:", result) } } diff --git a/emojify/src/test/kotlin/io/wax911/emojify/EmojiTest.kt b/emojify/src/test/kotlin/io/wax911/emojify/EmojiTest.kt new file mode 100644 index 00000000..ae08e9e7 --- /dev/null +++ b/emojify/src/test/kotlin/io/wax911/emojify/EmojiTest.kt @@ -0,0 +1,126 @@ +package io.wax911.emojify + +import io.wax911.emojify.core.EmojiLoader +import io.wax911.emojify.parser.action.FitzpatrickAction +import io.wax911.emojify.parser.candidate.UnicodeCandidate +import io.wax911.emojify.parser.parseFromUnicode +import io.wax911.emojify.parser.parseToAliases +import io.wax911.emojify.parser.parseToHtmlDecimal +import io.wax911.emojify.parser.parseToHtmlHexadecimal +import io.wax911.emojify.parser.parseToUnicode +import io.wax911.emojify.parser.transformer.EmojiTransformer +import org.junit.Assert.assertEquals +import org.junit.Assert.assertTrue +import org.junit.Ignore +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.Parameterized +import java.util.Arrays + + +@RunWith(value = Parameterized::class) +class EmojiTest( + private val emoji: String, + private val fitzpatrickAction: FitzpatrickAction, +) : EmojiLoader() { + + @Ignore("1665 emoji still has not been added") + @Test + fun checkEmojiExisting() { + assertTrue("Asserting for emoji: $emoji", emojiManager.isEmoji(emoji)) + } + + @Test + fun `check that emoji can be parsed to htmlDecimal`() { + val htmlDecimal = emojiManager.parseToHtmlDecimal(emoji, fitzpatrickAction) + val unicode = emojiManager.parseToUnicode(htmlDecimal) + assertEquals(emoji, unicode) + } + + @Test + fun `check that emoji can be parsed to htmlHexadecimal`() { + val htmlHexadecimal = emojiManager.parseToHtmlHexadecimal(emoji, fitzpatrickAction) + val unicode = emojiManager.parseToUnicode(htmlHexadecimal) + assertEquals(emoji, unicode) + } + + @Test + fun `check that emoji can be parsed to aliases`() { + val alias = emojiManager.parseToAliases(emoji, fitzpatrickAction) + val unicode = emojiManager.parseToUnicode(alias) + assertEquals(emoji, unicode) + } + + + @Test + fun `check emoji fitzpatrick flag`() { + val len: Int = emoji.toCharArray().size + var shouldContainFitzpatrick = false + var codepoint: Int + for (i in 0 until len) { + codepoint = emoji.codePointAt(i) + shouldContainFitzpatrick = Arrays.binarySearch(FITZPATRICK_CODEPOINTS, codepoint) >= 0 + if (shouldContainFitzpatrick) { + break + } + } + if (shouldContainFitzpatrick) { + emojiManager.parseFromUnicode( + emoji, + object : EmojiTransformer { + override operator fun invoke(unicodeCandidate: UnicodeCandidate): String { + if (unicodeCandidate.hasFitzpatrick()) { + assertTrue( + "Asserting emoji contains fitzpatrick: " + emoji + " " + unicodeCandidate.emoji, + unicodeCandidate.emoji?.supportsFitzpatrick!!, + ) + } + return "" + } + }, + ) + } + } + + companion object { + val FITZPATRICK_CODEPOINTS = intArrayOf( + convertFromCodepoint("1F3FB"), + convertFromCodepoint("1F3FC"), + convertFromCodepoint("1F3FD"), + convertFromCodepoint("1F3FE"), + convertFromCodepoint("1F3FF"), + ) + + @JvmStatic + @Parameterized.Parameters(name = "{index}: emoji = {0}") + fun createEmojiList() = + EmojiLoader::class.java.getResourceAsStream("emoji-test.txt") + ?.use { + it.reader().readLines() + }?.filter { line -> + !line.startsWith("#") && + !line.startsWith(" ") && + !line.startsWith("\n") && + line.isNotEmpty() + }?.map { line -> + val lineSplit = line.split(";") + convertToEmoji(lineSplit[0].trim()) + } + + private fun convertToEmoji(input: String): Array { + val stringBuilder = StringBuilder() + input.split(" ") + .map { emojiCodepoint -> + val codePoint: Int = convertFromCodepoint(emojiCodepoint) + Character.toChars(codePoint) + } + .forEach(stringBuilder::append) + + return arrayOf(stringBuilder.toString(), FitzpatrickAction.IGNORE) + } + + private fun convertFromCodepoint(emojiCodepointAsString: String): Int { + return emojiCodepointAsString.toInt(16) + } + } +} diff --git a/emojify/src/test/kotlin/io/wax911/emojify/EmojiUtilTest.kt b/emojify/src/test/kotlin/io/wax911/emojify/EmojiUtilTest.kt index c473f5a9..ff221b7c 100644 --- a/emojify/src/test/kotlin/io/wax911/emojify/EmojiUtilTest.kt +++ b/emojify/src/test/kotlin/io/wax911/emojify/EmojiUtilTest.kt @@ -22,7 +22,11 @@ import io.wax911.emojify.parser.parseToAliases import io.wax911.emojify.parser.parseToHtmlDecimal import io.wax911.emojify.parser.parseToHtmlHexadecimal import io.wax911.emojify.parser.parseToUnicode -import org.junit.Assert +import org.junit.Assert.assertEquals +import org.junit.Assert.assertFalse +import org.junit.Assert.assertNotNull +import org.junit.Assert.assertNull +import org.junit.Assert.assertTrue import org.junit.Test class EmojiUtilTest : EmojiLoader() { @@ -30,81 +34,83 @@ class EmojiUtilTest : EmojiLoader() { @Test fun testEmojiByUnicode() { val emoji = emojiManager.getByUnicode("\uD83D\uDC2D") - Assert.assertNotNull(emoji) - Assert.assertEquals("🐭", emoji?.htmlHex) + assertNotNull(emoji) + assertEquals("🐭", emoji?.htmlHex) } @Test fun testEmojiByShortCode() { // existing emoji var emoji = emojiManager.getForAlias("blue_car") - Assert.assertNotNull(emoji) - Assert.assertEquals("๐Ÿš™", emoji!!.emoji) + assertNotNull(emoji) + assertEquals("๐Ÿš™", emoji!!.emoji) // not an emoji character emoji = emojiManager.getForAlias("bluecar") - Assert.assertNull(emoji) + assertNull(emoji) } @Test fun testEmojiByShortCodeWithColons() { // existing emoji var emoji = emojiManager.getForAlias(":blue_car:") - Assert.assertNotNull(emoji) - Assert.assertEquals("๐Ÿš™", emoji!!.emoji) + assertNotNull(emoji) + assertEquals("๐Ÿš™", emoji!!.emoji) // not an emoji character emoji = emojiManager.getForAlias(":bluecar:") - Assert.assertNull(emoji) + assertNull(emoji) } @Test fun testEmojiByHexHtml() { // get by hexhtml val unicode = emojiManager.parseToUnicode("🐭") - Assert.assertNotNull(unicode) + assertNotNull(unicode) val emoji = emojiManager.getByUnicode(unicode) - Assert.assertNotNull(emoji) + assertNotNull(emoji) - Assert.assertEquals("๐Ÿญ", emoji?.emoji) + assertEquals("๐Ÿญ", emoji?.emoji) } @Test fun testEmojiByDecimalHtml() { // get by decimal html val unicode = emojiManager.parseToUnicode("🐭") - Assert.assertNotNull(unicode) + assertNotNull(unicode) val emoji = emojiManager.getByUnicode(unicode) - Assert.assertNotNull(emoji) + assertNotNull(emoji) - Assert.assertEquals("๐Ÿญ", emoji?.emoji) + assertEquals("๐Ÿญ", emoji?.emoji) } @Test fun testIsEmoji() { - Assert.assertFalse(emojiManager.isEmoji("{")) + assertFalse(emojiManager.isEmoji("{")) - Assert.assertTrue(emojiManager.isEmoji("๐Ÿญ")) + assertTrue(emojiManager.isEmoji("๐Ÿญ")) - Assert.assertFalse(emojiManager.isEmoji("smile")) + assertFalse(emojiManager.isEmoji("smile")) - Assert.assertTrue(emojiManager.isEmoji(emojiManager.parseToUnicode(":smiley:"))) + assertTrue(emojiManager.isEmoji(emojiManager.parseToUnicode(":smiley:"))) - Assert.assertFalse(emojiManager.isEmoji("🐭")) + assertFalse(emojiManager.isEmoji("🐭")) } @Test fun testEmojify1() { - var text = "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." - Assert.assertEquals( + var text = + "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." + assertEquals( "A ๐Ÿฑ, ๐Ÿถ and a ๐Ÿญ became friends. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ.", emojiManager.parseToUnicode(text), ) - text = "A :cat:, :dog:, :coyote: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." - Assert.assertEquals( + text = + "A :cat:, :dog:, :coyote: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." + assertEquals( "A ๐Ÿฑ, ๐Ÿถ, :coyote: and a ๐Ÿญ became friends. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ.", emojiManager.parseToUnicode(text), ) @@ -112,14 +118,16 @@ class EmojiUtilTest : EmojiLoader() { @Test fun testEmojify2() { - var text = "A 🐱, 🐶 and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." - Assert.assertEquals( + var text = + "A 🐱, 🐶 and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." + assertEquals( "A ๐Ÿฑ, ๐Ÿถ and a ๐Ÿญ became friends. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ.", emojiManager.parseToUnicode(text), ) - text = "A 🐱, 🐶,   and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." - Assert.assertEquals( + text = + "A 🐱, 🐶,   and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." + assertEquals( "A ๐Ÿฑ, ๐Ÿถ,   and a ๐Ÿญ became friends. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ.", emojiManager.parseToUnicode(text), ) @@ -127,31 +135,33 @@ class EmojiUtilTest : EmojiLoader() { @Test fun testCountEmojis() { - val text = "A 🐱, 🐶, :coyote: and a :mouse: became friends. For :dog:'s birthday party, they all had ๐Ÿ”s, :fries:s, :cookie:s and :cake:." + val text = + "A 🐱, 🐶, :coyote: and a :mouse: became friends. For :dog:'s birthday party, they all had ๐Ÿ”s, :fries:s, :cookie:s and :cake:." val emojiText = emojiManager.parseToUnicode(text) val emojiCount = emojiManager.extractEmojis(emojiText).size - Assert.assertEquals(8, emojiCount) + assertEquals(8, emojiCount) } @Test fun testHtmlify() { - val text = "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." + val text = + "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." val emojiText = emojiManager.parseToUnicode(text) val htmlifiedText = emojiManager.parseToHtmlDecimal(emojiText) - Assert.assertEquals( + assertEquals( "A 🐱, 🐶 and a 🐭 became friends. For 🐶's birthday party, they all had 🍔s, 🍟s, 🍪s and 🍰.", htmlifiedText, ) // also verify by emojifying htmlified text - Assert.assertEquals( + assertEquals( "A ๐Ÿฑ, ๐Ÿถ and a ๐Ÿญ became friends. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ.", emojiManager.parseToUnicode(htmlifiedText), ) @@ -159,51 +169,56 @@ class EmojiUtilTest : EmojiLoader() { @Test fun testHexHtmlify() { - val text = "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." + val text = + "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." val emojiText = emojiManager.parseToUnicode(text) val htmlifiedText = emojiManager.parseToHtmlHexadecimal(emojiText) - Assert.assertNotNull(htmlifiedText) + assertNotNull(htmlifiedText) - Assert.assertEquals( + assertEquals( "A 🐱, 🐶 and a 🐭 became friends. For 🐶's birthday party, they all had 🍔s, 🍟s, 🍪s and 🍰.", htmlifiedText, ) // also verify by emojifying htmlified text - Assert.assertEquals( + assertEquals( "A ๐Ÿฑ, ๐Ÿถ and a ๐Ÿญ became friends. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ.", - emojiManager.parseToUnicode(htmlifiedText!!), + emojiManager.parseToUnicode(htmlifiedText), ) } @Test fun testShortCodifyFromEmojis() { - val text = "A ๐Ÿฑ, ๐Ÿถ and a ๐Ÿญ became friendsโค๏ธ. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ." + val text = + "A ๐Ÿฑ, ๐Ÿถ and a ๐Ÿญ became friendsโค๏ธ. For ๐Ÿถ's birthday party, they all had ๐Ÿ”s, ๐ŸŸs, ๐Ÿชs and ๐Ÿฐ." - val expected = "A :cat:, :dog: and a :mouse: became friends:heart:๏ธ. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." + val expected = + "A :cat:, :dog: and a :mouse: became friends:heart:๏ธ. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:." val aliasText = emojiManager.parseToAliases(text) - Assert.assertEquals(expected, aliasText) + assertEquals(expected, aliasText) } @Test fun testShortCodifyFromHtmlEntities() { - var text = "A 🐱, 🐶 and a 🐭 became friends. For 🐶's birthday party, they all had 🍔s, 🍟s, 🍪s and 🍰." + var text = + "A 🐱, 🐶 and a 🐭 became friends. For 🐶's birthday party, they all had 🍔s, 🍟s, 🍪s and 🍰." var emojiText = emojiManager.parseToUnicode(text) - Assert.assertEquals( + assertEquals( "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:.", emojiManager.parseToAliases(emojiText), ) - text = "A 🐱, 🐶 and a 🐭 became friends. For 🐶's birthday party, they all had 🍔s, 🍟s, 🍪s and 🍰." + text = + "A 🐱, 🐶 and a 🐭 became friends. For 🐶's birthday party, they all had 🍔s, 🍟s, 🍪s and 🍰." emojiText = emojiManager.parseToUnicode(text) - Assert.assertEquals( + assertEquals( "A :cat:, :dog: and a :mouse: became friends. For :dog:'s birthday party, they all had :hamburger:s, :fries:s, :cookie:s and :cake:.", emojiManager.parseToAliases(emojiText), ) @@ -213,12 +228,12 @@ class EmojiUtilTest : EmojiLoader() { fun toSurrogateDecimalAndBackTest() { val text = "๐Ÿ˜ƒ๐Ÿ˜ƒ๐Ÿ˜…๐Ÿ˜ƒ๐Ÿ˜ถ๐Ÿ˜๐Ÿ˜—๐Ÿ˜—โค๏ธ๐Ÿ˜›๐Ÿ˜›๐Ÿ˜…โค๏ธ๐Ÿ˜›" val htmlifiedText = emojiManager.parseToHtmlDecimal(text) - Assert.assertEquals( + assertEquals( "😃😃😅😃😶😝😗😗❤๏ธ😛😛😅❤๏ธ😛", htmlifiedText, ) - Assert.assertEquals(text, emojiManager.parseToUnicode(htmlifiedText)) + assertEquals(text, emojiManager.parseToUnicode(htmlifiedText)) } @Test @@ -229,20 +244,20 @@ class EmojiUtilTest : EmojiLoader() { val hexHtmlString = emojiManager.parseToHtmlHexadecimal(emojiText) - Assert.assertNotNull(hexHtmlString) + assertNotNull(hexHtmlString) - Assert.assertEquals( + assertEquals( "😃😃😅😃😶😝😗😗❤๏ธ😛😛😅❤๏ธ😛", decHtmlString, ) - Assert.assertEquals( + assertEquals( "😃😃😅😃😶😝😗😗❤๏ธ😛😛😅❤๏ธ😛", hexHtmlString, ) - Assert.assertEquals(emojiText, emojiManager.parseToUnicode(decHtmlString)) + assertEquals(emojiText, emojiManager.parseToUnicode(decHtmlString)) - Assert.assertEquals(emojiText, emojiManager.parseToUnicode(hexHtmlString!!)) + assertEquals(emojiText, emojiManager.parseToUnicode(hexHtmlString)) } } diff --git a/emojify/src/test/resources/io/wax911/emojify/core/emoji-test.txt b/emojify/src/test/resources/io/wax911/emojify/core/emoji-test.txt new file mode 100644 index 00000000..ed3541dc --- /dev/null +++ b/emojify/src/test/resources/io/wax911/emojify/core/emoji-test.txt @@ -0,0 +1,3793 @@ +# emoji-test.txt +# Date: 2018-02-07, 09:44:06 GMT +# ยฉ 2018 Unicodeยฎ, Inc. +# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# +# Emoji Keyboard/Display Test Data for UTS #51 +# Version: 11.0 +# +# For documentation and usage, see http://www.unicode.org/reports/tr51 +# +# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed. +# Format +# Code points; status # emoji name +# Status +# fully-qualified โ€” see โ€œEmoji Implementation Notesโ€ in UTS #51 +# non-fully-qualified โ€” see โ€œEmoji Implementation Notesโ€ in UTS #51 +# Notes: +# โ€ข This currently omits the 12 keycap bases, the 5 modifier characters, and 26 singleton Regional Indicator characters +# โ€ข The file is in CLDR order, not codepoint order. This is recommended (but not required!) for keyboard palettes. +# โ€ข The groups and subgroups are purely illustrative. See the Emoji Order chart for more information. + +# group: Smileys & People + +# subgroup: face-positive +1F600 ; fully-qualified # ๐Ÿ˜€ grinning face +1F601 ; fully-qualified # ๐Ÿ˜ beaming face with smiling eyes +1F602 ; fully-qualified # ๐Ÿ˜‚ face with tears of joy +1F923 ; fully-qualified # ๐Ÿคฃ rolling on the floor laughing +1F603 ; fully-qualified # ๐Ÿ˜ƒ grinning face with big eyes +1F604 ; fully-qualified # ๐Ÿ˜„ grinning face with smiling eyes +1F605 ; fully-qualified # ๐Ÿ˜… grinning face with sweat +1F606 ; fully-qualified # ๐Ÿ˜† grinning squinting face +1F609 ; fully-qualified # ๐Ÿ˜‰ winking face +1F60A ; fully-qualified # ๐Ÿ˜Š smiling face with smiling eyes +1F60B ; fully-qualified # ๐Ÿ˜‹ face savoring food +1F60E ; fully-qualified # ๐Ÿ˜Ž smiling face with sunglasses +1F60D ; fully-qualified # ๐Ÿ˜ smiling face with heart-eyes +1F618 ; fully-qualified # ๐Ÿ˜˜ face blowing a kiss +1F970 ; fully-qualified # ๐Ÿฅฐ smiling face with 3 hearts +1F617 ; fully-qualified # ๐Ÿ˜— kissing face +1F619 ; fully-qualified # ๐Ÿ˜™ kissing face with smiling eyes +1F61A ; fully-qualified # ๐Ÿ˜š kissing face with closed eyes +263A FE0F ; fully-qualified # โ˜บ๏ธ smiling face +263A ; non-fully-qualified # โ˜บ smiling face +1F642 ; fully-qualified # ๐Ÿ™‚ slightly smiling face +1F917 ; fully-qualified # ๐Ÿค— hugging face +1F929 ; fully-qualified # ๐Ÿคฉ star-struck + +# subgroup: face-neutral +1F914 ; fully-qualified # ๐Ÿค” thinking face +1F928 ; fully-qualified # ๐Ÿคจ face with raised eyebrow +1F610 ; fully-qualified # ๐Ÿ˜ neutral face +1F611 ; fully-qualified # ๐Ÿ˜‘ expressionless face +1F636 ; fully-qualified # ๐Ÿ˜ถ face without mouth +1F644 ; fully-qualified # ๐Ÿ™„ face with rolling eyes +1F60F ; fully-qualified # ๐Ÿ˜ smirking face +1F623 ; fully-qualified # ๐Ÿ˜ฃ persevering face +1F625 ; fully-qualified # ๐Ÿ˜ฅ sad but relieved face +1F62E ; fully-qualified # ๐Ÿ˜ฎ face with open mouth +1F910 ; fully-qualified # ๐Ÿค zipper-mouth face +1F62F ; fully-qualified # ๐Ÿ˜ฏ hushed face +1F62A ; fully-qualified # ๐Ÿ˜ช sleepy face +1F62B ; fully-qualified # ๐Ÿ˜ซ tired face +1F634 ; fully-qualified # ๐Ÿ˜ด sleeping face +1F60C ; fully-qualified # ๐Ÿ˜Œ relieved face +1F61B ; fully-qualified # ๐Ÿ˜› face with tongue +1F61C ; fully-qualified # ๐Ÿ˜œ winking face with tongue +1F61D ; fully-qualified # ๐Ÿ˜ squinting face with tongue +1F924 ; fully-qualified # ๐Ÿคค drooling face +1F612 ; fully-qualified # ๐Ÿ˜’ unamused face +1F613 ; fully-qualified # ๐Ÿ˜“ downcast face with sweat +1F614 ; fully-qualified # ๐Ÿ˜” pensive face +1F615 ; fully-qualified # ๐Ÿ˜• confused face +1F643 ; fully-qualified # ๐Ÿ™ƒ upside-down face +1F911 ; fully-qualified # ๐Ÿค‘ money-mouth face +1F632 ; fully-qualified # ๐Ÿ˜ฒ astonished face + +# subgroup: face-negative +2639 FE0F ; fully-qualified # โ˜น๏ธ frowning face +2639 ; non-fully-qualified # โ˜น frowning face +1F641 ; fully-qualified # ๐Ÿ™ slightly frowning face +1F616 ; fully-qualified # ๐Ÿ˜– confounded face +1F61E ; fully-qualified # ๐Ÿ˜ž disappointed face +1F61F ; fully-qualified # ๐Ÿ˜Ÿ worried face +1F624 ; fully-qualified # ๐Ÿ˜ค face with steam from nose +1F622 ; fully-qualified # ๐Ÿ˜ข crying face +1F62D ; fully-qualified # ๐Ÿ˜ญ loudly crying face +1F626 ; fully-qualified # ๐Ÿ˜ฆ frowning face with open mouth +1F627 ; fully-qualified # ๐Ÿ˜ง anguished face +1F628 ; fully-qualified # ๐Ÿ˜จ fearful face +1F629 ; fully-qualified # ๐Ÿ˜ฉ weary face +1F92F ; fully-qualified # ๐Ÿคฏ exploding head +1F62C ; fully-qualified # ๐Ÿ˜ฌ grimacing face +1F630 ; fully-qualified # ๐Ÿ˜ฐ anxious face with sweat +1F631 ; fully-qualified # ๐Ÿ˜ฑ face screaming in fear +1F975 ; fully-qualified # ๐Ÿฅต hot face +1F976 ; fully-qualified # ๐Ÿฅถ cold face +1F633 ; fully-qualified # ๐Ÿ˜ณ flushed face +1F92A ; fully-qualified # ๐Ÿคช zany face +1F635 ; fully-qualified # ๐Ÿ˜ต dizzy face +1F621 ; fully-qualified # ๐Ÿ˜ก pouting face +1F620 ; fully-qualified # ๐Ÿ˜  angry face +1F92C ; fully-qualified # ๐Ÿคฌ face with symbols on mouth + +# subgroup: face-sick +1F637 ; fully-qualified # ๐Ÿ˜ท face with medical mask +1F912 ; fully-qualified # ๐Ÿค’ face with thermometer +1F915 ; fully-qualified # ๐Ÿค• face with head-bandage +1F922 ; fully-qualified # ๐Ÿคข nauseated face +1F92E ; fully-qualified # ๐Ÿคฎ face vomiting +1F927 ; fully-qualified # ๐Ÿคง sneezing face + +# subgroup: face-role +1F607 ; fully-qualified # ๐Ÿ˜‡ smiling face with halo +1F920 ; fully-qualified # ๐Ÿค  cowboy hat face +1F973 ; fully-qualified # ๐Ÿฅณ partying face +1F974 ; fully-qualified # ๐Ÿฅด woozy face +1F97A ; fully-qualified # ๐Ÿฅบ pleading face +1F925 ; fully-qualified # ๐Ÿคฅ lying face +1F92B ; fully-qualified # ๐Ÿคซ shushing face +1F92D ; fully-qualified # ๐Ÿคญ face with hand over mouth +1F9D0 ; fully-qualified # ๐Ÿง face with monocle +1F913 ; fully-qualified # ๐Ÿค“ nerd face + +# subgroup: face-fantasy +1F608 ; fully-qualified # ๐Ÿ˜ˆ smiling face with horns +1F47F ; fully-qualified # ๐Ÿ‘ฟ angry face with horns +1F921 ; fully-qualified # ๐Ÿคก clown face +1F479 ; fully-qualified # ๐Ÿ‘น ogre +1F47A ; fully-qualified # ๐Ÿ‘บ goblin +1F480 ; fully-qualified # ๐Ÿ’€ skull +2620 FE0F ; fully-qualified # โ˜ ๏ธ skull and crossbones +2620 ; non-fully-qualified # โ˜  skull and crossbones +1F47B ; fully-qualified # ๐Ÿ‘ป ghost +1F47D ; fully-qualified # ๐Ÿ‘ฝ alien +1F47E ; fully-qualified # ๐Ÿ‘พ alien monster +1F916 ; fully-qualified # ๐Ÿค– robot face +1F4A9 ; fully-qualified # ๐Ÿ’ฉ pile of poo + +# subgroup: cat-face +1F63A ; fully-qualified # ๐Ÿ˜บ grinning cat face +1F638 ; fully-qualified # ๐Ÿ˜ธ grinning cat face with smiling eyes +1F639 ; fully-qualified # ๐Ÿ˜น cat face with tears of joy +1F63B ; fully-qualified # ๐Ÿ˜ป smiling cat face with heart-eyes +1F63C ; fully-qualified # ๐Ÿ˜ผ cat face with wry smile +1F63D ; fully-qualified # ๐Ÿ˜ฝ kissing cat face +1F640 ; fully-qualified # ๐Ÿ™€ weary cat face +1F63F ; fully-qualified # ๐Ÿ˜ฟ crying cat face +1F63E ; fully-qualified # ๐Ÿ˜พ pouting cat face + +# subgroup: monkey-face +1F648 ; fully-qualified # ๐Ÿ™ˆ see-no-evil monkey +1F649 ; fully-qualified # ๐Ÿ™‰ hear-no-evil monkey +1F64A ; fully-qualified # ๐Ÿ™Š speak-no-evil monkey + +# subgroup: skin-tone +1F3FB ; fully-qualified # ๐Ÿป light skin tone +1F3FC ; fully-qualified # ๐Ÿผ medium-light skin tone +1F3FD ; fully-qualified # ๐Ÿฝ medium skin tone +1F3FE ; fully-qualified # ๐Ÿพ medium-dark skin tone +1F3FF ; fully-qualified # ๐Ÿฟ dark skin tone + +# subgroup: person +1F476 ; fully-qualified # ๐Ÿ‘ถ baby +1F476 1F3FB ; fully-qualified # ๐Ÿ‘ถ๐Ÿป baby: light skin tone +1F476 1F3FC ; fully-qualified # ๐Ÿ‘ถ๐Ÿผ baby: medium-light skin tone +1F476 1F3FD ; fully-qualified # ๐Ÿ‘ถ๐Ÿฝ baby: medium skin tone +1F476 1F3FE ; fully-qualified # ๐Ÿ‘ถ๐Ÿพ baby: medium-dark skin tone +1F476 1F3FF ; fully-qualified # ๐Ÿ‘ถ๐Ÿฟ baby: dark skin tone +1F9D2 ; fully-qualified # ๐Ÿง’ child +1F9D2 1F3FB ; fully-qualified # ๐Ÿง’๐Ÿป child: light skin tone +1F9D2 1F3FC ; fully-qualified # ๐Ÿง’๐Ÿผ child: medium-light skin tone +1F9D2 1F3FD ; fully-qualified # ๐Ÿง’๐Ÿฝ child: medium skin tone +1F9D2 1F3FE ; fully-qualified # ๐Ÿง’๐Ÿพ child: medium-dark skin tone +1F9D2 1F3FF ; fully-qualified # ๐Ÿง’๐Ÿฟ child: dark skin tone +1F466 ; fully-qualified # ๐Ÿ‘ฆ boy +1F466 1F3FB ; fully-qualified # ๐Ÿ‘ฆ๐Ÿป boy: light skin tone +1F466 1F3FC ; fully-qualified # ๐Ÿ‘ฆ๐Ÿผ boy: medium-light skin tone +1F466 1F3FD ; fully-qualified # ๐Ÿ‘ฆ๐Ÿฝ boy: medium skin tone +1F466 1F3FE ; fully-qualified # ๐Ÿ‘ฆ๐Ÿพ boy: medium-dark skin tone +1F466 1F3FF ; fully-qualified # ๐Ÿ‘ฆ๐Ÿฟ boy: dark skin tone +1F467 ; fully-qualified # ๐Ÿ‘ง girl +1F467 1F3FB ; fully-qualified # ๐Ÿ‘ง๐Ÿป girl: light skin tone +1F467 1F3FC ; fully-qualified # ๐Ÿ‘ง๐Ÿผ girl: medium-light skin tone +1F467 1F3FD ; fully-qualified # ๐Ÿ‘ง๐Ÿฝ girl: medium skin tone +1F467 1F3FE ; fully-qualified # ๐Ÿ‘ง๐Ÿพ girl: medium-dark skin tone +1F467 1F3FF ; fully-qualified # ๐Ÿ‘ง๐Ÿฟ girl: dark skin tone +1F9D1 ; fully-qualified # ๐Ÿง‘ adult +1F9D1 1F3FB ; fully-qualified # ๐Ÿง‘๐Ÿป adult: light skin tone +1F9D1 1F3FC ; fully-qualified # ๐Ÿง‘๐Ÿผ adult: medium-light skin tone +1F9D1 1F3FD ; fully-qualified # ๐Ÿง‘๐Ÿฝ adult: medium skin tone +1F9D1 1F3FE ; fully-qualified # ๐Ÿง‘๐Ÿพ adult: medium-dark skin tone +1F9D1 1F3FF ; fully-qualified # ๐Ÿง‘๐Ÿฟ adult: dark skin tone +1F468 ; fully-qualified # ๐Ÿ‘จ man +1F468 1F3FB ; fully-qualified # ๐Ÿ‘จ๐Ÿป man: light skin tone +1F468 1F3FC ; fully-qualified # ๐Ÿ‘จ๐Ÿผ man: medium-light skin tone +1F468 1F3FD ; fully-qualified # ๐Ÿ‘จ๐Ÿฝ man: medium skin tone +1F468 1F3FE ; fully-qualified # ๐Ÿ‘จ๐Ÿพ man: medium-dark skin tone +1F468 1F3FF ; fully-qualified # ๐Ÿ‘จ๐Ÿฟ man: dark skin tone +1F469 ; fully-qualified # ๐Ÿ‘ฉ woman +1F469 1F3FB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿป woman: light skin tone +1F469 1F3FC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผ woman: medium-light skin tone +1F469 1F3FD ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝ woman: medium skin tone +1F469 1F3FE ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพ woman: medium-dark skin tone +1F469 1F3FF ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟ woman: dark skin tone +1F9D3 ; fully-qualified # ๐Ÿง“ older adult +1F9D3 1F3FB ; fully-qualified # ๐Ÿง“๐Ÿป older adult: light skin tone +1F9D3 1F3FC ; fully-qualified # ๐Ÿง“๐Ÿผ older adult: medium-light skin tone +1F9D3 1F3FD ; fully-qualified # ๐Ÿง“๐Ÿฝ older adult: medium skin tone +1F9D3 1F3FE ; fully-qualified # ๐Ÿง“๐Ÿพ older adult: medium-dark skin tone +1F9D3 1F3FF ; fully-qualified # ๐Ÿง“๐Ÿฟ older adult: dark skin tone +1F474 ; fully-qualified # ๐Ÿ‘ด old man +1F474 1F3FB ; fully-qualified # ๐Ÿ‘ด๐Ÿป old man: light skin tone +1F474 1F3FC ; fully-qualified # ๐Ÿ‘ด๐Ÿผ old man: medium-light skin tone +1F474 1F3FD ; fully-qualified # ๐Ÿ‘ด๐Ÿฝ old man: medium skin tone +1F474 1F3FE ; fully-qualified # ๐Ÿ‘ด๐Ÿพ old man: medium-dark skin tone +1F474 1F3FF ; fully-qualified # ๐Ÿ‘ด๐Ÿฟ old man: dark skin tone +1F475 ; fully-qualified # ๐Ÿ‘ต old woman +1F475 1F3FB ; fully-qualified # ๐Ÿ‘ต๐Ÿป old woman: light skin tone +1F475 1F3FC ; fully-qualified # ๐Ÿ‘ต๐Ÿผ old woman: medium-light skin tone +1F475 1F3FD ; fully-qualified # ๐Ÿ‘ต๐Ÿฝ old woman: medium skin tone +1F475 1F3FE ; fully-qualified # ๐Ÿ‘ต๐Ÿพ old woman: medium-dark skin tone +1F475 1F3FF ; fully-qualified # ๐Ÿ‘ต๐Ÿฟ old woman: dark skin tone + +# subgroup: person-role +1F468 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จโ€โš•๏ธ man health worker +1F468 200D 2695 ; non-fully-qualified # ๐Ÿ‘จโ€โš• man health worker +1F468 1F3FB 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โš•๏ธ man health worker: light skin tone +1F468 1F3FB 200D 2695 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โš• man health worker: light skin tone +1F468 1F3FC 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โš•๏ธ man health worker: medium-light skin tone +1F468 1F3FC 200D 2695 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โš• man health worker: medium-light skin tone +1F468 1F3FD 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš•๏ธ man health worker: medium skin tone +1F468 1F3FD 200D 2695 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš• man health worker: medium skin tone +1F468 1F3FE 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โš•๏ธ man health worker: medium-dark skin tone +1F468 1F3FE 200D 2695 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โš• man health worker: medium-dark skin tone +1F468 1F3FF 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš•๏ธ man health worker: dark skin tone +1F468 1F3FF 200D 2695 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš• man health worker: dark skin tone +1F469 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉโ€โš•๏ธ woman health worker +1F469 200D 2695 ; non-fully-qualified # ๐Ÿ‘ฉโ€โš• woman health worker +1F469 1F3FB 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš•๏ธ woman health worker: light skin tone +1F469 1F3FB 200D 2695 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš• woman health worker: light skin tone +1F469 1F3FC 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš•๏ธ woman health worker: medium-light skin tone +1F469 1F3FC 200D 2695 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš• woman health worker: medium-light skin tone +1F469 1F3FD 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš•๏ธ woman health worker: medium skin tone +1F469 1F3FD 200D 2695 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš• woman health worker: medium skin tone +1F469 1F3FE 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš•๏ธ woman health worker: medium-dark skin tone +1F469 1F3FE 200D 2695 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš• woman health worker: medium-dark skin tone +1F469 1F3FF 200D 2695 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš•๏ธ woman health worker: dark skin tone +1F469 1F3FF 200D 2695 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš• woman health worker: dark skin tone +1F468 200D 1F393 ; fully-qualified # ๐Ÿ‘จโ€๐ŸŽ“ man student +1F468 1F3FB 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŽ“ man student: light skin tone +1F468 1F3FC 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŽ“ man student: medium-light skin tone +1F468 1F3FD 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŽ“ man student: medium skin tone +1F468 1F3FE 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŽ“ man student: medium-dark skin tone +1F468 1F3FF 200D 1F393 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŽ“ man student: dark skin tone +1F469 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŽ“ woman student +1F469 1F3FB 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽ“ woman student: light skin tone +1F469 1F3FC 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽ“ woman student: medium-light skin tone +1F469 1F3FD 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽ“ woman student: medium skin tone +1F469 1F3FE 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽ“ woman student: medium-dark skin tone +1F469 1F3FF 200D 1F393 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽ“ woman student: dark skin tone +1F468 200D 1F3EB ; fully-qualified # ๐Ÿ‘จโ€๐Ÿซ man teacher +1F468 1F3FB 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿซ man teacher: light skin tone +1F468 1F3FC 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿซ man teacher: medium-light skin tone +1F468 1F3FD 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿซ man teacher: medium skin tone +1F468 1F3FE 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿซ man teacher: medium-dark skin tone +1F468 1F3FF 200D 1F3EB ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿซ man teacher: dark skin tone +1F469 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿซ woman teacher +1F469 1F3FB 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿซ woman teacher: light skin tone +1F469 1F3FC 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿซ woman teacher: medium-light skin tone +1F469 1F3FD 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿซ woman teacher: medium skin tone +1F469 1F3FE 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿซ woman teacher: medium-dark skin tone +1F469 1F3FF 200D 1F3EB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿซ woman teacher: dark skin tone +1F468 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จโ€โš–๏ธ man judge +1F468 200D 2696 ; non-fully-qualified # ๐Ÿ‘จโ€โš– man judge +1F468 1F3FB 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โš–๏ธ man judge: light skin tone +1F468 1F3FB 200D 2696 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โš– man judge: light skin tone +1F468 1F3FC 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โš–๏ธ man judge: medium-light skin tone +1F468 1F3FC 200D 2696 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โš– man judge: medium-light skin tone +1F468 1F3FD 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš–๏ธ man judge: medium skin tone +1F468 1F3FD 200D 2696 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โš– man judge: medium skin tone +1F468 1F3FE 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โš–๏ธ man judge: medium-dark skin tone +1F468 1F3FE 200D 2696 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โš– man judge: medium-dark skin tone +1F468 1F3FF 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš–๏ธ man judge: dark skin tone +1F468 1F3FF 200D 2696 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โš– man judge: dark skin tone +1F469 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉโ€โš–๏ธ woman judge +1F469 200D 2696 ; non-fully-qualified # ๐Ÿ‘ฉโ€โš– woman judge +1F469 1F3FB 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš–๏ธ woman judge: light skin tone +1F469 1F3FB 200D 2696 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โš– woman judge: light skin tone +1F469 1F3FC 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš–๏ธ woman judge: medium-light skin tone +1F469 1F3FC 200D 2696 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โš– woman judge: medium-light skin tone +1F469 1F3FD 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš–๏ธ woman judge: medium skin tone +1F469 1F3FD 200D 2696 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โš– woman judge: medium skin tone +1F469 1F3FE 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš–๏ธ woman judge: medium-dark skin tone +1F469 1F3FE 200D 2696 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โš– woman judge: medium-dark skin tone +1F469 1F3FF 200D 2696 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš–๏ธ woman judge: dark skin tone +1F469 1F3FF 200D 2696 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โš– woman judge: dark skin tone +1F468 200D 1F33E ; fully-qualified # ๐Ÿ‘จโ€๐ŸŒพ man farmer +1F468 1F3FB 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŒพ man farmer: light skin tone +1F468 1F3FC 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŒพ man farmer: medium-light skin tone +1F468 1F3FD 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŒพ man farmer: medium skin tone +1F468 1F3FE 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŒพ man farmer: medium-dark skin tone +1F468 1F3FF 200D 1F33E ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŒพ man farmer: dark skin tone +1F469 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŒพ woman farmer +1F469 1F3FB 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŒพ woman farmer: light skin tone +1F469 1F3FC 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŒพ woman farmer: medium-light skin tone +1F469 1F3FD 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŒพ woman farmer: medium skin tone +1F469 1F3FE 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŒพ woman farmer: medium-dark skin tone +1F469 1F3FF 200D 1F33E ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŒพ woman farmer: dark skin tone +1F468 200D 1F373 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿณ man cook +1F468 1F3FB 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿณ man cook: light skin tone +1F468 1F3FC 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿณ man cook: medium-light skin tone +1F468 1F3FD 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿณ man cook: medium skin tone +1F468 1F3FE 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿณ man cook: medium-dark skin tone +1F468 1F3FF 200D 1F373 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿณ man cook: dark skin tone +1F469 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿณ woman cook +1F469 1F3FB 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿณ woman cook: light skin tone +1F469 1F3FC 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿณ woman cook: medium-light skin tone +1F469 1F3FD 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿณ woman cook: medium skin tone +1F469 1F3FE 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿณ woman cook: medium-dark skin tone +1F469 1F3FF 200D 1F373 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿณ woman cook: dark skin tone +1F468 200D 1F527 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ”ง man mechanic +1F468 1F3FB 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ง man mechanic: light skin tone +1F468 1F3FC 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ง man mechanic: medium-light skin tone +1F468 1F3FD 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ง man mechanic: medium skin tone +1F468 1F3FE 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ง man mechanic: medium-dark skin tone +1F468 1F3FF 200D 1F527 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ง man mechanic: dark skin tone +1F469 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ”ง woman mechanic +1F469 1F3FB 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ง woman mechanic: light skin tone +1F469 1F3FC 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ง woman mechanic: medium-light skin tone +1F469 1F3FD 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ง woman mechanic: medium skin tone +1F469 1F3FE 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ง woman mechanic: medium-dark skin tone +1F469 1F3FF 200D 1F527 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ง woman mechanic: dark skin tone +1F468 200D 1F3ED ; fully-qualified # ๐Ÿ‘จโ€๐Ÿญ man factory worker +1F468 1F3FB 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿญ man factory worker: light skin tone +1F468 1F3FC 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿญ man factory worker: medium-light skin tone +1F468 1F3FD 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿญ man factory worker: medium skin tone +1F468 1F3FE 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿญ man factory worker: medium-dark skin tone +1F468 1F3FF 200D 1F3ED ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿญ man factory worker: dark skin tone +1F469 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿญ woman factory worker +1F469 1F3FB 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿญ woman factory worker: light skin tone +1F469 1F3FC 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿญ woman factory worker: medium-light skin tone +1F469 1F3FD 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ woman factory worker: medium skin tone +1F469 1F3FE 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿญ woman factory worker: medium-dark skin tone +1F469 1F3FF 200D 1F3ED ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿญ woman factory worker: dark skin tone +1F468 200D 1F4BC ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ’ผ man office worker +1F468 1F3FB 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ผ man office worker: light skin tone +1F468 1F3FC 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ผ man office worker: medium-light skin tone +1F468 1F3FD 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ผ man office worker: medium skin tone +1F468 1F3FE 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ผ man office worker: medium-dark skin tone +1F468 1F3FF 200D 1F4BC ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ผ man office worker: dark skin tone +1F469 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ’ผ woman office worker +1F469 1F3FB 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ผ woman office worker: light skin tone +1F469 1F3FC 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ผ woman office worker: medium-light skin tone +1F469 1F3FD 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ผ woman office worker: medium skin tone +1F469 1F3FE 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ผ woman office worker: medium-dark skin tone +1F469 1F3FF 200D 1F4BC ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ผ woman office worker: dark skin tone +1F468 200D 1F52C ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ”ฌ man scientist +1F468 1F3FB 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ฌ man scientist: light skin tone +1F468 1F3FC 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ฌ man scientist: medium-light skin tone +1F468 1F3FD 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ฌ man scientist: medium skin tone +1F468 1F3FE 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ฌ man scientist: medium-dark skin tone +1F468 1F3FF 200D 1F52C ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ฌ man scientist: dark skin tone +1F469 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ”ฌ woman scientist +1F469 1F3FB 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ฌ woman scientist: light skin tone +1F469 1F3FC 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ฌ woman scientist: medium-light skin tone +1F469 1F3FD 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ฌ woman scientist: medium skin tone +1F469 1F3FE 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ฌ woman scientist: medium-dark skin tone +1F469 1F3FF 200D 1F52C ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ฌ woman scientist: dark skin tone +1F468 200D 1F4BB ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ’ป man technologist +1F468 1F3FB 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป man technologist: light skin tone +1F468 1F3FC 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ป man technologist: medium-light skin tone +1F468 1F3FD 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป man technologist: medium skin tone +1F468 1F3FE 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป man technologist: medium-dark skin tone +1F468 1F3FF 200D 1F4BB ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ป man technologist: dark skin tone +1F469 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ’ป woman technologist +1F469 1F3FB 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป woman technologist: light skin tone +1F469 1F3FC 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ป woman technologist: medium-light skin tone +1F469 1F3FD 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป woman technologist: medium skin tone +1F469 1F3FE 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ป woman technologist: medium-dark skin tone +1F469 1F3FF 200D 1F4BB ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป woman technologist: dark skin tone +1F468 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จโ€๐ŸŽค man singer +1F468 1F3FB 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŽค man singer: light skin tone +1F468 1F3FC 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŽค man singer: medium-light skin tone +1F468 1F3FD 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŽค man singer: medium skin tone +1F468 1F3FE 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŽค man singer: medium-dark skin tone +1F468 1F3FF 200D 1F3A4 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŽค man singer: dark skin tone +1F469 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŽค woman singer +1F469 1F3FB 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽค woman singer: light skin tone +1F469 1F3FC 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽค woman singer: medium-light skin tone +1F469 1F3FD 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽค woman singer: medium skin tone +1F469 1F3FE 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽค woman singer: medium-dark skin tone +1F469 1F3FF 200D 1F3A4 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽค woman singer: dark skin tone +1F468 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จโ€๐ŸŽจ man artist +1F468 1F3FB 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ man artist: light skin tone +1F468 1F3FC 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐ŸŽจ man artist: medium-light skin tone +1F468 1F3FD 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐ŸŽจ man artist: medium skin tone +1F468 1F3FE 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐ŸŽจ man artist: medium-dark skin tone +1F468 1F3FF 200D 1F3A8 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐ŸŽจ man artist: dark skin tone +1F469 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉโ€๐ŸŽจ woman artist +1F469 1F3FB 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽจ woman artist: light skin tone +1F469 1F3FC 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽจ woman artist: medium-light skin tone +1F469 1F3FD 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽจ woman artist: medium skin tone +1F469 1F3FE 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽจ woman artist: medium-dark skin tone +1F469 1F3FF 200D 1F3A8 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽจ woman artist: dark skin tone +1F468 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จโ€โœˆ๏ธ man pilot +1F468 200D 2708 ; non-fully-qualified # ๐Ÿ‘จโ€โœˆ man pilot +1F468 1F3FB 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โœˆ๏ธ man pilot: light skin tone +1F468 1F3FB 200D 2708 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿปโ€โœˆ man pilot: light skin tone +1F468 1F3FC 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โœˆ๏ธ man pilot: medium-light skin tone +1F468 1F3FC 200D 2708 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿผโ€โœˆ man pilot: medium-light skin tone +1F468 1F3FD 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โœˆ๏ธ man pilot: medium skin tone +1F468 1F3FD 200D 2708 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€โœˆ man pilot: medium skin tone +1F468 1F3FE 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โœˆ๏ธ man pilot: medium-dark skin tone +1F468 1F3FE 200D 2708 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿพโ€โœˆ man pilot: medium-dark skin tone +1F468 1F3FF 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โœˆ๏ธ man pilot: dark skin tone +1F468 1F3FF 200D 2708 ; non-fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€โœˆ man pilot: dark skin tone +1F469 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉโ€โœˆ๏ธ woman pilot +1F469 200D 2708 ; non-fully-qualified # ๐Ÿ‘ฉโ€โœˆ woman pilot +1F469 1F3FB 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โœˆ๏ธ woman pilot: light skin tone +1F469 1F3FB 200D 2708 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€โœˆ woman pilot: light skin tone +1F469 1F3FC 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โœˆ๏ธ woman pilot: medium-light skin tone +1F469 1F3FC 200D 2708 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€โœˆ woman pilot: medium-light skin tone +1F469 1F3FD 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โœˆ๏ธ woman pilot: medium skin tone +1F469 1F3FD 200D 2708 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€โœˆ woman pilot: medium skin tone +1F469 1F3FE 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โœˆ๏ธ woman pilot: medium-dark skin tone +1F469 1F3FE 200D 2708 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€โœˆ woman pilot: medium-dark skin tone +1F469 1F3FF 200D 2708 FE0F ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โœˆ๏ธ woman pilot: dark skin tone +1F469 1F3FF 200D 2708 ; non-fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€โœˆ woman pilot: dark skin tone +1F468 200D 1F680 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿš€ man astronaut +1F468 1F3FB 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿš€ man astronaut: light skin tone +1F468 1F3FC 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿš€ man astronaut: medium-light skin tone +1F468 1F3FD 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿš€ man astronaut: medium skin tone +1F468 1F3FE 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿš€ man astronaut: medium-dark skin tone +1F468 1F3FF 200D 1F680 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿš€ man astronaut: dark skin tone +1F469 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿš€ woman astronaut +1F469 1F3FB 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš€ woman astronaut: light skin tone +1F469 1F3FC 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš€ woman astronaut: medium-light skin tone +1F469 1F3FD 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš€ woman astronaut: medium skin tone +1F469 1F3FE 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš€ woman astronaut: medium-dark skin tone +1F469 1F3FF 200D 1F680 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš€ woman astronaut: dark skin tone +1F468 200D 1F692 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿš’ man firefighter +1F468 1F3FB 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿš’ man firefighter: light skin tone +1F468 1F3FC 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿš’ man firefighter: medium-light skin tone +1F468 1F3FD 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿš’ man firefighter: medium skin tone +1F468 1F3FE 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿš’ man firefighter: medium-dark skin tone +1F468 1F3FF 200D 1F692 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿš’ man firefighter: dark skin tone +1F469 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿš’ woman firefighter +1F469 1F3FB 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš’ woman firefighter: light skin tone +1F469 1F3FC 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš’ woman firefighter: medium-light skin tone +1F469 1F3FD 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš’ woman firefighter: medium skin tone +1F469 1F3FE 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš’ woman firefighter: medium-dark skin tone +1F469 1F3FF 200D 1F692 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš’ woman firefighter: dark skin tone +1F46E ; fully-qualified # ๐Ÿ‘ฎ police officer +1F46E 1F3FB ; fully-qualified # ๐Ÿ‘ฎ๐Ÿป police officer: light skin tone +1F46E 1F3FC ; fully-qualified # ๐Ÿ‘ฎ๐Ÿผ police officer: medium-light skin tone +1F46E 1F3FD ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฝ police officer: medium skin tone +1F46E 1F3FE ; fully-qualified # ๐Ÿ‘ฎ๐Ÿพ police officer: medium-dark skin tone +1F46E 1F3FF ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฟ police officer: dark skin tone +1F46E 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎโ€โ™‚๏ธ man police officer +1F46E 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฎโ€โ™‚ man police officer +1F46E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™‚๏ธ man police officer: light skin tone +1F46E 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™‚ man police officer: light skin tone +1F46E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™‚๏ธ man police officer: medium-light skin tone +1F46E 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™‚ man police officer: medium-light skin tone +1F46E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™‚๏ธ man police officer: medium skin tone +1F46E 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™‚ man police officer: medium skin tone +1F46E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™‚๏ธ man police officer: medium-dark skin tone +1F46E 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™‚ man police officer: medium-dark skin tone +1F46E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™‚๏ธ man police officer: dark skin tone +1F46E 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™‚ man police officer: dark skin tone +1F46E 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎโ€โ™€๏ธ woman police officer +1F46E 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฎโ€โ™€ woman police officer +1F46E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™€๏ธ woman police officer: light skin tone +1F46E 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿปโ€โ™€ woman police officer: light skin tone +1F46E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™€๏ธ woman police officer: medium-light skin tone +1F46E 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿผโ€โ™€ woman police officer: medium-light skin tone +1F46E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™€๏ธ woman police officer: medium skin tone +1F46E 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿฝโ€โ™€ woman police officer: medium skin tone +1F46E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™€๏ธ woman police officer: medium-dark skin tone +1F46E 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿพโ€โ™€ woman police officer: medium-dark skin tone +1F46E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™€๏ธ woman police officer: dark skin tone +1F46E 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฎ๐Ÿฟโ€โ™€ woman police officer: dark skin tone +1F575 FE0F ; fully-qualified # ๐Ÿ•ต๏ธ detective +1F575 ; non-fully-qualified # ๐Ÿ•ต detective +1F575 1F3FB ; fully-qualified # ๐Ÿ•ต๐Ÿป detective: light skin tone +1F575 1F3FC ; fully-qualified # ๐Ÿ•ต๐Ÿผ detective: medium-light skin tone +1F575 1F3FD ; fully-qualified # ๐Ÿ•ต๐Ÿฝ detective: medium skin tone +1F575 1F3FE ; fully-qualified # ๐Ÿ•ต๐Ÿพ detective: medium-dark skin tone +1F575 1F3FF ; fully-qualified # ๐Ÿ•ต๐Ÿฟ detective: dark skin tone +1F575 FE0F 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๏ธโ€โ™‚๏ธ man detective +1F575 200D 2642 FE0F ; non-fully-qualified # ๐Ÿ•ตโ€โ™‚๏ธ man detective +1F575 FE0F 200D 2642 ; non-fully-qualified # ๐Ÿ•ต๏ธโ€โ™‚ man detective +1F575 200D 2642 ; non-fully-qualified # ๐Ÿ•ตโ€โ™‚ man detective +1F575 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™‚๏ธ man detective: light skin tone +1F575 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™‚ man detective: light skin tone +1F575 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿผโ€โ™‚๏ธ man detective: medium-light skin tone +1F575 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ•ต๐Ÿผโ€โ™‚ man detective: medium-light skin tone +1F575 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™‚๏ธ man detective: medium skin tone +1F575 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™‚ man detective: medium skin tone +1F575 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿพโ€โ™‚๏ธ man detective: medium-dark skin tone +1F575 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ•ต๐Ÿพโ€โ™‚ man detective: medium-dark skin tone +1F575 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™‚๏ธ man detective: dark skin tone +1F575 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™‚ man detective: dark skin tone +1F575 FE0F 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๏ธโ€โ™€๏ธ woman detective +1F575 200D 2640 FE0F ; non-fully-qualified # ๐Ÿ•ตโ€โ™€๏ธ woman detective +1F575 FE0F 200D 2640 ; non-fully-qualified # ๐Ÿ•ต๏ธโ€โ™€ woman detective +1F575 200D 2640 ; non-fully-qualified # ๐Ÿ•ตโ€โ™€ woman detective +1F575 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™€๏ธ woman detective: light skin tone +1F575 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ•ต๐Ÿปโ€โ™€ woman detective: light skin tone +1F575 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿผโ€โ™€๏ธ woman detective: medium-light skin tone +1F575 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ•ต๐Ÿผโ€โ™€ woman detective: medium-light skin tone +1F575 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™€๏ธ woman detective: medium skin tone +1F575 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ•ต๐Ÿฝโ€โ™€ woman detective: medium skin tone +1F575 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿพโ€โ™€๏ธ woman detective: medium-dark skin tone +1F575 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ•ต๐Ÿพโ€โ™€ woman detective: medium-dark skin tone +1F575 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™€๏ธ woman detective: dark skin tone +1F575 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ•ต๐Ÿฟโ€โ™€ woman detective: dark skin tone +1F482 ; fully-qualified # ๐Ÿ’‚ guard +1F482 1F3FB ; fully-qualified # ๐Ÿ’‚๐Ÿป guard: light skin tone +1F482 1F3FC ; fully-qualified # ๐Ÿ’‚๐Ÿผ guard: medium-light skin tone +1F482 1F3FD ; fully-qualified # ๐Ÿ’‚๐Ÿฝ guard: medium skin tone +1F482 1F3FE ; fully-qualified # ๐Ÿ’‚๐Ÿพ guard: medium-dark skin tone +1F482 1F3FF ; fully-qualified # ๐Ÿ’‚๐Ÿฟ guard: dark skin tone +1F482 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚โ€โ™‚๏ธ man guard +1F482 200D 2642 ; non-fully-qualified # ๐Ÿ’‚โ€โ™‚ man guard +1F482 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿปโ€โ™‚๏ธ man guard: light skin tone +1F482 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ’‚๐Ÿปโ€โ™‚ man guard: light skin tone +1F482 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿผโ€โ™‚๏ธ man guard: medium-light skin tone +1F482 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ’‚๐Ÿผโ€โ™‚ man guard: medium-light skin tone +1F482 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™‚๏ธ man guard: medium skin tone +1F482 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™‚ man guard: medium skin tone +1F482 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿพโ€โ™‚๏ธ man guard: medium-dark skin tone +1F482 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ’‚๐Ÿพโ€โ™‚ man guard: medium-dark skin tone +1F482 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™‚๏ธ man guard: dark skin tone +1F482 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™‚ man guard: dark skin tone +1F482 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚โ€โ™€๏ธ woman guard +1F482 200D 2640 ; non-fully-qualified # ๐Ÿ’‚โ€โ™€ woman guard +1F482 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿปโ€โ™€๏ธ woman guard: light skin tone +1F482 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ’‚๐Ÿปโ€โ™€ woman guard: light skin tone +1F482 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿผโ€โ™€๏ธ woman guard: medium-light skin tone +1F482 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ’‚๐Ÿผโ€โ™€ woman guard: medium-light skin tone +1F482 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™€๏ธ woman guard: medium skin tone +1F482 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ’‚๐Ÿฝโ€โ™€ woman guard: medium skin tone +1F482 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿพโ€โ™€๏ธ woman guard: medium-dark skin tone +1F482 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ’‚๐Ÿพโ€โ™€ woman guard: medium-dark skin tone +1F482 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™€๏ธ woman guard: dark skin tone +1F482 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ’‚๐Ÿฟโ€โ™€ woman guard: dark skin tone +1F477 ; fully-qualified # ๐Ÿ‘ท construction worker +1F477 1F3FB ; fully-qualified # ๐Ÿ‘ท๐Ÿป construction worker: light skin tone +1F477 1F3FC ; fully-qualified # ๐Ÿ‘ท๐Ÿผ construction worker: medium-light skin tone +1F477 1F3FD ; fully-qualified # ๐Ÿ‘ท๐Ÿฝ construction worker: medium skin tone +1F477 1F3FE ; fully-qualified # ๐Ÿ‘ท๐Ÿพ construction worker: medium-dark skin tone +1F477 1F3FF ; fully-qualified # ๐Ÿ‘ท๐Ÿฟ construction worker: dark skin tone +1F477 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ทโ€โ™‚๏ธ man construction worker +1F477 200D 2642 ; non-fully-qualified # ๐Ÿ‘ทโ€โ™‚ man construction worker +1F477 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™‚๏ธ man construction worker: light skin tone +1F477 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™‚ man construction worker: light skin tone +1F477 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™‚๏ธ man construction worker: medium-light skin tone +1F477 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™‚ man construction worker: medium-light skin tone +1F477 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™‚๏ธ man construction worker: medium skin tone +1F477 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™‚ man construction worker: medium skin tone +1F477 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™‚๏ธ man construction worker: medium-dark skin tone +1F477 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™‚ man construction worker: medium-dark skin tone +1F477 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™‚๏ธ man construction worker: dark skin tone +1F477 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™‚ man construction worker: dark skin tone +1F477 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ทโ€โ™€๏ธ woman construction worker +1F477 200D 2640 ; non-fully-qualified # ๐Ÿ‘ทโ€โ™€ woman construction worker +1F477 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™€๏ธ woman construction worker: light skin tone +1F477 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿปโ€โ™€ woman construction worker: light skin tone +1F477 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™€๏ธ woman construction worker: medium-light skin tone +1F477 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿผโ€โ™€ woman construction worker: medium-light skin tone +1F477 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™€๏ธ woman construction worker: medium skin tone +1F477 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿฝโ€โ™€ woman construction worker: medium skin tone +1F477 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™€๏ธ woman construction worker: medium-dark skin tone +1F477 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿพโ€โ™€ woman construction worker: medium-dark skin tone +1F477 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™€๏ธ woman construction worker: dark skin tone +1F477 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ‘ท๐Ÿฟโ€โ™€ woman construction worker: dark skin tone +1F934 ; fully-qualified # ๐Ÿคด prince +1F934 1F3FB ; fully-qualified # ๐Ÿคด๐Ÿป prince: light skin tone +1F934 1F3FC ; fully-qualified # ๐Ÿคด๐Ÿผ prince: medium-light skin tone +1F934 1F3FD ; fully-qualified # ๐Ÿคด๐Ÿฝ prince: medium skin tone +1F934 1F3FE ; fully-qualified # ๐Ÿคด๐Ÿพ prince: medium-dark skin tone +1F934 1F3FF ; fully-qualified # ๐Ÿคด๐Ÿฟ prince: dark skin tone +1F478 ; fully-qualified # ๐Ÿ‘ธ princess +1F478 1F3FB ; fully-qualified # ๐Ÿ‘ธ๐Ÿป princess: light skin tone +1F478 1F3FC ; fully-qualified # ๐Ÿ‘ธ๐Ÿผ princess: medium-light skin tone +1F478 1F3FD ; fully-qualified # ๐Ÿ‘ธ๐Ÿฝ princess: medium skin tone +1F478 1F3FE ; fully-qualified # ๐Ÿ‘ธ๐Ÿพ princess: medium-dark skin tone +1F478 1F3FF ; fully-qualified # ๐Ÿ‘ธ๐Ÿฟ princess: dark skin tone +1F473 ; fully-qualified # ๐Ÿ‘ณ person wearing turban +1F473 1F3FB ; fully-qualified # ๐Ÿ‘ณ๐Ÿป person wearing turban: light skin tone +1F473 1F3FC ; fully-qualified # ๐Ÿ‘ณ๐Ÿผ person wearing turban: medium-light skin tone +1F473 1F3FD ; fully-qualified # ๐Ÿ‘ณ๐Ÿฝ person wearing turban: medium skin tone +1F473 1F3FE ; fully-qualified # ๐Ÿ‘ณ๐Ÿพ person wearing turban: medium-dark skin tone +1F473 1F3FF ; fully-qualified # ๐Ÿ‘ณ๐Ÿฟ person wearing turban: dark skin tone +1F473 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณโ€โ™‚๏ธ man wearing turban +1F473 200D 2642 ; non-fully-qualified # ๐Ÿ‘ณโ€โ™‚ man wearing turban +1F473 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™‚๏ธ man wearing turban: light skin tone +1F473 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™‚ man wearing turban: light skin tone +1F473 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™‚๏ธ man wearing turban: medium-light skin tone +1F473 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™‚ man wearing turban: medium-light skin tone +1F473 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™‚๏ธ man wearing turban: medium skin tone +1F473 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™‚ man wearing turban: medium skin tone +1F473 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™‚๏ธ man wearing turban: medium-dark skin tone +1F473 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™‚ man wearing turban: medium-dark skin tone +1F473 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™‚๏ธ man wearing turban: dark skin tone +1F473 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™‚ man wearing turban: dark skin tone +1F473 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณโ€โ™€๏ธ woman wearing turban +1F473 200D 2640 ; non-fully-qualified # ๐Ÿ‘ณโ€โ™€ woman wearing turban +1F473 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™€๏ธ woman wearing turban: light skin tone +1F473 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿปโ€โ™€ woman wearing turban: light skin tone +1F473 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™€๏ธ woman wearing turban: medium-light skin tone +1F473 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿผโ€โ™€ woman wearing turban: medium-light skin tone +1F473 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™€๏ธ woman wearing turban: medium skin tone +1F473 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿฝโ€โ™€ woman wearing turban: medium skin tone +1F473 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™€๏ธ woman wearing turban: medium-dark skin tone +1F473 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿพโ€โ™€ woman wearing turban: medium-dark skin tone +1F473 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™€๏ธ woman wearing turban: dark skin tone +1F473 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ‘ณ๐Ÿฟโ€โ™€ woman wearing turban: dark skin tone +1F472 ; fully-qualified # ๐Ÿ‘ฒ man with Chinese cap +1F472 1F3FB ; fully-qualified # ๐Ÿ‘ฒ๐Ÿป man with Chinese cap: light skin tone +1F472 1F3FC ; fully-qualified # ๐Ÿ‘ฒ๐Ÿผ man with Chinese cap: medium-light skin tone +1F472 1F3FD ; fully-qualified # ๐Ÿ‘ฒ๐Ÿฝ man with Chinese cap: medium skin tone +1F472 1F3FE ; fully-qualified # ๐Ÿ‘ฒ๐Ÿพ man with Chinese cap: medium-dark skin tone +1F472 1F3FF ; fully-qualified # ๐Ÿ‘ฒ๐Ÿฟ man with Chinese cap: dark skin tone +1F9D5 ; fully-qualified # ๐Ÿง• woman with headscarf +1F9D5 1F3FB ; fully-qualified # ๐Ÿง•๐Ÿป woman with headscarf: light skin tone +1F9D5 1F3FC ; fully-qualified # ๐Ÿง•๐Ÿผ woman with headscarf: medium-light skin tone +1F9D5 1F3FD ; fully-qualified # ๐Ÿง•๐Ÿฝ woman with headscarf: medium skin tone +1F9D5 1F3FE ; fully-qualified # ๐Ÿง•๐Ÿพ woman with headscarf: medium-dark skin tone +1F9D5 1F3FF ; fully-qualified # ๐Ÿง•๐Ÿฟ woman with headscarf: dark skin tone +1F9D4 ; fully-qualified # ๐Ÿง” bearded person +1F9D4 1F3FB ; fully-qualified # ๐Ÿง”๐Ÿป bearded person: light skin tone +1F9D4 1F3FC ; fully-qualified # ๐Ÿง”๐Ÿผ bearded person: medium-light skin tone +1F9D4 1F3FD ; fully-qualified # ๐Ÿง”๐Ÿฝ bearded person: medium skin tone +1F9D4 1F3FE ; fully-qualified # ๐Ÿง”๐Ÿพ bearded person: medium-dark skin tone +1F9D4 1F3FF ; fully-qualified # ๐Ÿง”๐Ÿฟ bearded person: dark skin tone +1F471 ; fully-qualified # ๐Ÿ‘ฑ blond-haired person +1F471 1F3FB ; fully-qualified # ๐Ÿ‘ฑ๐Ÿป blond-haired person: light skin tone +1F471 1F3FC ; fully-qualified # ๐Ÿ‘ฑ๐Ÿผ blond-haired person: medium-light skin tone +1F471 1F3FD ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฝ blond-haired person: medium skin tone +1F471 1F3FE ; fully-qualified # ๐Ÿ‘ฑ๐Ÿพ blond-haired person: medium-dark skin tone +1F471 1F3FF ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฟ blond-haired person: dark skin tone +1F471 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑโ€โ™‚๏ธ blond-haired man +1F471 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฑโ€โ™‚ blond-haired man +1F471 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™‚๏ธ blond-haired man: light skin tone +1F471 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™‚ blond-haired man: light skin tone +1F471 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™‚๏ธ blond-haired man: medium-light skin tone +1F471 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™‚ blond-haired man: medium-light skin tone +1F471 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™‚๏ธ blond-haired man: medium skin tone +1F471 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™‚ blond-haired man: medium skin tone +1F471 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™‚๏ธ blond-haired man: medium-dark skin tone +1F471 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™‚ blond-haired man: medium-dark skin tone +1F471 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™‚๏ธ blond-haired man: dark skin tone +1F471 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™‚ blond-haired man: dark skin tone +1F471 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑโ€โ™€๏ธ blond-haired woman +1F471 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฑโ€โ™€ blond-haired woman +1F471 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™€๏ธ blond-haired woman: light skin tone +1F471 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿปโ€โ™€ blond-haired woman: light skin tone +1F471 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™€๏ธ blond-haired woman: medium-light skin tone +1F471 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿผโ€โ™€ blond-haired woman: medium-light skin tone +1F471 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™€๏ธ blond-haired woman: medium skin tone +1F471 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿฝโ€โ™€ blond-haired woman: medium skin tone +1F471 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™€๏ธ blond-haired woman: medium-dark skin tone +1F471 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿพโ€โ™€ blond-haired woman: medium-dark skin tone +1F471 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™€๏ธ blond-haired woman: dark skin tone +1F471 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฑ๐Ÿฟโ€โ™€ blond-haired woman: dark skin tone +1F468 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฐ man, red haired +1F468 1F3FB 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฐ man, red haired: light skin tone +1F468 1F3FC 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฐ man, red haired: medium-light skin tone +1F468 1F3FD 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฐ man, red haired: medium skin tone +1F468 1F3FE 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฐ man, red haired: medium-dark skin tone +1F468 1F3FF 200D 1F9B0 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฐ man, red haired: dark skin tone +1F469 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฐ woman, red haired +1F469 1F3FB 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฐ woman, red haired: light skin tone +1F469 1F3FC 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฐ woman, red haired: medium-light skin tone +1F469 1F3FD 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฐ woman, red haired: medium skin tone +1F469 1F3FE 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฐ woman, red haired: medium-dark skin tone +1F469 1F3FF 200D 1F9B0 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฐ woman, red haired: dark skin tone +1F468 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฑ man, curly haired +1F468 1F3FB 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฑ man, curly haired: light skin tone +1F468 1F3FC 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฑ man, curly haired: medium-light skin tone +1F468 1F3FD 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฑ man, curly haired: medium skin tone +1F468 1F3FE 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฑ man, curly haired: medium-dark skin tone +1F468 1F3FF 200D 1F9B1 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฑ man, curly haired: dark skin tone +1F469 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฑ woman, curly haired +1F469 1F3FB 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฑ woman, curly haired: light skin tone +1F469 1F3FC 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฑ woman, curly haired: medium-light skin tone +1F469 1F3FD 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฑ woman, curly haired: medium skin tone +1F469 1F3FE 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฑ woman, curly haired: medium-dark skin tone +1F469 1F3FF 200D 1F9B1 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฑ woman, curly haired: dark skin tone +1F468 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆฒ man, bald +1F468 1F3FB 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฒ man, bald: light skin tone +1F468 1F3FC 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฒ man, bald: medium-light skin tone +1F468 1F3FD 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฒ man, bald: medium skin tone +1F468 1F3FE 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฒ man, bald: medium-dark skin tone +1F468 1F3FF 200D 1F9B2 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฒ man, bald: dark skin tone +1F469 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆฒ woman, bald +1F469 1F3FB 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฒ woman, bald: light skin tone +1F469 1F3FC 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฒ woman, bald: medium-light skin tone +1F469 1F3FD 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฒ woman, bald: medium skin tone +1F469 1F3FE 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฒ woman, bald: medium-dark skin tone +1F469 1F3FF 200D 1F9B2 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฒ woman, bald: dark skin tone +1F468 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿฆณ man, white haired +1F468 1F3FB 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿปโ€๐Ÿฆณ man, white haired: light skin tone +1F468 1F3FC 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿผโ€๐Ÿฆณ man, white haired: medium-light skin tone +1F468 1F3FD 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆณ man, white haired: medium skin tone +1F468 1F3FE 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿพโ€๐Ÿฆณ man, white haired: medium-dark skin tone +1F468 1F3FF 200D 1F9B3 ; fully-qualified # ๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆณ man, white haired: dark skin tone +1F469 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿฆณ woman, white haired +1F469 1F3FB 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆณ woman, white haired: light skin tone +1F469 1F3FC 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆณ woman, white haired: medium-light skin tone +1F469 1F3FD 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆณ woman, white haired: medium skin tone +1F469 1F3FE 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆณ woman, white haired: medium-dark skin tone +1F469 1F3FF 200D 1F9B3 ; fully-qualified # ๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆณ woman, white haired: dark skin tone +1F935 ; fully-qualified # ๐Ÿคต man in tuxedo +1F935 1F3FB ; fully-qualified # ๐Ÿคต๐Ÿป man in tuxedo: light skin tone +1F935 1F3FC ; fully-qualified # ๐Ÿคต๐Ÿผ man in tuxedo: medium-light skin tone +1F935 1F3FD ; fully-qualified # ๐Ÿคต๐Ÿฝ man in tuxedo: medium skin tone +1F935 1F3FE ; fully-qualified # ๐Ÿคต๐Ÿพ man in tuxedo: medium-dark skin tone +1F935 1F3FF ; fully-qualified # ๐Ÿคต๐Ÿฟ man in tuxedo: dark skin tone +1F470 ; fully-qualified # ๐Ÿ‘ฐ bride with veil +1F470 1F3FB ; fully-qualified # ๐Ÿ‘ฐ๐Ÿป bride with veil: light skin tone +1F470 1F3FC ; fully-qualified # ๐Ÿ‘ฐ๐Ÿผ bride with veil: medium-light skin tone +1F470 1F3FD ; fully-qualified # ๐Ÿ‘ฐ๐Ÿฝ bride with veil: medium skin tone +1F470 1F3FE ; fully-qualified # ๐Ÿ‘ฐ๐Ÿพ bride with veil: medium-dark skin tone +1F470 1F3FF ; fully-qualified # ๐Ÿ‘ฐ๐Ÿฟ bride with veil: dark skin tone +1F930 ; fully-qualified # ๐Ÿคฐ pregnant woman +1F930 1F3FB ; fully-qualified # ๐Ÿคฐ๐Ÿป pregnant woman: light skin tone +1F930 1F3FC ; fully-qualified # ๐Ÿคฐ๐Ÿผ pregnant woman: medium-light skin tone +1F930 1F3FD ; fully-qualified # ๐Ÿคฐ๐Ÿฝ pregnant woman: medium skin tone +1F930 1F3FE ; fully-qualified # ๐Ÿคฐ๐Ÿพ pregnant woman: medium-dark skin tone +1F930 1F3FF ; fully-qualified # ๐Ÿคฐ๐Ÿฟ pregnant woman: dark skin tone +1F931 ; fully-qualified # ๐Ÿคฑ breast-feeding +1F931 1F3FB ; fully-qualified # ๐Ÿคฑ๐Ÿป breast-feeding: light skin tone +1F931 1F3FC ; fully-qualified # ๐Ÿคฑ๐Ÿผ breast-feeding: medium-light skin tone +1F931 1F3FD ; fully-qualified # ๐Ÿคฑ๐Ÿฝ breast-feeding: medium skin tone +1F931 1F3FE ; fully-qualified # ๐Ÿคฑ๐Ÿพ breast-feeding: medium-dark skin tone +1F931 1F3FF ; fully-qualified # ๐Ÿคฑ๐Ÿฟ breast-feeding: dark skin tone + +# subgroup: person-fantasy +1F47C ; fully-qualified # ๐Ÿ‘ผ baby angel +1F47C 1F3FB ; fully-qualified # ๐Ÿ‘ผ๐Ÿป baby angel: light skin tone +1F47C 1F3FC ; fully-qualified # ๐Ÿ‘ผ๐Ÿผ baby angel: medium-light skin tone +1F47C 1F3FD ; fully-qualified # ๐Ÿ‘ผ๐Ÿฝ baby angel: medium skin tone +1F47C 1F3FE ; fully-qualified # ๐Ÿ‘ผ๐Ÿพ baby angel: medium-dark skin tone +1F47C 1F3FF ; fully-qualified # ๐Ÿ‘ผ๐Ÿฟ baby angel: dark skin tone +1F385 ; fully-qualified # ๐ŸŽ… Santa Claus +1F385 1F3FB ; fully-qualified # ๐ŸŽ…๐Ÿป Santa Claus: light skin tone +1F385 1F3FC ; fully-qualified # ๐ŸŽ…๐Ÿผ Santa Claus: medium-light skin tone +1F385 1F3FD ; fully-qualified # ๐ŸŽ…๐Ÿฝ Santa Claus: medium skin tone +1F385 1F3FE ; fully-qualified # ๐ŸŽ…๐Ÿพ Santa Claus: medium-dark skin tone +1F385 1F3FF ; fully-qualified # ๐ŸŽ…๐Ÿฟ Santa Claus: dark skin tone +1F936 ; fully-qualified # ๐Ÿคถ Mrs. Claus +1F936 1F3FB ; fully-qualified # ๐Ÿคถ๐Ÿป Mrs. Claus: light skin tone +1F936 1F3FC ; fully-qualified # ๐Ÿคถ๐Ÿผ Mrs. Claus: medium-light skin tone +1F936 1F3FD ; fully-qualified # ๐Ÿคถ๐Ÿฝ Mrs. Claus: medium skin tone +1F936 1F3FE ; fully-qualified # ๐Ÿคถ๐Ÿพ Mrs. Claus: medium-dark skin tone +1F936 1F3FF ; fully-qualified # ๐Ÿคถ๐Ÿฟ Mrs. Claus: dark skin tone +1F9B8 ; fully-qualified # ๐Ÿฆธ superhero +1F9B8 1F3FB ; fully-qualified # ๐Ÿฆธ๐Ÿป superhero: light skin tone +1F9B8 1F3FC ; fully-qualified # ๐Ÿฆธ๐Ÿผ superhero: medium-light skin tone +1F9B8 1F3FD ; fully-qualified # ๐Ÿฆธ๐Ÿฝ superhero: medium skin tone +1F9B8 1F3FE ; fully-qualified # ๐Ÿฆธ๐Ÿพ superhero: medium-dark skin tone +1F9B8 1F3FF ; fully-qualified # ๐Ÿฆธ๐Ÿฟ superhero: dark skin tone +1F9B8 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธโ€โ™€๏ธ woman superhero +1F9B8 200D 2640 ; non-fully-qualified # ๐Ÿฆธโ€โ™€ woman superhero +1F9B8 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿปโ€โ™€๏ธ woman superhero: light skin tone +1F9B8 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿฆธ๐Ÿปโ€โ™€ woman superhero: light skin tone +1F9B8 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿผโ€โ™€๏ธ woman superhero: medium-light skin tone +1F9B8 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿฆธ๐Ÿผโ€โ™€ woman superhero: medium-light skin tone +1F9B8 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™€๏ธ woman superhero: medium skin tone +1F9B8 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™€ woman superhero: medium skin tone +1F9B8 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿพโ€โ™€๏ธ woman superhero: medium-dark skin tone +1F9B8 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿฆธ๐Ÿพโ€โ™€ woman superhero: medium-dark skin tone +1F9B8 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™€๏ธ woman superhero: dark skin tone +1F9B8 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™€ woman superhero: dark skin tone +1F9B8 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธโ€โ™‚๏ธ man superhero +1F9B8 200D 2642 ; non-fully-qualified # ๐Ÿฆธโ€โ™‚ man superhero +1F9B8 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿปโ€โ™‚๏ธ man superhero: light skin tone +1F9B8 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿฆธ๐Ÿปโ€โ™‚ man superhero: light skin tone +1F9B8 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿผโ€โ™‚๏ธ man superhero: medium-light skin tone +1F9B8 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿฆธ๐Ÿผโ€โ™‚ man superhero: medium-light skin tone +1F9B8 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™‚๏ธ man superhero: medium skin tone +1F9B8 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿฆธ๐Ÿฝโ€โ™‚ man superhero: medium skin tone +1F9B8 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿพโ€โ™‚๏ธ man superhero: medium-dark skin tone +1F9B8 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿฆธ๐Ÿพโ€โ™‚ man superhero: medium-dark skin tone +1F9B8 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™‚๏ธ man superhero: dark skin tone +1F9B8 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿฆธ๐Ÿฟโ€โ™‚ man superhero: dark skin tone +1F9B9 ; fully-qualified # ๐Ÿฆน supervillain +1F9B9 1F3FB ; fully-qualified # ๐Ÿฆน๐Ÿป supervillain: light skin tone +1F9B9 1F3FC ; fully-qualified # ๐Ÿฆน๐Ÿผ supervillain: medium-light skin tone +1F9B9 1F3FD ; fully-qualified # ๐Ÿฆน๐Ÿฝ supervillain: medium skin tone +1F9B9 1F3FE ; fully-qualified # ๐Ÿฆน๐Ÿพ supervillain: medium-dark skin tone +1F9B9 1F3FF ; fully-qualified # ๐Ÿฆน๐Ÿฟ supervillain: dark skin tone +1F9B9 200D 2640 FE0F ; fully-qualified # ๐Ÿฆนโ€โ™€๏ธ woman supervillain +1F9B9 200D 2640 ; non-fully-qualified # ๐Ÿฆนโ€โ™€ woman supervillain +1F9B9 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿปโ€โ™€๏ธ woman supervillain: light skin tone +1F9B9 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿฆน๐Ÿปโ€โ™€ woman supervillain: light skin tone +1F9B9 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿผโ€โ™€๏ธ woman supervillain: medium-light skin tone +1F9B9 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿฆน๐Ÿผโ€โ™€ woman supervillain: medium-light skin tone +1F9B9 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฝโ€โ™€๏ธ woman supervillain: medium skin tone +1F9B9 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿฆน๐Ÿฝโ€โ™€ woman supervillain: medium skin tone +1F9B9 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿพโ€โ™€๏ธ woman supervillain: medium-dark skin tone +1F9B9 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿฆน๐Ÿพโ€โ™€ woman supervillain: medium-dark skin tone +1F9B9 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฟโ€โ™€๏ธ woman supervillain: dark skin tone +1F9B9 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿฆน๐Ÿฟโ€โ™€ woman supervillain: dark skin tone +1F9B9 200D 2642 FE0F ; fully-qualified # ๐Ÿฆนโ€โ™‚๏ธ man supervillain +1F9B9 200D 2642 ; non-fully-qualified # ๐Ÿฆนโ€โ™‚ man supervillain +1F9B9 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿปโ€โ™‚๏ธ man supervillain: light skin tone +1F9B9 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿฆน๐Ÿปโ€โ™‚ man supervillain: light skin tone +1F9B9 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿผโ€โ™‚๏ธ man supervillain: medium-light skin tone +1F9B9 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿฆน๐Ÿผโ€โ™‚ man supervillain: medium-light skin tone +1F9B9 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฝโ€โ™‚๏ธ man supervillain: medium skin tone +1F9B9 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿฆน๐Ÿฝโ€โ™‚ man supervillain: medium skin tone +1F9B9 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿพโ€โ™‚๏ธ man supervillain: medium-dark skin tone +1F9B9 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿฆน๐Ÿพโ€โ™‚ man supervillain: medium-dark skin tone +1F9B9 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿฆน๐Ÿฟโ€โ™‚๏ธ man supervillain: dark skin tone +1F9B9 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿฆน๐Ÿฟโ€โ™‚ man supervillain: dark skin tone +1F9D9 ; fully-qualified # ๐Ÿง™ mage +1F9D9 1F3FB ; fully-qualified # ๐Ÿง™๐Ÿป mage: light skin tone +1F9D9 1F3FC ; fully-qualified # ๐Ÿง™๐Ÿผ mage: medium-light skin tone +1F9D9 1F3FD ; fully-qualified # ๐Ÿง™๐Ÿฝ mage: medium skin tone +1F9D9 1F3FE ; fully-qualified # ๐Ÿง™๐Ÿพ mage: medium-dark skin tone +1F9D9 1F3FF ; fully-qualified # ๐Ÿง™๐Ÿฟ mage: dark skin tone +1F9D9 200D 2640 FE0F ; fully-qualified # ๐Ÿง™โ€โ™€๏ธ woman mage +1F9D9 200D 2640 ; non-fully-qualified # ๐Ÿง™โ€โ™€ woman mage +1F9D9 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿปโ€โ™€๏ธ woman mage: light skin tone +1F9D9 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿง™๐Ÿปโ€โ™€ woman mage: light skin tone +1F9D9 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿผโ€โ™€๏ธ woman mage: medium-light skin tone +1F9D9 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿง™๐Ÿผโ€โ™€ woman mage: medium-light skin tone +1F9D9 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฝโ€โ™€๏ธ woman mage: medium skin tone +1F9D9 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿง™๐Ÿฝโ€โ™€ woman mage: medium skin tone +1F9D9 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿพโ€โ™€๏ธ woman mage: medium-dark skin tone +1F9D9 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿง™๐Ÿพโ€โ™€ woman mage: medium-dark skin tone +1F9D9 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฟโ€โ™€๏ธ woman mage: dark skin tone +1F9D9 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿง™๐Ÿฟโ€โ™€ woman mage: dark skin tone +1F9D9 200D 2642 FE0F ; fully-qualified # ๐Ÿง™โ€โ™‚๏ธ man mage +1F9D9 200D 2642 ; non-fully-qualified # ๐Ÿง™โ€โ™‚ man mage +1F9D9 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿปโ€โ™‚๏ธ man mage: light skin tone +1F9D9 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿง™๐Ÿปโ€โ™‚ man mage: light skin tone +1F9D9 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿผโ€โ™‚๏ธ man mage: medium-light skin tone +1F9D9 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿง™๐Ÿผโ€โ™‚ man mage: medium-light skin tone +1F9D9 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฝโ€โ™‚๏ธ man mage: medium skin tone +1F9D9 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿง™๐Ÿฝโ€โ™‚ man mage: medium skin tone +1F9D9 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿพโ€โ™‚๏ธ man mage: medium-dark skin tone +1F9D9 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿง™๐Ÿพโ€โ™‚ man mage: medium-dark skin tone +1F9D9 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง™๐Ÿฟโ€โ™‚๏ธ man mage: dark skin tone +1F9D9 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿง™๐Ÿฟโ€โ™‚ man mage: dark skin tone +1F9DA ; fully-qualified # ๐Ÿงš fairy +1F9DA 1F3FB ; fully-qualified # ๐Ÿงš๐Ÿป fairy: light skin tone +1F9DA 1F3FC ; fully-qualified # ๐Ÿงš๐Ÿผ fairy: medium-light skin tone +1F9DA 1F3FD ; fully-qualified # ๐Ÿงš๐Ÿฝ fairy: medium skin tone +1F9DA 1F3FE ; fully-qualified # ๐Ÿงš๐Ÿพ fairy: medium-dark skin tone +1F9DA 1F3FF ; fully-qualified # ๐Ÿงš๐Ÿฟ fairy: dark skin tone +1F9DA 200D 2640 FE0F ; fully-qualified # ๐Ÿงšโ€โ™€๏ธ woman fairy +1F9DA 200D 2640 ; non-fully-qualified # ๐Ÿงšโ€โ™€ woman fairy +1F9DA 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿปโ€โ™€๏ธ woman fairy: light skin tone +1F9DA 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿงš๐Ÿปโ€โ™€ woman fairy: light skin tone +1F9DA 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿผโ€โ™€๏ธ woman fairy: medium-light skin tone +1F9DA 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿงš๐Ÿผโ€โ™€ woman fairy: medium-light skin tone +1F9DA 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฝโ€โ™€๏ธ woman fairy: medium skin tone +1F9DA 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿงš๐Ÿฝโ€โ™€ woman fairy: medium skin tone +1F9DA 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿพโ€โ™€๏ธ woman fairy: medium-dark skin tone +1F9DA 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿงš๐Ÿพโ€โ™€ woman fairy: medium-dark skin tone +1F9DA 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฟโ€โ™€๏ธ woman fairy: dark skin tone +1F9DA 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿงš๐Ÿฟโ€โ™€ woman fairy: dark skin tone +1F9DA 200D 2642 FE0F ; fully-qualified # ๐Ÿงšโ€โ™‚๏ธ man fairy +1F9DA 200D 2642 ; non-fully-qualified # ๐Ÿงšโ€โ™‚ man fairy +1F9DA 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿปโ€โ™‚๏ธ man fairy: light skin tone +1F9DA 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿงš๐Ÿปโ€โ™‚ man fairy: light skin tone +1F9DA 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿผโ€โ™‚๏ธ man fairy: medium-light skin tone +1F9DA 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿงš๐Ÿผโ€โ™‚ man fairy: medium-light skin tone +1F9DA 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฝโ€โ™‚๏ธ man fairy: medium skin tone +1F9DA 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿงš๐Ÿฝโ€โ™‚ man fairy: medium skin tone +1F9DA 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿพโ€โ™‚๏ธ man fairy: medium-dark skin tone +1F9DA 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿงš๐Ÿพโ€โ™‚ man fairy: medium-dark skin tone +1F9DA 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿงš๐Ÿฟโ€โ™‚๏ธ man fairy: dark skin tone +1F9DA 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿงš๐Ÿฟโ€โ™‚ man fairy: dark skin tone +1F9DB ; fully-qualified # ๐Ÿง› vampire +1F9DB 1F3FB ; fully-qualified # ๐Ÿง›๐Ÿป vampire: light skin tone +1F9DB 1F3FC ; fully-qualified # ๐Ÿง›๐Ÿผ vampire: medium-light skin tone +1F9DB 1F3FD ; fully-qualified # ๐Ÿง›๐Ÿฝ vampire: medium skin tone +1F9DB 1F3FE ; fully-qualified # ๐Ÿง›๐Ÿพ vampire: medium-dark skin tone +1F9DB 1F3FF ; fully-qualified # ๐Ÿง›๐Ÿฟ vampire: dark skin tone +1F9DB 200D 2640 FE0F ; fully-qualified # ๐Ÿง›โ€โ™€๏ธ woman vampire +1F9DB 200D 2640 ; non-fully-qualified # ๐Ÿง›โ€โ™€ woman vampire +1F9DB 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿปโ€โ™€๏ธ woman vampire: light skin tone +1F9DB 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿง›๐Ÿปโ€โ™€ woman vampire: light skin tone +1F9DB 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿผโ€โ™€๏ธ woman vampire: medium-light skin tone +1F9DB 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿง›๐Ÿผโ€โ™€ woman vampire: medium-light skin tone +1F9DB 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฝโ€โ™€๏ธ woman vampire: medium skin tone +1F9DB 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿง›๐Ÿฝโ€โ™€ woman vampire: medium skin tone +1F9DB 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿพโ€โ™€๏ธ woman vampire: medium-dark skin tone +1F9DB 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿง›๐Ÿพโ€โ™€ woman vampire: medium-dark skin tone +1F9DB 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฟโ€โ™€๏ธ woman vampire: dark skin tone +1F9DB 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿง›๐Ÿฟโ€โ™€ woman vampire: dark skin tone +1F9DB 200D 2642 FE0F ; fully-qualified # ๐Ÿง›โ€โ™‚๏ธ man vampire +1F9DB 200D 2642 ; non-fully-qualified # ๐Ÿง›โ€โ™‚ man vampire +1F9DB 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿปโ€โ™‚๏ธ man vampire: light skin tone +1F9DB 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿง›๐Ÿปโ€โ™‚ man vampire: light skin tone +1F9DB 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿผโ€โ™‚๏ธ man vampire: medium-light skin tone +1F9DB 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿง›๐Ÿผโ€โ™‚ man vampire: medium-light skin tone +1F9DB 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฝโ€โ™‚๏ธ man vampire: medium skin tone +1F9DB 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿง›๐Ÿฝโ€โ™‚ man vampire: medium skin tone +1F9DB 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿพโ€โ™‚๏ธ man vampire: medium-dark skin tone +1F9DB 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿง›๐Ÿพโ€โ™‚ man vampire: medium-dark skin tone +1F9DB 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง›๐Ÿฟโ€โ™‚๏ธ man vampire: dark skin tone +1F9DB 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿง›๐Ÿฟโ€โ™‚ man vampire: dark skin tone +1F9DC ; fully-qualified # ๐Ÿงœ merperson +1F9DC 1F3FB ; fully-qualified # ๐Ÿงœ๐Ÿป merperson: light skin tone +1F9DC 1F3FC ; fully-qualified # ๐Ÿงœ๐Ÿผ merperson: medium-light skin tone +1F9DC 1F3FD ; fully-qualified # ๐Ÿงœ๐Ÿฝ merperson: medium skin tone +1F9DC 1F3FE ; fully-qualified # ๐Ÿงœ๐Ÿพ merperson: medium-dark skin tone +1F9DC 1F3FF ; fully-qualified # ๐Ÿงœ๐Ÿฟ merperson: dark skin tone +1F9DC 200D 2640 FE0F ; fully-qualified # ๐Ÿงœโ€โ™€๏ธ mermaid +1F9DC 200D 2640 ; non-fully-qualified # ๐Ÿงœโ€โ™€ mermaid +1F9DC 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿปโ€โ™€๏ธ mermaid: light skin tone +1F9DC 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿงœ๐Ÿปโ€โ™€ mermaid: light skin tone +1F9DC 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿผโ€โ™€๏ธ mermaid: medium-light skin tone +1F9DC 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿงœ๐Ÿผโ€โ™€ mermaid: medium-light skin tone +1F9DC 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฝโ€โ™€๏ธ mermaid: medium skin tone +1F9DC 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿงœ๐Ÿฝโ€โ™€ mermaid: medium skin tone +1F9DC 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿพโ€โ™€๏ธ mermaid: medium-dark skin tone +1F9DC 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿงœ๐Ÿพโ€โ™€ mermaid: medium-dark skin tone +1F9DC 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฟโ€โ™€๏ธ mermaid: dark skin tone +1F9DC 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿงœ๐Ÿฟโ€โ™€ mermaid: dark skin tone +1F9DC 200D 2642 FE0F ; fully-qualified # ๐Ÿงœโ€โ™‚๏ธ merman +1F9DC 200D 2642 ; non-fully-qualified # ๐Ÿงœโ€โ™‚ merman +1F9DC 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿปโ€โ™‚๏ธ merman: light skin tone +1F9DC 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿงœ๐Ÿปโ€โ™‚ merman: light skin tone +1F9DC 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿผโ€โ™‚๏ธ merman: medium-light skin tone +1F9DC 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿงœ๐Ÿผโ€โ™‚ merman: medium-light skin tone +1F9DC 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฝโ€โ™‚๏ธ merman: medium skin tone +1F9DC 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿงœ๐Ÿฝโ€โ™‚ merman: medium skin tone +1F9DC 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿพโ€โ™‚๏ธ merman: medium-dark skin tone +1F9DC 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿงœ๐Ÿพโ€โ™‚ merman: medium-dark skin tone +1F9DC 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿงœ๐Ÿฟโ€โ™‚๏ธ merman: dark skin tone +1F9DC 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿงœ๐Ÿฟโ€โ™‚ merman: dark skin tone +1F9DD ; fully-qualified # ๐Ÿง elf +1F9DD 1F3FB ; fully-qualified # ๐Ÿง๐Ÿป elf: light skin tone +1F9DD 1F3FC ; fully-qualified # ๐Ÿง๐Ÿผ elf: medium-light skin tone +1F9DD 1F3FD ; fully-qualified # ๐Ÿง๐Ÿฝ elf: medium skin tone +1F9DD 1F3FE ; fully-qualified # ๐Ÿง๐Ÿพ elf: medium-dark skin tone +1F9DD 1F3FF ; fully-qualified # ๐Ÿง๐Ÿฟ elf: dark skin tone +1F9DD 200D 2640 FE0F ; fully-qualified # ๐Ÿงโ€โ™€๏ธ woman elf +1F9DD 200D 2640 ; non-fully-qualified # ๐Ÿงโ€โ™€ woman elf +1F9DD 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™€๏ธ woman elf: light skin tone +1F9DD 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿง๐Ÿปโ€โ™€ woman elf: light skin tone +1F9DD 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™€๏ธ woman elf: medium-light skin tone +1F9DD 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿง๐Ÿผโ€โ™€ woman elf: medium-light skin tone +1F9DD 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™€๏ธ woman elf: medium skin tone +1F9DD 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿง๐Ÿฝโ€โ™€ woman elf: medium skin tone +1F9DD 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™€๏ธ woman elf: medium-dark skin tone +1F9DD 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿง๐Ÿพโ€โ™€ woman elf: medium-dark skin tone +1F9DD 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™€๏ธ woman elf: dark skin tone +1F9DD 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿง๐Ÿฟโ€โ™€ woman elf: dark skin tone +1F9DD 200D 2642 FE0F ; fully-qualified # ๐Ÿงโ€โ™‚๏ธ man elf +1F9DD 200D 2642 ; non-fully-qualified # ๐Ÿงโ€โ™‚ man elf +1F9DD 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿปโ€โ™‚๏ธ man elf: light skin tone +1F9DD 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿง๐Ÿปโ€โ™‚ man elf: light skin tone +1F9DD 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿผโ€โ™‚๏ธ man elf: medium-light skin tone +1F9DD 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿง๐Ÿผโ€โ™‚ man elf: medium-light skin tone +1F9DD 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฝโ€โ™‚๏ธ man elf: medium skin tone +1F9DD 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿง๐Ÿฝโ€โ™‚ man elf: medium skin tone +1F9DD 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿพโ€โ™‚๏ธ man elf: medium-dark skin tone +1F9DD 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿง๐Ÿพโ€โ™‚ man elf: medium-dark skin tone +1F9DD 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง๐Ÿฟโ€โ™‚๏ธ man elf: dark skin tone +1F9DD 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿง๐Ÿฟโ€โ™‚ man elf: dark skin tone +1F9DE ; fully-qualified # ๐Ÿงž genie +1F9DE 200D 2640 FE0F ; fully-qualified # ๐Ÿงžโ€โ™€๏ธ woman genie +1F9DE 200D 2640 ; non-fully-qualified # ๐Ÿงžโ€โ™€ woman genie +1F9DE 200D 2642 FE0F ; fully-qualified # ๐Ÿงžโ€โ™‚๏ธ man genie +1F9DE 200D 2642 ; non-fully-qualified # ๐Ÿงžโ€โ™‚ man genie +1F9DF ; fully-qualified # ๐ŸงŸ zombie +1F9DF 200D 2640 FE0F ; fully-qualified # ๐ŸงŸโ€โ™€๏ธ woman zombie +1F9DF 200D 2640 ; non-fully-qualified # ๐ŸงŸโ€โ™€ woman zombie +1F9DF 200D 2642 FE0F ; fully-qualified # ๐ŸงŸโ€โ™‚๏ธ man zombie +1F9DF 200D 2642 ; non-fully-qualified # ๐ŸงŸโ€โ™‚ man zombie + +# subgroup: person-gesture +1F64D ; fully-qualified # ๐Ÿ™ person frowning +1F64D 1F3FB ; fully-qualified # ๐Ÿ™๐Ÿป person frowning: light skin tone +1F64D 1F3FC ; fully-qualified # ๐Ÿ™๐Ÿผ person frowning: medium-light skin tone +1F64D 1F3FD ; fully-qualified # ๐Ÿ™๐Ÿฝ person frowning: medium skin tone +1F64D 1F3FE ; fully-qualified # ๐Ÿ™๐Ÿพ person frowning: medium-dark skin tone +1F64D 1F3FF ; fully-qualified # ๐Ÿ™๐Ÿฟ person frowning: dark skin tone +1F64D 200D 2642 FE0F ; fully-qualified # ๐Ÿ™โ€โ™‚๏ธ man frowning +1F64D 200D 2642 ; non-fully-qualified # ๐Ÿ™โ€โ™‚ man frowning +1F64D 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿปโ€โ™‚๏ธ man frowning: light skin tone +1F64D 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ™๐Ÿปโ€โ™‚ man frowning: light skin tone +1F64D 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿผโ€โ™‚๏ธ man frowning: medium-light skin tone +1F64D 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ™๐Ÿผโ€โ™‚ man frowning: medium-light skin tone +1F64D 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฝโ€โ™‚๏ธ man frowning: medium skin tone +1F64D 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ™๐Ÿฝโ€โ™‚ man frowning: medium skin tone +1F64D 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿพโ€โ™‚๏ธ man frowning: medium-dark skin tone +1F64D 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ™๐Ÿพโ€โ™‚ man frowning: medium-dark skin tone +1F64D 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฟโ€โ™‚๏ธ man frowning: dark skin tone +1F64D 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ™๐Ÿฟโ€โ™‚ man frowning: dark skin tone +1F64D 200D 2640 FE0F ; fully-qualified # ๐Ÿ™โ€โ™€๏ธ woman frowning +1F64D 200D 2640 ; non-fully-qualified # ๐Ÿ™โ€โ™€ woman frowning +1F64D 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿปโ€โ™€๏ธ woman frowning: light skin tone +1F64D 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ™๐Ÿปโ€โ™€ woman frowning: light skin tone +1F64D 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿผโ€โ™€๏ธ woman frowning: medium-light skin tone +1F64D 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ™๐Ÿผโ€โ™€ woman frowning: medium-light skin tone +1F64D 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฝโ€โ™€๏ธ woman frowning: medium skin tone +1F64D 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ™๐Ÿฝโ€โ™€ woman frowning: medium skin tone +1F64D 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿพโ€โ™€๏ธ woman frowning: medium-dark skin tone +1F64D 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ™๐Ÿพโ€โ™€ woman frowning: medium-dark skin tone +1F64D 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™๐Ÿฟโ€โ™€๏ธ woman frowning: dark skin tone +1F64D 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ™๐Ÿฟโ€โ™€ woman frowning: dark skin tone +1F64E ; fully-qualified # ๐Ÿ™Ž person pouting +1F64E 1F3FB ; fully-qualified # ๐Ÿ™Ž๐Ÿป person pouting: light skin tone +1F64E 1F3FC ; fully-qualified # ๐Ÿ™Ž๐Ÿผ person pouting: medium-light skin tone +1F64E 1F3FD ; fully-qualified # ๐Ÿ™Ž๐Ÿฝ person pouting: medium skin tone +1F64E 1F3FE ; fully-qualified # ๐Ÿ™Ž๐Ÿพ person pouting: medium-dark skin tone +1F64E 1F3FF ; fully-qualified # ๐Ÿ™Ž๐Ÿฟ person pouting: dark skin tone +1F64E 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Žโ€โ™‚๏ธ man pouting +1F64E 200D 2642 ; non-fully-qualified # ๐Ÿ™Žโ€โ™‚ man pouting +1F64E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™‚๏ธ man pouting: light skin tone +1F64E 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™‚ man pouting: light skin tone +1F64E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™‚๏ธ man pouting: medium-light skin tone +1F64E 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™‚ man pouting: medium-light skin tone +1F64E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™‚๏ธ man pouting: medium skin tone +1F64E 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™‚ man pouting: medium skin tone +1F64E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™‚๏ธ man pouting: medium-dark skin tone +1F64E 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™‚ man pouting: medium-dark skin tone +1F64E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™‚๏ธ man pouting: dark skin tone +1F64E 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™‚ man pouting: dark skin tone +1F64E 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Žโ€โ™€๏ธ woman pouting +1F64E 200D 2640 ; non-fully-qualified # ๐Ÿ™Žโ€โ™€ woman pouting +1F64E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™€๏ธ woman pouting: light skin tone +1F64E 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿปโ€โ™€ woman pouting: light skin tone +1F64E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™€๏ธ woman pouting: medium-light skin tone +1F64E 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿผโ€โ™€ woman pouting: medium-light skin tone +1F64E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™€๏ธ woman pouting: medium skin tone +1F64E 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿฝโ€โ™€ woman pouting: medium skin tone +1F64E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™€๏ธ woman pouting: medium-dark skin tone +1F64E 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿพโ€โ™€ woman pouting: medium-dark skin tone +1F64E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™€๏ธ woman pouting: dark skin tone +1F64E 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ™Ž๐Ÿฟโ€โ™€ woman pouting: dark skin tone +1F645 ; fully-qualified # ๐Ÿ™… person gesturing NO +1F645 1F3FB ; fully-qualified # ๐Ÿ™…๐Ÿป person gesturing NO: light skin tone +1F645 1F3FC ; fully-qualified # ๐Ÿ™…๐Ÿผ person gesturing NO: medium-light skin tone +1F645 1F3FD ; fully-qualified # ๐Ÿ™…๐Ÿฝ person gesturing NO: medium skin tone +1F645 1F3FE ; fully-qualified # ๐Ÿ™…๐Ÿพ person gesturing NO: medium-dark skin tone +1F645 1F3FF ; fully-qualified # ๐Ÿ™…๐Ÿฟ person gesturing NO: dark skin tone +1F645 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…โ€โ™‚๏ธ man gesturing NO +1F645 200D 2642 ; non-fully-qualified # ๐Ÿ™…โ€โ™‚ man gesturing NO +1F645 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿปโ€โ™‚๏ธ man gesturing NO: light skin tone +1F645 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ™…๐Ÿปโ€โ™‚ man gesturing NO: light skin tone +1F645 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿผโ€โ™‚๏ธ man gesturing NO: medium-light skin tone +1F645 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ™…๐Ÿผโ€โ™‚ man gesturing NO: medium-light skin tone +1F645 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฝโ€โ™‚๏ธ man gesturing NO: medium skin tone +1F645 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ™…๐Ÿฝโ€โ™‚ man gesturing NO: medium skin tone +1F645 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿพโ€โ™‚๏ธ man gesturing NO: medium-dark skin tone +1F645 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ™…๐Ÿพโ€โ™‚ man gesturing NO: medium-dark skin tone +1F645 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฟโ€โ™‚๏ธ man gesturing NO: dark skin tone +1F645 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ™…๐Ÿฟโ€โ™‚ man gesturing NO: dark skin tone +1F645 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…โ€โ™€๏ธ woman gesturing NO +1F645 200D 2640 ; non-fully-qualified # ๐Ÿ™…โ€โ™€ woman gesturing NO +1F645 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿปโ€โ™€๏ธ woman gesturing NO: light skin tone +1F645 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ™…๐Ÿปโ€โ™€ woman gesturing NO: light skin tone +1F645 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿผโ€โ™€๏ธ woman gesturing NO: medium-light skin tone +1F645 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ™…๐Ÿผโ€โ™€ woman gesturing NO: medium-light skin tone +1F645 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฝโ€โ™€๏ธ woman gesturing NO: medium skin tone +1F645 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ™…๐Ÿฝโ€โ™€ woman gesturing NO: medium skin tone +1F645 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿพโ€โ™€๏ธ woman gesturing NO: medium-dark skin tone +1F645 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ™…๐Ÿพโ€โ™€ woman gesturing NO: medium-dark skin tone +1F645 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™…๐Ÿฟโ€โ™€๏ธ woman gesturing NO: dark skin tone +1F645 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ™…๐Ÿฟโ€โ™€ woman gesturing NO: dark skin tone +1F646 ; fully-qualified # ๐Ÿ™† person gesturing OK +1F646 1F3FB ; fully-qualified # ๐Ÿ™†๐Ÿป person gesturing OK: light skin tone +1F646 1F3FC ; fully-qualified # ๐Ÿ™†๐Ÿผ person gesturing OK: medium-light skin tone +1F646 1F3FD ; fully-qualified # ๐Ÿ™†๐Ÿฝ person gesturing OK: medium skin tone +1F646 1F3FE ; fully-qualified # ๐Ÿ™†๐Ÿพ person gesturing OK: medium-dark skin tone +1F646 1F3FF ; fully-qualified # ๐Ÿ™†๐Ÿฟ person gesturing OK: dark skin tone +1F646 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†โ€โ™‚๏ธ man gesturing OK +1F646 200D 2642 ; non-fully-qualified # ๐Ÿ™†โ€โ™‚ man gesturing OK +1F646 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿปโ€โ™‚๏ธ man gesturing OK: light skin tone +1F646 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ™†๐Ÿปโ€โ™‚ man gesturing OK: light skin tone +1F646 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿผโ€โ™‚๏ธ man gesturing OK: medium-light skin tone +1F646 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ™†๐Ÿผโ€โ™‚ man gesturing OK: medium-light skin tone +1F646 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฝโ€โ™‚๏ธ man gesturing OK: medium skin tone +1F646 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ™†๐Ÿฝโ€โ™‚ man gesturing OK: medium skin tone +1F646 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿพโ€โ™‚๏ธ man gesturing OK: medium-dark skin tone +1F646 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ™†๐Ÿพโ€โ™‚ man gesturing OK: medium-dark skin tone +1F646 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฟโ€โ™‚๏ธ man gesturing OK: dark skin tone +1F646 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ™†๐Ÿฟโ€โ™‚ man gesturing OK: dark skin tone +1F646 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†โ€โ™€๏ธ woman gesturing OK +1F646 200D 2640 ; non-fully-qualified # ๐Ÿ™†โ€โ™€ woman gesturing OK +1F646 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿปโ€โ™€๏ธ woman gesturing OK: light skin tone +1F646 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ™†๐Ÿปโ€โ™€ woman gesturing OK: light skin tone +1F646 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿผโ€โ™€๏ธ woman gesturing OK: medium-light skin tone +1F646 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ™†๐Ÿผโ€โ™€ woman gesturing OK: medium-light skin tone +1F646 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฝโ€โ™€๏ธ woman gesturing OK: medium skin tone +1F646 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ™†๐Ÿฝโ€โ™€ woman gesturing OK: medium skin tone +1F646 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿพโ€โ™€๏ธ woman gesturing OK: medium-dark skin tone +1F646 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ™†๐Ÿพโ€โ™€ woman gesturing OK: medium-dark skin tone +1F646 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™†๐Ÿฟโ€โ™€๏ธ woman gesturing OK: dark skin tone +1F646 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ™†๐Ÿฟโ€โ™€ woman gesturing OK: dark skin tone +1F481 ; fully-qualified # ๐Ÿ’ person tipping hand +1F481 1F3FB ; fully-qualified # ๐Ÿ’๐Ÿป person tipping hand: light skin tone +1F481 1F3FC ; fully-qualified # ๐Ÿ’๐Ÿผ person tipping hand: medium-light skin tone +1F481 1F3FD ; fully-qualified # ๐Ÿ’๐Ÿฝ person tipping hand: medium skin tone +1F481 1F3FE ; fully-qualified # ๐Ÿ’๐Ÿพ person tipping hand: medium-dark skin tone +1F481 1F3FF ; fully-qualified # ๐Ÿ’๐Ÿฟ person tipping hand: dark skin tone +1F481 200D 2642 FE0F ; fully-qualified # ๐Ÿ’โ€โ™‚๏ธ man tipping hand +1F481 200D 2642 ; non-fully-qualified # ๐Ÿ’โ€โ™‚ man tipping hand +1F481 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿปโ€โ™‚๏ธ man tipping hand: light skin tone +1F481 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ’๐Ÿปโ€โ™‚ man tipping hand: light skin tone +1F481 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿผโ€โ™‚๏ธ man tipping hand: medium-light skin tone +1F481 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ’๐Ÿผโ€โ™‚ man tipping hand: medium-light skin tone +1F481 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฝโ€โ™‚๏ธ man tipping hand: medium skin tone +1F481 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ’๐Ÿฝโ€โ™‚ man tipping hand: medium skin tone +1F481 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿพโ€โ™‚๏ธ man tipping hand: medium-dark skin tone +1F481 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ’๐Ÿพโ€โ™‚ man tipping hand: medium-dark skin tone +1F481 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฟโ€โ™‚๏ธ man tipping hand: dark skin tone +1F481 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ’๐Ÿฟโ€โ™‚ man tipping hand: dark skin tone +1F481 200D 2640 FE0F ; fully-qualified # ๐Ÿ’โ€โ™€๏ธ woman tipping hand +1F481 200D 2640 ; non-fully-qualified # ๐Ÿ’โ€โ™€ woman tipping hand +1F481 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿปโ€โ™€๏ธ woman tipping hand: light skin tone +1F481 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ’๐Ÿปโ€โ™€ woman tipping hand: light skin tone +1F481 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿผโ€โ™€๏ธ woman tipping hand: medium-light skin tone +1F481 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ’๐Ÿผโ€โ™€ woman tipping hand: medium-light skin tone +1F481 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฝโ€โ™€๏ธ woman tipping hand: medium skin tone +1F481 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ’๐Ÿฝโ€โ™€ woman tipping hand: medium skin tone +1F481 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿพโ€โ™€๏ธ woman tipping hand: medium-dark skin tone +1F481 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ’๐Ÿพโ€โ™€ woman tipping hand: medium-dark skin tone +1F481 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’๐Ÿฟโ€โ™€๏ธ woman tipping hand: dark skin tone +1F481 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ’๐Ÿฟโ€โ™€ woman tipping hand: dark skin tone +1F64B ; fully-qualified # ๐Ÿ™‹ person raising hand +1F64B 1F3FB ; fully-qualified # ๐Ÿ™‹๐Ÿป person raising hand: light skin tone +1F64B 1F3FC ; fully-qualified # ๐Ÿ™‹๐Ÿผ person raising hand: medium-light skin tone +1F64B 1F3FD ; fully-qualified # ๐Ÿ™‹๐Ÿฝ person raising hand: medium skin tone +1F64B 1F3FE ; fully-qualified # ๐Ÿ™‹๐Ÿพ person raising hand: medium-dark skin tone +1F64B 1F3FF ; fully-qualified # ๐Ÿ™‹๐Ÿฟ person raising hand: dark skin tone +1F64B 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹โ€โ™‚๏ธ man raising hand +1F64B 200D 2642 ; non-fully-qualified # ๐Ÿ™‹โ€โ™‚ man raising hand +1F64B 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿปโ€โ™‚๏ธ man raising hand: light skin tone +1F64B 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ™‹๐Ÿปโ€โ™‚ man raising hand: light skin tone +1F64B 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿผโ€โ™‚๏ธ man raising hand: medium-light skin tone +1F64B 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ™‹๐Ÿผโ€โ™‚ man raising hand: medium-light skin tone +1F64B 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™‚๏ธ man raising hand: medium skin tone +1F64B 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™‚ man raising hand: medium skin tone +1F64B 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿพโ€โ™‚๏ธ man raising hand: medium-dark skin tone +1F64B 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ™‹๐Ÿพโ€โ™‚ man raising hand: medium-dark skin tone +1F64B 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™‚๏ธ man raising hand: dark skin tone +1F64B 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™‚ man raising hand: dark skin tone +1F64B 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹โ€โ™€๏ธ woman raising hand +1F64B 200D 2640 ; non-fully-qualified # ๐Ÿ™‹โ€โ™€ woman raising hand +1F64B 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿปโ€โ™€๏ธ woman raising hand: light skin tone +1F64B 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ™‹๐Ÿปโ€โ™€ woman raising hand: light skin tone +1F64B 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿผโ€โ™€๏ธ woman raising hand: medium-light skin tone +1F64B 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ™‹๐Ÿผโ€โ™€ woman raising hand: medium-light skin tone +1F64B 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™€๏ธ woman raising hand: medium skin tone +1F64B 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ™‹๐Ÿฝโ€โ™€ woman raising hand: medium skin tone +1F64B 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿพโ€โ™€๏ธ woman raising hand: medium-dark skin tone +1F64B 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ™‹๐Ÿพโ€โ™€ woman raising hand: medium-dark skin tone +1F64B 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™€๏ธ woman raising hand: dark skin tone +1F64B 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ™‹๐Ÿฟโ€โ™€ woman raising hand: dark skin tone +1F647 ; fully-qualified # ๐Ÿ™‡ person bowing +1F647 1F3FB ; fully-qualified # ๐Ÿ™‡๐Ÿป person bowing: light skin tone +1F647 1F3FC ; fully-qualified # ๐Ÿ™‡๐Ÿผ person bowing: medium-light skin tone +1F647 1F3FD ; fully-qualified # ๐Ÿ™‡๐Ÿฝ person bowing: medium skin tone +1F647 1F3FE ; fully-qualified # ๐Ÿ™‡๐Ÿพ person bowing: medium-dark skin tone +1F647 1F3FF ; fully-qualified # ๐Ÿ™‡๐Ÿฟ person bowing: dark skin tone +1F647 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡โ€โ™‚๏ธ man bowing +1F647 200D 2642 ; non-fully-qualified # ๐Ÿ™‡โ€โ™‚ man bowing +1F647 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿปโ€โ™‚๏ธ man bowing: light skin tone +1F647 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ™‡๐Ÿปโ€โ™‚ man bowing: light skin tone +1F647 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿผโ€โ™‚๏ธ man bowing: medium-light skin tone +1F647 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ™‡๐Ÿผโ€โ™‚ man bowing: medium-light skin tone +1F647 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™‚๏ธ man bowing: medium skin tone +1F647 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™‚ man bowing: medium skin tone +1F647 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿพโ€โ™‚๏ธ man bowing: medium-dark skin tone +1F647 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ™‡๐Ÿพโ€โ™‚ man bowing: medium-dark skin tone +1F647 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™‚๏ธ man bowing: dark skin tone +1F647 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™‚ man bowing: dark skin tone +1F647 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡โ€โ™€๏ธ woman bowing +1F647 200D 2640 ; non-fully-qualified # ๐Ÿ™‡โ€โ™€ woman bowing +1F647 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿปโ€โ™€๏ธ woman bowing: light skin tone +1F647 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ™‡๐Ÿปโ€โ™€ woman bowing: light skin tone +1F647 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿผโ€โ™€๏ธ woman bowing: medium-light skin tone +1F647 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ™‡๐Ÿผโ€โ™€ woman bowing: medium-light skin tone +1F647 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™€๏ธ woman bowing: medium skin tone +1F647 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ™‡๐Ÿฝโ€โ™€ woman bowing: medium skin tone +1F647 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿพโ€โ™€๏ธ woman bowing: medium-dark skin tone +1F647 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ™‡๐Ÿพโ€โ™€ woman bowing: medium-dark skin tone +1F647 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™€๏ธ woman bowing: dark skin tone +1F647 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ™‡๐Ÿฟโ€โ™€ woman bowing: dark skin tone +1F926 ; fully-qualified # ๐Ÿคฆ person facepalming +1F926 1F3FB ; fully-qualified # ๐Ÿคฆ๐Ÿป person facepalming: light skin tone +1F926 1F3FC ; fully-qualified # ๐Ÿคฆ๐Ÿผ person facepalming: medium-light skin tone +1F926 1F3FD ; fully-qualified # ๐Ÿคฆ๐Ÿฝ person facepalming: medium skin tone +1F926 1F3FE ; fully-qualified # ๐Ÿคฆ๐Ÿพ person facepalming: medium-dark skin tone +1F926 1F3FF ; fully-qualified # ๐Ÿคฆ๐Ÿฟ person facepalming: dark skin tone +1F926 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆโ€โ™‚๏ธ man facepalming +1F926 200D 2642 ; non-fully-qualified # ๐Ÿคฆโ€โ™‚ man facepalming +1F926 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿปโ€โ™‚๏ธ man facepalming: light skin tone +1F926 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿคฆ๐Ÿปโ€โ™‚ man facepalming: light skin tone +1F926 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿผโ€โ™‚๏ธ man facepalming: medium-light skin tone +1F926 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿคฆ๐Ÿผโ€โ™‚ man facepalming: medium-light skin tone +1F926 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™‚๏ธ man facepalming: medium skin tone +1F926 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™‚ man facepalming: medium skin tone +1F926 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿพโ€โ™‚๏ธ man facepalming: medium-dark skin tone +1F926 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿคฆ๐Ÿพโ€โ™‚ man facepalming: medium-dark skin tone +1F926 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™‚๏ธ man facepalming: dark skin tone +1F926 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™‚ man facepalming: dark skin tone +1F926 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆโ€โ™€๏ธ woman facepalming +1F926 200D 2640 ; non-fully-qualified # ๐Ÿคฆโ€โ™€ woman facepalming +1F926 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿปโ€โ™€๏ธ woman facepalming: light skin tone +1F926 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿคฆ๐Ÿปโ€โ™€ woman facepalming: light skin tone +1F926 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿผโ€โ™€๏ธ woman facepalming: medium-light skin tone +1F926 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿคฆ๐Ÿผโ€โ™€ woman facepalming: medium-light skin tone +1F926 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™€๏ธ woman facepalming: medium skin tone +1F926 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿคฆ๐Ÿฝโ€โ™€ woman facepalming: medium skin tone +1F926 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿพโ€โ™€๏ธ woman facepalming: medium-dark skin tone +1F926 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿคฆ๐Ÿพโ€โ™€ woman facepalming: medium-dark skin tone +1F926 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™€๏ธ woman facepalming: dark skin tone +1F926 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿคฆ๐Ÿฟโ€โ™€ woman facepalming: dark skin tone +1F937 ; fully-qualified # ๐Ÿคท person shrugging +1F937 1F3FB ; fully-qualified # ๐Ÿคท๐Ÿป person shrugging: light skin tone +1F937 1F3FC ; fully-qualified # ๐Ÿคท๐Ÿผ person shrugging: medium-light skin tone +1F937 1F3FD ; fully-qualified # ๐Ÿคท๐Ÿฝ person shrugging: medium skin tone +1F937 1F3FE ; fully-qualified # ๐Ÿคท๐Ÿพ person shrugging: medium-dark skin tone +1F937 1F3FF ; fully-qualified # ๐Ÿคท๐Ÿฟ person shrugging: dark skin tone +1F937 200D 2642 FE0F ; fully-qualified # ๐Ÿคทโ€โ™‚๏ธ man shrugging +1F937 200D 2642 ; non-fully-qualified # ๐Ÿคทโ€โ™‚ man shrugging +1F937 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿปโ€โ™‚๏ธ man shrugging: light skin tone +1F937 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿคท๐Ÿปโ€โ™‚ man shrugging: light skin tone +1F937 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿผโ€โ™‚๏ธ man shrugging: medium-light skin tone +1F937 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿคท๐Ÿผโ€โ™‚ man shrugging: medium-light skin tone +1F937 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฝโ€โ™‚๏ธ man shrugging: medium skin tone +1F937 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿคท๐Ÿฝโ€โ™‚ man shrugging: medium skin tone +1F937 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿพโ€โ™‚๏ธ man shrugging: medium-dark skin tone +1F937 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿคท๐Ÿพโ€โ™‚ man shrugging: medium-dark skin tone +1F937 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฟโ€โ™‚๏ธ man shrugging: dark skin tone +1F937 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿคท๐Ÿฟโ€โ™‚ man shrugging: dark skin tone +1F937 200D 2640 FE0F ; fully-qualified # ๐Ÿคทโ€โ™€๏ธ woman shrugging +1F937 200D 2640 ; non-fully-qualified # ๐Ÿคทโ€โ™€ woman shrugging +1F937 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿปโ€โ™€๏ธ woman shrugging: light skin tone +1F937 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿคท๐Ÿปโ€โ™€ woman shrugging: light skin tone +1F937 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿผโ€โ™€๏ธ woman shrugging: medium-light skin tone +1F937 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿคท๐Ÿผโ€โ™€ woman shrugging: medium-light skin tone +1F937 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฝโ€โ™€๏ธ woman shrugging: medium skin tone +1F937 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿคท๐Ÿฝโ€โ™€ woman shrugging: medium skin tone +1F937 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿพโ€โ™€๏ธ woman shrugging: medium-dark skin tone +1F937 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿคท๐Ÿพโ€โ™€ woman shrugging: medium-dark skin tone +1F937 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคท๐Ÿฟโ€โ™€๏ธ woman shrugging: dark skin tone +1F937 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿคท๐Ÿฟโ€โ™€ woman shrugging: dark skin tone + +# subgroup: person-activity +1F486 ; fully-qualified # ๐Ÿ’† person getting massage +1F486 1F3FB ; fully-qualified # ๐Ÿ’†๐Ÿป person getting massage: light skin tone +1F486 1F3FC ; fully-qualified # ๐Ÿ’†๐Ÿผ person getting massage: medium-light skin tone +1F486 1F3FD ; fully-qualified # ๐Ÿ’†๐Ÿฝ person getting massage: medium skin tone +1F486 1F3FE ; fully-qualified # ๐Ÿ’†๐Ÿพ person getting massage: medium-dark skin tone +1F486 1F3FF ; fully-qualified # ๐Ÿ’†๐Ÿฟ person getting massage: dark skin tone +1F486 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†โ€โ™‚๏ธ man getting massage +1F486 200D 2642 ; non-fully-qualified # ๐Ÿ’†โ€โ™‚ man getting massage +1F486 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿปโ€โ™‚๏ธ man getting massage: light skin tone +1F486 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ’†๐Ÿปโ€โ™‚ man getting massage: light skin tone +1F486 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿผโ€โ™‚๏ธ man getting massage: medium-light skin tone +1F486 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ’†๐Ÿผโ€โ™‚ man getting massage: medium-light skin tone +1F486 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฝโ€โ™‚๏ธ man getting massage: medium skin tone +1F486 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ’†๐Ÿฝโ€โ™‚ man getting massage: medium skin tone +1F486 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿพโ€โ™‚๏ธ man getting massage: medium-dark skin tone +1F486 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ’†๐Ÿพโ€โ™‚ man getting massage: medium-dark skin tone +1F486 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฟโ€โ™‚๏ธ man getting massage: dark skin tone +1F486 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ’†๐Ÿฟโ€โ™‚ man getting massage: dark skin tone +1F486 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†โ€โ™€๏ธ woman getting massage +1F486 200D 2640 ; non-fully-qualified # ๐Ÿ’†โ€โ™€ woman getting massage +1F486 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿปโ€โ™€๏ธ woman getting massage: light skin tone +1F486 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ’†๐Ÿปโ€โ™€ woman getting massage: light skin tone +1F486 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿผโ€โ™€๏ธ woman getting massage: medium-light skin tone +1F486 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ’†๐Ÿผโ€โ™€ woman getting massage: medium-light skin tone +1F486 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฝโ€โ™€๏ธ woman getting massage: medium skin tone +1F486 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ’†๐Ÿฝโ€โ™€ woman getting massage: medium skin tone +1F486 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿพโ€โ™€๏ธ woman getting massage: medium-dark skin tone +1F486 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ’†๐Ÿพโ€โ™€ woman getting massage: medium-dark skin tone +1F486 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’†๐Ÿฟโ€โ™€๏ธ woman getting massage: dark skin tone +1F486 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ’†๐Ÿฟโ€โ™€ woman getting massage: dark skin tone +1F487 ; fully-qualified # ๐Ÿ’‡ person getting haircut +1F487 1F3FB ; fully-qualified # ๐Ÿ’‡๐Ÿป person getting haircut: light skin tone +1F487 1F3FC ; fully-qualified # ๐Ÿ’‡๐Ÿผ person getting haircut: medium-light skin tone +1F487 1F3FD ; fully-qualified # ๐Ÿ’‡๐Ÿฝ person getting haircut: medium skin tone +1F487 1F3FE ; fully-qualified # ๐Ÿ’‡๐Ÿพ person getting haircut: medium-dark skin tone +1F487 1F3FF ; fully-qualified # ๐Ÿ’‡๐Ÿฟ person getting haircut: dark skin tone +1F487 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡โ€โ™‚๏ธ man getting haircut +1F487 200D 2642 ; non-fully-qualified # ๐Ÿ’‡โ€โ™‚ man getting haircut +1F487 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿปโ€โ™‚๏ธ man getting haircut: light skin tone +1F487 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ’‡๐Ÿปโ€โ™‚ man getting haircut: light skin tone +1F487 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿผโ€โ™‚๏ธ man getting haircut: medium-light skin tone +1F487 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ’‡๐Ÿผโ€โ™‚ man getting haircut: medium-light skin tone +1F487 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™‚๏ธ man getting haircut: medium skin tone +1F487 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™‚ man getting haircut: medium skin tone +1F487 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿพโ€โ™‚๏ธ man getting haircut: medium-dark skin tone +1F487 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ’‡๐Ÿพโ€โ™‚ man getting haircut: medium-dark skin tone +1F487 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™‚๏ธ man getting haircut: dark skin tone +1F487 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™‚ man getting haircut: dark skin tone +1F487 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡โ€โ™€๏ธ woman getting haircut +1F487 200D 2640 ; non-fully-qualified # ๐Ÿ’‡โ€โ™€ woman getting haircut +1F487 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿปโ€โ™€๏ธ woman getting haircut: light skin tone +1F487 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ’‡๐Ÿปโ€โ™€ woman getting haircut: light skin tone +1F487 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿผโ€โ™€๏ธ woman getting haircut: medium-light skin tone +1F487 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ’‡๐Ÿผโ€โ™€ woman getting haircut: medium-light skin tone +1F487 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™€๏ธ woman getting haircut: medium skin tone +1F487 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ’‡๐Ÿฝโ€โ™€ woman getting haircut: medium skin tone +1F487 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿพโ€โ™€๏ธ woman getting haircut: medium-dark skin tone +1F487 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ’‡๐Ÿพโ€โ™€ woman getting haircut: medium-dark skin tone +1F487 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™€๏ธ woman getting haircut: dark skin tone +1F487 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ’‡๐Ÿฟโ€โ™€ woman getting haircut: dark skin tone +1F6B6 ; fully-qualified # ๐Ÿšถ person walking +1F6B6 1F3FB ; fully-qualified # ๐Ÿšถ๐Ÿป person walking: light skin tone +1F6B6 1F3FC ; fully-qualified # ๐Ÿšถ๐Ÿผ person walking: medium-light skin tone +1F6B6 1F3FD ; fully-qualified # ๐Ÿšถ๐Ÿฝ person walking: medium skin tone +1F6B6 1F3FE ; fully-qualified # ๐Ÿšถ๐Ÿพ person walking: medium-dark skin tone +1F6B6 1F3FF ; fully-qualified # ๐Ÿšถ๐Ÿฟ person walking: dark skin tone +1F6B6 200D 2642 FE0F ; fully-qualified # ๐Ÿšถโ€โ™‚๏ธ man walking +1F6B6 200D 2642 ; non-fully-qualified # ๐Ÿšถโ€โ™‚ man walking +1F6B6 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿปโ€โ™‚๏ธ man walking: light skin tone +1F6B6 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿšถ๐Ÿปโ€โ™‚ man walking: light skin tone +1F6B6 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿผโ€โ™‚๏ธ man walking: medium-light skin tone +1F6B6 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿšถ๐Ÿผโ€โ™‚ man walking: medium-light skin tone +1F6B6 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฝโ€โ™‚๏ธ man walking: medium skin tone +1F6B6 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿšถ๐Ÿฝโ€โ™‚ man walking: medium skin tone +1F6B6 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿพโ€โ™‚๏ธ man walking: medium-dark skin tone +1F6B6 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿšถ๐Ÿพโ€โ™‚ man walking: medium-dark skin tone +1F6B6 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฟโ€โ™‚๏ธ man walking: dark skin tone +1F6B6 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿšถ๐Ÿฟโ€โ™‚ man walking: dark skin tone +1F6B6 200D 2640 FE0F ; fully-qualified # ๐Ÿšถโ€โ™€๏ธ woman walking +1F6B6 200D 2640 ; non-fully-qualified # ๐Ÿšถโ€โ™€ woman walking +1F6B6 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿปโ€โ™€๏ธ woman walking: light skin tone +1F6B6 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿšถ๐Ÿปโ€โ™€ woman walking: light skin tone +1F6B6 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿผโ€โ™€๏ธ woman walking: medium-light skin tone +1F6B6 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿšถ๐Ÿผโ€โ™€ woman walking: medium-light skin tone +1F6B6 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฝโ€โ™€๏ธ woman walking: medium skin tone +1F6B6 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿšถ๐Ÿฝโ€โ™€ woman walking: medium skin tone +1F6B6 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿพโ€โ™€๏ธ woman walking: medium-dark skin tone +1F6B6 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿšถ๐Ÿพโ€โ™€ woman walking: medium-dark skin tone +1F6B6 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšถ๐Ÿฟโ€โ™€๏ธ woman walking: dark skin tone +1F6B6 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿšถ๐Ÿฟโ€โ™€ woman walking: dark skin tone +1F3C3 ; fully-qualified # ๐Ÿƒ person running +1F3C3 1F3FB ; fully-qualified # ๐Ÿƒ๐Ÿป person running: light skin tone +1F3C3 1F3FC ; fully-qualified # ๐Ÿƒ๐Ÿผ person running: medium-light skin tone +1F3C3 1F3FD ; fully-qualified # ๐Ÿƒ๐Ÿฝ person running: medium skin tone +1F3C3 1F3FE ; fully-qualified # ๐Ÿƒ๐Ÿพ person running: medium-dark skin tone +1F3C3 1F3FF ; fully-qualified # ๐Ÿƒ๐Ÿฟ person running: dark skin tone +1F3C3 200D 2642 FE0F ; fully-qualified # ๐Ÿƒโ€โ™‚๏ธ man running +1F3C3 200D 2642 ; non-fully-qualified # ๐Ÿƒโ€โ™‚ man running +1F3C3 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿปโ€โ™‚๏ธ man running: light skin tone +1F3C3 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿƒ๐Ÿปโ€โ™‚ man running: light skin tone +1F3C3 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿผโ€โ™‚๏ธ man running: medium-light skin tone +1F3C3 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿƒ๐Ÿผโ€โ™‚ man running: medium-light skin tone +1F3C3 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฝโ€โ™‚๏ธ man running: medium skin tone +1F3C3 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿƒ๐Ÿฝโ€โ™‚ man running: medium skin tone +1F3C3 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿพโ€โ™‚๏ธ man running: medium-dark skin tone +1F3C3 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿƒ๐Ÿพโ€โ™‚ man running: medium-dark skin tone +1F3C3 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฟโ€โ™‚๏ธ man running: dark skin tone +1F3C3 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿƒ๐Ÿฟโ€โ™‚ man running: dark skin tone +1F3C3 200D 2640 FE0F ; fully-qualified # ๐Ÿƒโ€โ™€๏ธ woman running +1F3C3 200D 2640 ; non-fully-qualified # ๐Ÿƒโ€โ™€ woman running +1F3C3 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿปโ€โ™€๏ธ woman running: light skin tone +1F3C3 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿƒ๐Ÿปโ€โ™€ woman running: light skin tone +1F3C3 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿผโ€โ™€๏ธ woman running: medium-light skin tone +1F3C3 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿƒ๐Ÿผโ€โ™€ woman running: medium-light skin tone +1F3C3 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฝโ€โ™€๏ธ woman running: medium skin tone +1F3C3 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿƒ๐Ÿฝโ€โ™€ woman running: medium skin tone +1F3C3 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿพโ€โ™€๏ธ woman running: medium-dark skin tone +1F3C3 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿƒ๐Ÿพโ€โ™€ woman running: medium-dark skin tone +1F3C3 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿƒ๐Ÿฟโ€โ™€๏ธ woman running: dark skin tone +1F3C3 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿƒ๐Ÿฟโ€โ™€ woman running: dark skin tone +1F483 ; fully-qualified # ๐Ÿ’ƒ woman dancing +1F483 1F3FB ; fully-qualified # ๐Ÿ’ƒ๐Ÿป woman dancing: light skin tone +1F483 1F3FC ; fully-qualified # ๐Ÿ’ƒ๐Ÿผ woman dancing: medium-light skin tone +1F483 1F3FD ; fully-qualified # ๐Ÿ’ƒ๐Ÿฝ woman dancing: medium skin tone +1F483 1F3FE ; fully-qualified # ๐Ÿ’ƒ๐Ÿพ woman dancing: medium-dark skin tone +1F483 1F3FF ; fully-qualified # ๐Ÿ’ƒ๐Ÿฟ woman dancing: dark skin tone +1F57A ; fully-qualified # ๐Ÿ•บ man dancing +1F57A 1F3FB ; fully-qualified # ๐Ÿ•บ๐Ÿป man dancing: light skin tone +1F57A 1F3FC ; fully-qualified # ๐Ÿ•บ๐Ÿผ man dancing: medium-light skin tone +1F57A 1F3FD ; fully-qualified # ๐Ÿ•บ๐Ÿฝ man dancing: medium skin tone +1F57A 1F3FE ; fully-qualified # ๐Ÿ•บ๐Ÿพ man dancing: medium-dark skin tone +1F57A 1F3FF ; fully-qualified # ๐Ÿ•บ๐Ÿฟ man dancing: dark skin tone +1F46F ; fully-qualified # ๐Ÿ‘ฏ people with bunny ears +1F46F 200D 2642 FE0F ; fully-qualified # ๐Ÿ‘ฏโ€โ™‚๏ธ men with bunny ears +1F46F 200D 2642 ; non-fully-qualified # ๐Ÿ‘ฏโ€โ™‚ men with bunny ears +1F46F 200D 2640 FE0F ; fully-qualified # ๐Ÿ‘ฏโ€โ™€๏ธ women with bunny ears +1F46F 200D 2640 ; non-fully-qualified # ๐Ÿ‘ฏโ€โ™€ women with bunny ears +1F9D6 ; fully-qualified # ๐Ÿง– person in steamy room +1F9D6 1F3FB ; fully-qualified # ๐Ÿง–๐Ÿป person in steamy room: light skin tone +1F9D6 1F3FC ; fully-qualified # ๐Ÿง–๐Ÿผ person in steamy room: medium-light skin tone +1F9D6 1F3FD ; fully-qualified # ๐Ÿง–๐Ÿฝ person in steamy room: medium skin tone +1F9D6 1F3FE ; fully-qualified # ๐Ÿง–๐Ÿพ person in steamy room: medium-dark skin tone +1F9D6 1F3FF ; fully-qualified # ๐Ÿง–๐Ÿฟ person in steamy room: dark skin tone +1F9D6 200D 2640 FE0F ; fully-qualified # ๐Ÿง–โ€โ™€๏ธ woman in steamy room +1F9D6 200D 2640 ; non-fully-qualified # ๐Ÿง–โ€โ™€ woman in steamy room +1F9D6 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿปโ€โ™€๏ธ woman in steamy room: light skin tone +1F9D6 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿง–๐Ÿปโ€โ™€ woman in steamy room: light skin tone +1F9D6 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿผโ€โ™€๏ธ woman in steamy room: medium-light skin tone +1F9D6 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿง–๐Ÿผโ€โ™€ woman in steamy room: medium-light skin tone +1F9D6 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฝโ€โ™€๏ธ woman in steamy room: medium skin tone +1F9D6 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿง–๐Ÿฝโ€โ™€ woman in steamy room: medium skin tone +1F9D6 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿพโ€โ™€๏ธ woman in steamy room: medium-dark skin tone +1F9D6 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿง–๐Ÿพโ€โ™€ woman in steamy room: medium-dark skin tone +1F9D6 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฟโ€โ™€๏ธ woman in steamy room: dark skin tone +1F9D6 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿง–๐Ÿฟโ€โ™€ woman in steamy room: dark skin tone +1F9D6 200D 2642 FE0F ; fully-qualified # ๐Ÿง–โ€โ™‚๏ธ man in steamy room +1F9D6 200D 2642 ; non-fully-qualified # ๐Ÿง–โ€โ™‚ man in steamy room +1F9D6 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿปโ€โ™‚๏ธ man in steamy room: light skin tone +1F9D6 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿง–๐Ÿปโ€โ™‚ man in steamy room: light skin tone +1F9D6 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿผโ€โ™‚๏ธ man in steamy room: medium-light skin tone +1F9D6 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿง–๐Ÿผโ€โ™‚ man in steamy room: medium-light skin tone +1F9D6 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฝโ€โ™‚๏ธ man in steamy room: medium skin tone +1F9D6 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿง–๐Ÿฝโ€โ™‚ man in steamy room: medium skin tone +1F9D6 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿพโ€โ™‚๏ธ man in steamy room: medium-dark skin tone +1F9D6 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿง–๐Ÿพโ€โ™‚ man in steamy room: medium-dark skin tone +1F9D6 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง–๐Ÿฟโ€โ™‚๏ธ man in steamy room: dark skin tone +1F9D6 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿง–๐Ÿฟโ€โ™‚ man in steamy room: dark skin tone +1F9D7 ; fully-qualified # ๐Ÿง— person climbing +1F9D7 1F3FB ; fully-qualified # ๐Ÿง—๐Ÿป person climbing: light skin tone +1F9D7 1F3FC ; fully-qualified # ๐Ÿง—๐Ÿผ person climbing: medium-light skin tone +1F9D7 1F3FD ; fully-qualified # ๐Ÿง—๐Ÿฝ person climbing: medium skin tone +1F9D7 1F3FE ; fully-qualified # ๐Ÿง—๐Ÿพ person climbing: medium-dark skin tone +1F9D7 1F3FF ; fully-qualified # ๐Ÿง—๐Ÿฟ person climbing: dark skin tone +1F9D7 200D 2640 FE0F ; fully-qualified # ๐Ÿง—โ€โ™€๏ธ woman climbing +1F9D7 200D 2640 ; non-fully-qualified # ๐Ÿง—โ€โ™€ woman climbing +1F9D7 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿปโ€โ™€๏ธ woman climbing: light skin tone +1F9D7 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿง—๐Ÿปโ€โ™€ woman climbing: light skin tone +1F9D7 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿผโ€โ™€๏ธ woman climbing: medium-light skin tone +1F9D7 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿง—๐Ÿผโ€โ™€ woman climbing: medium-light skin tone +1F9D7 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฝโ€โ™€๏ธ woman climbing: medium skin tone +1F9D7 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿง—๐Ÿฝโ€โ™€ woman climbing: medium skin tone +1F9D7 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿพโ€โ™€๏ธ woman climbing: medium-dark skin tone +1F9D7 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿง—๐Ÿพโ€โ™€ woman climbing: medium-dark skin tone +1F9D7 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฟโ€โ™€๏ธ woman climbing: dark skin tone +1F9D7 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿง—๐Ÿฟโ€โ™€ woman climbing: dark skin tone +1F9D7 200D 2642 FE0F ; fully-qualified # ๐Ÿง—โ€โ™‚๏ธ man climbing +1F9D7 200D 2642 ; non-fully-qualified # ๐Ÿง—โ€โ™‚ man climbing +1F9D7 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿปโ€โ™‚๏ธ man climbing: light skin tone +1F9D7 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿง—๐Ÿปโ€โ™‚ man climbing: light skin tone +1F9D7 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿผโ€โ™‚๏ธ man climbing: medium-light skin tone +1F9D7 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿง—๐Ÿผโ€โ™‚ man climbing: medium-light skin tone +1F9D7 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฝโ€โ™‚๏ธ man climbing: medium skin tone +1F9D7 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿง—๐Ÿฝโ€โ™‚ man climbing: medium skin tone +1F9D7 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿพโ€โ™‚๏ธ man climbing: medium-dark skin tone +1F9D7 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿง—๐Ÿพโ€โ™‚ man climbing: medium-dark skin tone +1F9D7 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง—๐Ÿฟโ€โ™‚๏ธ man climbing: dark skin tone +1F9D7 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿง—๐Ÿฟโ€โ™‚ man climbing: dark skin tone +1F9D8 ; fully-qualified # ๐Ÿง˜ person in lotus position +1F9D8 1F3FB ; fully-qualified # ๐Ÿง˜๐Ÿป person in lotus position: light skin tone +1F9D8 1F3FC ; fully-qualified # ๐Ÿง˜๐Ÿผ person in lotus position: medium-light skin tone +1F9D8 1F3FD ; fully-qualified # ๐Ÿง˜๐Ÿฝ person in lotus position: medium skin tone +1F9D8 1F3FE ; fully-qualified # ๐Ÿง˜๐Ÿพ person in lotus position: medium-dark skin tone +1F9D8 1F3FF ; fully-qualified # ๐Ÿง˜๐Ÿฟ person in lotus position: dark skin tone +1F9D8 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜โ€โ™€๏ธ woman in lotus position +1F9D8 200D 2640 ; non-fully-qualified # ๐Ÿง˜โ€โ™€ woman in lotus position +1F9D8 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿปโ€โ™€๏ธ woman in lotus position: light skin tone +1F9D8 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿง˜๐Ÿปโ€โ™€ woman in lotus position: light skin tone +1F9D8 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿผโ€โ™€๏ธ woman in lotus position: medium-light skin tone +1F9D8 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿง˜๐Ÿผโ€โ™€ woman in lotus position: medium-light skin tone +1F9D8 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฝโ€โ™€๏ธ woman in lotus position: medium skin tone +1F9D8 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿง˜๐Ÿฝโ€โ™€ woman in lotus position: medium skin tone +1F9D8 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿพโ€โ™€๏ธ woman in lotus position: medium-dark skin tone +1F9D8 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿง˜๐Ÿพโ€โ™€ woman in lotus position: medium-dark skin tone +1F9D8 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฟโ€โ™€๏ธ woman in lotus position: dark skin tone +1F9D8 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿง˜๐Ÿฟโ€โ™€ woman in lotus position: dark skin tone +1F9D8 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜โ€โ™‚๏ธ man in lotus position +1F9D8 200D 2642 ; non-fully-qualified # ๐Ÿง˜โ€โ™‚ man in lotus position +1F9D8 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿปโ€โ™‚๏ธ man in lotus position: light skin tone +1F9D8 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿง˜๐Ÿปโ€โ™‚ man in lotus position: light skin tone +1F9D8 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿผโ€โ™‚๏ธ man in lotus position: medium-light skin tone +1F9D8 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿง˜๐Ÿผโ€โ™‚ man in lotus position: medium-light skin tone +1F9D8 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฝโ€โ™‚๏ธ man in lotus position: medium skin tone +1F9D8 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿง˜๐Ÿฝโ€โ™‚ man in lotus position: medium skin tone +1F9D8 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿพโ€โ™‚๏ธ man in lotus position: medium-dark skin tone +1F9D8 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿง˜๐Ÿพโ€โ™‚ man in lotus position: medium-dark skin tone +1F9D8 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿง˜๐Ÿฟโ€โ™‚๏ธ man in lotus position: dark skin tone +1F9D8 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿง˜๐Ÿฟโ€โ™‚ man in lotus position: dark skin tone +1F6C0 ; fully-qualified # ๐Ÿ›€ person taking bath +1F6C0 1F3FB ; fully-qualified # ๐Ÿ›€๐Ÿป person taking bath: light skin tone +1F6C0 1F3FC ; fully-qualified # ๐Ÿ›€๐Ÿผ person taking bath: medium-light skin tone +1F6C0 1F3FD ; fully-qualified # ๐Ÿ›€๐Ÿฝ person taking bath: medium skin tone +1F6C0 1F3FE ; fully-qualified # ๐Ÿ›€๐Ÿพ person taking bath: medium-dark skin tone +1F6C0 1F3FF ; fully-qualified # ๐Ÿ›€๐Ÿฟ person taking bath: dark skin tone +1F6CC ; fully-qualified # ๐Ÿ›Œ person in bed +1F6CC 1F3FB ; fully-qualified # ๐Ÿ›Œ๐Ÿป person in bed: light skin tone +1F6CC 1F3FC ; fully-qualified # ๐Ÿ›Œ๐Ÿผ person in bed: medium-light skin tone +1F6CC 1F3FD ; fully-qualified # ๐Ÿ›Œ๐Ÿฝ person in bed: medium skin tone +1F6CC 1F3FE ; fully-qualified # ๐Ÿ›Œ๐Ÿพ person in bed: medium-dark skin tone +1F6CC 1F3FF ; fully-qualified # ๐Ÿ›Œ๐Ÿฟ person in bed: dark skin tone +1F574 FE0F ; fully-qualified # ๐Ÿ•ด๏ธ man in suit levitating +1F574 ; non-fully-qualified # ๐Ÿ•ด man in suit levitating +1F574 1F3FB ; fully-qualified # ๐Ÿ•ด๐Ÿป man in suit levitating: light skin tone +1F574 1F3FC ; fully-qualified # ๐Ÿ•ด๐Ÿผ man in suit levitating: medium-light skin tone +1F574 1F3FD ; fully-qualified # ๐Ÿ•ด๐Ÿฝ man in suit levitating: medium skin tone +1F574 1F3FE ; fully-qualified # ๐Ÿ•ด๐Ÿพ man in suit levitating: medium-dark skin tone +1F574 1F3FF ; fully-qualified # ๐Ÿ•ด๐Ÿฟ man in suit levitating: dark skin tone +1F5E3 FE0F ; fully-qualified # ๐Ÿ—ฃ๏ธ speaking head +1F5E3 ; non-fully-qualified # ๐Ÿ—ฃ speaking head +1F464 ; fully-qualified # ๐Ÿ‘ค bust in silhouette +1F465 ; fully-qualified # ๐Ÿ‘ฅ busts in silhouette + +# subgroup: person-sport +1F93A ; fully-qualified # ๐Ÿคบ person fencing +1F3C7 ; fully-qualified # ๐Ÿ‡ horse racing +1F3C7 1F3FB ; fully-qualified # ๐Ÿ‡๐Ÿป horse racing: light skin tone +1F3C7 1F3FC ; fully-qualified # ๐Ÿ‡๐Ÿผ horse racing: medium-light skin tone +1F3C7 1F3FD ; fully-qualified # ๐Ÿ‡๐Ÿฝ horse racing: medium skin tone +1F3C7 1F3FE ; fully-qualified # ๐Ÿ‡๐Ÿพ horse racing: medium-dark skin tone +1F3C7 1F3FF ; fully-qualified # ๐Ÿ‡๐Ÿฟ horse racing: dark skin tone +26F7 FE0F ; fully-qualified # โ›ท๏ธ skier +26F7 ; non-fully-qualified # โ›ท skier +1F3C2 ; fully-qualified # ๐Ÿ‚ snowboarder +1F3C2 1F3FB ; fully-qualified # ๐Ÿ‚๐Ÿป snowboarder: light skin tone +1F3C2 1F3FC ; fully-qualified # ๐Ÿ‚๐Ÿผ snowboarder: medium-light skin tone +1F3C2 1F3FD ; fully-qualified # ๐Ÿ‚๐Ÿฝ snowboarder: medium skin tone +1F3C2 1F3FE ; fully-qualified # ๐Ÿ‚๐Ÿพ snowboarder: medium-dark skin tone +1F3C2 1F3FF ; fully-qualified # ๐Ÿ‚๐Ÿฟ snowboarder: dark skin tone +1F3CC FE0F ; fully-qualified # ๐ŸŒ๏ธ person golfing +1F3CC ; non-fully-qualified # ๐ŸŒ person golfing +1F3CC 1F3FB ; fully-qualified # ๐ŸŒ๐Ÿป person golfing: light skin tone +1F3CC 1F3FC ; fully-qualified # ๐ŸŒ๐Ÿผ person golfing: medium-light skin tone +1F3CC 1F3FD ; fully-qualified # ๐ŸŒ๐Ÿฝ person golfing: medium skin tone +1F3CC 1F3FE ; fully-qualified # ๐ŸŒ๐Ÿพ person golfing: medium-dark skin tone +1F3CC 1F3FF ; fully-qualified # ๐ŸŒ๐Ÿฟ person golfing: dark skin tone +1F3CC FE0F 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๏ธโ€โ™‚๏ธ man golfing +1F3CC 200D 2642 FE0F ; non-fully-qualified # ๐ŸŒโ€โ™‚๏ธ man golfing +1F3CC FE0F 200D 2642 ; non-fully-qualified # ๐ŸŒ๏ธโ€โ™‚ man golfing +1F3CC 200D 2642 ; non-fully-qualified # ๐ŸŒโ€โ™‚ man golfing +1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿปโ€โ™‚๏ธ man golfing: light skin tone +1F3CC 1F3FB 200D 2642 ; non-fully-qualified # ๐ŸŒ๐Ÿปโ€โ™‚ man golfing: light skin tone +1F3CC 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿผโ€โ™‚๏ธ man golfing: medium-light skin tone +1F3CC 1F3FC 200D 2642 ; non-fully-qualified # ๐ŸŒ๐Ÿผโ€โ™‚ man golfing: medium-light skin tone +1F3CC 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฝโ€โ™‚๏ธ man golfing: medium skin tone +1F3CC 1F3FD 200D 2642 ; non-fully-qualified # ๐ŸŒ๐Ÿฝโ€โ™‚ man golfing: medium skin tone +1F3CC 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿพโ€โ™‚๏ธ man golfing: medium-dark skin tone +1F3CC 1F3FE 200D 2642 ; non-fully-qualified # ๐ŸŒ๐Ÿพโ€โ™‚ man golfing: medium-dark skin tone +1F3CC 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฟโ€โ™‚๏ธ man golfing: dark skin tone +1F3CC 1F3FF 200D 2642 ; non-fully-qualified # ๐ŸŒ๐Ÿฟโ€โ™‚ man golfing: dark skin tone +1F3CC FE0F 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๏ธโ€โ™€๏ธ woman golfing +1F3CC 200D 2640 FE0F ; non-fully-qualified # ๐ŸŒโ€โ™€๏ธ woman golfing +1F3CC FE0F 200D 2640 ; non-fully-qualified # ๐ŸŒ๏ธโ€โ™€ woman golfing +1F3CC 200D 2640 ; non-fully-qualified # ๐ŸŒโ€โ™€ woman golfing +1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿปโ€โ™€๏ธ woman golfing: light skin tone +1F3CC 1F3FB 200D 2640 ; non-fully-qualified # ๐ŸŒ๐Ÿปโ€โ™€ woman golfing: light skin tone +1F3CC 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿผโ€โ™€๏ธ woman golfing: medium-light skin tone +1F3CC 1F3FC 200D 2640 ; non-fully-qualified # ๐ŸŒ๐Ÿผโ€โ™€ woman golfing: medium-light skin tone +1F3CC 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฝโ€โ™€๏ธ woman golfing: medium skin tone +1F3CC 1F3FD 200D 2640 ; non-fully-qualified # ๐ŸŒ๐Ÿฝโ€โ™€ woman golfing: medium skin tone +1F3CC 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿพโ€โ™€๏ธ woman golfing: medium-dark skin tone +1F3CC 1F3FE 200D 2640 ; non-fully-qualified # ๐ŸŒ๐Ÿพโ€โ™€ woman golfing: medium-dark skin tone +1F3CC 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ŸŒ๐Ÿฟโ€โ™€๏ธ woman golfing: dark skin tone +1F3CC 1F3FF 200D 2640 ; non-fully-qualified # ๐ŸŒ๐Ÿฟโ€โ™€ woman golfing: dark skin tone +1F3C4 ; fully-qualified # ๐Ÿ„ person surfing +1F3C4 1F3FB ; fully-qualified # ๐Ÿ„๐Ÿป person surfing: light skin tone +1F3C4 1F3FC ; fully-qualified # ๐Ÿ„๐Ÿผ person surfing: medium-light skin tone +1F3C4 1F3FD ; fully-qualified # ๐Ÿ„๐Ÿฝ person surfing: medium skin tone +1F3C4 1F3FE ; fully-qualified # ๐Ÿ„๐Ÿพ person surfing: medium-dark skin tone +1F3C4 1F3FF ; fully-qualified # ๐Ÿ„๐Ÿฟ person surfing: dark skin tone +1F3C4 200D 2642 FE0F ; fully-qualified # ๐Ÿ„โ€โ™‚๏ธ man surfing +1F3C4 200D 2642 ; non-fully-qualified # ๐Ÿ„โ€โ™‚ man surfing +1F3C4 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿปโ€โ™‚๏ธ man surfing: light skin tone +1F3C4 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ„๐Ÿปโ€โ™‚ man surfing: light skin tone +1F3C4 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿผโ€โ™‚๏ธ man surfing: medium-light skin tone +1F3C4 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ„๐Ÿผโ€โ™‚ man surfing: medium-light skin tone +1F3C4 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฝโ€โ™‚๏ธ man surfing: medium skin tone +1F3C4 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ„๐Ÿฝโ€โ™‚ man surfing: medium skin tone +1F3C4 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿพโ€โ™‚๏ธ man surfing: medium-dark skin tone +1F3C4 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ„๐Ÿพโ€โ™‚ man surfing: medium-dark skin tone +1F3C4 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฟโ€โ™‚๏ธ man surfing: dark skin tone +1F3C4 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ„๐Ÿฟโ€โ™‚ man surfing: dark skin tone +1F3C4 200D 2640 FE0F ; fully-qualified # ๐Ÿ„โ€โ™€๏ธ woman surfing +1F3C4 200D 2640 ; non-fully-qualified # ๐Ÿ„โ€โ™€ woman surfing +1F3C4 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿปโ€โ™€๏ธ woman surfing: light skin tone +1F3C4 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ„๐Ÿปโ€โ™€ woman surfing: light skin tone +1F3C4 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿผโ€โ™€๏ธ woman surfing: medium-light skin tone +1F3C4 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ„๐Ÿผโ€โ™€ woman surfing: medium-light skin tone +1F3C4 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฝโ€โ™€๏ธ woman surfing: medium skin tone +1F3C4 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ„๐Ÿฝโ€โ™€ woman surfing: medium skin tone +1F3C4 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿพโ€โ™€๏ธ woman surfing: medium-dark skin tone +1F3C4 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ„๐Ÿพโ€โ™€ woman surfing: medium-dark skin tone +1F3C4 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ„๐Ÿฟโ€โ™€๏ธ woman surfing: dark skin tone +1F3C4 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ„๐Ÿฟโ€โ™€ woman surfing: dark skin tone +1F6A3 ; fully-qualified # ๐Ÿšฃ person rowing boat +1F6A3 1F3FB ; fully-qualified # ๐Ÿšฃ๐Ÿป person rowing boat: light skin tone +1F6A3 1F3FC ; fully-qualified # ๐Ÿšฃ๐Ÿผ person rowing boat: medium-light skin tone +1F6A3 1F3FD ; fully-qualified # ๐Ÿšฃ๐Ÿฝ person rowing boat: medium skin tone +1F6A3 1F3FE ; fully-qualified # ๐Ÿšฃ๐Ÿพ person rowing boat: medium-dark skin tone +1F6A3 1F3FF ; fully-qualified # ๐Ÿšฃ๐Ÿฟ person rowing boat: dark skin tone +1F6A3 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃโ€โ™‚๏ธ man rowing boat +1F6A3 200D 2642 ; non-fully-qualified # ๐Ÿšฃโ€โ™‚ man rowing boat +1F6A3 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿปโ€โ™‚๏ธ man rowing boat: light skin tone +1F6A3 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿšฃ๐Ÿปโ€โ™‚ man rowing boat: light skin tone +1F6A3 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿผโ€โ™‚๏ธ man rowing boat: medium-light skin tone +1F6A3 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿšฃ๐Ÿผโ€โ™‚ man rowing boat: medium-light skin tone +1F6A3 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™‚๏ธ man rowing boat: medium skin tone +1F6A3 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™‚ man rowing boat: medium skin tone +1F6A3 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿพโ€โ™‚๏ธ man rowing boat: medium-dark skin tone +1F6A3 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿšฃ๐Ÿพโ€โ™‚ man rowing boat: medium-dark skin tone +1F6A3 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™‚๏ธ man rowing boat: dark skin tone +1F6A3 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™‚ man rowing boat: dark skin tone +1F6A3 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃโ€โ™€๏ธ woman rowing boat +1F6A3 200D 2640 ; non-fully-qualified # ๐Ÿšฃโ€โ™€ woman rowing boat +1F6A3 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿปโ€โ™€๏ธ woman rowing boat: light skin tone +1F6A3 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿšฃ๐Ÿปโ€โ™€ woman rowing boat: light skin tone +1F6A3 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿผโ€โ™€๏ธ woman rowing boat: medium-light skin tone +1F6A3 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿšฃ๐Ÿผโ€โ™€ woman rowing boat: medium-light skin tone +1F6A3 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™€๏ธ woman rowing boat: medium skin tone +1F6A3 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿšฃ๐Ÿฝโ€โ™€ woman rowing boat: medium skin tone +1F6A3 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿพโ€โ™€๏ธ woman rowing boat: medium-dark skin tone +1F6A3 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿšฃ๐Ÿพโ€โ™€ woman rowing boat: medium-dark skin tone +1F6A3 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™€๏ธ woman rowing boat: dark skin tone +1F6A3 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿšฃ๐Ÿฟโ€โ™€ woman rowing boat: dark skin tone +1F3CA ; fully-qualified # ๐ŸŠ person swimming +1F3CA 1F3FB ; fully-qualified # ๐ŸŠ๐Ÿป person swimming: light skin tone +1F3CA 1F3FC ; fully-qualified # ๐ŸŠ๐Ÿผ person swimming: medium-light skin tone +1F3CA 1F3FD ; fully-qualified # ๐ŸŠ๐Ÿฝ person swimming: medium skin tone +1F3CA 1F3FE ; fully-qualified # ๐ŸŠ๐Ÿพ person swimming: medium-dark skin tone +1F3CA 1F3FF ; fully-qualified # ๐ŸŠ๐Ÿฟ person swimming: dark skin tone +1F3CA 200D 2642 FE0F ; fully-qualified # ๐ŸŠโ€โ™‚๏ธ man swimming +1F3CA 200D 2642 ; non-fully-qualified # ๐ŸŠโ€โ™‚ man swimming +1F3CA 1F3FB 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿปโ€โ™‚๏ธ man swimming: light skin tone +1F3CA 1F3FB 200D 2642 ; non-fully-qualified # ๐ŸŠ๐Ÿปโ€โ™‚ man swimming: light skin tone +1F3CA 1F3FC 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿผโ€โ™‚๏ธ man swimming: medium-light skin tone +1F3CA 1F3FC 200D 2642 ; non-fully-qualified # ๐ŸŠ๐Ÿผโ€โ™‚ man swimming: medium-light skin tone +1F3CA 1F3FD 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฝโ€โ™‚๏ธ man swimming: medium skin tone +1F3CA 1F3FD 200D 2642 ; non-fully-qualified # ๐ŸŠ๐Ÿฝโ€โ™‚ man swimming: medium skin tone +1F3CA 1F3FE 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿพโ€โ™‚๏ธ man swimming: medium-dark skin tone +1F3CA 1F3FE 200D 2642 ; non-fully-qualified # ๐ŸŠ๐Ÿพโ€โ™‚ man swimming: medium-dark skin tone +1F3CA 1F3FF 200D 2642 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฟโ€โ™‚๏ธ man swimming: dark skin tone +1F3CA 1F3FF 200D 2642 ; non-fully-qualified # ๐ŸŠ๐Ÿฟโ€โ™‚ man swimming: dark skin tone +1F3CA 200D 2640 FE0F ; fully-qualified # ๐ŸŠโ€โ™€๏ธ woman swimming +1F3CA 200D 2640 ; non-fully-qualified # ๐ŸŠโ€โ™€ woman swimming +1F3CA 1F3FB 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿปโ€โ™€๏ธ woman swimming: light skin tone +1F3CA 1F3FB 200D 2640 ; non-fully-qualified # ๐ŸŠ๐Ÿปโ€โ™€ woman swimming: light skin tone +1F3CA 1F3FC 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿผโ€โ™€๏ธ woman swimming: medium-light skin tone +1F3CA 1F3FC 200D 2640 ; non-fully-qualified # ๐ŸŠ๐Ÿผโ€โ™€ woman swimming: medium-light skin tone +1F3CA 1F3FD 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฝโ€โ™€๏ธ woman swimming: medium skin tone +1F3CA 1F3FD 200D 2640 ; non-fully-qualified # ๐ŸŠ๐Ÿฝโ€โ™€ woman swimming: medium skin tone +1F3CA 1F3FE 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿพโ€โ™€๏ธ woman swimming: medium-dark skin tone +1F3CA 1F3FE 200D 2640 ; non-fully-qualified # ๐ŸŠ๐Ÿพโ€โ™€ woman swimming: medium-dark skin tone +1F3CA 1F3FF 200D 2640 FE0F ; fully-qualified # ๐ŸŠ๐Ÿฟโ€โ™€๏ธ woman swimming: dark skin tone +1F3CA 1F3FF 200D 2640 ; non-fully-qualified # ๐ŸŠ๐Ÿฟโ€โ™€ woman swimming: dark skin tone +26F9 FE0F ; fully-qualified # โ›น๏ธ person bouncing ball +26F9 ; non-fully-qualified # โ›น person bouncing ball +26F9 1F3FB ; fully-qualified # โ›น๐Ÿป person bouncing ball: light skin tone +26F9 1F3FC ; fully-qualified # โ›น๐Ÿผ person bouncing ball: medium-light skin tone +26F9 1F3FD ; fully-qualified # โ›น๐Ÿฝ person bouncing ball: medium skin tone +26F9 1F3FE ; fully-qualified # โ›น๐Ÿพ person bouncing ball: medium-dark skin tone +26F9 1F3FF ; fully-qualified # โ›น๐Ÿฟ person bouncing ball: dark skin tone +26F9 FE0F 200D 2642 FE0F ; fully-qualified # โ›น๏ธโ€โ™‚๏ธ man bouncing ball +26F9 200D 2642 FE0F ; non-fully-qualified # โ›นโ€โ™‚๏ธ man bouncing ball +26F9 FE0F 200D 2642 ; non-fully-qualified # โ›น๏ธโ€โ™‚ man bouncing ball +26F9 200D 2642 ; non-fully-qualified # โ›นโ€โ™‚ man bouncing ball +26F9 1F3FB 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿปโ€โ™‚๏ธ man bouncing ball: light skin tone +26F9 1F3FB 200D 2642 ; non-fully-qualified # โ›น๐Ÿปโ€โ™‚ man bouncing ball: light skin tone +26F9 1F3FC 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿผโ€โ™‚๏ธ man bouncing ball: medium-light skin tone +26F9 1F3FC 200D 2642 ; non-fully-qualified # โ›น๐Ÿผโ€โ™‚ man bouncing ball: medium-light skin tone +26F9 1F3FD 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿฝโ€โ™‚๏ธ man bouncing ball: medium skin tone +26F9 1F3FD 200D 2642 ; non-fully-qualified # โ›น๐Ÿฝโ€โ™‚ man bouncing ball: medium skin tone +26F9 1F3FE 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿพโ€โ™‚๏ธ man bouncing ball: medium-dark skin tone +26F9 1F3FE 200D 2642 ; non-fully-qualified # โ›น๐Ÿพโ€โ™‚ man bouncing ball: medium-dark skin tone +26F9 1F3FF 200D 2642 FE0F ; fully-qualified # โ›น๐Ÿฟโ€โ™‚๏ธ man bouncing ball: dark skin tone +26F9 1F3FF 200D 2642 ; non-fully-qualified # โ›น๐Ÿฟโ€โ™‚ man bouncing ball: dark skin tone +26F9 FE0F 200D 2640 FE0F ; fully-qualified # โ›น๏ธโ€โ™€๏ธ woman bouncing ball +26F9 200D 2640 FE0F ; non-fully-qualified # โ›นโ€โ™€๏ธ woman bouncing ball +26F9 FE0F 200D 2640 ; non-fully-qualified # โ›น๏ธโ€โ™€ woman bouncing ball +26F9 200D 2640 ; non-fully-qualified # โ›นโ€โ™€ woman bouncing ball +26F9 1F3FB 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿปโ€โ™€๏ธ woman bouncing ball: light skin tone +26F9 1F3FB 200D 2640 ; non-fully-qualified # โ›น๐Ÿปโ€โ™€ woman bouncing ball: light skin tone +26F9 1F3FC 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿผโ€โ™€๏ธ woman bouncing ball: medium-light skin tone +26F9 1F3FC 200D 2640 ; non-fully-qualified # โ›น๐Ÿผโ€โ™€ woman bouncing ball: medium-light skin tone +26F9 1F3FD 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿฝโ€โ™€๏ธ woman bouncing ball: medium skin tone +26F9 1F3FD 200D 2640 ; non-fully-qualified # โ›น๐Ÿฝโ€โ™€ woman bouncing ball: medium skin tone +26F9 1F3FE 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿพโ€โ™€๏ธ woman bouncing ball: medium-dark skin tone +26F9 1F3FE 200D 2640 ; non-fully-qualified # โ›น๐Ÿพโ€โ™€ woman bouncing ball: medium-dark skin tone +26F9 1F3FF 200D 2640 FE0F ; fully-qualified # โ›น๐Ÿฟโ€โ™€๏ธ woman bouncing ball: dark skin tone +26F9 1F3FF 200D 2640 ; non-fully-qualified # โ›น๐Ÿฟโ€โ™€ woman bouncing ball: dark skin tone +1F3CB FE0F ; fully-qualified # ๐Ÿ‹๏ธ person lifting weights +1F3CB ; non-fully-qualified # ๐Ÿ‹ person lifting weights +1F3CB 1F3FB ; fully-qualified # ๐Ÿ‹๐Ÿป person lifting weights: light skin tone +1F3CB 1F3FC ; fully-qualified # ๐Ÿ‹๐Ÿผ person lifting weights: medium-light skin tone +1F3CB 1F3FD ; fully-qualified # ๐Ÿ‹๐Ÿฝ person lifting weights: medium skin tone +1F3CB 1F3FE ; fully-qualified # ๐Ÿ‹๐Ÿพ person lifting weights: medium-dark skin tone +1F3CB 1F3FF ; fully-qualified # ๐Ÿ‹๐Ÿฟ person lifting weights: dark skin tone +1F3CB FE0F 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๏ธโ€โ™‚๏ธ man lifting weights +1F3CB 200D 2642 FE0F ; non-fully-qualified # ๐Ÿ‹โ€โ™‚๏ธ man lifting weights +1F3CB FE0F 200D 2642 ; non-fully-qualified # ๐Ÿ‹๏ธโ€โ™‚ man lifting weights +1F3CB 200D 2642 ; non-fully-qualified # ๐Ÿ‹โ€โ™‚ man lifting weights +1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™‚๏ธ man lifting weights: light skin tone +1F3CB 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™‚ man lifting weights: light skin tone +1F3CB 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿผโ€โ™‚๏ธ man lifting weights: medium-light skin tone +1F3CB 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿ‹๐Ÿผโ€โ™‚ man lifting weights: medium-light skin tone +1F3CB 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฝโ€โ™‚๏ธ man lifting weights: medium skin tone +1F3CB 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿ‹๐Ÿฝโ€โ™‚ man lifting weights: medium skin tone +1F3CB 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿพโ€โ™‚๏ธ man lifting weights: medium-dark skin tone +1F3CB 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿ‹๐Ÿพโ€โ™‚ man lifting weights: medium-dark skin tone +1F3CB 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฟโ€โ™‚๏ธ man lifting weights: dark skin tone +1F3CB 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿ‹๐Ÿฟโ€โ™‚ man lifting weights: dark skin tone +1F3CB FE0F 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๏ธโ€โ™€๏ธ woman lifting weights +1F3CB 200D 2640 FE0F ; non-fully-qualified # ๐Ÿ‹โ€โ™€๏ธ woman lifting weights +1F3CB FE0F 200D 2640 ; non-fully-qualified # ๐Ÿ‹๏ธโ€โ™€ woman lifting weights +1F3CB 200D 2640 ; non-fully-qualified # ๐Ÿ‹โ€โ™€ woman lifting weights +1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™€๏ธ woman lifting weights: light skin tone +1F3CB 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿ‹๐Ÿปโ€โ™€ woman lifting weights: light skin tone +1F3CB 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿผโ€โ™€๏ธ woman lifting weights: medium-light skin tone +1F3CB 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿ‹๐Ÿผโ€โ™€ woman lifting weights: medium-light skin tone +1F3CB 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฝโ€โ™€๏ธ woman lifting weights: medium skin tone +1F3CB 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿ‹๐Ÿฝโ€โ™€ woman lifting weights: medium skin tone +1F3CB 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿพโ€โ™€๏ธ woman lifting weights: medium-dark skin tone +1F3CB 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿ‹๐Ÿพโ€โ™€ woman lifting weights: medium-dark skin tone +1F3CB 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿ‹๐Ÿฟโ€โ™€๏ธ woman lifting weights: dark skin tone +1F3CB 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿ‹๐Ÿฟโ€โ™€ woman lifting weights: dark skin tone +1F6B4 ; fully-qualified # ๐Ÿšด person biking +1F6B4 1F3FB ; fully-qualified # ๐Ÿšด๐Ÿป person biking: light skin tone +1F6B4 1F3FC ; fully-qualified # ๐Ÿšด๐Ÿผ person biking: medium-light skin tone +1F6B4 1F3FD ; fully-qualified # ๐Ÿšด๐Ÿฝ person biking: medium skin tone +1F6B4 1F3FE ; fully-qualified # ๐Ÿšด๐Ÿพ person biking: medium-dark skin tone +1F6B4 1F3FF ; fully-qualified # ๐Ÿšด๐Ÿฟ person biking: dark skin tone +1F6B4 200D 2642 FE0F ; fully-qualified # ๐Ÿšดโ€โ™‚๏ธ man biking +1F6B4 200D 2642 ; non-fully-qualified # ๐Ÿšดโ€โ™‚ man biking +1F6B4 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿปโ€โ™‚๏ธ man biking: light skin tone +1F6B4 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿšด๐Ÿปโ€โ™‚ man biking: light skin tone +1F6B4 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿผโ€โ™‚๏ธ man biking: medium-light skin tone +1F6B4 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿšด๐Ÿผโ€โ™‚ man biking: medium-light skin tone +1F6B4 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฝโ€โ™‚๏ธ man biking: medium skin tone +1F6B4 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿšด๐Ÿฝโ€โ™‚ man biking: medium skin tone +1F6B4 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿพโ€โ™‚๏ธ man biking: medium-dark skin tone +1F6B4 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿšด๐Ÿพโ€โ™‚ man biking: medium-dark skin tone +1F6B4 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฟโ€โ™‚๏ธ man biking: dark skin tone +1F6B4 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿšด๐Ÿฟโ€โ™‚ man biking: dark skin tone +1F6B4 200D 2640 FE0F ; fully-qualified # ๐Ÿšดโ€โ™€๏ธ woman biking +1F6B4 200D 2640 ; non-fully-qualified # ๐Ÿšดโ€โ™€ woman biking +1F6B4 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿปโ€โ™€๏ธ woman biking: light skin tone +1F6B4 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿšด๐Ÿปโ€โ™€ woman biking: light skin tone +1F6B4 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿผโ€โ™€๏ธ woman biking: medium-light skin tone +1F6B4 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿšด๐Ÿผโ€โ™€ woman biking: medium-light skin tone +1F6B4 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฝโ€โ™€๏ธ woman biking: medium skin tone +1F6B4 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿšด๐Ÿฝโ€โ™€ woman biking: medium skin tone +1F6B4 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿพโ€โ™€๏ธ woman biking: medium-dark skin tone +1F6B4 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿšด๐Ÿพโ€โ™€ woman biking: medium-dark skin tone +1F6B4 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšด๐Ÿฟโ€โ™€๏ธ woman biking: dark skin tone +1F6B4 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿšด๐Ÿฟโ€โ™€ woman biking: dark skin tone +1F6B5 ; fully-qualified # ๐Ÿšต person mountain biking +1F6B5 1F3FB ; fully-qualified # ๐Ÿšต๐Ÿป person mountain biking: light skin tone +1F6B5 1F3FC ; fully-qualified # ๐Ÿšต๐Ÿผ person mountain biking: medium-light skin tone +1F6B5 1F3FD ; fully-qualified # ๐Ÿšต๐Ÿฝ person mountain biking: medium skin tone +1F6B5 1F3FE ; fully-qualified # ๐Ÿšต๐Ÿพ person mountain biking: medium-dark skin tone +1F6B5 1F3FF ; fully-qualified # ๐Ÿšต๐Ÿฟ person mountain biking: dark skin tone +1F6B5 200D 2642 FE0F ; fully-qualified # ๐Ÿšตโ€โ™‚๏ธ man mountain biking +1F6B5 200D 2642 ; non-fully-qualified # ๐Ÿšตโ€โ™‚ man mountain biking +1F6B5 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿปโ€โ™‚๏ธ man mountain biking: light skin tone +1F6B5 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿšต๐Ÿปโ€โ™‚ man mountain biking: light skin tone +1F6B5 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿผโ€โ™‚๏ธ man mountain biking: medium-light skin tone +1F6B5 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿšต๐Ÿผโ€โ™‚ man mountain biking: medium-light skin tone +1F6B5 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฝโ€โ™‚๏ธ man mountain biking: medium skin tone +1F6B5 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿšต๐Ÿฝโ€โ™‚ man mountain biking: medium skin tone +1F6B5 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿพโ€โ™‚๏ธ man mountain biking: medium-dark skin tone +1F6B5 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿšต๐Ÿพโ€โ™‚ man mountain biking: medium-dark skin tone +1F6B5 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฟโ€โ™‚๏ธ man mountain biking: dark skin tone +1F6B5 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿšต๐Ÿฟโ€โ™‚ man mountain biking: dark skin tone +1F6B5 200D 2640 FE0F ; fully-qualified # ๐Ÿšตโ€โ™€๏ธ woman mountain biking +1F6B5 200D 2640 ; non-fully-qualified # ๐Ÿšตโ€โ™€ woman mountain biking +1F6B5 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿปโ€โ™€๏ธ woman mountain biking: light skin tone +1F6B5 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿšต๐Ÿปโ€โ™€ woman mountain biking: light skin tone +1F6B5 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿผโ€โ™€๏ธ woman mountain biking: medium-light skin tone +1F6B5 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿšต๐Ÿผโ€โ™€ woman mountain biking: medium-light skin tone +1F6B5 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฝโ€โ™€๏ธ woman mountain biking: medium skin tone +1F6B5 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿšต๐Ÿฝโ€โ™€ woman mountain biking: medium skin tone +1F6B5 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿพโ€โ™€๏ธ woman mountain biking: medium-dark skin tone +1F6B5 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿšต๐Ÿพโ€โ™€ woman mountain biking: medium-dark skin tone +1F6B5 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿšต๐Ÿฟโ€โ™€๏ธ woman mountain biking: dark skin tone +1F6B5 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿšต๐Ÿฟโ€โ™€ woman mountain biking: dark skin tone +1F3CE FE0F ; fully-qualified # ๐ŸŽ๏ธ racing car +1F3CE ; non-fully-qualified # ๐ŸŽ racing car +1F3CD FE0F ; fully-qualified # ๐Ÿ๏ธ motorcycle +1F3CD ; non-fully-qualified # ๐Ÿ motorcycle +1F938 ; fully-qualified # ๐Ÿคธ person cartwheeling +1F938 1F3FB ; fully-qualified # ๐Ÿคธ๐Ÿป person cartwheeling: light skin tone +1F938 1F3FC ; fully-qualified # ๐Ÿคธ๐Ÿผ person cartwheeling: medium-light skin tone +1F938 1F3FD ; fully-qualified # ๐Ÿคธ๐Ÿฝ person cartwheeling: medium skin tone +1F938 1F3FE ; fully-qualified # ๐Ÿคธ๐Ÿพ person cartwheeling: medium-dark skin tone +1F938 1F3FF ; fully-qualified # ๐Ÿคธ๐Ÿฟ person cartwheeling: dark skin tone +1F938 200D 2642 FE0F ; fully-qualified # ๐Ÿคธโ€โ™‚๏ธ man cartwheeling +1F938 200D 2642 ; non-fully-qualified # ๐Ÿคธโ€โ™‚ man cartwheeling +1F938 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿปโ€โ™‚๏ธ man cartwheeling: light skin tone +1F938 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿคธ๐Ÿปโ€โ™‚ man cartwheeling: light skin tone +1F938 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿผโ€โ™‚๏ธ man cartwheeling: medium-light skin tone +1F938 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿคธ๐Ÿผโ€โ™‚ man cartwheeling: medium-light skin tone +1F938 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฝโ€โ™‚๏ธ man cartwheeling: medium skin tone +1F938 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿคธ๐Ÿฝโ€โ™‚ man cartwheeling: medium skin tone +1F938 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿพโ€โ™‚๏ธ man cartwheeling: medium-dark skin tone +1F938 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿคธ๐Ÿพโ€โ™‚ man cartwheeling: medium-dark skin tone +1F938 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฟโ€โ™‚๏ธ man cartwheeling: dark skin tone +1F938 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿคธ๐Ÿฟโ€โ™‚ man cartwheeling: dark skin tone +1F938 200D 2640 FE0F ; fully-qualified # ๐Ÿคธโ€โ™€๏ธ woman cartwheeling +1F938 200D 2640 ; non-fully-qualified # ๐Ÿคธโ€โ™€ woman cartwheeling +1F938 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿปโ€โ™€๏ธ woman cartwheeling: light skin tone +1F938 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿคธ๐Ÿปโ€โ™€ woman cartwheeling: light skin tone +1F938 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿผโ€โ™€๏ธ woman cartwheeling: medium-light skin tone +1F938 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿคธ๐Ÿผโ€โ™€ woman cartwheeling: medium-light skin tone +1F938 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฝโ€โ™€๏ธ woman cartwheeling: medium skin tone +1F938 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿคธ๐Ÿฝโ€โ™€ woman cartwheeling: medium skin tone +1F938 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿพโ€โ™€๏ธ woman cartwheeling: medium-dark skin tone +1F938 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿคธ๐Ÿพโ€โ™€ woman cartwheeling: medium-dark skin tone +1F938 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคธ๐Ÿฟโ€โ™€๏ธ woman cartwheeling: dark skin tone +1F938 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿคธ๐Ÿฟโ€โ™€ woman cartwheeling: dark skin tone +1F93C ; fully-qualified # ๐Ÿคผ people wrestling +1F93C 200D 2642 FE0F ; fully-qualified # ๐Ÿคผโ€โ™‚๏ธ men wrestling +1F93C 200D 2642 ; non-fully-qualified # ๐Ÿคผโ€โ™‚ men wrestling +1F93C 200D 2640 FE0F ; fully-qualified # ๐Ÿคผโ€โ™€๏ธ women wrestling +1F93C 200D 2640 ; non-fully-qualified # ๐Ÿคผโ€โ™€ women wrestling +1F93D ; fully-qualified # ๐Ÿคฝ person playing water polo +1F93D 1F3FB ; fully-qualified # ๐Ÿคฝ๐Ÿป person playing water polo: light skin tone +1F93D 1F3FC ; fully-qualified # ๐Ÿคฝ๐Ÿผ person playing water polo: medium-light skin tone +1F93D 1F3FD ; fully-qualified # ๐Ÿคฝ๐Ÿฝ person playing water polo: medium skin tone +1F93D 1F3FE ; fully-qualified # ๐Ÿคฝ๐Ÿพ person playing water polo: medium-dark skin tone +1F93D 1F3FF ; fully-qualified # ๐Ÿคฝ๐Ÿฟ person playing water polo: dark skin tone +1F93D 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝโ€โ™‚๏ธ man playing water polo +1F93D 200D 2642 ; non-fully-qualified # ๐Ÿคฝโ€โ™‚ man playing water polo +1F93D 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿปโ€โ™‚๏ธ man playing water polo: light skin tone +1F93D 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿคฝ๐Ÿปโ€โ™‚ man playing water polo: light skin tone +1F93D 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿผโ€โ™‚๏ธ man playing water polo: medium-light skin tone +1F93D 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿคฝ๐Ÿผโ€โ™‚ man playing water polo: medium-light skin tone +1F93D 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™‚๏ธ man playing water polo: medium skin tone +1F93D 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™‚ man playing water polo: medium skin tone +1F93D 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿพโ€โ™‚๏ธ man playing water polo: medium-dark skin tone +1F93D 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿคฝ๐Ÿพโ€โ™‚ man playing water polo: medium-dark skin tone +1F93D 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™‚๏ธ man playing water polo: dark skin tone +1F93D 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™‚ man playing water polo: dark skin tone +1F93D 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝโ€โ™€๏ธ woman playing water polo +1F93D 200D 2640 ; non-fully-qualified # ๐Ÿคฝโ€โ™€ woman playing water polo +1F93D 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿปโ€โ™€๏ธ woman playing water polo: light skin tone +1F93D 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿคฝ๐Ÿปโ€โ™€ woman playing water polo: light skin tone +1F93D 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿผโ€โ™€๏ธ woman playing water polo: medium-light skin tone +1F93D 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿคฝ๐Ÿผโ€โ™€ woman playing water polo: medium-light skin tone +1F93D 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™€๏ธ woman playing water polo: medium skin tone +1F93D 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿคฝ๐Ÿฝโ€โ™€ woman playing water polo: medium skin tone +1F93D 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿพโ€โ™€๏ธ woman playing water polo: medium-dark skin tone +1F93D 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿคฝ๐Ÿพโ€โ™€ woman playing water polo: medium-dark skin tone +1F93D 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™€๏ธ woman playing water polo: dark skin tone +1F93D 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿคฝ๐Ÿฟโ€โ™€ woman playing water polo: dark skin tone +1F93E ; fully-qualified # ๐Ÿคพ person playing handball +1F93E 1F3FB ; fully-qualified # ๐Ÿคพ๐Ÿป person playing handball: light skin tone +1F93E 1F3FC ; fully-qualified # ๐Ÿคพ๐Ÿผ person playing handball: medium-light skin tone +1F93E 1F3FD ; fully-qualified # ๐Ÿคพ๐Ÿฝ person playing handball: medium skin tone +1F93E 1F3FE ; fully-qualified # ๐Ÿคพ๐Ÿพ person playing handball: medium-dark skin tone +1F93E 1F3FF ; fully-qualified # ๐Ÿคพ๐Ÿฟ person playing handball: dark skin tone +1F93E 200D 2642 FE0F ; fully-qualified # ๐Ÿคพโ€โ™‚๏ธ man playing handball +1F93E 200D 2642 ; non-fully-qualified # ๐Ÿคพโ€โ™‚ man playing handball +1F93E 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿปโ€โ™‚๏ธ man playing handball: light skin tone +1F93E 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿคพ๐Ÿปโ€โ™‚ man playing handball: light skin tone +1F93E 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿผโ€โ™‚๏ธ man playing handball: medium-light skin tone +1F93E 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿคพ๐Ÿผโ€โ™‚ man playing handball: medium-light skin tone +1F93E 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฝโ€โ™‚๏ธ man playing handball: medium skin tone +1F93E 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿคพ๐Ÿฝโ€โ™‚ man playing handball: medium skin tone +1F93E 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿพโ€โ™‚๏ธ man playing handball: medium-dark skin tone +1F93E 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿคพ๐Ÿพโ€โ™‚ man playing handball: medium-dark skin tone +1F93E 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฟโ€โ™‚๏ธ man playing handball: dark skin tone +1F93E 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿคพ๐Ÿฟโ€โ™‚ man playing handball: dark skin tone +1F93E 200D 2640 FE0F ; fully-qualified # ๐Ÿคพโ€โ™€๏ธ woman playing handball +1F93E 200D 2640 ; non-fully-qualified # ๐Ÿคพโ€โ™€ woman playing handball +1F93E 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿปโ€โ™€๏ธ woman playing handball: light skin tone +1F93E 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿคพ๐Ÿปโ€โ™€ woman playing handball: light skin tone +1F93E 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿผโ€โ™€๏ธ woman playing handball: medium-light skin tone +1F93E 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿคพ๐Ÿผโ€โ™€ woman playing handball: medium-light skin tone +1F93E 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฝโ€โ™€๏ธ woman playing handball: medium skin tone +1F93E 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿคพ๐Ÿฝโ€โ™€ woman playing handball: medium skin tone +1F93E 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿพโ€โ™€๏ธ woman playing handball: medium-dark skin tone +1F93E 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿคพ๐Ÿพโ€โ™€ woman playing handball: medium-dark skin tone +1F93E 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคพ๐Ÿฟโ€โ™€๏ธ woman playing handball: dark skin tone +1F93E 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿคพ๐Ÿฟโ€โ™€ woman playing handball: dark skin tone +1F939 ; fully-qualified # ๐Ÿคน person juggling +1F939 1F3FB ; fully-qualified # ๐Ÿคน๐Ÿป person juggling: light skin tone +1F939 1F3FC ; fully-qualified # ๐Ÿคน๐Ÿผ person juggling: medium-light skin tone +1F939 1F3FD ; fully-qualified # ๐Ÿคน๐Ÿฝ person juggling: medium skin tone +1F939 1F3FE ; fully-qualified # ๐Ÿคน๐Ÿพ person juggling: medium-dark skin tone +1F939 1F3FF ; fully-qualified # ๐Ÿคน๐Ÿฟ person juggling: dark skin tone +1F939 200D 2642 FE0F ; fully-qualified # ๐Ÿคนโ€โ™‚๏ธ man juggling +1F939 200D 2642 ; non-fully-qualified # ๐Ÿคนโ€โ™‚ man juggling +1F939 1F3FB 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿปโ€โ™‚๏ธ man juggling: light skin tone +1F939 1F3FB 200D 2642 ; non-fully-qualified # ๐Ÿคน๐Ÿปโ€โ™‚ man juggling: light skin tone +1F939 1F3FC 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿผโ€โ™‚๏ธ man juggling: medium-light skin tone +1F939 1F3FC 200D 2642 ; non-fully-qualified # ๐Ÿคน๐Ÿผโ€โ™‚ man juggling: medium-light skin tone +1F939 1F3FD 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฝโ€โ™‚๏ธ man juggling: medium skin tone +1F939 1F3FD 200D 2642 ; non-fully-qualified # ๐Ÿคน๐Ÿฝโ€โ™‚ man juggling: medium skin tone +1F939 1F3FE 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿพโ€โ™‚๏ธ man juggling: medium-dark skin tone +1F939 1F3FE 200D 2642 ; non-fully-qualified # ๐Ÿคน๐Ÿพโ€โ™‚ man juggling: medium-dark skin tone +1F939 1F3FF 200D 2642 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฟโ€โ™‚๏ธ man juggling: dark skin tone +1F939 1F3FF 200D 2642 ; non-fully-qualified # ๐Ÿคน๐Ÿฟโ€โ™‚ man juggling: dark skin tone +1F939 200D 2640 FE0F ; fully-qualified # ๐Ÿคนโ€โ™€๏ธ woman juggling +1F939 200D 2640 ; non-fully-qualified # ๐Ÿคนโ€โ™€ woman juggling +1F939 1F3FB 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿปโ€โ™€๏ธ woman juggling: light skin tone +1F939 1F3FB 200D 2640 ; non-fully-qualified # ๐Ÿคน๐Ÿปโ€โ™€ woman juggling: light skin tone +1F939 1F3FC 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿผโ€โ™€๏ธ woman juggling: medium-light skin tone +1F939 1F3FC 200D 2640 ; non-fully-qualified # ๐Ÿคน๐Ÿผโ€โ™€ woman juggling: medium-light skin tone +1F939 1F3FD 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฝโ€โ™€๏ธ woman juggling: medium skin tone +1F939 1F3FD 200D 2640 ; non-fully-qualified # ๐Ÿคน๐Ÿฝโ€โ™€ woman juggling: medium skin tone +1F939 1F3FE 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿพโ€โ™€๏ธ woman juggling: medium-dark skin tone +1F939 1F3FE 200D 2640 ; non-fully-qualified # ๐Ÿคน๐Ÿพโ€โ™€ woman juggling: medium-dark skin tone +1F939 1F3FF 200D 2640 FE0F ; fully-qualified # ๐Ÿคน๐Ÿฟโ€โ™€๏ธ woman juggling: dark skin tone +1F939 1F3FF 200D 2640 ; non-fully-qualified # ๐Ÿคน๐Ÿฟโ€โ™€ woman juggling: dark skin tone + +# subgroup: family +1F46B ; fully-qualified # ๐Ÿ‘ซ man and woman holding hands +1F46C ; fully-qualified # ๐Ÿ‘ฌ two men holding hands +1F46D ; fully-qualified # ๐Ÿ‘ญ two women holding hands +1F48F ; fully-qualified # ๐Ÿ’ kiss +1F469 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: woman, man +1F469 200D 2764 200D 1F48B 200D 1F468 ; non-fully-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: woman, man +1F468 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # ๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: man, man +1F468 200D 2764 200D 1F48B 200D 1F468 ; non-fully-qualified # ๐Ÿ‘จโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ kiss: man, man +1F469 200D 2764 FE0F 200D 1F48B 200D 1F469 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ kiss: woman, woman +1F469 200D 2764 200D 1F48B 200D 1F469 ; non-fully-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ kiss: woman, woman +1F491 ; fully-qualified # ๐Ÿ’‘ couple with heart +1F469 200D 2764 FE0F 200D 1F468 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ couple with heart: woman, man +1F469 200D 2764 200D 1F468 ; non-fully-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ‘จ couple with heart: woman, man +1F468 200D 2764 FE0F 200D 1F468 ; fully-qualified # ๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ couple with heart: man, man +1F468 200D 2764 200D 1F468 ; non-fully-qualified # ๐Ÿ‘จโ€โคโ€๐Ÿ‘จ couple with heart: man, man +1F469 200D 2764 FE0F 200D 1F469 ; fully-qualified # ๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ couple with heart: woman, woman +1F469 200D 2764 200D 1F469 ; non-fully-qualified # ๐Ÿ‘ฉโ€โคโ€๐Ÿ‘ฉ couple with heart: woman, woman +1F46A ; fully-qualified # ๐Ÿ‘ช family +1F468 200D 1F469 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ family: man, woman, boy +1F468 200D 1F469 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง family: man, woman, girl +1F468 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: man, woman, girl, boy +1F468 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: man, woman, boy, boy +1F468 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family: man, woman, girl, girl +1F468 200D 1F468 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ family: man, man, boy +1F468 200D 1F468 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง family: man, man, girl +1F468 200D 1F468 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: man, man, girl, boy +1F468 200D 1F468 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: man, man, boy, boy +1F468 200D 1F468 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง family: man, man, girl, girl +1F469 200D 1F469 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ family: woman, woman, boy +1F469 200D 1F469 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง family: woman, woman, girl +1F469 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: woman, woman, girl, boy +1F469 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: woman, woman, boy, boy +1F469 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family: woman, woman, girl, girl +1F468 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฆ family: man, boy +1F468 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: man, boy, boy +1F468 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘ง family: man, girl +1F468 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: man, girl, boy +1F468 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง family: man, girl, girl +1F469 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฆ family: woman, boy +1F469 200D 1F466 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ family: woman, boy, boy +1F469 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘ง family: woman, girl +1F469 200D 1F467 200D 1F466 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ family: woman, girl, boy +1F469 200D 1F467 200D 1F467 ; fully-qualified # ๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง family: woman, girl, girl + +# subgroup: body +1F933 ; fully-qualified # ๐Ÿคณ selfie +1F933 1F3FB ; fully-qualified # ๐Ÿคณ๐Ÿป selfie: light skin tone +1F933 1F3FC ; fully-qualified # ๐Ÿคณ๐Ÿผ selfie: medium-light skin tone +1F933 1F3FD ; fully-qualified # ๐Ÿคณ๐Ÿฝ selfie: medium skin tone +1F933 1F3FE ; fully-qualified # ๐Ÿคณ๐Ÿพ selfie: medium-dark skin tone +1F933 1F3FF ; fully-qualified # ๐Ÿคณ๐Ÿฟ selfie: dark skin tone +1F4AA ; fully-qualified # ๐Ÿ’ช flexed biceps +1F4AA 1F3FB ; fully-qualified # ๐Ÿ’ช๐Ÿป flexed biceps: light skin tone +1F4AA 1F3FC ; fully-qualified # ๐Ÿ’ช๐Ÿผ flexed biceps: medium-light skin tone +1F4AA 1F3FD ; fully-qualified # ๐Ÿ’ช๐Ÿฝ flexed biceps: medium skin tone +1F4AA 1F3FE ; fully-qualified # ๐Ÿ’ช๐Ÿพ flexed biceps: medium-dark skin tone +1F4AA 1F3FF ; fully-qualified # ๐Ÿ’ช๐Ÿฟ flexed biceps: dark skin tone +1F9B5 ; fully-qualified # ๐Ÿฆต leg +1F9B5 1F3FB ; fully-qualified # ๐Ÿฆต๐Ÿป leg: light skin tone +1F9B5 1F3FC ; fully-qualified # ๐Ÿฆต๐Ÿผ leg: medium-light skin tone +1F9B5 1F3FD ; fully-qualified # ๐Ÿฆต๐Ÿฝ leg: medium skin tone +1F9B5 1F3FE ; fully-qualified # ๐Ÿฆต๐Ÿพ leg: medium-dark skin tone +1F9B5 1F3FF ; fully-qualified # ๐Ÿฆต๐Ÿฟ leg: dark skin tone +1F9B6 ; fully-qualified # ๐Ÿฆถ foot +1F9B6 1F3FB ; fully-qualified # ๐Ÿฆถ๐Ÿป foot: light skin tone +1F9B6 1F3FC ; fully-qualified # ๐Ÿฆถ๐Ÿผ foot: medium-light skin tone +1F9B6 1F3FD ; fully-qualified # ๐Ÿฆถ๐Ÿฝ foot: medium skin tone +1F9B6 1F3FE ; fully-qualified # ๐Ÿฆถ๐Ÿพ foot: medium-dark skin tone +1F9B6 1F3FF ; fully-qualified # ๐Ÿฆถ๐Ÿฟ foot: dark skin tone +1F448 ; fully-qualified # ๐Ÿ‘ˆ backhand index pointing left +1F448 1F3FB ; fully-qualified # ๐Ÿ‘ˆ๐Ÿป backhand index pointing left: light skin tone +1F448 1F3FC ; fully-qualified # ๐Ÿ‘ˆ๐Ÿผ backhand index pointing left: medium-light skin tone +1F448 1F3FD ; fully-qualified # ๐Ÿ‘ˆ๐Ÿฝ backhand index pointing left: medium skin tone +1F448 1F3FE ; fully-qualified # ๐Ÿ‘ˆ๐Ÿพ backhand index pointing left: medium-dark skin tone +1F448 1F3FF ; fully-qualified # ๐Ÿ‘ˆ๐Ÿฟ backhand index pointing left: dark skin tone +1F449 ; fully-qualified # ๐Ÿ‘‰ backhand index pointing right +1F449 1F3FB ; fully-qualified # ๐Ÿ‘‰๐Ÿป backhand index pointing right: light skin tone +1F449 1F3FC ; fully-qualified # ๐Ÿ‘‰๐Ÿผ backhand index pointing right: medium-light skin tone +1F449 1F3FD ; fully-qualified # ๐Ÿ‘‰๐Ÿฝ backhand index pointing right: medium skin tone +1F449 1F3FE ; fully-qualified # ๐Ÿ‘‰๐Ÿพ backhand index pointing right: medium-dark skin tone +1F449 1F3FF ; fully-qualified # ๐Ÿ‘‰๐Ÿฟ backhand index pointing right: dark skin tone +261D FE0F ; fully-qualified # โ˜๏ธ index pointing up +261D ; non-fully-qualified # โ˜ index pointing up +261D 1F3FB ; fully-qualified # โ˜๐Ÿป index pointing up: light skin tone +261D 1F3FC ; fully-qualified # โ˜๐Ÿผ index pointing up: medium-light skin tone +261D 1F3FD ; fully-qualified # โ˜๐Ÿฝ index pointing up: medium skin tone +261D 1F3FE ; fully-qualified # โ˜๐Ÿพ index pointing up: medium-dark skin tone +261D 1F3FF ; fully-qualified # โ˜๐Ÿฟ index pointing up: dark skin tone +1F446 ; fully-qualified # ๐Ÿ‘† backhand index pointing up +1F446 1F3FB ; fully-qualified # ๐Ÿ‘†๐Ÿป backhand index pointing up: light skin tone +1F446 1F3FC ; fully-qualified # ๐Ÿ‘†๐Ÿผ backhand index pointing up: medium-light skin tone +1F446 1F3FD ; fully-qualified # ๐Ÿ‘†๐Ÿฝ backhand index pointing up: medium skin tone +1F446 1F3FE ; fully-qualified # ๐Ÿ‘†๐Ÿพ backhand index pointing up: medium-dark skin tone +1F446 1F3FF ; fully-qualified # ๐Ÿ‘†๐Ÿฟ backhand index pointing up: dark skin tone +1F595 ; fully-qualified # ๐Ÿ–• middle finger +1F595 1F3FB ; fully-qualified # ๐Ÿ–•๐Ÿป middle finger: light skin tone +1F595 1F3FC ; fully-qualified # ๐Ÿ–•๐Ÿผ middle finger: medium-light skin tone +1F595 1F3FD ; fully-qualified # ๐Ÿ–•๐Ÿฝ middle finger: medium skin tone +1F595 1F3FE ; fully-qualified # ๐Ÿ–•๐Ÿพ middle finger: medium-dark skin tone +1F595 1F3FF ; fully-qualified # ๐Ÿ–•๐Ÿฟ middle finger: dark skin tone +1F447 ; fully-qualified # ๐Ÿ‘‡ backhand index pointing down +1F447 1F3FB ; fully-qualified # ๐Ÿ‘‡๐Ÿป backhand index pointing down: light skin tone +1F447 1F3FC ; fully-qualified # ๐Ÿ‘‡๐Ÿผ backhand index pointing down: medium-light skin tone +1F447 1F3FD ; fully-qualified # ๐Ÿ‘‡๐Ÿฝ backhand index pointing down: medium skin tone +1F447 1F3FE ; fully-qualified # ๐Ÿ‘‡๐Ÿพ backhand index pointing down: medium-dark skin tone +1F447 1F3FF ; fully-qualified # ๐Ÿ‘‡๐Ÿฟ backhand index pointing down: dark skin tone +270C FE0F ; fully-qualified # โœŒ๏ธ victory hand +270C ; non-fully-qualified # โœŒ victory hand +270C 1F3FB ; fully-qualified # โœŒ๐Ÿป victory hand: light skin tone +270C 1F3FC ; fully-qualified # โœŒ๐Ÿผ victory hand: medium-light skin tone +270C 1F3FD ; fully-qualified # โœŒ๐Ÿฝ victory hand: medium skin tone +270C 1F3FE ; fully-qualified # โœŒ๐Ÿพ victory hand: medium-dark skin tone +270C 1F3FF ; fully-qualified # โœŒ๐Ÿฟ victory hand: dark skin tone +1F91E ; fully-qualified # ๐Ÿคž crossed fingers +1F91E 1F3FB ; fully-qualified # ๐Ÿคž๐Ÿป crossed fingers: light skin tone +1F91E 1F3FC ; fully-qualified # ๐Ÿคž๐Ÿผ crossed fingers: medium-light skin tone +1F91E 1F3FD ; fully-qualified # ๐Ÿคž๐Ÿฝ crossed fingers: medium skin tone +1F91E 1F3FE ; fully-qualified # ๐Ÿคž๐Ÿพ crossed fingers: medium-dark skin tone +1F91E 1F3FF ; fully-qualified # ๐Ÿคž๐Ÿฟ crossed fingers: dark skin tone +1F596 ; fully-qualified # ๐Ÿ–– vulcan salute +1F596 1F3FB ; fully-qualified # ๐Ÿ––๐Ÿป vulcan salute: light skin tone +1F596 1F3FC ; fully-qualified # ๐Ÿ––๐Ÿผ vulcan salute: medium-light skin tone +1F596 1F3FD ; fully-qualified # ๐Ÿ––๐Ÿฝ vulcan salute: medium skin tone +1F596 1F3FE ; fully-qualified # ๐Ÿ––๐Ÿพ vulcan salute: medium-dark skin tone +1F596 1F3FF ; fully-qualified # ๐Ÿ––๐Ÿฟ vulcan salute: dark skin tone +1F918 ; fully-qualified # ๐Ÿค˜ sign of the horns +1F918 1F3FB ; fully-qualified # ๐Ÿค˜๐Ÿป sign of the horns: light skin tone +1F918 1F3FC ; fully-qualified # ๐Ÿค˜๐Ÿผ sign of the horns: medium-light skin tone +1F918 1F3FD ; fully-qualified # ๐Ÿค˜๐Ÿฝ sign of the horns: medium skin tone +1F918 1F3FE ; fully-qualified # ๐Ÿค˜๐Ÿพ sign of the horns: medium-dark skin tone +1F918 1F3FF ; fully-qualified # ๐Ÿค˜๐Ÿฟ sign of the horns: dark skin tone +1F919 ; fully-qualified # ๐Ÿค™ call me hand +1F919 1F3FB ; fully-qualified # ๐Ÿค™๐Ÿป call me hand: light skin tone +1F919 1F3FC ; fully-qualified # ๐Ÿค™๐Ÿผ call me hand: medium-light skin tone +1F919 1F3FD ; fully-qualified # ๐Ÿค™๐Ÿฝ call me hand: medium skin tone +1F919 1F3FE ; fully-qualified # ๐Ÿค™๐Ÿพ call me hand: medium-dark skin tone +1F919 1F3FF ; fully-qualified # ๐Ÿค™๐Ÿฟ call me hand: dark skin tone +1F590 FE0F ; fully-qualified # ๐Ÿ–๏ธ hand with fingers splayed +1F590 ; non-fully-qualified # ๐Ÿ– hand with fingers splayed +1F590 1F3FB ; fully-qualified # ๐Ÿ–๐Ÿป hand with fingers splayed: light skin tone +1F590 1F3FC ; fully-qualified # ๐Ÿ–๐Ÿผ hand with fingers splayed: medium-light skin tone +1F590 1F3FD ; fully-qualified # ๐Ÿ–๐Ÿฝ hand with fingers splayed: medium skin tone +1F590 1F3FE ; fully-qualified # ๐Ÿ–๐Ÿพ hand with fingers splayed: medium-dark skin tone +1F590 1F3FF ; fully-qualified # ๐Ÿ–๐Ÿฟ hand with fingers splayed: dark skin tone +270B ; fully-qualified # โœ‹ raised hand +270B 1F3FB ; fully-qualified # โœ‹๐Ÿป raised hand: light skin tone +270B 1F3FC ; fully-qualified # โœ‹๐Ÿผ raised hand: medium-light skin tone +270B 1F3FD ; fully-qualified # โœ‹๐Ÿฝ raised hand: medium skin tone +270B 1F3FE ; fully-qualified # โœ‹๐Ÿพ raised hand: medium-dark skin tone +270B 1F3FF ; fully-qualified # โœ‹๐Ÿฟ raised hand: dark skin tone +1F44C ; fully-qualified # ๐Ÿ‘Œ OK hand +1F44C 1F3FB ; fully-qualified # ๐Ÿ‘Œ๐Ÿป OK hand: light skin tone +1F44C 1F3FC ; fully-qualified # ๐Ÿ‘Œ๐Ÿผ OK hand: medium-light skin tone +1F44C 1F3FD ; fully-qualified # ๐Ÿ‘Œ๐Ÿฝ OK hand: medium skin tone +1F44C 1F3FE ; fully-qualified # ๐Ÿ‘Œ๐Ÿพ OK hand: medium-dark skin tone +1F44C 1F3FF ; fully-qualified # ๐Ÿ‘Œ๐Ÿฟ OK hand: dark skin tone +1F44D ; fully-qualified # ๐Ÿ‘ thumbs up +1F44D 1F3FB ; fully-qualified # ๐Ÿ‘๐Ÿป thumbs up: light skin tone +1F44D 1F3FC ; fully-qualified # ๐Ÿ‘๐Ÿผ thumbs up: medium-light skin tone +1F44D 1F3FD ; fully-qualified # ๐Ÿ‘๐Ÿฝ thumbs up: medium skin tone +1F44D 1F3FE ; fully-qualified # ๐Ÿ‘๐Ÿพ thumbs up: medium-dark skin tone +1F44D 1F3FF ; fully-qualified # ๐Ÿ‘๐Ÿฟ thumbs up: dark skin tone +1F44E ; fully-qualified # ๐Ÿ‘Ž thumbs down +1F44E 1F3FB ; fully-qualified # ๐Ÿ‘Ž๐Ÿป thumbs down: light skin tone +1F44E 1F3FC ; fully-qualified # ๐Ÿ‘Ž๐Ÿผ thumbs down: medium-light skin tone +1F44E 1F3FD ; fully-qualified # ๐Ÿ‘Ž๐Ÿฝ thumbs down: medium skin tone +1F44E 1F3FE ; fully-qualified # ๐Ÿ‘Ž๐Ÿพ thumbs down: medium-dark skin tone +1F44E 1F3FF ; fully-qualified # ๐Ÿ‘Ž๐Ÿฟ thumbs down: dark skin tone +270A ; fully-qualified # โœŠ raised fist +270A 1F3FB ; fully-qualified # โœŠ๐Ÿป raised fist: light skin tone +270A 1F3FC ; fully-qualified # โœŠ๐Ÿผ raised fist: medium-light skin tone +270A 1F3FD ; fully-qualified # โœŠ๐Ÿฝ raised fist: medium skin tone +270A 1F3FE ; fully-qualified # โœŠ๐Ÿพ raised fist: medium-dark skin tone +270A 1F3FF ; fully-qualified # โœŠ๐Ÿฟ raised fist: dark skin tone +1F44A ; fully-qualified # ๐Ÿ‘Š oncoming fist +1F44A 1F3FB ; fully-qualified # ๐Ÿ‘Š๐Ÿป oncoming fist: light skin tone +1F44A 1F3FC ; fully-qualified # ๐Ÿ‘Š๐Ÿผ oncoming fist: medium-light skin tone +1F44A 1F3FD ; fully-qualified # ๐Ÿ‘Š๐Ÿฝ oncoming fist: medium skin tone +1F44A 1F3FE ; fully-qualified # ๐Ÿ‘Š๐Ÿพ oncoming fist: medium-dark skin tone +1F44A 1F3FF ; fully-qualified # ๐Ÿ‘Š๐Ÿฟ oncoming fist: dark skin tone +1F91B ; fully-qualified # ๐Ÿค› left-facing fist +1F91B 1F3FB ; fully-qualified # ๐Ÿค›๐Ÿป left-facing fist: light skin tone +1F91B 1F3FC ; fully-qualified # ๐Ÿค›๐Ÿผ left-facing fist: medium-light skin tone +1F91B 1F3FD ; fully-qualified # ๐Ÿค›๐Ÿฝ left-facing fist: medium skin tone +1F91B 1F3FE ; fully-qualified # ๐Ÿค›๐Ÿพ left-facing fist: medium-dark skin tone +1F91B 1F3FF ; fully-qualified # ๐Ÿค›๐Ÿฟ left-facing fist: dark skin tone +1F91C ; fully-qualified # ๐Ÿคœ right-facing fist +1F91C 1F3FB ; fully-qualified # ๐Ÿคœ๐Ÿป right-facing fist: light skin tone +1F91C 1F3FC ; fully-qualified # ๐Ÿคœ๐Ÿผ right-facing fist: medium-light skin tone +1F91C 1F3FD ; fully-qualified # ๐Ÿคœ๐Ÿฝ right-facing fist: medium skin tone +1F91C 1F3FE ; fully-qualified # ๐Ÿคœ๐Ÿพ right-facing fist: medium-dark skin tone +1F91C 1F3FF ; fully-qualified # ๐Ÿคœ๐Ÿฟ right-facing fist: dark skin tone +1F91A ; fully-qualified # ๐Ÿคš raised back of hand +1F91A 1F3FB ; fully-qualified # ๐Ÿคš๐Ÿป raised back of hand: light skin tone +1F91A 1F3FC ; fully-qualified # ๐Ÿคš๐Ÿผ raised back of hand: medium-light skin tone +1F91A 1F3FD ; fully-qualified # ๐Ÿคš๐Ÿฝ raised back of hand: medium skin tone +1F91A 1F3FE ; fully-qualified # ๐Ÿคš๐Ÿพ raised back of hand: medium-dark skin tone +1F91A 1F3FF ; fully-qualified # ๐Ÿคš๐Ÿฟ raised back of hand: dark skin tone +1F44B ; fully-qualified # ๐Ÿ‘‹ waving hand +1F44B 1F3FB ; fully-qualified # ๐Ÿ‘‹๐Ÿป waving hand: light skin tone +1F44B 1F3FC ; fully-qualified # ๐Ÿ‘‹๐Ÿผ waving hand: medium-light skin tone +1F44B 1F3FD ; fully-qualified # ๐Ÿ‘‹๐Ÿฝ waving hand: medium skin tone +1F44B 1F3FE ; fully-qualified # ๐Ÿ‘‹๐Ÿพ waving hand: medium-dark skin tone +1F44B 1F3FF ; fully-qualified # ๐Ÿ‘‹๐Ÿฟ waving hand: dark skin tone +1F91F ; fully-qualified # ๐ŸคŸ love-you gesture +1F91F 1F3FB ; fully-qualified # ๐ŸคŸ๐Ÿป love-you gesture: light skin tone +1F91F 1F3FC ; fully-qualified # ๐ŸคŸ๐Ÿผ love-you gesture: medium-light skin tone +1F91F 1F3FD ; fully-qualified # ๐ŸคŸ๐Ÿฝ love-you gesture: medium skin tone +1F91F 1F3FE ; fully-qualified # ๐ŸคŸ๐Ÿพ love-you gesture: medium-dark skin tone +1F91F 1F3FF ; fully-qualified # ๐ŸคŸ๐Ÿฟ love-you gesture: dark skin tone +270D FE0F ; fully-qualified # โœ๏ธ writing hand +270D ; non-fully-qualified # โœ writing hand +270D 1F3FB ; fully-qualified # โœ๐Ÿป writing hand: light skin tone +270D 1F3FC ; fully-qualified # โœ๐Ÿผ writing hand: medium-light skin tone +270D 1F3FD ; fully-qualified # โœ๐Ÿฝ writing hand: medium skin tone +270D 1F3FE ; fully-qualified # โœ๐Ÿพ writing hand: medium-dark skin tone +270D 1F3FF ; fully-qualified # โœ๐Ÿฟ writing hand: dark skin tone +1F44F ; fully-qualified # ๐Ÿ‘ clapping hands +1F44F 1F3FB ; fully-qualified # ๐Ÿ‘๐Ÿป clapping hands: light skin tone +1F44F 1F3FC ; fully-qualified # ๐Ÿ‘๐Ÿผ clapping hands: medium-light skin tone +1F44F 1F3FD ; fully-qualified # ๐Ÿ‘๐Ÿฝ clapping hands: medium skin tone +1F44F 1F3FE ; fully-qualified # ๐Ÿ‘๐Ÿพ clapping hands: medium-dark skin tone +1F44F 1F3FF ; fully-qualified # ๐Ÿ‘๐Ÿฟ clapping hands: dark skin tone +1F450 ; fully-qualified # ๐Ÿ‘ open hands +1F450 1F3FB ; fully-qualified # ๐Ÿ‘๐Ÿป open hands: light skin tone +1F450 1F3FC ; fully-qualified # ๐Ÿ‘๐Ÿผ open hands: medium-light skin tone +1F450 1F3FD ; fully-qualified # ๐Ÿ‘๐Ÿฝ open hands: medium skin tone +1F450 1F3FE ; fully-qualified # ๐Ÿ‘๐Ÿพ open hands: medium-dark skin tone +1F450 1F3FF ; fully-qualified # ๐Ÿ‘๐Ÿฟ open hands: dark skin tone +1F64C ; fully-qualified # ๐Ÿ™Œ raising hands +1F64C 1F3FB ; fully-qualified # ๐Ÿ™Œ๐Ÿป raising hands: light skin tone +1F64C 1F3FC ; fully-qualified # ๐Ÿ™Œ๐Ÿผ raising hands: medium-light skin tone +1F64C 1F3FD ; fully-qualified # ๐Ÿ™Œ๐Ÿฝ raising hands: medium skin tone +1F64C 1F3FE ; fully-qualified # ๐Ÿ™Œ๐Ÿพ raising hands: medium-dark skin tone +1F64C 1F3FF ; fully-qualified # ๐Ÿ™Œ๐Ÿฟ raising hands: dark skin tone +1F932 ; fully-qualified # ๐Ÿคฒ palms up together +1F932 1F3FB ; fully-qualified # ๐Ÿคฒ๐Ÿป palms up together: light skin tone +1F932 1F3FC ; fully-qualified # ๐Ÿคฒ๐Ÿผ palms up together: medium-light skin tone +1F932 1F3FD ; fully-qualified # ๐Ÿคฒ๐Ÿฝ palms up together: medium skin tone +1F932 1F3FE ; fully-qualified # ๐Ÿคฒ๐Ÿพ palms up together: medium-dark skin tone +1F932 1F3FF ; fully-qualified # ๐Ÿคฒ๐Ÿฟ palms up together: dark skin tone +1F64F ; fully-qualified # ๐Ÿ™ folded hands +1F64F 1F3FB ; fully-qualified # ๐Ÿ™๐Ÿป folded hands: light skin tone +1F64F 1F3FC ; fully-qualified # ๐Ÿ™๐Ÿผ folded hands: medium-light skin tone +1F64F 1F3FD ; fully-qualified # ๐Ÿ™๐Ÿฝ folded hands: medium skin tone +1F64F 1F3FE ; fully-qualified # ๐Ÿ™๐Ÿพ folded hands: medium-dark skin tone +1F64F 1F3FF ; fully-qualified # ๐Ÿ™๐Ÿฟ folded hands: dark skin tone +1F91D ; fully-qualified # ๐Ÿค handshake +1F485 ; fully-qualified # ๐Ÿ’… nail polish +1F485 1F3FB ; fully-qualified # ๐Ÿ’…๐Ÿป nail polish: light skin tone +1F485 1F3FC ; fully-qualified # ๐Ÿ’…๐Ÿผ nail polish: medium-light skin tone +1F485 1F3FD ; fully-qualified # ๐Ÿ’…๐Ÿฝ nail polish: medium skin tone +1F485 1F3FE ; fully-qualified # ๐Ÿ’…๐Ÿพ nail polish: medium-dark skin tone +1F485 1F3FF ; fully-qualified # ๐Ÿ’…๐Ÿฟ nail polish: dark skin tone +1F442 ; fully-qualified # ๐Ÿ‘‚ ear +1F442 1F3FB ; fully-qualified # ๐Ÿ‘‚๐Ÿป ear: light skin tone +1F442 1F3FC ; fully-qualified # ๐Ÿ‘‚๐Ÿผ ear: medium-light skin tone +1F442 1F3FD ; fully-qualified # ๐Ÿ‘‚๐Ÿฝ ear: medium skin tone +1F442 1F3FE ; fully-qualified # ๐Ÿ‘‚๐Ÿพ ear: medium-dark skin tone +1F442 1F3FF ; fully-qualified # ๐Ÿ‘‚๐Ÿฟ ear: dark skin tone +1F443 ; fully-qualified # ๐Ÿ‘ƒ nose +1F443 1F3FB ; fully-qualified # ๐Ÿ‘ƒ๐Ÿป nose: light skin tone +1F443 1F3FC ; fully-qualified # ๐Ÿ‘ƒ๐Ÿผ nose: medium-light skin tone +1F443 1F3FD ; fully-qualified # ๐Ÿ‘ƒ๐Ÿฝ nose: medium skin tone +1F443 1F3FE ; fully-qualified # ๐Ÿ‘ƒ๐Ÿพ nose: medium-dark skin tone +1F443 1F3FF ; fully-qualified # ๐Ÿ‘ƒ๐Ÿฟ nose: dark skin tone +1F9B0 ; fully-qualified # ๐Ÿฆฐ red-haired +1F9B1 ; fully-qualified # ๐Ÿฆฑ curly-haired +1F9B2 ; fully-qualified # ๐Ÿฆฒ bald +1F9B3 ; fully-qualified # ๐Ÿฆณ white-haired +1F463 ; fully-qualified # ๐Ÿ‘ฃ footprints +1F440 ; fully-qualified # ๐Ÿ‘€ eyes +1F441 FE0F ; fully-qualified # ๐Ÿ‘๏ธ eye +1F441 ; non-fully-qualified # ๐Ÿ‘ eye +1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # ๐Ÿ‘๏ธโ€๐Ÿ—จ๏ธ eye in speech bubble +1F441 200D 1F5E8 FE0F ; non-fully-qualified # ๐Ÿ‘โ€๐Ÿ—จ๏ธ eye in speech bubble +1F441 FE0F 200D 1F5E8 ; non-fully-qualified # ๐Ÿ‘๏ธโ€๐Ÿ—จ eye in speech bubble +1F441 200D 1F5E8 ; non-fully-qualified # ๐Ÿ‘โ€๐Ÿ—จ eye in speech bubble +1F9E0 ; fully-qualified # ๐Ÿง  brain +1F9B4 ; fully-qualified # ๐Ÿฆด bone +1F9B7 ; fully-qualified # ๐Ÿฆท tooth +1F445 ; fully-qualified # ๐Ÿ‘… tongue +1F444 ; fully-qualified # ๐Ÿ‘„ mouth + +# subgroup: emotion +1F48B ; fully-qualified # ๐Ÿ’‹ kiss mark +1F498 ; fully-qualified # ๐Ÿ’˜ heart with arrow +2764 FE0F ; fully-qualified # โค๏ธ red heart +2764 ; non-fully-qualified # โค red heart +1F493 ; fully-qualified # ๐Ÿ’“ beating heart +1F494 ; fully-qualified # ๐Ÿ’” broken heart +1F495 ; fully-qualified # ๐Ÿ’• two hearts +1F496 ; fully-qualified # ๐Ÿ’– sparkling heart +1F497 ; fully-qualified # ๐Ÿ’— growing heart +1F499 ; fully-qualified # ๐Ÿ’™ blue heart +1F49A ; fully-qualified # ๐Ÿ’š green heart +1F49B ; fully-qualified # ๐Ÿ’› yellow heart +1F9E1 ; fully-qualified # ๐Ÿงก orange heart +1F49C ; fully-qualified # ๐Ÿ’œ purple heart +1F5A4 ; fully-qualified # ๐Ÿ–ค black heart +1F49D ; fully-qualified # ๐Ÿ’ heart with ribbon +1F49E ; fully-qualified # ๐Ÿ’ž revolving hearts +1F49F ; fully-qualified # ๐Ÿ’Ÿ heart decoration +2763 FE0F ; fully-qualified # โฃ๏ธ heavy heart exclamation +2763 ; non-fully-qualified # โฃ heavy heart exclamation +1F48C ; fully-qualified # ๐Ÿ’Œ love letter +1F4A4 ; fully-qualified # ๐Ÿ’ค zzz +1F4A2 ; fully-qualified # ๐Ÿ’ข anger symbol +1F4A3 ; fully-qualified # ๐Ÿ’ฃ bomb +1F4A5 ; fully-qualified # ๐Ÿ’ฅ collision +1F4A6 ; fully-qualified # ๐Ÿ’ฆ sweat droplets +1F4A8 ; fully-qualified # ๐Ÿ’จ dashing away +1F4AB ; fully-qualified # ๐Ÿ’ซ dizzy +1F4AC ; fully-qualified # ๐Ÿ’ฌ speech balloon +1F5E8 FE0F ; fully-qualified # ๐Ÿ—จ๏ธ left speech bubble +1F5E8 ; non-fully-qualified # ๐Ÿ—จ left speech bubble +1F5EF FE0F ; fully-qualified # ๐Ÿ—ฏ๏ธ right anger bubble +1F5EF ; non-fully-qualified # ๐Ÿ—ฏ right anger bubble +1F4AD ; fully-qualified # ๐Ÿ’ญ thought balloon +1F573 FE0F ; fully-qualified # ๐Ÿ•ณ๏ธ hole +1F573 ; non-fully-qualified # ๐Ÿ•ณ hole + +# subgroup: clothing +1F453 ; fully-qualified # ๐Ÿ‘“ glasses +1F576 FE0F ; fully-qualified # ๐Ÿ•ถ๏ธ sunglasses +1F576 ; non-fully-qualified # ๐Ÿ•ถ sunglasses +1F97D ; fully-qualified # ๐Ÿฅฝ goggles +1F97C ; fully-qualified # ๐Ÿฅผ lab coat +1F454 ; fully-qualified # ๐Ÿ‘” necktie +1F455 ; fully-qualified # ๐Ÿ‘• t-shirt +1F456 ; fully-qualified # ๐Ÿ‘– jeans +1F9E3 ; fully-qualified # ๐Ÿงฃ scarf +1F9E4 ; fully-qualified # ๐Ÿงค gloves +1F9E5 ; fully-qualified # ๐Ÿงฅ coat +1F9E6 ; fully-qualified # ๐Ÿงฆ socks +1F457 ; fully-qualified # ๐Ÿ‘— dress +1F458 ; fully-qualified # ๐Ÿ‘˜ kimono +1F459 ; fully-qualified # ๐Ÿ‘™ bikini +1F45A ; fully-qualified # ๐Ÿ‘š womanโ€™s clothes +1F45B ; fully-qualified # ๐Ÿ‘› purse +1F45C ; fully-qualified # ๐Ÿ‘œ handbag +1F45D ; fully-qualified # ๐Ÿ‘ clutch bag +1F6CD FE0F ; fully-qualified # ๐Ÿ›๏ธ shopping bags +1F6CD ; non-fully-qualified # ๐Ÿ› shopping bags +1F392 ; fully-qualified # ๐ŸŽ’ school backpack +1F45E ; fully-qualified # ๐Ÿ‘ž manโ€™s shoe +1F45F ; fully-qualified # ๐Ÿ‘Ÿ running shoe +1F97E ; fully-qualified # ๐Ÿฅพ hiking boot +1F97F ; fully-qualified # ๐Ÿฅฟ womanโ€™s flat shoe +1F460 ; fully-qualified # ๐Ÿ‘  high-heeled shoe +1F461 ; fully-qualified # ๐Ÿ‘ก womanโ€™s sandal +1F462 ; fully-qualified # ๐Ÿ‘ข womanโ€™s boot +1F451 ; fully-qualified # ๐Ÿ‘‘ crown +1F452 ; fully-qualified # ๐Ÿ‘’ womanโ€™s hat +1F3A9 ; fully-qualified # ๐ŸŽฉ top hat +1F393 ; fully-qualified # ๐ŸŽ“ graduation cap +1F9E2 ; fully-qualified # ๐Ÿงข billed cap +26D1 FE0F ; fully-qualified # โ›‘๏ธ rescue workerโ€™s helmet +26D1 ; non-fully-qualified # โ›‘ rescue workerโ€™s helmet +1F4FF ; fully-qualified # ๐Ÿ“ฟ prayer beads +1F484 ; fully-qualified # ๐Ÿ’„ lipstick +1F48D ; fully-qualified # ๐Ÿ’ ring +1F48E ; fully-qualified # ๐Ÿ’Ž gem stone + +# Smileys & People subtotal: 2210 +# Smileys & People subtotal: 625 w/o modifiers + +# group: Animals & Nature + +# subgroup: animal-mammal +1F435 ; fully-qualified # ๐Ÿต monkey face +1F412 ; fully-qualified # ๐Ÿ’ monkey +1F98D ; fully-qualified # ๐Ÿฆ gorilla +1F436 ; fully-qualified # ๐Ÿถ dog face +1F415 ; fully-qualified # ๐Ÿ• dog +1F429 ; fully-qualified # ๐Ÿฉ poodle +1F43A ; fully-qualified # ๐Ÿบ wolf face +1F98A ; fully-qualified # ๐ŸฆŠ fox face +1F99D ; fully-qualified # ๐Ÿฆ raccoon +1F431 ; fully-qualified # ๐Ÿฑ cat face +1F408 ; fully-qualified # ๐Ÿˆ cat +1F981 ; fully-qualified # ๐Ÿฆ lion face +1F42F ; fully-qualified # ๐Ÿฏ tiger face +1F405 ; fully-qualified # ๐Ÿ… tiger +1F406 ; fully-qualified # ๐Ÿ† leopard +1F434 ; fully-qualified # ๐Ÿด horse face +1F40E ; fully-qualified # ๐ŸŽ horse +1F984 ; fully-qualified # ๐Ÿฆ„ unicorn face +1F993 ; fully-qualified # ๐Ÿฆ“ zebra +1F98C ; fully-qualified # ๐ŸฆŒ deer +1F42E ; fully-qualified # ๐Ÿฎ cow face +1F402 ; fully-qualified # ๐Ÿ‚ ox +1F403 ; fully-qualified # ๐Ÿƒ water buffalo +1F404 ; fully-qualified # ๐Ÿ„ cow +1F437 ; fully-qualified # ๐Ÿท pig face +1F416 ; fully-qualified # ๐Ÿ– pig +1F417 ; fully-qualified # ๐Ÿ— boar +1F43D ; fully-qualified # ๐Ÿฝ pig nose +1F40F ; fully-qualified # ๐Ÿ ram +1F411 ; fully-qualified # ๐Ÿ‘ ewe +1F410 ; fully-qualified # ๐Ÿ goat +1F42A ; fully-qualified # ๐Ÿช camel +1F42B ; fully-qualified # ๐Ÿซ two-hump camel +1F999 ; fully-qualified # ๐Ÿฆ™ llama +1F992 ; fully-qualified # ๐Ÿฆ’ giraffe +1F418 ; fully-qualified # ๐Ÿ˜ elephant +1F98F ; fully-qualified # ๐Ÿฆ rhinoceros +1F99B ; fully-qualified # ๐Ÿฆ› hippopotamus +1F42D ; fully-qualified # ๐Ÿญ mouse face +1F401 ; fully-qualified # ๐Ÿ mouse +1F400 ; fully-qualified # ๐Ÿ€ rat +1F439 ; fully-qualified # ๐Ÿน hamster face +1F430 ; fully-qualified # ๐Ÿฐ rabbit face +1F407 ; fully-qualified # ๐Ÿ‡ rabbit +1F43F FE0F ; fully-qualified # ๐Ÿฟ๏ธ chipmunk +1F43F ; non-fully-qualified # ๐Ÿฟ chipmunk +1F994 ; fully-qualified # ๐Ÿฆ” hedgehog +1F987 ; fully-qualified # ๐Ÿฆ‡ bat +1F43B ; fully-qualified # ๐Ÿป bear face +1F428 ; fully-qualified # ๐Ÿจ koala +1F43C ; fully-qualified # ๐Ÿผ panda face +1F998 ; fully-qualified # ๐Ÿฆ˜ kangaroo +1F9A1 ; fully-qualified # ๐Ÿฆก badger +1F43E ; fully-qualified # ๐Ÿพ paw prints + +# subgroup: animal-bird +1F983 ; fully-qualified # ๐Ÿฆƒ turkey +1F414 ; fully-qualified # ๐Ÿ” chicken +1F413 ; fully-qualified # ๐Ÿ“ rooster +1F423 ; fully-qualified # ๐Ÿฃ hatching chick +1F424 ; fully-qualified # ๐Ÿค baby chick +1F425 ; fully-qualified # ๐Ÿฅ front-facing baby chick +1F426 ; fully-qualified # ๐Ÿฆ bird +1F427 ; fully-qualified # ๐Ÿง penguin +1F54A FE0F ; fully-qualified # ๐Ÿ•Š๏ธ dove +1F54A ; non-fully-qualified # ๐Ÿ•Š dove +1F985 ; fully-qualified # ๐Ÿฆ… eagle +1F986 ; fully-qualified # ๐Ÿฆ† duck +1F9A2 ; fully-qualified # ๐Ÿฆข swan +1F989 ; fully-qualified # ๐Ÿฆ‰ owl +1F99A ; fully-qualified # ๐Ÿฆš peacock +1F99C ; fully-qualified # ๐Ÿฆœ parrot + +# subgroup: animal-amphibian +1F438 ; fully-qualified # ๐Ÿธ frog face + +# subgroup: animal-reptile +1F40A ; fully-qualified # ๐ŸŠ crocodile +1F422 ; fully-qualified # ๐Ÿข turtle +1F98E ; fully-qualified # ๐ŸฆŽ lizard +1F40D ; fully-qualified # ๐Ÿ snake +1F432 ; fully-qualified # ๐Ÿฒ dragon face +1F409 ; fully-qualified # ๐Ÿ‰ dragon +1F995 ; fully-qualified # ๐Ÿฆ• sauropod +1F996 ; fully-qualified # ๐Ÿฆ– T-Rex + +# subgroup: animal-marine +1F433 ; fully-qualified # ๐Ÿณ spouting whale +1F40B ; fully-qualified # ๐Ÿ‹ whale +1F42C ; fully-qualified # ๐Ÿฌ dolphin +1F41F ; fully-qualified # ๐ŸŸ fish +1F420 ; fully-qualified # ๐Ÿ  tropical fish +1F421 ; fully-qualified # ๐Ÿก blowfish +1F988 ; fully-qualified # ๐Ÿฆˆ shark +1F419 ; fully-qualified # ๐Ÿ™ octopus +1F41A ; fully-qualified # ๐Ÿš spiral shell +1F980 ; fully-qualified # ๐Ÿฆ€ crab +1F99E ; fully-qualified # ๐Ÿฆž lobster +1F990 ; fully-qualified # ๐Ÿฆ shrimp +1F991 ; fully-qualified # ๐Ÿฆ‘ squid + +# subgroup: animal-bug +1F40C ; fully-qualified # ๐ŸŒ snail +1F98B ; fully-qualified # ๐Ÿฆ‹ butterfly +1F41B ; fully-qualified # ๐Ÿ› bug +1F41C ; fully-qualified # ๐Ÿœ ant +1F41D ; fully-qualified # ๐Ÿ honeybee +1F41E ; fully-qualified # ๐Ÿž lady beetle +1F997 ; fully-qualified # ๐Ÿฆ— cricket +1F577 FE0F ; fully-qualified # ๐Ÿ•ท๏ธ spider +1F577 ; non-fully-qualified # ๐Ÿ•ท spider +1F578 FE0F ; fully-qualified # ๐Ÿ•ธ๏ธ spider web +1F578 ; non-fully-qualified # ๐Ÿ•ธ spider web +1F982 ; fully-qualified # ๐Ÿฆ‚ scorpion +1F99F ; fully-qualified # ๐ŸฆŸ mosquito +1F9A0 ; fully-qualified # ๐Ÿฆ  microbe + +# subgroup: plant-flower +1F490 ; fully-qualified # ๐Ÿ’ bouquet +1F338 ; fully-qualified # ๐ŸŒธ cherry blossom +1F4AE ; fully-qualified # ๐Ÿ’ฎ white flower +1F3F5 FE0F ; fully-qualified # ๐Ÿต๏ธ rosette +1F3F5 ; non-fully-qualified # ๐Ÿต rosette +1F339 ; fully-qualified # ๐ŸŒน rose +1F940 ; fully-qualified # ๐Ÿฅ€ wilted flower +1F33A ; fully-qualified # ๐ŸŒบ hibiscus +1F33B ; fully-qualified # ๐ŸŒป sunflower +1F33C ; fully-qualified # ๐ŸŒผ blossom +1F337 ; fully-qualified # ๐ŸŒท tulip + +# subgroup: plant-other +1F331 ; fully-qualified # ๐ŸŒฑ seedling +1F332 ; fully-qualified # ๐ŸŒฒ evergreen tree +1F333 ; fully-qualified # ๐ŸŒณ deciduous tree +1F334 ; fully-qualified # ๐ŸŒด palm tree +1F335 ; fully-qualified # ๐ŸŒต cactus +1F33E ; fully-qualified # ๐ŸŒพ sheaf of rice +1F33F ; fully-qualified # ๐ŸŒฟ herb +2618 FE0F ; fully-qualified # โ˜˜๏ธ shamrock +2618 ; non-fully-qualified # โ˜˜ shamrock +1F340 ; fully-qualified # ๐Ÿ€ four leaf clover +1F341 ; fully-qualified # ๐Ÿ maple leaf +1F342 ; fully-qualified # ๐Ÿ‚ fallen leaf +1F343 ; fully-qualified # ๐Ÿƒ leaf fluttering in wind + +# Animals & Nature subtotal: 130 +# Animals & Nature subtotal: 130 w/o modifiers + +# group: Food & Drink + +# subgroup: food-fruit +1F347 ; fully-qualified # ๐Ÿ‡ grapes +1F348 ; fully-qualified # ๐Ÿˆ melon +1F349 ; fully-qualified # ๐Ÿ‰ watermelon +1F34A ; fully-qualified # ๐ŸŠ tangerine +1F34B ; fully-qualified # ๐Ÿ‹ lemon +1F34C ; fully-qualified # ๐ŸŒ banana +1F34D ; fully-qualified # ๐Ÿ pineapple +1F96D ; fully-qualified # ๐Ÿฅญ mango +1F34E ; fully-qualified # ๐ŸŽ red apple +1F34F ; fully-qualified # ๐Ÿ green apple +1F350 ; fully-qualified # ๐Ÿ pear +1F351 ; fully-qualified # ๐Ÿ‘ peach +1F352 ; fully-qualified # ๐Ÿ’ cherries +1F353 ; fully-qualified # ๐Ÿ“ strawberry +1F95D ; fully-qualified # ๐Ÿฅ kiwi fruit +1F345 ; fully-qualified # ๐Ÿ… tomato +1F965 ; fully-qualified # ๐Ÿฅฅ coconut + +# subgroup: food-vegetable +1F951 ; fully-qualified # ๐Ÿฅ‘ avocado +1F346 ; fully-qualified # ๐Ÿ† eggplant +1F954 ; fully-qualified # ๐Ÿฅ” potato +1F955 ; fully-qualified # ๐Ÿฅ• carrot +1F33D ; fully-qualified # ๐ŸŒฝ ear of corn +1F336 FE0F ; fully-qualified # ๐ŸŒถ๏ธ hot pepper +1F336 ; non-fully-qualified # ๐ŸŒถ hot pepper +1F952 ; fully-qualified # ๐Ÿฅ’ cucumber +1F96C ; fully-qualified # ๐Ÿฅฌ leafy green +1F966 ; fully-qualified # ๐Ÿฅฆ broccoli +1F344 ; fully-qualified # ๐Ÿ„ mushroom +1F95C ; fully-qualified # ๐Ÿฅœ peanuts +1F330 ; fully-qualified # ๐ŸŒฐ chestnut + +# subgroup: food-prepared +1F35E ; fully-qualified # ๐Ÿž bread +1F950 ; fully-qualified # ๐Ÿฅ croissant +1F956 ; fully-qualified # ๐Ÿฅ– baguette bread +1F968 ; fully-qualified # ๐Ÿฅจ pretzel +1F96F ; fully-qualified # ๐Ÿฅฏ bagel +1F95E ; fully-qualified # ๐Ÿฅž pancakes +1F9C0 ; fully-qualified # ๐Ÿง€ cheese wedge +1F356 ; fully-qualified # ๐Ÿ– meat on bone +1F357 ; fully-qualified # ๐Ÿ— poultry leg +1F969 ; fully-qualified # ๐Ÿฅฉ cut of meat +1F953 ; fully-qualified # ๐Ÿฅ“ bacon +1F354 ; fully-qualified # ๐Ÿ” hamburger +1F35F ; fully-qualified # ๐ŸŸ french fries +1F355 ; fully-qualified # ๐Ÿ• pizza +1F32D ; fully-qualified # ๐ŸŒญ hot dog +1F96A ; fully-qualified # ๐Ÿฅช sandwich +1F32E ; fully-qualified # ๐ŸŒฎ taco +1F32F ; fully-qualified # ๐ŸŒฏ burrito +1F959 ; fully-qualified # ๐Ÿฅ™ stuffed flatbread +1F95A ; fully-qualified # ๐Ÿฅš egg +1F373 ; fully-qualified # ๐Ÿณ cooking +1F958 ; fully-qualified # ๐Ÿฅ˜ shallow pan of food +1F372 ; fully-qualified # ๐Ÿฒ pot of food +1F963 ; fully-qualified # ๐Ÿฅฃ bowl with spoon +1F957 ; fully-qualified # ๐Ÿฅ— green salad +1F37F ; fully-qualified # ๐Ÿฟ popcorn +1F9C2 ; fully-qualified # ๐Ÿง‚ salt +1F96B ; fully-qualified # ๐Ÿฅซ canned food + +# subgroup: food-asian +1F371 ; fully-qualified # ๐Ÿฑ bento box +1F358 ; fully-qualified # ๐Ÿ˜ rice cracker +1F359 ; fully-qualified # ๐Ÿ™ rice ball +1F35A ; fully-qualified # ๐Ÿš cooked rice +1F35B ; fully-qualified # ๐Ÿ› curry rice +1F35C ; fully-qualified # ๐Ÿœ steaming bowl +1F35D ; fully-qualified # ๐Ÿ spaghetti +1F360 ; fully-qualified # ๐Ÿ  roasted sweet potato +1F362 ; fully-qualified # ๐Ÿข oden +1F363 ; fully-qualified # ๐Ÿฃ sushi +1F364 ; fully-qualified # ๐Ÿค fried shrimp +1F365 ; fully-qualified # ๐Ÿฅ fish cake with swirl +1F96E ; fully-qualified # ๐Ÿฅฎ moon cake +1F361 ; fully-qualified # ๐Ÿก dango +1F95F ; fully-qualified # ๐ŸฅŸ dumpling +1F960 ; fully-qualified # ๐Ÿฅ  fortune cookie +1F961 ; fully-qualified # ๐Ÿฅก takeout box + +# subgroup: food-sweet +1F366 ; fully-qualified # ๐Ÿฆ soft ice cream +1F367 ; fully-qualified # ๐Ÿง shaved ice +1F368 ; fully-qualified # ๐Ÿจ ice cream +1F369 ; fully-qualified # ๐Ÿฉ doughnut +1F36A ; fully-qualified # ๐Ÿช cookie +1F382 ; fully-qualified # ๐ŸŽ‚ birthday cake +1F370 ; fully-qualified # ๐Ÿฐ shortcake +1F9C1 ; fully-qualified # ๐Ÿง cupcake +1F967 ; fully-qualified # ๐Ÿฅง pie +1F36B ; fully-qualified # ๐Ÿซ chocolate bar +1F36C ; fully-qualified # ๐Ÿฌ candy +1F36D ; fully-qualified # ๐Ÿญ lollipop +1F36E ; fully-qualified # ๐Ÿฎ custard +1F36F ; fully-qualified # ๐Ÿฏ honey pot + +# subgroup: drink +1F37C ; fully-qualified # ๐Ÿผ baby bottle +1F95B ; fully-qualified # ๐Ÿฅ› glass of milk +2615 ; fully-qualified # โ˜• hot beverage +1F375 ; fully-qualified # ๐Ÿต teacup without handle +1F376 ; fully-qualified # ๐Ÿถ sake +1F37E ; fully-qualified # ๐Ÿพ bottle with popping cork +1F377 ; fully-qualified # ๐Ÿท wine glass +1F378 ; fully-qualified # ๐Ÿธ cocktail glass +1F379 ; fully-qualified # ๐Ÿน tropical drink +1F37A ; fully-qualified # ๐Ÿบ beer mug +1F37B ; fully-qualified # ๐Ÿป clinking beer mugs +1F942 ; fully-qualified # ๐Ÿฅ‚ clinking glasses +1F943 ; fully-qualified # ๐Ÿฅƒ tumbler glass +1F964 ; fully-qualified # ๐Ÿฅค cup with straw + +# subgroup: dishware +1F962 ; fully-qualified # ๐Ÿฅข chopsticks +1F37D FE0F ; fully-qualified # ๐Ÿฝ๏ธ fork and knife with plate +1F37D ; non-fully-qualified # ๐Ÿฝ fork and knife with plate +1F374 ; fully-qualified # ๐Ÿด fork and knife +1F944 ; fully-qualified # ๐Ÿฅ„ spoon +1F52A ; fully-qualified # ๐Ÿ”ช kitchen knife +1F3FA ; fully-qualified # ๐Ÿบ amphora + +# Food & Drink subtotal: 110 +# Food & Drink subtotal: 110 w/o modifiers + +# group: Travel & Places + +# subgroup: place-map +1F30D ; fully-qualified # ๐ŸŒ globe showing Europe-Africa +1F30E ; fully-qualified # ๐ŸŒŽ globe showing Americas +1F30F ; fully-qualified # ๐ŸŒ globe showing Asia-Australia +1F310 ; fully-qualified # ๐ŸŒ globe with meridians +1F5FA FE0F ; fully-qualified # ๐Ÿ—บ๏ธ world map +1F5FA ; non-fully-qualified # ๐Ÿ—บ world map +1F5FE ; fully-qualified # ๐Ÿ—พ map of Japan +1F9ED ; fully-qualified # ๐Ÿงญ compass + +# subgroup: place-geographic +1F3D4 FE0F ; fully-qualified # ๐Ÿ”๏ธ snow-capped mountain +1F3D4 ; non-fully-qualified # ๐Ÿ” snow-capped mountain +26F0 FE0F ; fully-qualified # โ›ฐ๏ธ mountain +26F0 ; non-fully-qualified # โ›ฐ mountain +1F30B ; fully-qualified # ๐ŸŒ‹ volcano +1F5FB ; fully-qualified # ๐Ÿ—ป mount fuji +1F3D5 FE0F ; fully-qualified # ๐Ÿ•๏ธ camping +1F3D5 ; non-fully-qualified # ๐Ÿ• camping +1F3D6 FE0F ; fully-qualified # ๐Ÿ–๏ธ beach with umbrella +1F3D6 ; non-fully-qualified # ๐Ÿ– beach with umbrella +1F3DC FE0F ; fully-qualified # ๐Ÿœ๏ธ desert +1F3DC ; non-fully-qualified # ๐Ÿœ desert +1F3DD FE0F ; fully-qualified # ๐Ÿ๏ธ desert island +1F3DD ; non-fully-qualified # ๐Ÿ desert island +1F3DE FE0F ; fully-qualified # ๐Ÿž๏ธ national park +1F3DE ; non-fully-qualified # ๐Ÿž national park + +# subgroup: place-building +1F3DF FE0F ; fully-qualified # ๐ŸŸ๏ธ stadium +1F3DF ; non-fully-qualified # ๐ŸŸ stadium +1F3DB FE0F ; fully-qualified # ๐Ÿ›๏ธ classical building +1F3DB ; non-fully-qualified # ๐Ÿ› classical building +1F3D7 FE0F ; fully-qualified # ๐Ÿ—๏ธ building construction +1F3D7 ; non-fully-qualified # ๐Ÿ— building construction +1F9F1 ; fully-qualified # ๐Ÿงฑ bricks +1F3D8 FE0F ; fully-qualified # ๐Ÿ˜๏ธ houses +1F3D8 ; non-fully-qualified # ๐Ÿ˜ houses +1F3DA FE0F ; fully-qualified # ๐Ÿš๏ธ derelict house +1F3DA ; non-fully-qualified # ๐Ÿš derelict house +1F3E0 ; fully-qualified # ๐Ÿ  house +1F3E1 ; fully-qualified # ๐Ÿก house with garden +1F3E2 ; fully-qualified # ๐Ÿข office building +1F3E3 ; fully-qualified # ๐Ÿฃ Japanese post office +1F3E4 ; fully-qualified # ๐Ÿค post office +1F3E5 ; fully-qualified # ๐Ÿฅ hospital +1F3E6 ; fully-qualified # ๐Ÿฆ bank +1F3E8 ; fully-qualified # ๐Ÿจ hotel +1F3E9 ; fully-qualified # ๐Ÿฉ love hotel +1F3EA ; fully-qualified # ๐Ÿช convenience store +1F3EB ; fully-qualified # ๐Ÿซ school +1F3EC ; fully-qualified # ๐Ÿฌ department store +1F3ED ; fully-qualified # ๐Ÿญ factory +1F3EF ; fully-qualified # ๐Ÿฏ Japanese castle +1F3F0 ; fully-qualified # ๐Ÿฐ castle +1F492 ; fully-qualified # ๐Ÿ’’ wedding +1F5FC ; fully-qualified # ๐Ÿ—ผ Tokyo tower +1F5FD ; fully-qualified # ๐Ÿ—ฝ Statue of Liberty + +# subgroup: place-religious +26EA ; fully-qualified # โ›ช church +1F54C ; fully-qualified # ๐Ÿ•Œ mosque +1F54D ; fully-qualified # ๐Ÿ• synagogue +26E9 FE0F ; fully-qualified # โ›ฉ๏ธ shinto shrine +26E9 ; non-fully-qualified # โ›ฉ shinto shrine +1F54B ; fully-qualified # ๐Ÿ•‹ kaaba + +# subgroup: place-other +26F2 ; fully-qualified # โ›ฒ fountain +26FA ; fully-qualified # โ›บ tent +1F301 ; fully-qualified # ๐ŸŒ foggy +1F303 ; fully-qualified # ๐ŸŒƒ night with stars +1F3D9 FE0F ; fully-qualified # ๐Ÿ™๏ธ cityscape +1F3D9 ; non-fully-qualified # ๐Ÿ™ cityscape +1F304 ; fully-qualified # ๐ŸŒ„ sunrise over mountains +1F305 ; fully-qualified # ๐ŸŒ… sunrise +1F306 ; fully-qualified # ๐ŸŒ† cityscape at dusk +1F307 ; fully-qualified # ๐ŸŒ‡ sunset +1F309 ; fully-qualified # ๐ŸŒ‰ bridge at night +2668 FE0F ; fully-qualified # โ™จ๏ธ hot springs +2668 ; non-fully-qualified # โ™จ hot springs +1F30C ; fully-qualified # ๐ŸŒŒ milky way +1F3A0 ; fully-qualified # ๐ŸŽ  carousel horse +1F3A1 ; fully-qualified # ๐ŸŽก ferris wheel +1F3A2 ; fully-qualified # ๐ŸŽข roller coaster +1F488 ; fully-qualified # ๐Ÿ’ˆ barber pole +1F3AA ; fully-qualified # ๐ŸŽช circus tent + +# subgroup: transport-ground +1F682 ; fully-qualified # ๐Ÿš‚ locomotive +1F683 ; fully-qualified # ๐Ÿšƒ railway car +1F684 ; fully-qualified # ๐Ÿš„ high-speed train +1F685 ; fully-qualified # ๐Ÿš… bullet train +1F686 ; fully-qualified # ๐Ÿš† train +1F687 ; fully-qualified # ๐Ÿš‡ metro +1F688 ; fully-qualified # ๐Ÿšˆ light rail +1F689 ; fully-qualified # ๐Ÿš‰ station +1F68A ; fully-qualified # ๐ŸšŠ tram +1F69D ; fully-qualified # ๐Ÿš monorail +1F69E ; fully-qualified # ๐Ÿšž mountain railway +1F68B ; fully-qualified # ๐Ÿš‹ tram car +1F68C ; fully-qualified # ๐ŸšŒ bus +1F68D ; fully-qualified # ๐Ÿš oncoming bus +1F68E ; fully-qualified # ๐ŸšŽ trolleybus +1F690 ; fully-qualified # ๐Ÿš minibus +1F691 ; fully-qualified # ๐Ÿš‘ ambulance +1F692 ; fully-qualified # ๐Ÿš’ fire engine +1F693 ; fully-qualified # ๐Ÿš“ police car +1F694 ; fully-qualified # ๐Ÿš” oncoming police car +1F695 ; fully-qualified # ๐Ÿš• taxi +1F696 ; fully-qualified # ๐Ÿš– oncoming taxi +1F697 ; fully-qualified # ๐Ÿš— automobile +1F698 ; fully-qualified # ๐Ÿš˜ oncoming automobile +1F699 ; fully-qualified # ๐Ÿš™ sport utility vehicle +1F69A ; fully-qualified # ๐Ÿšš delivery truck +1F69B ; fully-qualified # ๐Ÿš› articulated lorry +1F69C ; fully-qualified # ๐Ÿšœ tractor +1F6B2 ; fully-qualified # ๐Ÿšฒ bicycle +1F6F4 ; fully-qualified # ๐Ÿ›ด kick scooter +1F6F9 ; fully-qualified # ๐Ÿ›น skateboard +1F6F5 ; fully-qualified # ๐Ÿ›ต motor scooter +1F68F ; fully-qualified # ๐Ÿš bus stop +1F6E3 FE0F ; fully-qualified # ๐Ÿ›ฃ๏ธ motorway +1F6E3 ; non-fully-qualified # ๐Ÿ›ฃ motorway +1F6E4 FE0F ; fully-qualified # ๐Ÿ›ค๏ธ railway track +1F6E4 ; non-fully-qualified # ๐Ÿ›ค railway track +1F6E2 FE0F ; fully-qualified # ๐Ÿ›ข๏ธ oil drum +1F6E2 ; non-fully-qualified # ๐Ÿ›ข oil drum +26FD ; fully-qualified # โ›ฝ fuel pump +1F6A8 ; fully-qualified # ๐Ÿšจ police car light +1F6A5 ; fully-qualified # ๐Ÿšฅ horizontal traffic light +1F6A6 ; fully-qualified # ๐Ÿšฆ vertical traffic light +1F6D1 ; fully-qualified # ๐Ÿ›‘ stop sign +1F6A7 ; fully-qualified # ๐Ÿšง construction + +# subgroup: transport-water +2693 ; fully-qualified # โš“ anchor +26F5 ; fully-qualified # โ›ต sailboat +1F6F6 ; fully-qualified # ๐Ÿ›ถ canoe +1F6A4 ; fully-qualified # ๐Ÿšค speedboat +1F6F3 FE0F ; fully-qualified # ๐Ÿ›ณ๏ธ passenger ship +1F6F3 ; non-fully-qualified # ๐Ÿ›ณ passenger ship +26F4 FE0F ; fully-qualified # โ›ด๏ธ ferry +26F4 ; non-fully-qualified # โ›ด ferry +1F6E5 FE0F ; fully-qualified # ๐Ÿ›ฅ๏ธ motor boat +1F6E5 ; non-fully-qualified # ๐Ÿ›ฅ motor boat +1F6A2 ; fully-qualified # ๐Ÿšข ship + +# subgroup: transport-air +2708 FE0F ; fully-qualified # โœˆ๏ธ airplane +2708 ; non-fully-qualified # โœˆ airplane +1F6E9 FE0F ; fully-qualified # ๐Ÿ›ฉ๏ธ small airplane +1F6E9 ; non-fully-qualified # ๐Ÿ›ฉ small airplane +1F6EB ; fully-qualified # ๐Ÿ›ซ airplane departure +1F6EC ; fully-qualified # ๐Ÿ›ฌ airplane arrival +1F4BA ; fully-qualified # ๐Ÿ’บ seat +1F681 ; fully-qualified # ๐Ÿš helicopter +1F69F ; fully-qualified # ๐ŸšŸ suspension railway +1F6A0 ; fully-qualified # ๐Ÿš  mountain cableway +1F6A1 ; fully-qualified # ๐Ÿšก aerial tramway +1F6F0 FE0F ; fully-qualified # ๐Ÿ›ฐ๏ธ satellite +1F6F0 ; non-fully-qualified # ๐Ÿ›ฐ satellite +1F680 ; fully-qualified # ๐Ÿš€ rocket +1F6F8 ; fully-qualified # ๐Ÿ›ธ flying saucer + +# subgroup: hotel +1F6CE FE0F ; fully-qualified # ๐Ÿ›Ž๏ธ bellhop bell +1F6CE ; non-fully-qualified # ๐Ÿ›Ž bellhop bell +1F9F3 ; fully-qualified # ๐Ÿงณ luggage + +# subgroup: time +231B ; fully-qualified # โŒ› hourglass done +23F3 ; fully-qualified # โณ hourglass not done +231A ; fully-qualified # โŒš watch +23F0 ; fully-qualified # โฐ alarm clock +23F1 FE0F ; fully-qualified # โฑ๏ธ stopwatch +23F1 ; non-fully-qualified # โฑ stopwatch +23F2 FE0F ; fully-qualified # โฒ๏ธ timer clock +23F2 ; non-fully-qualified # โฒ timer clock +1F570 FE0F ; fully-qualified # ๐Ÿ•ฐ๏ธ mantelpiece clock +1F570 ; non-fully-qualified # ๐Ÿ•ฐ mantelpiece clock +1F55B ; fully-qualified # ๐Ÿ•› twelve oโ€™clock +1F567 ; fully-qualified # ๐Ÿ•ง twelve-thirty +1F550 ; fully-qualified # ๐Ÿ• one oโ€™clock +1F55C ; fully-qualified # ๐Ÿ•œ one-thirty +1F551 ; fully-qualified # ๐Ÿ•‘ two oโ€™clock +1F55D ; fully-qualified # ๐Ÿ• two-thirty +1F552 ; fully-qualified # ๐Ÿ•’ three oโ€™clock +1F55E ; fully-qualified # ๐Ÿ•ž three-thirty +1F553 ; fully-qualified # ๐Ÿ•“ four oโ€™clock +1F55F ; fully-qualified # ๐Ÿ•Ÿ four-thirty +1F554 ; fully-qualified # ๐Ÿ•” five oโ€™clock +1F560 ; fully-qualified # ๐Ÿ•  five-thirty +1F555 ; fully-qualified # ๐Ÿ•• six oโ€™clock +1F561 ; fully-qualified # ๐Ÿ•ก six-thirty +1F556 ; fully-qualified # ๐Ÿ•– seven oโ€™clock +1F562 ; fully-qualified # ๐Ÿ•ข seven-thirty +1F557 ; fully-qualified # ๐Ÿ•— eight oโ€™clock +1F563 ; fully-qualified # ๐Ÿ•ฃ eight-thirty +1F558 ; fully-qualified # ๐Ÿ•˜ nine oโ€™clock +1F564 ; fully-qualified # ๐Ÿ•ค nine-thirty +1F559 ; fully-qualified # ๐Ÿ•™ ten oโ€™clock +1F565 ; fully-qualified # ๐Ÿ•ฅ ten-thirty +1F55A ; fully-qualified # ๐Ÿ•š eleven oโ€™clock +1F566 ; fully-qualified # ๐Ÿ•ฆ eleven-thirty + +# subgroup: sky & weather +1F311 ; fully-qualified # ๐ŸŒ‘ new moon +1F312 ; fully-qualified # ๐ŸŒ’ waxing crescent moon +1F313 ; fully-qualified # ๐ŸŒ“ first quarter moon +1F314 ; fully-qualified # ๐ŸŒ” waxing gibbous moon +1F315 ; fully-qualified # ๐ŸŒ• full moon +1F316 ; fully-qualified # ๐ŸŒ– waning gibbous moon +1F317 ; fully-qualified # ๐ŸŒ— last quarter moon +1F318 ; fully-qualified # ๐ŸŒ˜ waning crescent moon +1F319 ; fully-qualified # ๐ŸŒ™ crescent moon +1F31A ; fully-qualified # ๐ŸŒš new moon face +1F31B ; fully-qualified # ๐ŸŒ› first quarter moon face +1F31C ; fully-qualified # ๐ŸŒœ last quarter moon face +1F321 FE0F ; fully-qualified # ๐ŸŒก๏ธ thermometer +1F321 ; non-fully-qualified # ๐ŸŒก thermometer +2600 FE0F ; fully-qualified # โ˜€๏ธ sun +2600 ; non-fully-qualified # โ˜€ sun +1F31D ; fully-qualified # ๐ŸŒ full moon face +1F31E ; fully-qualified # ๐ŸŒž sun with face +2B50 ; fully-qualified # โญ star +1F31F ; fully-qualified # ๐ŸŒŸ glowing star +1F320 ; fully-qualified # ๐ŸŒ  shooting star +2601 FE0F ; fully-qualified # โ˜๏ธ cloud +2601 ; non-fully-qualified # โ˜ cloud +26C5 ; fully-qualified # โ›… sun behind cloud +26C8 FE0F ; fully-qualified # โ›ˆ๏ธ cloud with lightning and rain +26C8 ; non-fully-qualified # โ›ˆ cloud with lightning and rain +1F324 FE0F ; fully-qualified # ๐ŸŒค๏ธ sun behind small cloud +1F324 ; non-fully-qualified # ๐ŸŒค sun behind small cloud +1F325 FE0F ; fully-qualified # ๐ŸŒฅ๏ธ sun behind large cloud +1F325 ; non-fully-qualified # ๐ŸŒฅ sun behind large cloud +1F326 FE0F ; fully-qualified # ๐ŸŒฆ๏ธ sun behind rain cloud +1F326 ; non-fully-qualified # ๐ŸŒฆ sun behind rain cloud +1F327 FE0F ; fully-qualified # ๐ŸŒง๏ธ cloud with rain +1F327 ; non-fully-qualified # ๐ŸŒง cloud with rain +1F328 FE0F ; fully-qualified # ๐ŸŒจ๏ธ cloud with snow +1F328 ; non-fully-qualified # ๐ŸŒจ cloud with snow +1F329 FE0F ; fully-qualified # ๐ŸŒฉ๏ธ cloud with lightning +1F329 ; non-fully-qualified # ๐ŸŒฉ cloud with lightning +1F32A FE0F ; fully-qualified # ๐ŸŒช๏ธ tornado +1F32A ; non-fully-qualified # ๐ŸŒช tornado +1F32B FE0F ; fully-qualified # ๐ŸŒซ๏ธ fog +1F32B ; non-fully-qualified # ๐ŸŒซ fog +1F32C FE0F ; fully-qualified # ๐ŸŒฌ๏ธ wind face +1F32C ; non-fully-qualified # ๐ŸŒฌ wind face +1F300 ; fully-qualified # ๐ŸŒ€ cyclone +1F308 ; fully-qualified # ๐ŸŒˆ rainbow +1F302 ; fully-qualified # ๐ŸŒ‚ closed umbrella +2602 FE0F ; fully-qualified # โ˜‚๏ธ umbrella +2602 ; non-fully-qualified # โ˜‚ umbrella +2614 ; fully-qualified # โ˜” umbrella with rain drops +26F1 FE0F ; fully-qualified # โ›ฑ๏ธ umbrella on ground +26F1 ; non-fully-qualified # โ›ฑ umbrella on ground +26A1 ; fully-qualified # โšก high voltage +2744 FE0F ; fully-qualified # โ„๏ธ snowflake +2744 ; non-fully-qualified # โ„ snowflake +2603 FE0F ; fully-qualified # โ˜ƒ๏ธ snowman +2603 ; non-fully-qualified # โ˜ƒ snowman +26C4 ; fully-qualified # โ›„ snowman without snow +2604 FE0F ; fully-qualified # โ˜„๏ธ comet +2604 ; non-fully-qualified # โ˜„ comet +1F525 ; fully-qualified # ๐Ÿ”ฅ fire +1F4A7 ; fully-qualified # ๐Ÿ’ง droplet +1F30A ; fully-qualified # ๐ŸŒŠ water wave + +# Travel & Places subtotal: 249 +# Travel & Places subtotal: 249 w/o modifiers + +# group: Activities + +# subgroup: event +1F383 ; fully-qualified # ๐ŸŽƒ jack-o-lantern +1F384 ; fully-qualified # ๐ŸŽ„ Christmas tree +1F386 ; fully-qualified # ๐ŸŽ† fireworks +1F387 ; fully-qualified # ๐ŸŽ‡ sparkler +1F9E8 ; fully-qualified # ๐Ÿงจ firecracker +2728 ; fully-qualified # โœจ sparkles +1F388 ; fully-qualified # ๐ŸŽˆ balloon +1F389 ; fully-qualified # ๐ŸŽ‰ party popper +1F38A ; fully-qualified # ๐ŸŽŠ confetti ball +1F38B ; fully-qualified # ๐ŸŽ‹ tanabata tree +1F38D ; fully-qualified # ๐ŸŽ pine decoration +1F38E ; fully-qualified # ๐ŸŽŽ Japanese dolls +1F38F ; fully-qualified # ๐ŸŽ carp streamer +1F390 ; fully-qualified # ๐ŸŽ wind chime +1F391 ; fully-qualified # ๐ŸŽ‘ moon viewing ceremony +1F9E7 ; fully-qualified # ๐Ÿงง red envelope +1F380 ; fully-qualified # ๐ŸŽ€ ribbon +1F381 ; fully-qualified # ๐ŸŽ wrapped gift +1F397 FE0F ; fully-qualified # ๐ŸŽ—๏ธ reminder ribbon +1F397 ; non-fully-qualified # ๐ŸŽ— reminder ribbon +1F39F FE0F ; fully-qualified # ๐ŸŽŸ๏ธ admission tickets +1F39F ; non-fully-qualified # ๐ŸŽŸ admission tickets +1F3AB ; fully-qualified # ๐ŸŽซ ticket + +# subgroup: award-medal +1F396 FE0F ; fully-qualified # ๐ŸŽ–๏ธ military medal +1F396 ; non-fully-qualified # ๐ŸŽ– military medal +1F3C6 ; fully-qualified # ๐Ÿ† trophy +1F3C5 ; fully-qualified # ๐Ÿ… sports medal +1F947 ; fully-qualified # ๐Ÿฅ‡ 1st place medal +1F948 ; fully-qualified # ๐Ÿฅˆ 2nd place medal +1F949 ; fully-qualified # ๐Ÿฅ‰ 3rd place medal + +# subgroup: sport +26BD ; fully-qualified # โšฝ soccer ball +26BE ; fully-qualified # โšพ baseball +1F94E ; fully-qualified # ๐ŸฅŽ softball +1F3C0 ; fully-qualified # ๐Ÿ€ basketball +1F3D0 ; fully-qualified # ๐Ÿ volleyball +1F3C8 ; fully-qualified # ๐Ÿˆ american football +1F3C9 ; fully-qualified # ๐Ÿ‰ rugby football +1F3BE ; fully-qualified # ๐ŸŽพ tennis +1F94F ; fully-qualified # ๐Ÿฅ flying disc +1F3B3 ; fully-qualified # ๐ŸŽณ bowling +1F3CF ; fully-qualified # ๐Ÿ cricket game +1F3D1 ; fully-qualified # ๐Ÿ‘ field hockey +1F3D2 ; fully-qualified # ๐Ÿ’ ice hockey +1F94D ; fully-qualified # ๐Ÿฅ lacrosse +1F3D3 ; fully-qualified # ๐Ÿ“ ping pong +1F3F8 ; fully-qualified # ๐Ÿธ badminton +1F94A ; fully-qualified # ๐ŸฅŠ boxing glove +1F94B ; fully-qualified # ๐Ÿฅ‹ martial arts uniform +1F945 ; fully-qualified # ๐Ÿฅ… goal net +26F3 ; fully-qualified # โ›ณ flag in hole +26F8 FE0F ; fully-qualified # โ›ธ๏ธ ice skate +26F8 ; non-fully-qualified # โ›ธ ice skate +1F3A3 ; fully-qualified # ๐ŸŽฃ fishing pole +1F3BD ; fully-qualified # ๐ŸŽฝ running shirt +1F3BF ; fully-qualified # ๐ŸŽฟ skis +1F6F7 ; fully-qualified # ๐Ÿ›ท sled +1F94C ; fully-qualified # ๐ŸฅŒ curling stone + +# subgroup: game +1F3AF ; fully-qualified # ๐ŸŽฏ direct hit +1F3B1 ; fully-qualified # ๐ŸŽฑ pool 8 ball +1F52E ; fully-qualified # ๐Ÿ”ฎ crystal ball +1F9FF ; fully-qualified # ๐Ÿงฟ nazar amulet +1F3AE ; fully-qualified # ๐ŸŽฎ video game +1F579 FE0F ; fully-qualified # ๐Ÿ•น๏ธ joystick +1F579 ; non-fully-qualified # ๐Ÿ•น joystick +1F3B0 ; fully-qualified # ๐ŸŽฐ slot machine +1F3B2 ; fully-qualified # ๐ŸŽฒ game die +1F9E9 ; fully-qualified # ๐Ÿงฉ jigsaw +1F9F8 ; fully-qualified # ๐Ÿงธ teddy bear +2660 FE0F ; fully-qualified # โ™ ๏ธ spade suit +2660 ; non-fully-qualified # โ™  spade suit +2665 FE0F ; fully-qualified # โ™ฅ๏ธ heart suit +2665 ; non-fully-qualified # โ™ฅ heart suit +2666 FE0F ; fully-qualified # โ™ฆ๏ธ diamond suit +2666 ; non-fully-qualified # โ™ฆ diamond suit +2663 FE0F ; fully-qualified # โ™ฃ๏ธ club suit +2663 ; non-fully-qualified # โ™ฃ club suit +265F FE0F ; fully-qualified # โ™Ÿ๏ธ chess pawn +265F ; non-fully-qualified # โ™Ÿ chess pawn +1F0CF ; fully-qualified # ๐Ÿƒ joker +1F004 ; fully-qualified # ๐Ÿ€„ mahjong red dragon +1F3B4 ; fully-qualified # ๐ŸŽด flower playing cards + +# subgroup: arts & crafts +1F3AD ; fully-qualified # ๐ŸŽญ performing arts +1F5BC FE0F ; fully-qualified # ๐Ÿ–ผ๏ธ framed picture +1F5BC ; non-fully-qualified # ๐Ÿ–ผ framed picture +1F3A8 ; fully-qualified # ๐ŸŽจ artist palette +1F9F5 ; fully-qualified # ๐Ÿงต thread +1F9F6 ; fully-qualified # ๐Ÿงถ yarn + +# Activities subtotal: 87 +# Activities subtotal: 87 w/o modifiers + +# group: Objects + +# subgroup: sound +1F507 ; fully-qualified # ๐Ÿ”‡ muted speaker +1F508 ; fully-qualified # ๐Ÿ”ˆ speaker low volume +1F509 ; fully-qualified # ๐Ÿ”‰ speaker medium volume +1F50A ; fully-qualified # ๐Ÿ”Š speaker high volume +1F4E2 ; fully-qualified # ๐Ÿ“ข loudspeaker +1F4E3 ; fully-qualified # ๐Ÿ“ฃ megaphone +1F4EF ; fully-qualified # ๐Ÿ“ฏ postal horn +1F514 ; fully-qualified # ๐Ÿ”” bell +1F515 ; fully-qualified # ๐Ÿ”• bell with slash + +# subgroup: music +1F3BC ; fully-qualified # ๐ŸŽผ musical score +1F3B5 ; fully-qualified # ๐ŸŽต musical note +1F3B6 ; fully-qualified # ๐ŸŽถ musical notes +1F399 FE0F ; fully-qualified # ๐ŸŽ™๏ธ studio microphone +1F399 ; non-fully-qualified # ๐ŸŽ™ studio microphone +1F39A FE0F ; fully-qualified # ๐ŸŽš๏ธ level slider +1F39A ; non-fully-qualified # ๐ŸŽš level slider +1F39B FE0F ; fully-qualified # ๐ŸŽ›๏ธ control knobs +1F39B ; non-fully-qualified # ๐ŸŽ› control knobs +1F3A4 ; fully-qualified # ๐ŸŽค microphone +1F3A7 ; fully-qualified # ๐ŸŽง headphone +1F4FB ; fully-qualified # ๐Ÿ“ป radio + +# subgroup: musical-instrument +1F3B7 ; fully-qualified # ๐ŸŽท saxophone +1F3B8 ; fully-qualified # ๐ŸŽธ guitar +1F3B9 ; fully-qualified # ๐ŸŽน musical keyboard +1F3BA ; fully-qualified # ๐ŸŽบ trumpet +1F3BB ; fully-qualified # ๐ŸŽป violin +1F941 ; fully-qualified # ๐Ÿฅ drum + +# subgroup: phone +1F4F1 ; fully-qualified # ๐Ÿ“ฑ mobile phone +1F4F2 ; fully-qualified # ๐Ÿ“ฒ mobile phone with arrow +260E FE0F ; fully-qualified # โ˜Ž๏ธ telephone +260E ; non-fully-qualified # โ˜Ž telephone +1F4DE ; fully-qualified # ๐Ÿ“ž telephone receiver +1F4DF ; fully-qualified # ๐Ÿ“Ÿ pager +1F4E0 ; fully-qualified # ๐Ÿ“  fax machine + +# subgroup: computer +1F50B ; fully-qualified # ๐Ÿ”‹ battery +1F50C ; fully-qualified # ๐Ÿ”Œ electric plug +1F4BB ; fully-qualified # ๐Ÿ’ป laptop computer +1F5A5 FE0F ; fully-qualified # ๐Ÿ–ฅ๏ธ desktop computer +1F5A5 ; non-fully-qualified # ๐Ÿ–ฅ desktop computer +1F5A8 FE0F ; fully-qualified # ๐Ÿ–จ๏ธ printer +1F5A8 ; non-fully-qualified # ๐Ÿ–จ printer +2328 FE0F ; fully-qualified # โŒจ๏ธ keyboard +2328 ; non-fully-qualified # โŒจ keyboard +1F5B1 FE0F ; fully-qualified # ๐Ÿ–ฑ๏ธ computer mouse +1F5B1 ; non-fully-qualified # ๐Ÿ–ฑ computer mouse +1F5B2 FE0F ; fully-qualified # ๐Ÿ–ฒ๏ธ trackball +1F5B2 ; non-fully-qualified # ๐Ÿ–ฒ trackball +1F4BD ; fully-qualified # ๐Ÿ’ฝ computer disk +1F4BE ; fully-qualified # ๐Ÿ’พ floppy disk +1F4BF ; fully-qualified # ๐Ÿ’ฟ optical disk +1F4C0 ; fully-qualified # ๐Ÿ“€ dvd +1F9EE ; fully-qualified # ๐Ÿงฎ abacus + +# subgroup: light & video +1F3A5 ; fully-qualified # ๐ŸŽฅ movie camera +1F39E FE0F ; fully-qualified # ๐ŸŽž๏ธ film frames +1F39E ; non-fully-qualified # ๐ŸŽž film frames +1F4FD FE0F ; fully-qualified # ๐Ÿ“ฝ๏ธ film projector +1F4FD ; non-fully-qualified # ๐Ÿ“ฝ film projector +1F3AC ; fully-qualified # ๐ŸŽฌ clapper board +1F4FA ; fully-qualified # ๐Ÿ“บ television +1F4F7 ; fully-qualified # ๐Ÿ“ท camera +1F4F8 ; fully-qualified # ๐Ÿ“ธ camera with flash +1F4F9 ; fully-qualified # ๐Ÿ“น video camera +1F4FC ; fully-qualified # ๐Ÿ“ผ videocassette +1F50D ; fully-qualified # ๐Ÿ” magnifying glass tilted left +1F50E ; fully-qualified # ๐Ÿ”Ž magnifying glass tilted right +1F56F FE0F ; fully-qualified # ๐Ÿ•ฏ๏ธ candle +1F56F ; non-fully-qualified # ๐Ÿ•ฏ candle +1F4A1 ; fully-qualified # ๐Ÿ’ก light bulb +1F526 ; fully-qualified # ๐Ÿ”ฆ flashlight +1F3EE ; fully-qualified # ๐Ÿฎ red paper lantern + +# subgroup: book-paper +1F4D4 ; fully-qualified # ๐Ÿ“” notebook with decorative cover +1F4D5 ; fully-qualified # ๐Ÿ“• closed book +1F4D6 ; fully-qualified # ๐Ÿ“– open book +1F4D7 ; fully-qualified # ๐Ÿ“— green book +1F4D8 ; fully-qualified # ๐Ÿ“˜ blue book +1F4D9 ; fully-qualified # ๐Ÿ“™ orange book +1F4DA ; fully-qualified # ๐Ÿ“š books +1F4D3 ; fully-qualified # ๐Ÿ““ notebook +1F4D2 ; fully-qualified # ๐Ÿ“’ ledger +1F4C3 ; fully-qualified # ๐Ÿ“ƒ page with curl +1F4DC ; fully-qualified # ๐Ÿ“œ scroll +1F4C4 ; fully-qualified # ๐Ÿ“„ page facing up +1F4F0 ; fully-qualified # ๐Ÿ“ฐ newspaper +1F5DE FE0F ; fully-qualified # ๐Ÿ—ž๏ธ rolled-up newspaper +1F5DE ; non-fully-qualified # ๐Ÿ—ž rolled-up newspaper +1F4D1 ; fully-qualified # ๐Ÿ“‘ bookmark tabs +1F516 ; fully-qualified # ๐Ÿ”– bookmark +1F3F7 FE0F ; fully-qualified # ๐Ÿท๏ธ label +1F3F7 ; non-fully-qualified # ๐Ÿท label + +# subgroup: money +1F4B0 ; fully-qualified # ๐Ÿ’ฐ money bag +1F4B4 ; fully-qualified # ๐Ÿ’ด yen banknote +1F4B5 ; fully-qualified # ๐Ÿ’ต dollar banknote +1F4B6 ; fully-qualified # ๐Ÿ’ถ euro banknote +1F4B7 ; fully-qualified # ๐Ÿ’ท pound banknote +1F4B8 ; fully-qualified # ๐Ÿ’ธ money with wings +1F4B3 ; fully-qualified # ๐Ÿ’ณ credit card +1F9FE ; fully-qualified # ๐Ÿงพ receipt +1F4B9 ; fully-qualified # ๐Ÿ’น chart increasing with yen +1F4B1 ; fully-qualified # ๐Ÿ’ฑ currency exchange +1F4B2 ; fully-qualified # ๐Ÿ’ฒ heavy dollar sign + +# subgroup: mail +2709 FE0F ; fully-qualified # โœ‰๏ธ envelope +2709 ; non-fully-qualified # โœ‰ envelope +1F4E7 ; fully-qualified # ๐Ÿ“ง e-mail +1F4E8 ; fully-qualified # ๐Ÿ“จ incoming envelope +1F4E9 ; fully-qualified # ๐Ÿ“ฉ envelope with arrow +1F4E4 ; fully-qualified # ๐Ÿ“ค outbox tray +1F4E5 ; fully-qualified # ๐Ÿ“ฅ inbox tray +1F4E6 ; fully-qualified # ๐Ÿ“ฆ package +1F4EB ; fully-qualified # ๐Ÿ“ซ closed mailbox with raised flag +1F4EA ; fully-qualified # ๐Ÿ“ช closed mailbox with lowered flag +1F4EC ; fully-qualified # ๐Ÿ“ฌ open mailbox with raised flag +1F4ED ; fully-qualified # ๐Ÿ“ญ open mailbox with lowered flag +1F4EE ; fully-qualified # ๐Ÿ“ฎ postbox +1F5F3 FE0F ; fully-qualified # ๐Ÿ—ณ๏ธ ballot box with ballot +1F5F3 ; non-fully-qualified # ๐Ÿ—ณ ballot box with ballot + +# subgroup: writing +270F FE0F ; fully-qualified # โœ๏ธ pencil +270F ; non-fully-qualified # โœ pencil +2712 FE0F ; fully-qualified # โœ’๏ธ black nib +2712 ; non-fully-qualified # โœ’ black nib +1F58B FE0F ; fully-qualified # ๐Ÿ–‹๏ธ fountain pen +1F58B ; non-fully-qualified # ๐Ÿ–‹ fountain pen +1F58A FE0F ; fully-qualified # ๐Ÿ–Š๏ธ pen +1F58A ; non-fully-qualified # ๐Ÿ–Š pen +1F58C FE0F ; fully-qualified # ๐Ÿ–Œ๏ธ paintbrush +1F58C ; non-fully-qualified # ๐Ÿ–Œ paintbrush +1F58D FE0F ; fully-qualified # ๐Ÿ–๏ธ crayon +1F58D ; non-fully-qualified # ๐Ÿ– crayon +1F4DD ; fully-qualified # ๐Ÿ“ memo + +# subgroup: office +1F4BC ; fully-qualified # ๐Ÿ’ผ briefcase +1F4C1 ; fully-qualified # ๐Ÿ“ file folder +1F4C2 ; fully-qualified # ๐Ÿ“‚ open file folder +1F5C2 FE0F ; fully-qualified # ๐Ÿ—‚๏ธ card index dividers +1F5C2 ; non-fully-qualified # ๐Ÿ—‚ card index dividers +1F4C5 ; fully-qualified # ๐Ÿ“… calendar +1F4C6 ; fully-qualified # ๐Ÿ“† tear-off calendar +1F5D2 FE0F ; fully-qualified # ๐Ÿ—’๏ธ spiral notepad +1F5D2 ; non-fully-qualified # ๐Ÿ—’ spiral notepad +1F5D3 FE0F ; fully-qualified # ๐Ÿ—“๏ธ spiral calendar +1F5D3 ; non-fully-qualified # ๐Ÿ—“ spiral calendar +1F4C7 ; fully-qualified # ๐Ÿ“‡ card index +1F4C8 ; fully-qualified # ๐Ÿ“ˆ chart increasing +1F4C9 ; fully-qualified # ๐Ÿ“‰ chart decreasing +1F4CA ; fully-qualified # ๐Ÿ“Š bar chart +1F4CB ; fully-qualified # ๐Ÿ“‹ clipboard +1F4CC ; fully-qualified # ๐Ÿ“Œ pushpin +1F4CD ; fully-qualified # ๐Ÿ“ round pushpin +1F4CE ; fully-qualified # ๐Ÿ“Ž paperclip +1F587 FE0F ; fully-qualified # ๐Ÿ–‡๏ธ linked paperclips +1F587 ; non-fully-qualified # ๐Ÿ–‡ linked paperclips +1F4CF ; fully-qualified # ๐Ÿ“ straight ruler +1F4D0 ; fully-qualified # ๐Ÿ“ triangular ruler +2702 FE0F ; fully-qualified # โœ‚๏ธ scissors +2702 ; non-fully-qualified # โœ‚ scissors +1F5C3 FE0F ; fully-qualified # ๐Ÿ—ƒ๏ธ card file box +1F5C3 ; non-fully-qualified # ๐Ÿ—ƒ card file box +1F5C4 FE0F ; fully-qualified # ๐Ÿ—„๏ธ file cabinet +1F5C4 ; non-fully-qualified # ๐Ÿ—„ file cabinet +1F5D1 FE0F ; fully-qualified # ๐Ÿ—‘๏ธ wastebasket +1F5D1 ; non-fully-qualified # ๐Ÿ—‘ wastebasket + +# subgroup: lock +1F512 ; fully-qualified # ๐Ÿ”’ locked +1F513 ; fully-qualified # ๐Ÿ”“ unlocked +1F50F ; fully-qualified # ๐Ÿ” locked with pen +1F510 ; fully-qualified # ๐Ÿ” locked with key +1F511 ; fully-qualified # ๐Ÿ”‘ key +1F5DD FE0F ; fully-qualified # ๐Ÿ—๏ธ old key +1F5DD ; non-fully-qualified # ๐Ÿ— old key + +# subgroup: tool +1F528 ; fully-qualified # ๐Ÿ”จ hammer +26CF FE0F ; fully-qualified # โ›๏ธ pick +26CF ; non-fully-qualified # โ› pick +2692 FE0F ; fully-qualified # โš’๏ธ hammer and pick +2692 ; non-fully-qualified # โš’ hammer and pick +1F6E0 FE0F ; fully-qualified # ๐Ÿ› ๏ธ hammer and wrench +1F6E0 ; non-fully-qualified # ๐Ÿ›  hammer and wrench +1F5E1 FE0F ; fully-qualified # ๐Ÿ—ก๏ธ dagger +1F5E1 ; non-fully-qualified # ๐Ÿ—ก dagger +2694 FE0F ; fully-qualified # โš”๏ธ crossed swords +2694 ; non-fully-qualified # โš” crossed swords +1F52B ; fully-qualified # ๐Ÿ”ซ pistol +1F3F9 ; fully-qualified # ๐Ÿน bow and arrow +1F6E1 FE0F ; fully-qualified # ๐Ÿ›ก๏ธ shield +1F6E1 ; non-fully-qualified # ๐Ÿ›ก shield +1F527 ; fully-qualified # ๐Ÿ”ง wrench +1F529 ; fully-qualified # ๐Ÿ”ฉ nut and bolt +2699 FE0F ; fully-qualified # โš™๏ธ gear +2699 ; non-fully-qualified # โš™ gear +1F5DC FE0F ; fully-qualified # ๐Ÿ—œ๏ธ clamp +1F5DC ; non-fully-qualified # ๐Ÿ—œ clamp +2696 FE0F ; fully-qualified # โš–๏ธ balance scale +2696 ; non-fully-qualified # โš– balance scale +1F517 ; fully-qualified # ๐Ÿ”— link +26D3 FE0F ; fully-qualified # โ›“๏ธ chains +26D3 ; non-fully-qualified # โ›“ chains +1F9F0 ; fully-qualified # ๐Ÿงฐ toolbox +1F9F2 ; fully-qualified # ๐Ÿงฒ magnet + +# subgroup: science +2697 FE0F ; fully-qualified # โš—๏ธ alembic +2697 ; non-fully-qualified # โš— alembic +1F9EA ; fully-qualified # ๐Ÿงช test tube +1F9EB ; fully-qualified # ๐Ÿงซ petri dish +1F9EC ; fully-qualified # ๐Ÿงฌ dna +1F52C ; fully-qualified # ๐Ÿ”ฌ microscope +1F52D ; fully-qualified # ๐Ÿ”ญ telescope +1F4E1 ; fully-qualified # ๐Ÿ“ก satellite antenna + +# subgroup: medical +1F489 ; fully-qualified # ๐Ÿ’‰ syringe +1F48A ; fully-qualified # ๐Ÿ’Š pill + +# subgroup: household +1F6AA ; fully-qualified # ๐Ÿšช door +1F6CF FE0F ; fully-qualified # ๐Ÿ›๏ธ bed +1F6CF ; non-fully-qualified # ๐Ÿ› bed +1F6CB FE0F ; fully-qualified # ๐Ÿ›‹๏ธ couch and lamp +1F6CB ; non-fully-qualified # ๐Ÿ›‹ couch and lamp +1F6BD ; fully-qualified # ๐Ÿšฝ toilet +1F6BF ; fully-qualified # ๐Ÿšฟ shower +1F6C1 ; fully-qualified # ๐Ÿ› bathtub +1F9F4 ; fully-qualified # ๐Ÿงด lotion bottle +1F9F7 ; fully-qualified # ๐Ÿงท safety pin +1F9F9 ; fully-qualified # ๐Ÿงน broom +1F9FA ; fully-qualified # ๐Ÿงบ basket +1F9FB ; fully-qualified # ๐Ÿงป roll of paper +1F9FC ; fully-qualified # ๐Ÿงผ soap +1F9FD ; fully-qualified # ๐Ÿงฝ sponge +1F9EF ; fully-qualified # ๐Ÿงฏ fire extinguisher +1F6D2 ; fully-qualified # ๐Ÿ›’ shopping cart + +# subgroup: other-object +1F6AC ; fully-qualified # ๐Ÿšฌ cigarette +26B0 FE0F ; fully-qualified # โšฐ๏ธ coffin +26B0 ; non-fully-qualified # โšฐ coffin +26B1 FE0F ; fully-qualified # โšฑ๏ธ funeral urn +26B1 ; non-fully-qualified # โšฑ funeral urn +1F5FF ; fully-qualified # ๐Ÿ—ฟ moai + +# Objects subtotal: 227 +# Objects subtotal: 227 w/o modifiers + +# group: Symbols + +# subgroup: transport-sign +1F3E7 ; fully-qualified # ๐Ÿง ATM sign +1F6AE ; fully-qualified # ๐Ÿšฎ litter in bin sign +1F6B0 ; fully-qualified # ๐Ÿšฐ potable water +267F ; fully-qualified # โ™ฟ wheelchair symbol +1F6B9 ; fully-qualified # ๐Ÿšน menโ€™s room +1F6BA ; fully-qualified # ๐Ÿšบ womenโ€™s room +1F6BB ; fully-qualified # ๐Ÿšป restroom +1F6BC ; fully-qualified # ๐Ÿšผ baby symbol +1F6BE ; fully-qualified # ๐Ÿšพ water closet +1F6C2 ; fully-qualified # ๐Ÿ›‚ passport control +1F6C3 ; fully-qualified # ๐Ÿ›ƒ customs +1F6C4 ; fully-qualified # ๐Ÿ›„ baggage claim +1F6C5 ; fully-qualified # ๐Ÿ›… left luggage + +# subgroup: warning +26A0 FE0F ; fully-qualified # โš ๏ธ warning +26A0 ; non-fully-qualified # โš  warning +1F6B8 ; fully-qualified # ๐Ÿšธ children crossing +26D4 ; fully-qualified # โ›” no entry +1F6AB ; fully-qualified # ๐Ÿšซ prohibited +1F6B3 ; fully-qualified # ๐Ÿšณ no bicycles +1F6AD ; fully-qualified # ๐Ÿšญ no smoking +1F6AF ; fully-qualified # ๐Ÿšฏ no littering +1F6B1 ; fully-qualified # ๐Ÿšฑ non-potable water +1F6B7 ; fully-qualified # ๐Ÿšท no pedestrians +1F4F5 ; fully-qualified # ๐Ÿ“ต no mobile phones +1F51E ; fully-qualified # ๐Ÿ”ž no one under eighteen +2622 FE0F ; fully-qualified # โ˜ข๏ธ radioactive +2622 ; non-fully-qualified # โ˜ข radioactive +2623 FE0F ; fully-qualified # โ˜ฃ๏ธ biohazard +2623 ; non-fully-qualified # โ˜ฃ biohazard + +# subgroup: arrow +2B06 FE0F ; fully-qualified # โฌ†๏ธ up arrow +2B06 ; non-fully-qualified # โฌ† up arrow +2197 FE0F ; fully-qualified # โ†—๏ธ up-right arrow +2197 ; non-fully-qualified # โ†— up-right arrow +27A1 FE0F ; fully-qualified # โžก๏ธ right arrow +27A1 ; non-fully-qualified # โžก right arrow +2198 FE0F ; fully-qualified # โ†˜๏ธ down-right arrow +2198 ; non-fully-qualified # โ†˜ down-right arrow +2B07 FE0F ; fully-qualified # โฌ‡๏ธ down arrow +2B07 ; non-fully-qualified # โฌ‡ down arrow +2199 FE0F ; fully-qualified # โ†™๏ธ down-left arrow +2199 ; non-fully-qualified # โ†™ down-left arrow +2B05 FE0F ; fully-qualified # โฌ…๏ธ left arrow +2B05 ; non-fully-qualified # โฌ… left arrow +2196 FE0F ; fully-qualified # โ†–๏ธ up-left arrow +2196 ; non-fully-qualified # โ†– up-left arrow +2195 FE0F ; fully-qualified # โ†•๏ธ up-down arrow +2195 ; non-fully-qualified # โ†• up-down arrow +2194 FE0F ; fully-qualified # โ†”๏ธ left-right arrow +2194 ; non-fully-qualified # โ†” left-right arrow +21A9 FE0F ; fully-qualified # โ†ฉ๏ธ right arrow curving left +21A9 ; non-fully-qualified # โ†ฉ right arrow curving left +21AA FE0F ; fully-qualified # โ†ช๏ธ left arrow curving right +21AA ; non-fully-qualified # โ†ช left arrow curving right +2934 FE0F ; fully-qualified # โคด๏ธ right arrow curving up +2934 ; non-fully-qualified # โคด right arrow curving up +2935 FE0F ; fully-qualified # โคต๏ธ right arrow curving down +2935 ; non-fully-qualified # โคต right arrow curving down +1F503 ; fully-qualified # ๐Ÿ”ƒ clockwise vertical arrows +1F504 ; fully-qualified # ๐Ÿ”„ counterclockwise arrows button +1F519 ; fully-qualified # ๐Ÿ”™ BACK arrow +1F51A ; fully-qualified # ๐Ÿ”š END arrow +1F51B ; fully-qualified # ๐Ÿ”› ON! arrow +1F51C ; fully-qualified # ๐Ÿ”œ SOON arrow +1F51D ; fully-qualified # ๐Ÿ” TOP arrow + +# subgroup: religion +1F6D0 ; fully-qualified # ๐Ÿ› place of worship +269B FE0F ; fully-qualified # โš›๏ธ atom symbol +269B ; non-fully-qualified # โš› atom symbol +1F549 FE0F ; fully-qualified # ๐Ÿ•‰๏ธ om +1F549 ; non-fully-qualified # ๐Ÿ•‰ om +2721 FE0F ; fully-qualified # โœก๏ธ star of David +2721 ; non-fully-qualified # โœก star of David +2638 FE0F ; fully-qualified # โ˜ธ๏ธ wheel of dharma +2638 ; non-fully-qualified # โ˜ธ wheel of dharma +262F FE0F ; fully-qualified # โ˜ฏ๏ธ yin yang +262F ; non-fully-qualified # โ˜ฏ yin yang +271D FE0F ; fully-qualified # โœ๏ธ latin cross +271D ; non-fully-qualified # โœ latin cross +2626 FE0F ; fully-qualified # โ˜ฆ๏ธ orthodox cross +2626 ; non-fully-qualified # โ˜ฆ orthodox cross +262A FE0F ; fully-qualified # โ˜ช๏ธ star and crescent +262A ; non-fully-qualified # โ˜ช star and crescent +262E FE0F ; fully-qualified # โ˜ฎ๏ธ peace symbol +262E ; non-fully-qualified # โ˜ฎ peace symbol +1F54E ; fully-qualified # ๐Ÿ•Ž menorah +1F52F ; fully-qualified # ๐Ÿ”ฏ dotted six-pointed star + +# subgroup: zodiac +2648 ; fully-qualified # โ™ˆ Aries +2649 ; fully-qualified # โ™‰ Taurus +264A ; fully-qualified # โ™Š Gemini +264B ; fully-qualified # โ™‹ Cancer +264C ; fully-qualified # โ™Œ Leo +264D ; fully-qualified # โ™ Virgo +264E ; fully-qualified # โ™Ž Libra +264F ; fully-qualified # โ™ Scorpio +2650 ; fully-qualified # โ™ Sagittarius +2651 ; fully-qualified # โ™‘ Capricorn +2652 ; fully-qualified # โ™’ Aquarius +2653 ; fully-qualified # โ™“ Pisces +26CE ; fully-qualified # โ›Ž Ophiuchus + +# subgroup: av-symbol +1F500 ; fully-qualified # ๐Ÿ”€ shuffle tracks button +1F501 ; fully-qualified # ๐Ÿ” repeat button +1F502 ; fully-qualified # ๐Ÿ”‚ repeat single button +25B6 FE0F ; fully-qualified # โ–ถ๏ธ play button +25B6 ; non-fully-qualified # โ–ถ play button +23E9 ; fully-qualified # โฉ fast-forward button +23ED FE0F ; fully-qualified # โญ๏ธ next track button +23ED ; non-fully-qualified # โญ next track button +23EF FE0F ; fully-qualified # โฏ๏ธ play or pause button +23EF ; non-fully-qualified # โฏ play or pause button +25C0 FE0F ; fully-qualified # โ—€๏ธ reverse button +25C0 ; non-fully-qualified # โ—€ reverse button +23EA ; fully-qualified # โช fast reverse button +23EE FE0F ; fully-qualified # โฎ๏ธ last track button +23EE ; non-fully-qualified # โฎ last track button +1F53C ; fully-qualified # ๐Ÿ”ผ upwards button +23EB ; fully-qualified # โซ fast up button +1F53D ; fully-qualified # ๐Ÿ”ฝ downwards button +23EC ; fully-qualified # โฌ fast down button +23F8 FE0F ; fully-qualified # โธ๏ธ pause button +23F8 ; non-fully-qualified # โธ pause button +23F9 FE0F ; fully-qualified # โน๏ธ stop button +23F9 ; non-fully-qualified # โน stop button +23FA FE0F ; fully-qualified # โบ๏ธ record button +23FA ; non-fully-qualified # โบ record button +23CF FE0F ; fully-qualified # โ๏ธ eject button +23CF ; non-fully-qualified # โ eject button +1F3A6 ; fully-qualified # ๐ŸŽฆ cinema +1F505 ; fully-qualified # ๐Ÿ”… dim button +1F506 ; fully-qualified # ๐Ÿ”† bright button +1F4F6 ; fully-qualified # ๐Ÿ“ถ antenna bars +1F4F3 ; fully-qualified # ๐Ÿ“ณ vibration mode +1F4F4 ; fully-qualified # ๐Ÿ“ด mobile phone off + +# subgroup: other-symbol +2640 FE0F ; fully-qualified # โ™€๏ธ female sign +2640 ; non-fully-qualified # โ™€ female sign +2642 FE0F ; fully-qualified # โ™‚๏ธ male sign +2642 ; non-fully-qualified # โ™‚ male sign +2695 FE0F ; fully-qualified # โš•๏ธ medical symbol +2695 ; non-fully-qualified # โš• medical symbol +267E FE0F ; fully-qualified # โ™พ๏ธ infinity +267E ; non-fully-qualified # โ™พ infinity +267B FE0F ; fully-qualified # โ™ป๏ธ recycling symbol +267B ; non-fully-qualified # โ™ป recycling symbol +269C FE0F ; fully-qualified # โšœ๏ธ fleur-de-lis +269C ; non-fully-qualified # โšœ fleur-de-lis +1F531 ; fully-qualified # ๐Ÿ”ฑ trident emblem +1F4DB ; fully-qualified # ๐Ÿ“› name badge +1F530 ; fully-qualified # ๐Ÿ”ฐ Japanese symbol for beginner +2B55 ; fully-qualified # โญ• heavy large circle +2705 ; fully-qualified # โœ… white heavy check mark +2611 FE0F ; fully-qualified # โ˜‘๏ธ ballot box with check +2611 ; non-fully-qualified # โ˜‘ ballot box with check +2714 FE0F ; fully-qualified # โœ”๏ธ heavy check mark +2714 ; non-fully-qualified # โœ” heavy check mark +2716 FE0F ; fully-qualified # โœ–๏ธ heavy multiplication x +2716 ; non-fully-qualified # โœ– heavy multiplication x +274C ; fully-qualified # โŒ cross mark +274E ; fully-qualified # โŽ cross mark button +2795 ; fully-qualified # โž• heavy plus sign +2796 ; fully-qualified # โž– heavy minus sign +2797 ; fully-qualified # โž— heavy division sign +27B0 ; fully-qualified # โžฐ curly loop +27BF ; fully-qualified # โžฟ double curly loop +303D FE0F ; fully-qualified # ใ€ฝ๏ธ part alternation mark +303D ; non-fully-qualified # ใ€ฝ part alternation mark +2733 FE0F ; fully-qualified # โœณ๏ธ eight-spoked asterisk +2733 ; non-fully-qualified # โœณ eight-spoked asterisk +2734 FE0F ; fully-qualified # โœด๏ธ eight-pointed star +2734 ; non-fully-qualified # โœด eight-pointed star +2747 FE0F ; fully-qualified # โ‡๏ธ sparkle +2747 ; non-fully-qualified # โ‡ sparkle +203C FE0F ; fully-qualified # โ€ผ๏ธ double exclamation mark +203C ; non-fully-qualified # โ€ผ double exclamation mark +2049 FE0F ; fully-qualified # โ‰๏ธ exclamation question mark +2049 ; non-fully-qualified # โ‰ exclamation question mark +2753 ; fully-qualified # โ“ question mark +2754 ; fully-qualified # โ” white question mark +2755 ; fully-qualified # โ• white exclamation mark +2757 ; fully-qualified # โ— exclamation mark +3030 FE0F ; fully-qualified # ใ€ฐ๏ธ wavy dash +3030 ; non-fully-qualified # ใ€ฐ wavy dash +00A9 FE0F ; fully-qualified # ยฉ๏ธ copyright +00A9 ; non-fully-qualified # ยฉ copyright +00AE FE0F ; fully-qualified # ยฎ๏ธ registered +00AE ; non-fully-qualified # ยฎ registered +2122 FE0F ; fully-qualified # โ„ข๏ธ trade mark +2122 ; non-fully-qualified # โ„ข trade mark + +# subgroup: keycap +0023 FE0F 20E3 ; fully-qualified # #๏ธโƒฃ keycap: # +0023 20E3 ; non-fully-qualified # #โƒฃ keycap: # +002A FE0F 20E3 ; fully-qualified # *๏ธโƒฃ keycap: * +002A 20E3 ; non-fully-qualified # *โƒฃ keycap: * +0030 FE0F 20E3 ; fully-qualified # 0๏ธโƒฃ keycap: 0 +0030 20E3 ; non-fully-qualified # 0โƒฃ keycap: 0 +0031 FE0F 20E3 ; fully-qualified # 1๏ธโƒฃ keycap: 1 +0031 20E3 ; non-fully-qualified # 1โƒฃ keycap: 1 +0032 FE0F 20E3 ; fully-qualified # 2๏ธโƒฃ keycap: 2 +0032 20E3 ; non-fully-qualified # 2โƒฃ keycap: 2 +0033 FE0F 20E3 ; fully-qualified # 3๏ธโƒฃ keycap: 3 +0033 20E3 ; non-fully-qualified # 3โƒฃ keycap: 3 +0034 FE0F 20E3 ; fully-qualified # 4๏ธโƒฃ keycap: 4 +0034 20E3 ; non-fully-qualified # 4โƒฃ keycap: 4 +0035 FE0F 20E3 ; fully-qualified # 5๏ธโƒฃ keycap: 5 +0035 20E3 ; non-fully-qualified # 5โƒฃ keycap: 5 +0036 FE0F 20E3 ; fully-qualified # 6๏ธโƒฃ keycap: 6 +0036 20E3 ; non-fully-qualified # 6โƒฃ keycap: 6 +0037 FE0F 20E3 ; fully-qualified # 7๏ธโƒฃ keycap: 7 +0037 20E3 ; non-fully-qualified # 7โƒฃ keycap: 7 +0038 FE0F 20E3 ; fully-qualified # 8๏ธโƒฃ keycap: 8 +0038 20E3 ; non-fully-qualified # 8โƒฃ keycap: 8 +0039 FE0F 20E3 ; fully-qualified # 9๏ธโƒฃ keycap: 9 +0039 20E3 ; non-fully-qualified # 9โƒฃ keycap: 9 +1F51F ; fully-qualified # ๐Ÿ”Ÿ keycap: 10 + +# subgroup: alphanum +1F4AF ; fully-qualified # ๐Ÿ’ฏ hundred points +1F520 ; fully-qualified # ๐Ÿ”  input latin uppercase +1F521 ; fully-qualified # ๐Ÿ”ก input latin lowercase +1F522 ; fully-qualified # ๐Ÿ”ข input numbers +1F523 ; fully-qualified # ๐Ÿ”ฃ input symbols +1F524 ; fully-qualified # ๐Ÿ”ค input latin letters +1F170 FE0F ; fully-qualified # ๐Ÿ…ฐ๏ธ A button (blood type) +1F170 ; non-fully-qualified # ๐Ÿ…ฐ A button (blood type) +1F18E ; fully-qualified # ๐Ÿ†Ž AB button (blood type) +1F171 FE0F ; fully-qualified # ๐Ÿ…ฑ๏ธ B button (blood type) +1F171 ; non-fully-qualified # ๐Ÿ…ฑ B button (blood type) +1F191 ; fully-qualified # ๐Ÿ†‘ CL button +1F192 ; fully-qualified # ๐Ÿ†’ COOL button +1F193 ; fully-qualified # ๐Ÿ†“ FREE button +2139 FE0F ; fully-qualified # โ„น๏ธ information +2139 ; non-fully-qualified # โ„น information +1F194 ; fully-qualified # ๐Ÿ†” ID button +24C2 FE0F ; fully-qualified # โ“‚๏ธ circled M +24C2 ; non-fully-qualified # โ“‚ circled M +1F195 ; fully-qualified # ๐Ÿ†• NEW button +1F196 ; fully-qualified # ๐Ÿ†– NG button +1F17E FE0F ; fully-qualified # ๐Ÿ…พ๏ธ O button (blood type) +1F17E ; non-fully-qualified # ๐Ÿ…พ O button (blood type) +1F197 ; fully-qualified # ๐Ÿ†— OK button +1F17F FE0F ; fully-qualified # ๐Ÿ…ฟ๏ธ P button +1F17F ; non-fully-qualified # ๐Ÿ…ฟ P button +1F198 ; fully-qualified # ๐Ÿ†˜ SOS button +1F199 ; fully-qualified # ๐Ÿ†™ UP! button +1F19A ; fully-qualified # ๐Ÿ†š VS button +1F201 ; fully-qualified # ๐Ÿˆ Japanese โ€œhereโ€ button +1F202 FE0F ; fully-qualified # ๐Ÿˆ‚๏ธ Japanese โ€œservice chargeโ€ button +1F202 ; non-fully-qualified # ๐Ÿˆ‚ Japanese โ€œservice chargeโ€ button +1F237 FE0F ; fully-qualified # ๐Ÿˆท๏ธ Japanese โ€œmonthly amountโ€ button +1F237 ; non-fully-qualified # ๐Ÿˆท Japanese โ€œmonthly amountโ€ button +1F236 ; fully-qualified # ๐Ÿˆถ Japanese โ€œnot free of chargeโ€ button +1F22F ; fully-qualified # ๐Ÿˆฏ Japanese โ€œreservedโ€ button +1F250 ; fully-qualified # ๐Ÿ‰ Japanese โ€œbargainโ€ button +1F239 ; fully-qualified # ๐Ÿˆน Japanese โ€œdiscountโ€ button +1F21A ; fully-qualified # ๐Ÿˆš Japanese โ€œfree of chargeโ€ button +1F232 ; fully-qualified # ๐Ÿˆฒ Japanese โ€œprohibitedโ€ button +1F251 ; fully-qualified # ๐Ÿ‰‘ Japanese โ€œacceptableโ€ button +1F238 ; fully-qualified # ๐Ÿˆธ Japanese โ€œapplicationโ€ button +1F234 ; fully-qualified # ๐Ÿˆด Japanese โ€œpassing gradeโ€ button +1F233 ; fully-qualified # ๐Ÿˆณ Japanese โ€œvacancyโ€ button +3297 FE0F ; fully-qualified # ใŠ—๏ธ Japanese โ€œcongratulationsโ€ button +3297 ; non-fully-qualified # ใŠ— Japanese โ€œcongratulationsโ€ button +3299 FE0F ; fully-qualified # ใŠ™๏ธ Japanese โ€œsecretโ€ button +3299 ; non-fully-qualified # ใŠ™ Japanese โ€œsecretโ€ button +1F23A ; fully-qualified # ๐Ÿˆบ Japanese โ€œopen for businessโ€ button +1F235 ; fully-qualified # ๐Ÿˆต Japanese โ€œno vacancyโ€ button + +# subgroup: geometric +25AA FE0F ; fully-qualified # โ–ช๏ธ black small square +25AA ; non-fully-qualified # โ–ช black small square +25AB FE0F ; fully-qualified # โ–ซ๏ธ white small square +25AB ; non-fully-qualified # โ–ซ white small square +25FB FE0F ; fully-qualified # โ—ป๏ธ white medium square +25FB ; non-fully-qualified # โ—ป white medium square +25FC FE0F ; fully-qualified # โ—ผ๏ธ black medium square +25FC ; non-fully-qualified # โ—ผ black medium square +25FD ; fully-qualified # โ—ฝ white medium-small square +25FE ; fully-qualified # โ—พ black medium-small square +2B1B ; fully-qualified # โฌ› black large square +2B1C ; fully-qualified # โฌœ white large square +1F536 ; fully-qualified # ๐Ÿ”ถ large orange diamond +1F537 ; fully-qualified # ๐Ÿ”ท large blue diamond +1F538 ; fully-qualified # ๐Ÿ”ธ small orange diamond +1F539 ; fully-qualified # ๐Ÿ”น small blue diamond +1F53A ; fully-qualified # ๐Ÿ”บ red triangle pointed up +1F53B ; fully-qualified # ๐Ÿ”ป red triangle pointed down +1F4A0 ; fully-qualified # ๐Ÿ’  diamond with a dot +1F518 ; fully-qualified # ๐Ÿ”˜ radio button +1F532 ; fully-qualified # ๐Ÿ”ฒ black square button +1F533 ; fully-qualified # ๐Ÿ”ณ white square button +26AA ; fully-qualified # โšช white circle +26AB ; fully-qualified # โšซ black circle +1F534 ; fully-qualified # ๐Ÿ”ด red circle +1F535 ; fully-qualified # ๐Ÿ”ต blue circle + +# Symbols subtotal: 286 +# Symbols subtotal: 286 w/o modifiers + +# group: Flags + +# subgroup: flag +1F3C1 ; fully-qualified # ๐Ÿ chequered flag +1F6A9 ; fully-qualified # ๐Ÿšฉ triangular flag +1F38C ; fully-qualified # ๐ŸŽŒ crossed flags +1F3F4 ; fully-qualified # ๐Ÿด black flag +1F3F3 FE0F ; fully-qualified # ๐Ÿณ๏ธ white flag +1F3F3 ; non-fully-qualified # ๐Ÿณ white flag +1F3F3 FE0F 200D 1F308 ; fully-qualified # ๐Ÿณ๏ธโ€๐ŸŒˆ rainbow flag +1F3F3 200D 1F308 ; non-fully-qualified # ๐Ÿณโ€๐ŸŒˆ rainbow flag +1F3F4 200D 2620 FE0F ; fully-qualified # ๐Ÿดโ€โ˜ ๏ธ pirate flag +1F3F4 200D 2620 ; non-fully-qualified # ๐Ÿดโ€โ˜  pirate flag + +# subgroup: country-flag +1F1E6 1F1E8 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡จ Ascension Island +1F1E6 1F1E9 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฉ Andorra +1F1E6 1F1EA ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ช United Arab Emirates +1F1E6 1F1EB ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ซ Afghanistan +1F1E6 1F1EC ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฌ Antigua & Barbuda +1F1E6 1F1EE ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฎ Anguilla +1F1E6 1F1F1 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฑ Albania +1F1E6 1F1F2 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฒ Armenia +1F1E6 1F1F4 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ด Angola +1F1E6 1F1F6 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ถ Antarctica +1F1E6 1F1F7 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ท Argentina +1F1E6 1F1F8 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ธ American Samoa +1F1E6 1F1F9 ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡น Austria +1F1E6 1F1FA ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡บ Australia +1F1E6 1F1FC ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ผ Aruba +1F1E6 1F1FD ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฝ ร…land Islands +1F1E6 1F1FF ; fully-qualified # ๐Ÿ‡ฆ๐Ÿ‡ฟ Azerbaijan +1F1E7 1F1E6 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฆ Bosnia & Herzegovina +1F1E7 1F1E7 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ง Barbados +1F1E7 1F1E9 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฉ Bangladesh +1F1E7 1F1EA ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ช Belgium +1F1E7 1F1EB ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ซ Burkina Faso +1F1E7 1F1EC ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฌ Bulgaria +1F1E7 1F1ED ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ญ Bahrain +1F1E7 1F1EE ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฎ Burundi +1F1E7 1F1EF ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฏ Benin +1F1E7 1F1F1 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฑ St. Barthรฉlemy +1F1E7 1F1F2 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฒ Bermuda +1F1E7 1F1F3 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ณ Brunei +1F1E7 1F1F4 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ด Bolivia +1F1E7 1F1F6 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ถ Caribbean Netherlands +1F1E7 1F1F7 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ท Brazil +1F1E7 1F1F8 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ธ Bahamas +1F1E7 1F1F9 ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡น Bhutan +1F1E7 1F1FB ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ป Bouvet Island +1F1E7 1F1FC ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ผ Botswana +1F1E7 1F1FE ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡พ Belarus +1F1E7 1F1FF ; fully-qualified # ๐Ÿ‡ง๐Ÿ‡ฟ Belize +1F1E8 1F1E6 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฆ Canada +1F1E8 1F1E8 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡จ Cocos (Keeling) Islands +1F1E8 1F1E9 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฉ Congo - Kinshasa +1F1E8 1F1EB ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ซ Central African Republic +1F1E8 1F1EC ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฌ Congo - Brazzaville +1F1E8 1F1ED ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ญ Switzerland +1F1E8 1F1EE ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฎ Cรดte dโ€™Ivoire +1F1E8 1F1F0 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฐ Cook Islands +1F1E8 1F1F1 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฑ Chile +1F1E8 1F1F2 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฒ Cameroon +1F1E8 1F1F3 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ณ China +1F1E8 1F1F4 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ด Colombia +1F1E8 1F1F5 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ต Clipperton Island +1F1E8 1F1F7 ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ท Costa Rica +1F1E8 1F1FA ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡บ Cuba +1F1E8 1F1FB ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ป Cape Verde +1F1E8 1F1FC ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ผ Curaรงao +1F1E8 1F1FD ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฝ Christmas Island +1F1E8 1F1FE ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡พ Cyprus +1F1E8 1F1FF ; fully-qualified # ๐Ÿ‡จ๐Ÿ‡ฟ Czechia +1F1E9 1F1EA ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ช Germany +1F1E9 1F1EC ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฌ Diego Garcia +1F1E9 1F1EF ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฏ Djibouti +1F1E9 1F1F0 ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฐ Denmark +1F1E9 1F1F2 ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฒ Dominica +1F1E9 1F1F4 ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ด Dominican Republic +1F1E9 1F1FF ; fully-qualified # ๐Ÿ‡ฉ๐Ÿ‡ฟ Algeria +1F1EA 1F1E6 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ฆ Ceuta & Melilla +1F1EA 1F1E8 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡จ Ecuador +1F1EA 1F1EA ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ช Estonia +1F1EA 1F1EC ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ฌ Egypt +1F1EA 1F1ED ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ญ Western Sahara +1F1EA 1F1F7 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ท Eritrea +1F1EA 1F1F8 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡ธ Spain +1F1EA 1F1F9 ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡น Ethiopia +1F1EA 1F1FA ; fully-qualified # ๐Ÿ‡ช๐Ÿ‡บ European Union +1F1EB 1F1EE ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฎ Finland +1F1EB 1F1EF ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฏ Fiji +1F1EB 1F1F0 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฐ Falkland Islands +1F1EB 1F1F2 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ฒ Micronesia +1F1EB 1F1F4 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ด Faroe Islands +1F1EB 1F1F7 ; fully-qualified # ๐Ÿ‡ซ๐Ÿ‡ท France +1F1EC 1F1E6 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฆ Gabon +1F1EC 1F1E7 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ง United Kingdom +1F1EC 1F1E9 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฉ Grenada +1F1EC 1F1EA ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ช Georgia +1F1EC 1F1EB ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ซ French Guiana +1F1EC 1F1EC ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฌ Guernsey +1F1EC 1F1ED ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ญ Ghana +1F1EC 1F1EE ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฎ Gibraltar +1F1EC 1F1F1 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฑ Greenland +1F1EC 1F1F2 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ฒ Gambia +1F1EC 1F1F3 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ณ Guinea +1F1EC 1F1F5 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ต Guadeloupe +1F1EC 1F1F6 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ถ Equatorial Guinea +1F1EC 1F1F7 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ท Greece +1F1EC 1F1F8 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ธ South Georgia & South Sandwich Islands +1F1EC 1F1F9 ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡น Guatemala +1F1EC 1F1FA ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡บ Guam +1F1EC 1F1FC ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡ผ Guinea-Bissau +1F1EC 1F1FE ; fully-qualified # ๐Ÿ‡ฌ๐Ÿ‡พ Guyana +1F1ED 1F1F0 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ฐ Hong Kong SAR China +1F1ED 1F1F2 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ฒ Heard & McDonald Islands +1F1ED 1F1F3 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ณ Honduras +1F1ED 1F1F7 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡ท Croatia +1F1ED 1F1F9 ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡น Haiti +1F1ED 1F1FA ; fully-qualified # ๐Ÿ‡ญ๐Ÿ‡บ Hungary +1F1EE 1F1E8 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡จ Canary Islands +1F1EE 1F1E9 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ฉ Indonesia +1F1EE 1F1EA ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ช Ireland +1F1EE 1F1F1 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ฑ Israel +1F1EE 1F1F2 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ฒ Isle of Man +1F1EE 1F1F3 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ณ India +1F1EE 1F1F4 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ด British Indian Ocean Territory +1F1EE 1F1F6 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ถ Iraq +1F1EE 1F1F7 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ท Iran +1F1EE 1F1F8 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡ธ Iceland +1F1EE 1F1F9 ; fully-qualified # ๐Ÿ‡ฎ๐Ÿ‡น Italy +1F1EF 1F1EA ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ช Jersey +1F1EF 1F1F2 ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ฒ Jamaica +1F1EF 1F1F4 ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ด Jordan +1F1EF 1F1F5 ; fully-qualified # ๐Ÿ‡ฏ๐Ÿ‡ต Japan +1F1F0 1F1EA ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ช Kenya +1F1F0 1F1EC ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฌ Kyrgyzstan +1F1F0 1F1ED ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ญ Cambodia +1F1F0 1F1EE ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฎ Kiribati +1F1F0 1F1F2 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฒ Comoros +1F1F0 1F1F3 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ณ St. Kitts & Nevis +1F1F0 1F1F5 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ต North Korea +1F1F0 1F1F7 ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ท South Korea +1F1F0 1F1FC ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ผ Kuwait +1F1F0 1F1FE ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡พ Cayman Islands +1F1F0 1F1FF ; fully-qualified # ๐Ÿ‡ฐ๐Ÿ‡ฟ Kazakhstan +1F1F1 1F1E6 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ฆ Laos +1F1F1 1F1E7 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ง Lebanon +1F1F1 1F1E8 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡จ St. Lucia +1F1F1 1F1EE ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ฎ Liechtenstein +1F1F1 1F1F0 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ฐ Sri Lanka +1F1F1 1F1F7 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ท Liberia +1F1F1 1F1F8 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ธ Lesotho +1F1F1 1F1F9 ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡น Lithuania +1F1F1 1F1FA ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡บ Luxembourg +1F1F1 1F1FB ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡ป Latvia +1F1F1 1F1FE ; fully-qualified # ๐Ÿ‡ฑ๐Ÿ‡พ Libya +1F1F2 1F1E6 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฆ Morocco +1F1F2 1F1E8 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡จ Monaco +1F1F2 1F1E9 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฉ Moldova +1F1F2 1F1EA ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ช Montenegro +1F1F2 1F1EB ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ซ St. Martin +1F1F2 1F1EC ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฌ Madagascar +1F1F2 1F1ED ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ญ Marshall Islands +1F1F2 1F1F0 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฐ Macedonia +1F1F2 1F1F1 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฑ Mali +1F1F2 1F1F2 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฒ Myanmar (Burma) +1F1F2 1F1F3 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ณ Mongolia +1F1F2 1F1F4 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ด Macau SAR China +1F1F2 1F1F5 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ต Northern Mariana Islands +1F1F2 1F1F6 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ถ Martinique +1F1F2 1F1F7 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ท Mauritania +1F1F2 1F1F8 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ธ Montserrat +1F1F2 1F1F9 ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡น Malta +1F1F2 1F1FA ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡บ Mauritius +1F1F2 1F1FB ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ป Maldives +1F1F2 1F1FC ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ผ Malawi +1F1F2 1F1FD ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฝ Mexico +1F1F2 1F1FE ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡พ Malaysia +1F1F2 1F1FF ; fully-qualified # ๐Ÿ‡ฒ๐Ÿ‡ฟ Mozambique +1F1F3 1F1E6 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฆ Namibia +1F1F3 1F1E8 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡จ New Caledonia +1F1F3 1F1EA ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ช Niger +1F1F3 1F1EB ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ซ Norfolk Island +1F1F3 1F1EC ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฌ Nigeria +1F1F3 1F1EE ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฎ Nicaragua +1F1F3 1F1F1 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฑ Netherlands +1F1F3 1F1F4 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ด Norway +1F1F3 1F1F5 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ต Nepal +1F1F3 1F1F7 ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ท Nauru +1F1F3 1F1FA ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡บ Niue +1F1F3 1F1FF ; fully-qualified # ๐Ÿ‡ณ๐Ÿ‡ฟ New Zealand +1F1F4 1F1F2 ; fully-qualified # ๐Ÿ‡ด๐Ÿ‡ฒ Oman +1F1F5 1F1E6 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฆ Panama +1F1F5 1F1EA ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ช Peru +1F1F5 1F1EB ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ซ French Polynesia +1F1F5 1F1EC ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฌ Papua New Guinea +1F1F5 1F1ED ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ญ Philippines +1F1F5 1F1F0 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฐ Pakistan +1F1F5 1F1F1 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฑ Poland +1F1F5 1F1F2 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ฒ St. Pierre & Miquelon +1F1F5 1F1F3 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ณ Pitcairn Islands +1F1F5 1F1F7 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ท Puerto Rico +1F1F5 1F1F8 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ธ Palestinian Territories +1F1F5 1F1F9 ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡น Portugal +1F1F5 1F1FC ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡ผ Palau +1F1F5 1F1FE ; fully-qualified # ๐Ÿ‡ต๐Ÿ‡พ Paraguay +1F1F6 1F1E6 ; fully-qualified # ๐Ÿ‡ถ๐Ÿ‡ฆ Qatar +1F1F7 1F1EA ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ช Rรฉunion +1F1F7 1F1F4 ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ด Romania +1F1F7 1F1F8 ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ธ Serbia +1F1F7 1F1FA ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡บ Russia +1F1F7 1F1FC ; fully-qualified # ๐Ÿ‡ท๐Ÿ‡ผ Rwanda +1F1F8 1F1E6 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฆ Saudi Arabia +1F1F8 1F1E7 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ง Solomon Islands +1F1F8 1F1E8 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡จ Seychelles +1F1F8 1F1E9 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฉ Sudan +1F1F8 1F1EA ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ช Sweden +1F1F8 1F1EC ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฌ Singapore +1F1F8 1F1ED ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ญ St. Helena +1F1F8 1F1EE ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฎ Slovenia +1F1F8 1F1EF ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฏ Svalbard & Jan Mayen +1F1F8 1F1F0 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฐ Slovakia +1F1F8 1F1F1 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฑ Sierra Leone +1F1F8 1F1F2 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฒ San Marino +1F1F8 1F1F3 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ณ Senegal +1F1F8 1F1F4 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ด Somalia +1F1F8 1F1F7 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ท Suriname +1F1F8 1F1F8 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ธ South Sudan +1F1F8 1F1F9 ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡น Sรฃo Tomรฉ & Prรญncipe +1F1F8 1F1FB ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ป El Salvador +1F1F8 1F1FD ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฝ Sint Maarten +1F1F8 1F1FE ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡พ Syria +1F1F8 1F1FF ; fully-qualified # ๐Ÿ‡ธ๐Ÿ‡ฟ Swaziland +1F1F9 1F1E6 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฆ Tristan da Cunha +1F1F9 1F1E8 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡จ Turks & Caicos Islands +1F1F9 1F1E9 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฉ Chad +1F1F9 1F1EB ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ซ French Southern Territories +1F1F9 1F1EC ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฌ Togo +1F1F9 1F1ED ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ญ Thailand +1F1F9 1F1EF ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฏ Tajikistan +1F1F9 1F1F0 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฐ Tokelau +1F1F9 1F1F1 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฑ Timor-Leste +1F1F9 1F1F2 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฒ Turkmenistan +1F1F9 1F1F3 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ณ Tunisia +1F1F9 1F1F4 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ด Tonga +1F1F9 1F1F7 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ท Turkey +1F1F9 1F1F9 ; fully-qualified # ๐Ÿ‡น๐Ÿ‡น Trinidad & Tobago +1F1F9 1F1FB ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ป Tuvalu +1F1F9 1F1FC ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ผ Taiwan +1F1F9 1F1FF ; fully-qualified # ๐Ÿ‡น๐Ÿ‡ฟ Tanzania +1F1FA 1F1E6 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฆ Ukraine +1F1FA 1F1EC ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฌ Uganda +1F1FA 1F1F2 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฒ U.S. Outlying Islands +1F1FA 1F1F3 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ณ United Nations +1F1FA 1F1F8 ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ธ United States +1F1FA 1F1FE ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡พ Uruguay +1F1FA 1F1FF ; fully-qualified # ๐Ÿ‡บ๐Ÿ‡ฟ Uzbekistan +1F1FB 1F1E6 ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ฆ Vatican City +1F1FB 1F1E8 ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡จ St. Vincent & Grenadines +1F1FB 1F1EA ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ช Venezuela +1F1FB 1F1EC ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ฌ British Virgin Islands +1F1FB 1F1EE ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ฎ U.S. Virgin Islands +1F1FB 1F1F3 ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡ณ Vietnam +1F1FB 1F1FA ; fully-qualified # ๐Ÿ‡ป๐Ÿ‡บ Vanuatu +1F1FC 1F1EB ; fully-qualified # ๐Ÿ‡ผ๐Ÿ‡ซ Wallis & Futuna +1F1FC 1F1F8 ; fully-qualified # ๐Ÿ‡ผ๐Ÿ‡ธ Samoa +1F1FD 1F1F0 ; fully-qualified # ๐Ÿ‡ฝ๐Ÿ‡ฐ Kosovo +1F1FE 1F1EA ; fully-qualified # ๐Ÿ‡พ๐Ÿ‡ช Yemen +1F1FE 1F1F9 ; fully-qualified # ๐Ÿ‡พ๐Ÿ‡น Mayotte +1F1FF 1F1E6 ; fully-qualified # ๐Ÿ‡ฟ๐Ÿ‡ฆ South Africa +1F1FF 1F1F2 ; fully-qualified # ๐Ÿ‡ฟ๐Ÿ‡ฒ Zambia +1F1FF 1F1FC ; fully-qualified # ๐Ÿ‡ฟ๐Ÿ‡ผ Zimbabwe + +# subgroup: subdivision-flag +1F3F4 E0067 E0062 E0065 E006E E0067 E007F ; fully-qualified # ๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ England +1F3F4 E0067 E0062 E0073 E0063 E0074 E007F ; fully-qualified # ๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ Scotland +1F3F4 E0067 E0062 E0077 E006C E0073 E007F ; fully-qualified # ๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ Wales + +# Flags subtotal: 271 +# Flags subtotal: 271 w/o modifiers + +#EOF diff --git a/gradle.properties b/gradle.properties index 60a1d529..a70ffc30 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,27 +1,21 @@ # Project-wide Gradle settings. - # IDE (e.g. Android Studio) users: # Gradle settings configured through the IDE *will override* # any settings specified in this file. - # For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html - # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -android.enableJetifier=true +android.enableJetifier=false android.useAndroidX=true -org.gradle.jvmargs=-Xmx1536m - +org.gradle.jvmargs=-Xmx2048M -Dkotlin.daemon.jvm.options\="-Xmx2048M" # Kotlin code style for this project: "official" or "obsolete": kotlin.code.style=official - # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects org.gradle.parallel=true - # AGP & Gradle 8.0 backwards compatibility mode android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false -android.nonFinalResIds=false +android.nonTransitiveRClass=true +android.nonFinalResIds=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8acb3f15..519de789 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -33,35 +33,35 @@ junit = { module = "junit:junit", version = "4.13.2" } android-gradle-plugin = { module = "com.android.tools.build:gradle", version.ref = "gradle-plugin" } -androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } +androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core" } -androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version = "2.1.4" } +androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version = "2.1.4" } -androidx-emoji = { module = "androidx.emoji2.emoji2:emoji2", version.ref = "androidx-emoji" } -androidx-emoji-bundled = { module = "androidx.emoji2.emoji2:emoji2-bundled", version.ref = "androidx-emoji" } -androidx-emoji-views = { module = "androidx.emoji2.emoji2:emoji2-views", version.ref = "androidx-emoji" } -androidx-emoji-views-helper = { module = "androidx.emoji2.emoji2:emoji2-views-helper", version.ref = "androidx-emoji" } +androidx-emoji = { module = "androidx.emoji2.emoji2:emoji2", version.ref = "androidx-emoji" } +androidx-emoji-bundled = { module = "androidx.emoji2.emoji2:emoji2-bundled", version.ref = "androidx-emoji" } +androidx-emoji-views = { module = "androidx.emoji2.emoji2:emoji2-views", version.ref = "androidx-emoji" } +androidx-emoji-views-helper = { module = "androidx.emoji2.emoji2:emoji2-views-helper", version.ref = "androidx-emoji" } androidx-lifecycle-extensions = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "androidx-lifecycle-extensions" } -androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } -androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "androidx-lifecycle" } -androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } -androidx-lifecycle-livedata-core-ktx = { module = "androidx.lifecycle:lifecycle-livedata-core-ktx", version.ref = "androidx-lifecycle" } -androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle-compose" } +androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-livedata-core-ktx = { module = "androidx.lifecycle:lifecycle-livedata-core-ktx", version.ref = "androidx-lifecycle" } +androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidx-lifecycle-compose" } androidx-paging-common = { module = "androidx.paging:paging-common-ktx", version.ref = "androidx-paging" } androidx-paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "androidx-paging" } -androidx-paging-runtime-ktx = { module = "androidx.paging:paging-runtime-ktx", version.ref = "androidx-paging" } +androidx-paging-runtime-ktx = { module = "androidx.paging:paging-runtime-ktx", version.ref = "androidx-paging" } androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "androidx-recycler" } androidx-startup-runtime = { module = "androidx.startup:startup-runtime", version = "1.1.1" } -androidx-test-core-ktx = { module = "androidx.test:core-ktx", version = "1.5.0" } +androidx-test-core-ktx = { module = "androidx.test:core-ktx", version = "1.5.0" } androidx-test-runner = { module = "androidx.test:runner", version = "1.5.2" } androidx-test-rules = { module = "androidx.test:rules", version = "1.5.0" } -androidx-test-ext-junit-ktx = { module = "androidx.test.ext:junit-ktx", version.ref = "androidx-test-ext" } +androidx-test-ext-junit-ktx = { module = "androidx.test.ext:junit-ktx", version.ref = "androidx-test-ext" } cash-turbine = { module = "app.cash.turbine:turbine", version = "0.13.0" } @@ -85,4 +85,4 @@ mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockk" } gradle-versions = { module = "com.github.ben-manes:gradle-versions-plugin", version = "0.47.0" } -spotless-gradle = { module = "com.diffplug.spotless:spotless-plugin-gradle", version = "6.19.0" } \ No newline at end of file +spotless-gradle = { module = "com.diffplug.spotless:spotless-plugin-gradle", version = "6.19.0" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 3e8f13c6..7a18f6e9 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,5 @@ -rootProject.name= "android-emojify" +rootProject.name = "android-emojify" include(":emojify") if (!System.getenv().containsKey("CI")) - include(":app") \ No newline at end of file + include(":app")