diff --git a/CHANGELOG b/CHANGELOG index 57ee5361281d2c7e7e96a1db3fd64903dfe42986..b1a713108c08a45f9917ff560de5d201e373cc1d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,12 @@ Please view this file on the master branch, on stable branches it's out of date. +v 8.11.0 (unreleased) + - Fix of 'Commits being passed to custom hooks are already reachable when using the UI' + - Limit git rev-list output count to one in forced push check v 8.10.0 (unreleased) + - Fix profile activity heatmap to show correct day name (eanplatter) - Expose {should,force}_remove_source_branch (Ben Boeckel) + - Add the functionality to be able to rename a file. !5049 (tiagonbotelho) - Disable PostgreSQL statement timeout during migrations - Fix projects dropdown loading performance with a simplified api cal. !5113 (tiagonbotelho) - Fix commit builds API, return all builds for all pipelines for given commit. !4849 @@ -16,25 +21,34 @@ v 8.10.0 (unreleased) - Align flash messages with left side of page content !4959 (winniehell) - Display tooltip for "Copy to Clipboard" button !5164 (winniehell) - Use default cursor for table header of project files !5165 (winniehell) + - Store when and yaml variables in builds table - Display last commit of deleted branch in push events !4699 (winniehell) - Escape file extension when parsing search results !5141 (winniehell) - Apply the trusted_proxies config to the rack request object for use with rack_attack - Upgrade to Rails 4.2.7. !5236 + - Allow to pull code with deploy key from public projects - Add Sidekiq queue duration to transaction metrics. - Add a new column `artifacts_size` to table `ci_builds` !4964 - Let Workhorse serve format-patch diffs - Display tooltip for mentioned users and groups !5261 (winniehell) + - Allow build email service to be tested - Added day name to contribution calendar tooltips - Make images fit to the size of the viewport !4810 - Fix check for New Branch button on Issue page !4630 (winniehell) + - Fix GFM autocomplete not working on wiki pages - Fix MR-auto-close text added to description. !4836 - Support U2F devices in Firefox. !5177 - Fix issue, preventing users w/o push access to sort tags !5105 (redetection) - Add Spring EmojiOne updates. + - Added Rake task for tracking deployments !5320 + - Fix fetching LFS objects for private CI projects + - Add the new 2016 Emoji! Adds 72 new emoji including bacon, facepalm, and selfie. !5237 - Add syntax for multiline blockquote using `>>>` fence !3954 - Fix viewing notification settings when a project is pending deletion - Updated compare dropdown menus to use GL dropdown + - Redirects back to issue after clicking login link - Eager load award emoji on notes + - Allow to define manual actions/builds on Pipelines and Environments - Fix pagination when sorting by columns with lots of ties (like priority) - The Markdown reference parsers now re-use query results to prevent running the same queries multiple times !5020 - Updated project header design @@ -47,21 +61,28 @@ v 8.10.0 (unreleased) - Render inline diffs for multiple changed lines following eachother - Wildcards for protected branches. !4665 - Allow importing from Github using Personal Access Tokens. (Eric K Idema) + - API: Expose `due_date` for issues (Robert Schilling) - API: Todos !3188 (Robert Schilling) - API: Expose shared groups for projects and shared projects for groups !5050 (Robert Schilling) + - API: Expose `developers_can_push` and `developers_can_merge` for branches !5208 (Robert Schilling) - Add "Enabled Git access protocols" to Application Settings - Diffs will create button/diff form on demand no on server side - Reduce size of HTML used by diff comment forms + - Protected branches have a "Developers can Merge" setting. !4892 (original implementation by Mathias Vestergaard) - Fix user creation with stronger minimum password requirements !4054 (nathan-pmt) - Only show New Snippet button to users that can create snippets. - PipelinesFinder uses git cache data + - Track a user who created a pipeline - Actually render old and new sections of parallel diff next to each other - Throttle the update of `project.pushes_since_gc` to 1 minute. - Allow expanding and collapsing files in diff view (!4990) - Collapse large diffs by default (!4990) - Fix mentioned users list on diff notes + - Fix creation of deployment on build that is retried, redeployed or rollback + - Don't parse Rinku returned value to DocFragment when it didn't change the original html string. - Check for conflicts with existing Project's wiki path when creating a new project. - Show last push widget in upstream after push to fork + - Fix stage status shown for pipelines - Cache todos pending/done dashboard query counts. - Don't instantiate a git tree on Projects show default view - Bump Rinku to 2.0.0 @@ -84,7 +105,9 @@ v 8.10.0 (unreleased) - More descriptive message for git hooks and file locks - Aliases of award emoji should be stored as original name. !5060 (dixpac) - Handle custom Git hook result in GitLab UI + - Allow to access Container Registry for Public and Internal projects - Allow '?', or '&' for label names + - Support redirected blobs for Container Registry integration - Fix importer for GitHub Pull Requests when a branch was reused across Pull Requests - Add date when user joined the team on the member page - Fix 404 redirect after validation fails importing a GitLab project @@ -92,6 +115,7 @@ v 8.10.0 (unreleased) - Add min value for project limit field on user's form !3622 (jastkand) - Reset project pushes_since_gc when we enqueue the git gc call - Add reminder to not paste private SSH keys !4399 (Ingo Blechschmidt) + - Collapsed diffs lines/size don't acumulate to overflow diffs. - Remove duplicate `description` field in `MergeRequest` entities (Ben Boeckel) - Style of import project buttons were fixed in the new project page. !5183 (rdemirbay) - Fix GitHub client requests when rate limit is disabled @@ -103,7 +127,14 @@ v 8.10.0 (unreleased) - Fix last update timestamp on issues not preserved on gitlab.com and project imports - Fix issues importing projects from EE to CE - Fix creating group with space in group path + - Improve cron_jobs loading error messages !5318 - Create Todos for Issue author when assign or mention himself (Katarzyna Kobierska) + - Limit the number of retries on error to 3 for exporting projects + - Allow empty repositories on project import/export + - Render only commit message title in builds (Katarzyna Kobierska Ula Budziszewska) + - Allow bulk (un)subscription from issues in issue index + - Fix MR diff encoding issues exporting GitLab projects + - Export and import avatar as part of project import/export v 8.9.6 - Fix importing of events under notes for GitLab projects. !5154 @@ -112,6 +143,7 @@ v 8.9.6 - Fix broken migration in MySQL. !5005 - Overwrite Host and X-Forwarded-Host headers in NGINX !5213 - Keeps issue number when importing from Gitlab.com + - Add Pending tab for Builds (Katarzyna Kobierska, Urszula Budziszewska) v 8.9.7 (unreleased) - Fix import_data wrongly saved as a result of an invalid import_url diff --git a/Gemfile b/Gemfile index 81e8ff60ad5283a5b28c55b737dff792c89ec7e1..c5df68839d540de237546be8c55c801003c0a365 100644 --- a/Gemfile +++ b/Gemfile @@ -52,7 +52,7 @@ gem 'browser', '~> 2.2' # Extracting information from a git repository # Provide access to Gitlab::Git library -gem 'gitlab_git', '~> 10.2' +gem 'gitlab_git', '~> 10.3.2' # LDAP Auth # GitLab fork with several improvements to original library. For full list of changes @@ -223,7 +223,7 @@ gem 'jquery-turbolinks', '~> 2.1.0' gem 'addressable', '~> 2.3.8' gem 'bootstrap-sass', '~> 3.3.0' gem 'font-awesome-rails', '~> 4.6.1' -gem 'gemojione', '~> 2.6' +gem 'gemojione', '~> 3.0' gem 'gon', '~> 6.0.1' gem 'jquery-atwho-rails', '~> 1.3.2' gem 'jquery-rails', '~> 4.1.0' @@ -349,3 +349,6 @@ gem 'health_check', '~> 2.1.0' # System information gem 'vmstat', '~> 2.1.0' gem 'sys-filesystem', '~> 1.1.6' + +# Secure headers for Content Security Policy +gem 'secure_headers', '~> 3.3' diff --git a/Gemfile.lock b/Gemfile.lock index 0987fd5665a02dc5b91aefb2e16a99f200341dfd..363904a4baab968b7d98e174b4262eaee518d840 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -255,7 +255,7 @@ GEM ruby-progressbar (~> 1.4) gemnasium-gitlab-service (0.2.6) rugged (~> 0.21) - gemojione (2.6.1) + gemojione (3.0.1) json get_process_mem (0.2.0) gherkin-ruby (0.3.2) @@ -274,7 +274,7 @@ GEM diff-lcs (~> 1.1) mime-types (>= 1.16, < 3) posix-spawn (~> 0.3) - gitlab_git (10.2.3) + gitlab_git (10.3.2) activesupport (~> 4.0) charlock_holmes (~> 0.7.3) github-linguist (~> 4.7.0) @@ -578,7 +578,7 @@ GEM railties (>= 4.2.0, < 5.1) rinku (2.0.0) rotp (2.1.2) - rouge (2.0.3) + rouge (2.0.5) rqrcode (0.7.0) chunky_png rqrcode-rails3 (0.1.7) @@ -645,6 +645,8 @@ GEM sdoc (0.3.20) json (>= 1.1.3) rdoc (~> 3.10) + secure_headers (3.3.2) + useragent seed-fu (2.3.6) activerecord (>= 3.1) activesupport (>= 3.1) @@ -767,6 +769,7 @@ GEM get_process_mem (~> 0) unicorn (>= 4, < 6) uniform_notifier (1.9.0) + useragent (0.16.7) uuid (2.3.8) macaddr (~> 1.0) version_sorter (2.0.0) @@ -857,11 +860,11 @@ DEPENDENCIES foreman (~> 0.78.0) fuubar (~> 2.0.0) gemnasium-gitlab-service (~> 0.2) - gemojione (~> 2.6) + gemojione (~> 3.0) github-linguist (~> 4.7.0) github-markup (~> 1.4) gitlab-flowdock-git-hook (~> 1.0.1) - gitlab_git (~> 10.2) + gitlab_git (~> 10.3.2) gitlab_meta (= 7.0) gitlab_omniauth-ldap (~> 1.2.1) gollum-lib (~> 4.2) @@ -944,6 +947,7 @@ DEPENDENCIES sass-rails (~> 5.0.0) scss_lint (~> 0.47.0) sdoc (~> 0.3.20) + secure_headers (~> 3.3) seed-fu (~> 2.3.5) select2-rails (~> 3.5.9) sentry-raven (~> 1.1.0) diff --git a/MAINTENANCE.md b/MAINTENANCE.md index d3d36670693aa4c9b5b51a44e37542b077d2c9cd..1efb2a35f6d9f9a12c8741f2dcae0bafa5d04847 100644 --- a/MAINTENANCE.md +++ b/MAINTENANCE.md @@ -1,15 +1,35 @@ # GitLab Maintenance Policy -GitLab is a fast moving and evolving project. We currently don't have the resources to support many releases concurrently. We support exactly one stable release at any given time. +GitLab follows the [Semantic Versioning](http://semver.org/) for its releases: +`(Major).(Minor).(Patch)` in a [pragmatic way]. -GitLab follows the [Semantic Versioning](http://semver.org/) for its releases: `(Major).(Minor).(Patch)` in a [pragmatic way](https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e). +- **Major version**: Whenever there is something significant or any backwards + incompatible changes are introduced to the public API. +- **Minor version**: When new, backwards compatible functionality is introduced + to the public API or a minor feature is introduced, or when a set of smaller + features is rolled out. +- **Patch number**: When backwards compatible bug fixes are introduced that fix + incorrect behavior. -- **Major version**: Whenever there is something significant or any backwards incompatible changes are introduced to the public API. -- **Minor version**: When new, backwards compatible functionality is introduced to the public API or a minor feature is introduced, or when a set of smaller features is rolled out. -- **Patch number**: When backwards compatible bug fixes are introduced that fix incorrect behavior. +The current stable release will receive security patches and bug fixes +(eg. `8.9.0` -> `8.9.1`). Feature releases will mark the next supported stable +release where the minor version is increased numerically by increments of one +(eg. `8.9 -> 8.10`). -The current stable release will receive security patches and bug fixes (eg. `5.0` -> `5.0.1`). Feature releases will mark the next supported stable release where the minor version is increased numerically by increments of one (eg. `5.0 -> 5.1`). +Our current policy is to support one stable release at any given time, but for +medium-level security issues, we may consider [backporting to the previous two +monthly releases][rel-sec]. -We encourage everyone to run the latest stable release to ensure that you can easily upgrade to the most secure and feature rich GitLab experience. In order to make sure you can easily run the most recent stable release, we are working hard to keep the update process simple and reliable. +We encourage everyone to run the latest stable release to ensure that you can +easily upgrade to the most secure and feature-rich GitLab experience. In order +to make sure you can easily run the most recent stable release, we are working +hard to keep the update process simple and reliable. -More information about the release procedures can be found in the doc/release directory. +More information about the release procedures can be found in our +[release-tools documentation][rel]. You may also want to read our +[Responsible Disclosure Policy][disclosure]. + +[rel-sec]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/security.md#backporting +[rel]: https://gitlab.com/gitlab-org/release-tools/blob/master/doc/ +[disclosure]: https://about.gitlab.com/disclosure/ +[pragmatic way]: https://gist.github.com/jashkenas/cbd2b088e20279ae2c8e diff --git a/app/assets/images/emoji.png b/app/assets/images/emoji.png index 6bacb0e92b6a4ec9b6b019a0c6cca0acaa33775e..6f1a34a559127963b82b87cf7bc00fa634545a78 100644 Binary files a/app/assets/images/emoji.png and b/app/assets/images/emoji.png differ diff --git a/app/assets/images/emoji@2x.png b/app/assets/images/emoji@2x.png index 99588b566160a76f8a41eb160ed225b3bb609a00..dc9cae1d44cf0282dab99202430b4ae0c710d37a 100644 Binary files a/app/assets/images/emoji@2x.png and b/app/assets/images/emoji@2x.png differ diff --git a/app/assets/javascripts/gl_dropdown.js.coffee b/app/assets/javascripts/gl_dropdown.js.coffee index 1b0d0db89542b8361aaeb3a0905b223b35f7254f..951530e03a507e47f1d6467762fffea50126e2db 100644 --- a/app/assets/javascripts/gl_dropdown.js.coffee +++ b/app/assets/javascripts/gl_dropdown.js.coffee @@ -250,6 +250,8 @@ class GitLabDropdown if self.options.clicked self.options.clicked(selected, $el, e) + $el.trigger('blur') + # Finds an element inside wrapper element getElement: (selector) -> @dropdown.find selector diff --git a/app/assets/javascripts/issues-bulk-assignment.js.coffee b/app/assets/javascripts/issues-bulk-assignment.js.coffee index 6b0e69dbae7a5e52cbd9c8ce5f93b357b4e17845..3d09ea08e3b1833d8813fd12c18811db7636286d 100644 --- a/app/assets/javascripts/issues-bulk-assignment.js.coffee +++ b/app/assets/javascripts/issues-bulk-assignment.js.coffee @@ -85,12 +85,13 @@ class @IssuableBulkActions getFormDataAsObject: -> formData = update: - state_event : @form.find('input[name="update[state_event]"]').val() - assignee_id : @form.find('input[name="update[assignee_id]"]').val() - milestone_id : @form.find('input[name="update[milestone_id]"]').val() - issues_ids : @form.find('input[name="update[issues_ids]"]').val() - add_label_ids : [] - remove_label_ids : [] + state_event : @form.find('input[name="update[state_event]"]').val() + assignee_id : @form.find('input[name="update[assignee_id]"]').val() + milestone_id : @form.find('input[name="update[milestone_id]"]').val() + issues_ids : @form.find('input[name="update[issues_ids]"]').val() + subscription_event : @form.find('input[name="update[subscription_event]"]').val() + add_label_ids : [] + remove_label_ids : [] if @willUpdateLabels @getLabelsToApply().map (id) -> diff --git a/app/assets/javascripts/lib/utils/datetime_utility.js.coffee b/app/assets/javascripts/lib/utils/datetime_utility.js.coffee index 178963fe0aa2bfa5810677bb49d80da41973c9d6..2371e913844ca27bc7282d99431bcc0d24e5c273 100644 --- a/app/assets/javascripts/lib/utils/datetime_utility.js.coffee +++ b/app/assets/javascripts/lib/utils/datetime_utility.js.coffee @@ -2,7 +2,7 @@ w.gl ?= {} w.gl.utils ?= {} - w.gl.utils.days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] + w.gl.utils.days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'] w.gl.utils.formatDate = (datetime) -> dateFormat(datetime, 'mmm d, yyyy h:MMtt Z') diff --git a/app/assets/javascripts/protected_branches.js.coffee b/app/assets/javascripts/protected_branches.js.coffee index 79c2306e4d25de078caaa95f8d001708fac40d1a..14afef2e2ee39034d07d56139bb088a2f3114114 100644 --- a/app/assets/javascripts/protected_branches.js.coffee +++ b/app/assets/javascripts/protected_branches.js.coffee @@ -1,18 +1,18 @@ $ -> $(".protected-branches-list :checkbox").change (e) -> name = $(this).attr("name") - if name == "developers_can_push" + if name == "developers_can_push" || name == "developers_can_merge" id = $(this).val() - checked = $(this).is(":checked") + can_push = $(this).is(":checked") url = $(this).data("url") $.ajax - type: "PUT" + type: "PATCH" url: url dataType: "json" data: id: id protected_branch: - developers_can_push: checked + "#{name}": can_push success: -> row = $(e.target) diff --git a/app/assets/javascripts/subscription_select.js.coffee b/app/assets/javascripts/subscription_select.js.coffee new file mode 100644 index 0000000000000000000000000000000000000000..e5eb7a50d803351557579aade6834be2badde712 --- /dev/null +++ b/app/assets/javascripts/subscription_select.js.coffee @@ -0,0 +1,18 @@ +class @SubscriptionSelect + constructor: -> + $('.js-subscription-event').each (i, el) -> + fieldName = $(el).data("field-name") + + $(el).glDropdown( + selectable: true + fieldName: fieldName + toggleLabel: (selected, el, instance) => + label = 'Subscription' + $item = instance.dropdown.find('.is-active') + label = $item.text() if $item.length + label + clicked: (item, $el, e)-> + e.preventDefault() + id: (obj, el) -> + $(el).data("id") + ) diff --git a/app/assets/stylesheets/framework/buttons.scss b/app/assets/stylesheets/framework/buttons.scss index 590b8f54363bf06a0d738d1a38d47f80be57c95e..f87b8a2ad1cf33c5b90616dde8eb85a9497c3e89 100644 --- a/app/assets/stylesheets/framework/buttons.scss +++ b/app/assets/stylesheets/framework/buttons.scss @@ -49,6 +49,17 @@ border-color: $border-dark; color: $color; } + + svg { + + path { + fill: $color; + } + + use { + stroke: $color; + } + } } @mixin btn-green { @@ -173,6 +184,13 @@ .caret { margin-left: 5px; } + + svg { + height: 15px; + width: auto; + position: relative; + top: 2px; + } } .btn-lg { diff --git a/app/assets/stylesheets/framework/files.scss b/app/assets/stylesheets/framework/files.scss index 71e4b50f2af57daede41477b34bb8301731b7101..407f1873431f823ead2ab6e2fa339223106235f7 100644 --- a/app/assets/stylesheets/framework/files.scss +++ b/app/assets/stylesheets/framework/files.scss @@ -70,7 +70,7 @@ } &.wiki { - padding: $gl-padding; + padding: 30px $gl-padding; .highlight { margin-bottom: 9px; diff --git a/app/assets/stylesheets/framework/sidebar.scss b/app/assets/stylesheets/framework/sidebar.scss index d52e8f0017292d3efc74b986a6790f2757668fa0..3fa4a22258dfa3eb25dda78b70c46802a2cc1134 100644 --- a/app/assets/stylesheets/framework/sidebar.scss +++ b/app/assets/stylesheets/framework/sidebar.scss @@ -198,6 +198,10 @@ header.header-pinned-nav { .sidebar-collapsed-icon { cursor: pointer; + + .btn { + background-color: $gray-light; + } } } diff --git a/app/assets/stylesheets/framework/typography.scss b/app/assets/stylesheets/framework/typography.scss index 3575984b2290e118c133ea30bac20347ab220105..8659604cb8bf11c42f35102549fdb418308ce225 100644 --- a/app/assets/stylesheets/framework/typography.scss +++ b/app/assets/stylesheets/framework/typography.scss @@ -37,39 +37,41 @@ } h1 { - font-size: 1.3em; + font-size: 2em; font-weight: 600; - margin: 24px 0 12px; - padding: 0 0 10px; - border-bottom: 1px solid #e7e9ed; + margin: 1em 0 10px; + padding: 0 0 0.3em; + border-bottom: 1px solid $btn-default-border; color: $gl-gray-dark; } h2 { - font-size: 1.2em; + font-size: 1.6em; font-weight: 600; - margin: 24px 0 12px; + margin: 1em 0 10px; + padding-bottom: 0.3em; + border-bottom: 1px solid $btn-default-border; color: $gl-gray-dark; } h3 { - margin: 24px 0 12px; - font-size: 1.1em; + margin: 1em 0 10px; + font-size: 1.4em; } h4 { - margin: 24px 0 12px; - font-size: 0.98em; + margin: 1em 0 10px; + font-size: 1.25em; } h5 { - margin: 24px 0 12px; - font-size: 0.95em; + margin: 1em 0 10px; + font-size: 1em; } h6 { - margin: 24px 0 12px; - font-size: 0.90em; + margin: 1em 0 10px; + font-size: 0.95em; } blockquote { @@ -115,7 +117,7 @@ ul, ol { padding: 0; - margin: 6px 0 6px 28px !important; + margin: 3px 0 3px 28px !important; } li { diff --git a/app/assets/stylesheets/framework/variables.scss b/app/assets/stylesheets/framework/variables.scss index f0e7002e4cd6367ef27344df5fea1dc9872f2798..1882d4e888db70bd8e700269b9d84995b68df8e2 100644 --- a/app/assets/stylesheets/framework/variables.scss +++ b/app/assets/stylesheets/framework/variables.scss @@ -16,7 +16,7 @@ $border-color: #e5e5e5; $focus-border-color: #3aabf0; $table-border-color: #f0f0f0; $background-color: #fafafa; -$dark-background-color: #f7f7f7; +$dark-background-color: #f5f5f5; $table-text-gray: #8f8f8f; /* diff --git a/app/assets/stylesheets/pages/emojis.scss b/app/assets/stylesheets/pages/emojis.scss index b731abc7450aa4cec8efe9bb2eacbd805a9f10f1..f17797b23819706aa4b129e5e6afb253b9dbfe8f 100644 --- a/app/assets/stylesheets/pages/emojis.scss +++ b/app/assets/stylesheets/pages/emojis.scss @@ -1,4 +1,4 @@ -.emoji-0023-20E3 { background-position: 0 0; } +.emoji-0023-20E3 { background-position: 0 0px; } .emoji-002A-20E3 { background-position: -20px 0; } .emoji-0030-20E3 { background-position: 0 -20px; } .emoji-0031-20E3 { background-position: -20px -20px; } @@ -452,1271 +452,1344 @@ .emoji-1F391 { background-position: -420px -200px; } .emoji-1F392 { background-position: -420px -220px; } .emoji-1F393 { background-position: -420px -240px; } -.emoji-1F394 { background-position: -420px -260px; } -.emoji-1F395 { background-position: -420px -280px; } -.emoji-1F396 { background-position: -420px -300px; } -.emoji-1F397 { background-position: -420px -320px; } -.emoji-1F398 { background-position: -420px -340px; } -.emoji-1F399 { background-position: -420px -360px; } -.emoji-1F39A { background-position: -420px -380px; } -.emoji-1F39B { background-position: -420px -400px; } -.emoji-1F39C { background-position: 0 -420px; } -.emoji-1F39D { background-position: -20px -420px; } -.emoji-1F39E { background-position: -40px -420px; } -.emoji-1F39F { background-position: -60px -420px; } -.emoji-1F3A0 { background-position: -80px -420px; } -.emoji-1F3A1 { background-position: -100px -420px; } -.emoji-1F3A2 { background-position: -120px -420px; } -.emoji-1F3A3 { background-position: -140px -420px; } -.emoji-1F3A4 { background-position: -160px -420px; } -.emoji-1F3A5 { background-position: -180px -420px; } -.emoji-1F3A6 { background-position: -200px -420px; } -.emoji-1F3A7 { background-position: -220px -420px; } -.emoji-1F3A8 { background-position: -240px -420px; } -.emoji-1F3A9 { background-position: -260px -420px; } -.emoji-1F3AA { background-position: -280px -420px; } -.emoji-1F3AB { background-position: -300px -420px; } -.emoji-1F3AC { background-position: -320px -420px; } -.emoji-1F3AD { background-position: -340px -420px; } -.emoji-1F3AE { background-position: -360px -420px; } -.emoji-1F3AF { background-position: -380px -420px; } -.emoji-1F3B0 { background-position: -400px -420px; } -.emoji-1F3B1 { background-position: -420px -420px; } -.emoji-1F3B2 { background-position: -440px 0; } -.emoji-1F3B3 { background-position: -440px -20px; } -.emoji-1F3B4 { background-position: -440px -40px; } -.emoji-1F3B5 { background-position: -440px -60px; } -.emoji-1F3B6 { background-position: -440px -80px; } -.emoji-1F3B7 { background-position: -440px -100px; } -.emoji-1F3B8 { background-position: -440px -120px; } -.emoji-1F3B9 { background-position: -440px -140px; } -.emoji-1F3BA { background-position: -440px -160px; } -.emoji-1F3BB { background-position: -440px -180px; } -.emoji-1F3BC { background-position: -440px -200px; } -.emoji-1F3BD { background-position: -440px -220px; } -.emoji-1F3BE { background-position: -440px -240px; } -.emoji-1F3BF { background-position: -440px -260px; } -.emoji-1F3C0 { background-position: -440px -280px; } -.emoji-1F3C1 { background-position: -440px -300px; } -.emoji-1F3C2 { background-position: -440px -320px; } -.emoji-1F3C3 { background-position: -440px -340px; } -.emoji-1F3C3-1F3FB { background-position: -440px -360px; } -.emoji-1F3C3-1F3FC { background-position: -440px -380px; } -.emoji-1F3C3-1F3FD { background-position: -440px -400px; } -.emoji-1F3C3-1F3FE { background-position: -440px -420px; } -.emoji-1F3C3-1F3FF { background-position: 0 -440px; } -.emoji-1F3C4 { background-position: -20px -440px; } -.emoji-1F3C4-1F3FB { background-position: -40px -440px; } -.emoji-1F3C4-1F3FC { background-position: -60px -440px; } -.emoji-1F3C4-1F3FD { background-position: -80px -440px; } -.emoji-1F3C4-1F3FE { background-position: -100px -440px; } -.emoji-1F3C4-1F3FF { background-position: -120px -440px; } -.emoji-1F3C5 { background-position: -140px -440px; } -.emoji-1F3C6 { background-position: -160px -440px; } -.emoji-1F3C7 { background-position: -180px -440px; } -.emoji-1F3C7-1F3FB { background-position: -200px -440px; } -.emoji-1F3C7-1F3FC { background-position: -220px -440px; } -.emoji-1F3C7-1F3FD { background-position: -240px -440px; } -.emoji-1F3C7-1F3FE { background-position: -260px -440px; } -.emoji-1F3C7-1F3FF { background-position: -280px -440px; } -.emoji-1F3C8 { background-position: -300px -440px; } -.emoji-1F3C9 { background-position: -320px -440px; } -.emoji-1F3CA { background-position: -340px -440px; } -.emoji-1F3CA-1F3FB { background-position: -360px -440px; } -.emoji-1F3CA-1F3FC { background-position: -380px -440px; } -.emoji-1F3CA-1F3FD { background-position: -400px -440px; } -.emoji-1F3CA-1F3FE { background-position: -420px -440px; } -.emoji-1F3CA-1F3FF { background-position: -440px -440px; } -.emoji-1F3CB { background-position: -460px 0; } -.emoji-1F3CB-1F3FB { background-position: -460px -20px; } -.emoji-1F3CB-1F3FC { background-position: -460px -40px; } -.emoji-1F3CB-1F3FD { background-position: -460px -60px; } -.emoji-1F3CB-1F3FE { background-position: -460px -80px; } -.emoji-1F3CB-1F3FF { background-position: -460px -100px; } -.emoji-1F3CC { background-position: -460px -120px; } -.emoji-1F3CD { background-position: -460px -140px; } -.emoji-1F3CE { background-position: -460px -160px; } -.emoji-1F3CF { background-position: -460px -180px; } -.emoji-1F3D0 { background-position: -460px -200px; } -.emoji-1F3D1 { background-position: -460px -220px; } -.emoji-1F3D2 { background-position: -460px -240px; } -.emoji-1F3D3 { background-position: -460px -260px; } -.emoji-1F3D4 { background-position: -460px -280px; } -.emoji-1F3D5 { background-position: -460px -300px; } -.emoji-1F3D6 { background-position: -460px -320px; } -.emoji-1F3D7 { background-position: -460px -340px; } -.emoji-1F3D8 { background-position: -460px -360px; } -.emoji-1F3D9 { background-position: -460px -380px; } -.emoji-1F3DA { background-position: -460px -400px; } -.emoji-1F3DB { background-position: -460px -420px; } -.emoji-1F3DC { background-position: -460px -440px; } -.emoji-1F3DD { background-position: 0 -460px; } -.emoji-1F3DE { background-position: -20px -460px; } -.emoji-1F3DF { background-position: -40px -460px; } -.emoji-1F3E0 { background-position: -60px -460px; } -.emoji-1F3E1 { background-position: -80px -460px; } -.emoji-1F3E2 { background-position: -100px -460px; } -.emoji-1F3E3 { background-position: -120px -460px; } -.emoji-1F3E4 { background-position: -140px -460px; } -.emoji-1F3E5 { background-position: -160px -460px; } -.emoji-1F3E6 { background-position: -180px -460px; } -.emoji-1F3E7 { background-position: -200px -460px; } -.emoji-1F3E8 { background-position: -220px -460px; } -.emoji-1F3E9 { background-position: -240px -460px; } -.emoji-1F3EA { background-position: -260px -460px; } -.emoji-1F3EB { background-position: -280px -460px; } -.emoji-1F3EC { background-position: -300px -460px; } -.emoji-1F3ED { background-position: -320px -460px; } -.emoji-1F3EE { background-position: -340px -460px; } -.emoji-1F3EF { background-position: -360px -460px; } -.emoji-1F3F0 { background-position: -380px -460px; } -.emoji-1F3F1 { background-position: -400px -460px; } -.emoji-1F3F2 { background-position: -420px -460px; } -.emoji-1F3F3 { background-position: -440px -460px; } -.emoji-1F3F4 { background-position: -460px -460px; } -.emoji-1F3F5 { background-position: -480px 0; } -.emoji-1F3F6 { background-position: -480px -20px; } -.emoji-1F3F7 { background-position: -480px -40px; } -.emoji-1F3F8 { background-position: -480px -60px; } -.emoji-1F3F9 { background-position: -480px -80px; } -.emoji-1F3FA { background-position: -480px -100px; } -.emoji-1F3FB { background-position: -480px -120px; } -.emoji-1F3FC { background-position: -480px -140px; } -.emoji-1F3FD { background-position: -480px -160px; } -.emoji-1F3FE { background-position: -480px -180px; } -.emoji-1F3FF { background-position: -480px -200px; } -.emoji-1F400 { background-position: -480px -220px; } -.emoji-1F401 { background-position: -480px -240px; } -.emoji-1F402 { background-position: -480px -260px; } -.emoji-1F403 { background-position: -480px -280px; } -.emoji-1F404 { background-position: -480px -300px; } -.emoji-1F405 { background-position: -480px -320px; } -.emoji-1F406 { background-position: -480px -340px; } -.emoji-1F407 { background-position: -480px -360px; } -.emoji-1F408 { background-position: -480px -380px; } -.emoji-1F409 { background-position: -480px -400px; } -.emoji-1F40A { background-position: -480px -420px; } -.emoji-1F40B { background-position: -480px -440px; } -.emoji-1F40C { background-position: -480px -460px; } -.emoji-1F40D { background-position: 0 -480px; } -.emoji-1F40E { background-position: -20px -480px; } -.emoji-1F40F { background-position: -40px -480px; } -.emoji-1F410 { background-position: -60px -480px; } -.emoji-1F411 { background-position: -80px -480px; } -.emoji-1F412 { background-position: -100px -480px; } -.emoji-1F413 { background-position: -120px -480px; } -.emoji-1F414 { background-position: -140px -480px; } -.emoji-1F415 { background-position: -160px -480px; } -.emoji-1F416 { background-position: -180px -480px; } -.emoji-1F417 { background-position: -200px -480px; } -.emoji-1F418 { background-position: -220px -480px; } -.emoji-1F419 { background-position: -240px -480px; } -.emoji-1F41A { background-position: -260px -480px; } -.emoji-1F41B { background-position: -280px -480px; } -.emoji-1F41C { background-position: -300px -480px; } -.emoji-1F41D { background-position: -320px -480px; } -.emoji-1F41E { background-position: -340px -480px; } -.emoji-1F41F { background-position: -360px -480px; } -.emoji-1F420 { background-position: -380px -480px; } -.emoji-1F421 { background-position: -400px -480px; } -.emoji-1F422 { background-position: -420px -480px; } -.emoji-1F423 { background-position: -440px -480px; } -.emoji-1F424 { background-position: -460px -480px; } -.emoji-1F425 { background-position: -480px -480px; } -.emoji-1F426 { background-position: -500px 0; } -.emoji-1F427 { background-position: -500px -20px; } -.emoji-1F428 { background-position: -500px -40px; } -.emoji-1F429 { background-position: -500px -60px; } -.emoji-1F42A { background-position: -500px -80px; } -.emoji-1F42B { background-position: -500px -100px; } -.emoji-1F42C { background-position: -500px -120px; } -.emoji-1F42D { background-position: -500px -140px; } -.emoji-1F42E { background-position: -500px -160px; } -.emoji-1F42F { background-position: -500px -180px; } -.emoji-1F430 { background-position: -500px -200px; } -.emoji-1F431 { background-position: -500px -220px; } -.emoji-1F432 { background-position: -500px -240px; } -.emoji-1F433 { background-position: -500px -260px; } -.emoji-1F434 { background-position: -500px -280px; } -.emoji-1F435 { background-position: -500px -300px; } -.emoji-1F436 { background-position: -500px -320px; } -.emoji-1F437 { background-position: -500px -340px; } -.emoji-1F438 { background-position: -500px -360px; } -.emoji-1F439 { background-position: -500px -380px; } -.emoji-1F43A { background-position: -500px -400px; } -.emoji-1F43B { background-position: -500px -420px; } -.emoji-1F43C { background-position: -500px -440px; } -.emoji-1F43D { background-position: -500px -460px; } -.emoji-1F43E { background-position: -500px -480px; } -.emoji-1F43F { background-position: 0 -500px; } -.emoji-1F440 { background-position: -20px -500px; } -.emoji-1F441 { background-position: -40px -500px; } -.emoji-1F441-1F5E8 { background-position: -60px -500px; } -.emoji-1F442 { background-position: -80px -500px; } -.emoji-1F442-1F3FB { background-position: -100px -500px; } -.emoji-1F442-1F3FC { background-position: -120px -500px; } -.emoji-1F442-1F3FD { background-position: -140px -500px; } -.emoji-1F442-1F3FE { background-position: -160px -500px; } -.emoji-1F442-1F3FF { background-position: -180px -500px; } -.emoji-1F443 { background-position: -200px -500px; } -.emoji-1F443-1F3FB { background-position: -220px -500px; } -.emoji-1F443-1F3FC { background-position: -240px -500px; } -.emoji-1F443-1F3FD { background-position: -260px -500px; } -.emoji-1F443-1F3FE { background-position: -280px -500px; } -.emoji-1F443-1F3FF { background-position: -300px -500px; } -.emoji-1F444 { background-position: -320px -500px; } -.emoji-1F445 { background-position: -340px -500px; } -.emoji-1F446 { background-position: -360px -500px; } -.emoji-1F446-1F3FB { background-position: -380px -500px; } -.emoji-1F446-1F3FC { background-position: -400px -500px; } -.emoji-1F446-1F3FD { background-position: -420px -500px; } -.emoji-1F446-1F3FE { background-position: -440px -500px; } -.emoji-1F446-1F3FF { background-position: -460px -500px; } -.emoji-1F447 { background-position: -480px -500px; } -.emoji-1F447-1F3FB { background-position: -500px -500px; } -.emoji-1F447-1F3FC { background-position: -520px 0; } -.emoji-1F447-1F3FD { background-position: -520px -20px; } -.emoji-1F447-1F3FE { background-position: -520px -40px; } -.emoji-1F447-1F3FF { background-position: -520px -60px; } -.emoji-1F448 { background-position: -520px -80px; } -.emoji-1F448-1F3FB { background-position: -520px -100px; } -.emoji-1F448-1F3FC { background-position: -520px -120px; } -.emoji-1F448-1F3FD { background-position: -520px -140px; } -.emoji-1F448-1F3FE { background-position: -520px -160px; } -.emoji-1F448-1F3FF { background-position: -520px -180px; } -.emoji-1F449 { background-position: -520px -200px; } -.emoji-1F449-1F3FB { background-position: -520px -220px; } -.emoji-1F449-1F3FC { background-position: -520px -240px; } -.emoji-1F449-1F3FD { background-position: -520px -260px; } -.emoji-1F449-1F3FE { background-position: -520px -280px; } -.emoji-1F449-1F3FF { background-position: -520px -300px; } -.emoji-1F44A { background-position: -520px -320px; } -.emoji-1F44A-1F3FB { background-position: -520px -340px; } -.emoji-1F44A-1F3FC { background-position: -520px -360px; } -.emoji-1F44A-1F3FD { background-position: -520px -380px; } -.emoji-1F44A-1F3FE { background-position: -520px -400px; } -.emoji-1F44A-1F3FF { background-position: -520px -420px; } -.emoji-1F44B { background-position: -520px -440px; } -.emoji-1F44B-1F3FB { background-position: -520px -460px; } -.emoji-1F44B-1F3FC { background-position: -520px -480px; } -.emoji-1F44B-1F3FD { background-position: -520px -500px; } -.emoji-1F44B-1F3FE { background-position: 0 -520px; } -.emoji-1F44B-1F3FF { background-position: -20px -520px; } -.emoji-1F44C { background-position: -40px -520px; } -.emoji-1F44C-1F3FB { background-position: -60px -520px; } -.emoji-1F44C-1F3FC { background-position: -80px -520px; } -.emoji-1F44C-1F3FD { background-position: -100px -520px; } -.emoji-1F44C-1F3FE { background-position: -120px -520px; } -.emoji-1F44C-1F3FF { background-position: -140px -520px; } -.emoji-1F44D { background-position: -160px -520px; } -.emoji-1F44D-1F3FB { background-position: -180px -520px; } -.emoji-1F44D-1F3FC { background-position: -200px -520px; } -.emoji-1F44D-1F3FD { background-position: -220px -520px; } -.emoji-1F44D-1F3FE { background-position: -240px -520px; } -.emoji-1F44D-1F3FF { background-position: -260px -520px; } -.emoji-1F44E { background-position: -280px -520px; } -.emoji-1F44E-1F3FB { background-position: -300px -520px; } -.emoji-1F44E-1F3FC { background-position: -320px -520px; } -.emoji-1F44E-1F3FD { background-position: -340px -520px; } -.emoji-1F44E-1F3FE { background-position: -360px -520px; } -.emoji-1F44E-1F3FF { background-position: -380px -520px; } -.emoji-1F44F { background-position: -400px -520px; } -.emoji-1F44F-1F3FB { background-position: -420px -520px; } -.emoji-1F44F-1F3FC { background-position: -440px -520px; } -.emoji-1F44F-1F3FD { background-position: -460px -520px; } -.emoji-1F44F-1F3FE { background-position: -480px -520px; } -.emoji-1F44F-1F3FF { background-position: -500px -520px; } -.emoji-1F450 { background-position: -520px -520px; } -.emoji-1F450-1F3FB { background-position: -540px 0; } -.emoji-1F450-1F3FC { background-position: -540px -20px; } -.emoji-1F450-1F3FD { background-position: -540px -40px; } -.emoji-1F450-1F3FE { background-position: -540px -60px; } -.emoji-1F450-1F3FF { background-position: -540px -80px; } -.emoji-1F451 { background-position: -540px -100px; } -.emoji-1F452 { background-position: -540px -120px; } -.emoji-1F453 { background-position: -540px -140px; } -.emoji-1F454 { background-position: -540px -160px; } -.emoji-1F455 { background-position: -540px -180px; } -.emoji-1F456 { background-position: -540px -200px; } -.emoji-1F457 { background-position: -540px -220px; } -.emoji-1F458 { background-position: -540px -240px; } -.emoji-1F459 { background-position: -540px -260px; } -.emoji-1F45A { background-position: -540px -280px; } -.emoji-1F45B { background-position: -540px -300px; } -.emoji-1F45C { background-position: -540px -320px; } -.emoji-1F45D { background-position: -540px -340px; } -.emoji-1F45E { background-position: -540px -360px; } -.emoji-1F45F { background-position: -540px -380px; } -.emoji-1F460 { background-position: -540px -400px; } -.emoji-1F461 { background-position: -540px -420px; } -.emoji-1F462 { background-position: -540px -440px; } -.emoji-1F463 { background-position: -540px -460px; } -.emoji-1F464 { background-position: -540px -480px; } -.emoji-1F465 { background-position: -540px -500px; } -.emoji-1F466 { background-position: -540px -520px; } -.emoji-1F466-1F3FB { background-position: 0 -540px; } -.emoji-1F466-1F3FC { background-position: -20px -540px; } -.emoji-1F466-1F3FD { background-position: -40px -540px; } -.emoji-1F466-1F3FE { background-position: -60px -540px; } -.emoji-1F466-1F3FF { background-position: -80px -540px; } -.emoji-1F467 { background-position: -100px -540px; } -.emoji-1F467-1F3FB { background-position: -120px -540px; } -.emoji-1F467-1F3FC { background-position: -140px -540px; } -.emoji-1F467-1F3FD { background-position: -160px -540px; } -.emoji-1F467-1F3FE { background-position: -180px -540px; } -.emoji-1F467-1F3FF { background-position: -200px -540px; } -.emoji-1F468 { background-position: -220px -540px; } -.emoji-1F468-1F3FB { background-position: -240px -540px; } -.emoji-1F468-1F3FC { background-position: -260px -540px; } -.emoji-1F468-1F3FD { background-position: -280px -540px; } -.emoji-1F468-1F3FE { background-position: -300px -540px; } -.emoji-1F468-1F3FF { background-position: -320px -540px; } -.emoji-1F468-1F468-1F466 { background-position: -340px -540px; } -.emoji-1F468-1F468-1F466-1F466 { background-position: -360px -540px; } -.emoji-1F468-1F468-1F467 { background-position: -380px -540px; } -.emoji-1F468-1F468-1F467-1F466 { background-position: -400px -540px; } -.emoji-1F468-1F468-1F467-1F467 { background-position: -420px -540px; } -.emoji-1F468-1F469-1F466-1F466 { background-position: -440px -540px; } -.emoji-1F468-1F469-1F467 { background-position: -460px -540px; } -.emoji-1F468-1F469-1F467-1F466 { background-position: -480px -540px; } -.emoji-1F468-1F469-1F467-1F467 { background-position: -500px -540px; } -.emoji-1F468-2764-1F468 { background-position: -520px -540px; } -.emoji-1F468-2764-1F48B-1F468 { background-position: -540px -540px; } -.emoji-1F469 { background-position: -560px 0; } -.emoji-1F469-1F3FB { background-position: -560px -20px; } -.emoji-1F469-1F3FC { background-position: -560px -40px; } -.emoji-1F469-1F3FD { background-position: -560px -60px; } -.emoji-1F469-1F3FE { background-position: -560px -80px; } -.emoji-1F469-1F3FF { background-position: -560px -100px; } -.emoji-1F469-1F469-1F466 { background-position: -560px -120px; } -.emoji-1F469-1F469-1F466-1F466 { background-position: -560px -140px; } -.emoji-1F469-1F469-1F467 { background-position: -560px -160px; } -.emoji-1F469-1F469-1F467-1F466 { background-position: -560px -180px; } -.emoji-1F469-1F469-1F467-1F467 { background-position: -560px -200px; } -.emoji-1F469-2764-1F469 { background-position: -560px -220px; } -.emoji-1F469-2764-1F48B-1F469 { background-position: -560px -240px; } -.emoji-1F46A { background-position: -560px -260px; } -.emoji-1F46B { background-position: -560px -280px; } -.emoji-1F46C { background-position: -560px -300px; } -.emoji-1F46D { background-position: -560px -320px; } -.emoji-1F46E { background-position: -560px -340px; } -.emoji-1F46E-1F3FB { background-position: -560px -360px; } -.emoji-1F46E-1F3FC { background-position: -560px -380px; } -.emoji-1F46E-1F3FD { background-position: -560px -400px; } -.emoji-1F46E-1F3FE { background-position: -560px -420px; } -.emoji-1F46E-1F3FF { background-position: -560px -440px; } -.emoji-1F46F { background-position: -560px -460px; } -.emoji-1F470 { background-position: -560px -480px; } -.emoji-1F470-1F3FB { background-position: -560px -500px; } -.emoji-1F470-1F3FC { background-position: -560px -520px; } -.emoji-1F470-1F3FD { background-position: -560px -540px; } -.emoji-1F470-1F3FE { background-position: 0 -560px; } -.emoji-1F470-1F3FF { background-position: -20px -560px; } -.emoji-1F471 { background-position: -40px -560px; } -.emoji-1F471-1F3FB { background-position: -60px -560px; } -.emoji-1F471-1F3FC { background-position: -80px -560px; } -.emoji-1F471-1F3FD { background-position: -100px -560px; } -.emoji-1F471-1F3FE { background-position: -120px -560px; } -.emoji-1F471-1F3FF { background-position: -140px -560px; } -.emoji-1F472 { background-position: -160px -560px; } -.emoji-1F472-1F3FB { background-position: -180px -560px; } -.emoji-1F472-1F3FC { background-position: -200px -560px; } -.emoji-1F472-1F3FD { background-position: -220px -560px; } -.emoji-1F472-1F3FE { background-position: -240px -560px; } -.emoji-1F472-1F3FF { background-position: -260px -560px; } -.emoji-1F473 { background-position: -280px -560px; } -.emoji-1F473-1F3FB { background-position: -300px -560px; } -.emoji-1F473-1F3FC { background-position: -320px -560px; } -.emoji-1F473-1F3FD { background-position: -340px -560px; } -.emoji-1F473-1F3FE { background-position: -360px -560px; } -.emoji-1F473-1F3FF { background-position: -380px -560px; } -.emoji-1F474 { background-position: -400px -560px; } -.emoji-1F474-1F3FB { background-position: -420px -560px; } -.emoji-1F474-1F3FC { background-position: -440px -560px; } -.emoji-1F474-1F3FD { background-position: -460px -560px; } -.emoji-1F474-1F3FE { background-position: -480px -560px; } -.emoji-1F474-1F3FF { background-position: -500px -560px; } -.emoji-1F475 { background-position: -520px -560px; } -.emoji-1F475-1F3FB { background-position: -540px -560px; } -.emoji-1F475-1F3FC { background-position: -560px -560px; } -.emoji-1F475-1F3FD { background-position: -580px 0; } -.emoji-1F475-1F3FE { background-position: -580px -20px; } -.emoji-1F475-1F3FF { background-position: -580px -40px; } -.emoji-1F476 { background-position: -580px -60px; } -.emoji-1F476-1F3FB { background-position: -580px -80px; } -.emoji-1F476-1F3FC { background-position: -580px -100px; } -.emoji-1F476-1F3FD { background-position: -580px -120px; } -.emoji-1F476-1F3FE { background-position: -580px -140px; } -.emoji-1F476-1F3FF { background-position: -580px -160px; } -.emoji-1F477 { background-position: -580px -180px; } -.emoji-1F477-1F3FB { background-position: -580px -200px; } -.emoji-1F477-1F3FC { background-position: -580px -220px; } -.emoji-1F477-1F3FD { background-position: -580px -240px; } -.emoji-1F477-1F3FE { background-position: -580px -260px; } -.emoji-1F477-1F3FF { background-position: -580px -280px; } -.emoji-1F478 { background-position: -580px -300px; } -.emoji-1F478-1F3FB { background-position: -580px -320px; } -.emoji-1F478-1F3FC { background-position: -580px -340px; } -.emoji-1F478-1F3FD { background-position: -580px -360px; } -.emoji-1F478-1F3FE { background-position: -580px -380px; } -.emoji-1F478-1F3FF { background-position: -580px -400px; } -.emoji-1F479 { background-position: -580px -420px; } -.emoji-1F47A { background-position: -580px -440px; } -.emoji-1F47B { background-position: -580px -460px; } -.emoji-1F47C { background-position: -580px -480px; } -.emoji-1F47C-1F3FB { background-position: -580px -500px; } -.emoji-1F47C-1F3FC { background-position: -580px -520px; } -.emoji-1F47C-1F3FD { background-position: -580px -540px; } -.emoji-1F47C-1F3FE { background-position: -580px -560px; } -.emoji-1F47C-1F3FF { background-position: 0 -580px; } -.emoji-1F47D { background-position: -20px -580px; } -.emoji-1F47E { background-position: -40px -580px; } -.emoji-1F47F { background-position: -60px -580px; } -.emoji-1F480 { background-position: -80px -580px; } -.emoji-1F481 { background-position: -100px -580px; } -.emoji-1F481-1F3FB { background-position: -120px -580px; } -.emoji-1F481-1F3FC { background-position: -140px -580px; } -.emoji-1F481-1F3FD { background-position: -160px -580px; } -.emoji-1F481-1F3FE { background-position: -180px -580px; } -.emoji-1F481-1F3FF { background-position: -200px -580px; } -.emoji-1F482 { background-position: -220px -580px; } -.emoji-1F482-1F3FB { background-position: -240px -580px; } -.emoji-1F482-1F3FC { background-position: -260px -580px; } -.emoji-1F482-1F3FD { background-position: -280px -580px; } -.emoji-1F482-1F3FE { background-position: -300px -580px; } -.emoji-1F482-1F3FF { background-position: -320px -580px; } -.emoji-1F483 { background-position: -340px -580px; } -.emoji-1F483-1F3FB { background-position: -360px -580px; } -.emoji-1F483-1F3FC { background-position: -380px -580px; } -.emoji-1F483-1F3FD { background-position: -400px -580px; } -.emoji-1F483-1F3FE { background-position: -420px -580px; } -.emoji-1F483-1F3FF { background-position: -440px -580px; } -.emoji-1F484 { background-position: -460px -580px; } -.emoji-1F485 { background-position: -480px -580px; } -.emoji-1F485-1F3FB { background-position: -500px -580px; } -.emoji-1F485-1F3FC { background-position: -520px -580px; } -.emoji-1F485-1F3FD { background-position: -540px -580px; } -.emoji-1F485-1F3FE { background-position: -560px -580px; } -.emoji-1F485-1F3FF { background-position: -580px -580px; } -.emoji-1F486 { background-position: -600px 0; } -.emoji-1F486-1F3FB { background-position: -600px -20px; } -.emoji-1F486-1F3FC { background-position: -600px -40px; } -.emoji-1F486-1F3FD { background-position: -600px -60px; } -.emoji-1F486-1F3FE { background-position: -600px -80px; } -.emoji-1F486-1F3FF { background-position: -600px -100px; } -.emoji-1F487 { background-position: -600px -120px; } -.emoji-1F487-1F3FB { background-position: -600px -140px; } -.emoji-1F487-1F3FC { background-position: -600px -160px; } -.emoji-1F487-1F3FD { background-position: -600px -180px; } -.emoji-1F487-1F3FE { background-position: -600px -200px; } -.emoji-1F487-1F3FF { background-position: -600px -220px; } -.emoji-1F488 { background-position: -600px -240px; } -.emoji-1F489 { background-position: -600px -260px; } -.emoji-1F48A { background-position: -600px -280px; } -.emoji-1F48B { background-position: -600px -300px; } -.emoji-1F48C { background-position: -600px -320px; } -.emoji-1F48D { background-position: -600px -340px; } -.emoji-1F48E { background-position: -600px -360px; } -.emoji-1F48F { background-position: -600px -380px; } -.emoji-1F490 { background-position: -600px -400px; } -.emoji-1F491 { background-position: -600px -420px; } -.emoji-1F492 { background-position: -600px -440px; } -.emoji-1F493 { background-position: -600px -460px; } -.emoji-1F494 { background-position: -600px -480px; } -.emoji-1F495 { background-position: -600px -500px; } -.emoji-1F496 { background-position: -600px -520px; } -.emoji-1F497 { background-position: -600px -540px; } -.emoji-1F498 { background-position: -600px -560px; } -.emoji-1F499 { background-position: -600px -580px; } -.emoji-1F49A { background-position: 0 -600px; } -.emoji-1F49B { background-position: -20px -600px; } -.emoji-1F49C { background-position: -40px -600px; } -.emoji-1F49D { background-position: -60px -600px; } -.emoji-1F49E { background-position: -80px -600px; } -.emoji-1F49F { background-position: -100px -600px; } -.emoji-1F4A0 { background-position: -120px -600px; } -.emoji-1F4A1 { background-position: -140px -600px; } -.emoji-1F4A2 { background-position: -160px -600px; } -.emoji-1F4A3 { background-position: -180px -600px; } -.emoji-1F4A4 { background-position: -200px -600px; } -.emoji-1F4A5 { background-position: -220px -600px; } -.emoji-1F4A6 { background-position: -240px -600px; } -.emoji-1F4A7 { background-position: -260px -600px; } -.emoji-1F4A8 { background-position: -280px -600px; } -.emoji-1F4A9 { background-position: -300px -600px; } -.emoji-1F4AA { background-position: -320px -600px; } -.emoji-1F4AA-1F3FB { background-position: -340px -600px; } -.emoji-1F4AA-1F3FC { background-position: -360px -600px; } -.emoji-1F4AA-1F3FD { background-position: -380px -600px; } -.emoji-1F4AA-1F3FE { background-position: -400px -600px; } -.emoji-1F4AA-1F3FF { background-position: -420px -600px; } -.emoji-1F4AB { background-position: -440px -600px; } -.emoji-1F4AC { background-position: -460px -600px; } -.emoji-1F4AD { background-position: -480px -600px; } -.emoji-1F4AE { background-position: -500px -600px; } -.emoji-1F4AF { background-position: -520px -600px; } -.emoji-1F4B0 { background-position: -540px -600px; } -.emoji-1F4B1 { background-position: -560px -600px; } -.emoji-1F4B2 { background-position: -580px -600px; } -.emoji-1F4B3 { background-position: -600px -600px; } -.emoji-1F4B4 { background-position: -620px 0; } -.emoji-1F4B5 { background-position: -620px -20px; } -.emoji-1F4B6 { background-position: -620px -40px; } -.emoji-1F4B7 { background-position: -620px -60px; } -.emoji-1F4B8 { background-position: -620px -80px; } -.emoji-1F4B9 { background-position: -620px -100px; } -.emoji-1F4BA { background-position: -620px -120px; } -.emoji-1F4BB { background-position: -620px -140px; } -.emoji-1F4BC { background-position: -620px -160px; } -.emoji-1F4BD { background-position: -620px -180px; } -.emoji-1F4BE { background-position: -620px -200px; } -.emoji-1F4BF { background-position: -620px -220px; } -.emoji-1F4C0 { background-position: -620px -240px; } -.emoji-1F4C1 { background-position: -620px -260px; } -.emoji-1F4C2 { background-position: -620px -280px; } -.emoji-1F4C3 { background-position: -620px -300px; } -.emoji-1F4C4 { background-position: -620px -320px; } -.emoji-1F4C5 { background-position: -620px -340px; } -.emoji-1F4C6 { background-position: -620px -360px; } -.emoji-1F4C7 { background-position: -620px -380px; } -.emoji-1F4C8 { background-position: -620px -400px; } -.emoji-1F4C9 { background-position: -620px -420px; } -.emoji-1F4CA { background-position: -620px -440px; } -.emoji-1F4CB { background-position: -620px -460px; } -.emoji-1F4CC { background-position: -620px -480px; } -.emoji-1F4CD { background-position: -620px -500px; } -.emoji-1F4CE { background-position: -620px -520px; } -.emoji-1F4CF { background-position: -620px -540px; } -.emoji-1F4D0 { background-position: -620px -560px; } -.emoji-1F4D1 { background-position: -620px -580px; } -.emoji-1F4D2 { background-position: -620px -600px; } -.emoji-1F4D3 { background-position: 0 -620px; } -.emoji-1F4D4 { background-position: -20px -620px; } -.emoji-1F4D5 { background-position: -40px -620px; } -.emoji-1F4D6 { background-position: -60px -620px; } -.emoji-1F4D7 { background-position: -80px -620px; } -.emoji-1F4D8 { background-position: -100px -620px; } -.emoji-1F4D9 { background-position: -120px -620px; } -.emoji-1F4DA { background-position: -140px -620px; } -.emoji-1F4DB { background-position: -160px -620px; } -.emoji-1F4DC { background-position: -180px -620px; } -.emoji-1F4DD { background-position: -200px -620px; } -.emoji-1F4DE { background-position: -220px -620px; } -.emoji-1F4DF { background-position: -240px -620px; } -.emoji-1F4E0 { background-position: -260px -620px; } -.emoji-1F4E1 { background-position: -280px -620px; } -.emoji-1F4E2 { background-position: -300px -620px; } -.emoji-1F4E3 { background-position: -320px -620px; } -.emoji-1F4E4 { background-position: -340px -620px; } -.emoji-1F4E5 { background-position: -360px -620px; } -.emoji-1F4E6 { background-position: -380px -620px; } -.emoji-1F4E7 { background-position: -400px -620px; } -.emoji-1F4E8 { background-position: -420px -620px; } -.emoji-1F4E9 { background-position: -440px -620px; } -.emoji-1F4EA { background-position: -460px -620px; } -.emoji-1F4EB { background-position: -480px -620px; } -.emoji-1F4EC { background-position: -500px -620px; } -.emoji-1F4ED { background-position: -520px -620px; } -.emoji-1F4EE { background-position: -540px -620px; } -.emoji-1F4EF { background-position: -560px -620px; } -.emoji-1F4F0 { background-position: -580px -620px; } -.emoji-1F4F1 { background-position: -600px -620px; } -.emoji-1F4F2 { background-position: -620px -620px; } -.emoji-1F4F3 { background-position: -640px 0; } -.emoji-1F4F4 { background-position: -640px -20px; } -.emoji-1F4F5 { background-position: -640px -40px; } -.emoji-1F4F6 { background-position: -640px -60px; } -.emoji-1F4F7 { background-position: -640px -80px; } -.emoji-1F4F8 { background-position: -640px -100px; } -.emoji-1F4F9 { background-position: -640px -120px; } -.emoji-1F4FA { background-position: -640px -140px; } -.emoji-1F4FB { background-position: -640px -160px; } -.emoji-1F4FC { background-position: -640px -180px; } -.emoji-1F4FD { background-position: -640px -200px; } -.emoji-1F4FE { background-position: -640px -220px; } -.emoji-1F4FF { background-position: -640px -240px; } -.emoji-1F500 { background-position: -640px -260px; } -.emoji-1F501 { background-position: -640px -280px; } -.emoji-1F502 { background-position: -640px -300px; } -.emoji-1F503 { background-position: -640px -320px; } -.emoji-1F504 { background-position: -640px -340px; } -.emoji-1F505 { background-position: -640px -360px; } -.emoji-1F506 { background-position: -640px -380px; } -.emoji-1F507 { background-position: -640px -400px; } -.emoji-1F508 { background-position: -640px -420px; } -.emoji-1F509 { background-position: -640px -440px; } -.emoji-1F50A { background-position: -640px -460px; } -.emoji-1F50B { background-position: -640px -480px; } -.emoji-1F50C { background-position: -640px -500px; } -.emoji-1F50D { background-position: -640px -520px; } -.emoji-1F50E { background-position: -640px -540px; } -.emoji-1F50F { background-position: -640px -560px; } -.emoji-1F510 { background-position: -640px -580px; } -.emoji-1F511 { background-position: -640px -600px; } -.emoji-1F512 { background-position: -640px -620px; } -.emoji-1F513 { background-position: 0 -640px; } -.emoji-1F514 { background-position: -20px -640px; } -.emoji-1F515 { background-position: -40px -640px; } -.emoji-1F516 { background-position: -60px -640px; } -.emoji-1F517 { background-position: -80px -640px; } -.emoji-1F518 { background-position: -100px -640px; } -.emoji-1F519 { background-position: -120px -640px; } -.emoji-1F51A { background-position: -140px -640px; } -.emoji-1F51B { background-position: -160px -640px; } -.emoji-1F51C { background-position: -180px -640px; } -.emoji-1F51D { background-position: -200px -640px; } -.emoji-1F51E { background-position: -220px -640px; } -.emoji-1F51F { background-position: -240px -640px; } -.emoji-1F520 { background-position: -260px -640px; } -.emoji-1F521 { background-position: -280px -640px; } -.emoji-1F522 { background-position: -300px -640px; } -.emoji-1F523 { background-position: -320px -640px; } -.emoji-1F524 { background-position: -340px -640px; } -.emoji-1F525 { background-position: -360px -640px; } -.emoji-1F526 { background-position: -380px -640px; } -.emoji-1F527 { background-position: -400px -640px; } -.emoji-1F528 { background-position: -420px -640px; } -.emoji-1F529 { background-position: -440px -640px; } -.emoji-1F52A { background-position: -460px -640px; } -.emoji-1F52B { background-position: -480px -640px; } -.emoji-1F52C { background-position: -500px -640px; } -.emoji-1F52D { background-position: -520px -640px; } -.emoji-1F52E { background-position: -540px -640px; } -.emoji-1F52F { background-position: -560px -640px; } -.emoji-1F530 { background-position: -580px -640px; } -.emoji-1F531 { background-position: -600px -640px; } -.emoji-1F532 { background-position: -620px -640px; } -.emoji-1F533 { background-position: -640px -640px; } -.emoji-1F534 { background-position: -660px 0; } -.emoji-1F535 { background-position: -660px -20px; } -.emoji-1F536 { background-position: -660px -40px; } -.emoji-1F537 { background-position: -660px -60px; } -.emoji-1F538 { background-position: -660px -80px; } -.emoji-1F539 { background-position: -660px -100px; } -.emoji-1F53A { background-position: -660px -120px; } -.emoji-1F53B { background-position: -660px -140px; } -.emoji-1F53C { background-position: -660px -160px; } -.emoji-1F53D { background-position: -660px -180px; } -.emoji-1F546 { background-position: -660px -200px; } -.emoji-1F547 { background-position: -660px -220px; } -.emoji-1F548 { background-position: -660px -240px; } -.emoji-1F549 { background-position: -660px -260px; } -.emoji-1F54A { background-position: -660px -280px; } -.emoji-1F54B { background-position: -660px -300px; } -.emoji-1F54C { background-position: -660px -320px; } -.emoji-1F54D { background-position: -660px -340px; } -.emoji-1F54E { background-position: -660px -360px; } -.emoji-1F550 { background-position: -660px -380px; } -.emoji-1F551 { background-position: -660px -400px; } -.emoji-1F552 { background-position: -660px -420px; } -.emoji-1F553 { background-position: -660px -440px; } -.emoji-1F554 { background-position: -660px -460px; } -.emoji-1F555 { background-position: -660px -480px; } -.emoji-1F556 { background-position: -660px -500px; } -.emoji-1F557 { background-position: -660px -520px; } -.emoji-1F558 { background-position: -660px -540px; } -.emoji-1F559 { background-position: -660px -560px; } -.emoji-1F55A { background-position: -660px -580px; } -.emoji-1F55B { background-position: -660px -600px; } -.emoji-1F55C { background-position: -660px -620px; } -.emoji-1F55D { background-position: -660px -640px; } -.emoji-1F55E { background-position: 0 -660px; } -.emoji-1F55F { background-position: -20px -660px; } -.emoji-1F560 { background-position: -40px -660px; } -.emoji-1F561 { background-position: -60px -660px; } -.emoji-1F562 { background-position: -80px -660px; } -.emoji-1F563 { background-position: -100px -660px; } -.emoji-1F564 { background-position: -120px -660px; } -.emoji-1F565 { background-position: -140px -660px; } -.emoji-1F566 { background-position: -160px -660px; } -.emoji-1F567 { background-position: -180px -660px; } -.emoji-1F568 { background-position: -200px -660px; } -.emoji-1F569 { background-position: -220px -660px; } -.emoji-1F56A { background-position: -240px -660px; } -.emoji-1F56B { background-position: -260px -660px; } -.emoji-1F56C { background-position: -280px -660px; } -.emoji-1F56D { background-position: -300px -660px; } -.emoji-1F56E { background-position: -320px -660px; } -.emoji-1F56F { background-position: -340px -660px; } -.emoji-1F570 { background-position: -360px -660px; } -.emoji-1F571 { background-position: -380px -660px; } -.emoji-1F572 { background-position: -400px -660px; } -.emoji-1F573 { background-position: -420px -660px; } -.emoji-1F574 { background-position: -440px -660px; } -.emoji-1F575 { background-position: -460px -660px; } -.emoji-1F575-1F3FB { background-position: -480px -660px; } -.emoji-1F575-1F3FC { background-position: -500px -660px; } -.emoji-1F575-1F3FD { background-position: -520px -660px; } -.emoji-1F575-1F3FE { background-position: -540px -660px; } -.emoji-1F575-1F3FF { background-position: -560px -660px; } -.emoji-1F576 { background-position: -580px -660px; } -.emoji-1F577 { background-position: -600px -660px; } -.emoji-1F578 { background-position: -620px -660px; } -.emoji-1F579 { background-position: -640px -660px; } -.emoji-1F57B { background-position: -660px -660px; } -.emoji-1F57E { background-position: -680px 0; } -.emoji-1F57F { background-position: -680px -20px; } -.emoji-1F581 { background-position: -680px -40px; } -.emoji-1F582 { background-position: -680px -60px; } -.emoji-1F583 { background-position: -680px -80px; } -.emoji-1F585 { background-position: -680px -100px; } -.emoji-1F586 { background-position: -680px -120px; } -.emoji-1F587 { background-position: -680px -140px; } -.emoji-1F588 { background-position: -680px -160px; } -.emoji-1F589 { background-position: -680px -180px; } -.emoji-1F58A { background-position: -680px -200px; } -.emoji-1F58B { background-position: -680px -220px; } -.emoji-1F58C { background-position: -680px -240px; } -.emoji-1F58D { background-position: -680px -260px; } -.emoji-1F58E { background-position: -680px -280px; } -.emoji-1F58F { background-position: -680px -300px; } -.emoji-1F590 { background-position: -680px -320px; } -.emoji-1F590-1F3FB { background-position: -680px -340px; } -.emoji-1F590-1F3FC { background-position: -680px -360px; } -.emoji-1F590-1F3FD { background-position: -680px -380px; } -.emoji-1F590-1F3FE { background-position: -680px -400px; } -.emoji-1F590-1F3FF { background-position: -680px -420px; } -.emoji-1F591 { background-position: -680px -440px; } -.emoji-1F592 { background-position: -680px -460px; } -.emoji-1F593 { background-position: -680px -480px; } -.emoji-1F594 { background-position: -680px -500px; } -.emoji-1F595 { background-position: -680px -520px; } -.emoji-1F595-1F3FB { background-position: -680px -540px; } -.emoji-1F595-1F3FC { background-position: -680px -560px; } -.emoji-1F595-1F3FD { background-position: -680px -580px; } -.emoji-1F595-1F3FE { background-position: -680px -600px; } -.emoji-1F595-1F3FF { background-position: -680px -620px; } -.emoji-1F596 { background-position: -680px -640px; } -.emoji-1F596-1F3FB { background-position: -680px -660px; } -.emoji-1F596-1F3FC { background-position: 0 -680px; } -.emoji-1F596-1F3FD { background-position: -20px -680px; } -.emoji-1F596-1F3FE { background-position: -40px -680px; } -.emoji-1F596-1F3FF { background-position: -60px -680px; } -.emoji-1F597 { background-position: -80px -680px; } -.emoji-1F598 { background-position: -100px -680px; } -.emoji-1F599 { background-position: -120px -680px; } -.emoji-1F59E { background-position: -140px -680px; } -.emoji-1F59F { background-position: -160px -680px; } -.emoji-1F5A5 { background-position: -180px -680px; } -.emoji-1F5A6 { background-position: -200px -680px; } -.emoji-1F5A7 { background-position: -220px -680px; } -.emoji-1F5A8 { background-position: -240px -680px; } -.emoji-1F5A9 { background-position: -260px -680px; } -.emoji-1F5AA { background-position: -280px -680px; } -.emoji-1F5AB { background-position: -300px -680px; } -.emoji-1F5AD { background-position: -320px -680px; } -.emoji-1F5AE { background-position: -340px -680px; } -.emoji-1F5AF { background-position: -360px -680px; } -.emoji-1F5B1 { background-position: -380px -680px; } -.emoji-1F5B2 { background-position: -400px -680px; } -.emoji-1F5B3 { background-position: -420px -680px; } -.emoji-1F5B4 { background-position: -440px -680px; } -.emoji-1F5B8 { background-position: -460px -680px; } -.emoji-1F5B9 { background-position: -480px -680px; } -.emoji-1F5BC { background-position: -500px -680px; } -.emoji-1F5BD { background-position: -520px -680px; } -.emoji-1F5BE { background-position: -540px -680px; } -.emoji-1F5C0 { background-position: -560px -680px; } -.emoji-1F5C1 { background-position: -580px -680px; } -.emoji-1F5C2 { background-position: -600px -680px; } -.emoji-1F5C3 { background-position: -620px -680px; } -.emoji-1F5C4 { background-position: -640px -680px; } -.emoji-1F5C6 { background-position: -660px -680px; } -.emoji-1F5C7 { background-position: -680px -680px; } -.emoji-1F5C9 { background-position: -700px 0; } -.emoji-1F5CA { background-position: -700px -20px; } -.emoji-1F5CE { background-position: -700px -40px; } -.emoji-1F5CF { background-position: -700px -60px; } -.emoji-1F5D0 { background-position: -700px -80px; } -.emoji-1F5D1 { background-position: -700px -100px; } -.emoji-1F5D2 { background-position: -700px -120px; } -.emoji-1F5D3 { background-position: -700px -140px; } -.emoji-1F5D4 { background-position: -700px -160px; } -.emoji-1F5D8 { background-position: -700px -180px; } -.emoji-1F5D9 { background-position: -700px -200px; } -.emoji-1F5DC { background-position: -700px -220px; } -.emoji-1F5DD { background-position: -700px -240px; } -.emoji-1F5DE { background-position: -700px -260px; } -.emoji-1F5E0 { background-position: -700px -280px; } -.emoji-1F5E1 { background-position: -700px -300px; } -.emoji-1F5E2 { background-position: -700px -320px; } -.emoji-1F5E3 { background-position: -700px -340px; } -.emoji-1F5E8 { background-position: -700px -360px; } -.emoji-1F5E9 { background-position: -700px -380px; } -.emoji-1F5EA { background-position: -700px -400px; } -.emoji-1F5EB { background-position: -700px -420px; } -.emoji-1F5EC { background-position: -700px -440px; } -.emoji-1F5ED { background-position: -700px -460px; } -.emoji-1F5EE { background-position: -700px -480px; } -.emoji-1F5EF { background-position: -700px -500px; } -.emoji-1F5F0 { background-position: -700px -520px; } -.emoji-1F5F1 { background-position: -700px -540px; } -.emoji-1F5F2 { background-position: -700px -560px; } -.emoji-1F5F3 { background-position: -700px -580px; } -.emoji-1F5F4 { background-position: -700px -600px; } -.emoji-1F5F5 { background-position: -700px -620px; } -.emoji-1F5F8 { background-position: -700px -640px; } -.emoji-1F5F9 { background-position: -700px -660px; } -.emoji-1F5FA { background-position: -700px -680px; } -.emoji-1F5FB { background-position: 0 -700px; } -.emoji-1F5FC { background-position: -20px -700px; } -.emoji-1F5FD { background-position: -40px -700px; } -.emoji-1F5FE { background-position: -60px -700px; } -.emoji-1F5FF { background-position: -80px -700px; } -.emoji-1F600 { background-position: -100px -700px; } -.emoji-1F601 { background-position: -120px -700px; } -.emoji-1F602 { background-position: -140px -700px; } -.emoji-1F603 { background-position: -160px -700px; } -.emoji-1F604 { background-position: -180px -700px; } -.emoji-1F605 { background-position: -200px -700px; } -.emoji-1F606 { background-position: -220px -700px; } -.emoji-1F607 { background-position: -240px -700px; } -.emoji-1F608 { background-position: -260px -700px; } -.emoji-1F609 { background-position: -280px -700px; } -.emoji-1F60A { background-position: -300px -700px; } -.emoji-1F60B { background-position: -320px -700px; } -.emoji-1F60C { background-position: -340px -700px; } -.emoji-1F60D { background-position: -360px -700px; } -.emoji-1F60E { background-position: -380px -700px; } -.emoji-1F60F { background-position: -400px -700px; } -.emoji-1F610 { background-position: -420px -700px; } -.emoji-1F611 { background-position: -440px -700px; } -.emoji-1F612 { background-position: -460px -700px; } -.emoji-1F613 { background-position: -480px -700px; } -.emoji-1F614 { background-position: -500px -700px; } -.emoji-1F615 { background-position: -520px -700px; } -.emoji-1F616 { background-position: -540px -700px; } -.emoji-1F617 { background-position: -560px -700px; } -.emoji-1F618 { background-position: -580px -700px; } -.emoji-1F619 { background-position: -600px -700px; } -.emoji-1F61A { background-position: -620px -700px; } -.emoji-1F61B { background-position: -640px -700px; } -.emoji-1F61C { background-position: -660px -700px; } -.emoji-1F61D { background-position: -680px -700px; } -.emoji-1F61E { background-position: -700px -700px; } -.emoji-1F61F { background-position: -720px 0; } -.emoji-1F620 { background-position: -720px -20px; } -.emoji-1F621 { background-position: -720px -40px; } -.emoji-1F622 { background-position: -720px -60px; } -.emoji-1F623 { background-position: -720px -80px; } -.emoji-1F624 { background-position: -720px -100px; } -.emoji-1F625 { background-position: -720px -120px; } -.emoji-1F626 { background-position: -720px -140px; } -.emoji-1F627 { background-position: -720px -160px; } -.emoji-1F628 { background-position: -720px -180px; } -.emoji-1F629 { background-position: -720px -200px; } -.emoji-1F62A { background-position: -720px -220px; } -.emoji-1F62B { background-position: -720px -240px; } -.emoji-1F62C { background-position: -720px -260px; } -.emoji-1F62D { background-position: -720px -280px; } -.emoji-1F62E { background-position: -720px -300px; } -.emoji-1F62F { background-position: -720px -320px; } -.emoji-1F630 { background-position: -720px -340px; } -.emoji-1F631 { background-position: -720px -360px; } -.emoji-1F632 { background-position: -720px -380px; } -.emoji-1F633 { background-position: -720px -400px; } -.emoji-1F634 { background-position: -720px -420px; } -.emoji-1F635 { background-position: -720px -440px; } -.emoji-1F636 { background-position: -720px -460px; } -.emoji-1F637 { background-position: -720px -480px; } -.emoji-1F638 { background-position: -720px -500px; } -.emoji-1F639 { background-position: -720px -520px; } -.emoji-1F63A { background-position: -720px -540px; } -.emoji-1F63B { background-position: -720px -560px; } -.emoji-1F63C { background-position: -720px -580px; } -.emoji-1F63D { background-position: -720px -600px; } -.emoji-1F63E { background-position: -720px -620px; } -.emoji-1F63F { background-position: -720px -640px; } -.emoji-1F640 { background-position: -720px -660px; } -.emoji-1F641 { background-position: -720px -680px; } -.emoji-1F642 { background-position: -720px -700px; } -.emoji-1F643 { background-position: 0 -720px; } -.emoji-1F644 { background-position: -20px -720px; } -.emoji-1F645 { background-position: -40px -720px; } -.emoji-1F645-1F3FB { background-position: -60px -720px; } -.emoji-1F645-1F3FC { background-position: -80px -720px; } -.emoji-1F645-1F3FD { background-position: -100px -720px; } -.emoji-1F645-1F3FE { background-position: -120px -720px; } -.emoji-1F645-1F3FF { background-position: -140px -720px; } -.emoji-1F646 { background-position: -160px -720px; } -.emoji-1F646-1F3FB { background-position: -180px -720px; } -.emoji-1F646-1F3FC { background-position: -200px -720px; } -.emoji-1F646-1F3FD { background-position: -220px -720px; } -.emoji-1F646-1F3FE { background-position: -240px -720px; } -.emoji-1F646-1F3FF { background-position: -260px -720px; } -.emoji-1F647 { background-position: -280px -720px; } -.emoji-1F647-1F3FB { background-position: -300px -720px; } -.emoji-1F647-1F3FC { background-position: -320px -720px; } -.emoji-1F647-1F3FD { background-position: -340px -720px; } -.emoji-1F647-1F3FE { background-position: -360px -720px; } -.emoji-1F647-1F3FF { background-position: -380px -720px; } -.emoji-1F648 { background-position: -400px -720px; } -.emoji-1F649 { background-position: -420px -720px; } -.emoji-1F64A { background-position: -440px -720px; } -.emoji-1F64B { background-position: -460px -720px; } -.emoji-1F64B-1F3FB { background-position: -480px -720px; } -.emoji-1F64B-1F3FC { background-position: -500px -720px; } -.emoji-1F64B-1F3FD { background-position: -520px -720px; } -.emoji-1F64B-1F3FE { background-position: -540px -720px; } -.emoji-1F64B-1F3FF { background-position: -560px -720px; } -.emoji-1F64C { background-position: -580px -720px; } -.emoji-1F64C-1F3FB { background-position: -600px -720px; } -.emoji-1F64C-1F3FC { background-position: -620px -720px; } -.emoji-1F64C-1F3FD { background-position: -640px -720px; } -.emoji-1F64C-1F3FE { background-position: -660px -720px; } -.emoji-1F64C-1F3FF { background-position: -680px -720px; } -.emoji-1F64D { background-position: -700px -720px; } -.emoji-1F64D-1F3FB { background-position: -720px -720px; } -.emoji-1F64D-1F3FC { background-position: -740px 0; } -.emoji-1F64D-1F3FD { background-position: -740px -20px; } -.emoji-1F64D-1F3FE { background-position: -740px -40px; } -.emoji-1F64D-1F3FF { background-position: -740px -60px; } -.emoji-1F64E { background-position: -740px -80px; } -.emoji-1F64E-1F3FB { background-position: -740px -100px; } -.emoji-1F64E-1F3FC { background-position: -740px -120px; } -.emoji-1F64E-1F3FD { background-position: -740px -140px; } -.emoji-1F64E-1F3FE { background-position: -740px -160px; } -.emoji-1F64E-1F3FF { background-position: -740px -180px; } -.emoji-1F64F { background-position: -740px -200px; } -.emoji-1F64F-1F3FB { background-position: -740px -220px; } -.emoji-1F64F-1F3FC { background-position: -740px -240px; } -.emoji-1F64F-1F3FD { background-position: -740px -260px; } -.emoji-1F64F-1F3FE { background-position: -740px -280px; } -.emoji-1F64F-1F3FF { background-position: -740px -300px; } -.emoji-1F680 { background-position: -740px -320px; } -.emoji-1F681 { background-position: -740px -340px; } -.emoji-1F682 { background-position: -740px -360px; } -.emoji-1F683 { background-position: -740px -380px; } -.emoji-1F684 { background-position: -740px -400px; } -.emoji-1F685 { background-position: -740px -420px; } -.emoji-1F686 { background-position: -740px -440px; } -.emoji-1F687 { background-position: -740px -460px; } -.emoji-1F688 { background-position: -740px -480px; } -.emoji-1F689 { background-position: -740px -500px; } -.emoji-1F68A { background-position: -740px -520px; } -.emoji-1F68B { background-position: -740px -540px; } -.emoji-1F68C { background-position: -740px -560px; } -.emoji-1F68D { background-position: -740px -580px; } -.emoji-1F68E { background-position: -740px -600px; } -.emoji-1F68F { background-position: -740px -620px; } -.emoji-1F690 { background-position: -740px -640px; } -.emoji-1F691 { background-position: -740px -660px; } -.emoji-1F692 { background-position: -740px -680px; } -.emoji-1F693 { background-position: -740px -700px; } -.emoji-1F694 { background-position: -740px -720px; } -.emoji-1F695 { background-position: 0 -740px; } -.emoji-1F696 { background-position: -20px -740px; } -.emoji-1F697 { background-position: -40px -740px; } -.emoji-1F698 { background-position: -60px -740px; } -.emoji-1F699 { background-position: -80px -740px; } -.emoji-1F69A { background-position: -100px -740px; } -.emoji-1F69B { background-position: -120px -740px; } -.emoji-1F69C { background-position: -140px -740px; } -.emoji-1F69D { background-position: -160px -740px; } -.emoji-1F69E { background-position: -180px -740px; } -.emoji-1F69F { background-position: -200px -740px; } -.emoji-1F6A0 { background-position: -220px -740px; } -.emoji-1F6A1 { background-position: -240px -740px; } -.emoji-1F6A2 { background-position: -260px -740px; } -.emoji-1F6A3 { background-position: -280px -740px; } -.emoji-1F6A3-1F3FB { background-position: -300px -740px; } -.emoji-1F6A3-1F3FC { background-position: -320px -740px; } -.emoji-1F6A3-1F3FD { background-position: -340px -740px; } -.emoji-1F6A3-1F3FE { background-position: -360px -740px; } -.emoji-1F6A3-1F3FF { background-position: -380px -740px; } -.emoji-1F6A4 { background-position: -400px -740px; } -.emoji-1F6A5 { background-position: -420px -740px; } -.emoji-1F6A6 { background-position: -440px -740px; } -.emoji-1F6A7 { background-position: -460px -740px; } -.emoji-1F6A8 { background-position: -480px -740px; } -.emoji-1F6A9 { background-position: -500px -740px; } -.emoji-1F6AA { background-position: -520px -740px; } -.emoji-1F6AB { background-position: -540px -740px; } -.emoji-1F6AC { background-position: -560px -740px; } -.emoji-1F6AD { background-position: -580px -740px; } -.emoji-1F6AE { background-position: -600px -740px; } -.emoji-1F6AF { background-position: -620px -740px; } -.emoji-1F6B0 { background-position: -640px -740px; } -.emoji-1F6B1 { background-position: -660px -740px; } -.emoji-1F6B2 { background-position: -680px -740px; } -.emoji-1F6B3 { background-position: -700px -740px; } -.emoji-1F6B4 { background-position: -720px -740px; } -.emoji-1F6B4-1F3FB { background-position: -740px -740px; } -.emoji-1F6B4-1F3FC { background-position: -760px 0; } -.emoji-1F6B4-1F3FD { background-position: -760px -20px; } -.emoji-1F6B4-1F3FE { background-position: -760px -40px; } -.emoji-1F6B4-1F3FF { background-position: -760px -60px; } -.emoji-1F6B5 { background-position: -760px -80px; } -.emoji-1F6B5-1F3FB { background-position: -760px -100px; } -.emoji-1F6B5-1F3FC { background-position: -760px -120px; } -.emoji-1F6B5-1F3FD { background-position: -760px -140px; } -.emoji-1F6B5-1F3FE { background-position: -760px -160px; } -.emoji-1F6B5-1F3FF { background-position: -760px -180px; } -.emoji-1F6B6 { background-position: -760px -200px; } -.emoji-1F6B6-1F3FB { background-position: -760px -220px; } -.emoji-1F6B6-1F3FC { background-position: -760px -240px; } -.emoji-1F6B6-1F3FD { background-position: -760px -260px; } -.emoji-1F6B6-1F3FE { background-position: -760px -280px; } -.emoji-1F6B6-1F3FF { background-position: -760px -300px; } -.emoji-1F6B7 { background-position: -760px -320px; } -.emoji-1F6B8 { background-position: -760px -340px; } -.emoji-1F6B9 { background-position: -760px -360px; } -.emoji-1F6BA { background-position: -760px -380px; } -.emoji-1F6BB { background-position: -760px -400px; } -.emoji-1F6BC { background-position: -760px -420px; } -.emoji-1F6BD { background-position: -760px -440px; } -.emoji-1F6BE { background-position: -760px -460px; } -.emoji-1F6BF { background-position: -760px -480px; } -.emoji-1F6C0 { background-position: -760px -500px; } -.emoji-1F6C0-1F3FB { background-position: -760px -520px; } -.emoji-1F6C0-1F3FC { background-position: -760px -540px; } -.emoji-1F6C0-1F3FD { background-position: -760px -560px; } -.emoji-1F6C0-1F3FE { background-position: -760px -580px; } -.emoji-1F6C0-1F3FF { background-position: -760px -600px; } -.emoji-1F6C1 { background-position: -760px -620px; } -.emoji-1F6C2 { background-position: -760px -640px; } -.emoji-1F6C3 { background-position: -760px -660px; } -.emoji-1F6C4 { background-position: -760px -680px; } -.emoji-1F6C5 { background-position: -760px -700px; } -.emoji-1F6C6 { background-position: -760px -720px; } -.emoji-1F6C7 { background-position: -760px -740px; } -.emoji-1F6C8 { background-position: 0 -760px; } -.emoji-1F6C9 { background-position: -20px -760px; } -.emoji-1F6CA { background-position: -40px -760px; } -.emoji-1F6CB { background-position: -60px -760px; } -.emoji-1F6CC { background-position: -80px -760px; } -.emoji-1F6CD { background-position: -100px -760px; } -.emoji-1F6CE { background-position: -120px -760px; } -.emoji-1F6CF { background-position: -140px -760px; } -.emoji-1F6D0 { background-position: -160px -760px; } -.emoji-1F6E0 { background-position: -180px -760px; } -.emoji-1F6E1 { background-position: -200px -760px; } -.emoji-1F6E2 { background-position: -220px -760px; } -.emoji-1F6E3 { background-position: -240px -760px; } -.emoji-1F6E4 { background-position: -260px -760px; } -.emoji-1F6E5 { background-position: -280px -760px; } -.emoji-1F6E6 { background-position: -300px -760px; } -.emoji-1F6E7 { background-position: -320px -760px; } -.emoji-1F6E8 { background-position: -340px -760px; } -.emoji-1F6E9 { background-position: -360px -760px; } -.emoji-1F6EA { background-position: -380px -760px; } -.emoji-1F6EB { background-position: -400px -760px; } -.emoji-1F6EC { background-position: -420px -760px; } -.emoji-1F6F0 { background-position: -440px -760px; } -.emoji-1F6F1 { background-position: -460px -760px; } -.emoji-1F6F2 { background-position: -480px -760px; } -.emoji-1F6F3 { background-position: -500px -760px; } -.emoji-1F910 { background-position: -520px -760px; } -.emoji-1F911 { background-position: -540px -760px; } -.emoji-1F912 { background-position: -560px -760px; } -.emoji-1F913 { background-position: -580px -760px; } -.emoji-1F914 { background-position: -600px -760px; } -.emoji-1F915 { background-position: -620px -760px; } -.emoji-1F916 { background-position: -640px -760px; } -.emoji-1F917 { background-position: -660px -760px; } -.emoji-1F918 { background-position: -680px -760px; } -.emoji-1F918-1F3FB { background-position: -700px -760px; } -.emoji-1F918-1F3FC { background-position: -720px -760px; } -.emoji-1F918-1F3FD { background-position: -740px -760px; } -.emoji-1F918-1F3FE { background-position: -760px -760px; } -.emoji-1F918-1F3FF { background-position: -780px 0; } -.emoji-1F980 { background-position: -780px -20px; } -.emoji-1F981 { background-position: -780px -40px; } -.emoji-1F982 { background-position: -780px -60px; } -.emoji-1F983 { background-position: -780px -80px; } -.emoji-1F984 { background-position: -780px -100px; } -.emoji-1F9C0 { background-position: -780px -120px; } -.emoji-203C { background-position: -780px -140px; } -.emoji-2049 { background-position: -780px -160px; } -.emoji-2122 { background-position: -780px -180px; } -.emoji-2139 { background-position: -780px -200px; } -.emoji-2194 { background-position: -780px -220px; } -.emoji-2195 { background-position: -780px -240px; } -.emoji-2196 { background-position: -780px -260px; } -.emoji-2197 { background-position: -780px -280px; } -.emoji-2198 { background-position: -780px -300px; } -.emoji-2199 { background-position: -780px -320px; } -.emoji-21A9 { background-position: -780px -340px; } -.emoji-21AA { background-position: -780px -360px; } -.emoji-231A { background-position: -780px -380px; } -.emoji-231B { background-position: -780px -400px; } -.emoji-2328 { background-position: -780px -420px; } -.emoji-23E9 { background-position: -780px -440px; } -.emoji-23EA { background-position: -780px -460px; } -.emoji-23EB { background-position: -780px -480px; } -.emoji-23EC { background-position: -780px -500px; } -.emoji-23ED { background-position: -780px -520px; } -.emoji-23EE { background-position: -780px -540px; } -.emoji-23EF { background-position: -780px -560px; } -.emoji-23F0 { background-position: -780px -580px; } -.emoji-23F1 { background-position: -780px -600px; } -.emoji-23F2 { background-position: -780px -620px; } -.emoji-23F3 { background-position: -780px -640px; } -.emoji-23F8 { background-position: -780px -660px; } -.emoji-23F9 { background-position: -780px -680px; } -.emoji-23FA { background-position: -780px -700px; } -.emoji-24C2 { background-position: -780px -720px; } -.emoji-25AA { background-position: -780px -740px; } -.emoji-25AB { background-position: -780px -760px; } -.emoji-25B6 { background-position: 0 -780px; } -.emoji-25C0 { background-position: -20px -780px; } -.emoji-25FB { background-position: -40px -780px; } -.emoji-25FC { background-position: -60px -780px; } -.emoji-25FD { background-position: -80px -780px; } -.emoji-25FE { background-position: -100px -780px; } -.emoji-2600 { background-position: -120px -780px; } -.emoji-2601 { background-position: -140px -780px; } -.emoji-2602 { background-position: -160px -780px; } -.emoji-2603 { background-position: -180px -780px; } -.emoji-2604 { background-position: -200px -780px; } -.emoji-260E { background-position: -220px -780px; } -.emoji-2611 { background-position: -240px -780px; } -.emoji-2614 { background-position: -260px -780px; } -.emoji-2615 { background-position: -280px -780px; } -.emoji-2618 { background-position: -300px -780px; } -.emoji-261D { background-position: -320px -780px; } -.emoji-261D-1F3FB { background-position: -340px -780px; } -.emoji-261D-1F3FC { background-position: -360px -780px; } -.emoji-261D-1F3FD { background-position: -380px -780px; } -.emoji-261D-1F3FE { background-position: -400px -780px; } -.emoji-261D-1F3FF { background-position: -420px -780px; } -.emoji-2620 { background-position: -440px -780px; } -.emoji-2622 { background-position: -460px -780px; } -.emoji-2623 { background-position: -480px -780px; } -.emoji-2626 { background-position: -500px -780px; } -.emoji-262A { background-position: -520px -780px; } -.emoji-262E { background-position: -540px -780px; } -.emoji-262F { background-position: -560px -780px; } -.emoji-2638 { background-position: -580px -780px; } -.emoji-2639 { background-position: -600px -780px; } -.emoji-263A { background-position: -620px -780px; } -.emoji-2648 { background-position: -640px -780px; } -.emoji-2649 { background-position: -660px -780px; } -.emoji-264A { background-position: -680px -780px; } -.emoji-264B { background-position: -700px -780px; } -.emoji-264C { background-position: -720px -780px; } -.emoji-264D { background-position: -740px -780px; } -.emoji-264E { background-position: -760px -780px; } -.emoji-264F { background-position: -780px -780px; } -.emoji-2650 { background-position: -800px 0; } -.emoji-2651 { background-position: -800px -20px; } -.emoji-2652 { background-position: -800px -40px; } -.emoji-2653 { background-position: -800px -60px; } -.emoji-2660 { background-position: -800px -80px; } -.emoji-2663 { background-position: -800px -100px; } -.emoji-2665 { background-position: -800px -120px; } -.emoji-2666 { background-position: -800px -140px; } -.emoji-2668 { background-position: -800px -160px; } -.emoji-267B { background-position: -800px -180px; } -.emoji-267F { background-position: -800px -200px; } -.emoji-2692 { background-position: -800px -220px; } -.emoji-2693 { background-position: -800px -240px; } -.emoji-2694 { background-position: -800px -260px; } -.emoji-2696 { background-position: -800px -280px; } -.emoji-2697 { background-position: -800px -300px; } -.emoji-2699 { background-position: -800px -320px; } -.emoji-269B { background-position: -800px -340px; } -.emoji-269C { background-position: -800px -360px; } -.emoji-26A0 { background-position: -800px -380px; } -.emoji-26A1 { background-position: -800px -400px; } -.emoji-26AA { background-position: -800px -420px; } -.emoji-26AB { background-position: -800px -440px; } -.emoji-26B0 { background-position: -800px -460px; } -.emoji-26B1 { background-position: -800px -480px; } -.emoji-26BD { background-position: -800px -500px; } -.emoji-26BE { background-position: -800px -520px; } -.emoji-26C4 { background-position: -800px -540px; } -.emoji-26C5 { background-position: -800px -560px; } -.emoji-26C8 { background-position: -800px -580px; } -.emoji-26CE { background-position: -800px -600px; } -.emoji-26CF { background-position: -800px -620px; } -.emoji-26D1 { background-position: -800px -640px; } -.emoji-26D3 { background-position: -800px -660px; } -.emoji-26D4 { background-position: -800px -680px; } -.emoji-26E9 { background-position: -800px -700px; } -.emoji-26EA { background-position: -800px -720px; } -.emoji-26F0 { background-position: -800px -740px; } -.emoji-26F1 { background-position: -800px -760px; } -.emoji-26F2 { background-position: -800px -780px; } -.emoji-26F3 { background-position: 0 -800px; } -.emoji-26F4 { background-position: -20px -800px; } -.emoji-26F5 { background-position: -40px -800px; } -.emoji-26F7 { background-position: -60px -800px; } -.emoji-26F8 { background-position: -80px -800px; } -.emoji-26F9 { background-position: -100px -800px; } -.emoji-26F9-1F3FB { background-position: -120px -800px; } -.emoji-26F9-1F3FC { background-position: -140px -800px; } -.emoji-26F9-1F3FD { background-position: -160px -800px; } -.emoji-26F9-1F3FE { background-position: -180px -800px; } -.emoji-26F9-1F3FF { background-position: -200px -800px; } -.emoji-26FA { background-position: -220px -800px; } -.emoji-26FD { background-position: -240px -800px; } -.emoji-2702 { background-position: -260px -800px; } -.emoji-2705 { background-position: -280px -800px; } -.emoji-2708 { background-position: -300px -800px; } -.emoji-2709 { background-position: -320px -800px; } -.emoji-270A { background-position: -340px -800px; } -.emoji-270A-1F3FB { background-position: -360px -800px; } -.emoji-270A-1F3FC { background-position: -380px -800px; } -.emoji-270A-1F3FD { background-position: -400px -800px; } -.emoji-270A-1F3FE { background-position: -420px -800px; } -.emoji-270A-1F3FF { background-position: -440px -800px; } -.emoji-270B { background-position: -460px -800px; } -.emoji-270B-1F3FB { background-position: -480px -800px; } -.emoji-270B-1F3FC { background-position: -500px -800px; } -.emoji-270B-1F3FD { background-position: -520px -800px; } -.emoji-270B-1F3FE { background-position: -540px -800px; } -.emoji-270B-1F3FF { background-position: -560px -800px; } -.emoji-270C { background-position: -580px -800px; } -.emoji-270C-1F3FB { background-position: -600px -800px; } -.emoji-270C-1F3FC { background-position: -620px -800px; } -.emoji-270C-1F3FD { background-position: -640px -800px; } -.emoji-270C-1F3FE { background-position: -660px -800px; } -.emoji-270C-1F3FF { background-position: -680px -800px; } -.emoji-270D { background-position: -700px -800px; } -.emoji-270D-1F3FB { background-position: -720px -800px; } -.emoji-270D-1F3FC { background-position: -740px -800px; } -.emoji-270D-1F3FD { background-position: -760px -800px; } -.emoji-270D-1F3FE { background-position: -780px -800px; } -.emoji-270D-1F3FF { background-position: -800px -800px; } -.emoji-270F { background-position: -820px 0; } -.emoji-2712 { background-position: -820px -20px; } -.emoji-2714 { background-position: -820px -40px; } -.emoji-2716 { background-position: -820px -60px; } -.emoji-271D { background-position: -820px -80px; } -.emoji-2721 { background-position: -820px -100px; } -.emoji-2728 { background-position: -820px -120px; } -.emoji-2733 { background-position: -820px -140px; } -.emoji-2734 { background-position: -820px -160px; } -.emoji-2744 { background-position: -820px -180px; } -.emoji-2747 { background-position: -820px -200px; } -.emoji-274C { background-position: -820px -220px; } -.emoji-274E { background-position: -820px -240px; } -.emoji-2753 { background-position: -820px -260px; } -.emoji-2754 { background-position: -820px -280px; } -.emoji-2755 { background-position: -820px -300px; } -.emoji-2757 { background-position: -820px -320px; } -.emoji-2763 { background-position: -820px -340px; } -.emoji-2764 { background-position: -820px -360px; } -.emoji-2795 { background-position: -820px -380px; } -.emoji-2796 { background-position: -820px -400px; } -.emoji-2797 { background-position: -820px -420px; } -.emoji-27A1 { background-position: -820px -440px; } -.emoji-27B0 { background-position: -820px -460px; } -.emoji-27BF { background-position: -820px -480px; } -.emoji-2934 { background-position: -820px -500px; } -.emoji-2935 { background-position: -820px -520px; } -.emoji-2B05 { background-position: -820px -540px; } -.emoji-2B06 { background-position: -820px -560px; } -.emoji-2B07 { background-position: -820px -580px; } -.emoji-2B1B { background-position: -820px -600px; } -.emoji-2B1C { background-position: -820px -620px; } -.emoji-2B50 { background-position: -820px -640px; } -.emoji-2B55 { background-position: -820px -660px; } -.emoji-3030 { background-position: -820px -680px; } -.emoji-303D { background-position: -820px -700px; } -.emoji-3297 { background-position: -820px -720px; } -.emoji-3299 { background-position: -820px -740px; } +.emoji-1F396 { background-position: -420px -260px; } +.emoji-1F397 { background-position: -420px -280px; } +.emoji-1F399 { background-position: -420px -300px; } +.emoji-1F39A { background-position: -420px -320px; } +.emoji-1F39B { background-position: -420px -340px; } +.emoji-1F39E { background-position: -420px -360px; } +.emoji-1F39F { background-position: -420px -380px; } +.emoji-1F3A0 { background-position: -420px -400px; } +.emoji-1F3A1 { background-position: 0 -420px; } +.emoji-1F3A2 { background-position: -20px -420px; } +.emoji-1F3A3 { background-position: -40px -420px; } +.emoji-1F3A4 { background-position: -60px -420px; } +.emoji-1F3A5 { background-position: -80px -420px; } +.emoji-1F3A6 { background-position: -100px -420px; } +.emoji-1F3A7 { background-position: -120px -420px; } +.emoji-1F3A8 { background-position: -140px -420px; } +.emoji-1F3A9 { background-position: -160px -420px; } +.emoji-1F3AA { background-position: -180px -420px; } +.emoji-1F3AB { background-position: -200px -420px; } +.emoji-1F3AC { background-position: -220px -420px; } +.emoji-1F3AD { background-position: -240px -420px; } +.emoji-1F3AE { background-position: -260px -420px; } +.emoji-1F3AF { background-position: -280px -420px; } +.emoji-1F3B0 { background-position: -300px -420px; } +.emoji-1F3B1 { background-position: -320px -420px; } +.emoji-1F3B2 { background-position: -340px -420px; } +.emoji-1F3B3 { background-position: -360px -420px; } +.emoji-1F3B4 { background-position: -380px -420px; } +.emoji-1F3B5 { background-position: -400px -420px; } +.emoji-1F3B6 { background-position: -420px -420px; } +.emoji-1F3B7 { background-position: -440px 0; } +.emoji-1F3B8 { background-position: -440px -20px; } +.emoji-1F3B9 { background-position: -440px -40px; } +.emoji-1F3BA { background-position: -440px -60px; } +.emoji-1F3BB { background-position: -440px -80px; } +.emoji-1F3BC { background-position: -440px -100px; } +.emoji-1F3BD { background-position: -440px -120px; } +.emoji-1F3BE { background-position: -440px -140px; } +.emoji-1F3BF { background-position: -440px -160px; } +.emoji-1F3C0 { background-position: -440px -180px; } +.emoji-1F3C1 { background-position: -440px -200px; } +.emoji-1F3C2 { background-position: -440px -220px; } +.emoji-1F3C3 { background-position: -440px -240px; } +.emoji-1F3C3-1F3FB { background-position: -440px -260px; } +.emoji-1F3C3-1F3FC { background-position: -440px -280px; } +.emoji-1F3C3-1F3FD { background-position: -440px -300px; } +.emoji-1F3C3-1F3FE { background-position: -440px -320px; } +.emoji-1F3C3-1F3FF { background-position: -440px -340px; } +.emoji-1F3C4 { background-position: -440px -360px; } +.emoji-1F3C4-1F3FB { background-position: -440px -380px; } +.emoji-1F3C4-1F3FC { background-position: -440px -400px; } +.emoji-1F3C4-1F3FD { background-position: -440px -420px; } +.emoji-1F3C4-1F3FE { background-position: 0 -440px; } +.emoji-1F3C4-1F3FF { background-position: -20px -440px; } +.emoji-1F3C5 { background-position: -40px -440px; } +.emoji-1F3C6 { background-position: -60px -440px; } +.emoji-1F3C7 { background-position: -80px -440px; } +.emoji-1F3C7-1F3FB { background-position: -100px -440px; } +.emoji-1F3C7-1F3FC { background-position: -120px -440px; } +.emoji-1F3C7-1F3FD { background-position: -140px -440px; } +.emoji-1F3C7-1F3FE { background-position: -160px -440px; } +.emoji-1F3C7-1F3FF { background-position: -180px -440px; } +.emoji-1F3C8 { background-position: -200px -440px; } +.emoji-1F3C9 { background-position: -220px -440px; } +.emoji-1F3CA { background-position: -240px -440px; } +.emoji-1F3CA-1F3FB { background-position: -260px -440px; } +.emoji-1F3CA-1F3FC { background-position: -280px -440px; } +.emoji-1F3CA-1F3FD { background-position: -300px -440px; } +.emoji-1F3CA-1F3FE { background-position: -320px -440px; } +.emoji-1F3CA-1F3FF { background-position: -340px -440px; } +.emoji-1F3CB { background-position: -360px -440px; } +.emoji-1F3CB-1F3FB { background-position: -380px -440px; } +.emoji-1F3CB-1F3FC { background-position: -400px -440px; } +.emoji-1F3CB-1F3FD { background-position: -420px -440px; } +.emoji-1F3CB-1F3FE { background-position: -440px -440px; } +.emoji-1F3CB-1F3FF { background-position: -460px 0; } +.emoji-1F3CC { background-position: -460px -20px; } +.emoji-1F3CD { background-position: -460px -40px; } +.emoji-1F3CE { background-position: -460px -60px; } +.emoji-1F3CF { background-position: -460px -80px; } +.emoji-1F3D0 { background-position: -460px -100px; } +.emoji-1F3D1 { background-position: -460px -120px; } +.emoji-1F3D2 { background-position: -460px -140px; } +.emoji-1F3D3 { background-position: -460px -160px; } +.emoji-1F3D4 { background-position: -460px -180px; } +.emoji-1F3D5 { background-position: -460px -200px; } +.emoji-1F3D6 { background-position: -460px -220px; } +.emoji-1F3D7 { background-position: -460px -240px; } +.emoji-1F3D8 { background-position: -460px -260px; } +.emoji-1F3D9 { background-position: -460px -280px; } +.emoji-1F3DA { background-position: -460px -300px; } +.emoji-1F3DB { background-position: -460px -320px; } +.emoji-1F3DC { background-position: -460px -340px; } +.emoji-1F3DD { background-position: -460px -360px; } +.emoji-1F3DE { background-position: -460px -380px; } +.emoji-1F3DF { background-position: -460px -400px; } +.emoji-1F3E0 { background-position: -460px -420px; } +.emoji-1F3E1 { background-position: -460px -440px; } +.emoji-1F3E2 { background-position: 0 -460px; } +.emoji-1F3E3 { background-position: -20px -460px; } +.emoji-1F3E4 { background-position: -40px -460px; } +.emoji-1F3E5 { background-position: -60px -460px; } +.emoji-1F3E6 { background-position: -80px -460px; } +.emoji-1F3E7 { background-position: -100px -460px; } +.emoji-1F3E8 { background-position: -120px -460px; } +.emoji-1F3E9 { background-position: -140px -460px; } +.emoji-1F3EA { background-position: -160px -460px; } +.emoji-1F3EB { background-position: -180px -460px; } +.emoji-1F3EC { background-position: -200px -460px; } +.emoji-1F3ED { background-position: -220px -460px; } +.emoji-1F3EE { background-position: -240px -460px; } +.emoji-1F3EF { background-position: -260px -460px; } +.emoji-1F3F0 { background-position: -280px -460px; } +.emoji-1F3F3 { background-position: -300px -460px; } +.emoji-1F3F4 { background-position: -320px -460px; } +.emoji-1F3F5 { background-position: -340px -460px; } +.emoji-1F3F7 { background-position: -360px -460px; } +.emoji-1F3F8 { background-position: -380px -460px; } +.emoji-1F3F9 { background-position: -400px -460px; } +.emoji-1F3FA { background-position: -420px -460px; } +.emoji-1F3FB { background-position: -440px -460px; } +.emoji-1F3FC { background-position: -460px -460px; } +.emoji-1F3FD { background-position: -480px 0; } +.emoji-1F3FE { background-position: -480px -20px; } +.emoji-1F3FF { background-position: -480px -40px; } +.emoji-1F400 { background-position: -480px -60px; } +.emoji-1F401 { background-position: -480px -80px; } +.emoji-1F402 { background-position: -480px -100px; } +.emoji-1F403 { background-position: -480px -120px; } +.emoji-1F404 { background-position: -480px -140px; } +.emoji-1F405 { background-position: -480px -160px; } +.emoji-1F406 { background-position: -480px -180px; } +.emoji-1F407 { background-position: -480px -200px; } +.emoji-1F408 { background-position: -480px -220px; } +.emoji-1F409 { background-position: -480px -240px; } +.emoji-1F40A { background-position: -480px -260px; } +.emoji-1F40B { background-position: -480px -280px; } +.emoji-1F40C { background-position: -480px -300px; } +.emoji-1F40D { background-position: -480px -320px; } +.emoji-1F40E { background-position: -480px -340px; } +.emoji-1F40F { background-position: -480px -360px; } +.emoji-1F410 { background-position: -480px -380px; } +.emoji-1F411 { background-position: -480px -400px; } +.emoji-1F412 { background-position: -480px -420px; } +.emoji-1F413 { background-position: -480px -440px; } +.emoji-1F414 { background-position: -480px -460px; } +.emoji-1F415 { background-position: 0 -480px; } +.emoji-1F416 { background-position: -20px -480px; } +.emoji-1F417 { background-position: -40px -480px; } +.emoji-1F418 { background-position: -60px -480px; } +.emoji-1F419 { background-position: -80px -480px; } +.emoji-1F41A { background-position: -100px -480px; } +.emoji-1F41B { background-position: -120px -480px; } +.emoji-1F41C { background-position: -140px -480px; } +.emoji-1F41D { background-position: -160px -480px; } +.emoji-1F41E { background-position: -180px -480px; } +.emoji-1F41F { background-position: -200px -480px; } +.emoji-1F420 { background-position: -220px -480px; } +.emoji-1F421 { background-position: -240px -480px; } +.emoji-1F422 { background-position: -260px -480px; } +.emoji-1F423 { background-position: -280px -480px; } +.emoji-1F424 { background-position: -300px -480px; } +.emoji-1F425 { background-position: -320px -480px; } +.emoji-1F426 { background-position: -340px -480px; } +.emoji-1F427 { background-position: -360px -480px; } +.emoji-1F428 { background-position: -380px -480px; } +.emoji-1F429 { background-position: -400px -480px; } +.emoji-1F42A { background-position: -420px -480px; } +.emoji-1F42B { background-position: -440px -480px; } +.emoji-1F42C { background-position: -460px -480px; } +.emoji-1F42D { background-position: -480px -480px; } +.emoji-1F42E { background-position: -500px 0; } +.emoji-1F42F { background-position: -500px -20px; } +.emoji-1F430 { background-position: -500px -40px; } +.emoji-1F431 { background-position: -500px -60px; } +.emoji-1F432 { background-position: -500px -80px; } +.emoji-1F433 { background-position: -500px -100px; } +.emoji-1F434 { background-position: -500px -120px; } +.emoji-1F435 { background-position: -500px -140px; } +.emoji-1F436 { background-position: -500px -160px; } +.emoji-1F437 { background-position: -500px -180px; } +.emoji-1F438 { background-position: -500px -200px; } +.emoji-1F439 { background-position: -500px -220px; } +.emoji-1F43A { background-position: -500px -240px; } +.emoji-1F43B { background-position: -500px -260px; } +.emoji-1F43C { background-position: -500px -280px; } +.emoji-1F43D { background-position: -500px -300px; } +.emoji-1F43E { background-position: -500px -320px; } +.emoji-1F43F { background-position: -500px -340px; } +.emoji-1F440 { background-position: -500px -360px; } +.emoji-1F441 { background-position: -500px -380px; } +.emoji-1F441-1F5E8 { background-position: -500px -400px; } +.emoji-1F442 { background-position: -500px -420px; } +.emoji-1F442-1F3FB { background-position: -500px -440px; } +.emoji-1F442-1F3FC { background-position: -500px -460px; } +.emoji-1F442-1F3FD { background-position: -500px -480px; } +.emoji-1F442-1F3FE { background-position: 0 -500px; } +.emoji-1F442-1F3FF { background-position: -20px -500px; } +.emoji-1F443 { background-position: -40px -500px; } +.emoji-1F443-1F3FB { background-position: -60px -500px; } +.emoji-1F443-1F3FC { background-position: -80px -500px; } +.emoji-1F443-1F3FD { background-position: -100px -500px; } +.emoji-1F443-1F3FE { background-position: -120px -500px; } +.emoji-1F443-1F3FF { background-position: -140px -500px; } +.emoji-1F444 { background-position: -160px -500px; } +.emoji-1F445 { background-position: -180px -500px; } +.emoji-1F446 { background-position: -200px -500px; } +.emoji-1F446-1F3FB { background-position: -220px -500px; } +.emoji-1F446-1F3FC { background-position: -240px -500px; } +.emoji-1F446-1F3FD { background-position: -260px -500px; } +.emoji-1F446-1F3FE { background-position: -280px -500px; } +.emoji-1F446-1F3FF { background-position: -300px -500px; } +.emoji-1F447 { background-position: -320px -500px; } +.emoji-1F447-1F3FB { background-position: -340px -500px; } +.emoji-1F447-1F3FC { background-position: -360px -500px; } +.emoji-1F447-1F3FD { background-position: -380px -500px; } +.emoji-1F447-1F3FE { background-position: -400px -500px; } +.emoji-1F447-1F3FF { background-position: -420px -500px; } +.emoji-1F448 { background-position: -440px -500px; } +.emoji-1F448-1F3FB { background-position: -460px -500px; } +.emoji-1F448-1F3FC { background-position: -480px -500px; } +.emoji-1F448-1F3FD { background-position: -500px -500px; } +.emoji-1F448-1F3FE { background-position: -520px 0; } +.emoji-1F448-1F3FF { background-position: -520px -20px; } +.emoji-1F449 { background-position: -520px -40px; } +.emoji-1F449-1F3FB { background-position: -520px -60px; } +.emoji-1F449-1F3FC { background-position: -520px -80px; } +.emoji-1F449-1F3FD { background-position: -520px -100px; } +.emoji-1F449-1F3FE { background-position: -520px -120px; } +.emoji-1F449-1F3FF { background-position: -520px -140px; } +.emoji-1F44A { background-position: -520px -160px; } +.emoji-1F44A-1F3FB { background-position: -520px -180px; } +.emoji-1F44A-1F3FC { background-position: -520px -200px; } +.emoji-1F44A-1F3FD { background-position: -520px -220px; } +.emoji-1F44A-1F3FE { background-position: -520px -240px; } +.emoji-1F44A-1F3FF { background-position: -520px -260px; } +.emoji-1F44B { background-position: -520px -280px; } +.emoji-1F44B-1F3FB { background-position: -520px -300px; } +.emoji-1F44B-1F3FC { background-position: -520px -320px; } +.emoji-1F44B-1F3FD { background-position: -520px -340px; } +.emoji-1F44B-1F3FE { background-position: -520px -360px; } +.emoji-1F44B-1F3FF { background-position: -520px -380px; } +.emoji-1F44C { background-position: -520px -400px; } +.emoji-1F44C-1F3FB { background-position: -520px -420px; } +.emoji-1F44C-1F3FC { background-position: -520px -440px; } +.emoji-1F44C-1F3FD { background-position: -520px -460px; } +.emoji-1F44C-1F3FE { background-position: -520px -480px; } +.emoji-1F44C-1F3FF { background-position: -520px -500px; } +.emoji-1F44D { background-position: 0 -520px; } +.emoji-1F44D-1F3FB { background-position: -20px -520px; } +.emoji-1F44D-1F3FC { background-position: -40px -520px; } +.emoji-1F44D-1F3FD { background-position: -60px -520px; } +.emoji-1F44D-1F3FE { background-position: -80px -520px; } +.emoji-1F44D-1F3FF { background-position: -100px -520px; } +.emoji-1F44E { background-position: -120px -520px; } +.emoji-1F44E-1F3FB { background-position: -140px -520px; } +.emoji-1F44E-1F3FC { background-position: -160px -520px; } +.emoji-1F44E-1F3FD { background-position: -180px -520px; } +.emoji-1F44E-1F3FE { background-position: -200px -520px; } +.emoji-1F44E-1F3FF { background-position: -220px -520px; } +.emoji-1F44F { background-position: -240px -520px; } +.emoji-1F44F-1F3FB { background-position: -260px -520px; } +.emoji-1F44F-1F3FC { background-position: -280px -520px; } +.emoji-1F44F-1F3FD { background-position: -300px -520px; } +.emoji-1F44F-1F3FE { background-position: -320px -520px; } +.emoji-1F44F-1F3FF { background-position: -340px -520px; } +.emoji-1F450 { background-position: -360px -520px; } +.emoji-1F450-1F3FB { background-position: -380px -520px; } +.emoji-1F450-1F3FC { background-position: -400px -520px; } +.emoji-1F450-1F3FD { background-position: -420px -520px; } +.emoji-1F450-1F3FE { background-position: -440px -520px; } +.emoji-1F450-1F3FF { background-position: -460px -520px; } +.emoji-1F451 { background-position: -480px -520px; } +.emoji-1F452 { background-position: -500px -520px; } +.emoji-1F453 { background-position: -520px -520px; } +.emoji-1F454 { background-position: -540px 0; } +.emoji-1F455 { background-position: -540px -20px; } +.emoji-1F456 { background-position: -540px -40px; } +.emoji-1F457 { background-position: -540px -60px; } +.emoji-1F458 { background-position: -540px -80px; } +.emoji-1F459 { background-position: -540px -100px; } +.emoji-1F45A { background-position: -540px -120px; } +.emoji-1F45B { background-position: -540px -140px; } +.emoji-1F45C { background-position: -540px -160px; } +.emoji-1F45D { background-position: -540px -180px; } +.emoji-1F45E { background-position: -540px -200px; } +.emoji-1F45F { background-position: -540px -220px; } +.emoji-1F460 { background-position: -540px -240px; } +.emoji-1F461 { background-position: -540px -260px; } +.emoji-1F462 { background-position: -540px -280px; } +.emoji-1F463 { background-position: -540px -300px; } +.emoji-1F464 { background-position: -540px -320px; } +.emoji-1F465 { background-position: -540px -340px; } +.emoji-1F466 { background-position: -540px -360px; } +.emoji-1F466-1F3FB { background-position: -540px -380px; } +.emoji-1F466-1F3FC { background-position: -540px -400px; } +.emoji-1F466-1F3FD { background-position: -540px -420px; } +.emoji-1F466-1F3FE { background-position: -540px -440px; } +.emoji-1F466-1F3FF { background-position: -540px -460px; } +.emoji-1F467 { background-position: -540px -480px; } +.emoji-1F467-1F3FB { background-position: -540px -500px; } +.emoji-1F467-1F3FC { background-position: -540px -520px; } +.emoji-1F467-1F3FD { background-position: 0 -540px; } +.emoji-1F467-1F3FE { background-position: -20px -540px; } +.emoji-1F467-1F3FF { background-position: -40px -540px; } +.emoji-1F468 { background-position: -60px -540px; } +.emoji-1F468-1F3FB { background-position: -80px -540px; } +.emoji-1F468-1F3FC { background-position: -100px -540px; } +.emoji-1F468-1F3FD { background-position: -120px -540px; } +.emoji-1F468-1F3FE { background-position: -140px -540px; } +.emoji-1F468-1F3FF { background-position: -160px -540px; } +.emoji-1F468-1F468-1F466 { background-position: -180px -540px; } +.emoji-1F468-1F468-1F466-1F466 { background-position: -200px -540px; } +.emoji-1F468-1F468-1F467 { background-position: -220px -540px; } +.emoji-1F468-1F468-1F467-1F466 { background-position: -240px -540px; } +.emoji-1F468-1F468-1F467-1F467 { background-position: -260px -540px; } +.emoji-1F468-1F469-1F466-1F466 { background-position: -280px -540px; } +.emoji-1F468-1F469-1F467 { background-position: -300px -540px; } +.emoji-1F468-1F469-1F467-1F466 { background-position: -320px -540px; } +.emoji-1F468-1F469-1F467-1F467 { background-position: -340px -540px; } +.emoji-1F468-2764-1F468 { background-position: -360px -540px; } +.emoji-1F468-2764-1F48B-1F468 { background-position: -380px -540px; } +.emoji-1F469 { background-position: -400px -540px; } +.emoji-1F469-1F3FB { background-position: -420px -540px; } +.emoji-1F469-1F3FC { background-position: -440px -540px; } +.emoji-1F469-1F3FD { background-position: -460px -540px; } +.emoji-1F469-1F3FE { background-position: -480px -540px; } +.emoji-1F469-1F3FF { background-position: -500px -540px; } +.emoji-1F469-1F469-1F466 { background-position: -520px -540px; } +.emoji-1F469-1F469-1F466-1F466 { background-position: -540px -540px; } +.emoji-1F469-1F469-1F467 { background-position: -560px 0; } +.emoji-1F469-1F469-1F467-1F466 { background-position: -560px -20px; } +.emoji-1F469-1F469-1F467-1F467 { background-position: -560px -40px; } +.emoji-1F469-2764-1F469 { background-position: -560px -60px; } +.emoji-1F469-2764-1F48B-1F469 { background-position: -560px -80px; } +.emoji-1F46A { background-position: -560px -100px; } +.emoji-1F46B { background-position: -560px -120px; } +.emoji-1F46C { background-position: -560px -140px; } +.emoji-1F46D { background-position: -560px -160px; } +.emoji-1F46E { background-position: -560px -180px; } +.emoji-1F46E-1F3FB { background-position: -560px -200px; } +.emoji-1F46E-1F3FC { background-position: -560px -220px; } +.emoji-1F46E-1F3FD { background-position: -560px -240px; } +.emoji-1F46E-1F3FE { background-position: -560px -260px; } +.emoji-1F46E-1F3FF { background-position: -560px -280px; } +.emoji-1F46F { background-position: -560px -300px; } +.emoji-1F470 { background-position: -560px -320px; } +.emoji-1F470-1F3FB { background-position: -560px -340px; } +.emoji-1F470-1F3FC { background-position: -560px -360px; } +.emoji-1F470-1F3FD { background-position: -560px -380px; } +.emoji-1F470-1F3FE { background-position: -560px -400px; } +.emoji-1F470-1F3FF { background-position: -560px -420px; } +.emoji-1F471 { background-position: -560px -440px; } +.emoji-1F471-1F3FB { background-position: -560px -460px; } +.emoji-1F471-1F3FC { background-position: -560px -480px; } +.emoji-1F471-1F3FD { background-position: -560px -500px; } +.emoji-1F471-1F3FE { background-position: -560px -520px; } +.emoji-1F471-1F3FF { background-position: -560px -540px; } +.emoji-1F472 { background-position: 0 -560px; } +.emoji-1F472-1F3FB { background-position: -20px -560px; } +.emoji-1F472-1F3FC { background-position: -40px -560px; } +.emoji-1F472-1F3FD { background-position: -60px -560px; } +.emoji-1F472-1F3FE { background-position: -80px -560px; } +.emoji-1F472-1F3FF { background-position: -100px -560px; } +.emoji-1F473 { background-position: -120px -560px; } +.emoji-1F473-1F3FB { background-position: -140px -560px; } +.emoji-1F473-1F3FC { background-position: -160px -560px; } +.emoji-1F473-1F3FD { background-position: -180px -560px; } +.emoji-1F473-1F3FE { background-position: -200px -560px; } +.emoji-1F473-1F3FF { background-position: -220px -560px; } +.emoji-1F474 { background-position: -240px -560px; } +.emoji-1F474-1F3FB { background-position: -260px -560px; } +.emoji-1F474-1F3FC { background-position: -280px -560px; } +.emoji-1F474-1F3FD { background-position: -300px -560px; } +.emoji-1F474-1F3FE { background-position: -320px -560px; } +.emoji-1F474-1F3FF { background-position: -340px -560px; } +.emoji-1F475 { background-position: -360px -560px; } +.emoji-1F475-1F3FB { background-position: -380px -560px; } +.emoji-1F475-1F3FC { background-position: -400px -560px; } +.emoji-1F475-1F3FD { background-position: -420px -560px; } +.emoji-1F475-1F3FE { background-position: -440px -560px; } +.emoji-1F475-1F3FF { background-position: -460px -560px; } +.emoji-1F476 { background-position: -480px -560px; } +.emoji-1F476-1F3FB { background-position: -500px -560px; } +.emoji-1F476-1F3FC { background-position: -520px -560px; } +.emoji-1F476-1F3FD { background-position: -540px -560px; } +.emoji-1F476-1F3FE { background-position: -560px -560px; } +.emoji-1F476-1F3FF { background-position: -580px 0; } +.emoji-1F477 { background-position: -580px -20px; } +.emoji-1F477-1F3FB { background-position: -580px -40px; } +.emoji-1F477-1F3FC { background-position: -580px -60px; } +.emoji-1F477-1F3FD { background-position: -580px -80px; } +.emoji-1F477-1F3FE { background-position: -580px -100px; } +.emoji-1F477-1F3FF { background-position: -580px -120px; } +.emoji-1F478 { background-position: -580px -140px; } +.emoji-1F478-1F3FB { background-position: -580px -160px; } +.emoji-1F478-1F3FC { background-position: -580px -180px; } +.emoji-1F478-1F3FD { background-position: -580px -200px; } +.emoji-1F478-1F3FE { background-position: -580px -220px; } +.emoji-1F478-1F3FF { background-position: -580px -240px; } +.emoji-1F479 { background-position: -580px -260px; } +.emoji-1F47A { background-position: -580px -280px; } +.emoji-1F47B { background-position: -580px -300px; } +.emoji-1F47C { background-position: -580px -320px; } +.emoji-1F47C-1F3FB { background-position: -580px -340px; } +.emoji-1F47C-1F3FC { background-position: -580px -360px; } +.emoji-1F47C-1F3FD { background-position: -580px -380px; } +.emoji-1F47C-1F3FE { background-position: -580px -400px; } +.emoji-1F47C-1F3FF { background-position: -580px -420px; } +.emoji-1F47D { background-position: -580px -440px; } +.emoji-1F47E { background-position: -580px -460px; } +.emoji-1F47F { background-position: -580px -480px; } +.emoji-1F480 { background-position: -580px -500px; } +.emoji-1F481 { background-position: -580px -520px; } +.emoji-1F481-1F3FB { background-position: -580px -540px; } +.emoji-1F481-1F3FC { background-position: -580px -560px; } +.emoji-1F481-1F3FD { background-position: 0 -580px; } +.emoji-1F481-1F3FE { background-position: -20px -580px; } +.emoji-1F481-1F3FF { background-position: -40px -580px; } +.emoji-1F482 { background-position: -60px -580px; } +.emoji-1F482-1F3FB { background-position: -80px -580px; } +.emoji-1F482-1F3FC { background-position: -100px -580px; } +.emoji-1F482-1F3FD { background-position: -120px -580px; } +.emoji-1F482-1F3FE { background-position: -140px -580px; } +.emoji-1F482-1F3FF { background-position: -160px -580px; } +.emoji-1F483 { background-position: -180px -580px; } +.emoji-1F483-1F3FB { background-position: -200px -580px; } +.emoji-1F483-1F3FC { background-position: -220px -580px; } +.emoji-1F483-1F3FD { background-position: -240px -580px; } +.emoji-1F483-1F3FE { background-position: -260px -580px; } +.emoji-1F483-1F3FF { background-position: -280px -580px; } +.emoji-1F484 { background-position: -300px -580px; } +.emoji-1F485 { background-position: -320px -580px; } +.emoji-1F485-1F3FB { background-position: -340px -580px; } +.emoji-1F485-1F3FC { background-position: -360px -580px; } +.emoji-1F485-1F3FD { background-position: -380px -580px; } +.emoji-1F485-1F3FE { background-position: -400px -580px; } +.emoji-1F485-1F3FF { background-position: -420px -580px; } +.emoji-1F486 { background-position: -440px -580px; } +.emoji-1F486-1F3FB { background-position: -460px -580px; } +.emoji-1F486-1F3FC { background-position: -480px -580px; } +.emoji-1F486-1F3FD { background-position: -500px -580px; } +.emoji-1F486-1F3FE { background-position: -520px -580px; } +.emoji-1F486-1F3FF { background-position: -540px -580px; } +.emoji-1F487 { background-position: -560px -580px; } +.emoji-1F487-1F3FB { background-position: -580px -580px; } +.emoji-1F487-1F3FC { background-position: -600px 0; } +.emoji-1F487-1F3FD { background-position: -600px -20px; } +.emoji-1F487-1F3FE { background-position: -600px -40px; } +.emoji-1F487-1F3FF { background-position: -600px -60px; } +.emoji-1F488 { background-position: -600px -80px; } +.emoji-1F489 { background-position: -600px -100px; } +.emoji-1F48A { background-position: -600px -120px; } +.emoji-1F48B { background-position: -600px -140px; } +.emoji-1F48C { background-position: -600px -160px; } +.emoji-1F48D { background-position: -600px -180px; } +.emoji-1F48E { background-position: -600px -200px; } +.emoji-1F48F { background-position: -600px -220px; } +.emoji-1F490 { background-position: -600px -240px; } +.emoji-1F491 { background-position: -600px -260px; } +.emoji-1F492 { background-position: -600px -280px; } +.emoji-1F493 { background-position: -600px -300px; } +.emoji-1F494 { background-position: -600px -320px; } +.emoji-1F495 { background-position: -600px -340px; } +.emoji-1F496 { background-position: -600px -360px; } +.emoji-1F497 { background-position: -600px -380px; } +.emoji-1F498 { background-position: -600px -400px; } +.emoji-1F499 { background-position: -600px -420px; } +.emoji-1F49A { background-position: -600px -440px; } +.emoji-1F49B { background-position: -600px -460px; } +.emoji-1F49C { background-position: -600px -480px; } +.emoji-1F49D { background-position: -600px -500px; } +.emoji-1F49E { background-position: -600px -520px; } +.emoji-1F49F { background-position: -600px -540px; } +.emoji-1F4A0 { background-position: -600px -560px; } +.emoji-1F4A1 { background-position: -600px -580px; } +.emoji-1F4A2 { background-position: 0 -600px; } +.emoji-1F4A3 { background-position: -20px -600px; } +.emoji-1F4A4 { background-position: -40px -600px; } +.emoji-1F4A5 { background-position: -60px -600px; } +.emoji-1F4A6 { background-position: -80px -600px; } +.emoji-1F4A7 { background-position: -100px -600px; } +.emoji-1F4A8 { background-position: -120px -600px; } +.emoji-1F4A9 { background-position: -140px -600px; } +.emoji-1F4AA { background-position: -160px -600px; } +.emoji-1F4AA-1F3FB { background-position: -180px -600px; } +.emoji-1F4AA-1F3FC { background-position: -200px -600px; } +.emoji-1F4AA-1F3FD { background-position: -220px -600px; } +.emoji-1F4AA-1F3FE { background-position: -240px -600px; } +.emoji-1F4AA-1F3FF { background-position: -260px -600px; } +.emoji-1F4AB { background-position: -280px -600px; } +.emoji-1F4AC { background-position: -300px -600px; } +.emoji-1F4AD { background-position: -320px -600px; } +.emoji-1F4AE { background-position: -340px -600px; } +.emoji-1F4AF { background-position: -360px -600px; } +.emoji-1F4B0 { background-position: -380px -600px; } +.emoji-1F4B1 { background-position: -400px -600px; } +.emoji-1F4B2 { background-position: -420px -600px; } +.emoji-1F4B3 { background-position: -440px -600px; } +.emoji-1F4B4 { background-position: -460px -600px; } +.emoji-1F4B5 { background-position: -480px -600px; } +.emoji-1F4B6 { background-position: -500px -600px; } +.emoji-1F4B7 { background-position: -520px -600px; } +.emoji-1F4B8 { background-position: -540px -600px; } +.emoji-1F4B9 { background-position: -560px -600px; } +.emoji-1F4BA { background-position: -580px -600px; } +.emoji-1F4BB { background-position: -600px -600px; } +.emoji-1F4BC { background-position: -620px 0; } +.emoji-1F4BD { background-position: -620px -20px; } +.emoji-1F4BE { background-position: -620px -40px; } +.emoji-1F4BF { background-position: -620px -60px; } +.emoji-1F4C0 { background-position: -620px -80px; } +.emoji-1F4C1 { background-position: -620px -100px; } +.emoji-1F4C2 { background-position: -620px -120px; } +.emoji-1F4C3 { background-position: -620px -140px; } +.emoji-1F4C4 { background-position: -620px -160px; } +.emoji-1F4C5 { background-position: -620px -180px; } +.emoji-1F4C6 { background-position: -620px -200px; } +.emoji-1F4C7 { background-position: -620px -220px; } +.emoji-1F4C8 { background-position: -620px -240px; } +.emoji-1F4C9 { background-position: -620px -260px; } +.emoji-1F4CA { background-position: -620px -280px; } +.emoji-1F4CB { background-position: -620px -300px; } +.emoji-1F4CC { background-position: -620px -320px; } +.emoji-1F4CD { background-position: -620px -340px; } +.emoji-1F4CE { background-position: -620px -360px; } +.emoji-1F4CF { background-position: -620px -380px; } +.emoji-1F4D0 { background-position: -620px -400px; } +.emoji-1F4D1 { background-position: -620px -420px; } +.emoji-1F4D2 { background-position: -620px -440px; } +.emoji-1F4D3 { background-position: -620px -460px; } +.emoji-1F4D4 { background-position: -620px -480px; } +.emoji-1F4D5 { background-position: -620px -500px; } +.emoji-1F4D6 { background-position: -620px -520px; } +.emoji-1F4D7 { background-position: -620px -540px; } +.emoji-1F4D8 { background-position: -620px -560px; } +.emoji-1F4D9 { background-position: -620px -580px; } +.emoji-1F4DA { background-position: -620px -600px; } +.emoji-1F4DB { background-position: 0 -620px; } +.emoji-1F4DC { background-position: -20px -620px; } +.emoji-1F4DD { background-position: -40px -620px; } +.emoji-1F4DE { background-position: -60px -620px; } +.emoji-1F4DF { background-position: -80px -620px; } +.emoji-1F4E0 { background-position: -100px -620px; } +.emoji-1F4E1 { background-position: -120px -620px; } +.emoji-1F4E2 { background-position: -140px -620px; } +.emoji-1F4E3 { background-position: -160px -620px; } +.emoji-1F4E4 { background-position: -180px -620px; } +.emoji-1F4E5 { background-position: -200px -620px; } +.emoji-1F4E6 { background-position: -220px -620px; } +.emoji-1F4E7 { background-position: -240px -620px; } +.emoji-1F4E8 { background-position: -260px -620px; } +.emoji-1F4E9 { background-position: -280px -620px; } +.emoji-1F4EA { background-position: -300px -620px; } +.emoji-1F4EB { background-position: -320px -620px; } +.emoji-1F4EC { background-position: -340px -620px; } +.emoji-1F4ED { background-position: -360px -620px; } +.emoji-1F4EE { background-position: -380px -620px; } +.emoji-1F4EF { background-position: -400px -620px; } +.emoji-1F4F0 { background-position: -420px -620px; } +.emoji-1F4F1 { background-position: -440px -620px; } +.emoji-1F4F2 { background-position: -460px -620px; } +.emoji-1F4F3 { background-position: -480px -620px; } +.emoji-1F4F4 { background-position: -500px -620px; } +.emoji-1F4F5 { background-position: -520px -620px; } +.emoji-1F4F6 { background-position: -540px -620px; } +.emoji-1F4F7 { background-position: -560px -620px; } +.emoji-1F4F8 { background-position: -580px -620px; } +.emoji-1F4F9 { background-position: -600px -620px; } +.emoji-1F4FA { background-position: -620px -620px; } +.emoji-1F4FB { background-position: -640px 0; } +.emoji-1F4FC { background-position: -640px -20px; } +.emoji-1F4FD { background-position: -640px -40px; } +.emoji-1F4FF { background-position: -640px -60px; } +.emoji-1F500 { background-position: -640px -80px; } +.emoji-1F501 { background-position: -640px -100px; } +.emoji-1F502 { background-position: -640px -120px; } +.emoji-1F503 { background-position: -640px -140px; } +.emoji-1F504 { background-position: -640px -160px; } +.emoji-1F505 { background-position: -640px -180px; } +.emoji-1F506 { background-position: -640px -200px; } +.emoji-1F507 { background-position: -640px -220px; } +.emoji-1F508 { background-position: -640px -240px; } +.emoji-1F509 { background-position: -640px -260px; } +.emoji-1F50A { background-position: -640px -280px; } +.emoji-1F50B { background-position: -640px -300px; } +.emoji-1F50C { background-position: -640px -320px; } +.emoji-1F50D { background-position: -640px -340px; } +.emoji-1F50E { background-position: -640px -360px; } +.emoji-1F50F { background-position: -640px -380px; } +.emoji-1F510 { background-position: -640px -400px; } +.emoji-1F511 { background-position: -640px -420px; } +.emoji-1F512 { background-position: -640px -440px; } +.emoji-1F513 { background-position: -640px -460px; } +.emoji-1F514 { background-position: -640px -480px; } +.emoji-1F515 { background-position: -640px -500px; } +.emoji-1F516 { background-position: -640px -520px; } +.emoji-1F517 { background-position: -640px -540px; } +.emoji-1F518 { background-position: -640px -560px; } +.emoji-1F519 { background-position: -640px -580px; } +.emoji-1F51A { background-position: -640px -600px; } +.emoji-1F51B { background-position: -640px -620px; } +.emoji-1F51C { background-position: 0 -640px; } +.emoji-1F51D { background-position: -20px -640px; } +.emoji-1F51E { background-position: -40px -640px; } +.emoji-1F51F { background-position: -60px -640px; } +.emoji-1F520 { background-position: -80px -640px; } +.emoji-1F521 { background-position: -100px -640px; } +.emoji-1F522 { background-position: -120px -640px; } +.emoji-1F523 { background-position: -140px -640px; } +.emoji-1F524 { background-position: -160px -640px; } +.emoji-1F525 { background-position: -180px -640px; } +.emoji-1F526 { background-position: -200px -640px; } +.emoji-1F527 { background-position: -220px -640px; } +.emoji-1F528 { background-position: -240px -640px; } +.emoji-1F529 { background-position: -260px -640px; } +.emoji-1F52A { background-position: -280px -640px; } +.emoji-1F52B { background-position: -300px -640px; } +.emoji-1F52C { background-position: -320px -640px; } +.emoji-1F52D { background-position: -340px -640px; } +.emoji-1F52E { background-position: -360px -640px; } +.emoji-1F52F { background-position: -380px -640px; } +.emoji-1F530 { background-position: -400px -640px; } +.emoji-1F531 { background-position: -420px -640px; } +.emoji-1F532 { background-position: -440px -640px; } +.emoji-1F533 { background-position: -460px -640px; } +.emoji-1F534 { background-position: -480px -640px; } +.emoji-1F535 { background-position: -500px -640px; } +.emoji-1F536 { background-position: -520px -640px; } +.emoji-1F537 { background-position: -540px -640px; } +.emoji-1F538 { background-position: -560px -640px; } +.emoji-1F539 { background-position: -580px -640px; } +.emoji-1F53A { background-position: -600px -640px; } +.emoji-1F53B { background-position: -620px -640px; } +.emoji-1F53C { background-position: -640px -640px; } +.emoji-1F53D { background-position: -660px 0; } +.emoji-1F549 { background-position: -660px -20px; } +.emoji-1F54A { background-position: -660px -40px; } +.emoji-1F54B { background-position: -660px -60px; } +.emoji-1F54C { background-position: -660px -80px; } +.emoji-1F54D { background-position: -660px -100px; } +.emoji-1F54E { background-position: -660px -120px; } +.emoji-1F550 { background-position: -660px -140px; } +.emoji-1F551 { background-position: -660px -160px; } +.emoji-1F552 { background-position: -660px -180px; } +.emoji-1F553 { background-position: -660px -200px; } +.emoji-1F554 { background-position: -660px -220px; } +.emoji-1F555 { background-position: -660px -240px; } +.emoji-1F556 { background-position: -660px -260px; } +.emoji-1F557 { background-position: -660px -280px; } +.emoji-1F558 { background-position: -660px -300px; } +.emoji-1F559 { background-position: -660px -320px; } +.emoji-1F55A { background-position: -660px -340px; } +.emoji-1F55B { background-position: -660px -360px; } +.emoji-1F55C { background-position: -660px -380px; } +.emoji-1F55D { background-position: -660px -400px; } +.emoji-1F55E { background-position: -660px -420px; } +.emoji-1F55F { background-position: -660px -440px; } +.emoji-1F560 { background-position: -660px -460px; } +.emoji-1F561 { background-position: -660px -480px; } +.emoji-1F562 { background-position: -660px -500px; } +.emoji-1F563 { background-position: -660px -520px; } +.emoji-1F564 { background-position: -660px -540px; } +.emoji-1F565 { background-position: -660px -560px; } +.emoji-1F566 { background-position: -660px -580px; } +.emoji-1F567 { background-position: -660px -600px; } +.emoji-1F56F { background-position: -660px -620px; } +.emoji-1F570 { background-position: -660px -640px; } +.emoji-1F573 { background-position: 0 -660px; } +.emoji-1F574 { background-position: -20px -660px; } +.emoji-1F575 { background-position: -40px -660px; } +.emoji-1F575-1F3FB { background-position: -60px -660px; } +.emoji-1F575-1F3FC { background-position: -80px -660px; } +.emoji-1F575-1F3FD { background-position: -100px -660px; } +.emoji-1F575-1F3FE { background-position: -120px -660px; } +.emoji-1F575-1F3FF { background-position: -140px -660px; } +.emoji-1F576 { background-position: -160px -660px; } +.emoji-1F577 { background-position: -180px -660px; } +.emoji-1F578 { background-position: -200px -660px; } +.emoji-1F579 { background-position: -220px -660px; } +.emoji-1F57A { background-position: -240px -660px; } +.emoji-1F57A-1F3FB { background-position: -260px -660px; } +.emoji-1F57A-1F3FC { background-position: -280px -660px; } +.emoji-1F57A-1F3FD { background-position: -300px -660px; } +.emoji-1F57A-1F3FE { background-position: -320px -660px; } +.emoji-1F57A-1F3FF { background-position: -340px -660px; } +.emoji-1F587 { background-position: -360px -660px; } +.emoji-1F58A { background-position: -380px -660px; } +.emoji-1F58B { background-position: -400px -660px; } +.emoji-1F58C { background-position: -420px -660px; } +.emoji-1F58D { background-position: -440px -660px; } +.emoji-1F590 { background-position: -460px -660px; } +.emoji-1F590-1F3FB { background-position: -480px -660px; } +.emoji-1F590-1F3FC { background-position: -500px -660px; } +.emoji-1F590-1F3FD { background-position: -520px -660px; } +.emoji-1F590-1F3FE { background-position: -540px -660px; } +.emoji-1F590-1F3FF { background-position: -560px -660px; } +.emoji-1F595 { background-position: -580px -660px; } +.emoji-1F595-1F3FB { background-position: -600px -660px; } +.emoji-1F595-1F3FC { background-position: -620px -660px; } +.emoji-1F595-1F3FD { background-position: -640px -660px; } +.emoji-1F595-1F3FE { background-position: -660px -660px; } +.emoji-1F595-1F3FF { background-position: -680px 0; } +.emoji-1F596 { background-position: -680px -20px; } +.emoji-1F596-1F3FB { background-position: -680px -40px; } +.emoji-1F596-1F3FC { background-position: -680px -60px; } +.emoji-1F596-1F3FD { background-position: -680px -80px; } +.emoji-1F596-1F3FE { background-position: -680px -100px; } +.emoji-1F596-1F3FF { background-position: -680px -120px; } +.emoji-1F5A4 { background-position: -680px -140px; } +.emoji-1F5A5 { background-position: -680px -160px; } +.emoji-1F5A8 { background-position: -680px -180px; } +.emoji-1F5B1 { background-position: -680px -200px; } +.emoji-1F5B2 { background-position: -680px -220px; } +.emoji-1F5BC { background-position: -680px -240px; } +.emoji-1F5C2 { background-position: -680px -260px; } +.emoji-1F5C3 { background-position: -680px -280px; } +.emoji-1F5C4 { background-position: -680px -300px; } +.emoji-1F5D1 { background-position: -680px -320px; } +.emoji-1F5D2 { background-position: -680px -340px; } +.emoji-1F5D3 { background-position: -680px -360px; } +.emoji-1F5DC { background-position: -680px -380px; } +.emoji-1F5DD { background-position: -680px -400px; } +.emoji-1F5DE { background-position: -680px -420px; } +.emoji-1F5E1 { background-position: -680px -440px; } +.emoji-1F5E3 { background-position: -680px -460px; } +.emoji-1F5EF { background-position: -680px -480px; } +.emoji-1F5F3 { background-position: -680px -500px; } +.emoji-1F5FA { background-position: -680px -520px; } +.emoji-1F5FB { background-position: -680px -540px; } +.emoji-1F5FC { background-position: -680px -560px; } +.emoji-1F5FD { background-position: -680px -580px; } +.emoji-1F5FE { background-position: -680px -600px; } +.emoji-1F5FF { background-position: -680px -620px; } +.emoji-1F600 { background-position: -680px -640px; } +.emoji-1F601 { background-position: -680px -660px; } +.emoji-1F602 { background-position: 0 -680px; } +.emoji-1F603 { background-position: -20px -680px; } +.emoji-1F604 { background-position: -40px -680px; } +.emoji-1F605 { background-position: -60px -680px; } +.emoji-1F606 { background-position: -80px -680px; } +.emoji-1F607 { background-position: -100px -680px; } +.emoji-1F608 { background-position: -120px -680px; } +.emoji-1F609 { background-position: -140px -680px; } +.emoji-1F60A { background-position: -160px -680px; } +.emoji-1F60B { background-position: -180px -680px; } +.emoji-1F60C { background-position: -200px -680px; } +.emoji-1F60D { background-position: -220px -680px; } +.emoji-1F60E { background-position: -240px -680px; } +.emoji-1F60F { background-position: -260px -680px; } +.emoji-1F610 { background-position: -280px -680px; } +.emoji-1F611 { background-position: -300px -680px; } +.emoji-1F612 { background-position: -320px -680px; } +.emoji-1F613 { background-position: -340px -680px; } +.emoji-1F614 { background-position: -360px -680px; } +.emoji-1F615 { background-position: -380px -680px; } +.emoji-1F616 { background-position: -400px -680px; } +.emoji-1F617 { background-position: -420px -680px; } +.emoji-1F618 { background-position: -440px -680px; } +.emoji-1F619 { background-position: -460px -680px; } +.emoji-1F61A { background-position: -480px -680px; } +.emoji-1F61B { background-position: -500px -680px; } +.emoji-1F61C { background-position: -520px -680px; } +.emoji-1F61D { background-position: -540px -680px; } +.emoji-1F61E { background-position: -560px -680px; } +.emoji-1F61F { background-position: -580px -680px; } +.emoji-1F620 { background-position: -600px -680px; } +.emoji-1F621 { background-position: -620px -680px; } +.emoji-1F622 { background-position: -640px -680px; } +.emoji-1F623 { background-position: -660px -680px; } +.emoji-1F624 { background-position: -680px -680px; } +.emoji-1F625 { background-position: -700px 0; } +.emoji-1F626 { background-position: -700px -20px; } +.emoji-1F627 { background-position: -700px -40px; } +.emoji-1F628 { background-position: -700px -60px; } +.emoji-1F629 { background-position: -700px -80px; } +.emoji-1F62A { background-position: -700px -100px; } +.emoji-1F62B { background-position: -700px -120px; } +.emoji-1F62C { background-position: -700px -140px; } +.emoji-1F62D { background-position: -700px -160px; } +.emoji-1F62E { background-position: -700px -180px; } +.emoji-1F62F { background-position: -700px -200px; } +.emoji-1F630 { background-position: -700px -220px; } +.emoji-1F631 { background-position: -700px -240px; } +.emoji-1F632 { background-position: -700px -260px; } +.emoji-1F633 { background-position: -700px -280px; } +.emoji-1F634 { background-position: -700px -300px; } +.emoji-1F635 { background-position: -700px -320px; } +.emoji-1F636 { background-position: -700px -340px; } +.emoji-1F637 { background-position: -700px -360px; } +.emoji-1F638 { background-position: -700px -380px; } +.emoji-1F639 { background-position: -700px -400px; } +.emoji-1F63A { background-position: -700px -420px; } +.emoji-1F63B { background-position: -700px -440px; } +.emoji-1F63C { background-position: -700px -460px; } +.emoji-1F63D { background-position: -700px -480px; } +.emoji-1F63E { background-position: -700px -500px; } +.emoji-1F63F { background-position: -700px -520px; } +.emoji-1F640 { background-position: -700px -540px; } +.emoji-1F641 { background-position: -700px -560px; } +.emoji-1F642 { background-position: -700px -580px; } +.emoji-1F643 { background-position: -700px -600px; } +.emoji-1F644 { background-position: -700px -620px; } +.emoji-1F645 { background-position: -700px -640px; } +.emoji-1F645-1F3FB { background-position: -700px -660px; } +.emoji-1F645-1F3FC { background-position: -700px -680px; } +.emoji-1F645-1F3FD { background-position: 0 -700px; } +.emoji-1F645-1F3FE { background-position: -20px -700px; } +.emoji-1F645-1F3FF { background-position: -40px -700px; } +.emoji-1F646 { background-position: -60px -700px; } +.emoji-1F646-1F3FB { background-position: -80px -700px; } +.emoji-1F646-1F3FC { background-position: -100px -700px; } +.emoji-1F646-1F3FD { background-position: -120px -700px; } +.emoji-1F646-1F3FE { background-position: -140px -700px; } +.emoji-1F646-1F3FF { background-position: -160px -700px; } +.emoji-1F647 { background-position: -180px -700px; } +.emoji-1F647-1F3FB { background-position: -200px -700px; } +.emoji-1F647-1F3FC { background-position: -220px -700px; } +.emoji-1F647-1F3FD { background-position: -240px -700px; } +.emoji-1F647-1F3FE { background-position: -260px -700px; } +.emoji-1F647-1F3FF { background-position: -280px -700px; } +.emoji-1F648 { background-position: -300px -700px; } +.emoji-1F649 { background-position: -320px -700px; } +.emoji-1F64A { background-position: -340px -700px; } +.emoji-1F64B { background-position: -360px -700px; } +.emoji-1F64B-1F3FB { background-position: -380px -700px; } +.emoji-1F64B-1F3FC { background-position: -400px -700px; } +.emoji-1F64B-1F3FD { background-position: -420px -700px; } +.emoji-1F64B-1F3FE { background-position: -440px -700px; } +.emoji-1F64B-1F3FF { background-position: -460px -700px; } +.emoji-1F64C { background-position: -480px -700px; } +.emoji-1F64C-1F3FB { background-position: -500px -700px; } +.emoji-1F64C-1F3FC { background-position: -520px -700px; } +.emoji-1F64C-1F3FD { background-position: -540px -700px; } +.emoji-1F64C-1F3FE { background-position: -560px -700px; } +.emoji-1F64C-1F3FF { background-position: -580px -700px; } +.emoji-1F64D { background-position: -600px -700px; } +.emoji-1F64D-1F3FB { background-position: -620px -700px; } +.emoji-1F64D-1F3FC { background-position: -640px -700px; } +.emoji-1F64D-1F3FD { background-position: -660px -700px; } +.emoji-1F64D-1F3FE { background-position: -680px -700px; } +.emoji-1F64D-1F3FF { background-position: -700px -700px; } +.emoji-1F64E { background-position: -720px 0; } +.emoji-1F64E-1F3FB { background-position: -720px -20px; } +.emoji-1F64E-1F3FC { background-position: -720px -40px; } +.emoji-1F64E-1F3FD { background-position: -720px -60px; } +.emoji-1F64E-1F3FE { background-position: -720px -80px; } +.emoji-1F64E-1F3FF { background-position: -720px -100px; } +.emoji-1F64F { background-position: -720px -120px; } +.emoji-1F64F-1F3FB { background-position: -720px -140px; } +.emoji-1F64F-1F3FC { background-position: -720px -160px; } +.emoji-1F64F-1F3FD { background-position: -720px -180px; } +.emoji-1F64F-1F3FE { background-position: -720px -200px; } +.emoji-1F64F-1F3FF { background-position: -720px -220px; } +.emoji-1F680 { background-position: -720px -240px; } +.emoji-1F681 { background-position: -720px -260px; } +.emoji-1F682 { background-position: -720px -280px; } +.emoji-1F683 { background-position: -720px -300px; } +.emoji-1F684 { background-position: -720px -320px; } +.emoji-1F685 { background-position: -720px -340px; } +.emoji-1F686 { background-position: -720px -360px; } +.emoji-1F687 { background-position: -720px -380px; } +.emoji-1F688 { background-position: -720px -400px; } +.emoji-1F689 { background-position: -720px -420px; } +.emoji-1F68A { background-position: -720px -440px; } +.emoji-1F68B { background-position: -720px -460px; } +.emoji-1F68C { background-position: -720px -480px; } +.emoji-1F68D { background-position: -720px -500px; } +.emoji-1F68E { background-position: -720px -520px; } +.emoji-1F68F { background-position: -720px -540px; } +.emoji-1F690 { background-position: -720px -560px; } +.emoji-1F691 { background-position: -720px -580px; } +.emoji-1F692 { background-position: -720px -600px; } +.emoji-1F693 { background-position: -720px -620px; } +.emoji-1F694 { background-position: -720px -640px; } +.emoji-1F695 { background-position: -720px -660px; } +.emoji-1F696 { background-position: -720px -680px; } +.emoji-1F697 { background-position: -720px -700px; } +.emoji-1F698 { background-position: 0 -720px; } +.emoji-1F699 { background-position: -20px -720px; } +.emoji-1F69A { background-position: -40px -720px; } +.emoji-1F69B { background-position: -60px -720px; } +.emoji-1F69C { background-position: -80px -720px; } +.emoji-1F69D { background-position: -100px -720px; } +.emoji-1F69E { background-position: -120px -720px; } +.emoji-1F69F { background-position: -140px -720px; } +.emoji-1F6A0 { background-position: -160px -720px; } +.emoji-1F6A1 { background-position: -180px -720px; } +.emoji-1F6A2 { background-position: -200px -720px; } +.emoji-1F6A3 { background-position: -220px -720px; } +.emoji-1F6A3-1F3FB { background-position: -240px -720px; } +.emoji-1F6A3-1F3FC { background-position: -260px -720px; } +.emoji-1F6A3-1F3FD { background-position: -280px -720px; } +.emoji-1F6A3-1F3FE { background-position: -300px -720px; } +.emoji-1F6A3-1F3FF { background-position: -320px -720px; } +.emoji-1F6A4 { background-position: -340px -720px; } +.emoji-1F6A5 { background-position: -360px -720px; } +.emoji-1F6A6 { background-position: -380px -720px; } +.emoji-1F6A7 { background-position: -400px -720px; } +.emoji-1F6A8 { background-position: -420px -720px; } +.emoji-1F6A9 { background-position: -440px -720px; } +.emoji-1F6AA { background-position: -460px -720px; } +.emoji-1F6AB { background-position: -480px -720px; } +.emoji-1F6AC { background-position: -500px -720px; } +.emoji-1F6AD { background-position: -520px -720px; } +.emoji-1F6AE { background-position: -540px -720px; } +.emoji-1F6AF { background-position: -560px -720px; } +.emoji-1F6B0 { background-position: -580px -720px; } +.emoji-1F6B1 { background-position: -600px -720px; } +.emoji-1F6B2 { background-position: -620px -720px; } +.emoji-1F6B3 { background-position: -640px -720px; } +.emoji-1F6B4 { background-position: -660px -720px; } +.emoji-1F6B4-1F3FB { background-position: -680px -720px; } +.emoji-1F6B4-1F3FC { background-position: -700px -720px; } +.emoji-1F6B4-1F3FD { background-position: -720px -720px; } +.emoji-1F6B4-1F3FE { background-position: -740px 0; } +.emoji-1F6B4-1F3FF { background-position: -740px -20px; } +.emoji-1F6B5 { background-position: -740px -40px; } +.emoji-1F6B5-1F3FB { background-position: -740px -60px; } +.emoji-1F6B5-1F3FC { background-position: -740px -80px; } +.emoji-1F6B5-1F3FD { background-position: -740px -100px; } +.emoji-1F6B5-1F3FE { background-position: -740px -120px; } +.emoji-1F6B5-1F3FF { background-position: -740px -140px; } +.emoji-1F6B6 { background-position: -740px -160px; } +.emoji-1F6B6-1F3FB { background-position: -740px -180px; } +.emoji-1F6B6-1F3FC { background-position: -740px -200px; } +.emoji-1F6B6-1F3FD { background-position: -740px -220px; } +.emoji-1F6B6-1F3FE { background-position: -740px -240px; } +.emoji-1F6B6-1F3FF { background-position: -740px -260px; } +.emoji-1F6B7 { background-position: -740px -280px; } +.emoji-1F6B8 { background-position: -740px -300px; } +.emoji-1F6B9 { background-position: -740px -320px; } +.emoji-1F6BA { background-position: -740px -340px; } +.emoji-1F6BB { background-position: -740px -360px; } +.emoji-1F6BC { background-position: -740px -380px; } +.emoji-1F6BD { background-position: -740px -400px; } +.emoji-1F6BE { background-position: -740px -420px; } +.emoji-1F6BF { background-position: -740px -440px; } +.emoji-1F6C0 { background-position: -740px -460px; } +.emoji-1F6C0-1F3FB { background-position: -740px -480px; } +.emoji-1F6C0-1F3FC { background-position: -740px -500px; } +.emoji-1F6C0-1F3FD { background-position: -740px -520px; } +.emoji-1F6C0-1F3FE { background-position: -740px -540px; } +.emoji-1F6C0-1F3FF { background-position: -740px -560px; } +.emoji-1F6C1 { background-position: -740px -580px; } +.emoji-1F6C2 { background-position: -740px -600px; } +.emoji-1F6C3 { background-position: -740px -620px; } +.emoji-1F6C4 { background-position: -740px -640px; } +.emoji-1F6C5 { background-position: -740px -660px; } +.emoji-1F6CB { background-position: -740px -680px; } +.emoji-1F6CC { background-position: -740px -700px; } +.emoji-1F6CD { background-position: -740px -720px; } +.emoji-1F6CE { background-position: 0 -740px; } +.emoji-1F6CF { background-position: -20px -740px; } +.emoji-1F6D0 { background-position: -40px -740px; } +.emoji-1F6D1 { background-position: -60px -740px; } +.emoji-1F6D2 { background-position: -80px -740px; } +.emoji-1F6E0 { background-position: -100px -740px; } +.emoji-1F6E1 { background-position: -120px -740px; } +.emoji-1F6E2 { background-position: -140px -740px; } +.emoji-1F6E3 { background-position: -160px -740px; } +.emoji-1F6E4 { background-position: -180px -740px; } +.emoji-1F6E5 { background-position: -200px -740px; } +.emoji-1F6E9 { background-position: -220px -740px; } +.emoji-1F6EB { background-position: -240px -740px; } +.emoji-1F6EC { background-position: -260px -740px; } +.emoji-1F6F0 { background-position: -280px -740px; } +.emoji-1F6F3 { background-position: -300px -740px; } +.emoji-1F6F4 { background-position: -320px -740px; } +.emoji-1F6F5 { background-position: -340px -740px; } +.emoji-1F6F6 { background-position: -360px -740px; } +.emoji-1F910 { background-position: -380px -740px; } +.emoji-1F911 { background-position: -400px -740px; } +.emoji-1F912 { background-position: -420px -740px; } +.emoji-1F913 { background-position: -440px -740px; } +.emoji-1F914 { background-position: -460px -740px; } +.emoji-1F915 { background-position: -480px -740px; } +.emoji-1F916 { background-position: -500px -740px; } +.emoji-1F917 { background-position: -520px -740px; } +.emoji-1F918 { background-position: -540px -740px; } +.emoji-1F918-1F3FB { background-position: -560px -740px; } +.emoji-1F918-1F3FC { background-position: -580px -740px; } +.emoji-1F918-1F3FD { background-position: -600px -740px; } +.emoji-1F918-1F3FE { background-position: -620px -740px; } +.emoji-1F918-1F3FF { background-position: -640px -740px; } +.emoji-1F919 { background-position: -660px -740px; } +.emoji-1F919-1F3FB { background-position: -680px -740px; } +.emoji-1F919-1F3FC { background-position: -700px -740px; } +.emoji-1F919-1F3FD { background-position: -720px -740px; } +.emoji-1F919-1F3FE { background-position: -740px -740px; } +.emoji-1F919-1F3FF { background-position: -760px 0; } +.emoji-1F91A { background-position: -760px -20px; } +.emoji-1F91A-1F3FB { background-position: -760px -40px; } +.emoji-1F91A-1F3FC { background-position: -760px -60px; } +.emoji-1F91A-1F3FD { background-position: -760px -80px; } +.emoji-1F91A-1F3FE { background-position: -760px -100px; } +.emoji-1F91A-1F3FF { background-position: -760px -120px; } +.emoji-1F91B { background-position: -760px -140px; } +.emoji-1F91B-1F3FB { background-position: -760px -160px; } +.emoji-1F91B-1F3FC { background-position: -760px -180px; } +.emoji-1F91B-1F3FD { background-position: -760px -200px; } +.emoji-1F91B-1F3FE { background-position: -760px -220px; } +.emoji-1F91B-1F3FF { background-position: -760px -240px; } +.emoji-1F91C { background-position: -760px -260px; } +.emoji-1F91C-1F3FB { background-position: -760px -280px; } +.emoji-1F91C-1F3FC { background-position: -760px -300px; } +.emoji-1F91C-1F3FD { background-position: -760px -320px; } +.emoji-1F91C-1F3FE { background-position: -760px -340px; } +.emoji-1F91C-1F3FF { background-position: -760px -360px; } +.emoji-1F91D { background-position: -760px -380px; } +.emoji-1F91D-1F3FB { background-position: -760px -400px; } +.emoji-1F91D-1F3FC { background-position: -760px -420px; } +.emoji-1F91D-1F3FD { background-position: -760px -440px; } +.emoji-1F91D-1F3FE { background-position: -760px -460px; } +.emoji-1F91D-1F3FF { background-position: -760px -480px; } +.emoji-1F91E { background-position: -760px -500px; } +.emoji-1F91E-1F3FB { background-position: -760px -520px; } +.emoji-1F91E-1F3FC { background-position: -760px -540px; } +.emoji-1F91E-1F3FD { background-position: -760px -560px; } +.emoji-1F91E-1F3FE { background-position: -760px -580px; } +.emoji-1F91E-1F3FF { background-position: -760px -600px; } +.emoji-1F920 { background-position: -760px -620px; } +.emoji-1F921 { background-position: -760px -640px; } +.emoji-1F922 { background-position: -760px -660px; } +.emoji-1F923 { background-position: -760px -680px; } +.emoji-1F924 { background-position: -760px -700px; } +.emoji-1F925 { background-position: -760px -720px; } +.emoji-1F926 { background-position: -760px -740px; } +.emoji-1F926-1F3FB { background-position: 0 -760px; } +.emoji-1F926-1F3FC { background-position: -20px -760px; } +.emoji-1F926-1F3FD { background-position: -40px -760px; } +.emoji-1F926-1F3FE { background-position: -60px -760px; } +.emoji-1F926-1F3FF { background-position: -80px -760px; } +.emoji-1F927 { background-position: -100px -760px; } +.emoji-1F930 { background-position: -120px -760px; } +.emoji-1F930-1F3FB { background-position: -140px -760px; } +.emoji-1F930-1F3FC { background-position: -160px -760px; } +.emoji-1F930-1F3FD { background-position: -180px -760px; } +.emoji-1F930-1F3FE { background-position: -200px -760px; } +.emoji-1F930-1F3FF { background-position: -220px -760px; } +.emoji-1F933 { background-position: -240px -760px; } +.emoji-1F933-1F3FB { background-position: -260px -760px; } +.emoji-1F933-1F3FC { background-position: -280px -760px; } +.emoji-1F933-1F3FD { background-position: -300px -760px; } +.emoji-1F933-1F3FE { background-position: -320px -760px; } +.emoji-1F933-1F3FF { background-position: -340px -760px; } +.emoji-1F934 { background-position: -360px -760px; } +.emoji-1F934-1F3FB { background-position: -380px -760px; } +.emoji-1F934-1F3FC { background-position: -400px -760px; } +.emoji-1F934-1F3FD { background-position: -420px -760px; } +.emoji-1F934-1F3FE { background-position: -440px -760px; } +.emoji-1F934-1F3FF { background-position: -460px -760px; } +.emoji-1F935 { background-position: -480px -760px; } +.emoji-1F935-1F3FB { background-position: -500px -760px; } +.emoji-1F935-1F3FC { background-position: -520px -760px; } +.emoji-1F935-1F3FD { background-position: -540px -760px; } +.emoji-1F935-1F3FE { background-position: -560px -760px; } +.emoji-1F935-1F3FF { background-position: -580px -760px; } +.emoji-1F936 { background-position: -600px -760px; } +.emoji-1F936-1F3FB { background-position: -620px -760px; } +.emoji-1F936-1F3FC { background-position: -640px -760px; } +.emoji-1F936-1F3FD { background-position: -660px -760px; } +.emoji-1F936-1F3FE { background-position: -680px -760px; } +.emoji-1F936-1F3FF { background-position: -700px -760px; } +.emoji-1F937 { background-position: -720px -760px; } +.emoji-1F937-1F3FB { background-position: -740px -760px; } +.emoji-1F937-1F3FC { background-position: -760px -760px; } +.emoji-1F937-1F3FD { background-position: -780px 0; } +.emoji-1F937-1F3FE { background-position: -780px -20px; } +.emoji-1F937-1F3FF { background-position: -780px -40px; } +.emoji-1F938 { background-position: -780px -60px; } +.emoji-1F938-1F3FB { background-position: -780px -80px; } +.emoji-1F938-1F3FC { background-position: -780px -100px; } +.emoji-1F938-1F3FD { background-position: -780px -120px; } +.emoji-1F938-1F3FE { background-position: -780px -140px; } +.emoji-1F938-1F3FF { background-position: -780px -160px; } +.emoji-1F939 { background-position: -780px -180px; } +.emoji-1F939-1F3FB { background-position: -780px -200px; } +.emoji-1F939-1F3FC { background-position: -780px -220px; } +.emoji-1F939-1F3FD { background-position: -780px -240px; } +.emoji-1F939-1F3FE { background-position: -780px -260px; } +.emoji-1F939-1F3FF { background-position: -780px -280px; } +.emoji-1F93A { background-position: -780px -300px; } +.emoji-1F93C { background-position: -780px -320px; } +.emoji-1F93C-1F3FB { background-position: -780px -340px; } +.emoji-1F93C-1F3FC { background-position: -780px -360px; } +.emoji-1F93C-1F3FD { background-position: -780px -380px; } +.emoji-1F93C-1F3FE { background-position: -780px -400px; } +.emoji-1F93C-1F3FF { background-position: -780px -420px; } +.emoji-1F93D { background-position: -780px -440px; } +.emoji-1F93D-1F3FB { background-position: -780px -460px; } +.emoji-1F93D-1F3FC { background-position: -780px -480px; } +.emoji-1F93D-1F3FD { background-position: -780px -500px; } +.emoji-1F93D-1F3FE { background-position: -780px -520px; } +.emoji-1F93D-1F3FF { background-position: -780px -540px; } +.emoji-1F93E { background-position: -780px -560px; } +.emoji-1F93E-1F3FB { background-position: -780px -580px; } +.emoji-1F93E-1F3FC { background-position: -780px -600px; } +.emoji-1F93E-1F3FD { background-position: -780px -620px; } +.emoji-1F93E-1F3FE { background-position: -780px -640px; } +.emoji-1F93E-1F3FF { background-position: -780px -660px; } +.emoji-1F940 { background-position: -780px -680px; } +.emoji-1F941 { background-position: -780px -700px; } +.emoji-1F942 { background-position: -780px -720px; } +.emoji-1F943 { background-position: -780px -740px; } +.emoji-1F944 { background-position: -780px -760px; } +.emoji-1F945 { background-position: 0 -780px; } +.emoji-1F947 { background-position: -20px -780px; } +.emoji-1F948 { background-position: -40px -780px; } +.emoji-1F949 { background-position: -60px -780px; } +.emoji-1F94A { background-position: -80px -780px; } +.emoji-1F94B { background-position: -100px -780px; } +.emoji-1F950 { background-position: -120px -780px; } +.emoji-1F951 { background-position: -140px -780px; } +.emoji-1F952 { background-position: -160px -780px; } +.emoji-1F953 { background-position: -180px -780px; } +.emoji-1F954 { background-position: -200px -780px; } +.emoji-1F955 { background-position: -220px -780px; } +.emoji-1F956 { background-position: -240px -780px; } +.emoji-1F957 { background-position: -260px -780px; } +.emoji-1F958 { background-position: -280px -780px; } +.emoji-1F959 { background-position: -300px -780px; } +.emoji-1F95A { background-position: -320px -780px; } +.emoji-1F95B { background-position: -340px -780px; } +.emoji-1F95C { background-position: -360px -780px; } +.emoji-1F95D { background-position: -380px -780px; } +.emoji-1F95E { background-position: -400px -780px; } +.emoji-1F980 { background-position: -420px -780px; } +.emoji-1F981 { background-position: -440px -780px; } +.emoji-1F982 { background-position: -460px -780px; } +.emoji-1F983 { background-position: -480px -780px; } +.emoji-1F984 { background-position: -500px -780px; } +.emoji-1F985 { background-position: -520px -780px; } +.emoji-1F986 { background-position: -540px -780px; } +.emoji-1F987 { background-position: -560px -780px; } +.emoji-1F988 { background-position: -580px -780px; } +.emoji-1F989 { background-position: -600px -780px; } +.emoji-1F98A { background-position: -620px -780px; } +.emoji-1F98B { background-position: -640px -780px; } +.emoji-1F98C { background-position: -660px -780px; } +.emoji-1F98D { background-position: -680px -780px; } +.emoji-1F98E { background-position: -700px -780px; } +.emoji-1F98F { background-position: -720px -780px; } +.emoji-1F990 { background-position: -740px -780px; } +.emoji-1F991 { background-position: -760px -780px; } +.emoji-1F9C0 { background-position: -780px -780px; } +.emoji-203C { background-position: -800px 0; } +.emoji-2049 { background-position: -800px -20px; } +.emoji-2122 { background-position: -800px -40px; } +.emoji-2139 { background-position: -800px -60px; } +.emoji-2194 { background-position: -800px -80px; } +.emoji-2195 { background-position: -800px -100px; } +.emoji-2196 { background-position: -800px -120px; } +.emoji-2197 { background-position: -800px -140px; } +.emoji-2198 { background-position: -800px -160px; } +.emoji-2199 { background-position: -800px -180px; } +.emoji-21A9 { background-position: -800px -200px; } +.emoji-21AA { background-position: -800px -220px; } +.emoji-231A { background-position: -800px -240px; } +.emoji-231B { background-position: -800px -260px; } +.emoji-2328 { background-position: -800px -280px; } +.emoji-23CF { background-position: -800px -300px; } +.emoji-23E9 { background-position: -800px -320px; } +.emoji-23EA { background-position: -800px -340px; } +.emoji-23EB { background-position: -800px -360px; } +.emoji-23EC { background-position: -800px -380px; } +.emoji-23ED { background-position: -800px -400px; } +.emoji-23EE { background-position: -800px -420px; } +.emoji-23EF { background-position: -800px -440px; } +.emoji-23F0 { background-position: -800px -460px; } +.emoji-23F1 { background-position: -800px -480px; } +.emoji-23F2 { background-position: -800px -500px; } +.emoji-23F3 { background-position: -800px -520px; } +.emoji-23F8 { background-position: -800px -540px; } +.emoji-23F9 { background-position: -800px -560px; } +.emoji-23FA { background-position: -800px -580px; } +.emoji-24C2 { background-position: -800px -600px; } +.emoji-25AA { background-position: -800px -620px; } +.emoji-25AB { background-position: -800px -640px; } +.emoji-25B6 { background-position: -800px -660px; } +.emoji-25C0 { background-position: -800px -680px; } +.emoji-25FB { background-position: -800px -700px; } +.emoji-25FC { background-position: -800px -720px; } +.emoji-25FD { background-position: -800px -740px; } +.emoji-25FE { background-position: -800px -760px; } +.emoji-2600 { background-position: -800px -780px; } +.emoji-2601 { background-position: 0 -800px; } +.emoji-2602 { background-position: -20px -800px; } +.emoji-2603 { background-position: -40px -800px; } +.emoji-2604 { background-position: -60px -800px; } +.emoji-260E { background-position: -80px -800px; } +.emoji-2611 { background-position: -100px -800px; } +.emoji-2614 { background-position: -120px -800px; } +.emoji-2615 { background-position: -140px -800px; } +.emoji-2618 { background-position: -160px -800px; } +.emoji-261D { background-position: -180px -800px; } +.emoji-261D-1F3FB { background-position: -200px -800px; } +.emoji-261D-1F3FC { background-position: -220px -800px; } +.emoji-261D-1F3FD { background-position: -240px -800px; } +.emoji-261D-1F3FE { background-position: -260px -800px; } +.emoji-261D-1F3FF { background-position: -280px -800px; } +.emoji-2620 { background-position: -300px -800px; } +.emoji-2622 { background-position: -320px -800px; } +.emoji-2623 { background-position: -340px -800px; } +.emoji-2626 { background-position: -360px -800px; } +.emoji-262A { background-position: -380px -800px; } +.emoji-262E { background-position: -400px -800px; } +.emoji-262F { background-position: -420px -800px; } +.emoji-2638 { background-position: -440px -800px; } +.emoji-2639 { background-position: -460px -800px; } +.emoji-263A { background-position: -480px -800px; } +.emoji-2648 { background-position: -500px -800px; } +.emoji-2649 { background-position: -520px -800px; } +.emoji-264A { background-position: -540px -800px; } +.emoji-264B { background-position: -560px -800px; } +.emoji-264C { background-position: -580px -800px; } +.emoji-264D { background-position: -600px -800px; } +.emoji-264E { background-position: -620px -800px; } +.emoji-264F { background-position: -640px -800px; } +.emoji-2650 { background-position: -660px -800px; } +.emoji-2651 { background-position: -680px -800px; } +.emoji-2652 { background-position: -700px -800px; } +.emoji-2653 { background-position: -720px -800px; } +.emoji-2660 { background-position: -740px -800px; } +.emoji-2663 { background-position: -760px -800px; } +.emoji-2665 { background-position: -780px -800px; } +.emoji-2666 { background-position: -800px -800px; } +.emoji-2668 { background-position: -820px 0; } +.emoji-267B { background-position: -820px -20px; } +.emoji-267F { background-position: -820px -40px; } +.emoji-2692 { background-position: -820px -60px; } +.emoji-2693 { background-position: -820px -80px; } +.emoji-2694 { background-position: -820px -100px; } +.emoji-2696 { background-position: -820px -120px; } +.emoji-2697 { background-position: -820px -140px; } +.emoji-2699 { background-position: -820px -160px; } +.emoji-269B { background-position: -820px -180px; } +.emoji-269C { background-position: -820px -200px; } +.emoji-26A0 { background-position: -820px -220px; } +.emoji-26A1 { background-position: -820px -240px; } +.emoji-26AA { background-position: -820px -260px; } +.emoji-26AB { background-position: -820px -280px; } +.emoji-26B0 { background-position: -820px -300px; } +.emoji-26B1 { background-position: -820px -320px; } +.emoji-26BD { background-position: -820px -340px; } +.emoji-26BE { background-position: -820px -360px; } +.emoji-26C4 { background-position: -820px -380px; } +.emoji-26C5 { background-position: -820px -400px; } +.emoji-26C8 { background-position: -820px -420px; } +.emoji-26CE { background-position: -820px -440px; } +.emoji-26CF { background-position: -820px -460px; } +.emoji-26D1 { background-position: -820px -480px; } +.emoji-26D3 { background-position: -820px -500px; } +.emoji-26D4 { background-position: -820px -520px; } +.emoji-26E9 { background-position: -820px -540px; } +.emoji-26EA { background-position: -820px -560px; } +.emoji-26F0 { background-position: -820px -580px; } +.emoji-26F1 { background-position: -820px -600px; } +.emoji-26F2 { background-position: -820px -620px; } +.emoji-26F3 { background-position: -820px -640px; } +.emoji-26F4 { background-position: -820px -660px; } +.emoji-26F5 { background-position: -820px -680px; } +.emoji-26F7 { background-position: -820px -700px; } +.emoji-26F8 { background-position: -820px -720px; } +.emoji-26F9 { background-position: -820px -740px; } +.emoji-26F9-1F3FB { background-position: -820px -760px; } +.emoji-26F9-1F3FC { background-position: -820px -780px; } +.emoji-26F9-1F3FD { background-position: -820px -800px; } +.emoji-26F9-1F3FE { background-position: 0 -820px; } +.emoji-26F9-1F3FF { background-position: -20px -820px; } +.emoji-26FA { background-position: -40px -820px; } +.emoji-26FD { background-position: -60px -820px; } +.emoji-2702 { background-position: -80px -820px; } +.emoji-2705 { background-position: -100px -820px; } +.emoji-2708 { background-position: -120px -820px; } +.emoji-2709 { background-position: -140px -820px; } +.emoji-270A { background-position: -160px -820px; } +.emoji-270A-1F3FB { background-position: -180px -820px; } +.emoji-270A-1F3FC { background-position: -200px -820px; } +.emoji-270A-1F3FD { background-position: -220px -820px; } +.emoji-270A-1F3FE { background-position: -240px -820px; } +.emoji-270A-1F3FF { background-position: -260px -820px; } +.emoji-270B { background-position: -280px -820px; } +.emoji-270B-1F3FB { background-position: -300px -820px; } +.emoji-270B-1F3FC { background-position: -320px -820px; } +.emoji-270B-1F3FD { background-position: -340px -820px; } +.emoji-270B-1F3FE { background-position: -360px -820px; } +.emoji-270B-1F3FF { background-position: -380px -820px; } +.emoji-270C { background-position: -400px -820px; } +.emoji-270C-1F3FB { background-position: -420px -820px; } +.emoji-270C-1F3FC { background-position: -440px -820px; } +.emoji-270C-1F3FD { background-position: -460px -820px; } +.emoji-270C-1F3FE { background-position: -480px -820px; } +.emoji-270C-1F3FF { background-position: -500px -820px; } +.emoji-270D { background-position: -520px -820px; } +.emoji-270D-1F3FB { background-position: -540px -820px; } +.emoji-270D-1F3FC { background-position: -560px -820px; } +.emoji-270D-1F3FD { background-position: -580px -820px; } +.emoji-270D-1F3FE { background-position: -600px -820px; } +.emoji-270D-1F3FF { background-position: -620px -820px; } +.emoji-270F { background-position: -640px -820px; } +.emoji-2712 { background-position: -660px -820px; } +.emoji-2714 { background-position: -680px -820px; } +.emoji-2716 { background-position: -700px -820px; } +.emoji-271D { background-position: -720px -820px; } +.emoji-2721 { background-position: -740px -820px; } +.emoji-2728 { background-position: -760px -820px; } +.emoji-2733 { background-position: -780px -820px; } +.emoji-2734 { background-position: -800px -820px; } +.emoji-2744 { background-position: -820px -820px; } +.emoji-2747 { background-position: -840px 0; } +.emoji-274C { background-position: -840px -20px; } +.emoji-274E { background-position: -840px -40px; } +.emoji-2753 { background-position: -840px -60px; } +.emoji-2754 { background-position: -840px -80px; } +.emoji-2755 { background-position: -840px -100px; } +.emoji-2757 { background-position: -840px -120px; } +.emoji-2763 { background-position: -840px -140px; } +.emoji-2764 { background-position: -840px -160px; } +.emoji-2795 { background-position: -840px -180px; } +.emoji-2796 { background-position: -840px -200px; } +.emoji-2797 { background-position: -840px -220px; } +.emoji-27A1 { background-position: -840px -240px; } +.emoji-27B0 { background-position: -840px -260px; } +.emoji-27BF { background-position: -840px -280px; } +.emoji-2934 { background-position: -840px -300px; } +.emoji-2935 { background-position: -840px -320px; } +.emoji-2B05 { background-position: -840px -340px; } +.emoji-2B06 { background-position: -840px -360px; } +.emoji-2B07 { background-position: -840px -380px; } +.emoji-2B1B { background-position: -840px -400px; } +.emoji-2B1C { background-position: -840px -420px; } +.emoji-2B50 { background-position: -840px -440px; } +.emoji-2B55 { background-position: -840px -460px; } +.emoji-3030 { background-position: -840px -480px; } +.emoji-303D { background-position: -840px -500px; } +.emoji-3297 { background-position: -840px -520px; } +.emoji-3299 { background-position: -840px -540px; } .emoji-icon { background-image: image-url('emoji.png'); @@ -1731,6 +1804,6 @@ only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { background-image: image-url('emoji@2x.png'); - background-size: 840px 820px; + background-size: 860px 840px; } } diff --git a/app/assets/stylesheets/pages/issuable.scss b/app/assets/stylesheets/pages/issuable.scss index 542fa244689ac63dda5428540aac9667c3892a22..ded437625eefa25a61f77523ba213b113f137e27 100644 --- a/app/assets/stylesheets/pages/issuable.scss +++ b/app/assets/stylesheets/pages/issuable.scss @@ -122,7 +122,8 @@ button { float: right; - padding: 3px 5px; + padding: 1px 5px; + background-color: $gray-light; } } diff --git a/app/assets/stylesheets/pages/issues.scss b/app/assets/stylesheets/pages/issues.scss index 0e4d8c140aa2d7a6cdc77d58022ca6e88f9af32f..ee3b2d2b8017221a2a674fe29c80e5e3c244cc62 100644 --- a/app/assets/stylesheets/pages/issues.scss +++ b/app/assets/stylesheets/pages/issues.scss @@ -63,7 +63,7 @@ form.edit-issue { .merge-request, .issue { &.today { - background: #f8feef; + background: #f3fff2; border-color: #e1e8d5; } @@ -78,6 +78,14 @@ form.edit-issue { } } +.merge-request-ci-status { + svg { + margin-right: 4px; + position: relative; + top: 1px; + } +} + @media (max-width: $screen-xs-max) { .issue-btn-group { width: 100%; diff --git a/app/assets/stylesheets/pages/merge_requests.scss b/app/assets/stylesheets/pages/merge_requests.scss index 15c6c9f231aa06cecce6b713ac1186e722a8a749..5254faf723db65efbbdaf28711eb79fba5153d24 100644 --- a/app/assets/stylesheets/pages/merge_requests.scss +++ b/app/assets/stylesheets/pages/merge_requests.scss @@ -60,8 +60,10 @@ .ci_widget { border-bottom: 1px solid #eef0f2; - i { + svg { margin-right: 4px; + position: relative; + top: 1px; } &.ci-success { @@ -196,6 +198,16 @@ .merge-request-title { margin-bottom: 2px; + + .ci-status-link { + + svg { + height: 16px; + width: 16px; + position: relative; + top: 3px; + } + } } } @@ -270,7 +282,7 @@ .item-title { @media (min-width: $screen-sm-min) { - width: 49%; + width: 45%; } } diff --git a/app/assets/stylesheets/pages/pipelines.scss b/app/assets/stylesheets/pages/pipelines.scss index a0334207c683fe4f933c8b3a454321c13070c749..a404f108dc47dad9e94a2aa16c2df4b52cbd8f56 100644 --- a/app/assets/stylesheets/pages/pipelines.scss +++ b/app/assets/stylesheets/pages/pipelines.scss @@ -1,7 +1,7 @@ .pipelines { .stage { - max-width: 80px; - width: 80px; + max-width: 90px; + width: 90px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; @@ -30,13 +30,17 @@ } .table.builds { - min-width: 1100px; + min-width: 1200px; tr { th { - padding: 16px; + padding: 16px 8px; border: none; } + + td { + padding: 10px 8px; + } } tbody { @@ -45,6 +49,14 @@ .commit-link { + .ci-status { + + svg { + top: 1px; + margin-right: 0; + } + } + a:hover { text-decoration: none; } @@ -53,9 +65,8 @@ .branch-commit { .branch-name { - margin-left: 8px; font-weight: bold; - max-width: 180px; + max-width: 150px; overflow: hidden; display: inline-block; white-space: nowrap; @@ -64,10 +75,15 @@ } svg { - margin: 0 6px; height: 14px; width: auto; vertical-align: middle; + fill: $table-text-gray; + } + + .fa { + font-size: 12px; + color: $table-text-gray; } .commit-id { @@ -100,6 +116,31 @@ } } + .icon-container { + display: inline-block; + text-align: right; + width: 20px; + + .fa { + position: relative; + right: 3px; + } + + svg { + position: relative; + right: 1px; + } + } + + .stage-cell { + + svg { + height: 18px; + width: 18px; + vertical-align: middle; + } + } + .duration, .finished-at { color: $table-text-gray; @@ -107,21 +148,19 @@ .fa { font-size: 12px; + margin-right: 4px; } svg { - height: 12px; - width: auto; + width: 12px; + height: auto; vertical-align: middle; - } - - .fa, - svg { - margin-right: 5px; + margin-right: 4px; } } .pipeline-actions { + min-width: 140px; .btn { margin: 0; diff --git a/app/assets/stylesheets/pages/projects.scss b/app/assets/stylesheets/pages/projects.scss index ea9f7cf054050abea65ec987b99fc9d0bb891818..63853335fb6ede7692ea731b5d4a7e3307130d80 100644 --- a/app/assets/stylesheets/pages/projects.scss +++ b/app/assets/stylesheets/pages/projects.scss @@ -129,6 +129,17 @@ color: $layout-link-gray; } + svg { + + path { + fill: $layout-link-gray; + } + + use { + stroke: $layout-link-gray; + } + } + .fa-caret-down { margin-left: 3px; } @@ -486,6 +497,11 @@ pre.light-well { > span { margin-left: 10px; } + + svg { + position: relative; + top: 2px; + } } } diff --git a/app/assets/stylesheets/pages/status.scss b/app/assets/stylesheets/pages/status.scss index c6b053150be4cc3c92ee33ba241349816b6bb26a..a22d4b6f6be66b02eaa675a32e9eb62926b5bb79 100644 --- a/app/assets/stylesheets/pages/status.scss +++ b/app/assets/stylesheets/pages/status.scss @@ -41,6 +41,14 @@ color: $blue-normal; border-color: $blue-normal; } + + svg { + height: 13px; + width: 13px; + position: relative; + top: 1px; + margin: 0 3px; + } } .ci-status-icon-success { diff --git a/app/assets/stylesheets/pages/tags.scss b/app/assets/stylesheets/pages/tags.scss new file mode 100644 index 0000000000000000000000000000000000000000..24ebd3e7cfa940722d2c4254389489883cd8fca7 --- /dev/null +++ b/app/assets/stylesheets/pages/tags.scss @@ -0,0 +1,7 @@ +.tag-buttons { + line-height: 40px; + + .btn:not(.dropdown-toggle) { + margin-left: 10px; + } +} diff --git a/app/assets/stylesheets/pages/tree.scss b/app/assets/stylesheets/pages/tree.scss index 42a20e9775fc045699d5729727ca6459083d5367..390977297fb4c34bc3f4783775e5d003c0fd74ba 100644 --- a/app/assets/stylesheets/pages/tree.scss +++ b/app/assets/stylesheets/pages/tree.scss @@ -19,7 +19,7 @@ border-top: 1px solid $table-border-gray; td, th { - line-height: 23px; + line-height: 21px; } &:hover { diff --git a/app/controllers/admin/builds_controller.rb b/app/controllers/admin/builds_controller.rb index 0db91eaaf2e5b9ad4d3fc3560454b27fee5bbc67..88f3c0e2fd4f3cefc472f72b0661139426036991 100644 --- a/app/controllers/admin/builds_controller.rb +++ b/app/controllers/admin/builds_controller.rb @@ -5,8 +5,10 @@ class Admin::BuildsController < Admin::ApplicationController @builds = @all_builds.order('created_at DESC') @builds = case @scope + when 'pending' + @builds.pending.reverse_order when 'running' - @builds.running_or_pending.reverse_order + @builds.running.reverse_order when 'finished' @builds.finished else diff --git a/app/controllers/concerns/creates_commit.rb b/app/controllers/concerns/creates_commit.rb index dacb5679dd300fde4a034ba762960ee5a41610e7..f2b8f297bc27886a536478ba77aeb82304cfaa56 100644 --- a/app/controllers/concerns/creates_commit.rb +++ b/app/controllers/concerns/creates_commit.rb @@ -7,7 +7,8 @@ module CreatesCommit commit_params = @commit_params.merge( source_project: @project, source_branch: @ref, - target_branch: @target_branch + target_branch: @target_branch, + previous_path: @previous_path ) result = service.new(@tree_edit_project, current_user, commit_params).execute diff --git a/app/controllers/concerns/diff_for_path.rb b/app/controllers/concerns/diff_for_path.rb index e09b8789eb239ef8b83f1eef2d59710ede432de3..026d8b2e1e0f691e21cdce694f535a8b8a603071 100644 --- a/app/controllers/concerns/diff_for_path.rb +++ b/app/controllers/concerns/diff_for_path.rb @@ -10,7 +10,6 @@ module DiffForPath diff_commit = commit_for_diff(diff_file) blob = diff_file.blob(diff_commit) - @expand_all_diffs = true locals = { diff_file: diff_file, diff --git a/app/controllers/projects/blob_controller.rb b/app/controllers/projects/blob_controller.rb index 5356fdf010df794cc86314602ecd9c21a31b809a..eda3727a28de2ebc788e41fbc12f86dd46831b79 100644 --- a/app/controllers/projects/blob_controller.rb +++ b/app/controllers/projects/blob_controller.rb @@ -38,6 +38,12 @@ class Projects::BlobController < Projects::ApplicationController end def update + if params[:file_path].present? + @previous_path = @path + @path = params[:file_path] + @commit_params[:file_path] = @path + end + after_edit_path = if from_merge_request && @target_branch == @ref diffs_namespace_project_merge_request_path(from_merge_request.target_project.namespace, from_merge_request.target_project, from_merge_request) + diff --git a/app/controllers/projects/builds_controller.rb b/app/controllers/projects/builds_controller.rb index ef3051d7519c8e4d551b04b13cf7367bab34e4cf..553b62741a5de091ad536aa467686d2ac1794014 100644 --- a/app/controllers/projects/builds_controller.rb +++ b/app/controllers/projects/builds_controller.rb @@ -1,6 +1,6 @@ class Projects::BuildsController < Projects::ApplicationController before_action :build, except: [:index, :cancel_all] - before_action :authorize_read_build!, except: [:cancel, :cancel_all, :retry] + before_action :authorize_read_build!, except: [:cancel, :cancel_all, :retry, :play] before_action :authorize_update_build!, except: [:index, :show, :status, :raw] layout 'project' @@ -10,8 +10,10 @@ class Projects::BuildsController < Projects::ApplicationController @builds = @all_builds.order('created_at DESC') @builds = case @scope + when 'pending' + @builds.pending.reverse_order when 'running' - @builds.running_or_pending.reverse_order + @builds.running.reverse_order when 'finished' @builds.finished else @@ -47,14 +49,19 @@ class Projects::BuildsController < Projects::ApplicationController end def retry - unless @build.retryable? - return render_404 - end + return render_404 unless @build.retryable? build = Ci::Build.retry(@build, current_user) redirect_to build_path(build) end + def play + return render_404 unless @build.playable? + + build = @build.play(current_user) + redirect_to build_path(build) + end + def cancel @build.cancel redirect_to build_path(@build) diff --git a/app/controllers/projects/issues_controller.rb b/app/controllers/projects/issues_controller.rb index b6e80762e3c5a00637c60af3957d856c34861d76..fa663c9bda4f0e24ca5133bdbca33a1cbe7ae395 100644 --- a/app/controllers/projects/issues_controller.rb +++ b/app/controllers/projects/issues_controller.rb @@ -226,6 +226,7 @@ class Projects::IssuesController < Projects::ApplicationController :assignee_id, :milestone_id, :state_event, + :subscription_event, label_ids: [], add_label_ids: [], remove_label_ids: [] diff --git a/app/controllers/projects/protected_branches_controller.rb b/app/controllers/projects/protected_branches_controller.rb index 80dad758afa298d229abad2aaafc3a33b251b39c..10dca47fdede1c49b774663d3a28c6f35899c48e 100644 --- a/app/controllers/projects/protected_branches_controller.rb +++ b/app/controllers/projects/protected_branches_controller.rb @@ -50,6 +50,6 @@ class Projects::ProtectedBranchesController < Projects::ApplicationController end def protected_branch_params - params.require(:protected_branch).permit(:name, :developers_can_push) + params.require(:protected_branch).permit(:name, :developers_can_push, :developers_can_merge) end end diff --git a/app/controllers/projects/services_controller.rb b/app/controllers/projects/services_controller.rb index 739681f4085b8e4594c3e2f47183760340dd4cec..1b91882048e3626313b6344abaf272ad66fc3857 100644 --- a/app/controllers/projects/services_controller.rb +++ b/app/controllers/projects/services_controller.rb @@ -45,8 +45,9 @@ class Projects::ServicesController < Projects::ApplicationController end def test - data = Gitlab::PushDataBuilder.build_sample(project, current_user) + data = @service.test_data(project, current_user) outcome = @service.test(data) + if outcome[:success] message = { notice: 'We sent a request to the provided URL' } else diff --git a/app/controllers/projects_controller.rb b/app/controllers/projects_controller.rb index 1803aa8eab475e6540a8acf874d85657556b5070..4e5bcff9cf843eaf67752959a628997d28241ebe 100644 --- a/app/controllers/projects_controller.rb +++ b/app/controllers/projects_controller.rb @@ -5,7 +5,7 @@ class ProjectsController < Projects::ApplicationController before_action :project, except: [:new, :create] before_action :repository, except: [:new, :create] before_action :assign_ref_vars, only: [:show], if: :repo_exists? - before_action :tree, only: [:show], if: :project_view_files? + before_action :tree, only: [:show], if: [:repo_exists?, :project_view_files?] # Authorize before_action :authorize_admin_project!, only: [:edit, :update, :housekeeping, :download_export, :export, :remove_export, :generate_new_export] diff --git a/app/helpers/branches_helper.rb b/app/helpers/branches_helper.rb index 601df5c18df14c353313da58554c7f6236d9582b..bfd23aa4e043f62f850ecb8d79c441d3fb6365bc 100644 --- a/app/helpers/branches_helper.rb +++ b/app/helpers/branches_helper.rb @@ -12,7 +12,7 @@ module BranchesHelper def can_push_branch?(project, branch_name) return false unless project.repository.branch_exists?(branch_name) - ::Gitlab::GitAccess.new(current_user, project, 'web').can_push_to_branch?(branch_name) + ::Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(branch_name) end def project_branches diff --git a/app/helpers/ci_status_helper.rb b/app/helpers/ci_status_helper.rb index e6c99c9959e159ed78089c022ce869246f9b397c..59a8365d60b403cfe02fe9ab20335562ee9d029e 100644 --- a/app/helpers/ci_status_helper.rb +++ b/app/helpers/ci_status_helper.rb @@ -26,18 +26,20 @@ module CiStatusHelper icon_name = case status when 'success' - 'check' + 'icon_status_success' + when 'success_with_warnings' + 'icon_status_warning' when 'failed' - 'close' + 'icon_status_failed' when 'pending' - 'clock-o' + 'icon_status_pending' when 'running' - 'spinner' + 'icon_status_running' else - 'circle' + 'icon_status_cancel' end - icon(icon_name + ' fw') + custom_icon(icon_name) end def render_commit_status(commit, tooltip_placement: 'auto left', cssclass: '') diff --git a/app/helpers/diff_helper.rb b/app/helpers/diff_helper.rb index adab901700cc17047ddffa7efbf00450ca826d82..75b029365f93a54c40c875ee72b6ebe652beae58 100644 --- a/app/helpers/diff_helper.rb +++ b/app/helpers/diff_helper.rb @@ -9,7 +9,7 @@ module DiffHelper end def expand_all_diffs? - @expand_all_diffs || params[:expand_all_diffs].present? + params[:expand_all_diffs].present? end def diff_view @@ -23,13 +23,14 @@ module DiffHelper end def diff_options - default_options = Commit.max_diff_options + options = { ignore_whitespace_change: hide_whitespace?, no_collapse: expand_all_diffs? } if action_name == 'diff_for_path' - default_options[:paths] = params.values_at(:old_path, :new_path) + options[:no_collapse] = true + options[:paths] = params.values_at(:old_path, :new_path) end - default_options.merge(ignore_whitespace_change: hide_whitespace?) + Commit.max_diff_options.merge(options) end def safe_diff_files(diffs, diff_refs: nil, repository: nil) diff --git a/app/helpers/time_helper.rb b/app/helpers/time_helper.rb index 8cb82c2d5cccb0e3025e4668694b70ec42e019d4..1926f03af07f49d47a296dd3573505cfdb04e396 100644 --- a/app/helpers/time_helper.rb +++ b/app/helpers/time_helper.rb @@ -1,14 +1,4 @@ module TimeHelper - def duration_in_words(finished_at, started_at) - if finished_at && started_at - interval_in_seconds = finished_at.to_i - started_at.to_i - elsif started_at - interval_in_seconds = Time.now.to_i - started_at.to_i - end - - time_interval_in_words(interval_in_seconds) - end - def time_interval_in_words(interval_in_seconds) minutes = interval_in_seconds / 60 seconds = interval_in_seconds - minutes * 60 @@ -25,9 +15,19 @@ module TimeHelper end def duration_in_numbers(finished_at, started_at) - diff_in_seconds = finished_at.to_i - started_at.to_i - time_format = diff_in_seconds < 1.hour ? "%M:%S" : "%H:%M:%S" + interval = interval_in_seconds(started_at, finished_at) + time_format = interval < 1.hour ? "%M:%S" : "%H:%M:%S" - Time.at(diff_in_seconds).utc.strftime(time_format) + Time.at(interval).utc.strftime(time_format) + end + + private + + def interval_in_seconds(started_at, finished_at = nil) + if started_at && finished_at + finished_at.to_i - started_at.to_i + elsif started_at + Time.now.to_i - started_at.to_i + end end end diff --git a/app/mailers/emails/builds.rb b/app/mailers/emails/builds.rb index 2f86d1be57625ee969cebef8b1e15c70b862ad91..3853af6201ac9509fc963581f2e586ba91efa727 100644 --- a/app/mailers/emails/builds.rb +++ b/app/mailers/emails/builds.rb @@ -6,6 +6,7 @@ module Emails add_project_headers add_build_headers('failed') + mail(to: to, subject: subject("Build failed for #{@project.name}", @build.short_sha)) end diff --git a/app/models/ability.rb b/app/models/ability.rb index eeb0ceba08113b9d385ee63cbfb8b3cf30dc3dc9..6fd18f2ee24bd0dea3b42d0aff4c9317eeac8534 100644 --- a/app/models/ability.rb +++ b/app/models/ability.rb @@ -204,7 +204,8 @@ class Ability :download_code, :fork_project, :read_commit_status, - :read_pipeline + :read_pipeline, + :read_container_image ] end diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb index e189dbac2856dbbd26f35129b2fb2d7aaf60fb3a..e02351ce3391d86ce15283981a83d99d6ccf094b 100644 --- a/app/models/ci/build.rb +++ b/app/models/ci/build.rb @@ -5,6 +5,7 @@ module Ci belongs_to :erased_by, class_name: 'User' serialize :options + serialize :yaml_variables validates :coverage, numericality: true, allow_blank: true validates_presence_of :ref @@ -14,6 +15,7 @@ module Ci scope :with_artifacts, ->() { where.not(artifacts_file: nil) } scope :with_expired_artifacts, ->() { with_artifacts.where('artifacts_expire_at < ?', Time.now) } scope :last_month, ->() { where('created_at > ?', Date.today - 1.month) } + scope :manual_actions, ->() { where(when: :manual) } mount_uploader :artifacts_file, ArtifactUploader mount_uploader :artifacts_metadata, ArtifactUploader @@ -52,7 +54,10 @@ module Ci new_build.stage = build.stage new_build.stage_idx = build.stage_idx new_build.trigger_request = build.trigger_request + new_build.yaml_variables = build.yaml_variables + new_build.when = build.when new_build.user = user + new_build.environment = build.environment new_build.save MergeRequests::AddTodoWhenBuildFailsService.new(build.project, nil).close(new_build) new_build @@ -87,6 +92,29 @@ module Ci end end + def manual? + self.when == 'manual' + end + + def other_actions + pipeline.manual_actions.where.not(id: self) + end + + def playable? + project.builds_enabled? && commands.present? && manual? + end + + def play(current_user = nil) + # Try to queue a current build + if self.queue + self.update(user: current_user) + self + else + # Otherwise we need to create a duplicate + Ci::Build.retry(self, current_user) + end + end + def retryable? project.builds_enabled? && commands.present? && complete? end @@ -376,6 +404,14 @@ module Ci self.update(artifacts_expire_at: nil) end + def when + read_attribute(:when) || build_attributes_from_config[:when] || 'on_success' + end + + def yaml_variables + read_attribute(:yaml_variables) || build_attributes_from_config[:yaml_variables] || [] + end + private def update_artifacts_size @@ -394,30 +430,6 @@ module Ci self.update(erased_by: user, erased_at: Time.now, artifacts_expire_at: nil) end - def yaml_variables - global_yaml_variables + job_yaml_variables - end - - def global_yaml_variables - if pipeline.config_processor - pipeline.config_processor.global_variables.map do |key, value| - { key: key, value: value, public: true } - end - else - [] - end - end - - def job_yaml_variables - if pipeline.config_processor - pipeline.config_processor.job_variables(name).map do |key, value| - { key: key, value: value, public: true } - end - else - [] - end - end - def project_variables project.variables.map do |variable| { key: variable.key, value: variable.value, public: false } @@ -442,5 +454,11 @@ module Ci variables << { key: :CI_BUILD_TRIGGERED, value: 'true', public: true } if trigger_request variables end + + def build_attributes_from_config + return {} unless pipeline.config_processor + + pipeline.config_processor.build_attributes(name) + end end end diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb index 7d743ce99f03b0c816250b1e9e05ac2fbaa26b2d..aca8607f4e87d7d2a668ee9a02b3e3e6046e3c8e 100644 --- a/app/models/ci/pipeline.rb +++ b/app/models/ci/pipeline.rb @@ -6,6 +6,8 @@ module Ci self.table_name = 'ci_commits' belongs_to :project, class_name: '::Project', foreign_key: :gl_project_id + belongs_to :user + has_many :statuses, class_name: 'CommitStatus', foreign_key: :commit_id has_many :builds, class_name: 'Ci::Build', foreign_key: :commit_id has_many :trigger_requests, dependent: :destroy, class_name: 'Ci::TriggerRequest', foreign_key: :commit_id @@ -49,6 +51,10 @@ module Ci commit.try(:message) end + def git_commit_title + commit.try(:title) + end + def short_sha Ci::Pipeline.truncate_sha(sha) end @@ -63,6 +69,10 @@ module Ci !tag? end + def manual_actions + builds.latest.manual_actions + end + def retryable? builds.latest.any? do |build| build.failed? && build.retryable? diff --git a/app/models/commit_status.rb b/app/models/commit_status.rb index e437e3417a8388a602c6870cc731ea0a6428a717..535db26240a7985ce568c15d3238e78e1daac355 100644 --- a/app/models/commit_status.rb +++ b/app/models/commit_status.rb @@ -22,6 +22,10 @@ class CommitStatus < ActiveRecord::Base scope :ignored, -> { where(allow_failure: true, status: [:failed, :canceled]) } state_machine :status, initial: :pending do + event :queue do + transition skipped: :pending + end + event :run do transition pending: :running end diff --git a/app/models/concerns/statuseable.rb b/app/models/concerns/statuseable.rb index 3ef91caad473004a1d618739246eb15ec0fa209f..44c6b30f2788a89a4425950f6b0d70eaafc6f7b5 100644 --- a/app/models/concerns/statuseable.rb +++ b/app/models/concerns/statuseable.rb @@ -16,10 +16,10 @@ module Statuseable deduce_status = "(CASE WHEN (#{builds})=0 THEN NULL - WHEN (#{builds})=(#{success})+(#{ignored}) THEN 'success' - WHEN (#{builds})=(#{pending}) THEN 'pending' - WHEN (#{builds})=(#{canceled})+(#{success})+(#{ignored}) THEN 'canceled' WHEN (#{builds})=(#{skipped}) THEN 'skipped' + WHEN (#{builds})=(#{success})+(#{ignored})+(#{skipped}) THEN 'success' + WHEN (#{builds})=(#{pending})+(#{skipped}) THEN 'pending' + WHEN (#{builds})=(#{canceled})+(#{success})+(#{ignored})+(#{skipped}) THEN 'canceled' WHEN (#{running})+(#{pending})>0 THEN 'running' ELSE 'failed' END)" diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 520026c18dd5d96c5dedb739d3187bbaa60d779f..1a7cd60817e7505fdc40728091efb6f53a843283 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -32,4 +32,8 @@ class Deployment < ActiveRecord::Base def keep_around_commit project.repository.keep_around(self.sha) end + + def manual_actions + deployable.try(:other_actions) + end end diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb index 157901378d32167ee1e84a90e3ec46e826b8d354..471e32f3b60d3f78feac807b429d62452688176f 100644 --- a/app/models/merge_request.rb +++ b/app/models/merge_request.rb @@ -552,7 +552,13 @@ class MergeRequest < ActiveRecord::Base end def can_be_merged_by?(user) - ::Gitlab::GitAccess.new(user, project, 'web').can_push_to_branch?(target_branch) + access = ::Gitlab::UserAccess.new(user, project: project) + access.can_push_to_branch?(target_branch) || access.can_merge_to_branch?(target_branch) + end + + def can_be_merged_via_command_line_by?(user) + access = ::Gitlab::UserAccess.new(user, project: project) + access.can_push_to_branch?(target_branch) end def mergeable_ci_state? diff --git a/app/models/merge_request_diff.rb b/app/models/merge_request_diff.rb index feaba925bad1197818dd18d623d0a2013b9e48c3..3f520c8f3ffa8146669e94bebfe992299d72d790 100644 --- a/app/models/merge_request_diff.rb +++ b/app/models/merge_request_diff.rb @@ -1,6 +1,7 @@ class MergeRequestDiff < ActiveRecord::Base include Sortable include Importable + include EncodingHelper # Prevent store of diff if commits amount more then 500 COMMITS_SAFE_SIZE = 100 @@ -211,6 +212,14 @@ class MergeRequestDiff < ActiveRecord::Base branch_base_commit.try(:sha) end + def utf8_st_diffs + st_diffs.map do |diff| + diff.each do |k, v| + diff[k] = encode_utf8(v) if v.respond_to?(:encoding) + end + end + end + # # #save or #update_attributes providing changes on serialized attributes do a lot of # serialization and deserialization calls resulting in bad performance. diff --git a/app/models/project.rb b/app/models/project.rb index e7b9835692dbdc4a7eabb3f1fb4d9fbee5f6275e..a805f5d97bc61bab97d16404cf5beb561bb220df 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -162,7 +162,7 @@ class Project < ActiveRecord::Base validates :namespace, presence: true validates_uniqueness_of :name, scope: :namespace_id validates_uniqueness_of :path, scope: :namespace_id - validates :import_url, addressable_url: true, if: :import_url + validates :import_url, addressable_url: true, if: :external_import? validates :star_count, numericality: { greater_than_or_equal_to: 0 } validate :check_limit, on: :create validate :avatar_type, @@ -482,7 +482,7 @@ class Project < ActiveRecord::Base end def create_or_update_import_data(data: nil, credentials: nil) - return unless valid_import_url? + return unless import_url.present? && valid_import_url? project_import_data = import_data || build_import_data if data @@ -838,6 +838,10 @@ class Project < ActiveRecord::Base protected_branches.matching(branch_name).any?(&:developers_can_push) end + def developers_can_merge_to_protected_branch?(branch_name) + protected_branches.matching(branch_name).any?(&:developers_can_merge) + end + def forked? !(forked_project_link.nil? || forked_project_link.forked_from_project.nil?) end @@ -1038,8 +1042,8 @@ class Project < ActiveRecord::Base pipelines.order(id: :desc).find_by(sha: sha, ref: ref) end - def ensure_pipeline(sha, ref) - pipeline(sha, ref) || pipelines.create(sha: sha, ref: ref) + def ensure_pipeline(sha, ref, current_user = nil) + pipeline(sha, ref) || pipelines.create(sha: sha, ref: ref, user: current_user) end def enable_ci diff --git a/app/models/project_services/builds_email_service.rb b/app/models/project_services/builds_email_service.rb index 54da4d74fc5b21f7f45fcab78d25a1009da9c180..5e166471077ca69cf939591f81f74d9d8fca78b4 100644 --- a/app/models/project_services/builds_email_service.rb +++ b/app/models/project_services/builds_email_service.rb @@ -42,6 +42,19 @@ class BuildsEmailService < Service end end + def can_test? + project.builds.count > 0 + end + + def disabled_title + "Please setup a build on your repository." + end + + def test_data(project = nil, user = nil) + build = project.builds.last + Gitlab::BuildDataBuilder.build(build) + end + def fields [ { type: 'textarea', name: 'recipients', placeholder: 'Emails separated by comma' }, @@ -50,6 +63,20 @@ class BuildsEmailService < Service ] end + def test(data) + begin + # bypass build status verification when testing + data[:build_status] = "failed" + data[:build_allow_failure] = false + + result = execute(data) + rescue StandardError => error + return { success: false, result: error } + end + + { success: true, result: result } + end + def should_build_be_notified?(data) case data[:build_status] when 'success' diff --git a/app/models/repository.rb b/app/models/repository.rb index 5b670cb4b8fa6c8a3dc504affbc886cad045afc2..1a2ac90da51386212b8d19737727403d9eeb8c68 100644 --- a/app/models/repository.rb +++ b/app/models/repository.rb @@ -704,6 +704,7 @@ class Repository options[:commit] = { message: message, branch: ref, + update_ref: false, } raw_repository.mkdir(path, options) @@ -719,6 +720,7 @@ class Repository options[:commit] = { message: message, branch: ref, + update_ref: false, } options[:file] = { @@ -731,6 +733,33 @@ class Repository end end + def update_file(user, path, content, branch:, previous_path:, message:) + commit_with_hooks(user, branch) do |ref| + committer = user_to_committer(user) + options = {} + options[:committer] = committer + options[:author] = committer + options[:commit] = { + message: message, + branch: ref, + update_ref: false + } + + options[:file] = { + content: content, + path: path, + update: true + } + + if previous_path + options[:file][:previous_path] = previous_path + Gitlab::Git::Blob.rename(raw_repository, options) + else + Gitlab::Git::Blob.commit(raw_repository, options) + end + end + end + def remove_file(user, path, message, branch) commit_with_hooks(user, branch) do |ref| committer = user_to_committer(user) @@ -739,7 +768,8 @@ class Repository options[:author] = committer options[:commit] = { message: message, - branch: ref + branch: ref, + update_ref: false, } options[:file] = { @@ -769,9 +799,9 @@ class Repository end end - def merge(user, source_sha, target_branch, options = {}) - our_commit = rugged.branches[target_branch].target - their_commit = rugged.lookup(source_sha) + def merge(user, merge_request, options = {}) + our_commit = rugged.branches[merge_request.target_branch].target + their_commit = rugged.lookup(merge_request.diff_head_sha) raise "Invalid merge target" if our_commit.nil? raise "Invalid merge source" if their_commit.nil? @@ -779,14 +809,15 @@ class Repository merge_index = rugged.merge_commits(our_commit, their_commit) return false if merge_index.conflicts? - commit_with_hooks(user, target_branch) do |ref| + commit_with_hooks(user, merge_request.target_branch) do actual_options = options.merge( parents: [our_commit, their_commit], tree: merge_index.write_tree(rugged), - update_ref: ref ) - Rugged::Commit.create(rugged, actual_options) + commit_id = Rugged::Commit.create(rugged, actual_options) + merge_request.update(in_progress_merge_commit_sha: commit_id) + commit_id end end @@ -796,15 +827,14 @@ class Repository return false unless revert_tree_id - commit_with_hooks(user, base_branch) do |ref| + commit_with_hooks(user, base_branch) do committer = user_to_committer(user) source_sha = Rugged::Commit.create(rugged, message: commit.revert_message, author: committer, committer: committer, tree: revert_tree_id, - parents: [rugged.lookup(source_sha)], - update_ref: ref) + parents: [rugged.lookup(source_sha)]) end end @@ -814,7 +844,7 @@ class Repository return false unless cherry_pick_tree_id - commit_with_hooks(user, base_branch) do |ref| + commit_with_hooks(user, base_branch) do committer = user_to_committer(user) source_sha = Rugged::Commit.create(rugged, message: commit.message, @@ -825,8 +855,7 @@ class Repository }, committer: committer, tree: cherry_pick_tree_id, - parents: [rugged.lookup(source_sha)], - update_ref: ref) + parents: [rugged.lookup(source_sha)]) end end @@ -927,20 +956,6 @@ class Repository Gitlab::Popen.popen(args, path_to_repo) end - def with_tmp_ref(oldrev = nil) - random_string = SecureRandom.hex - tmp_ref = "refs/tmp/#{random_string}/head" - - if oldrev && !Gitlab::Git.blank_ref?(oldrev) - rugged.references.create(tmp_ref, oldrev) - end - - # Make commit in tmp ref - yield(tmp_ref) - ensure - rugged.references.delete(tmp_ref) rescue nil - end - def commit_with_hooks(current_user, branch) update_autocrlf_option @@ -953,33 +968,31 @@ class Repository oldrev = target_branch.target end - with_tmp_ref(oldrev) do |tmp_ref| - # Make commit in tmp ref - newrev = yield(tmp_ref) + # Make commit + newrev = yield(ref) - unless newrev - raise CommitError.new('Failed to create commit') - end + unless newrev + raise CommitError.new('Failed to create commit') + end - GitHooksService.new.execute(current_user, path_to_repo, oldrev, newrev, ref) do - if was_empty || !target_branch - # Create branch - rugged.references.create(ref, newrev) + GitHooksService.new.execute(current_user, path_to_repo, oldrev, newrev, ref) do + if was_empty || !target_branch + # Create branch + rugged.references.create(ref, newrev) + else + # Update head + current_head = find_branch(branch).target + + # Make sure target branch was not changed during pre-receive hook + if current_head == oldrev + rugged.references.update(ref, newrev) else - # Update head - current_head = find_branch(branch).target - - # Make sure target branch was not changed during pre-receive hook - if current_head == oldrev - rugged.references.update(ref, newrev) - else - raise CommitError.new('Commit was rejected because branch received new push') - end + raise CommitError.new('Commit was rejected because branch received new push') end end - - newrev end + + newrev end def ls_files(ref) diff --git a/app/models/service.rb b/app/models/service.rb index d7a32c282679221a095f523ee0b6bdb08e2517c3..5432f8c7ab43ebb648fda1ab30a183da61972e84 100644 --- a/app/models/service.rb +++ b/app/models/service.rb @@ -76,6 +76,10 @@ class Service < ActiveRecord::Base [] end + def test_data(project, user) + Gitlab::PushDataBuilder.build_sample(project, user) + end + def supported_events %w(push tag_push issue merge_request wiki_page) end @@ -94,6 +98,11 @@ class Service < ActiveRecord::Base !project.empty_repo? end + # reason why service cannot be tested + def disabled_title + "Please setup a project repository." + end + # Provide convenient accessor methods # for each serialized property. # Also keep track of updated properties in a similar way as ActiveModel::Dirty diff --git a/app/models/user.rb b/app/models/user.rb index 7a72c2021503a340872a62ea97d1804b1b41e4a8..975e935fa2049e3f11a822f595f7027ab2a9f6b5 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -85,6 +85,7 @@ class User < ActiveRecord::Base has_one :abuse_report, dependent: :destroy has_many :spam_logs, dependent: :destroy has_many :builds, dependent: :nullify, class_name: 'Ci::Build' + has_many :pipelines, dependent: :nullify, class_name: 'Ci::Pipeline' has_many :todos, dependent: :destroy has_many :notification_settings, dependent: :destroy has_many :award_emoji, dependent: :destroy @@ -853,7 +854,7 @@ class User < ActiveRecord::Base groups.joins(:shared_projects).select(:project_id)] if min_access_level - scope = { access_level: Gitlab::Access.values.select { |access| access >= min_access_level } } + scope = { access_level: Gitlab::Access.all_values.select { |access| access >= min_access_level } } relations = [relations.shift] + relations.map { |relation| relation.where(members: scope) } end diff --git a/app/services/ci/create_builds_service.rb b/app/services/ci/create_builds_service.rb index 2dcb052d274e25513203989c509582900a7ff18f..4946f7076fdd515ee1781bccd9bf2af28336ca1d 100644 --- a/app/services/ci/create_builds_service.rb +++ b/app/services/ci/create_builds_service.rb @@ -15,7 +15,7 @@ module Ci status == 'success' when 'on_failure' status == 'failed' - when 'always' + when 'always', 'manual' %w(success failed).include?(status) end end @@ -36,7 +36,9 @@ module Ci :allow_failure, :stage, :stage_idx, - :environment) + :environment, + :when, + :yaml_variables) build_attrs.merge!(pipeline: @pipeline, ref: @pipeline.ref, @@ -45,6 +47,10 @@ module Ci user: user, project: @pipeline.project) + # TODO: The proper implementation for this is in + # https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/5295 + build_attrs[:status] = 'skipped' if build_attrs[:when] == 'manual' + ## # We do not persist new builds here. # Those will be persisted when @pipeline is saved. diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index b1ee68741902327a40c346f436d197147b7945d7..be91bf0db85a30408b71731674fdf4c02d3fb339 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -2,6 +2,7 @@ module Ci class CreatePipelineService < BaseService def execute pipeline = project.pipelines.new(params) + pipeline.user = current_user unless ref_names.include?(params[:ref]) pipeline.errors.add(:base, 'Reference not found') diff --git a/app/services/commits/change_service.rb b/app/services/commits/change_service.rb index c578097376a632d349d73257be0072d40b0dc8bc..ed73d8cb8c2a13f911d4d8a86131a9ed62f8b10d 100644 --- a/app/services/commits/change_service.rb +++ b/app/services/commits/change_service.rb @@ -23,7 +23,7 @@ module Commits private def check_push_permissions - allowed = ::Gitlab::GitAccess.new(current_user, project, 'web').can_push_to_branch?(@target_branch) + allowed = ::Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(@target_branch) unless allowed raise ValidationError.new('You are not allowed to push into this branch') @@ -31,7 +31,7 @@ module Commits true end - + def create_target_branch(new_branch) # Temporary branch exists and contains the change commit return success if repository.find_branch(new_branch) diff --git a/app/services/create_branch_service.rb b/app/services/create_branch_service.rb index d874582d54ffee63a64cd3a1e2a5fc0f053abd89..757fc35a78fdf54f0a6c58498c6f371dbf94b48e 100644 --- a/app/services/create_branch_service.rb +++ b/app/services/create_branch_service.rb @@ -15,21 +15,19 @@ class CreateBranchService < BaseService return error('Branch already exists') end - new_branch = nil - - if source_project != @project - repository.with_tmp_ref do |tmp_ref| - repository.fetch_ref( - source_project.repository.path_to_repo, - "refs/heads/#{ref}", - tmp_ref - ) - - new_branch = repository.add_branch(current_user, branch_name, tmp_ref) - end - else - new_branch = repository.add_branch(current_user, branch_name, ref) - end + new_branch = if source_project != @project + repository.fetch_ref( + source_project.repository.path_to_repo, + "refs/heads/#{ref}", + "refs/heads/#{branch_name}" + ) + + repository.after_create_branch + + repository.find_branch(branch_name) + else + repository.add_branch(current_user, branch_name, ref) + end if new_branch success(new_branch) diff --git a/app/services/create_commit_builds_service.rb b/app/services/create_commit_builds_service.rb index f947e8f452eafb64cd82380fd7249ab30c8298c6..0b66b854deabd245b02259f8cb9cd7e3c424176d 100644 --- a/app/services/create_commit_builds_service.rb +++ b/app/services/create_commit_builds_service.rb @@ -14,7 +14,13 @@ class CreateCommitBuildsService return false end - @pipeline = Ci::Pipeline.new(project: project, sha: sha, ref: ref, before_sha: before_sha, tag: tag) + @pipeline = Ci::Pipeline.new( + project: project, + sha: sha, + ref: ref, + before_sha: before_sha, + tag: tag, + user: user) ## # Skip creating pipeline if no gitlab-ci.yml is found diff --git a/app/services/files/base_service.rb b/app/services/files/base_service.rb index 37c5e321b39e1886e0eaf173223edd43f4d471b5..c4a206f785e3b493b30a6b1abc74ec5ddf668902 100644 --- a/app/services/files/base_service.rb +++ b/app/services/files/base_service.rb @@ -9,12 +9,14 @@ module Files @commit_message = params[:commit_message] @file_path = params[:file_path] + @previous_path = params[:previous_path] @file_content = if params[:file_content_encoding] == 'base64' Base64.decode64(params[:file_content]) else params[:file_content] end + # Validate parameters validate # Create new branch if it different from source_branch @@ -42,7 +44,7 @@ module Files end def validate - allowed = ::Gitlab::GitAccess.new(current_user, project, 'web').can_push_to_branch?(@target_branch) + allowed = ::Gitlab::UserAccess.new(current_user, project: project).can_push_to_branch?(@target_branch) unless allowed raise_error("You are not allowed to push into this branch") diff --git a/app/services/files/update_service.rb b/app/services/files/update_service.rb index 1960dc7d949c1abb2612d024227da98050a1c5e9..8d2b5083179e0ed50c507a355e9067a6d5d05d67 100644 --- a/app/services/files/update_service.rb +++ b/app/services/files/update_service.rb @@ -3,7 +3,10 @@ require_relative "base_service" module Files class UpdateService < Files::BaseService def commit - repository.commit_file(current_user, @file_path, @file_content, @commit_message, @target_branch, true) + repository.update_file(current_user, @file_path, @file_content, + branch: @target_branch, + previous_path: @previous_path, + message: @commit_message) end end end diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index a886f35981f42c8c21d05b35c6ae1fc6900392a9..e02b50ff9a2d8440bc1ffdc582699f70439e0ca8 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -89,7 +89,8 @@ class GitPushService < BaseService # Set protection on the default branch if configured if current_application_settings.default_branch_protection != PROTECTION_NONE developers_can_push = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_PUSH ? true : false - @project.protected_branches.create({ name: @project.default_branch, developers_can_push: developers_can_push }) + developers_can_merge = current_application_settings.default_branch_protection == PROTECTION_DEV_CAN_MERGE ? true : false + @project.protected_branches.create({ name: @project.default_branch, developers_can_push: developers_can_push, developers_can_merge: developers_can_merge }) end end diff --git a/app/services/issuable_base_service.rb b/app/services/issuable_base_service.rb index e3dc569152cda3af69f5719f6a94fffa0461095a..2d96efe1042c955fc984e0c895ae6ae9e84a6100 100644 --- a/app/services/issuable_base_service.rb +++ b/app/services/issuable_base_service.rb @@ -101,6 +101,7 @@ class IssuableBaseService < BaseService def update(issuable) change_state(issuable) + change_subscription(issuable) filter_params old_labels = issuable.labels.to_a @@ -124,6 +125,15 @@ class IssuableBaseService < BaseService end end + def change_subscription(issuable) + case params.delete(:subscription_event) + when 'subscribe' + issuable.subscribe(current_user) + when 'unsubscribe' + issuable.unsubscribe(current_user) + end + end + def has_changes?(issuable, old_labels: []) valid_attrs = [:title, :description, :assignee_id, :milestone_id, :target_branch] diff --git a/app/services/issues/bulk_update_service.rb b/app/services/issues/bulk_update_service.rb index cd08c3a0cb97aff548f4e4b634809d247f3b008e..7e19a73f71a22491f18dff6be77ba9698ce03641 100644 --- a/app/services/issues/bulk_update_service.rb +++ b/app/services/issues/bulk_update_service.rb @@ -4,7 +4,7 @@ module Issues issues_ids = params.delete(:issues_ids).split(",") issue_params = params - %i(state_event milestone_id assignee_id add_label_ids remove_label_ids).each do |key| + %i(state_event milestone_id assignee_id add_label_ids remove_label_ids subscription_event).each do |key| issue_params.delete(key) unless issue_params[key].present? end diff --git a/app/services/merge_requests/merge_service.rb b/app/services/merge_requests/merge_service.rb index f1b1d90c4578f81058ac5de0d88aab343c16b166..0dac0614141b69cc350a8bbb0ee11fae4d332a17 100644 --- a/app/services/merge_requests/merge_service.rb +++ b/app/services/merge_requests/merge_service.rb @@ -34,7 +34,7 @@ module MergeRequests committer: committer } - commit_id = repository.merge(current_user, merge_request.diff_head_sha, merge_request.target_branch, options) + commit_id = repository.merge(current_user, merge_request, options) merge_request.update(merge_commit_sha: commit_id) rescue GitHooksService::PreReceiveError => e merge_request.update(merge_error: e.message) @@ -43,6 +43,8 @@ module MergeRequests merge_request.update(merge_error: "Something went wrong during merge") Rails.logger.error(e.message) false + ensure + merge_request.update(in_progress_merge_commit_sha: nil) end def after_merge diff --git a/app/services/merge_requests/refresh_service.rb b/app/services/merge_requests/refresh_service.rb index b11ecd97a5798560971da3d7c8dad6737512f32c..1daf6bbf553a8f23e628ebb84cfa926edd9a6387 100644 --- a/app/services/merge_requests/refresh_service.rb +++ b/app/services/merge_requests/refresh_service.rb @@ -48,7 +48,7 @@ module MergeRequests end def force_push? - Gitlab::ForcePushCheck.force_push?(@project, @oldrev, @newrev) + Gitlab::Checks::ForcePush.force_push?(@project, @oldrev, @newrev) end # Refresh merge request diff if we push to source or target branch of merge request diff --git a/app/services/projects/import_export/export_service.rb b/app/services/projects/import_export/export_service.rb index 998789d64d226a987f7c48313e9af16bbe485c08..06252c7b625a4df7b87fcb98c60c058de7c76002 100644 --- a/app/services/projects/import_export/export_service.rb +++ b/app/services/projects/import_export/export_service.rb @@ -9,7 +9,7 @@ module Projects private def save_all - if [version_saver, project_tree_saver, uploads_saver, repo_saver, wiki_repo_saver].all?(&:save) + if [version_saver, avatar_saver, project_tree_saver, uploads_saver, repo_saver, wiki_repo_saver].all?(&:save) Gitlab::ImportExport::Saver.save(project: project, shared: @shared) notify_success else @@ -21,6 +21,10 @@ module Projects Gitlab::ImportExport::VersionSaver.new(shared: @shared) end + def avatar_saver + Gitlab::ImportExport::AvatarSaver.new(project: project, shared: @shared) + end + def project_tree_saver Gitlab::ImportExport::ProjectTreeSaver.new(project: project, shared: @shared) end diff --git a/app/uploaders/avatar_uploader.rb b/app/uploaders/avatar_uploader.rb index 6135c3ad96f4e5c3916f426d08cc177880829a2a..03d9329a14eaa25c7a635ecfa4d796033be3b169 100644 --- a/app/uploaders/avatar_uploader.rb +++ b/app/uploaders/avatar_uploader.rb @@ -14,4 +14,8 @@ class AvatarUploader < CarrierWave::Uploader::Base def reset_events_cache(file) model.reset_events_cache if model.is_a?(User) end + + def exists? + model.avatar.file && model.avatar.file.exists? + end end diff --git a/app/views/admin/builds/index.html.haml b/app/views/admin/builds/index.html.haml index 9ea3cca0ecb0e8cc691ec951fceeb55b0def3ccb..3d77634d8fafe6b9ce72261c28845377a5599795 100644 --- a/app/views/admin/builds/index.html.haml +++ b/app/views/admin/builds/index.html.haml @@ -10,15 +10,20 @@ All %span.badge.js-totalbuilds-count= @all_builds.count(:id) + %li{class: ('active' if @scope == 'pending')} + = link_to admin_builds_path(scope: :pending) do + Pending + %span.badge= number_with_delimiter(@all_builds.pending.count(:id)) + %li{class: ('active' if @scope == 'running')} = link_to admin_builds_path(scope: :running) do Running - %span.badge.js-running-count= number_with_delimiter(@all_builds.running_or_pending.count(:id)) + %span.badge= number_with_delimiter(@all_builds.running.count(:id)) %li{class: ('active' if @scope == 'finished')} = link_to admin_builds_path(scope: :finished) do Finished - %span.badge.js-running-count= number_with_delimiter(@all_builds.finished.count(:id)) + %span.badge= number_with_delimiter(@all_builds.finished.count(:id)) .nav-controls - if @all_builds.running_or_pending.any? diff --git a/app/views/emojis/index.html.haml b/app/views/emojis/index.html.haml index 8b38b4c2bd4a9b354774f3333779167983ead07b..790d90ad3ee5f5b52de5bf9a7aca479ce9765831 100644 --- a/app/views/emojis/index.html.haml +++ b/app/views/emojis/index.html.haml @@ -1,5 +1,5 @@ .emoji-menu - = text_field_tag :emoji_search, "", class: "emoji-search search-input form-control", placeholder: "Seach emojis" + = text_field_tag :emoji_search, "", class: "emoji-search search-input form-control", placeholder: "Search emoji" .emoji-menu-content - Gitlab::AwardEmoji.emoji_by_category.each do |category, emojis| %h5.emoji-menu-title diff --git a/app/views/layouts/_init_auto_complete.html.haml b/app/views/layouts/_init_auto_complete.html.haml index 12e7ed0e792be75ebfb04955795c57a0ef3eee05..351100f3523383a3a723f261f6ab5fe96b6fcab0 100644 --- a/app/views/layouts/_init_auto_complete.html.haml +++ b/app/views/layouts/_init_auto_complete.html.haml @@ -1,7 +1,7 @@ - project = @target_project || @project +- noteable_class = @noteable.class if @noteable.present? -- if @noteable - :javascript - GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_namespace_project_path(project.namespace, project, type: @noteable.class, type_id: params[:id])}" - GitLab.GfmAutoComplete.cachedData = undefined; - GitLab.GfmAutoComplete.setup(); +:javascript + GitLab.GfmAutoComplete.dataSource = "#{autocomplete_sources_namespace_project_path(project.namespace, project, type: noteable_class, type_id: params[:id])}" + GitLab.GfmAutoComplete.cachedData = undefined; + GitLab.GfmAutoComplete.setup(); diff --git a/app/views/projects/blob/_editor.html.haml b/app/views/projects/blob/_editor.html.haml index 29c7d45074a2241d5f20bb0a78b4443a0cec8184..ff379bafb26759800baee0a81780423ada586aa7 100644 --- a/app/views/projects/blob/_editor.html.haml +++ b/app/views/projects/blob/_editor.html.haml @@ -4,7 +4,9 @@ = icon('code-fork') = ref %span.editor-file-name - = @path + - if current_action?(:edit) || current_action?(:update) + = text_field_tag 'file_path', (params[:file_path] || @path), + class: 'form-control new-file-path' - if current_action?(:new) || current_action?(:create) %span.editor-file-name diff --git a/app/views/projects/builds/_sidebar.html.haml b/app/views/projects/builds/_sidebar.html.haml index cab21f0cf19568bad1443c6cc5d64d5902cfd01e..dc57b49f27a7386b45db0f36f663298c727f2d8f 100644 --- a/app/views/projects/builds/_sidebar.html.haml +++ b/app/views/projects/builds/_sidebar.html.haml @@ -49,7 +49,7 @@ - if @build.duration %p.build-detail-row %span.build-light-text Duration: - #{duration_in_words(@build.finished_at, @build.started_at)} + = time_interval_in_words(@build.duration) - if @build.finished_at %p.build-detail-row %span.build-light-text Finished: @@ -94,9 +94,9 @@ .block .title - Commit message + Commit title %p.build-light-text.append-bottom-0 - #{@build.pipeline.git_commit_message} + #{@build.pipeline.git_commit_title} - if @build.tags.any? .block diff --git a/app/views/projects/builds/index.html.haml b/app/views/projects/builds/index.html.haml index 85c31dfd918207433a70ee6a27b9988e4a715cab..2af625f69cd378e0b66786baf7f1d9d5012459c0 100644 --- a/app/views/projects/builds/index.html.haml +++ b/app/views/projects/builds/index.html.haml @@ -11,17 +11,22 @@ %span.badge.js-totalbuilds-count = number_with_delimiter(@all_builds.count(:id)) + %li{class: ('active' if @scope == 'pending')} + = link_to project_builds_path(@project, scope: :pending) do + Pending + %span.badge + = number_with_delimiter(@all_builds.pending.count(:id)) %li{class: ('active' if @scope == 'running')} = link_to project_builds_path(@project, scope: :running) do Running - %span.badge.js-running-count - = number_with_delimiter(@all_builds.running_or_pending.count(:id)) + %span.badge + = number_with_delimiter(@all_builds.running.count(:id)) %li{class: ('active' if @scope == 'finished')} = link_to project_builds_path(@project, scope: :finished) do Finished - %span.badge.js-running-count + %span.badge = number_with_delimiter(@all_builds.finished.count(:id)) .nav-controls diff --git a/app/views/projects/buttons/_fork.html.haml b/app/views/projects/buttons/_fork.html.haml index a9eaed4c5f63264267862fd130fe2b1b65ce5603..a098a082854cab73a5004e46a9a75fdfae27358a 100644 --- a/app/views/projects/buttons/_fork.html.haml +++ b/app/views/projects/buttons/_fork.html.haml @@ -2,7 +2,7 @@ - if current_user && can?(current_user, :fork_project, @project) - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn has-tooltip' do - = icon('code-fork fw') + = custom_icon('icon_fork') Fork %div.count-with-arrow %span.arrow @@ -10,7 +10,7 @@ = @project.forks_count - else = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project", class: 'btn has-tooltip' do - = icon('code-fork fw') + = custom_icon('icon_fork') Fork %div.count-with-arrow %span.arrow diff --git a/app/views/projects/ci/builds/_build.html.haml b/app/views/projects/ci/builds/_build.html.haml index e1b42b2cfa5c3ce09063ed137d752e551a0cfa3a..9264289987d039906ae5791a458497b0425a9847 100644 --- a/app/views/projects/ci/builds/_build.html.haml +++ b/app/views/projects/ci/builds/_build.html.haml @@ -39,6 +39,8 @@ %span.label.label-danger allowed to fail - if defined?(retried) && retried %span.label.label-warning retried + - if build.manual? + %span.label.label-info manual - if defined?(runner) && runner @@ -79,6 +81,11 @@ - if build.active? = link_to cancel_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Cancel', class: 'btn btn-build' do = icon('remove', class: 'cred') - - elsif defined?(allow_retry) && allow_retry && build.retryable? - = link_to retry_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Retry', class: 'btn btn-build' do - = icon('repeat') + - elsif defined?(allow_retry) && allow_retry + - if build.retryable? + = link_to retry_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Retry', class: 'btn btn-build' do + = icon('repeat') + - elsif build.playable? + = link_to play_namespace_project_build_path(build.project.namespace, build.project, build, return_to: request.original_url), method: :post, title: 'Play', class: 'btn btn-build' do + = icon('play') + diff --git a/app/views/projects/ci/pipelines/_pipeline.html.haml b/app/views/projects/ci/pipelines/_pipeline.html.haml index 631873fb0a3adf4b0aed026b6fe2e0c99293cc78..cb0ca7bc8e38e8ab5638cb523e43c2f10ccb5787 100644 --- a/app/views/projects/ci/pipelines/_pipeline.html.haml +++ b/app/views/projects/ci/pipelines/_pipeline.html.haml @@ -10,12 +10,13 @@ = link_to namespace_project_pipeline_path(@project.namespace, @project, pipeline.id) do %span ##{pipeline.id} - if pipeline.ref + .icon-container + = pipeline.tag? ? icon('tag') : icon('code-fork') = link_to pipeline.ref, namespace_project_commits_path(@project.namespace, @project, pipeline.ref), class: "monospace branch-name" - = custom_icon("icon_commit") + .icon-container + = custom_icon("icon_commit") = link_to pipeline.short_sha, namespace_project_commit_path(@project.namespace, @project, pipeline.sha), class: "commit-id monospace" - - if pipeline.tag? - %span.label.label-primary tag - - elsif pipeline.latest? + - if pipeline.latest? %span.label.label-success.has-tooltip{ title: 'Latest build for this branch' } latest - if pipeline.triggered? %span.label.label-primary triggered @@ -32,9 +33,9 @@ Cant find HEAD commit for this branch - - stages_status = pipeline.statuses.stages_status + - stages_status = pipeline.statuses.latest.stages_status - stages.each do |stage| - %td + %td.stage-cell - status = stages_status[stage] - tooltip = "#{stage.titleize}: #{status || 'not found'}" - if status @@ -57,18 +58,31 @@ %td.pipeline-actions .controls.hidden-xs.pull-right - artifacts = pipeline.builds.latest.select { |b| b.artifacts? } - - if artifacts.present? - .inline - .btn-group - %a.dropdown-toggle.btn.btn-default.build-artifacts{type: 'button', 'data-toggle' => 'dropdown'} - = icon("download") - %b.caret - %ul.dropdown-menu.dropdown-menu-align-right - - artifacts.each do |build| - %li - = link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, build), rel: 'nofollow' do - = icon("download") - %span Download '#{build.name}' artifacts + - actions = pipeline.manual_actions + - if artifacts.present? || actions.any? + .btn-group.inline + - if actions.any? + .btn-group + %a.dropdown-toggle.btn.btn-default{type: 'button', 'data-toggle' => 'dropdown'} + = icon("play") + %b.caret + %ul.dropdown-menu.dropdown-menu-align-right + - actions.each do |build| + %li + = link_to play_namespace_project_build_path(@project.namespace, @project, build), method: :post, rel: 'nofollow' do + = icon("play") + %span= build.name.humanize + - if artifacts.present? + .btn-group + %a.dropdown-toggle.btn.btn-default.build-artifacts{type: 'button', 'data-toggle' => 'dropdown'} + = icon("download") + %b.caret + %ul.dropdown-menu.dropdown-menu-align-right + - artifacts.each do |build| + %li + = link_to download_namespace_project_build_artifacts_path(@project.namespace, @project, build), rel: 'nofollow' do + = icon("download") + %span Download '#{build.name}' artifacts - if can?(current_user, :update_pipeline, @project) .cancel-retry-btns.inline diff --git a/app/views/projects/deployments/_actions.haml b/app/views/projects/deployments/_actions.haml new file mode 100644 index 0000000000000000000000000000000000000000..65d68aa298589e1b63b017186d073adb3278259e --- /dev/null +++ b/app/views/projects/deployments/_actions.haml @@ -0,0 +1,22 @@ +- if can?(current_user, :create_deployment, deployment) && deployment.deployable + .pull-right + - actions = deployment.manual_actions + - if actions.present? + .btn-group.inline + .btn-group + %a.dropdown-toggle.btn.btn-default{type: 'button', 'data-toggle' => 'dropdown'} + = icon("play") + %b.caret + %ul.dropdown-menu.dropdown-menu-align-right + - actions.each do |action| + %li + = link_to [:play, @project.namespace.becomes(Namespace), @project, action], method: :post, rel: 'nofollow' do + = icon("play") + %span= action.name.humanize + + - if local_assigns.fetch(:allow_rollback, false) + = link_to [:retry, @project.namespace.becomes(Namespace), @project, deployment.deployable], method: :post, class: 'btn btn-build' do + - if deployment.last? + Retry + - else + Rollback diff --git a/app/views/projects/deployments/_deployment.html.haml b/app/views/projects/deployments/_deployment.html.haml index d08dd92f1f6baad77777ec22eb494b2fdc9d6b3f..baf02f1e6a013ca74f5af737d0f86195b6c80f5b 100644 --- a/app/views/projects/deployments/_deployment.html.haml +++ b/app/views/projects/deployments/_deployment.html.haml @@ -7,17 +7,11 @@ %td - if deployment.deployable - = link_to namespace_project_build_path(@project.namespace, @project, deployment.deployable) do + = link_to [@project.namespace.becomes(Namespace), @project, deployment.deployable] do = "#{deployment.deployable.name} (##{deployment.deployable.id})" %td #{time_ago_with_tooltip(deployment.created_at)} %td - - if can?(current_user, :create_deployment, deployment) && deployment.deployable - .pull-right - = link_to retry_namespace_project_build_path(@project.namespace, @project, deployment.deployable), method: :post, class: 'btn btn-build' do - - if deployment.last? - Retry - - else - Rollback + = render 'projects/deployments/actions', deployment: deployment, allow_rollback: true diff --git a/app/views/projects/diffs/_content.html.haml b/app/views/projects/diffs/_content.html.haml index 0c0424edffd70c1cc68913b8ec9459006542df38..a1b071f130c73fb1c0640f59d89a793862c71330 100644 --- a/app/views/projects/diffs/_content.html.haml +++ b/app/views/projects/diffs/_content.html.haml @@ -8,12 +8,12 @@ - elsif blob_text_viewable?(blob) - if !project.repository.diffable?(blob) .nothing-here-block This diff was suppressed by a .gitattributes entry. + - elsif diff_file.collapsed? + - url = url_for(params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path)) + .nothing-here-block.diff-collapsed{data: { diff_for_path: url } } + This diff is collapsed. Click to expand it. - elsif diff_file.diff_lines.length > 0 - - if diff_file.collapsed_by_default? && !expand_all_diffs? - - url = url_for(params.merge(action: :diff_for_path, old_path: diff_file.old_path, new_path: diff_file.new_path)) - .nothing-here-block.diff-collapsed{data: { diff_for_path: url } } - This diff is collapsed. Click to expand it. - - elsif diff_view == 'parallel' + - if diff_view == 'parallel' = render "projects/diffs/parallel_view", diff_file: diff_file, project: project, blob: blob - else = render "projects/diffs/text_file", diff_file: diff_file diff --git a/app/views/projects/diffs/_diffs.html.haml b/app/views/projects/diffs/_diffs.html.haml index 20aaab5accf935e00cd6290f32afb6301120ba98..8ae433b48235da9b68dc904a14cd425d454c39de 100644 --- a/app/views/projects/diffs/_diffs.html.haml +++ b/app/views/projects/diffs/_diffs.html.haml @@ -6,7 +6,7 @@ .content-block.oneline-block.files-changed .inline-parallel-buttons - - unless expand_all_diffs? + - if !expand_all_diffs? && diff_files.any? { |diff_file| diff_file.collapsed? } = link_to 'Expand all', url_for(params.merge(expand_all_diffs: 1, format: 'html')), class: 'btn btn-default' - if show_whitespace_toggle - if current_controller?(:commit) diff --git a/app/views/projects/environments/_environment.html.haml b/app/views/projects/environments/_environment.html.haml index eafa246d05fd7ddf0b95c0f3780426f65f000168..e2453395602c1f6fe82a61a73c2268e491c3942f 100644 --- a/app/views/projects/environments/_environment.html.haml +++ b/app/views/projects/environments/_environment.html.haml @@ -15,3 +15,6 @@ %td - if last_deployment #{time_ago_with_tooltip(last_deployment.created_at)} + + %td + = render 'projects/deployments/actions', deployment: last_deployment diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml index 303d7c23d01b7203af1486e64078880389ba936f..a6dd34653abd84e4b0db61e0ae5aa38388ae7364 100644 --- a/app/views/projects/environments/index.html.haml +++ b/app/views/projects/environments/index.html.haml @@ -28,4 +28,5 @@ %th Environment %th Last deployment %th Date + %th = render @environments diff --git a/app/views/projects/environments/show.html.haml b/app/views/projects/environments/show.html.haml index b17aba2431fd30db3b4e0f3a2f13aa42844e7ca3..b8b1ce52a91617fde8cfcb74f99c67d897b10230 100644 --- a/app/views/projects/environments/show.html.haml +++ b/app/views/projects/environments/show.html.haml @@ -5,7 +5,7 @@ %div{ class: container_class } .top-area .col-md-9 - %h3.page-title= @environment.name.titleize + %h3.page-title= @environment.name.capitalize .col-md-3 .nav-controls diff --git a/app/views/projects/forks/index.html.haml b/app/views/projects/forks/index.html.haml index dbe9ddfde2f0877b097b715e1e43431b1dd9cf37..a1d79bdabda0b2f0fc76e2beb4ba76f6b4b21673 100644 --- a/app/views/projects/forks/index.html.haml +++ b/app/views/projects/forks/index.html.haml @@ -31,11 +31,11 @@ - if current_user && can?(current_user, :fork_project, @project) - if current_user.already_forked?(@project) && current_user.manageable_namespaces.size < 2 = link_to namespace_project_path(current_user, current_user.fork_of(@project)), title: 'Go to your fork', class: 'btn btn-new' do - = icon('code-fork fw') + = custom_icon('icon_fork') Fork - else = link_to new_namespace_project_fork_path(@project.namespace, @project), title: "Fork project", class: 'btn btn-new' do - = icon('code-fork fw') + = custom_icon('icon_fork') Fork diff --git a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml index 542827b2f1542db5f27be251b453bf5580cd84c2..331dc1fcc29f1165b7bfbadaa039d8ff9fbbc415 100644 --- a/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml +++ b/app/views/projects/generic_commit_statuses/_generic_commit_status.html.haml @@ -51,7 +51,7 @@ %td.duration - if generic_commit_status.duration = icon("clock-o") - #{duration_in_words(generic_commit_status.finished_at, generic_commit_status.started_at)} + = time_interval_in_words(generic_commit_status.duration) %td.timestamp - if generic_commit_status.finished_at diff --git a/app/views/projects/merge_requests/widget/open/_conflicts.html.haml b/app/views/projects/merge_requests/widget/open/_conflicts.html.haml index 06ab0a3fa0020f20ab8e7fbd796ae8e12f9d6ffc..f000cc38a653a3b34dfa875f42e0fcc27926eac4 100644 --- a/app/views/projects/merge_requests/widget/open/_conflicts.html.haml +++ b/app/views/projects/merge_requests/widget/open/_conflicts.html.haml @@ -4,7 +4,7 @@ %p Please resolve these conflicts or - - if @merge_request.can_be_merged_by?(current_user) + - if @merge_request.can_be_merged_via_command_line_by?(current_user) #{link_to "merge this request manually", "#modal_merge_info", class: "how_to_merge_link vlink", "data-toggle" => "modal"}. - else ask someone with write access to this repository to merge this request manually. diff --git a/app/views/projects/notes/_notes_with_form.html.haml b/app/views/projects/notes/_notes_with_form.html.haml index 56d302fab82540fd072f73f3106329d43d13f61c..74538a9723e089cf05ac043ca9dbb5abb11c7d3f 100644 --- a/app/views/projects/notes/_notes_with_form.html.haml +++ b/app/views/projects/notes/_notes_with_form.html.haml @@ -14,9 +14,9 @@ .disabled-comment.text-center .disabled-comment-text.inline Please - = link_to "register",new_user_session_path + = link_to "register", new_session_path(:user, redirect_to_referer: 'yes') or - = link_to "login",new_user_session_path + = link_to "login", new_session_path(:user, redirect_to_referer: 'yes') to post a comment :javascript diff --git a/app/views/projects/protected_branches/_branches_list.html.haml b/app/views/projects/protected_branches/_branches_list.html.haml index 97cb1a9052b497b1c9ede989fbbb9e54307fee5a..720d67dff7c4ff7faa08a3a0b8bd20a14b90db43 100644 --- a/app/views/projects/protected_branches/_branches_list.html.haml +++ b/app/views/projects/protected_branches/_branches_list.html.haml @@ -8,6 +8,7 @@ .table-responsive %table.table.protected-branches-list %colgroup + %col{ width: "20%" } %col{ width: "30%" } %col{ width: "25%" } %col{ width: "25%" } @@ -18,6 +19,7 @@ %th Protected Branch %th Commit %th Developers Can Push + %th Developers Can Merge - if can_admin_project %th %tbody diff --git a/app/views/projects/protected_branches/_protected_branch.html.haml b/app/views/projects/protected_branches/_protected_branch.html.haml index 474aec3a97cfa19474fbb242c1fcd588c4680c95..7fda7f96047342065fd51532bb16c33b4e873e01 100644 --- a/app/views/projects/protected_branches/_protected_branch.html.haml +++ b/app/views/projects/protected_branches/_protected_branch.html.haml @@ -16,6 +16,8 @@ (branch was removed from repository) %td = check_box_tag("developers_can_push", protected_branch.id, protected_branch.developers_can_push, data: { url: url }) + %td + = check_box_tag("developers_can_merge", protected_branch.id, protected_branch.developers_can_merge, data: { url: url }) - if can_admin_project %td = link_to 'Unprotect', [@project.namespace.becomes(Namespace), @project, protected_branch], data: { confirm: 'Branch will be writable for developers. Are you sure?' }, method: :delete, class: "btn btn-warning btn-sm pull-right" diff --git a/app/views/projects/protected_branches/index.html.haml b/app/views/projects/protected_branches/index.html.haml index 883d3e3af1eabc9e94e82112c4b7a80087bb3d29..151e1d6485177b808d17128f050d34162a0367e3 100644 --- a/app/views/projects/protected_branches/index.html.haml +++ b/app/views/projects/protected_branches/index.html.haml @@ -36,6 +36,14 @@ = f.label :developers_can_push, "Developers can push", class: "label-light append-bottom-0" %p.light.append-bottom-0 Allow developers to push to this branch + + .form-group + = f.check_box :developers_can_merge, class: "pull-left" + .prepend-left-20 + = f.label :developers_can_merge, "Developers can merge", class: "label-light append-bottom-0" + %p.light.append-bottom-0 + Allow developers to accept merge requests to this branch = f.submit "Protect", class: "btn-create btn protect-branch-btn", disabled: true + %hr = render "branches_list" diff --git a/app/views/projects/services/_form.html.haml b/app/views/projects/services/_form.html.haml index 1f13ea28b4e14243597fbe9517e3e2ad2c35c9fb..166dc4a01fc3dadb96714fa1723018ecd6f28b4d 100644 --- a/app/views/projects/services/_form.html.haml +++ b/app/views/projects/services/_form.html.haml @@ -12,5 +12,5 @@ - if @service.valid? && @service.activated? - disabled = @service.can_test? ? '':'disabled' - = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service.to_param), class: "btn #{disabled}" + = link_to 'Test settings', test_namespace_project_service_path(@project.namespace, @project, @service), class: "btn #{disabled}", title: @service.disabled_title = link_to "Cancel", namespace_project_services_path(@project.namespace, @project), class: "btn btn-cancel" diff --git a/app/views/projects/tags/show.html.haml b/app/views/projects/tags/show.html.haml index b7d7d5c5382da27ecb1d83113ce49797d2c9e0de..395d7af6cbb4d033ea539e5c2fabfc0fe35fce79 100644 --- a/app/views/projects/tags/show.html.haml +++ b/app/views/projects/tags/show.html.haml @@ -1,36 +1,39 @@ +- @no_container = true - page_title @tag.name, "Tags" = render "projects/commits/head" -.row-content-block - .pull-right - - if can?(current_user, :push_code, @project) - = link_to edit_namespace_project_tag_release_path(@project.namespace, @project, @tag.name), class: 'btn-grouped btn has-tooltip', title: 'Edit release notes' do - = icon("pencil") - = link_to namespace_project_tree_path(@project.namespace, @project, @tag.name), class: 'btn btn-grouped has-tooltip', title: 'Browse files' do - = icon('files-o') - = link_to namespace_project_commits_path(@project.namespace, @project, @tag.name), class: 'btn btn-grouped has-tooltip', title: 'Browse commits' do - = icon('history') - - if can? current_user, :download_code, @project - = render 'projects/tags/download', ref: @tag.name, project: @project - - if can?(current_user, :admin_project, @project) - .pull-right - = link_to namespace_project_tag_path(@project.namespace, @project, @tag.name), class: 'btn btn-remove remove-row grouped has-tooltip', title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{@tag.name}' tag cannot be undone. Are you sure?" } do - %i.fa.fa-trash-o - .title - %span.item-title= @tag.name - - if @commit - = render 'projects/branches/commit', commit: @commit, project: @project - - else - Cant find HEAD commit for this tag - - if @tag.message.present? - %pre.body - = strip_gpg_signature(@tag.message) +%div{ class: container_class } + .sub-header-block + .pull-right.tag-buttons + - if can?(current_user, :push_code, @project) + = link_to edit_namespace_project_tag_release_path(@project.namespace, @project, @tag.name), class: 'btn has-tooltip', title: 'Edit release notes' do + = icon("pencil") + = link_to namespace_project_tree_path(@project.namespace, @project, @tag.name), class: 'btn has-tooltip', title: 'Browse files' do + = icon('files-o') + = link_to namespace_project_commits_path(@project.namespace, @project, @tag.name), class: 'btn has-tooltip', title: 'Browse commits' do + = icon('history') + - if can? current_user, :download_code, @project + = render 'projects/tags/download', ref: @tag.name, project: @project + - if can?(current_user, :admin_project, @project) + .pull-right + = link_to namespace_project_tag_path(@project.namespace, @project, @tag.name), class: 'btn btn-remove remove-row grouped has-tooltip', title: "Delete tag", method: :delete, data: { confirm: "Deleting the '#{@tag.name}' tag cannot be undone. Are you sure?" } do + %i.fa.fa-trash-o + .tag-info.append-bottom-10 + .title + %span.item-title= @tag.name + - if @commit + = render 'projects/branches/commit', commit: @commit, project: @project + - else + Cant find HEAD commit for this tag + - if @tag.message.present? + %pre.body + = strip_gpg_signature(@tag.message) -.append-bottom-default.prepend-top-default - - if @release.description.present? - .description - .wiki - = preserve do - = markdown @release.description - - else - This tag has no release notes. + .append-bottom-default.prepend-top-default + - if @release.description.present? + .description + .wiki + = preserve do + = markdown @release.description + - else + This tag has no release notes. diff --git a/app/views/shared/icons/_icon_fork.svg b/app/views/shared/icons/_icon_fork.svg new file mode 100644 index 0000000000000000000000000000000000000000..420ffe3a55bd8ad7c41374b1d866c959c4c76218 --- /dev/null +++ b/app/views/shared/icons/_icon_fork.svg @@ -0,0 +1 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="40" height="40" viewBox="0 0 40 40" xmlns:xlink="http://www.w3.org/1999/xlink"><defs><circle id="a" cx="4" cy="4" r="4"/><mask id="d" width="8" height="8" x="0" y="0" fill="#fff"><use xlink:href="#a"/></mask><circle id="b" cx="20" cy="4" r="4"/><mask id="e" width="8" height="8" x="0" y="0" fill="#fff"><use xlink:href="#b"/></mask><circle id="c" cx="12" cy="30" r="4"/><mask id="f" width="8" height="8" x="0" y="0" fill="#fff"><use xlink:href="#c"/></mask></defs><g fill="none" fill-rule="evenodd" transform="translate(8 3)"><path fill="#7E7E7E" d="M10 19.667c-4.14-1.29-7.389-5.878-7.389-5.878C2.274 13.353 2 12.545 2 12.01V6h4v5.509c0 .276.166.65.367.831 0 0 1.136 1.028 1.746 1.574C9.617 15.261 11.048 16 12.09 16c1.028 0 2.41-.723 3.858-2.048.588-.54 1.84-1.742 1.84-1.742a.784.784 0 0 0 .211-.502V6h4v6.008c0 .548-.259 1.349-.601 1.795 0 0-3.21 4.707-7.399 5.916V27h-4v-7.333z"/><use stroke="#7E7E7E" stroke-width="4" mask="url(#d)" xlink:href="#a"/><use stroke="#7E7E7E" stroke-width="4" mask="url(#e)" xlink:href="#b"/><use stroke="#7E7E7E" stroke-width="4" mask="url(#f)" xlink:href="#c"/></g></svg> \ No newline at end of file diff --git a/app/views/shared/icons/_icon_status_cancel.svg b/app/views/shared/icons/_icon_status_cancel.svg new file mode 100644 index 0000000000000000000000000000000000000000..6a0bc1490c4fd67f6a92609077ee1612fe030642 --- /dev/null +++ b/app/views/shared/icons/_icon_status_cancel.svg @@ -0,0 +1,12 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <circle id="a" cx="7" cy="7" r="7"/> + <mask id="b" width="14" height="14" x="0" y="0" fill="white"> + <use xlink:href="#a"/> + </mask> + </defs> + <g fill="none" fill-rule="evenodd"> + <use stroke="#5C5C5C" stroke-width="2" mask="url(#b)" xlink:href="#a"/> + <rect width="10" height="1" x="2" y="6.5" fill="#5C5C5C" transform="rotate(45 7 7)" rx=".3"/> + </g> +</svg> diff --git a/app/views/shared/icons/_icon_status_failed.svg b/app/views/shared/icons/_icon_status_failed.svg new file mode 100644 index 0000000000000000000000000000000000000000..c41ca18cae751e4817f57528c30c09512b285c12 --- /dev/null +++ b/app/views/shared/icons/_icon_status_failed.svg @@ -0,0 +1,12 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <circle id="a" cx="7" cy="7" r="7"/> + <mask id="b" width="14" height="14" x="0" y="0" fill="white"> + <use xlink:href="#a"/> + </mask> + </defs> + <g fill="none" fill-rule="evenodd"> + <use stroke="#D22852" stroke-width="2" mask="url(#b)" xlink:href="#a"/> + <path fill="#D22852" d="M7.5,6.5 L7.5,4.30578971 C7.5,4.12531853 7.36809219,4 7.20537567,4 L6.79462433,4 C6.63904572,4 6.5,4.13690672 6.5,4.30578971 L6.5,6.5 L4.30578971,6.5 C4.12531853,6.5 4,6.63190781 4,6.79462433 L4,7.20537567 C4,7.36095428 4.13690672,7.5 4.30578971,7.5 L6.5,7.5 L6.5,9.69421029 C6.5,9.87468147 6.63190781,10 6.79462433,10 L7.20537567,10 C7.36095428,10 7.5,9.86309328 7.5,9.69421029 L7.5,7.5 L9.69421029,7.5 C9.87468147,7.5 10,7.36809219 10,7.20537567 L10,6.79462433 C10,6.63904572 9.86309328,6.5 9.69421029,6.5 L7.5,6.5 Z" transform="rotate(45 7 7)"/> + </g> +</svg> diff --git a/app/views/shared/icons/_icon_status_pending.svg b/app/views/shared/icons/_icon_status_pending.svg new file mode 100644 index 0000000000000000000000000000000000000000..035cd8b4cccda9483f5c463504c0a8fb6d2b166e --- /dev/null +++ b/app/views/shared/icons/_icon_status_pending.svg @@ -0,0 +1,13 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <circle id="a" cx="7" cy="7" r="7"/> + <mask id="b" width="14" height="14" x="0" y="0" fill="white"> + <use xlink:href="#a"/> + </mask> + </defs> + <g fill="none" fill-rule="evenodd"> + <use stroke="#E75E40" stroke-width="2" mask="url(#b)" xlink:href="#a"/> + <rect width="1" height="4" x="5" y="5" fill="#E75E40" rx=".3"/> + <rect width="1" height="4" x="8" y="5" fill="#E75E40" rx=".3"/> + </g> +</svg> diff --git a/app/views/shared/icons/_icon_status_running.svg b/app/views/shared/icons/_icon_status_running.svg new file mode 100644 index 0000000000000000000000000000000000000000..a48b3a25099a426f4620c10e09127ad92776b7c6 --- /dev/null +++ b/app/views/shared/icons/_icon_status_running.svg @@ -0,0 +1,12 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <circle id="a" cx="7" cy="7" r="7"/> + <mask id="b" width="14" height="14" x="0" y="0" fill="white"> + <use xlink:href="#a"/> + </mask> + </defs> + <g fill="none" fill-rule="evenodd"> + <use stroke="#2D9FD8" stroke-width="2" mask="url(#b)" xlink:href="#a"/> + <path fill="#2D9FD8" d="M7,3.00800862 C9.09023405,3.13960661 10.7448145,4.87657932 10.7448145,7 C10.7448145,9.209139 8.95395346,11 6.74481446,11 C5.4560962,11 4.30972054,10.3905589 3.57817301,9.44416214 L7,7 L7,3.00800862 Z"/> + </g> +</svg> diff --git a/app/views/shared/icons/_icon_status_success.svg b/app/views/shared/icons/_icon_status_success.svg new file mode 100644 index 0000000000000000000000000000000000000000..260eab013a3662c757ae9735e86e8f7a702cbc45 --- /dev/null +++ b/app/views/shared/icons/_icon_status_success.svg @@ -0,0 +1,15 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <circle id="a" cx="7" cy="7" r="7"/> + <mask id="b" width="14" height="14" x="0" y="0" fill="white"> + <use xlink:href="#a"/> + </mask> + </defs> + <g fill="none" fill-rule="evenodd"> + <use stroke="#31AF64" stroke-width="2" mask="url(#b)" xlink:href="#a"/> + <g fill="#31AF64" transform="rotate(45 -.13 10.953)"> + <rect width="1" height="5" x="2" rx=".3"/> + <rect width="3" height="1" y="4" rx=".3"/> + </g> + </g> +</svg> diff --git a/app/views/shared/icons/_icon_status_warning.svg b/app/views/shared/icons/_icon_status_warning.svg new file mode 100644 index 0000000000000000000000000000000000000000..d47e7a1c93f20bfc8193998f265d88000d5cfb80 --- /dev/null +++ b/app/views/shared/icons/_icon_status_warning.svg @@ -0,0 +1,15 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 14 14" xmlns:xlink="http://www.w3.org/1999/xlink"> + <defs> + <circle id="a" cx="7" cy="7" r="7"/> + <mask id="b" width="14" height="14" x="0" y="0" fill="white"> + <use xlink:href="#a"/> + </mask> + </defs> + <g fill="none" fill-rule="evenodd"> + <g fill="#FF8A24" transform="translate(6 3)"> + <rect width="2" height="5" rx=".5"/> + <rect width="2" height="2" y="6" rx=".5"/> + </g> + <use stroke="#FF8A24" stroke-width="2" mask="url(#b)" xlink:href="#a"/> + </g> +</svg> diff --git a/app/views/shared/issuable/_filter.html.haml b/app/views/shared/issuable/_filter.html.haml index 094d6636c665e91c4d87b12b5293d89eb0b48090..0b7fa8c7d06d34a5cd7aa36683aedd4aae4d6248 100644 --- a/app/views/shared/issuable/_filter.html.haml +++ b/app/views/shared/issuable/_filter.html.haml @@ -44,9 +44,15 @@ placeholder: "Search authors", data: { first_user: (current_user.username if current_user), null_user: true, current_user: true, project_id: @project.id, field_name: "update[assignee_id]" } }) .filter-item.inline = dropdown_tag("Milestone", options: { title: "Assign milestone", toggle_class: 'js-milestone-select js-extra-options js-filter-submit js-filter-bulk-update', filter: true, dropdown_class: "dropdown-menu-selectable dropdown-menu-milestone", placeholder: "Search milestones", data: { show_no: true, field_name: "update[milestone_id]", project_id: @project.id, milestones: namespace_project_milestones_path(@project.namespace, @project, :json), use_id: true } }) - .filter-item.inline.labels-filter = render "shared/issuable/label_dropdown", classes: ['js-filter-bulk-update', 'js-multiselect'], show_create: false, show_footer: false, extra_options: false, filter_submit: false, show_footer: false, data_options: { persist_when_hide: "true", field_name: "update[label_ids][]", show_no: false, show_any: false, use_id: true } + .filter-item.inline + = dropdown_tag("Subscription", options: { toggle_class: "js-subscription-event", title: "Change subscription", dropdown_class: "dropdown-menu-selectable", data: { field_name: "update[subscription_event]" } } ) do + %ul + %li + %a{href: "#", data: {id: "subscribe"}} Subscribe + %li + %a{href: "#", data: {id: "unsubscribe"}} Unsubscribe = hidden_field_tag 'update[issues_ids]', [] = hidden_field_tag :state_event, params[:state_event] @@ -63,6 +69,7 @@ new LabelsSelect(); new MilestoneSelect(); new IssueStatusSelect(); + new SubscriptionSelect(); $('form.filter-form').on('submit', function (event) { event.preventDefault(); Turbolinks.visit(this.action + '&' + $(this).serialize()); diff --git a/app/workers/project_export_worker.rb b/app/workers/project_export_worker.rb index 39f6037e0777ea2cd4c6eb49d2c015a53c97c61f..615311e63f50efaef365bbf8e028b49a669b34ab 100644 --- a/app/workers/project_export_worker.rb +++ b/app/workers/project_export_worker.rb @@ -1,7 +1,7 @@ class ProjectExportWorker include Sidekiq::Worker - sidekiq_options queue: :gitlab_shell, retry: true + sidekiq_options queue: :gitlab_shell, retry: 3 def perform(current_user_id, project_id) current_user = User.find(current_user_id) diff --git a/config/application.rb b/config/application.rb index 5f7b6a3c049467e62001965f6639782dcc59daa7..50cc4235eda8ffde01f04d0c772c15d563210b86 100644 --- a/config/application.rb +++ b/config/application.rb @@ -76,7 +76,7 @@ module Gitlab # Enable the asset pipeline config.assets.enabled = true - config.assets.paths << Gemojione.index.images_path + config.assets.paths << Gemojione.images_path config.assets.precompile << "*.png" config.assets.precompile << "print.css" config.assets.precompile << "notify.css" diff --git a/config/initializers/relative_naming_ci_namespace.rb b/config/initializers/relative_naming_ci_namespace.rb new file mode 100644 index 0000000000000000000000000000000000000000..59abe1b9b91984a2b68058eff8f7da8d34299a93 --- /dev/null +++ b/config/initializers/relative_naming_ci_namespace.rb @@ -0,0 +1,16 @@ +# Description: https://coderwall.com/p/heed_q/rails-routing-and-namespaced-models +# +# This allows us to use CI ActiveRecord objects in all routes and use it: +# - [project.namespace, project, build] +# +# instead of: +# - namespace_project_build_path(project.namespace, project, build) +# +# Without that, Ci:: namespace is used for resolving routes: +# - namespace_project_ci_build_path(project.namespace, project, build) + +module Ci + def self.use_relative_model_naming? + true + end +end diff --git a/config/initializers/secure_headers.rb b/config/initializers/secure_headers.rb new file mode 100644 index 0000000000000000000000000000000000000000..253e3cf74109b0ad7682ab656c317067768e7c2c --- /dev/null +++ b/config/initializers/secure_headers.rb @@ -0,0 +1,99 @@ +# CSP headers have to have single quotes, so failures relating to quotes +# inside Ruby string arrays are irrelevant. +# rubocop:disable Lint/PercentStringArray +require 'gitlab/current_settings' +include Gitlab::CurrentSettings + +CSP_REPORT_URI = '' + +# Content Security Policy Headers +# For more information on CSP see: +# - https://gitlab.com/gitlab-org/gitlab-ce/issues/18231 +# - https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives +SecureHeaders::Configuration.default do |config| + # Mark all cookies as "Secure", "HttpOnly", and "SameSite=Strict". + config.cookies = { + secure: true, + httponly: true, + samesite: { + strict: true + } + } + config.x_content_type_options = "nosniff" + config.x_xss_protection = "1; mode=block" + config.x_download_options = "noopen" + config.x_permitted_cross_domain_policies = "none" + config.referrer_policy = "origin-when-cross-origin" + config.csp = { + # "Meta" values. + report_only: true, + preserve_schemes: true, + + # "Directive" values. + # Default source allows nothing, more permissive values are set per-policy. + default_src: %w('none'), + # (Deprecated) Don't allow iframes. + frame_src: %w('none'), + # Only allow XMLHTTPRequests from the GitLab instance itself. + connect_src: %w('self'), + # Only load local fonts. + font_src: %w('self'), + # Load local images, any external image available over HTTPS. + img_src: %w(* 'self' data:), + # Audio and video can't be played on GitLab currently, so it's disabled. + media_src: %w('none'), + # Don't allow <object>, <embed>, or <applet> elements. + object_src: %w('none'), + # Allow local scripts and inline scripts. + script_src: %w('unsafe-inline' 'unsafe-eval' 'self'), + # Allow local stylesheets and inline styles. + style_src: %w('unsafe-inline' 'self'), + # The URIs that a user agent may use as the document base URL. + base_uri: %w('self'), + # Only allow local iframes and service workers + child_src: %w('self'), + # Only submit form information to the GitLab instance. + form_action: %w('self'), + # Disallow any parents from embedding a page in an iframe. + frame_ancestors: %w('none'), + # Don't allow any plugins (Flash, Shockwave, etc.) + plugin_types: %w(), + # Blocks all mixed (HTTP) content. + block_all_mixed_content: true, + # Upgrades insecure requests to HTTPS when possible. + upgrade_insecure_requests: true + } + + config.csp[:report_uri] = %W(#{CSP_REPORT_URI}) + + # Allow Bootstrap Linter in development mode. + if Rails.env.development? + config.csp[:script_src] << "maxcdn.bootstrapcdn.com" + end + + # reCAPTCHA + if current_application_settings.recaptcha_enabled + config.csp[:script_src] << "https://www.google.com/recaptcha/" + config.csp[:script_src] << "https://www.gstatic.com/recaptcha/" + config.csp[:frame_src] << "https://www.google.com/recaptcha/" + config.x_frame_options = "SAMEORIGIN" + end + + # Gravatar + if current_application_settings.gravatar_enabled? + config.csp[:img_src] << "www.gravatar.com" + config.csp[:img_src] << "secure.gravatar.com" + config.csp[:img_src] << Gitlab.config.gravatar.host + end + + # Piwik + if Gitlab.config.extra.has_key?('piwik_url') && Gitlab.config.extra.has_key?('piwik_site_id') + config.csp[:script_src] << Gitlab.config.extra.piwik_url + config.csp[:img_src] << Gitlab.config.extra.piwik_url + end + + # Google Analytics + if Gitlab.config.extra.has_key?('google_analytics_id') + config.csp[:script_src] << "https://www.google-analytics.com" + end +end diff --git a/config/initializers/sidekiq.rb b/config/initializers/sidekiq.rb index 593c14a289fa4b831a907522a038d669fa76827b..b40fd81ff96559cd12cd16c9a2ccf5153f357c63 100644 --- a/config/initializers/sidekiq.rb +++ b/config/initializers/sidekiq.rb @@ -13,7 +13,14 @@ Sidekiq.configure_server do |config| # UGLY Hack to get nested hash from settingslogic cron_jobs = JSON.parse(Gitlab.config.cron_jobs.to_json) # UGLY hack: Settingslogic doesn't allow 'class' key - cron_jobs.each { |k, v| cron_jobs[k]['class'] = cron_jobs[k].delete('job_class') } + cron_jobs_required_keys = %w(job_class cron) + cron_jobs.each do |k, v| + if cron_jobs[k] && cron_jobs_required_keys.all? { |s| cron_jobs[k].key?(s) } + cron_jobs[k]['class'] = cron_jobs[k].delete('job_class') + else + raise("Invalid cron_jobs config key: '#{k}'. Check your gitlab config file.") + end + end Sidekiq::Cron::Job.load_from_hash! cron_jobs # Database pool should be at least `sidekiq_concurrency` + 2 diff --git a/config/routes.rb b/config/routes.rb index 3160fd767b84a43baa42b8b6a8e5c30faff18f50..2a9fe30b0e6a3b72884f0ffb62580a127eb2b0ac 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -89,11 +89,10 @@ Rails.application.routes.draw do mount Grack::AuthSpawner, at: '/', constraints: lambda { |request| /[-\/\w\.]+\.git\/(info\/lfs|gitlab-lfs)/.match(request.path_info) }, via: [:get, :post, :put] # Help - - get 'help' => 'help#index' - get 'help/*path' => 'help#show', as: :help_page - get 'help/shortcuts' - get 'help/ui' => 'help#ui' + get 'help' => 'help#index' + get 'help/shortcuts' => 'help#shortcuts' + get 'help/ui' => 'help#ui' + get 'help/*path' => 'help#show', as: :help_page # # Global snippets @@ -750,6 +749,7 @@ Rails.application.routes.draw do get :status post :cancel post :retry + post :play post :erase get :trace get :raw diff --git a/db/fixtures/development/14_builds.rb b/db/fixtures/development/14_builds.rb index 51ff451eb4c0280570dc6657b4a21bffd84bc6fe..124704cb45157574822bef247b469bbbb72c6235 100644 --- a/db/fixtures/development/14_builds.rb +++ b/db/fixtures/development/14_builds.rb @@ -1,13 +1,34 @@ class Gitlab::Seeder::Builds + STAGES = %w[build notify_build test notify_test deploy notify_deploy] + def initialize(project) @project = project end def seed! - ci_commits.each do |ci_commit| + pipelines.each do |pipeline| begin - build_create!(ci_commit, name: 'test build 1') - build_create!(ci_commit, status: 'success', name: 'test build 2') + build_create!(pipeline, name: 'build:linux', stage: 'build') + build_create!(pipeline, name: 'build:osx', stage: 'build') + + build_create!(pipeline, name: 'slack post build', stage: 'notify_build') + + build_create!(pipeline, name: 'rspec:linux', stage: 'test') + build_create!(pipeline, name: 'rspec:windows', stage: 'test') + build_create!(pipeline, name: 'rspec:windows', stage: 'test') + build_create!(pipeline, name: 'rspec:osx', stage: 'test') + build_create!(pipeline, name: 'spinach:linux', stage: 'test') + build_create!(pipeline, name: 'spinach:osx', stage: 'test') + build_create!(pipeline, name: 'cucumber:linux', stage: 'test') + build_create!(pipeline, name: 'cucumber:osx', stage: 'test') + + build_create!(pipeline, name: 'slack post test', stage: 'notify_test') + + build_create!(pipeline, name: 'staging', stage: 'deploy', environment: 'staging') + build_create!(pipeline, name: 'production', stage: 'deploy', environment: 'production', when: 'manual') + + commit_status_create!(pipeline, name: 'jenkins') + print '.' rescue ActiveRecord::RecordInvalid print 'F' @@ -15,8 +36,8 @@ class Gitlab::Seeder::Builds end end - def ci_commits - commits = @project.repository.commits('master', nil, 5) + def pipelines + commits = @project.repository.commits('master', limit: 5) commits_sha = commits.map { |commit| commit.raw.id } commits_sha.map do |sha| @project.ensure_pipeline(sha, 'master') @@ -25,11 +46,11 @@ class Gitlab::Seeder::Builds [] end - def build_create!(ci_commit, opts = {}) - attributes = build_attributes_for(ci_commit).merge(opts) + def build_create!(pipeline, opts = {}) + attributes = build_attributes_for(pipeline, opts) build = Ci::Build.new(attributes) - if %w(success failed).include?(build.status) + if opts[:name].start_with?('build') artifacts_cache_file(artifacts_archive_path) do |file| build.artifacts_file = file end @@ -40,19 +61,28 @@ class Gitlab::Seeder::Builds end build.save! + build.update(status: build_status) if %w(running success failed).include?(build.status) # We need to set build trace after saving a build (id required) build.trace = FFaker::Lorem.paragraphs(6).join("\n\n") end end + + def commit_status_create!(pipeline, opts = {}) + attributes = commit_status_attributes_for(pipeline, opts) + GenericCommitStatus.create(attributes) + end + + def commit_status_attributes_for(pipeline, opts) + { name: 'test build', stage: 'test', stage_idx: stage_index(opts[:stage]), + ref: 'master', user: build_user, project: @project, pipeline: pipeline, + created_at: Time.now, updated_at: Time.now + }.merge(opts) + end - def build_attributes_for(ci_commit) - { name: 'test build', commands: "$ build command", - stage: 'test', stage_idx: 1, ref: 'master', - user_id: build_user, gl_project_id: @project.id, - status: build_status, commit_id: ci_commit.id, - created_at: Time.now, updated_at: Time.now } + def build_attributes_for(pipeline, opts) + commit_status_attributes_for(pipeline, opts).merge(commands: '$ build command') end def build_user @@ -63,13 +93,16 @@ class Gitlab::Seeder::Builds Ci::Build::AVAILABLE_STATUSES.sample end + def stage_index(stage) + STAGES.index(stage) || 0 + end + def artifacts_archive_path Rails.root + 'spec/fixtures/ci_build_artifacts.zip' end def artifacts_metadata_path Rails.root + 'spec/fixtures/ci_build_artifacts_metadata.gz' - end def artifacts_cache_file(file_path) diff --git a/db/migrate/20160519203051_add_developers_can_merge_to_protected_branches.rb b/db/migrate/20160519203051_add_developers_can_merge_to_protected_branches.rb new file mode 100644 index 0000000000000000000000000000000000000000..15ad8e8bcbb6b42184b5a807e9915344c960d53f --- /dev/null +++ b/db/migrate/20160519203051_add_developers_can_merge_to_protected_branches.rb @@ -0,0 +1,9 @@ +class AddDevelopersCanMergeToProtectedBranches < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + def change + add_column_with_default :protected_branches, :developers_can_merge, :boolean, default: false, allow_null: false + end +end diff --git a/db/migrate/20160629025435_add_column_in_progress_merge_commit_sha_to_merge_requests.rb b/db/migrate/20160629025435_add_column_in_progress_merge_commit_sha_to_merge_requests.rb new file mode 100644 index 0000000000000000000000000000000000000000..7c5f76572ef80e92b6b44f360f10430972396b9d --- /dev/null +++ b/db/migrate/20160629025435_add_column_in_progress_merge_commit_sha_to_merge_requests.rb @@ -0,0 +1,8 @@ +# See http://doc.gitlab.com/ce/development/migration_style_guide.html +# for more information on how to write migrations for GitLab. + +class AddColumnInProgressMergeCommitShaToMergeRequests < ActiveRecord::Migration + def change + add_column :merge_requests, :in_progress_merge_commit_sha, :string + end +end diff --git a/db/migrate/20160715132507_add_user_id_to_pipeline.rb b/db/migrate/20160715132507_add_user_id_to_pipeline.rb new file mode 100644 index 0000000000000000000000000000000000000000..af0461c4daf9e64749a35e92a1d05943c1c6b5ec --- /dev/null +++ b/db/migrate/20160715132507_add_user_id_to_pipeline.rb @@ -0,0 +1,7 @@ +class AddUserIdToPipeline < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + def change + add_column :ci_commits, :user_id, :integer + end +end diff --git a/db/migrate/20160715134306_add_index_for_pipeline_user_id.rb b/db/migrate/20160715134306_add_index_for_pipeline_user_id.rb new file mode 100644 index 0000000000000000000000000000000000000000..7c991c6d998d29f5f4124eeda64ac67fb1da9911 --- /dev/null +++ b/db/migrate/20160715134306_add_index_for_pipeline_user_id.rb @@ -0,0 +1,9 @@ +class AddIndexForPipelineUserId < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + disable_ddl_transaction! + + def change + add_concurrent_index :ci_commits, :user_id + end +end diff --git a/db/migrate/20160716115710_add_when_and_yaml_variables_to_ci_builds.rb b/db/migrate/20160716115710_add_when_and_yaml_variables_to_ci_builds.rb new file mode 100644 index 0000000000000000000000000000000000000000..3e084023a650392fd4e0e7ebb23484483d604163 --- /dev/null +++ b/db/migrate/20160716115710_add_when_and_yaml_variables_to_ci_builds.rb @@ -0,0 +1,8 @@ +class AddWhenAndYamlVariablesToCiBuilds < ActiveRecord::Migration + include Gitlab::Database::MigrationHelpers + + def change + add_column :ci_builds, :when, :string + add_column :ci_builds, :yaml_variables, :text + end +end diff --git a/db/schema.rb b/db/schema.rb index 8c12898eec9212b12195ce9ab6897623834b6baa..8882377f9f4bad57c26aa0cd7fd56c62ed0a6f47 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -11,7 +11,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 20160712171823) do +ActiveRecord::Schema.define(version: 20160716115710) do # These are extensions that must be enabled in order to support this database enable_extension "plpgsql" @@ -168,6 +168,8 @@ ActiveRecord::Schema.define(version: 20160712171823) do t.string "environment" t.datetime "artifacts_expire_at" t.integer "artifacts_size" + t.string "when" + t.text "yaml_variables" end add_index "ci_builds", ["commit_id", "stage_idx", "created_at"], name: "index_ci_builds_on_commit_id_and_stage_idx_and_created_at", using: :btree @@ -199,6 +201,7 @@ ActiveRecord::Schema.define(version: 20160712171823) do t.datetime "started_at" t.datetime "finished_at" t.integer "duration" + t.integer "user_id" end add_index "ci_commits", ["gl_project_id", "sha"], name: "index_ci_commits_on_gl_project_id_and_sha", using: :btree @@ -210,6 +213,7 @@ ActiveRecord::Schema.define(version: 20160712171823) do add_index "ci_commits", ["project_id"], name: "index_ci_commits_on_project_id", using: :btree add_index "ci_commits", ["sha"], name: "index_ci_commits_on_sha", using: :btree add_index "ci_commits", ["status"], name: "index_ci_commits_on_status", using: :btree + add_index "ci_commits", ["user_id"], name: "index_ci_commits_on_user_id", using: :btree create_table "ci_events", force: :cascade do |t| t.integer "project_id" @@ -624,8 +628,8 @@ ActiveRecord::Schema.define(version: 20160712171823) do t.integer "merge_user_id" t.string "merge_commit_sha" t.datetime "deleted_at" + t.string "in_progress_merge_commit_sha" end - add_index "merge_requests", ["assignee_id"], name: "index_merge_requests_on_assignee_id", using: :btree add_index "merge_requests", ["author_id"], name: "index_merge_requests_on_author_id", using: :btree add_index "merge_requests", ["created_at", "id"], name: "index_merge_requests_on_created_at_and_id", using: :btree @@ -858,11 +862,12 @@ ActiveRecord::Schema.define(version: 20160712171823) do add_index "projects", ["visibility_level"], name: "index_projects_on_visibility_level", using: :btree create_table "protected_branches", force: :cascade do |t| - t.integer "project_id", null: false - t.string "name", null: false + t.integer "project_id", null: false + t.string "name", null: false t.datetime "created_at" t.datetime "updated_at" - t.boolean "developers_can_push", default: false, null: false + t.boolean "developers_can_push", default: false, null: false + t.boolean "developers_can_merge", default: false, null: false end add_index "protected_branches", ["project_id"], name: "index_protected_branches_on_project_id", using: :btree diff --git a/doc/api/branches.md b/doc/api/branches.md index abc4732c395584d2ea88ecf3a4a9ef56238bd64c..dbe8306c66f42b392419a0d74451ce4af8558a2b 100644 --- a/doc/api/branches.md +++ b/doc/api/branches.md @@ -23,6 +23,8 @@ Example response: { "name": "master", "protected": true, + "developers_can_push": false, + "developers_can_merge": false, "commit": { "author_email": "john@example.com", "author_name": "John Smith", @@ -64,6 +66,8 @@ Example response: { "name": "master", "protected": true, + "developers_can_push": false, + "developers_can_merge": false, "commit": { "author_email": "john@example.com", "author_name": "John Smith", @@ -91,13 +95,15 @@ PUT /projects/:id/repository/branches/:branch/protect ``` ```bash -curl -X PUT -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/repository/branches/master/protect +curl -X PUT -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/5/repository/branches/master/protect?developers_can_push=true&developers_can_merge=true ``` | Attribute | Type | Required | Description | | --------- | ---- | -------- | ----------- | | `id` | integer | yes | The ID of a project | | `branch` | string | yes | The name of the branch | +| `developers_can_push` | boolean | no | Flag if developers can push to the branch | +| `developers_can_merge` | boolean | no | Flag if developers can merge to the branch | Example response: @@ -117,7 +123,9 @@ Example response: ] }, "name": "master", - "protected": true + "protected": true, + "developers_can_push": true, + "developers_can_merge": true } ``` @@ -158,7 +166,9 @@ Example response: ] }, "name": "master", - "protected": false + "protected": false, + "developers_can_push": false, + "developers_can_merge": false } ``` @@ -196,7 +206,9 @@ Example response: ] }, "name": "newbranch", - "protected": false + "protected": false, + "developers_can_push": false, + "developers_can_merge": false } ``` diff --git a/doc/api/issues.md b/doc/api/issues.md index 3ced787b23e7cadf3b240a69b7787f15a0c45a83..419fb8f85d8ace0393e8f123e7c1ce77735c34d5 100644 --- a/doc/api/issues.md +++ b/doc/api/issues.md @@ -78,7 +78,8 @@ Example response: "iid" : 6, "labels" : [], "subscribed" : false, - "user_notes_count": 1 + "user_notes_count": 1, + "due_date": "2016-07-22" } ] ``` @@ -154,7 +155,8 @@ Example response: "updated_at" : "2016-01-04T15:31:46.176Z", "created_at" : "2016-01-04T15:31:46.176Z", "subscribed" : false, - "user_notes_count": 1 + "user_notes_count": 1, + "due_date": null } ] ``` @@ -232,7 +234,8 @@ Example response: "updated_at" : "2016-01-04T15:31:46.176Z", "created_at" : "2016-01-04T15:31:46.176Z", "subscribed" : false, - "user_notes_count": 1 + "user_notes_count": 1, + "due_date": "2016-07-22" } ] ``` @@ -295,7 +298,8 @@ Example response: "updated_at" : "2016-01-04T15:31:46.176Z", "created_at" : "2016-01-04T15:31:46.176Z", "subscribed": false, - "user_notes_count": 1 + "user_notes_count": 1, + "due_date": null } ``` @@ -320,6 +324,7 @@ POST /projects/:id/issues | `milestone_id` | integer | no | The ID of a milestone to assign issue | | `labels` | string | no | Comma-separated label names for an issue | | `created_at` | string | no | Date time string, ISO 8601 formatted, e.g. `2016-03-11T03:45:40Z` | +| `due_date` | string | no | Date time string in the format YEAR-MONTH-DAY, e.g. `2016-03-11` | ```bash curl -X POST -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/4/issues?title=Issues%20with%20auth&labels=bug @@ -351,7 +356,8 @@ Example response: "updated_at" : "2016-01-07T12:44:33.959Z", "milestone" : null, "subscribed" : true, - "user_notes_count": 0 + "user_notes_count": 0, + "due_date": null } ``` @@ -379,6 +385,7 @@ PUT /projects/:id/issues/:issue_id | `labels` | string | no | Comma-separated label names for an issue | | `state_event` | string | no | The state event of an issue. Set `close` to close the issue and `reopen` to reopen it | | `updated_at` | string | no | Date time string, ISO 8601 formatted, e.g. `2016-03-11T03:45:40Z` | +| `due_date` | string | no | Date time string in the format YEAR-MONTH-DAY, e.g. `2016-03-11` | ```bash curl -X PUT -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.com/api/v3/projects/4/issues/85?state_event=close @@ -410,7 +417,8 @@ Example response: "assignee" : null, "milestone" : null, "subscribed" : true, - "user_notes_count": 0 + "user_notes_count": 0, + "due_date": "2016-07-22" } ``` @@ -487,7 +495,8 @@ Example response: "state": "active", "avatar_url": "http://www.gravatar.com/avatar/7a190fecbaa68212a4b68aeb6e3acd10?s=80&d=identicon", "web_url": "https://gitlab.example.com/u/solon.cremin" - } + }, + "due_date": null } ``` @@ -541,7 +550,8 @@ Example response: "state": "active", "avatar_url": "http://www.gravatar.com/avatar/7a190fecbaa68212a4b68aeb6e3acd10?s=80&d=identicon", "web_url": "https://gitlab.example.com/u/solon.cremin" - } + }, + "due_date": null } ``` @@ -596,7 +606,8 @@ Example response: "avatar_url": "http://www.gravatar.com/avatar/5224fd70153710e92fb8bcf79ac29d67?s=80&d=identicon", "web_url": "https://gitlab.example.com/u/orville" }, - "subscribed": false + "subscribed": false, + "due_date": null } ``` diff --git a/doc/api/todos.md b/doc/api/todos.md index 23f6e35f2a4879111ae45a686b2f13446b6006bd..937c71de386db95859085bd95d42fbfdefdf3c3b 100644 --- a/doc/api/todos.md +++ b/doc/api/todos.md @@ -277,8 +277,7 @@ Example Response: ## Mark all todos as done -Marks all pending todos for the current user as done. All todos marked as done -are returned in the response. +Marks all pending todos for the current user as done. It returns the number of marked todos. ``` DELETE /todos @@ -291,154 +290,7 @@ curl -X DELETE -H "PRIVATE-TOKEN: 9koXpg98eAheJpvBs5tK" https://gitlab.example.c Example Response: ```json -[ - { - "id": 102, - "project": { - "id": 2, - "name": "Gitlab Ce", - "name_with_namespace": "Gitlab Org / Gitlab Ce", - "path": "gitlab-ce", - "path_with_namespace": "gitlab-org/gitlab-ce" - }, - "author": { - "name": "Administrator", - "username": "root", - "id": 1, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", - "web_url": "https://gitlab.example.com/u/root" - }, - "action_name": "marked", - "target_type": "MergeRequest", - "target": { - "id": 34, - "iid": 7, - "project_id": 2, - "title": "Dolores in voluptatem tenetur praesentium omnis repellendus voluptatem quaerat.", - "description": "Et ea et omnis illum cupiditate. Dolor aspernatur tenetur ducimus facilis est nihil. Quo esse cupiditate molestiae illo corrupti qui quidem dolor.", - "state": "opened", - "created_at": "2016-06-17T07:49:24.419Z", - "updated_at": "2016-06-17T07:52:43.484Z", - "target_branch": "tutorials_git_tricks", - "source_branch": "DNSBL_docs", - "upvotes": 0, - "downvotes": 0, - "author": { - "name": "Maxie Medhurst", - "username": "craig_rutherford", - "id": 12, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/a0d477b3ea21970ce6ffcbb817b0b435?s=80&d=identicon", - "web_url": "https://gitlab.example.com/u/craig_rutherford" - }, - "assignee": { - "name": "Administrator", - "username": "root", - "id": 1, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", - "web_url": "https://gitlab.example.com/u/root" - }, - "source_project_id": 2, - "target_project_id": 2, - "labels": [], - "work_in_progress": false, - "milestone": { - "id": 32, - "iid": 2, - "project_id": 2, - "title": "v1.0", - "description": "Assumenda placeat ea voluptatem voluptate qui.", - "state": "active", - "created_at": "2016-06-17T07:47:34.163Z", - "updated_at": "2016-06-17T07:47:34.163Z", - "due_date": null - }, - "merge_when_build_succeeds": false, - "merge_status": "cannot_be_merged", - "subscribed": true, - "user_notes_count": 7 - }, - "target_url": "https://gitlab.example.com/gitlab-org/gitlab-ce/merge_requests/7", - "body": "Dolores in voluptatem tenetur praesentium omnis repellendus voluptatem quaerat.", - "state": "done", - "created_at": "2016-06-17T07:52:35.225Z" - }, - { - "id": 98, - "project": { - "id": 2, - "name": "Gitlab Ce", - "name_with_namespace": "Gitlab Org / Gitlab Ce", - "path": "gitlab-ce", - "path_with_namespace": "gitlab-org/gitlab-ce" - }, - "author": { - "name": "Maxie Medhurst", - "username": "craig_rutherford", - "id": 12, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/a0d477b3ea21970ce6ffcbb817b0b435?s=80&d=identicon", - "web_url": "https://gitlab.example.com/u/craig_rutherford" - }, - "action_name": "assigned", - "target_type": "MergeRequest", - "target": { - "id": 34, - "iid": 7, - "project_id": 2, - "title": "Dolores in voluptatem tenetur praesentium omnis repellendus voluptatem quaerat.", - "description": "Et ea et omnis illum cupiditate. Dolor aspernatur tenetur ducimus facilis est nihil. Quo esse cupiditate molestiae illo corrupti qui quidem dolor.", - "state": "opened", - "created_at": "2016-06-17T07:49:24.419Z", - "updated_at": "2016-06-17T07:52:43.484Z", - "target_branch": "tutorials_git_tricks", - "source_branch": "DNSBL_docs", - "upvotes": 0, - "downvotes": 0, - "author": { - "name": "Maxie Medhurst", - "username": "craig_rutherford", - "id": 12, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/a0d477b3ea21970ce6ffcbb817b0b435?s=80&d=identicon", - "web_url": "https://gitlab.example.com/u/craig_rutherford" - }, - "assignee": { - "name": "Administrator", - "username": "root", - "id": 1, - "state": "active", - "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon", - "web_url": "https://gitlab.example.com/u/root" - }, - "source_project_id": 2, - "target_project_id": 2, - "labels": [], - "work_in_progress": false, - "milestone": { - "id": 32, - "iid": 2, - "project_id": 2, - "title": "v1.0", - "description": "Assumenda placeat ea voluptatem voluptate qui.", - "state": "active", - "created_at": "2016-06-17T07:47:34.163Z", - "updated_at": "2016-06-17T07:47:34.163Z", - "due_date": null - }, - "merge_when_build_succeeds": false, - "merge_status": "cannot_be_merged", - "subscribed": true, - "user_notes_count": 7 - }, - "target_url": "https://gitlab.example.com/gitlab-org/gitlab-ce/merge_requests/7", - "body": "Dolores in voluptatem tenetur praesentium omnis repellendus voluptatem quaerat.", - "state": "done", - "created_at": "2016-06-17T07:49:24.624Z" - }, -] +3 ``` [ce-3188]: https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/3188 diff --git a/doc/ci/yaml/README.md b/doc/ci/yaml/README.md index 50fa263f6930da0014f7113b90bfb157f832ff77..31b4fd2669e5de58b1a908aa57650a1c3813760e 100644 --- a/doc/ci/yaml/README.md +++ b/doc/ci/yaml/README.md @@ -485,6 +485,7 @@ failure. 1. `on_failure` - execute build only when at least one build from prior stages fails. 1. `always` - execute build regardless of the status of builds from prior stages. +1. `manual` - execute build manually. For example: @@ -516,6 +517,7 @@ deploy_job: stage: deploy script: - make deploy + when: manual cleanup_job: stage: cleanup @@ -527,7 +529,20 @@ cleanup_job: The above script will: 1. Execute `cleanup_build_job` only when `build_job` fails -2. Always execute `cleanup_job` as the last step in pipeline. +2. Always execute `cleanup_job` as the last step in pipeline +3. Allow you to manually execute `deploy_job` from GitLab + +#### Manual actions + +>**Note:** +Introduced in GitLab 8.10. + +Manual actions are special type of jobs that are not executed automatically in pipeline. +They need to be explicitly started by the user. +Manual actions can be started from pipelines, builds, environments and deployments views. +You can execute the same manual action multiple times. + +Example usage of manual actions is deployment, ex. promote a staging environment to production. ### environment @@ -757,12 +772,13 @@ Introduced in GitLab 8.6 and GitLab Runner v1.1.1. This feature should be used in conjunction with [`artifacts`](#artifacts) and allows you to define the artifacts to pass between different builds. -Note that `artifacts` from previous [stages](#stages) are passed by default. +Note that `artifacts` from all previous [stages](#stages) are passed by default. To use this feature, define `dependencies` in context of the job and pass a list of all previous builds from which the artifacts should be downloaded. You can only define builds from stages that are executed before the current one. An error will be shown if you define builds from the current stage or next ones. +Defining an empty array will skip downloading any artifacts for that job. --- diff --git a/doc/development/rake_tasks.md b/doc/development/rake_tasks.md index 41685c7ee416beb866ae679d1fd2eeebfbe54757..8852dbcb19eab4ca018df70b83a3fe5e207c5acf 100644 --- a/doc/development/rake_tasks.md +++ b/doc/development/rake_tasks.md @@ -53,3 +53,8 @@ Generating a sprite file containing all the Emoji can be done by running: ``` bundle exec rake gemojione:sprite ``` + +If new emoji are added, the spritesheet may change size. To compensate for +such changes, first generate the `emoji.png` spritesheet with the above Rake +task, then check the dimensions of the new spritesheet and update the +`SPRITESHEET_WIDTH` and `SPRITESHEET_HEIGHT` constants accordingly. diff --git a/doc/raketasks/maintenance.md b/doc/raketasks/maintenance.md index d9dce2af480ca40ab9d3c1f6b5a8e89087e94acf..315cb56a089b6aa0aff79bf3a3c58e7a6e7aff1f 100644 --- a/doc/raketasks/maintenance.md +++ b/doc/raketasks/maintenance.md @@ -167,3 +167,22 @@ of those assets. Unless you are modifying the JavaScript / CSS code on your production machine after installing the package, there should be no reason to redo rake assets:precompile on the production machine. If you suspect that assets have been corrupted, you should reinstall the omnibus package. + +## Tracking Deployments + +GitLab provides a Rake task that lets you track deployments in GitLab +Performance Monitoring. This Rake task simply stores the current GitLab version +in the GitLab Performance Monitoring database. + +For Omnibus-packages: + +``` +sudo gitlab-rake gitlab:track_deployment +``` + +For installations from source: + +``` +cd /home/git/gitlab +sudo -u git -H bundle exec rake gitlab:track_deployment RAILS_ENV=production +``` diff --git a/fixtures/emojis/aliases.json b/fixtures/emojis/aliases.json index d3831d8045ba50b343901d7452837ef1844ca674..e2f47db0de20bc7bb46faddb2b76a638f0c7c813 100644 --- a/fixtures/emojis/aliases.json +++ b/fixtures/emojis/aliases.json @@ -1,16 +1,9 @@ { - "northeast_pointing_airplane":"airplane_northeast", "small_airplane":"airplane_small", - "up_pointing_small_airplane":"airplane_small_up", - "up_pointing_airplane":"airplane_up", - "left_anger_bubble":"anger_left", "right_anger_bubble":"anger_right", "keycap_asterisk":"asterisk", "atom_symbol":"atom", "ballot_box_with_ballot":"ballot_box", - "ballot_box_with_bold_check":"ballot_box_check", - "ballot_box_with_script_x":"ballot_box_x", - "ballot_script_x":"ballot_x", "person_with_ball":"basketball_player", "person_with_ball_tone1":"basketball_player_tone1", "person_with_ball_tone2":"basketball_player_tone2", @@ -21,51 +14,65 @@ "umbrella_on_ground":"beach_umbrella", "bellhop_bell":"bellhop", "biohazard_sign":"biohazard", - "bouquet_of_flowers":"bouquet2", "archery":"bow_and_arrow", - "bullhorn_with_sound_waves":"bullhorn_waves", - "pocket calculator":"calculator", + "boxing_gloves":"boxing_glove", "spiral_calendar_pad":"calendar_spiral", + "call_me_hand":"call_me", + "call_me_hand_tone1":"call_me_tone1", + "call_me_hand_tone2":"call_me_tone2", + "call_me_hand_tone3":"call_me_tone3", + "call_me_hand_tone4":"call_me_tone4", + "call_me_hand_tone5":"call_me_tone5", + "kayak":"canoe", "card_file_box":"card_box", - "tape_cartridge":"cartridge", + "person_doing_cartwheel":"cartwheel", + "person_doing_cartwheel_tone1":"cartwheel_tone1", + "person_doing_cartwheel_tone2":"cartwheel_tone2", + "person_doing_cartwheel_tone3":"cartwheel_tone3", + "person_doing_cartwheel_tone4":"cartwheel_tone4", + "person_doing_cartwheel_tone5":"cartwheel_tone5", "bottle_with_popping_cork":"champagne", + "clinking_glass":"champagne_glass", "cheese_wedge":"cheese", "city_sunrise":"city_sunset", "mantlepiece_clock":"clock", - "clockwise_right_and_left_semicircle_arrows":"clockwise_arrows", "cloud_with_lightning":"cloud_lightning", "cloud_with_rain":"cloud_rain", "cloud_with_snow":"cloud_snow", "cloud_with_tornado":"cloud_tornado", - "old_personal_computer":"computer_old", - "building_construction":"contruction_site", + "clown_face":"clown", + "building_construction":"construction_site", "couch_and_lamp":"couch", "couple_with_heart_mm":"couple_mm", "couple_with_heart_ww":"couple_ww", + "face_with_cowboy_hat":"cowboy", "lower_left_crayon":"crayon", "cricket_bat_ball":"cricket", "latin_cross":"cross", - "heavy_latin_cross":"cross_heavy", - "white_latin_cross":"cross_white", - "black_skull_and_crossbones":"crossbones", "passenger_ship":"cruise_ship", "dagger_knife":"dagger", "desktop_computer":"desktop", "card_index_dividers":"dividers", - "document_with_text":"document_text", "dove_of_peace":"dove", + "drool":"drooling_face", + "drum_with_drumsticks":"drum", "email":"e-mail", - "back_of_envelope":"envelope_back", - "flying_envelope":"envelope_flying", - "stamped_envelope":"envelope_stamped", - "pen_over_stamped_envelope":"envelope_stamped_pen", - "white_down_pointing_left_hand_index":"finger_pointing_down", - "sideways_white_down_pointing_index":"finger_pointing_down2", - "sideways_white_left_pointing_index":"finger_pointing_left", - "sideways_white_right_pointing_index":"finger_pointing_right", - "sideways_white_up_pointing_index":"finger_pointing_up", + "eject_symbol":"eject", + "facepalm":"face_palm", + "facepalm_tone1":"face_palm_tone1", + "facepalm_tone2":"face_palm_tone2", + "facepalm_tone3":"face_palm_tone3", + "facepalm_tone4":"face_palm_tone4", + "facepalm_tone5":"face_palm_tone5", + "fencing":"fencer", + "hand_with_index_and_middle_finger_crossed":"fingers_crossed", + "hand_with_index_and_middle_fingers_crossed_tone1":"fingers_crossed_tone1", + "hand_with_index_and_middle_fingers_crossed_tone2":"fingers_crossed_tone2", + "hand_with_index_and_middle_fingers_crossed_tone3":"fingers_crossed_tone3", + "hand_with_index_and_middle_fingers_crossed_tone4":"fingers_crossed_tone4", + "hand_with_index_and_middle_fingers_crossed_tone5":"fingers_crossed_tone5", "flame":"fire", - "oncoming_fire_engine":"fire_engine_oncoming", + "first_place_medal":"first_place", "ac":"flag_ac", "ad":"flag_ad", "ae":"flag_ae", @@ -326,44 +333,51 @@ "za":"flag_za", "zm":"flag_zm", "zw":"flag_zw", - "clamshell_mobile_phone":"flip_phone", - "black_hard_shell_floppy_disk":"floppy_black", - "white_hard_shell_floppy_disk":"floppy_white", - "open_folder":"folder_open", "fork_and_knife_with_plate":"fork_knife_plate", + "fox_face":"fox", "frame_with_picture":"frame_photo", - "frame_with_tiles":"frame_tiles", - "frame_with_an_x":"frame_x", + "baguette_bread":"french_bread", "anguished":"frowning", "white_frowning_face":"frowning2", + "goal_net":"goal", "hammer_and_pick":"hammer_pick", "raised_hand_with_fingers_splayed":"hand_splayed", - "reversed_raised_hand_with_fingers_splayed":"hand_splayed_reverse", "raised_hand_with_fingers_splayed_tone1":"hand_splayed_tone1", "raised_hand_with_fingers_splayed_tone2":"hand_splayed_tone2", "raised_hand_with_fingers_splayed_tone3":"hand_splayed_tone3", "raised_hand_with_fingers_splayed_tone4":"hand_splayed_tone4", "raised_hand_with_fingers_splayed_tone5":"hand_splayed_tone5", - "reversed_victory_hand":"hand_victory", + "shaking_hands":"handshake", + "shaking_hands_tone1":"handshake_tone1", + "shaking_hands_tone2":"handshake_tone2", + "shaking_hands_tone3":"handshake_tone3", + "shaking_hands_tone4":"handshake_tone4", + "shaking_hands_tone5":"handshake_tone5", "face_with_head_bandage":"head_bandage", "heavy_heart_exclamation_mark_ornament":"heart_exclamation", - "heart_with_tip_on_the_left":"heart_tip", "helmet_with_white_cross":"helmet_with_cross", "house_buildings":"homes", "hot_dog":"hotdog", "derelict_house_building":"house_abandoned", "hugging_face":"hugging", - "circled_information_source":"info", "desert_island":"island", - "up_pointing_military_airplane":"jet_up", + "juggler":"juggling", + "juggler_tone1":"juggling_tone1", + "juggler_tone2":"juggling_tone2", + "juggler_tone3":"juggling_tone3", + "juggler_tone4":"juggling_tone4", + "juggler_tone5":"juggling_tone5", "old_key":"key2", - "wired_keyboard":"keyboard", - "keyboard_and_mouse":"keyboard_mouse", - "musical_keyboard_with_jacks":"keyboard_with_jacks", "couplekiss_mm":"kiss_mm", "couplekiss_ww":"kiss_ww", + "kiwifruit":"kiwi", "satisfied":"laughing", - "left_hand_telephone_receiver":"left_receiver", + "left_fist":"left_facing_fist", + "left_fist_tone1":"left_facing_fist_tone1", + "left_fist_tone2":"left_facing_fist_tone2", + "left_fist_tone3":"left_facing_fist_tone3", + "left_fist_tone4":"left_facing_fist_tone4", + "left_fist_tone5":"left_facing_fist_tone5", "man_in_business_suit_levitating":"levitate", "weight_lifter":"lifter", "weight_lifter_tone1":"lifter_tone1", @@ -371,9 +385,21 @@ "weight_lifter_tone3":"lifter_tone3", "weight_lifter_tone4":"lifter_tone4", "weight_lifter_tone5":"lifter_tone5", - "light_mark":"light_check_mark", "lion":"lion_face", + "liar":"lying_face", + "male_dancer":"man_dancing", + "male_dancer_tone1":"man_dancing_tone1", + "male_dancer_tone2":"man_dancing_tone2", + "male_dancer_tone3":"man_dancing_tone3", + "male_dancer_tone4":"man_dancing_tone4", + "male_dancer_tone5":"man_dancing_tone5", + "tuxedo_tone1":"man_in_tuxedo_tone1", + "tuxedo_tone2":"man_in_tuxedo_tone2", + "tuxedo_tone3":"man_in_tuxedo_tone3", + "tuxedo_tone4":"man_in_tuxedo_tone4", + "tuxedo_tone5":"man_in_tuxedo_tone5", "world_map":"map", + "karate_uniform":"martial_arts_uniform", "sports_medal":"medal", "sign_of_the_horns":"metal", "sign_of_the_horns_tone1":"metal_tone1", @@ -388,21 +414,23 @@ "reversed_hand_with_middle_finger_extended_tone3":"middle_finger_tone3", "reversed_hand_with_middle_finger_extended_tone4":"middle_finger_tone4", "reversed_hand_with_middle_finger_extended_tone5":"middle_finger_tone5", + "glass_of_milk":"milk", "money_mouth_face":"money_mouth", - "lightning_mood_bubble":"mood_bubble_lightning", - "lightning_mood":"mood_lightning", + "motorbike":"motor_scooter", "racing_motorcycle":"motorcycle", "snow_capped_mountain":"mountain_snow", - "one_button_mouse":"mouse_one", "three_button_mouse":"mouse_three_button", + "mother_christmas":"mrs_claus", + "mother_christmas_tone1":"mrs_claus_tone1", + "mother_christmas_tone2":"mrs_claus_tone2", + "mother_christmas_tone3":"mrs_claus_tone3", + "mother_christmas_tone4":"mrs_claus_tone4", + "mother_christmas_tone5":"mrs_claus_tone5", + "sick":"nauseated_face", "nerd_face":"nerd", - "three_networked_computers":"network", "rolled_up_newspaper":"newspaper2", - "note_page":"note", - "empty_note_page":"note_empty", - "note_pad":"notepad", - "empty_note_pad":"notepad_empty", "spiral_note_pad":"notepad_spiral", + "stop_sign":"octagonal_sign", "oil_drum":"oil", "grandma":"older_woman", "grandma_tone1":"older_woman_tone1", @@ -410,57 +438,66 @@ "grandma_tone3":"older_woman_tone3", "grandma_tone4":"older_woman_tone4", "grandma_tone5":"older_woman_tone5", - "optical_disc_icon":"optical_disk", "lower_left_paintbrush":"paintbrush", "linked_paperclips":"paperclips", "national_park":"park", "double_vertical_bar":"pause_button", "peace_symbol":"peace", + "shelled_peanut":"peanuts", "lower_left_ballpoint_pen":"pen_ballpoint", "lower_left_fountain_pen":"pen_fountain", "memo":"pencil", - "lower_left_pencil":"pencil3", - "black_pennant":"pennant_black", - "white_pennant":"pennant_white", "table_tennis":"ping_pong", - "no_piracy":"piracy", "worship_symbol":"place_of_worship", "shit":"poop", "hankey":"poop", "poo":"poop", - "prohibited_sign":"prohibited", + "expecting_woman":"pregnant_woman", + "expecting_woman_tone1":"pregnant_woman_tone1", + "expecting_woman_tone2":"pregnant_woman_tone2", + "expecting_woman_tone3":"pregnant_woman_tone3", + "expecting_woman_tone4":"pregnant_woman_tone4", + "expecting_woman_tone5":"pregnant_woman_tone5", "film_projector":"projector", "racing_car":"race_car", "radioactive_sign":"radioactive", "railroad_track":"railway_track", - "right_speaker_with_one_sound_wave":"right_speaker_one", - "right_speaker_with_three_sound_waves":"right_speaker_three", + "back_of_hand":"raised_back_of_hand", + "back_of_hand_tone1":"raised_back_of_hand_tone1", + "back_of_hand_tone2":"raised_back_of_hand_tone2", + "back_of_hand_tone3":"raised_back_of_hand_tone3", + "back_of_hand_tone4":"raised_back_of_hand_tone4", + "back_of_hand_tone5":"raised_back_of_hand_tone5", + "rhinoceros":"rhino", + "right_fist":"right_facing_fist", + "right_fist_tone1":"right_facing_fist_tone1", + "right_fist_tone2":"right_facing_fist_tone2", + "right_fist_tone3":"right_facing_fist_tone3", + "right_fist_tone4":"right_facing_fist_tone4", + "right_fist_tone5":"right_facing_fist_tone5", "robot_face":"robot", + "rolling_on_the_floor_laughing":"rofl", "face_with_rolling_eyes":"rolling_eyes", + "green_salad":"salad", + "second_place_medal":"second_place", + "paella":"shallow_pan_of_food", + "shopping_trolley":"shopping_cart", "skeleton":"skull", "skull_and_crossbones":"skull_crossbones", "slightly_frowning_face":"slight_frown", "slightly_smiling_face":"slight_smile", + "sneeze":"sneezing_face", "speaking_head_in_silhouette":"speaking_head", - "left_speech_bubble":"speech_left", - "right_speech_bubble":"speech_right", - "three_speech_bubbles":"speech_three", - "two_speech_bubbles":"speech_two", "sleuth_or_spy":"spy", "sleuth_or_spy_tone1":"spy_tone1", "sleuth_or_spy_tone2":"spy_tone2", "sleuth_or_spy_tone3":"spy_tone3", "sleuth_or_spy_tone4":"spy_tone4", "sleuth_or_spy_tone5":"spy_tone5", - "portable_stereo":"stereo", - "black_touchtone_telephone":"telephone_black", - "white_touchtone_telephone":"telephone_white", + "stuffed_pita":"stuffed_flatbread", "face_with_thermometer":"thermometer_face", "thinking_face":"thinking", - "left_thought_bubble":"thought_left", - "right_thought_bubble":"thought_right", - "reversed_thumbs_down_sign":"thumbs_down_reverse", - "reversed_thumbs_up_sign":"thumbs_up_reverse", + "third_place_medal":"third_place", "-1":"thumbsdown", "-1_tone1":"thumbsdown_tone1", "-1_tone2":"thumbsdown_tone2", @@ -479,9 +516,7 @@ "hammer_and_wrench":"tools", "next_track":"track_next", "previous_track":"track_previous", - "diesel_locomotive":"train_diesel", - "triangle_with_rounded_corners":"triangle_round", - "turned_ok_hand_sign":"turned_ok_hand", + "whisky":"tumbler_glass", "unicorn_face":"unicorn", "upside_down_face":"upside_down", "funeral_urn":"urn", @@ -494,6 +529,12 @@ "white_sun_behind_cloud":"white_sun_cloud", "white_sun_behind_cloud_with_rain":"white_sun_rain_cloud", "white_sun_with_small_cloud":"white_sun_small_cloud", - "left_writing_hand":"writing_hand", + "wilted_flower":"wilted_rose", + "wrestling":"wrestlers", + "wrestling_tone1":"wrestlers_tone1", + "wrestling_tone2":"wrestlers_tone2", + "wrestling_tone3":"wrestlers_tone3", + "wrestling_tone4":"wrestlers_tone4", + "wrestling_tone5":"wrestlers_tone5", "zipper_mouth_face":"zipper_mouth" } diff --git a/fixtures/emojis/digests.json b/fixtures/emojis/digests.json index 50ee5089d8f9934b2782e0469a19cf1b66f5b021..078d3413f338eaefd3c001e84509ddb8bf3123ff 100644 --- a/fixtures/emojis/digests.json +++ b/fixtures/emojis/digests.json @@ -59,16 +59,6 @@ "unicode": "1F6EB", "digest": "5544eace06b8e1b6ea91940e893e013d33d6b166e14e6d128a87f2cd2de88332" }, - { - "name": "airplane_northeast", - "unicode": "1F6EA", - "digest": "fdddc2cd3618ec6661612581b8b93553cb086b0bb197e96aedf1bee8055e7bb4" - }, - { - "name": "northeast_pointing_airplane", - "unicode": "1F6EA", - "digest": "fdddc2cd3618ec6661612581b8b93553cb086b0bb197e96aedf1bee8055e7bb4" - }, { "name": "airplane_small", "unicode": "1F6E9", @@ -79,26 +69,6 @@ "unicode": "1F6E9", "digest": "1a2e07abbbe90d05cee7ff8dd52f443d595ccb38959f3089fe016b77e5d6de7d" }, - { - "name": "airplane_small_up", - "unicode": "1F6E8", - "digest": "029752b29a757c087dec60f45ea242e974fc181129e20390d5d4a2f90442091a" - }, - { - "name": "up_pointing_small_airplane", - "unicode": "1F6E8", - "digest": "029752b29a757c087dec60f45ea242e974fc181129e20390d5d4a2f90442091a" - }, - { - "name": "airplane_up", - "unicode": "1F6E7", - "digest": "ec45d4dbfce1f75dc59339417b1dcf5f1e1359cd9d04ff233babf359a3330e77" - }, - { - "name": "up_pointing_airplane", - "unicode": "1F6E7", - "digest": "ec45d4dbfce1f75dc59339417b1dcf5f1e1359cd9d04ff233babf359a3330e77" - }, { "name": "alarm_clock", "unicode": "23F0", @@ -164,16 +134,6 @@ "unicode": "1F4A2", "digest": "332493913891aa0eda2743b4bb16c4682400f249998bf34eb292246c9009e17f" }, - { - "name": "anger_left", - "unicode": "1F5EE", - "digest": "f2711991e8b386b2d5b12f296ce20a9b4b00ef91d6d67af2cf4e06abf2faa1dc" - }, - { - "name": "left_anger_bubble", - "unicode": "1F5EE", - "digest": "f2711991e8b386b2d5b12f296ce20a9b4b00ef91d6d67af2cf4e06abf2faa1dc" - }, { "name": "anger_right", "unicode": "1F5EF", @@ -324,11 +284,6 @@ "unicode": "1F69B", "digest": "c115e6613ebd718268aa31d265e017138b9fb58bbb8201eb3f40de2380e460aa" }, - { - "name": "ascending_notes", - "unicode": "1F39C", - "digest": "33432042771d456338dda5d98e49322d3600f2cc9049963480c7c38d9de1ef0a" - }, { "name": "asterisk", "unicode": "002A-20E3", @@ -364,6 +319,11 @@ "unicode": "269B", "digest": "6b6bb83b00707a314e46ff8eefbda40978a291ec7881caba1b1ee273f49c1368" }, + { + "name": "avocado", + "unicode": "1F951", + "digest": "bc1fb203d63b18985598400925de24050bb192afda1cbf0813f85cb139869eff" + }, { "name": "b", "unicode": "1F171", @@ -419,6 +379,11 @@ "unicode": "1F519", "digest": "083e4e48b51092c28efb4532e840e1091b5d4b685c6e0f221aa0228f061cd91e" }, + { + "name": "bacon", + "unicode": "1F953", + "digest": "18ad3817f1f88a69706db5727a58e763dde6c21a2d4f184c3d728c32dc5fa05a" + }, { "name": "badminton", "unicode": "1F3F8", @@ -444,41 +409,11 @@ "unicode": "1F5F3", "digest": "4175a56eca5c6458574a681e109b1403fbb143cf27f69ae6c1917650f3e08892" }, - { - "name": "ballot_box_check", - "unicode": "1F5F9", - "digest": "fc3ba16c009d963a4a0ea20a348ac98eee3c4c18c481df19a5ada0d1de7fcc15" - }, - { - "name": "ballot_box_with_bold_check", - "unicode": "1F5F9", - "digest": "fc3ba16c009d963a4a0ea20a348ac98eee3c4c18c481df19a5ada0d1de7fcc15" - }, { "name": "ballot_box_with_check", "unicode": "2611", "digest": "c98d6f3588dd87e2f318bbfe6c646399a905450edfd814edae4e5b1bddef2134" }, - { - "name": "ballot_box_x", - "unicode": "1F5F5", - "digest": "861dcfc2361298262587b5d0e163fed96a55c44636361f5b4a9ab1d6502b8928" - }, - { - "name": "ballot_box_with_script_x", - "unicode": "1F5F5", - "digest": "861dcfc2361298262587b5d0e163fed96a55c44636361f5b4a9ab1d6502b8928" - }, - { - "name": "ballot_x", - "unicode": "1F5F4", - "digest": "0b73b89847eb82bcad5664644c8af237e0aef6c3d8c94b7a5df94e05d0ebf4e1" - }, - { - "name": "ballot_script_x", - "unicode": "1F5F4", - "digest": "0b73b89847eb82bcad5664644c8af237e0aef6c3d8c94b7a5df94e05d0ebf4e1" - }, { "name": "bamboo", "unicode": "1F38D", @@ -579,6 +514,11 @@ "unicode": "26F9-1F3FF", "digest": "c631cefc5d2a0a31bdb9f0a0d97ea68b1c6928e565468998403034644572a0b0" }, + { + "name": "bat", + "unicode": "1F987", + "digest": "8fc19e0d7d6f80906bdbc06d616a810de66180d96cf28070a53fa61b88904535" + }, { "name": "bath", "unicode": "1F6C0", @@ -759,6 +699,11 @@ "unicode": "26AB", "digest": "c2ba672994ad0f99d7fdc449f3fee45a2dca68a58f9fe95825b38465a30ef44e" }, + { + "name": "black_heart", + "unicode": "1F5A4", + "digest": "f334679168d6dd7328c28e9ae3cb2b1fca0e9c2777938d586bfe623db2a688b9" + }, { "name": "black_joker", "unicode": "1F0CF", @@ -839,11 +784,6 @@ "unicode": "1F4D6", "digest": "9d912a9d1bb10dc7f2645b345ed09e90461e83df0de275acb806f1f75cef1fcf" }, - { - "name": "book2", - "unicode": "1F56E", - "digest": "26d6b66a1957e7750b3e22eb2e46d0cc85932977bbb81d3d8482ec1ec58ee12b" - }, { "name": "bookmark", "unicode": "1F516", @@ -874,16 +814,6 @@ "unicode": "1F490", "digest": "b93751a27b40f6185a22b3e8b413f0fe09b6010d1057c672e1a23088e0b8286f" }, - { - "name": "bouquet2", - "unicode": "1F395", - "digest": "1643ec51ff26fc1ac0c67859e202386398650bf2a996c82b68e1b73fa52abf7d" - }, - { - "name": "bouquet_of_flowers", - "unicode": "1F395", - "digest": "1643ec51ff26fc1ac0c67859e202386398650bf2a996c82b68e1b73fa52abf7d" - }, { "name": "bow", "unicode": "1F647", @@ -929,6 +859,16 @@ "unicode": "1F3B3", "digest": "737f2cdfa4ac964baade585a39771b18080bd5e9b55c8661d3518f468f344662" }, + { + "name": "boxing_glove", + "unicode": "1F94A", + "digest": "c914b2ce45f20afad66ad6f0d1b0750c4469e4f48b686dfc4aad1ec8d289c563" + }, + { + "name": "boxing_gloves", + "unicode": "1F94A", + "digest": "c914b2ce45f20afad66ad6f0d1b0750c4469e4f48b686dfc4aad1ec8d289c563" + }, { "name": "boy", "unicode": "1F466", @@ -959,11 +899,6 @@ "unicode": "1F466-1F3FF", "digest": "0f76e97237203950da36c737dcc6f56dcd6c123401a8c817a0636376c7f38ef5" }, - { - "name": "boys_symbol", - "unicode": "1F6C9", - "digest": "47fadbcb876ca436264ce2f3ebd1472bd68f55cc2b4833bf054335be9dc7a0f2" - }, { "name": "bread", "unicode": "1F35E", @@ -1034,21 +969,6 @@ "unicode": "1F684", "digest": "96e74842e919716b7bbbab57339bfd70f099a9bcb4710dffd7c80cf38a7bbff7" }, - { - "name": "bullhorn", - "unicode": "1F56B", - "digest": "a4ca5cbfe299e8ccd148d17055d2d395cf8515e416bf771044c9a670509a8254" - }, - { - "name": "bullhorn_waves", - "unicode": "1F56C", - "digest": "92493636cf086205d1e12cc19e613b84152ef10b8cd0215619a0fc813bfc9a7c" - }, - { - "name": "bullhorn_with_sound_waves", - "unicode": "1F56C", - "digest": "92493636cf086205d1e12cc19e613b84152ef10b8cd0215619a0fc813bfc9a7c" - }, { "name": "burrito", "unicode": "1F32F", @@ -1074,6 +994,11 @@ "unicode": "1F465", "digest": "7fee96f1b68bb2c6002e47f2ed13c06baa6a3168441b9aca572db7ec45612f7b" }, + { + "name": "butterfly", + "unicode": "1F98B", + "digest": "a91b6598c17b44a8dc8935a1d99e25f4483ea41470cdd2da343039a9eec29ef1" + }, { "name": "cactus", "unicode": "1F335", @@ -1084,16 +1009,6 @@ "unicode": "1F370", "digest": "b928902df8084210d51c1da36f9119164a325393c391b28cd8ea914e0b95c17b" }, - { - "name": "calculator", - "unicode": "1F5A9", - "digest": "01b47b5c69c12b65fa4f4c0d580f2a98280d6116f4ad2cf8be378759008bcc3c" - }, - { - "name": "pocket calculator", - "unicode": "1F5A9", - "digest": "01b47b5c69c12b65fa4f4c0d580f2a98280d6116f4ad2cf8be378759008bcc3c" - }, { "name": "calendar", "unicode": "1F4C6", @@ -1109,6 +1024,66 @@ "unicode": "1F5D3", "digest": "441a0750eade7ce33e28e58bec76958990c412b68409fcdde59ebad1f25361bb" }, + { + "name": "call_me", + "unicode": "1F919", + "digest": "83d2ed96dcb8b4adf4f4d030ffd07e25ca16351e1a4fbefdf9f46f5ca496a55f" + }, + { + "name": "call_me_hand", + "unicode": "1F919", + "digest": "83d2ed96dcb8b4adf4f4d030ffd07e25ca16351e1a4fbefdf9f46f5ca496a55f" + }, + { + "name": "call_me_tone1", + "unicode": "1F919-1F3FB", + "digest": "4a5748efa83e7294e8338b8795d4d315ff1cd31ead6759004d0eb330e50de8cd" + }, + { + "name": "call_me_hand_tone1", + "unicode": "1F919-1F3FB", + "digest": "4a5748efa83e7294e8338b8795d4d315ff1cd31ead6759004d0eb330e50de8cd" + }, + { + "name": "call_me_tone2", + "unicode": "1F919-1F3FC", + "digest": "54feaa6e3c5789ae6e15622127f0e0213234b4b886e1588ce95814348b1f1519" + }, + { + "name": "call_me_hand_tone2", + "unicode": "1F919-1F3FC", + "digest": "54feaa6e3c5789ae6e15622127f0e0213234b4b886e1588ce95814348b1f1519" + }, + { + "name": "call_me_tone3", + "unicode": "1F919-1F3FD", + "digest": "57e949b951e14843b712dab5a828f915ee255f5bb973db33946aab4057427419" + }, + { + "name": "call_me_hand_tone3", + "unicode": "1F919-1F3FD", + "digest": "57e949b951e14843b712dab5a828f915ee255f5bb973db33946aab4057427419" + }, + { + "name": "call_me_tone4", + "unicode": "1F919-1F3FE", + "digest": "f7787e933978a09c7b8ab8d3b1e1ab395aaae998c455e93bb3db24a4c8a60fe0" + }, + { + "name": "call_me_hand_tone4", + "unicode": "1F919-1F3FE", + "digest": "f7787e933978a09c7b8ab8d3b1e1ab395aaae998c455e93bb3db24a4c8a60fe0" + }, + { + "name": "call_me_tone5", + "unicode": "1F919-1F3FF", + "digest": "1fdb7d833d000b117d20d48142d3026a61cc9c8b712ebb498fa66bf75c74d7a5" + }, + { + "name": "call_me_hand_tone5", + "unicode": "1F919-1F3FF", + "digest": "1fdb7d833d000b117d20d48142d3026a61cc9c8b712ebb498fa66bf75c74d7a5" + }, { "name": "calling", "unicode": "1F4F2", @@ -1134,11 +1109,6 @@ "unicode": "1F3D5", "digest": "a42a4ff9521affa72db7b0f01da169b4cb6afb9db1c5dfad47dd4c507bfc30d9" }, - { - "name": "cancellation_x", - "unicode": "1F5D9", - "digest": "cea2f7a48543207615ee06755ded62c2a95a7eaf7d7b68a3fc25e74d94e2c92c" - }, { "name": "cancer", "unicode": "264B", @@ -1154,6 +1124,16 @@ "unicode": "1F36C", "digest": "9cff4538918f60f770fceb96e964f5dc3ce31fd08ddd2ab3bfdf2981bfa74100" }, + { + "name": "canoe", + "unicode": "1F6F6", + "digest": "56ca308cc2ad4827468cf58c4ccf6ef6b3382835a91e935540a2b973e01d2572" + }, + { + "name": "kayak", + "unicode": "1F6F6", + "digest": "56ca308cc2ad4827468cf58c4ccf6ef6b3382835a91e935540a2b973e01d2572" + }, { "name": "capital_abcd", "unicode": "1F520", @@ -1185,14 +1165,69 @@ "digest": "c0e7059efc39a64233f774c02ddb1ab51888fff180f906ce13a6e4f9509672fe" }, { - "name": "cartridge", - "unicode": "1F5AD", - "digest": "0b1625eea118060b51a70905c1eb3313ed632e989f70943eca16aa29fe8a34f2" + "name": "carrot", + "unicode": "1F955", + "digest": "3a6fd98b63ee73d982a9cdacb08cf7b4014368cde8ffce6056b7df25a5a472b1" + }, + { + "name": "cartwheel", + "unicode": "1F938", + "digest": "d78de3435e0b04a9b1a1048ae12e63e3248f9ace3a0db4d3bda584f22af18863" + }, + { + "name": "person_doing_cartwheel", + "unicode": "1F938", + "digest": "d78de3435e0b04a9b1a1048ae12e63e3248f9ace3a0db4d3bda584f22af18863" }, { - "name": "tape_cartridge", - "unicode": "1F5AD", - "digest": "0b1625eea118060b51a70905c1eb3313ed632e989f70943eca16aa29fe8a34f2" + "name": "cartwheel_tone1", + "unicode": "1F938-1F3FB", + "digest": "39a49781a269bb40d8efc8fd73c973b00fb2e192850ea6073062b5dea0cd5b74" + }, + { + "name": "person_doing_cartwheel_tone1", + "unicode": "1F938-1F3FB", + "digest": "39a49781a269bb40d8efc8fd73c973b00fb2e192850ea6073062b5dea0cd5b74" + }, + { + "name": "cartwheel_tone2", + "unicode": "1F938-1F3FC", + "digest": "6231eb35be45457fd648f8f4b79983f03705c9d983a18067f7e6d9ae47bc1958" + }, + { + "name": "person_doing_cartwheel_tone2", + "unicode": "1F938-1F3FC", + "digest": "6231eb35be45457fd648f8f4b79983f03705c9d983a18067f7e6d9ae47bc1958" + }, + { + "name": "cartwheel_tone3", + "unicode": "1F938-1F3FD", + "digest": "ca483c78cc823811a8c279c501d9b283e4c990dafc5995ad40e68ecb0af554df" + }, + { + "name": "person_doing_cartwheel_tone3", + "unicode": "1F938-1F3FD", + "digest": "ca483c78cc823811a8c279c501d9b283e4c990dafc5995ad40e68ecb0af554df" + }, + { + "name": "cartwheel_tone4", + "unicode": "1F938-1F3FE", + "digest": "8253afb672431c84e498014c30babb00b9284bec773009e79f7f06aa7108643e" + }, + { + "name": "person_doing_cartwheel_tone4", + "unicode": "1F938-1F3FE", + "digest": "8253afb672431c84e498014c30babb00b9284bec773009e79f7f06aa7108643e" + }, + { + "name": "cartwheel_tone5", + "unicode": "1F938-1F3FF", + "digest": "6fd92baff57c38b3adb6753d9e7e547e762971a8872fd3f1e71c6aaf0b1d3ab9" + }, + { + "name": "person_doing_cartwheel_tone5", + "unicode": "1F938-1F3FF", + "digest": "6fd92baff57c38b3adb6753d9e7e547e762971a8872fd3f1e71c6aaf0b1d3ab9" }, { "name": "cat", @@ -1209,11 +1244,6 @@ "unicode": "1F4BF", "digest": "16363d8a34b873c12df6354b99f575cae3d80e0d27100ed7eea70f0310953c7b" }, - { - "name": "celtic_cross", - "unicode": "1F548", - "digest": "187aac988d7e02085a15f31c4cc0ff25127be5b088e354e65c7b1152bffb40ff" - }, { "name": "chains", "unicode": "26D3", @@ -1229,6 +1259,16 @@ "unicode": "1F37E", "digest": "9e6e8987f30a37ae0f3d7dab2f5eeb50aa32b4f31402b29315eb2994afc72457" }, + { + "name": "champagne_glass", + "unicode": "1F942", + "digest": "5a2e4773f7eb126a00122cbfa4dc535da51ce00e0bf0d8d6ff8bab8b3365f8d2" + }, + { + "name": "clinking_glass", + "unicode": "1F942", + "digest": "5a2e4773f7eb126a00122cbfa4dc535da51ce00e0bf0d8d6ff8bab8b3365f8d2" + }, { "name": "chart", "unicode": "1F4B9", @@ -1514,16 +1554,6 @@ "unicode": "1F564", "digest": "9fdef6a4939315c017b165e1dbac7710fb335df8c309be3fe2a011ef7fc28d74" }, - { - "name": "clockwise_arrows", - "unicode": "1F5D8", - "digest": "67027b7e1a4d800a3ce7d731c21c098d1109d217159a27665eebb7e080fc2622" - }, - { - "name": "clockwise_right_and_left_semicircle_arrows", - "unicode": "1F5D8", - "digest": "67027b7e1a4d800a3ce7d731c21c098d1109d217159a27665eebb7e080fc2622" - }, { "name": "closed_book", "unicode": "1F4D5", @@ -1584,6 +1614,16 @@ "unicode": "1F32A", "digest": "7cbed2343c280ba3996082b3d0fb9d8cd57d6e62fe6c9ecb159f46b4a2e49151" }, + { + "name": "clown", + "unicode": "1F921", + "digest": "eea95687caabc9e808514c2450ba599e5e24ef47923dbec86f5297a64438e2e5" + }, + { + "name": "clown_face", + "unicode": "1F921", + "digest": "eea95687caabc9e808514c2450ba599e5e24ef47923dbec86f5297a64438e2e5" + }, { "name": "clubs", "unicode": "2663", @@ -1624,16 +1664,6 @@ "unicode": "1F4BB", "digest": "c970ce76b5607434895b0407bdaa93140f887930781a17dd7dcf16f711451d93" }, - { - "name": "computer_old", - "unicode": "1F5B3", - "digest": "b27c30d74f205a8a3bd00a55ca17da7cf6ae3b65ae33e949755a4c6bd69a9fd3" - }, - { - "name": "old_personal_computer", - "unicode": "1F5B3", - "digest": "b27c30d74f205a8a3bd00a55ca17da7cf6ae3b65ae33e949755a4c6bd69a9fd3" - }, { "name": "confetti_ball", "unicode": "1F38A", @@ -1664,6 +1694,11 @@ "unicode": "1F3D7", "digest": "c611f0a5de10f000a0756935f226845c7292f19ff5581d1f7a7554316338bbcb" }, + { + "name": "building_construction", + "unicode": "1F3D7", + "digest": "c611f0a5de10f000a0756935f226845c7292f19ff5581d1f7a7554316338bbcb" + }, { "name": "construction_worker", "unicode": "1F477", @@ -1699,16 +1734,6 @@ "unicode": "1F39B", "digest": "0d7f33ff7acc1cc3a81e6a786ff007df20da145e3070f338505dfed5100e9fcb" }, - { - "name": "contruction_site", - "unicode": "1F3D7", - "digest": "c611f0a5de10f000a0756935f226845c7292f19ff5581d1f7a7554316338bbcb" - }, - { - "name": "building_construction", - "unicode": "1F3D7", - "digest": "c611f0a5de10f000a0756935f226845c7292f19ff5581d1f7a7554316338bbcb" - }, { "name": "convenience_store", "unicode": "1F3EA", @@ -1719,6 +1744,11 @@ "unicode": "1F36A", "digest": "4bed3522bd50091ac5b68ca760661eb484d7f1b9c9d564d2097bd812b7f28ae4" }, + { + "name": "cooking", + "unicode": "1F373", + "digest": "563ffd6cae381ce1e318cdacc54e70040d6a01a50d0db8aeb50edbbe413eac58" + }, { "name": "cool", "unicode": "1F192", @@ -1819,6 +1849,16 @@ "unicode": "1F404", "digest": "e7a5131d7dee0f3356814b0ac1ea8ff280b12a7b580181e20ddb0b7eeb7e7339" }, + { + "name": "cowboy", + "unicode": "1F920", + "digest": "1aabf23f6b95a9b772fdb8eb45b8ec93584a5357f9131c6eabc9d1b83fe67e89" + }, + { + "name": "face_with_cowboy_hat", + "unicode": "1F920", + "digest": "1aabf23f6b95a9b772fdb8eb45b8ec93584a5357f9131c6eabc9d1b83fe67e89" + }, { "name": "crab", "unicode": "1F980", @@ -1859,6 +1899,11 @@ "unicode": "1F40A", "digest": "59cb4164c50b6bc9ae311ce6f7610467c1aaafa848b5fff7614f064715f91992" }, + { + "name": "croissant", + "unicode": "1F950", + "digest": "b751e287157a1e276617a841a5b5f7f1208ca226cfd8fa947f144390b65a5e16" + }, { "name": "cross", "unicode": "271D", @@ -1869,36 +1914,6 @@ "unicode": "271D", "digest": "a6b07c838fb75ef2ebefa2df6005e8d784753239ec03c37695a13e3b1954d653" }, - { - "name": "cross_heavy", - "unicode": "1F547", - "digest": "2e37c26b9bad0beb019c7f3e7a3892352d0ad9ca1b90c4333d42e8d56680be70" - }, - { - "name": "heavy_latin_cross", - "unicode": "1F547", - "digest": "2e37c26b9bad0beb019c7f3e7a3892352d0ad9ca1b90c4333d42e8d56680be70" - }, - { - "name": "cross_white", - "unicode": "1F546", - "digest": "3452e667010d7e49a51d7e1f4ba8ed4f303e33ed43255a051e9a18832a1efba6" - }, - { - "name": "white_latin_cross", - "unicode": "1F546", - "digest": "3452e667010d7e49a51d7e1f4ba8ed4f303e33ed43255a051e9a18832a1efba6" - }, - { - "name": "crossbones", - "unicode": "1F571", - "digest": "f5e7ce293c1a3282711073e68f033a3876e8428d1218cb2f8294630f9124e584" - }, - { - "name": "black_skull_and_crossbones", - "unicode": "1F571", - "digest": "f5e7ce293c1a3282711073e68f033a3876e8428d1218cb2f8294630f9124e584" - }, { "name": "crossed_flags", "unicode": "1F38C", @@ -1939,6 +1954,11 @@ "unicode": "1F52E", "digest": "05f73b30b1e5b0fc66fb5dc6caddd2d547ee7b9d2f97513dc908ba1a2e352e30" }, + { + "name": "cucumber", + "unicode": "1F952", + "digest": "d1196e23f2f155ef5c1330f8497f40957a7357cb177127f457c5c471f0a23727" + }, { "name": "cupid", "unicode": "1F498", @@ -2049,16 +2069,16 @@ "unicode": "1F333", "digest": "3c70f1a77f2754f41c830e88d43b7d53c14311d64626ded164aa9ac7d2695790" }, + { + "name": "deer", + "unicode": "1F98C", + "digest": "7f4302ca68fd121ee73be48d0a0a0fb9e7e2741071a491ad2b7b0eab9f11ad25" + }, { "name": "department_store", "unicode": "1F3EC", "digest": "4be910d2efe74d8ce2c1f41d7753c8873579faca83fcf779a4887d8ab9e5923b" }, - { - "name": "descending_notes", - "unicode": "1F39D", - "digest": "f09c6a2e094b13bf91cc07b7b776e43348ccef9f91247ca36cc02e7d91098af0" - }, { "name": "desert", "unicode": "1F3DC", @@ -2074,11 +2094,6 @@ "unicode": "1F5A5", "digest": "cde5bfb6c71bb7d663808a3561b24cb5b5560f95f510b40f81250cac1b21933e" }, - { - "name": "desktop_window", - "unicode": "1F5D4", - "digest": "d5b6c4a847e2a96f97f50fd353a22cb121915cb1d7bbc0f02df38769819b6b7e" - }, { "name": "diamond_shape_with_a_dot_inside", "unicode": "1F4A0", @@ -2124,21 +2139,6 @@ "unicode": "1F6AF", "digest": "98b07fbbcdb438d1b8a755869fa2de8e180a77fce359ec830eb46d38ec3e67cb" }, - { - "name": "document", - "unicode": "1F5CE", - "digest": "2cbca96cc69306a10f1a9b6505723e027239439d899f6b395dc43f3c37d2d777" - }, - { - "name": "document_text", - "unicode": "1F5B9", - "digest": "29407b12409c9673f3d89ef1f86ee50cbc7ed53b1870e33b4a29bbc609017f72" - }, - { - "name": "document_with_text", - "unicode": "1F5B9", - "digest": "29407b12409c9673f3d89ef1f86ee50cbc7ed53b1870e33b4a29bbc609017f72" - }, { "name": "dog", "unicode": "1F436", @@ -2204,11 +2204,36 @@ "unicode": "1F42A", "digest": "e06ef69c29f0fb12481727c0b4124e700572d3d7955e173279320f43f286518d" }, + { + "name": "drooling_face", + "unicode": "1F924", + "digest": "5203cb05cd266d7a7c929ab40364ad68571d380d9c7ff93a8d6d55261abaa1ba" + }, + { + "name": "drool", + "unicode": "1F924", + "digest": "5203cb05cd266d7a7c929ab40364ad68571d380d9c7ff93a8d6d55261abaa1ba" + }, { "name": "droplet", "unicode": "1F4A7", "digest": "6475b4a4460a672c436a68f282ac97fb31e2934db4b80620063ee816159aa7c3" }, + { + "name": "drum", + "unicode": "1F941", + "digest": "0d0639980b1a5dcbf1c3e7ef47263fb6543b871242c58452a8c2f642525d9dd8" + }, + { + "name": "drum_with_drumsticks", + "unicode": "1F941", + "digest": "0d0639980b1a5dcbf1c3e7ef47263fb6543b871242c58452a8c2f642525d9dd8" + }, + { + "name": "duck", + "unicode": "1F986", + "digest": "8f8373798a7727368b32328e7a9a349727a949e7391ddd243b6456141a4f7e94" + }, { "name": "dvd", "unicode": "1F4C0", @@ -2224,6 +2249,11 @@ "unicode": "1F4E7", "digest": "39b5a57a2376e4a1137e381be02a1775bd580e0371438f5297a401ea634f1830" }, + { + "name": "eagle", + "unicode": "1F985", + "digest": "b44fd4f61b83c5114358a272343ac9b0eabbc70847f739bbdbf8aae3ade5bc1d" + }, { "name": "ear", "unicode": "1F442", @@ -2276,8 +2306,8 @@ }, { "name": "egg", - "unicode": "1F373", - "digest": "563ffd6cae381ce1e318cdacc54e70040d6a01a50d0db8aeb50edbbe413eac58" + "unicode": "1F95A", + "digest": "72b9c841af784e7cbccbbe48ba833df5cecdd284397c199cab079872e879d92f" }, { "name": "eggplant", @@ -2299,6 +2329,16 @@ "unicode": "2733", "digest": "bb0758e7cc0e357285937671a91489bd32ce9d248eecdcc9c275a53a66325b26" }, + { + "name": "eject", + "unicode": "23CF", + "digest": "eeb0cd23ead0c965e307de517a6805265f0c780c3e454e64bc4c1425dfe7548e" + }, + { + "name": "eject_symbol", + "unicode": "23CF", + "digest": "eeb0cd23ead0c965e307de517a6805265f0c780c3e454e64bc4c1425dfe7548e" + }, { "name": "electric_plug", "unicode": "1F50C", @@ -2319,46 +2359,6 @@ "unicode": "2709", "digest": "f5a512022a2f5280f372ff39c22cbda815f698710ca66f8f8c4d08418f98ca78" }, - { - "name": "envelope_back", - "unicode": "1F582", - "digest": "bc60b6d375feee00758a94a05b42eeb165f4084b20eb3e6012b72faa221f7e75" - }, - { - "name": "back_of_envelope", - "unicode": "1F582", - "digest": "bc60b6d375feee00758a94a05b42eeb165f4084b20eb3e6012b72faa221f7e75" - }, - { - "name": "envelope_flying", - "unicode": "1F585", - "digest": "9d6b6ca4c08006062a6f11948de3e15b13cf5c458967e39a9358665a8e13e214" - }, - { - "name": "flying_envelope", - "unicode": "1F585", - "digest": "9d6b6ca4c08006062a6f11948de3e15b13cf5c458967e39a9358665a8e13e214" - }, - { - "name": "envelope_stamped", - "unicode": "1F583", - "digest": "f6102aea7283ddc136bfeb09589573420b9279105045fc6b965c1633c1297468" - }, - { - "name": "stamped_envelope", - "unicode": "1F583", - "digest": "f6102aea7283ddc136bfeb09589573420b9279105045fc6b965c1633c1297468" - }, - { - "name": "envelope_stamped_pen", - "unicode": "1F586", - "digest": "80ea471318d1e04f8e525ff236b3cd4a4c864e66c6246b6aad77d92f56895f33" - }, - { - "name": "pen_over_stamped_envelope", - "unicode": "1F586", - "digest": "80ea471318d1e04f8e525ff236b3cd4a4c864e66c6246b6aad77d92f56895f33" - }, { "name": "envelope_with_arrow", "unicode": "1F4E9", @@ -2414,6 +2414,36 @@ "unicode": "1F440", "digest": "1d5cae0b9b2e51e1de54295685d7f0c72ee794e2e6335a95b1d056c7e77260e8" }, + { + "name": "face_palm", + "unicode": "1F926", + "digest": "4ec873048b34b1bb34430724cf28e4bee6c0a9eee88ce39b9d1565047dc92420" + }, + { + "name": "face_palm_tone1", + "unicode": "1F926-1F3FB", + "digest": "e93ef92b4c01dbea6c400e708e23dd36da92ccfbf5eb4f177b3b20c3a46bdc19" + }, + { + "name": "face_palm_tone2", + "unicode": "1F926-1F3FC", + "digest": "22c8bf9fd9fa2ed9dca7a6397ed00ba6cfe9aeef2b0fb7b516ee4dda0df050ea" + }, + { + "name": "face_palm_tone3", + "unicode": "1F926-1F3FD", + "digest": "c0b8bb9d2423e6787b6bdf1ca5a13f52853e4f48a9a1af0f2d4af1364fff022e" + }, + { + "name": "face_palm_tone4", + "unicode": "1F926-1F3FE", + "digest": "f522ab186adcbb4549ea2c03500cdd7a86add548e43ebf7a54d58cc24deea072" + }, + { + "name": "face_palm_tone5", + "unicode": "1F926-1F3FF", + "digest": "363507ae7178b5ec583635f47bcab10c897346f48b85d8759b1004c32cd8ad65" + }, { "name": "factory", "unicode": "1F3ED", @@ -2519,6 +2549,16 @@ "unicode": "1F43E", "digest": "45aca538d3a9831a0c7de491e5656c17705c07b8f4ac8e85254656b608976016" }, + { + "name": "fencer", + "unicode": "1F93A", + "digest": "5db00fa456af9f6c7cb88d300579dd63e426bcb97ad25486b664aff25c688e21" + }, + { + "name": "fencing", + "unicode": "1F93A", + "digest": "5db00fa456af9f6c7cb88d300579dd63e426bcb97ad25486b664aff25c688e21" + }, { "name": "ferris_wheel", "unicode": "1F3A1", @@ -2550,54 +2590,64 @@ "digest": "4da212148cadb9c4ea91e60d2d8316e38cea99ef4f14afc023711dd7c54ade5a" }, { - "name": "finger_pointing_down", - "unicode": "1F597", - "digest": "0c542ac3141e8f2e74767acd0eb399c2d68c779cb78bf16d437ad3b1f8134ad9" + "name": "fingers_crossed", + "unicode": "1F91E", + "digest": "a5c797ead191b9712e185083266b455cdf09f6a34c10f8c51aa145e6073427e1" }, { - "name": "white_down_pointing_left_hand_index", - "unicode": "1F597", - "digest": "0c542ac3141e8f2e74767acd0eb399c2d68c779cb78bf16d437ad3b1f8134ad9" + "name": "hand_with_index_and_middle_finger_crossed", + "unicode": "1F91E", + "digest": "a5c797ead191b9712e185083266b455cdf09f6a34c10f8c51aa145e6073427e1" }, { - "name": "finger_pointing_down2", - "unicode": "1F59F", - "digest": "c5b128a232cbf518544802a2ae1459368274297163721fa05d0103cf95b2b1ee" + "name": "fingers_crossed_tone1", + "unicode": "1F91E-1F3FB", + "digest": "db56d47bf887f2d8459a3aaba23f15c0087234ae5a54125052e7046e034a4988" }, { - "name": "sideways_white_down_pointing_index", - "unicode": "1F59F", - "digest": "c5b128a232cbf518544802a2ae1459368274297163721fa05d0103cf95b2b1ee" + "name": "hand_with_index_and_middle_fingers_crossed_tone1", + "unicode": "1F91E-1F3FB", + "digest": "db56d47bf887f2d8459a3aaba23f15c0087234ae5a54125052e7046e034a4988" }, { - "name": "finger_pointing_left", - "unicode": "1F598", - "digest": "d178ece691e2091be08db77fda9cf05462934628557358a8cb6222587b291f7e" + "name": "fingers_crossed_tone2", + "unicode": "1F91E-1F3FC", + "digest": "19f1bcca3991db7ed2037278c0baab6cd7f12aeaf2e0074de402c4d9e45c1899" }, { - "name": "sideways_white_left_pointing_index", - "unicode": "1F598", - "digest": "d178ece691e2091be08db77fda9cf05462934628557358a8cb6222587b291f7e" + "name": "hand_with_index_and_middle_fingers_crossed_tone2", + "unicode": "1F91E-1F3FC", + "digest": "19f1bcca3991db7ed2037278c0baab6cd7f12aeaf2e0074de402c4d9e45c1899" }, { - "name": "finger_pointing_right", - "unicode": "1F599", - "digest": "a412a47544d8f401f9181f8826c5fa3d6b42a1d76f6926963c2d9cd2a01be06d" + "name": "fingers_crossed_tone3", + "unicode": "1F91E-1F3FD", + "digest": "895a3314f6a310f31f7e728bcca20ff834fbfac62ce00e27e3ea5ad0dfc1ba35" }, { - "name": "sideways_white_right_pointing_index", - "unicode": "1F599", - "digest": "a412a47544d8f401f9181f8826c5fa3d6b42a1d76f6926963c2d9cd2a01be06d" + "name": "hand_with_index_and_middle_fingers_crossed_tone3", + "unicode": "1F91E-1F3FD", + "digest": "895a3314f6a310f31f7e728bcca20ff834fbfac62ce00e27e3ea5ad0dfc1ba35" }, { - "name": "finger_pointing_up", - "unicode": "1F59E", - "digest": "32c2ccab52aa318a47c816d1bcf9c076e667c9ef3e64ce37d7ba7e827238690d" + "name": "fingers_crossed_tone4", + "unicode": "1F91E-1F3FE", + "digest": "fcb5c4de2001d23a5df1b8702624d134b7f94e93e2dcc8adf6c1033c77722b0e" }, { - "name": "sideways_white_up_pointing_index", - "unicode": "1F59E", - "digest": "32c2ccab52aa318a47c816d1bcf9c076e667c9ef3e64ce37d7ba7e827238690d" + "name": "hand_with_index_and_middle_fingers_crossed_tone4", + "unicode": "1F91E-1F3FE", + "digest": "fcb5c4de2001d23a5df1b8702624d134b7f94e93e2dcc8adf6c1033c77722b0e" + }, + { + "name": "fingers_crossed_tone5", + "unicode": "1F91E-1F3FF", + "digest": "50132c78d530b048c21be4e788b446872a79b3b3a91009db12f4021c44c8469d" + }, + { + "name": "hand_with_index_and_middle_fingers_crossed_tone5", + "unicode": "1F91E-1F3FF", + "digest": "50132c78d530b048c21be4e788b446872a79b3b3a91009db12f4021c44c8469d" }, { "name": "fire", @@ -2615,19 +2665,19 @@ "digest": "c3a518f27d625e3b62dffa227eb82764bf0a147f10ec0e7f4f43f3f96751af20" }, { - "name": "fire_engine_oncoming", - "unicode": "1F6F1", - "digest": "e2482c450136d373f74dfafddf502e0b675eb5d2e1e1c645f163db0e4d15fbb6" + "name": "fireworks", + "unicode": "1F386", + "digest": "b62ae08a00c0cc6eba8f9666c8fd9946ce57c3cfc01fe99542a8690a4a566a65" }, { - "name": "oncoming_fire_engine", - "unicode": "1F6F1", - "digest": "e2482c450136d373f74dfafddf502e0b675eb5d2e1e1c645f163db0e4d15fbb6" + "name": "first_place", + "unicode": "1F947", + "digest": "e3de5d9f14f05544dbee5965cc2baa20e7b417a488c8a18598979038860fd901" }, { - "name": "fireworks", - "unicode": "1F386", - "digest": "b62ae08a00c0cc6eba8f9666c8fd9946ce57c3cfc01fe99542a8690a4a566a65" + "name": "first_place_medal", + "unicode": "1F947", + "digest": "e3de5d9f14f05544dbee5965cc2baa20e7b417a488c8a18598979038860fd901" }, { "name": "first_quarter_moon", @@ -5299,41 +5349,11 @@ "unicode": "269C", "digest": "ebf49007f367dc05580e9dab942e93e9dda12fa1dc2caa410ac7f8d8cd55d2a3" }, - { - "name": "flip_phone", - "unicode": "1F581", - "digest": "be59efba4bc0759af5a726c06619090ef5071bf2541611d71691dedecee6c697" - }, - { - "name": "clamshell_mobile_phone", - "unicode": "1F581", - "digest": "be59efba4bc0759af5a726c06619090ef5071bf2541611d71691dedecee6c697" - }, - { - "name": "floppy_black", - "unicode": "1F5AA", - "digest": "9022f51bb09c5130c6d46bb2accb159bed6f54d6fbffda6ecad62965ebc958ea" - }, - { - "name": "black_hard_shell_floppy_disk", - "unicode": "1F5AA", - "digest": "9022f51bb09c5130c6d46bb2accb159bed6f54d6fbffda6ecad62965ebc958ea" - }, { "name": "floppy_disk", "unicode": "1F4BE", "digest": "4ee0b5bba41b9e301ed125d3ee1c263bef171ca499e6e1b89276b09af2bc03a0" }, - { - "name": "floppy_white", - "unicode": "1F5AB", - "digest": "ec79c400117c4506ef8cf3eebef6c42dd37e60b3079d3e98b6ccd06e517e2af0" - }, - { - "name": "white_hard_shell_floppy_disk", - "unicode": "1F5AB", - "digest": "ec79c400117c4506ef8cf3eebef6c42dd37e60b3079d3e98b6ccd06e517e2af0" - }, { "name": "flower_playing_cards", "unicode": "1F3B4", @@ -5354,21 +5374,6 @@ "unicode": "1F301", "digest": "bc3631a4e9e8473b92e842008937add2cd9ffad5b7d772ce759fb5ff6c0e3dca" }, - { - "name": "folder", - "unicode": "1F5C0", - "digest": "8932141321911032ce8469ba85fe309b78384545c3b9946978b383670b956644" - }, - { - "name": "folder_open", - "unicode": "1F5C1", - "digest": "74f3b484771c3d6ef61cf003de25c1a59b875afa46c057b5b1d92d9f99460685" - }, - { - "name": "open_folder", - "unicode": "1F5C1", - "digest": "74f3b484771c3d6ef61cf003de25c1a59b875afa46c057b5b1d92d9f99460685" - }, { "name": "football", "unicode": "1F3C8", @@ -5409,6 +5414,16 @@ "unicode": "1F340", "digest": "ebee16e86bc9be843dfc72ab5372fb462f06be4486b5b25d7d4cac9b2c8b01c8" }, + { + "name": "fox", + "unicode": "1F98A", + "digest": "e9903cb0396f7e49bdd2c384b38e614c13bfa576b3ecc1ec7b9819e4a40d91d1" + }, + { + "name": "fox_face", + "unicode": "1F98A", + "digest": "e9903cb0396f7e49bdd2c384b38e614c13bfa576b3ecc1ec7b9819e4a40d91d1" + }, { "name": "frame_photo", "unicode": "1F5BC", @@ -5420,29 +5435,19 @@ "digest": "d5074f748a15055ec1fb812c1e5e169e6e3cc73c522c54be1359b0e26c0fc75c" }, { - "name": "frame_tiles", - "unicode": "1F5BD", - "digest": "34a5bb044b4b3ad94b116ad106f7b6747fb8612dc0e9f8ccd4313c2920508df0" - }, - { - "name": "frame_with_tiles", - "unicode": "1F5BD", - "digest": "34a5bb044b4b3ad94b116ad106f7b6747fb8612dc0e9f8ccd4313c2920508df0" - }, - { - "name": "frame_x", - "unicode": "1F5BE", - "digest": "2e427688fd70361c8c59787d0722ad68abe1c3f968258ee99c0c77ce4b8a8e15" + "name": "free", + "unicode": "1F193", + "digest": "9973522457158362fc5bdd7da858e6371e28a8403d1ef9e4b6427195c7f72cfa" }, { - "name": "frame_with_an_x", - "unicode": "1F5BE", - "digest": "2e427688fd70361c8c59787d0722ad68abe1c3f968258ee99c0c77ce4b8a8e15" + "name": "french_bread", + "unicode": "1F956", + "digest": "47518a4312f57207b8e8c38188d4a2bd8b16830a885cfcf2d281cfab50c1bc6e" }, { - "name": "free", - "unicode": "1F193", - "digest": "9973522457158362fc5bdd7da858e6371e28a8403d1ef9e4b6427195c7f72cfa" + "name": "baguette_bread", + "unicode": "1F956", + "digest": "47518a4312f57207b8e8c38188d4a2bd8b16830a885cfcf2d281cfab50c1bc6e" }, { "name": "fried_shrimp", @@ -5559,16 +5564,21 @@ "unicode": "1F467-1F3FF", "digest": "f55e4b16a41b6f5e3c817a301420360ba4486e4e82e1092a56a3e3cc4069087d" }, - { - "name": "girls_symbol", - "unicode": "1F6CA", - "digest": "2c55aee81defd7a1620ffeaad8d9bcc1835f19237c72c79633aec45671ddb9ff" - }, { "name": "globe_with_meridians", "unicode": "1F310", "digest": "725bebeb3c09a9e3701ebe49e672dcfbf2b73575e05f0821263511577b013b75" }, + { + "name": "goal", + "unicode": "1F945", + "digest": "7088c432f276ff6f447dc0d431b9062b394fb401de1072fe59ca56267bfd6717" + }, + { + "name": "goal_net", + "unicode": "1F945", + "digest": "7088c432f276ff6f447dc0d431b9062b394fb401de1072fe59ca56267bfd6717" + }, { "name": "goat", "unicode": "1F410", @@ -5584,6 +5594,11 @@ "unicode": "1F3CC", "digest": "7d7ecc6e226596f646030a4109c2b0001ef0cc690e4863e450bf5d29e7a90344" }, + { + "name": "gorilla", + "unicode": "1F98D", + "digest": "4a564dc14f8ae5450d094f6410ec7f099a7f07dc5254b6395f44a35527bdb4b7" + }, { "name": "grapes", "unicode": "1F347", @@ -5734,16 +5749,6 @@ "unicode": "1F590", "digest": "c51a30cb7e575d29ffed16780a6c95ae3f300b8ac523012f4a6e116d68c1fd15" }, - { - "name": "hand_splayed_reverse", - "unicode": "1F591", - "digest": "ff0af0fe9def7388adca6836e5958492282b1afae99f1b6e1e65d11ba68b96db" - }, - { - "name": "reversed_raised_hand_with_fingers_splayed", - "unicode": "1F591", - "digest": "ff0af0fe9def7388adca6836e5958492282b1afae99f1b6e1e65d11ba68b96db" - }, { "name": "hand_splayed_tone1", "unicode": "1F590-1F3FB", @@ -5795,24 +5800,99 @@ "digest": "4b3a0aba7829772fec09f26d6facc19a2f822d2998015297b18b5cab85190ee2" }, { - "name": "hand_victory", - "unicode": "1F594", - "digest": "2d512ced4e8a438f2a346aed67310d3080f9828c748ade1be95943c32ba1c735" + "name": "handbag", + "unicode": "1F45C", + "digest": "45410a3eed0c2e3f68748d7649fa9e33a90f4e80d5291206bdd0b40380c6da45" }, { - "name": "reversed_victory_hand", - "unicode": "1F594", - "digest": "2d512ced4e8a438f2a346aed67310d3080f9828c748ade1be95943c32ba1c735" + "name": "handball", + "unicode": "1F93E", + "digest": "94ceb28024eb3259d8b137cafd7438773e717fbc04f5da810f85e43ca0fa9e00" }, { - "name": "handbag", - "unicode": "1F45C", - "digest": "45410a3eed0c2e3f68748d7649fa9e33a90f4e80d5291206bdd0b40380c6da45" + "name": "handball_tone1", + "unicode": "1F93E-1F3FB", + "digest": "8bec4de0d05c80e335e44d65598d186ca92696977353c9fd9c2a5efa122cb842" + }, + { + "name": "handball_tone2", + "unicode": "1F93E-1F3FC", + "digest": "2ff4131e1e2f089b315d8e176c9348877c26c2bd03706fb75d41bc61bc99bf93" + }, + { + "name": "handball_tone3", + "unicode": "1F93E-1F3FD", + "digest": "224a71f94dd37d3729325d11412334667a81422e21f6d7c008730ff350f51a80" }, { - "name": "hard_disk", - "unicode": "1F5B4", - "digest": "df8549d4281f5ae70fb6792a02c078e651764b0276aa43b7407236bd38fc21b4" + "name": "handball_tone4", + "unicode": "1F93E-1F3FE", + "digest": "a5f7a9db790565981bad2d0d9e09554c8c509a8179b4705a418300d58a7894b4" + }, + { + "name": "handball_tone5", + "unicode": "1F93E-1F3FF", + "digest": "00404572d4683f2e8e8a494aa733e96fbec1723634d0a8cb8d75f2829a789d27" + }, + { + "name": "handshake", + "unicode": "1F91D", + "digest": "cb4b08b70560908f96bda0aecd2f4c966bea180f9b7200e4c81d342dc8d36087" + }, + { + "name": "shaking_hands", + "unicode": "1F91D", + "digest": "cb4b08b70560908f96bda0aecd2f4c966bea180f9b7200e4c81d342dc8d36087" + }, + { + "name": "handshake_tone1", + "unicode": "1F91D-1F3FB", + "digest": "40470e224683ba375ed8698c0cbd560556be5a8898237ddf504377a3a7e89ff0" + }, + { + "name": "shaking_hands_tone1", + "unicode": "1F91D-1F3FB", + "digest": "40470e224683ba375ed8698c0cbd560556be5a8898237ddf504377a3a7e89ff0" + }, + { + "name": "handshake_tone2", + "unicode": "1F91D-1F3FC", + "digest": "77ed378243bf682f1f4f1a8caeabcbedf772f54631cc40ea46c099e46a499b18" + }, + { + "name": "shaking_hands_tone2", + "unicode": "1F91D-1F3FC", + "digest": "77ed378243bf682f1f4f1a8caeabcbedf772f54631cc40ea46c099e46a499b18" + }, + { + "name": "handshake_tone3", + "unicode": "1F91D-1F3FD", + "digest": "81b95050f0878b617f5d2640e34031c26a0072e46ca5a688eb4356e48bc74c92" + }, + { + "name": "shaking_hands_tone3", + "unicode": "1F91D-1F3FD", + "digest": "81b95050f0878b617f5d2640e34031c26a0072e46ca5a688eb4356e48bc74c92" + }, + { + "name": "handshake_tone4", + "unicode": "1F91D-1F3FE", + "digest": "74919a6f026fbbd0ccdbdbd4288d1b2ef3bda8930e9142c07736db4a7f3ef345" + }, + { + "name": "shaking_hands_tone4", + "unicode": "1F91D-1F3FE", + "digest": "74919a6f026fbbd0ccdbdbd4288d1b2ef3bda8930e9142c07736db4a7f3ef345" + }, + { + "name": "handshake_tone5", + "unicode": "1F91D-1F3FF", + "digest": "a30d662bfad0074ca7e32cf6f7229b643b636c4beaec496777eb7e1d5b6fc470" + }, + { + "name": "shaking_hands_tone5", + "unicode": "1F91D-1F3FF", + "digest": "a30d662bfad0074ca7e32cf6f7229b643b636c4beaec496777eb7e1d5b6fc470" }, { "name": "hash", @@ -5879,16 +5959,6 @@ "unicode": "1F63B", "digest": "8a1f28b97d661ca4cff5ee13889ca61b5fa745ccb590e80832b7d7701df101d6" }, - { - "name": "heart_tip", - "unicode": "1F394", - "digest": "2178829e2c85accda55d2f685544587f6de5c8398a127ae1e08ff1c4ab282204" - }, - { - "name": "heart_with_tip_on_the_left", - "unicode": "1F394", - "digest": "2178829e2c85accda55d2f685544587f6de5c8398a127ae1e08ff1c4ab282204" - }, { "name": "heartbeat", "unicode": "1F493", @@ -6144,16 +6214,6 @@ "unicode": "1F4E8", "digest": "310b7bdcca93452fe10c72c03d0aafa12b98e5d3408896d275d06d3693812c7a" }, - { - "name": "info", - "unicode": "1F6C8", - "digest": "59c35e77d5ee663c5d56f7d8af845ce8aeb9935e526ae4a06e02ae70e71212ca" - }, - { - "name": "circled_information_source", - "unicode": "1F6C8", - "digest": "59c35e77d5ee663c5d56f7d8af845ce8aeb9935e526ae4a06e02ae70e71212ca" - }, { "name": "information_desk_person", "unicode": "1F481", @@ -6249,16 +6309,6 @@ "unicode": "1F456", "digest": "f986ad32e419cca81c995f8371f0189d1490172a97ebbeac60054a1af08949c5" }, - { - "name": "jet_up", - "unicode": "1F6E6", - "digest": "3708e5e034b1c64d1268d66527e13c369aa0f8903bce9172bef773b2d1940948" - }, - { - "name": "up_pointing_military_airplane", - "unicode": "1F6E6", - "digest": "3708e5e034b1c64d1268d66527e13c369aa0f8903bce9172bef773b2d1940948" - }, { "name": "joy", "unicode": "1F602", @@ -6274,6 +6324,66 @@ "unicode": "1F579", "digest": "671ee588f397a96f27056a67e6a06d6e8d22c2109ec57b2859badb5fec9cf8dd" }, + { + "name": "juggling", + "unicode": "1F939", + "digest": "1f5dafa78de8b37f3df88fdf3084d2380666bd74ab2f449754d8724f6f8dbfa5" + }, + { + "name": "juggler", + "unicode": "1F939", + "digest": "1f5dafa78de8b37f3df88fdf3084d2380666bd74ab2f449754d8724f6f8dbfa5" + }, + { + "name": "juggling_tone1", + "unicode": "1F939-1F3FB", + "digest": "b0b4d020148c896be69c28b08e3c486f6db270d138c7ccf4be362b29eb99878d" + }, + { + "name": "juggler_tone1", + "unicode": "1F939-1F3FB", + "digest": "b0b4d020148c896be69c28b08e3c486f6db270d138c7ccf4be362b29eb99878d" + }, + { + "name": "juggling_tone2", + "unicode": "1F939-1F3FC", + "digest": "cfe0c1649b2fdca03673e0e64f3a7d06d4bd49b8954c769aeb7eb88b70ec99f4" + }, + { + "name": "juggler_tone2", + "unicode": "1F939-1F3FC", + "digest": "cfe0c1649b2fdca03673e0e64f3a7d06d4bd49b8954c769aeb7eb88b70ec99f4" + }, + { + "name": "juggling_tone3", + "unicode": "1F939-1F3FD", + "digest": "7f87022722008bb265abe245e8157dc7a61944f5da62b3cf86f26ee1b3bdef63" + }, + { + "name": "juggler_tone3", + "unicode": "1F939-1F3FD", + "digest": "7f87022722008bb265abe245e8157dc7a61944f5da62b3cf86f26ee1b3bdef63" + }, + { + "name": "juggling_tone4", + "unicode": "1F939-1F3FE", + "digest": "1f00da8c05582c95501cc6c3fe5ce0f9bfbc16789dcee59844a8fe7831198583" + }, + { + "name": "juggler_tone4", + "unicode": "1F939-1F3FE", + "digest": "1f00da8c05582c95501cc6c3fe5ce0f9bfbc16789dcee59844a8fe7831198583" + }, + { + "name": "juggling_tone5", + "unicode": "1F939-1F3FF", + "digest": "a195bf734788eb7961c00dbc05255a49da8b9d5042fada29b26cc20393d3ce52" + }, + { + "name": "juggler_tone5", + "unicode": "1F939-1F3FF", + "digest": "a195bf734788eb7961c00dbc05255a49da8b9d5042fada29b26cc20393d3ce52" + }, { "name": "kaaba", "unicode": "1F54B", @@ -6296,38 +6406,8 @@ }, { "name": "keyboard", - "unicode": "1F5AE", - "digest": "3b254cbf19946df3af05e501d11653d89fcda91684b7248d86186f842b83bf16" - }, - { - "name": "wired_keyboard", - "unicode": "1F5AE", - "digest": "3b254cbf19946df3af05e501d11653d89fcda91684b7248d86186f842b83bf16" - }, - { - "name": "keyboard_mouse", - "unicode": "1F5A6", - "digest": "95b523e55d8afeaeb06442bbe20e47f49643bb0c32d89a8cdbbccdead20532b3" - }, - { - "name": "keyboard_and_mouse", - "unicode": "1F5A6", - "digest": "95b523e55d8afeaeb06442bbe20e47f49643bb0c32d89a8cdbbccdead20532b3" - }, - { - "name": "keyboard_with_jacks", - "unicode": "1F398", - "digest": "e29a0d0b8018d13458469edca13c60a882a2817957c1aa11b050684c995a47ee" - }, - { - "name": "musical_keyboard_with_jacks", - "unicode": "1F398", - "digest": "e29a0d0b8018d13458469edca13c60a882a2817957c1aa11b050684c995a47ee" - }, - { - "name": "keycap_ten", - "unicode": "1F51F", - "digest": "c7c9491021740d2c17edddb856f79579b0b943d8dc85a2f48dbaac84f35b8a40" + "unicode": "2328", + "digest": "34da8ff62ca964142f9281b80123dbba74deaac8d77fa61758c30cfb36c31386" }, { "name": "kimono", @@ -6384,6 +6464,16 @@ "unicode": "1F619", "digest": "f0f8636cb1a02b93cc72ce1b194b890fca823d91e35926b889be3ecfae79207f" }, + { + "name": "kiwi", + "unicode": "1F95D", + "digest": "70a3a05f333d9455d2da12eed970bc3baae416286848fed8e5dd31b5be0819be" + }, + { + "name": "kiwifruit", + "unicode": "1F95D", + "digest": "70a3a05f333d9455d2da12eed970bc3baae416286848fed8e5dd31b5be0819be" + }, { "name": "knife", "unicode": "1F52A", @@ -6450,19 +6540,69 @@ "digest": "e58cb714353e96a2891a5d97910ff79660e637af909b81c49c919d3735db55b4" }, { - "name": "left_luggage", - "unicode": "1F6C5", - "digest": "6625077767a51163ea20cbc299f3c13fd5ccf1b5ce365ee702ef1fef6be3dadf" + "name": "left_facing_fist", + "unicode": "1F91B", + "digest": "7861be485beefae0de341df2f21576666e22f63511a033e785752f30c07291da" + }, + { + "name": "left_fist", + "unicode": "1F91B", + "digest": "7861be485beefae0de341df2f21576666e22f63511a033e785752f30c07291da" + }, + { + "name": "left_facing_fist_tone1", + "unicode": "1F91B-1F3FB", + "digest": "2e4c4dd96b0e4b46fe0f9ce5666344d266d0f17a8544cbae73d96638d1955296" + }, + { + "name": "left_fist_tone1", + "unicode": "1F91B-1F3FB", + "digest": "2e4c4dd96b0e4b46fe0f9ce5666344d266d0f17a8544cbae73d96638d1955296" + }, + { + "name": "left_facing_fist_tone2", + "unicode": "1F91B-1F3FC", + "digest": "b96a63a801175ce98a75f0edad7b5574251a3fbbd894d8ab3f21aeeda366cc13" + }, + { + "name": "left_fist_tone2", + "unicode": "1F91B-1F3FC", + "digest": "b96a63a801175ce98a75f0edad7b5574251a3fbbd894d8ab3f21aeeda366cc13" + }, + { + "name": "left_facing_fist_tone3", + "unicode": "1F91B-1F3FD", + "digest": "99df84635513c2ebfef24df1bd3705233e02149eef788c7b82ca0548df6f6ea5" + }, + { + "name": "left_fist_tone3", + "unicode": "1F91B-1F3FD", + "digest": "99df84635513c2ebfef24df1bd3705233e02149eef788c7b82ca0548df6f6ea5" + }, + { + "name": "left_facing_fist_tone4", + "unicode": "1F91B-1F3FE", + "digest": "68954842ca725aec0aa39bce4aa81aad17ac30f5f298561dfa411feb07414cd3" }, { - "name": "left_receiver", - "unicode": "1F57B", - "digest": "8052e44951afee04c87296128744b5019ec783c9ed1a231f659af6c8ddaa50f3" + "name": "left_fist_tone4", + "unicode": "1F91B-1F3FE", + "digest": "68954842ca725aec0aa39bce4aa81aad17ac30f5f298561dfa411feb07414cd3" }, { - "name": "left_hand_telephone_receiver", - "unicode": "1F57B", - "digest": "8052e44951afee04c87296128744b5019ec783c9ed1a231f659af6c8ddaa50f3" + "name": "left_facing_fist_tone5", + "unicode": "1F91B-1F3FF", + "digest": "a419b33fae82612dc860ff48950c0547a1642d4f0c94b6547324440837d3bb21" + }, + { + "name": "left_fist_tone5", + "unicode": "1F91B-1F3FF", + "digest": "a419b33fae82612dc860ff48950c0547a1642d4f0c94b6547324440837d3bb21" + }, + { + "name": "left_luggage", + "unicode": "1F6C5", + "digest": "6625077767a51163ea20cbc299f3c13fd5ccf1b5ce365ee702ef1fef6be3dadf" }, { "name": "left_right_arrow", @@ -6569,16 +6709,6 @@ "unicode": "1F3CB-1F3FF", "digest": "79b0edf6ce1fd024dd7f458e322ad8588af0b789a04cc1cf38380dc8b9c76f55" }, - { - "name": "light_check_mark", - "unicode": "1F5F8", - "digest": "7842b0df8c2b6703bed0cce5d2790d394eec7120b2a245a76f375528f2729a7b" - }, - { - "name": "light_mark", - "unicode": "1F5F8", - "digest": "7842b0df8c2b6703bed0cce5d2790d394eec7120b2a245a76f375528f2729a7b" - }, { "name": "light_rail", "unicode": "1F688", @@ -6604,16 +6734,16 @@ "unicode": "1F444", "digest": "8740d8086525c7a836d64625a6915cc1c59af69ba143456dbb59e0179276895e" }, - { - "name": "lips2", - "unicode": "1F5E2", - "digest": "c6ba915982ac47d8aaf14ad3605949df95588acfb4e147bf608f8c1714cdf19b" - }, { "name": "lipstick", "unicode": "1F484", "digest": "751dcb22706a796033b13a2ccb94304236ec13207ad4d011e02d230ae33ab5c1" }, + { + "name": "lizard", + "unicode": "1F98E", + "digest": "fb9191f9eab58b8403d4c4626ccbb14ba05c1f6944011751a8edcc4dd03c66e6" + }, { "name": "lock", "unicode": "1F512", @@ -6659,6 +6789,16 @@ "unicode": "1F505", "digest": "a065d00a416e297c168b0a675cafcf492fedf94865cb21801a1be5a3914593d4" }, + { + "name": "lying_face", + "unicode": "1F925", + "digest": "ce836170165e1b70938273f289c02c2106873cd9ab5472dbcd487c2f9f53f13d" + }, + { + "name": "liar", + "unicode": "1F925", + "digest": "ce836170165e1b70938273f289c02c2106873cd9ab5472dbcd487c2f9f53f13d" + }, { "name": "m", "unicode": "24C2", @@ -6704,6 +6844,121 @@ "unicode": "1F468", "digest": "42b882d2c6aa095f1afcf901203838d95c1908bdc725519779186b9c33c728d7" }, + { + "name": "man_dancing", + "unicode": "1F57A", + "digest": "9f632ee0c886d5f03c61e5f3a27668262c0cc2693b857a91c23c1e5ea3785b9e" + }, + { + "name": "male_dancer", + "unicode": "1F57A", + "digest": "9f632ee0c886d5f03c61e5f3a27668262c0cc2693b857a91c23c1e5ea3785b9e" + }, + { + "name": "man_dancing_tone1", + "unicode": "1F57A-1F3FB", + "digest": "6c56a16cb105bcdd97472645b3a351cebdbb1132cbfd18b0118f289db5fbe741" + }, + { + "name": "male_dancer_tone1", + "unicode": "1F57A-1F3FB", + "digest": "6c56a16cb105bcdd97472645b3a351cebdbb1132cbfd18b0118f289db5fbe741" + }, + { + "name": "man_dancing_tone2", + "unicode": "1F57A-1F3FC", + "digest": "ed7e78c14d205a03fdd5581e5213add69a55e13b4cbaf76a6d5a0d6c80f53327" + }, + { + "name": "male_dancer_tone2", + "unicode": "1F57A-1F3FC", + "digest": "ed7e78c14d205a03fdd5581e5213add69a55e13b4cbaf76a6d5a0d6c80f53327" + }, + { + "name": "man_dancing_tone3", + "unicode": "1F57A-1F3FD", + "digest": "13b45403e11800163406206eedeb8b579cc83eca2f60246be97e099164387bc8" + }, + { + "name": "male_dancer_tone3", + "unicode": "1F57A-1F3FD", + "digest": "13b45403e11800163406206eedeb8b579cc83eca2f60246be97e099164387bc8" + }, + { + "name": "man_dancing_tone4", + "unicode": "1F57A-1F3FE", + "digest": "f6feb1b0b83565fadcdd1a8737d3daa08893e919547d2a06de899160162d9c4a" + }, + { + "name": "male_dancer_tone4", + "unicode": "1F57A-1F3FE", + "digest": "f6feb1b0b83565fadcdd1a8737d3daa08893e919547d2a06de899160162d9c4a" + }, + { + "name": "man_dancing_tone5", + "unicode": "1F57A-1F3FF", + "digest": "fe20a9ed9ba991653b4d0683de347ed7c226a5d75610307584a2ddd6fcd1e3f2" + }, + { + "name": "male_dancer_tone5", + "unicode": "1F57A-1F3FF", + "digest": "fe20a9ed9ba991653b4d0683de347ed7c226a5d75610307584a2ddd6fcd1e3f2" + }, + { + "name": "man_in_tuxedo", + "unicode": "1F935", + "digest": "4d451a971dfefedc4830ba78e19b123f250e09ae65baddccdc56c0f8aa3a9b50" + }, + { + "name": "man_in_tuxedo_tone1", + "unicode": "1F935-1F3FB", + "digest": "2814833334fb211ae2ecb1fb5964e9752282d0fb4d7f3477de5dd2a4f812a793" + }, + { + "name": "tuxedo_tone1", + "unicode": "1F935-1F3FB", + "digest": "2814833334fb211ae2ecb1fb5964e9752282d0fb4d7f3477de5dd2a4f812a793" + }, + { + "name": "man_in_tuxedo_tone2", + "unicode": "1F935-1F3FC", + "digest": "cd1bab9ee0e2335d3cd99d51216cccdc4fc3c2cf20129b8b7e11a51a77258f68" + }, + { + "name": "tuxedo_tone2", + "unicode": "1F935-1F3FC", + "digest": "cd1bab9ee0e2335d3cd99d51216cccdc4fc3c2cf20129b8b7e11a51a77258f68" + }, + { + "name": "man_in_tuxedo_tone3", + "unicode": "1F935-1F3FD", + "digest": "f387775f925fe60b9f3e7cad63a55d4d196ddd41658029a70440d14c17cb99f9" + }, + { + "name": "tuxedo_tone3", + "unicode": "1F935-1F3FD", + "digest": "f387775f925fe60b9f3e7cad63a55d4d196ddd41658029a70440d14c17cb99f9" + }, + { + "name": "man_in_tuxedo_tone4", + "unicode": "1F935-1F3FE", + "digest": "08debd7a573d1201aee8a2f281ef7cb638d4a2a096222150391f36963f07c622" + }, + { + "name": "tuxedo_tone4", + "unicode": "1F935-1F3FE", + "digest": "08debd7a573d1201aee8a2f281ef7cb638d4a2a096222150391f36963f07c622" + }, + { + "name": "man_in_tuxedo_tone5", + "unicode": "1F935-1F3FF", + "digest": "e3b10e0619f0911cf9b665a265f4ef829b8f6ba6e9c3a021d0539a27e315f8fe" + }, + { + "name": "tuxedo_tone5", + "unicode": "1F935-1F3FF", + "digest": "e3b10e0619f0911cf9b665a265f4ef829b8f6ba6e9c3a021d0539a27e315f8fe" + }, { "name": "man_tone1", "unicode": "1F468-1F3FB", @@ -6809,6 +7064,16 @@ "unicode": "1F341", "digest": "72629a205e33f89337815ad7e51bb5c73947d1a9f98afe5072bdf4846827ae72" }, + { + "name": "martial_arts_uniform", + "unicode": "1F94B", + "digest": "a1ae797b31081425b388ab31efc635d8eb73a40980fd0fae4708aa5313e2a964" + }, + { + "name": "karate_uniform", + "unicode": "1F94B", + "digest": "a1ae797b31081425b388ab31efc635d8eb73a40980fd0fae4708aa5313e2a964" + }, { "name": "mask", "unicode": "1F637", @@ -7029,6 +7294,16 @@ "unicode": "1F396", "digest": "5da18351dc14b66cfc070148c83b7c8e67e6b1e3f515ae501133c38ee5c28d3d" }, + { + "name": "milk", + "unicode": "1F95B", + "digest": "38b28ea40399601fabc95bac5eaaf5a9e4e25548ec80325bd5069395ea884f85" + }, + { + "name": "glass_of_milk", + "unicode": "1F95B", + "digest": "38b28ea40399601fabc95bac5eaaf5a9e4e25548ec80325bd5069395ea884f85" + }, { "name": "milky_way", "unicode": "1F30C", @@ -7084,31 +7359,6 @@ "unicode": "1F69D", "digest": "2c9f185babcb4001fcef2b8dfc4a32126729843084d0076c3e3ccdc845ab23ad" }, - { - "name": "mood_bubble", - "unicode": "1F5F0", - "digest": "1df7061217e478d43ab9a87d4f351c4ca56705acd6b4e0b0bedfdece77635f1b" - }, - { - "name": "mood_bubble_lightning", - "unicode": "1F5F1", - "digest": "4af3e4e53eaa328b0d20542ab31705a74bf9fd368cd0673b706838ce1681d3c9" - }, - { - "name": "lightning_mood_bubble", - "unicode": "1F5F1", - "digest": "4af3e4e53eaa328b0d20542ab31705a74bf9fd368cd0673b706838ce1681d3c9" - }, - { - "name": "mood_lightning", - "unicode": "1F5F2", - "digest": "6784635e81ec722fd50a1c2a23b0f9679e4bf1b5ae2b5a01eeb995bc1f7a426f" - }, - { - "name": "lightning_mood", - "unicode": "1F5F2", - "digest": "6784635e81ec722fd50a1c2a23b0f9679e4bf1b5ae2b5a01eeb995bc1f7a426f" - }, { "name": "mortar_board", "unicode": "1F393", @@ -7119,6 +7369,16 @@ "unicode": "1F54C", "digest": "5f3d3de7feac953a70a318113531c2857d760a516c3d8d6f42d2a3b3b67ed196" }, + { + "name": "motor_scooter", + "unicode": "1F6F5", + "digest": "e2dc7c981744a71f46858bd0858ff91af704ac06425ed80377bc3b119e57c872" + }, + { + "name": "motorbike", + "unicode": "1F6F5", + "digest": "e2dc7c981744a71f46858bd0858ff91af704ac06425ed80377bc3b119e57c872" + }, { "name": "motorboat", "unicode": "1F6E5", @@ -7209,16 +7469,6 @@ "unicode": "1F401", "digest": "f3ed37b639b7c16aae49502bd423f9fdeabaf15bc6f0f74063954b189e176b5d" }, - { - "name": "mouse_one", - "unicode": "1F5AF", - "digest": "e0d2055ccba489d24e0c0b6d2f22793efe48a734b0fd50f5af88f721b40665c0" - }, - { - "name": "one_button_mouse", - "unicode": "1F5AF", - "digest": "e0d2055ccba489d24e0c0b6d2f22793efe48a734b0fd50f5af88f721b40665c0" - }, { "name": "mouse_three_button", "unicode": "1F5B1", @@ -7239,6 +7489,66 @@ "unicode": "1F5FF", "digest": "2c1d0662c95928936e6b9ab5a40c6110ff1cea5339f2803c7b63aabc76115afb" }, + { + "name": "mrs_claus", + "unicode": "1F936", + "digest": "1f72f586ca75bd7ebb4150cdcc8199a930c32fa4b81510cb8d200f1b3ddd4076" + }, + { + "name": "mother_christmas", + "unicode": "1F936", + "digest": "1f72f586ca75bd7ebb4150cdcc8199a930c32fa4b81510cb8d200f1b3ddd4076" + }, + { + "name": "mrs_claus_tone1", + "unicode": "1F936-1F3FB", + "digest": "244596919e0fed050203cf9e040899de323d7821235929f175852439927bd129" + }, + { + "name": "mother_christmas_tone1", + "unicode": "1F936-1F3FB", + "digest": "244596919e0fed050203cf9e040899de323d7821235929f175852439927bd129" + }, + { + "name": "mrs_claus_tone2", + "unicode": "1F936-1F3FC", + "digest": "8cde96e8521f3a90262a7f5f8a2989a9590d9a02cda2c37e92335dc05975c18d" + }, + { + "name": "mother_christmas_tone2", + "unicode": "1F936-1F3FC", + "digest": "8cde96e8521f3a90262a7f5f8a2989a9590d9a02cda2c37e92335dc05975c18d" + }, + { + "name": "mrs_claus_tone3", + "unicode": "1F936-1F3FD", + "digest": "c39cd4346d4581799dd0e9a6447c91a954a75747bf2682c8e4d79c3b0fcf7405" + }, + { + "name": "mother_christmas_tone3", + "unicode": "1F936-1F3FD", + "digest": "c39cd4346d4581799dd0e9a6447c91a954a75747bf2682c8e4d79c3b0fcf7405" + }, + { + "name": "mrs_claus_tone4", + "unicode": "1F936-1F3FE", + "digest": "84c85cf54559ea2d78d196fee96149a249af4f959b78e223a0ec4fb72abdbcab" + }, + { + "name": "mother_christmas_tone4", + "unicode": "1F936-1F3FE", + "digest": "84c85cf54559ea2d78d196fee96149a249af4f959b78e223a0ec4fb72abdbcab" + }, + { + "name": "mrs_claus_tone5", + "unicode": "1F936-1F3FF", + "digest": "ce26c0e0645713b17e7497d9f2d0484cc5477564dae99320cabf04d160d3b2ff" + }, + { + "name": "mother_christmas_tone5", + "unicode": "1F936-1F3FF", + "digest": "ce26c0e0645713b17e7497d9f2d0484cc5477564dae99320cabf04d160d3b2ff" + }, { "name": "muscle", "unicode": "1F4AA", @@ -7329,6 +7639,16 @@ "unicode": "1F4DB", "digest": "f9f6a4895ff0be8fb2ccc7ad195b94e9650f742f66ead999e90724cfb77af628" }, + { + "name": "nauseated_face", + "unicode": "1F922", + "digest": "f8471cf4720948d8246ec9d30e29783e819f90e3cfe8b1ba628671a1aad1a91c" + }, + { + "name": "sick", + "unicode": "1F922", + "digest": "f8471cf4720948d8246ec9d30e29783e819f90e3cfe8b1ba628671a1aad1a91c" + }, { "name": "necktie", "unicode": "1F454", @@ -7349,16 +7669,6 @@ "unicode": "1F913", "digest": "9e5f3c93db25cf1d0f9d6e6bd2993161afec6c30573ba3fe85e13b8c84483d66" }, - { - "name": "network", - "unicode": "1F5A7", - "digest": "1dbaa54deeb2328fd8a3f044e450c97ac3ff39627c598bb2f4312d677482ee06" - }, - { - "name": "three_networked_computers", - "unicode": "1F5A7", - "digest": "1dbaa54deeb2328fd8a3f044e450c97ac3ff39627c598bb2f4312d677482ee06" - }, { "name": "neutral_face", "unicode": "1F610", @@ -7514,26 +7824,6 @@ "unicode": "1F443-1F3FF", "digest": "1e0f9842e0f8ad5805eabd3f35a6038b7a2e49d566a1f5c17271f9cdf467ca60" }, - { - "name": "note", - "unicode": "1F5C9", - "digest": "073660fdaa02ecf98d04f61f8d65d6cc447ccae3825fccaff19a2c99ebba52af" - }, - { - "name": "note_page", - "unicode": "1F5C9", - "digest": "073660fdaa02ecf98d04f61f8d65d6cc447ccae3825fccaff19a2c99ebba52af" - }, - { - "name": "note_empty", - "unicode": "1F5C6", - "digest": "06b56eeaca6349bbcf1020bea98f937450a7e086db65cd5d7497748e0fb607be" - }, - { - "name": "empty_note_page", - "unicode": "1F5C6", - "digest": "06b56eeaca6349bbcf1020bea98f937450a7e086db65cd5d7497748e0fb607be" - }, { "name": "notebook", "unicode": "1F4D3", @@ -7544,26 +7834,6 @@ "unicode": "1F4D4", "digest": "d822eda4b49cbfa399b36f134c1a0b8dcfdd27ed89f12c50bc18f6f0a9aa56ef" }, - { - "name": "notepad", - "unicode": "1F5CA", - "digest": "85069e2d13540886457368a57295072aec44c7137d9223bfcf908ce1f0e5124e" - }, - { - "name": "note_pad", - "unicode": "1F5CA", - "digest": "85069e2d13540886457368a57295072aec44c7137d9223bfcf908ce1f0e5124e" - }, - { - "name": "notepad_empty", - "unicode": "1F5C7", - "digest": "8be5053e74c13d8220917c5aee1f4afdecb001612886438f283b0c2a0fecf6af" - }, - { - "name": "empty_note_pad", - "unicode": "1F5C7", - "digest": "8be5053e74c13d8220917c5aee1f4afdecb001612886438f283b0c2a0fecf6af" - }, { "name": "notepad_spiral", "unicode": "1F5D2", @@ -7599,6 +7869,16 @@ "unicode": "1F30A", "digest": "1a9ca9848d4fb75852addfc10bf84eccf7caa5339714b90e3de4cb6f2518465e" }, + { + "name": "octagonal_sign", + "unicode": "1F6D1", + "digest": "9f6927048e1f9da57f89d1ae1eb86fa4ab7abdbabca756a738a799e948d0b3f9" + }, + { + "name": "stop_sign", + "unicode": "1F6D1", + "digest": "9f6927048e1f9da57f89d1ae1eb86fa4ab7abdbabca756a738a799e948d0b3f9" + }, { "name": "octopus", "unicode": "1F419", @@ -7859,16 +8139,6 @@ "unicode": "26CE", "digest": "6112e2a1656b1cb8bd9a8b0dfa6cbf66d30cae671710a9ef75c821de344aab2b" }, - { - "name": "optical_disk", - "unicode": "1F5B8", - "digest": "df8c10028d29d65f144a6b789d1c3294e7b3293554c4c30d28d72dc7ba8d9a5d" - }, - { - "name": "optical_disc_icon", - "unicode": "1F5B8", - "digest": "df8c10028d29d65f144a6b789d1c3294e7b3293554c4c30d28d72dc7ba8d9a5d" - }, { "name": "orange_book", "unicode": "1F4D9", @@ -7884,6 +8154,11 @@ "unicode": "1F4E4", "digest": "e47cb481a0ffcb39996f32fd313e19b362a91d8dda15ffca48ac23a3b5bb5baf" }, + { + "name": "owl", + "unicode": "1F989", + "digest": "f62ec1ad23ad9038966eea8d8b79660ac212f291af2e89bcdb0fdc683caf41e5" + }, { "name": "ox", "unicode": "1F402", @@ -7894,11 +8169,6 @@ "unicode": "1F4E6", "digest": "e82bf5accebb65136e897c15607eef635fb79fd7b2d8c8e19a9eb00b6786918c" }, - { - "name": "page", - "unicode": "1F5CF", - "digest": "cc745056525f59d9128d1d03b14770376bb09ab64b8ef4ac994ab7f38efd4783" - }, { "name": "page_facing_up", "unicode": "1F4C4", @@ -7914,11 +8184,6 @@ "unicode": "1F4DF", "digest": "e21c756cc1c58ebc1b37ebcd38e22a25b31e2e81306c6f18285d6a7671f9eb12" }, - { - "name": "pages", - "unicode": "1F5D0", - "digest": "05bd47b78f089389356d9d839c736843f56b959ab4277056606ffcbb013390bc" - }, { "name": "paintbrush", "unicode": "1F58C", @@ -7934,6 +8199,11 @@ "unicode": "1F334", "digest": "90fedafd62fe0abf51325174d0f293ebb9a4794913b9ba93b12f2d0119056df1" }, + { + "name": "pancakes", + "unicode": "1F95E", + "digest": "5256b4832431e8a88555796b1a9726f12d909a26fb2bdc3a0abff76412c45903" + }, { "name": "panda_face", "unicode": "1F43C", @@ -8009,6 +8279,16 @@ "unicode": "1F351", "digest": "768d1f4f29e1e06aff5abb29043be83087ded16427ce6a2d0f682814e665e311" }, + { + "name": "peanuts", + "unicode": "1F95C", + "digest": "e2384846b6e4a6c3a56e991ebb749cb68b330ac00a9e9d888b2c39105ff7ff5d" + }, + { + "name": "shelled_peanut", + "unicode": "1F95C", + "digest": "e2384846b6e4a6c3a56e991ebb749cb68b330ac00a9e9d888b2c39105ff7ff5d" + }, { "name": "pear", "unicode": "1F350", @@ -8049,41 +8329,11 @@ "unicode": "270F", "digest": "9ca1b56b5726f472b1f1b23050ed163e213916dac379d22e38e4c8358fe871e0" }, - { - "name": "pencil3", - "unicode": "1F589", - "digest": "52c1ba1228917eb491ac1745a495e0fdafba6b985a81caba250f71d1f94c725c" - }, - { - "name": "lower_left_pencil", - "unicode": "1F589", - "digest": "52c1ba1228917eb491ac1745a495e0fdafba6b985a81caba250f71d1f94c725c" - }, { "name": "penguin", "unicode": "1F427", "digest": "a1800ab931d6dc84a9c89bfab2c815198025c276d952509c55b18dd20bd9d316" }, - { - "name": "pennant_black", - "unicode": "1F3F2", - "digest": "cd3c33bfc3c7fbe84b98d2d481d56a7bf5488ff94afadd8b5a0e454768b80269" - }, - { - "name": "black_pennant", - "unicode": "1F3F2", - "digest": "cd3c33bfc3c7fbe84b98d2d481d56a7bf5488ff94afadd8b5a0e454768b80269" - }, - { - "name": "pennant_white", - "unicode": "1F3F1", - "digest": "818b1be73540f2cfeb1c514e1ee75d18715af317f0db817d9ae081b9ea33d4b0" - }, - { - "name": "white_pennant", - "unicode": "1F3F1", - "digest": "818b1be73540f2cfeb1c514e1ee75d18715af317f0db817d9ae081b9ea33d4b0" - }, { "name": "pensive", "unicode": "1F614", @@ -8226,18 +8476,8 @@ }, { "name": "table_tennis", - "unicode": "1F3D3", - "digest": "943a858bd054c81a08a08951f8351c27c8009b85a9359729c7362868298b58e1" - }, - { - "name": "piracy", - "unicode": "1F572", - "digest": "f42955ba75c598392e5e258be49968d858c876e0d6e7aa9dc795f7e8cff42be9" - }, - { - "name": "no_piracy", - "unicode": "1F572", - "digest": "f42955ba75c598392e5e258be49968d858c876e0d6e7aa9dc795f7e8cff42be9" + "unicode": "1F3D3", + "digest": "943a858bd054c81a08a08951f8351c27c8009b85a9359729c7362868298b58e1" }, { "name": "pisces", @@ -8469,6 +8709,11 @@ "unicode": "1F6B0", "digest": "dbe80d9637837377cc2a290da2e895f81a3108cc18b049e3d87212402c1c2098" }, + { + "name": "potato", + "unicode": "1F954", + "digest": "a56a69f36f3a0793f278726d92c0cea2960554f3062ef1a0904526a04511d8e1" + }, { "name": "pouch", "unicode": "1F45D", @@ -8524,6 +8769,96 @@ "unicode": "1F4FF", "digest": "80177091264430cbcf7c994fbe5ee17319d1a58d933636cc752a54dafcf98a05" }, + { + "name": "pregnant_woman", + "unicode": "1F930", + "digest": "49abb86409103338bdb6ae43c13a78ca2dc9cd158a26df35eadd0da3c84a4352" + }, + { + "name": "expecting_woman", + "unicode": "1F930", + "digest": "49abb86409103338bdb6ae43c13a78ca2dc9cd158a26df35eadd0da3c84a4352" + }, + { + "name": "pregnant_woman_tone1", + "unicode": "1F930-1F3FB", + "digest": "5a9f8ed2b631ecf8af111803a5c11f4c156435a5293cb50329c7b98697c8da25" + }, + { + "name": "expecting_woman_tone1", + "unicode": "1F930-1F3FB", + "digest": "5a9f8ed2b631ecf8af111803a5c11f4c156435a5293cb50329c7b98697c8da25" + }, + { + "name": "pregnant_woman_tone2", + "unicode": "1F930-1F3FC", + "digest": "279a2eafff603b11629c955b05f5bd3d7da9a271d4fb3f02e9ccd457b8d2d815" + }, + { + "name": "expecting_woman_tone2", + "unicode": "1F930-1F3FC", + "digest": "279a2eafff603b11629c955b05f5bd3d7da9a271d4fb3f02e9ccd457b8d2d815" + }, + { + "name": "pregnant_woman_tone3", + "unicode": "1F930-1F3FD", + "digest": "93bb63ec2312db315e3f0065520b715cc413ac0fd65538ec9b5cd97df2a42b20" + }, + { + "name": "expecting_woman_tone3", + "unicode": "1F930-1F3FD", + "digest": "93bb63ec2312db315e3f0065520b715cc413ac0fd65538ec9b5cd97df2a42b20" + }, + { + "name": "pregnant_woman_tone4", + "unicode": "1F930-1F3FE", + "digest": "b8dc3dcec894bfd832a249459b10850f8786b6778d8887a677d1291865623da2" + }, + { + "name": "expecting_woman_tone4", + "unicode": "1F930-1F3FE", + "digest": "b8dc3dcec894bfd832a249459b10850f8786b6778d8887a677d1291865623da2" + }, + { + "name": "pregnant_woman_tone5", + "unicode": "1F930-1F3FF", + "digest": "73ee432752f81980f353a7f9b9f7a5ece62512dca08e15c1876b89227face21c" + }, + { + "name": "expecting_woman_tone5", + "unicode": "1F930-1F3FF", + "digest": "73ee432752f81980f353a7f9b9f7a5ece62512dca08e15c1876b89227face21c" + }, + { + "name": "prince", + "unicode": "1F934", + "digest": "34a0e0625f0a9825d3674192d6233b6cae4d8130451293df09f91a6a4165869c" + }, + { + "name": "prince_tone1", + "unicode": "1F934-1F3FB", + "digest": "ccecdfeccb2ab1fceceae14f3fba875c8c7099785a4c40131c08a697b5b675fc" + }, + { + "name": "prince_tone2", + "unicode": "1F934-1F3FC", + "digest": "c373fd3e0c1798415e3d8d88fab6c98c1bbdedcbe6f52f3a3899f6e2124a768d" + }, + { + "name": "prince_tone3", + "unicode": "1F934-1F3FD", + "digest": "71d15695ca954d55aa69d3c753c7d31a8ba5329713a8ddbc90dafc11e524c4ef" + }, + { + "name": "prince_tone4", + "unicode": "1F934-1F3FE", + "digest": "08f6cb32424f15cc3aaf83c31a5dac7c01a6be2f37ea8f13aed579ce6fb4db19" + }, + { + "name": "prince_tone5", + "unicode": "1F934-1F3FF", + "digest": "77d521148efa33fa4d3409693d050fecfd948411e807327484f174e289834649" + }, { "name": "princess", "unicode": "1F478", @@ -8559,16 +8894,6 @@ "unicode": "1F5A8", "digest": "5e5307e3dc7ec4e16c9978fb00934c99c4adefca7d32732a244d1f2de71ce6f8" }, - { - "name": "prohibited", - "unicode": "1F6C7", - "digest": "bc6cdea2269a0ec39576d98dc4cda2bd9efa4dc330dde870148c6a85ad9cc63f" - }, - { - "name": "prohibited_sign", - "unicode": "1F6C7", - "digest": "bc6cdea2269a0ec39576d98dc4cda2bd9efa4dc330dde870148c6a85ad9cc63f" - }, { "name": "projector", "unicode": "1F4FD", @@ -8624,11 +8949,6 @@ "unicode": "1F4CC", "digest": "c3f7d7008be6bab8dc02284d4d759abf7aafbb3dbbe3a53f0f5b2ff685af88f8" }, - { - "name": "pushpin_black", - "unicode": "1F588", - "digest": "80ebac74edb9e8e1f8a219b32a676d318ed73b359cd8193b91b493d775307f63" - }, { "name": "put_litter_in_its_place", "unicode": "1F6AE", @@ -8709,6 +9029,66 @@ "unicode": "1F308", "digest": "a93aceb54e965f35e397e8c8716b1831614933308d026012d5464ee42783ed4d" }, + { + "name": "raised_back_of_hand", + "unicode": "1F91A", + "digest": "20973a697e826625deba5ee3c4f25eb5e1737f2e860ac6fe4ee4d0e0c84b5e12" + }, + { + "name": "back_of_hand", + "unicode": "1F91A", + "digest": "20973a697e826625deba5ee3c4f25eb5e1737f2e860ac6fe4ee4d0e0c84b5e12" + }, + { + "name": "raised_back_of_hand_tone1", + "unicode": "1F91A-1F3FB", + "digest": "06af5941255ca69d10d99d0a512bbda6141a296453835dbccf259ce0afe1dd3d" + }, + { + "name": "back_of_hand_tone1", + "unicode": "1F91A-1F3FB", + "digest": "06af5941255ca69d10d99d0a512bbda6141a296453835dbccf259ce0afe1dd3d" + }, + { + "name": "raised_back_of_hand_tone2", + "unicode": "1F91A-1F3FC", + "digest": "429ed19555c9e5197b729b3e7bd8013346551051cb0b3fbc8a4372717c9a027d" + }, + { + "name": "back_of_hand_tone2", + "unicode": "1F91A-1F3FC", + "digest": "429ed19555c9e5197b729b3e7bd8013346551051cb0b3fbc8a4372717c9a027d" + }, + { + "name": "raised_back_of_hand_tone3", + "unicode": "1F91A-1F3FD", + "digest": "487a1c3f19e77c99b520ec073de2acc4a9e585b739a84b3989f7de85d2c2045c" + }, + { + "name": "back_of_hand_tone3", + "unicode": "1F91A-1F3FD", + "digest": "487a1c3f19e77c99b520ec073de2acc4a9e585b739a84b3989f7de85d2c2045c" + }, + { + "name": "raised_back_of_hand_tone4", + "unicode": "1F91A-1F3FE", + "digest": "154254d8500c55ec3de698be4a352f9bcf06e2950cabc4eabaccad0f39a1e1e9" + }, + { + "name": "back_of_hand_tone4", + "unicode": "1F91A-1F3FE", + "digest": "154254d8500c55ec3de698be4a352f9bcf06e2950cabc4eabaccad0f39a1e1e9" + }, + { + "name": "raised_back_of_hand_tone5", + "unicode": "1F91A-1F3FF", + "digest": "6e9c0855ecd5f14adca5e5862427c3d39ffcf86f7ddd3aaa1fefc3cefc7483c8" + }, + { + "name": "back_of_hand_tone5", + "unicode": "1F91A-1F3FF", + "digest": "6e9c0855ecd5f14adca5e5862427c3d39ffcf86f7ddd3aaa1fefc3cefc7483c8" + }, { "name": "raised_hand", "unicode": "270B", @@ -8879,6 +9259,16 @@ "unicode": "23EA", "digest": "d20c918c1e528ff0947312738501ca9a6fb6ff4016aad07db7a8125d00fd65cd" }, + { + "name": "rhino", + "unicode": "1F98F", + "digest": "163fa3acd78eead72c431a1f48b8465a6d45272a9169560e456d30b4df93dc6b" + }, + { + "name": "rhinoceros", + "unicode": "1F98F", + "digest": "163fa3acd78eead72c431a1f48b8465a6d45272a9169560e456d30b4df93dc6b" + }, { "name": "ribbon", "unicode": "1F380", @@ -8905,40 +9295,70 @@ "digest": "b942a06d3da0570aca59bab0af57cd8c16863934f12a38f70339fd0a36f675f5" }, { - "name": "right_speaker", - "unicode": "1F568", - "digest": "d268bb84be863c0884620dfc6d2a764b0c7466d2f9810549b138e21ac70add4e" + "name": "right_facing_fist", + "unicode": "1F91C", + "digest": "f815d1cc0c0345ddcc8886ae9c133582d7dc779732ac9b93dde1ab4fdd3b251d" + }, + { + "name": "right_fist", + "unicode": "1F91C", + "digest": "f815d1cc0c0345ddcc8886ae9c133582d7dc779732ac9b93dde1ab4fdd3b251d" + }, + { + "name": "right_facing_fist_tone1", + "unicode": "1F91C-1F3FB", + "digest": "0f9269b70cf68071d97389e059a2bdacffd73f2afd2ce6cfd7447bb1a4e9abbb" + }, + { + "name": "right_fist_tone1", + "unicode": "1F91C-1F3FB", + "digest": "0f9269b70cf68071d97389e059a2bdacffd73f2afd2ce6cfd7447bb1a4e9abbb" }, { - "name": "right_speaker_one", - "unicode": "1F569", - "digest": "5b92daa87bdf6ee15e798bec382a2ee885f4e6e77a68a3f626adcfe4c782b375" + "name": "right_facing_fist_tone2", + "unicode": "1F91C-1F3FC", + "digest": "32a9833db853972e49e65aa227fb0512c57362da190aa1cc40e1d64f238e837e" }, { - "name": "right_speaker_with_one_sound_wave", - "unicode": "1F569", - "digest": "5b92daa87bdf6ee15e798bec382a2ee885f4e6e77a68a3f626adcfe4c782b375" + "name": "right_fist_tone2", + "unicode": "1F91C-1F3FC", + "digest": "32a9833db853972e49e65aa227fb0512c57362da190aa1cc40e1d64f238e837e" }, { - "name": "right_speaker_three", - "unicode": "1F56A", - "digest": "4d00b720a65bd0f4c3682b290b1976ec2388d6ae61225398f4e70556ae9e5f80" + "name": "right_facing_fist_tone3", + "unicode": "1F91C-1F3FD", + "digest": "be4706f8bb088411f5cbbf9065a0ae5b773c97456bd975c2b6789765657847b9" }, { - "name": "right_speaker_with_three_sound_waves", - "unicode": "1F56A", - "digest": "4d00b720a65bd0f4c3682b290b1976ec2388d6ae61225398f4e70556ae9e5f80" + "name": "right_fist_tone3", + "unicode": "1F91C-1F3FD", + "digest": "be4706f8bb088411f5cbbf9065a0ae5b773c97456bd975c2b6789765657847b9" + }, + { + "name": "right_facing_fist_tone4", + "unicode": "1F91C-1F3FE", + "digest": "1680862891a9d85c4b6f76232a80e2ef7428bcec93087c86eae2efaba9c6a3f7" + }, + { + "name": "right_fist_tone4", + "unicode": "1F91C-1F3FE", + "digest": "1680862891a9d85c4b6f76232a80e2ef7428bcec93087c86eae2efaba9c6a3f7" + }, + { + "name": "right_facing_fist_tone5", + "unicode": "1F91C-1F3FF", + "digest": "388715a4bc2178c52bbb3bc2729f57be50acab5d751784c9f3220e86c6b1fbcc" + }, + { + "name": "right_fist_tone5", + "unicode": "1F91C-1F3FF", + "digest": "388715a4bc2178c52bbb3bc2729f57be50acab5d751784c9f3220e86c6b1fbcc" }, { "name": "ring", "unicode": "1F48D", "digest": "b5322907222797b5e1786209cda88513e76cd397a40f0a7da24847245c95ef9d" }, - { - "name": "ringing_bell", - "unicode": "1F56D", - "digest": "d71ab7fa937fc4af507b5b07ea58a4f31e875d9e8304ef2b850d7cebe0e9cd66" - }, { "name": "robot", "unicode": "1F916", @@ -8954,6 +9374,16 @@ "unicode": "1F680", "digest": "b82e68a95aa89a6de344d6e256fef86a848ebc91de560b043b3e1f7fd072d57d" }, + { + "name": "rofl", + "unicode": "1F923", + "digest": "f4f99ba2ac67b97338f904f9384ff03fb832a2e427bf6e74611bf5fee45f1f48" + }, + { + "name": "rolling_on_the_floor_laughing", + "unicode": "1F923", + "digest": "f4f99ba2ac67b97338f904f9384ff03fb832a2e427bf6e74611bf5fee45f1f48" + }, { "name": "roller_coaster", "unicode": "1F3A2", @@ -8984,11 +9414,6 @@ "unicode": "1F3F5", "digest": "2537def4deef422d4e669b28b1a0675259306ab38601019df3ec3482b14e52d5" }, - { - "name": "rosette_black", - "unicode": "1F3F6", - "digest": "ae8675891c88f9d98463d35178445950c39b0deb0f0e8b3f341228a6e0d0e477" - }, { "name": "rotating_light", "unicode": "1F6A8", @@ -9089,6 +9514,16 @@ "unicode": "1F376", "digest": "0a786075f3d9da48ae91afccf6ae0d097888da9509d354ee1d3cb99afcc88fe4" }, + { + "name": "salad", + "unicode": "1F957", + "digest": "fe321487ab847abe670e68a83f1d9e096129741c689c769ee7de4a65aeac29f8" + }, + { + "name": "green_salad", + "unicode": "1F957", + "digest": "fe321487ab847abe670e68a83f1d9e096129741c689c769ee7de4a65aeac29f8" + }, { "name": "sandal", "unicode": "1F461", @@ -9159,6 +9594,11 @@ "unicode": "2702", "digest": "95225be28f05d8b5a6b6e6bf58d973f61f183ad4fef55a558dc1b810796b85c8" }, + { + "name": "scooter", + "unicode": "1F6F4", + "digest": "4a7db148880398db75e059711cb53edefb6b8fa9d442009f52856b887ab1dde4" + }, { "name": "scorpion", "unicode": "1F982", @@ -9189,6 +9629,16 @@ "unicode": "1F4BA", "digest": "ae68d86fc2a07cae332451b23bd1ceba3f6526a6c56d8c1089777fa4632850e1" }, + { + "name": "second_place", + "unicode": "1F948", + "digest": "9e2336fc16e532829b55380252f94655b58817d47c909fc2570002c5b06b9c40" + }, + { + "name": "second_place_medal", + "unicode": "1F948", + "digest": "9e2336fc16e532829b55380252f94655b58817d47c909fc2570002c5b06b9c40" + }, { "name": "secret", "unicode": "3299", @@ -9204,16 +9654,61 @@ "unicode": "1F331", "digest": "c0ec5e6d20e1afdc4e78eeddb1301c8b708ad6278e7287a4e4e825417c858e75" }, + { + "name": "selfie", + "unicode": "1F933", + "digest": "2a1bc9f18ad4d6fb893d91c88ef1b2d9bd063dc2bb1a4b08c248c30f52545d4e" + }, + { + "name": "selfie_tone1", + "unicode": "1F933-1F3FB", + "digest": "26dc212ffed30c276bd6a66a72bc4513e68098a2205fb4ca5b51ccfa1de5b544" + }, + { + "name": "selfie_tone2", + "unicode": "1F933-1F3FC", + "digest": "71eceaefda46e3521f374f76693e7fa8f215067498067900080e2925ca94d7de" + }, + { + "name": "selfie_tone3", + "unicode": "1F933-1F3FD", + "digest": "53eabbd4f6b8ebbd2f7af7bf5cd64309c4039ac1c5b2180290a547deaafcebdf" + }, + { + "name": "selfie_tone4", + "unicode": "1F933-1F3FE", + "digest": "0baad378b09652b99c5d458db2e03b4db14a1557db4ea0969806a0ca1d33d40c" + }, + { + "name": "selfie_tone5", + "unicode": "1F933-1F3FF", + "digest": "9a07608f34ec4dad48764a855f83f3965709d7b2fd2342e6dc9ed61f23f4adfd" + }, { "name": "seven", "unicode": "0037-20E3", "digest": "ae85172d2c76c44afb4e3b45d277d400abb2dc895244b9abfbd1dac1cd7c53c2" }, + { + "name": "shallow_pan_of_food", + "unicode": "1F958", + "digest": "7c7ad9d5d3f7226427d310b5853e8257fad899febe58dcbc5adb4677964f5c6d" + }, + { + "name": "paella", + "unicode": "1F958", + "digest": "7c7ad9d5d3f7226427d310b5853e8257fad899febe58dcbc5adb4677964f5c6d" + }, { "name": "shamrock", "unicode": "2618", "digest": "68ed70c26e04a818439a1742d2da6bc169edd02db86b6e6f8014b651f3235488" }, + { + "name": "shark", + "unicode": "1F988", + "digest": "23a2364b6356e7bbb84c138e9cf58e2c68cd8caabb337a0c4d365ce87bf5d2da" + }, { "name": "shaved_ice", "unicode": "1F367", @@ -9254,11 +9749,56 @@ "unicode": "1F6CD", "digest": "95a3f03c675207bb1354270d02a630c204455c47b3edca23c48523a40cf3ea3b" }, + { + "name": "shopping_cart", + "unicode": "1F6D2", + "digest": "4599b63f6861cdb4d8272cac84435c24c1d4d6a73c66d51e04a1cd14a1d333e6" + }, + { + "name": "shopping_trolley", + "unicode": "1F6D2", + "digest": "4599b63f6861cdb4d8272cac84435c24c1d4d6a73c66d51e04a1cd14a1d333e6" + }, { "name": "shower", "unicode": "1F6BF", "digest": "6b3c767c0eb472d4861c6c3cc2735a5e2c09681872ef42a11dc89f3c80b9da01" }, + { + "name": "shrimp", + "unicode": "1F990", + "digest": "b3651f3be3767125076a013fe903854f5b456a8afae865cb219cf528e0f44caa" + }, + { + "name": "shrug", + "unicode": "1F937", + "digest": "6e264243cc3b6e396069dea4357a958bdcd4081cb1af0ed6aa47235bef88cf27" + }, + { + "name": "shrug_tone1", + "unicode": "1F937-1F3FB", + "digest": "0567b9fd95c8a857914003a5465a500ca79c8111811d45b865021b1b1d92d0b1" + }, + { + "name": "shrug_tone2", + "unicode": "1F937-1F3FC", + "digest": "1557c2f5e3d4599c806d74c0b78afcca940678787534b6862bb89a20601bac8a" + }, + { + "name": "shrug_tone3", + "unicode": "1F937-1F3FD", + "digest": "f02754541a7bf74ba7eebe6c27daf1e3e1dac25172c35b8ba45641e278dfda3d" + }, + { + "name": "shrug_tone4", + "unicode": "1F937-1F3FE", + "digest": "2b5121164cb5f4e253d8fb31f6445cf8afaf30dba41732edc511440cdb78d15c" + }, + { + "name": "shrug_tone5", + "unicode": "1F937-1F3FF", + "digest": "62d99a26bbad479f574f66208c41b9960cd41fb9d79d3a13fbdaa44682077115" + }, { "name": "signal_strength", "unicode": "1F4F6", @@ -9414,6 +9954,16 @@ "unicode": "1F40D", "digest": "18da2d97c771149ef5454dd23470e900903a62ab93f9e2ce301aad5a8181d773" }, + { + "name": "sneezing_face", + "unicode": "1F927", + "digest": "c20ef571dc7e35572fe3c18b7845aefc89af083ea925c48a29de3b7387af6e17" + }, + { + "name": "sneeze", + "unicode": "1F927", + "digest": "c20ef571dc7e35572fe3c18b7845aefc89af083ea925c48a29de3b7387af6e17" + }, { "name": "snowboarder", "unicode": "1F3C2", @@ -9519,46 +10069,6 @@ "unicode": "1F4AC", "digest": "817100d9979456e7d2f253ac22e13b7a2302dc1590566214915b003e403c53ca" }, - { - "name": "speech_left", - "unicode": "1F5E8", - "digest": "912797107d574f5665411498b6e349dbdec69846f085b6dc356548c4155e90b0" - }, - { - "name": "left_speech_bubble", - "unicode": "1F5E8", - "digest": "912797107d574f5665411498b6e349dbdec69846f085b6dc356548c4155e90b0" - }, - { - "name": "speech_right", - "unicode": "1F5E9", - "digest": "8439b13779163c15e678a78b08ebeeb7d131632df21d2a7868de7fed38ca9d8a" - }, - { - "name": "right_speech_bubble", - "unicode": "1F5E9", - "digest": "8439b13779163c15e678a78b08ebeeb7d131632df21d2a7868de7fed38ca9d8a" - }, - { - "name": "speech_three", - "unicode": "1F5EB", - "digest": "55a934f3659b6e75fdce0d0c4e2ea56dd34a43892c85a6666bd1882a0bfb92a9" - }, - { - "name": "three_speech_bubbles", - "unicode": "1F5EB", - "digest": "55a934f3659b6e75fdce0d0c4e2ea56dd34a43892c85a6666bd1882a0bfb92a9" - }, - { - "name": "speech_two", - "unicode": "1F5EA", - "digest": "0563ef0591da243673cf877462acc5d8e1d980a56e81668ac627de74d0c33983" - }, - { - "name": "two_speech_bubbles", - "unicode": "1F5EA", - "digest": "0563ef0591da243673cf877462acc5d8e1d980a56e81668ac627de74d0c33983" - }, { "name": "speedboat", "unicode": "1F6A4", @@ -9574,6 +10084,11 @@ "unicode": "1F578", "digest": "2434bdfbe56dcc4a43699dd59b638af431486b52fb1d6d685451f3b231b2be23" }, + { + "name": "spoon", + "unicode": "1F944", + "digest": "4fa31d59e5bffd2c45a8e01fcd5652e78a5691cbfa744e69882bc67173ddea05" + }, { "name": "spy", "unicode": "1F575", @@ -9634,6 +10149,11 @@ "unicode": "1F575-1F3FF", "digest": "ffc6fefd9a537124ebf0a9ddf387414dce1291335026064644f6cf9315591129" }, + { + "name": "squid", + "unicode": "1F991", + "digest": "65a1b318c2c506b9d26cfd8282a5cf9922109595c8d12e92c3f7481ac7c08c49" + }, { "name": "stadium", "unicode": "1F3DF", @@ -9679,26 +10199,11 @@ "unicode": "1F682", "digest": "52ad0073f37b978faf3884fb193046f2b0614e1557bbcc9de1b020e42aff2dba" }, - { - "name": "stereo", - "unicode": "1F4FE", - "digest": "1ce1f9a83867514b8351ad4fd80c46bba04ad67dfb9874e63d7296e1a21161a5" - }, - { - "name": "portable_stereo", - "unicode": "1F4FE", - "digest": "1ce1f9a83867514b8351ad4fd80c46bba04ad67dfb9874e63d7296e1a21161a5" - }, { "name": "stew", "unicode": "1F372", "digest": "c16f61236db314ad8d9f2dd241ec1e15c8d64e5872cce93ec4d0996490dd39df" }, - { - "name": "stock_chart", - "unicode": "1F5E0", - "digest": "4a0fbf54d19b0b5626f91c932a24e6ac12a65b4fc276d852ff4356c8c579d28a" - }, { "name": "stop_button", "unicode": "23F9", @@ -9734,6 +10239,16 @@ "unicode": "1F61C", "digest": "dbacd6428a2a2933212e6a4dc0c7f302177fb23b963626ccb26f27f91737f03d" }, + { + "name": "stuffed_flatbread", + "unicode": "1F959", + "digest": "9f841f2520640d69be4f20a3199023d5811842b28556b5e1152e5ec11f0fda07" + }, + { + "name": "stuffed_pita", + "unicode": "1F959", + "digest": "9f841f2520640d69be4f20a3199023d5811842b28556b5e1152e5ec11f0fda07" + }, { "name": "sun_with_face", "unicode": "1F31E", @@ -9909,31 +10424,11 @@ "unicode": "260E", "digest": "3a53851e641f8ad938ce3597b1afca2ea63c9314ff81f62563b99937496a13d7" }, - { - "name": "telephone_black", - "unicode": "1F57F", - "digest": "c3a42a653a91d90c6b668f678419d5438f2e546050914b841623e57107e805db" - }, - { - "name": "black_touchtone_telephone", - "unicode": "1F57F", - "digest": "c3a42a653a91d90c6b668f678419d5438f2e546050914b841623e57107e805db" - }, { "name": "telephone_receiver", "unicode": "1F4DE", "digest": "1614d67f3d8814b0d75f39d55f9149e4d28ef57b343498625e62fcfff8365046" }, - { - "name": "telephone_white", - "unicode": "1F57E", - "digest": "62a7e0e50c53e9f85eba51a92882e6064be05997910d3f7700e1e957dbaf0581" - }, - { - "name": "white_touchtone_telephone", - "unicode": "1F57E", - "digest": "62a7e0e50c53e9f85eba51a92882e6064be05997910d3f7700e1e957dbaf0581" - }, { "name": "telescope", "unicode": "1F52D", @@ -9980,55 +10475,25 @@ "digest": "4f0b84e5ab8a650cafb166e93688f0e9b31b9ade22a91035261ac90490edb9d3" }, { - "name": "thought_balloon", - "unicode": "1F4AD", - "digest": "bf59624560c333561d636aedf2c8827089e275895cf434974daaabb3d5cea46e" - }, - { - "name": "thought_left", - "unicode": "1F5EC", - "digest": "4fd591bf4318df73d1b17f434a449d8e95f49cca53a3d8f4d1ca983f3809ef46" - }, - { - "name": "left_thought_bubble", - "unicode": "1F5EC", - "digest": "4fd591bf4318df73d1b17f434a449d8e95f49cca53a3d8f4d1ca983f3809ef46" + "name": "third_place", + "unicode": "1F949", + "digest": "27c9bcba44ad95bee30882cc0722e8b0a798206306655dd648e884447ed26808" }, { - "name": "thought_right", - "unicode": "1F5ED", - "digest": "0e8c0ce26e2d0e30894f5394b0736456e8268f775e0e7eda4c7dc3c2ff9231ae" + "name": "third_place_medal", + "unicode": "1F949", + "digest": "27c9bcba44ad95bee30882cc0722e8b0a798206306655dd648e884447ed26808" }, { - "name": "right_thought_bubble", - "unicode": "1F5ED", - "digest": "0e8c0ce26e2d0e30894f5394b0736456e8268f775e0e7eda4c7dc3c2ff9231ae" + "name": "thought_balloon", + "unicode": "1F4AD", + "digest": "bf59624560c333561d636aedf2c8827089e275895cf434974daaabb3d5cea46e" }, { "name": "three", "unicode": "0033-20E3", "digest": "d3f85828787799c769655c38a519cad0743ab799ab276c7606e6e6894cc442e6" }, - { - "name": "thumbs_down_reverse", - "unicode": "1F593", - "digest": "a8b561e389bc4e4b07fba70994f6445e5ddc6afe68922fcb6e9e7282d19ad958" - }, - { - "name": "reversed_thumbs_down_sign", - "unicode": "1F593", - "digest": "a8b561e389bc4e4b07fba70994f6445e5ddc6afe68922fcb6e9e7282d19ad958" - }, - { - "name": "thumbs_up_reverse", - "unicode": "1F592", - "digest": "b6e52715c5ce590bfd08f6e05058ec3765ea2da341b11f9825d100608b173837" - }, - { - "name": "reversed_thumbs_up_sign", - "unicode": "1F592", - "digest": "b6e52715c5ce590bfd08f6e05058ec3765ea2da341b11f9825d100608b173837" - }, { "name": "thumbsdown", "unicode": "1F44E", @@ -10314,31 +10779,11 @@ "unicode": "1F686", "digest": "06e65d549e771632f3c64287a38ba67236f9800ccb6a23c3b592bc010e24e122" }, - { - "name": "train_diesel", - "unicode": "1F6F2", - "digest": "621bb967cd93fa9f8fd4b155965cc7572d3f91f88d94938ba10c8626718b623c" - }, - { - "name": "diesel_locomotive", - "unicode": "1F6F2", - "digest": "621bb967cd93fa9f8fd4b155965cc7572d3f91f88d94938ba10c8626718b623c" - }, { "name": "tram", "unicode": "1F68A", "digest": "21a7699f1a94f06dcb4d1e896448b98a4205f8efe902a8ac169a5005d11ab100" }, - { - "name": "triangle_round", - "unicode": "1F6C6", - "digest": "e24bb39ecfaaa746b03dc8418697d09ef327d5b077db39014f39d5fb87e23bd5" - }, - { - "name": "triangle_with_rounded_corners", - "unicode": "1F6C6", - "digest": "e24bb39ecfaaa746b03dc8418697d09ef327d5b077db39014f39d5fb87e23bd5" - }, { "name": "triangular_flag_on_post", "unicode": "1F6A9", @@ -10395,19 +10840,19 @@ "digest": "e744e8dbbdc6b126bd5b15aad56b524191de5a604189f4ab6d96730dfef4d086" }, { - "name": "turkey", - "unicode": "1F983", - "digest": "bf5daef15716b66636a5fdb6d059420521443c0603e2d56bd7c99c791a7285f4" + "name": "tumbler_glass", + "unicode": "1F943", + "digest": "7a38658274b9ff28836725a1dbfad49b8fa3af5ec8385e629db6bfdc7d93907a" }, { - "name": "turned_ok_hand", - "unicode": "1F58F", - "digest": "8a6c5b7d4c737866e7e32c6d9f7f447a48a0ac57a8909d43f87367d4a9b59246" + "name": "whisky", + "unicode": "1F943", + "digest": "7a38658274b9ff28836725a1dbfad49b8fa3af5ec8385e629db6bfdc7d93907a" }, { - "name": "turned_ok_hand_sign", - "unicode": "1F58F", - "digest": "8a6c5b7d4c737866e7e32c6d9f7f447a48a0ac57a8909d43f87367d4a9b59246" + "name": "turkey", + "unicode": "1F983", + "digest": "bf5daef15716b66636a5fdb6d059420521443c0603e2d56bd7c99c791a7285f4" }, { "name": "turtle", @@ -10759,6 +11204,36 @@ "unicode": "1F403", "digest": "ba6a840d4f57f8f9f3e9f29b8a030faf02a3a3d912e3e31b067616b2ac48a3d1" }, + { + "name": "water_polo", + "unicode": "1F93D", + "digest": "fc77e1d2a84a9f4cf0cf19c1ea10cf137cf0940b9103a523121eda87677ad148" + }, + { + "name": "water_polo_tone1", + "unicode": "1F93D-1F3FB", + "digest": "3be28384edd29ada8109f07720d601a9d5866ed63e6234efe9ee1a194ed5d0c5" + }, + { + "name": "water_polo_tone2", + "unicode": "1F93D-1F3FC", + "digest": "afcd3f28c6719f869ca79a6fd1ccade2ea976ade844fbc1081fc72865bcb652f" + }, + { + "name": "water_polo_tone3", + "unicode": "1F93D-1F3FD", + "digest": "d19481c9b82d9413e99c2652e020fd763f2b54408dedaffec8dfe80973ded407" + }, + { + "name": "water_polo_tone4", + "unicode": "1F93D-1F3FE", + "digest": "375972d882b627e8d525e632e58b30346fc3e01858d7d08d62a9d3bf8132bbc7" + }, + { + "name": "water_polo_tone5", + "unicode": "1F93D-1F3FF", + "digest": "a8e1ced1c5382a8147a1d1801a133cada9a0e52e41de6272e56c3c1f426f6048" + }, { "name": "watermelon", "unicode": "1F349", @@ -10914,6 +11389,16 @@ "unicode": "1F324", "digest": "0a6164cdadf2413555b7ef47b95f823f5a010f36d2dacfb1a38335a0f59e9601" }, + { + "name": "wilted_rose", + "unicode": "1F940", + "digest": "2c9e01ab9a61d057c71478b09ba7d82ae08f4a5a1c2212b7ad562b74f616677f" + }, + { + "name": "wilted_flower", + "unicode": "1F940", + "digest": "2c9e01ab9a61d057c71478b09ba7d82ae08f4a5a1c2212b7ad562b74f616677f" + }, { "name": "wind_blowing_face", "unicode": "1F32C", @@ -10995,14 +11480,69 @@ "digest": "81aae53bc892035b905bf3ec5b442a8ecc95027c5fa9eb51b7c3e7d8fad3f3f4" }, { - "name": "writing_hand", - "unicode": "1F58E", - "digest": "c4fc18ece6778339ebe14438aaf570e22385c3010c2d341824fa72ac6068cfeb" + "name": "wrestlers", + "unicode": "1F93C", + "digest": "9be983f3f9438f3ab8f6b643a958371d1e710c6d78e728f3465141811f05c2d5" + }, + { + "name": "wrestling", + "unicode": "1F93C", + "digest": "9be983f3f9438f3ab8f6b643a958371d1e710c6d78e728f3465141811f05c2d5" + }, + { + "name": "wrestlers_tone1", + "unicode": "1F93C-1F3FB", + "digest": "60461f83bfc93ce59dd027eab4782b7f206a7b142719fa72f301e047dc83a5d9" + }, + { + "name": "wrestling_tone1", + "unicode": "1F93C-1F3FB", + "digest": "60461f83bfc93ce59dd027eab4782b7f206a7b142719fa72f301e047dc83a5d9" + }, + { + "name": "wrestlers_tone2", + "unicode": "1F93C-1F3FC", + "digest": "67ad93c86e6c58d552c18e7a0105cc81fd9bb0474da51f788eba2e4c14b4a636" + }, + { + "name": "wrestling_tone2", + "unicode": "1F93C-1F3FC", + "digest": "67ad93c86e6c58d552c18e7a0105cc81fd9bb0474da51f788eba2e4c14b4a636" + }, + { + "name": "wrestlers_tone3", + "unicode": "1F93C-1F3FD", + "digest": "6bfd06c4435cabf2def153912040e05bf8db424fa383148ddda6d0ce8a8a3349" + }, + { + "name": "wrestling_tone3", + "unicode": "1F93C-1F3FD", + "digest": "6bfd06c4435cabf2def153912040e05bf8db424fa383148ddda6d0ce8a8a3349" + }, + { + "name": "wrestlers_tone4", + "unicode": "1F93C-1F3FE", + "digest": "597312678834c4d288c238482879856d5eba4620deb1eaef495f428e2ba5f2a5" + }, + { + "name": "wrestling_tone4", + "unicode": "1F93C-1F3FE", + "digest": "597312678834c4d288c238482879856d5eba4620deb1eaef495f428e2ba5f2a5" + }, + { + "name": "wrestlers_tone5", + "unicode": "1F93C-1F3FF", + "digest": "d6aebdf1e44fd825b9a5b3716aefbc53f4b4dbb73cb2a628c0f2994ebfd34614" + }, + { + "name": "wrestling_tone5", + "unicode": "1F93C-1F3FF", + "digest": "d6aebdf1e44fd825b9a5b3716aefbc53f4b4dbb73cb2a628c0f2994ebfd34614" }, { - "name": "left_writing_hand", - "unicode": "1F58E", - "digest": "c4fc18ece6778339ebe14438aaf570e22385c3010c2d341824fa72ac6068cfeb" + "name": "writing_hand", + "unicode": "270D", + "digest": "110517ae4da5587e8b0662881658e27da4120bfacec54734fd6657831d4d782f" }, { "name": "writing_hand_tone1", diff --git a/fixtures/emojis/index.json b/fixtures/emojis/index.json index 7f204c1a8e0c3137931e7d3b2b745f642d3bb6c3..2a990913b9cc0d2da7d377dc09a12f66c4d24e36 100644 --- a/fixtures/emojis/index.json +++ b/fixtures/emojis/index.json @@ -4,7 +4,7 @@ "unicode_alternates": [], "name": "hundred points symbol", "shortname": ":100:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15,12 +15,14 @@ "percent", "a", "plus", - "perfect", "school", "quiz", - "score", "test", - "exam" + "exam", + "symbol", + "wow", + "win", + "parties" ], "moji": "💯" }, @@ -29,12 +31,13 @@ "unicode_alternates": [], "name": "input symbol for numbers", "shortname": ":1234:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "numbers" + "numbers", + "symbol" ], "moji": "🔢" }, @@ -43,16 +46,20 @@ "unicode_alternates": [], "name": "billiards", "shortname": ":8ball:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ "pool", "billiards", "eight ball", - "pool", "pocket ball", - "cue" + "cue", + "game", + "ball", + "sport", + "luck", + "boys night" ], "moji": "🎱" }, @@ -61,13 +68,14 @@ "unicode_alternates": [], "name": "negative squared latin capital letter a", "shortname": ":a:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", "letter", - "red-square" + "red-square", + "symbol" ], "moji": "🅰" }, @@ -76,12 +84,13 @@ "unicode_alternates": [], "name": "negative squared ab", "shortname": ":ab:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", - "red-square" + "red-square", + "symbol" ], "moji": "🆎" }, @@ -90,12 +99,13 @@ "unicode_alternates": [], "name": "input symbol for latin letters", "shortname": ":abc:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", - "blue-square" + "blue-square", + "symbol" ], "moji": "🔤" }, @@ -104,12 +114,13 @@ "unicode_alternates": [], "name": "input symbol for latin small letters", "shortname": ":abcd:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", - "blue-square" + "blue-square", + "symbol" ], "moji": "🔡" }, @@ -118,7 +129,7 @@ "unicode_alternates": [], "name": "circled ideograph accept", "shortname": ":accept:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -127,7 +138,8 @@ "good", "kanji", "ok", - "yes" + "yes", + "symbol" ], "moji": "🉑" }, @@ -136,7 +148,7 @@ "unicode_alternates": [], "name": "aerial tramway", "shortname": ":aerial_tramway:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -146,7 +158,9 @@ "tram", "tramway", "cable", - "transport" + "transport", + "travel", + "train" ], "moji": "🚡" }, @@ -157,7 +171,7 @@ ], "name": "airplane", "shortname": ":airplane:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -173,7 +187,8 @@ "jet", "jumbo", "boeing", - "airbus" + "airbus", + "vacation" ], "moji": "✈" }, @@ -182,7 +197,7 @@ "unicode_alternates": [], "name": "airplane arriving", "shortname": ":airplane_arriving:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -197,15 +212,17 @@ "jet", "jumbo", "boeing", - "airbus" - ] + "airbus", + "vacation" + ], + "moji": "🛬" }, "airplane_departure": { "unicode": "1F6EB", "unicode_alternates": [], "name": "airplane departure", "shortname": ":airplane_departure:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -221,30 +238,17 @@ "jumbo", "boeing", "airbus", - "leaving" - ] - }, - "airplane_northeast": { - "unicode": "1F6EA", - "unicode_alternates": [], - "name": "northeast-pointing airplane", - "shortname": ":airplane_northeast:", - "category": "travel_places", - "aliases": [ - ":northeast_pointing_airplane:" + "leaving", + "vacation" ], - "aliases_ascii": [], - "keywords": [ - "plane", - "travel" - ] + "moji": "🛫" }, "airplane_small": { "unicode": "1F6E9", "unicode_alternates": [], "name": "small airplane", "shortname": ":airplane_small:", - "category": "travel_places", + "category": "travel", "aliases": [ ":small_airplane:" ], @@ -261,38 +265,10 @@ "jet", "jumbo", "boeing", - "airbus" - ] - }, - "airplane_small_up": { - "unicode": "1F6E8", - "unicode_alternates": [], - "name": "up-pointing small airplane", - "shortname": ":airplane_small_up:", - "category": "travel_places", - "aliases": [ - ":up_pointing_small_airplane:" - ], - "aliases_ascii": [], - "keywords": [ - "plane", - "travel" - ] - }, - "airplane_up": { - "unicode": "1F6E7", - "unicode_alternates": [], - "name": "up-pointing airplane", - "shortname": ":airplane_up:", - "category": "travel_places", - "aliases": [ - ":up_pointing_airplane:" + "airbus", + "vacation" ], - "aliases_ascii": [], - "keywords": [ - "plane", - "travel" - ] + "moji": "🛩" }, "alarm_clock": { "unicode": "23F0", @@ -304,13 +280,14 @@ "aliases_ascii": [], "keywords": [ "time", - "wake" + "wake", + "object" ], "moji": "â°" }, "alembic": { "unicode": "2697", - "unicode_alternates": "", + "unicode_alternates": [], "name": "alembic", "shortname": ":alembic:", "category": "objects", @@ -319,22 +296,27 @@ "keywords": [ "chemistry", "object", - "tool" - ] + "tool", + "science" + ], + "moji": "âš—" }, "alien": { "unicode": "1F47D", "unicode_alternates": [], "name": "extraterrestrial alien", "shortname": ":alien:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "UFO", "paul", "alien", - "ufo" + "ufo", + "space", + "monster", + "scientology" ], "moji": "👽" }, @@ -343,7 +325,7 @@ "unicode_alternates": [], "name": "ambulance", "shortname": ":ambulance:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -353,19 +335,23 @@ "emergency", "medical", "help", - "assistance" + "assistance", + "transportation" ], "moji": "🚑" }, "amphora": { "unicode": "1F3FA", - "unicode_alternates": "", + "unicode_alternates": [], "name": "amphora", "shortname": ":amphora:", "category": "objects", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "object" + ], + "moji": "ðŸº" }, "anchor": { "unicode": "2693", @@ -374,21 +360,23 @@ ], "name": "anchor", "shortname": ":anchor:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "ferry", "ship", "anchor", - "ship", "boat", "ocean", "harbor", "marina", "shipyard", "sailor", - "tattoo" + "tattoo", + "object", + "travel", + "vacation" ], "moji": "âš“" }, @@ -397,7 +385,7 @@ "unicode_alternates": [], "name": "baby angel", "shortname": ":angel:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -406,16 +394,17 @@ "halo", "cupid", "wings", - "halo", "heaven", - "wings", - "jesus" + "jesus", + "people", + "diversity", + "omg" ], "moji": "👼" }, "angel_tone1": { "unicode": "1F47C-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby angel tone 1", "shortname": ":angel_tone1:", "category": "people", @@ -427,11 +416,12 @@ "heaven", "wings", "jesus" - ] + ], + "moji": "👼ðŸ»" }, "angel_tone2": { "unicode": "1F47C-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby angel tone 2", "shortname": ":angel_tone2:", "category": "people", @@ -443,11 +433,12 @@ "heaven", "wings", "jesus" - ] + ], + "moji": "👼ðŸ¼" }, "angel_tone3": { "unicode": "1F47C-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby angel tone 3", "shortname": ":angel_tone3:", "category": "people", @@ -459,11 +450,12 @@ "heaven", "wings", "jesus" - ] + ], + "moji": "👼ðŸ½" }, "angel_tone4": { "unicode": "1F47C-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby angel tone 4", "shortname": ":angel_tone4:", "category": "people", @@ -475,11 +467,12 @@ "heaven", "wings", "jesus" - ] + ], + "moji": "👼ðŸ¾" }, "angel_tone5": { "unicode": "1F47C-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby angel tone 5", "shortname": ":angel_tone5:", "category": "people", @@ -491,50 +484,31 @@ "heaven", "wings", "jesus" - ] + ], + "moji": "👼ðŸ¿" }, "anger": { "unicode": "1F4A2", "unicode_alternates": [], "name": "anger symbol", "shortname": ":anger:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "anger", "angry", - "mad" + "mad", + "symbol" ], "moji": "💢" }, - "anger_left": { - "unicode": "1F5EE", - "unicode_alternates": [], - "name": "left anger bubble", - "shortname": ":anger_left:", - "category": "objects_symbols", - "aliases": [ - ":left_anger_bubble:" - ], - "aliases_ascii": [], - "keywords": [ - "speech", - "balloon", - "talk", - "mood", - "conversation", - "communication", - "comic", - "angry" - ] - }, "anger_right": { "unicode": "1F5EF", "unicode_alternates": [], "name": "right anger bubble", "shortname": ":anger_right:", - "category": "objects_symbols", + "category": "symbols", "aliases": [ ":right_anger_bubble:" ], @@ -547,15 +521,17 @@ "conversation", "communication", "comic", - "angry" - ] + "angry", + "symbol" + ], + "moji": "🗯" }, "angry": { "unicode": "1F620", "unicode_alternates": [], "name": "angry face", "shortname": ":angry:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ">:(", @@ -571,7 +547,8 @@ "annoyed", "face", "frustrated", - "mad" + "smiley", + "emotion" ], "moji": "😠" }, @@ -580,7 +557,7 @@ "unicode_alternates": [], "name": "anguished face", "shortname": ":anguished:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -592,7 +569,11 @@ "ouch", "misery", "distress", - "grief" + "grief", + "sad", + "smiley", + "surprised", + "emotion" ], "moji": "😧" }, @@ -609,8 +590,8 @@ "insect", "ant", "queen", - "insect", - "team" + "team", + "insects" ], "moji": "ðŸœ" }, @@ -619,20 +600,21 @@ "unicode_alternates": [], "name": "red apple", "shortname": ":apple:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ "fruit", "mac", "apple", - "fruit", "electronics", "red", "doctor", "teacher", "school", - "core" + "core", + "food", + "creationism" ], "moji": "ðŸŽ" }, @@ -643,7 +625,7 @@ ], "name": "aquarius", "shortname": ":aquarius:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -657,9 +639,8 @@ "zodiac", "sign", "purple-square", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "â™’" }, @@ -670,7 +651,7 @@ ], "name": "aries", "shortname": ":aries:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -683,9 +664,8 @@ "zodiac", "sign", "purple-square", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♈" }, @@ -696,12 +676,14 @@ ], "name": "black left-pointing triangle", "shortname": ":arrow_backward:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol", + "triangle" ], "moji": "â—€" }, @@ -710,12 +692,13 @@ "unicode_alternates": [], "name": "black down-pointing double triangle", "shortname": ":arrow_double_down:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol" ], "moji": "â¬" }, @@ -724,12 +707,13 @@ "unicode_alternates": [], "name": "black up-pointing double triangle", "shortname": ":arrow_double_up:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol" ], "moji": "â«" }, @@ -740,12 +724,13 @@ ], "name": "downwards black arrow", "shortname": ":arrow_down:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol" ], "moji": "⬇" }, @@ -754,12 +739,14 @@ "unicode_alternates": [], "name": "down-pointing small red triangle", "shortname": ":arrow_down_small:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol", + "triangle" ], "moji": "🔽" }, @@ -770,12 +757,14 @@ ], "name": "black right-pointing triangle", "shortname": ":arrow_forward:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol", + "triangle" ], "moji": "â–¶" }, @@ -786,12 +775,13 @@ ], "name": "arrow pointing rightwards then curving downwards", "shortname": ":arrow_heading_down:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol" ], "moji": "⤵" }, @@ -802,12 +792,13 @@ ], "name": "arrow pointing rightwards then curving upwards", "shortname": ":arrow_heading_up:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol" ], "moji": "⤴" }, @@ -818,13 +809,14 @@ ], "name": "leftwards black arrow", "shortname": ":arrow_left:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", "blue-square", - "previous" + "previous", + "symbol" ], "moji": "⬅" }, @@ -835,12 +827,13 @@ ], "name": "south west arrow", "shortname": ":arrow_lower_left:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol" ], "moji": "↙" }, @@ -851,12 +844,13 @@ ], "name": "south east arrow", "shortname": ":arrow_lower_right:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "blue-square" + "blue-square", + "symbol" ], "moji": "↘" }, @@ -867,12 +861,14 @@ ], "name": "black rightwards arrow", "shortname": ":arrow_right:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "next" + "next", + "arrow", + "symbol" ], "moji": "âž¡" }, @@ -883,11 +879,13 @@ ], "name": "rightwards arrow with hook", "shortname": ":arrow_right_hook:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol" ], "moji": "↪" }, @@ -898,11 +896,13 @@ ], "name": "upwards black arrow", "shortname": ":arrow_up:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol" ], "moji": "⬆" }, @@ -913,11 +913,13 @@ ], "name": "up down arrow", "shortname": ":arrow_up_down:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol" ], "moji": "↕" }, @@ -926,11 +928,14 @@ "unicode_alternates": [], "name": "up-pointing small red triangle", "shortname": ":arrow_up_small:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol", + "triangle" ], "moji": "🔼" }, @@ -941,11 +946,13 @@ ], "name": "north west arrow", "shortname": ":arrow_upper_left:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol" ], "moji": "↖" }, @@ -956,11 +963,13 @@ ], "name": "north east arrow", "shortname": ":arrow_upper_right:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol" ], "moji": "↗" }, @@ -969,11 +978,13 @@ "unicode_alternates": [], "name": "clockwise downwards and upwards open circle arrows", "shortname": ":arrows_clockwise:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "sync" + "sync", + "arrow", + "symbol" ], "moji": "🔃" }, @@ -982,12 +993,14 @@ "unicode_alternates": [], "name": "anticlockwise downwards and upwards open circle ar", "shortname": ":arrows_counterclockwise:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "sync" + "sync", + "arrow", + "symbol" ], "moji": "🔄" }, @@ -996,7 +1009,7 @@ "unicode_alternates": [], "name": "artist palette", "shortname": ":art:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1007,8 +1020,6 @@ "palette", "art", "colors", - "paint", - "draw", "brush", "pastels", "oils" @@ -1020,7 +1031,7 @@ "unicode_alternates": [], "name": "articulated lorry", "shortname": ":articulated_lorry:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1035,24 +1046,11 @@ ], "moji": "🚛" }, - "ascending_notes": { - "unicode": "1F39C", - "unicode_alternates": [], - "name": "beamed ascending musical notes", - "shortname": ":ascending_notes:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "score", - "music", - "sound", - "tone" - ] - }, "asterisk": { "unicode": "002A-20E3", - "unicode_alternates": "002a-fe0f-20e3", + "unicode_alternates": [ + "002A-FE0F-20E3" + ], "name": "keycap asterisk", "shortname": ":asterisk:", "category": "symbols", @@ -1064,14 +1062,15 @@ "*", "star", "symbol" - ] + ], + "moji": "*⃣" }, "astonished": { "unicode": "1F632", "unicode_alternates": [], "name": "astonished face", "shortname": ":astonished:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1079,7 +1078,12 @@ "xox", "shocked", "surprise", - "astonished" + "astonished", + "smiley", + "surprised", + "wow", + "emotion", + "omg" ], "moji": "😲" }, @@ -1088,12 +1092,16 @@ "unicode_alternates": [], "name": "athletic shoe", "shortname": ":athletic_shoe:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "shoes", - "sports" + "sports", + "fashion", + "shoe", + "accessories", + "boys night" ], "moji": "👟" }, @@ -1102,7 +1110,7 @@ "unicode_alternates": [], "name": "automated teller machine", "shortname": ":atm:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1115,17 +1123,16 @@ "bank", "adam", "payday", - "bank", "blue-square", - "cash", - "money", - "payment" + "payment", + "electronics", + "symbol" ], "moji": "ðŸ§" }, "atom": { "unicode": "269B", - "unicode_alternates": "", + "unicode_alternates": [], "name": "atom symbol", "shortname": ":atom:", "category": "symbols", @@ -1134,21 +1141,36 @@ ], "aliases_ascii": [], "keywords": [ - "atheist" - ] + "atheist", + "symbol", + "science" + ], + "moji": "âš›" + }, + "avocado": { + "unicode": "1F951", + "unicode_alternates": [], + "name": "avocado", + "shortname": ":avocado:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🥑" }, "b": { "unicode": "1F171", "unicode_alternates": [], "name": "negative squared latin capital letter b", "shortname": ":b:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", "letter", - "red-square" + "red-square", + "symbol" ], "moji": "🅱" }, @@ -1157,13 +1179,16 @@ "unicode_alternates": [], "name": "baby", "shortname": ":baby:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "boy", "child", - "infant" + "infant", + "people", + "baby", + "diversity" ], "moji": "👶" }, @@ -1172,7 +1197,7 @@ "unicode_alternates": [], "name": "baby bottle", "shortname": ":baby_bottle:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1184,7 +1209,9 @@ "mother", "nipple", "newborn", - "formula" + "formula", + "drink", + "object" ], "moji": "ðŸ¼" }, @@ -1202,7 +1229,6 @@ "chick", "baby", "bird", - "chicken", "young", "woman", "cute" @@ -1214,7 +1240,7 @@ "unicode_alternates": [], "name": "baby symbol", "shortname": ":baby_symbol:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1226,13 +1252,14 @@ "human", "diaper", "small", - "babe" + "babe", + "symbol" ], "moji": "🚼" }, "baby_tone1": { "unicode": "1F476-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby tone 1", "shortname": ":baby_tone1:", "category": "people", @@ -1242,11 +1269,12 @@ "child", "infant", "toddler" - ] + ], + "moji": "👶ðŸ»" }, "baby_tone2": { "unicode": "1F476-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby tone 2", "shortname": ":baby_tone2:", "category": "people", @@ -1256,11 +1284,12 @@ "child", "infant", "toddler" - ] + ], + "moji": "👶ðŸ¼" }, "baby_tone3": { "unicode": "1F476-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby tone 3", "shortname": ":baby_tone3:", "category": "people", @@ -1270,11 +1299,12 @@ "child", "infant", "toddler" - ] + ], + "moji": "👶ðŸ½" }, "baby_tone4": { "unicode": "1F476-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby tone 4", "shortname": ":baby_tone4:", "category": "people", @@ -1284,11 +1314,12 @@ "child", "infant", "toddler" - ] + ], + "moji": "👶ðŸ¾" }, "baby_tone5": { "unicode": "1F476-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "baby tone 5", "shortname": ":baby_tone5:", "category": "people", @@ -1298,37 +1329,57 @@ "child", "infant", "toddler" - ] + ], + "moji": "👶ðŸ¿" }, "back": { "unicode": "1F519", "unicode_alternates": [], "name": "back with leftwards arrow above", "shortname": ":back:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "arrow" + "arrow", + "symbol" ], "moji": "🔙" }, + "bacon": { + "unicode": "1F953", + "unicode_alternates": [], + "name": "bacon", + "shortname": ":bacon:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "pig" + ], + "moji": "🥓" + }, "badminton": { "unicode": "1F3F8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "badminton racquet", "shortname": ":badminton:", "category": "activity", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "game", + "sport", + "badminton" + ], + "moji": "ðŸ¸" }, "baggage_claim": { "unicode": "1F6C4", "unicode_alternates": [], "name": "baggage claim", "shortname": ":baggage_claim:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1338,7 +1389,8 @@ "bag", "baggage", "luggage", - "travel" + "travel", + "symbol" ], "moji": "🛄" }, @@ -1355,11 +1407,13 @@ "party", "balloon", "birthday", - "celebration", "helium", "gas", "children", - "float" + "float", + "object", + "good", + "parties" ], "moji": "🎈" }, @@ -1368,29 +1422,17 @@ "unicode_alternates": [], "name": "ballot box with ballot", "shortname": ":ballot_box:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":ballot_box_with_ballot:" ], "aliases_ascii": [], "keywords": [ - "vote" - ] - }, - "ballot_box_check": { - "unicode": "1F5F9", - "unicode_alternates": [], - "name": "ballot box with bold check", - "shortname": ":ballot_box_check:", - "category": "objects_symbols", - "aliases": [ - ":ballot_box_with_bold_check:" + "vote", + "object", + "office" ], - "aliases_ascii": [], - "keywords": [ - "mark", - "vote" - ] + "moji": "🗳" }, "ballot_box_with_check": { "unicode": "2611", @@ -1399,51 +1441,22 @@ ], "name": "ballot box with check", "shortname": ":ballot_box_with_check:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "agree", - "ok" + "ok", + "symbol" ], "moji": "☑" }, - "ballot_box_x": { - "unicode": "1F5F5", - "unicode_alternates": [], - "name": "ballot box with script x", - "shortname": ":ballot_box_x:", - "category": "objects_symbols", - "aliases": [ - ":ballot_box_with_script_x:" - ], - "aliases_ascii": [], - "keywords": [ - "mark", - "vote" - ] - }, - "ballot_x": { - "unicode": "1F5F4", - "unicode_alternates": [], - "name": "ballot script x", - "shortname": ":ballot_x:", - "category": "objects_symbols", - "aliases": [ - ":ballot_script_x:" - ], - "aliases_ascii": [], - "keywords": [ - "mark", - "vote" - ] - }, "bamboo": { "unicode": "1F38D", "unicode_alternates": [], "name": "pine decoration", "shortname": ":bamboo:", - "category": "objects", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1472,7 +1485,7 @@ "unicode_alternates": [], "name": "banana", "shortname": ":banana:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1480,7 +1493,8 @@ "fruit", "banana", "peel", - "bunch" + "bunch", + "penis" ], "moji": "ðŸŒ" }, @@ -1491,12 +1505,14 @@ ], "name": "double exclamation mark", "shortname": ":bangbang:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "exclamation", - "surprise" + "surprise", + "symbol", + "punctuation" ], "moji": "‼" }, @@ -1505,11 +1521,12 @@ "unicode_alternates": [], "name": "bank", "shortname": ":bank:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "building" + "building", + "places" ], "moji": "ðŸ¦" }, @@ -1524,7 +1541,9 @@ "keywords": [ "graph", "presentation", - "stats" + "stats", + "work", + "office" ], "moji": "📊" }, @@ -1533,13 +1552,14 @@ "unicode_alternates": [], "name": "barber pole", "shortname": ":barber:", - "category": "places", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "hair", "salon", - "style" + "style", + "object" ], "moji": "💈" }, @@ -1550,13 +1570,17 @@ ], "name": "baseball", "shortname": ":baseball:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ "MLB", "balls", - "sports" + "sports", + "game", + "ball", + "sport", + "baseball" ], "moji": "âš¾" }, @@ -1565,7 +1589,7 @@ "unicode_alternates": [], "name": "basketball and hoop", "shortname": ":basketball:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1578,13 +1602,16 @@ "hoop", "net", "swish", - "rip city" + "rip city", + "game", + "ball", + "sport" ], "moji": "ðŸ€" }, "basketball_player": { "unicode": "26F9", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with ball", "shortname": ":basketball_player:", "category": "activity", @@ -1594,12 +1621,18 @@ "aliases_ascii": [], "keywords": [ "sport", - "travel" - ] + "travel", + "men", + "game", + "ball", + "basketball", + "diversity" + ], + "moji": "⛹" }, "basketball_player_tone1": { "unicode": "26F9-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with ball tone 1", "shortname": ":basketball_player_tone1:", "category": "activity", @@ -1607,11 +1640,19 @@ ":person_with_ball_tone1:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "sport", + "travel", + "men", + "game", + "ball", + "basketball" + ], + "moji": "⛹ðŸ»" }, "basketball_player_tone2": { "unicode": "26F9-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with ball tone 2", "shortname": ":basketball_player_tone2:", "category": "activity", @@ -1619,11 +1660,19 @@ ":person_with_ball_tone2:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "sport", + "travel", + "men", + "game", + "ball", + "basketball" + ], + "moji": "⛹ðŸ¼" }, "basketball_player_tone3": { "unicode": "26F9-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with ball tone 3", "shortname": ":basketball_player_tone3:", "category": "activity", @@ -1631,11 +1680,19 @@ ":person_with_ball_tone3:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "sport", + "travel", + "men", + "game", + "ball", + "basketball" + ], + "moji": "⛹ðŸ½" }, "basketball_player_tone4": { "unicode": "26F9-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with ball tone 4", "shortname": ":basketball_player_tone4:", "category": "activity", @@ -1643,11 +1700,19 @@ ":person_with_ball_tone4:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "sport", + "travel", + "men", + "game", + "ball", + "basketball" + ], + "moji": "⛹ðŸ¾" }, "basketball_player_tone5": { "unicode": "26F9-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with ball tone 5", "shortname": ":basketball_player_tone5:", "category": "activity", @@ -1655,14 +1720,33 @@ ":person_with_ball_tone5:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "sport", + "travel", + "men", + "game", + "ball", + "basketball" + ], + "moji": "⛹ðŸ¿" + }, + "bat": { + "unicode": "1F987", + "unicode_alternates": [], + "name": "bat", + "shortname": ":bat:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦇" }, "bath": { "unicode": "1F6C0", "unicode_alternates": [], "name": "bath", "shortname": ":bath:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1677,16 +1761,17 @@ "bathroom", "soap", "water", - "clean", "shampoo", "lather", - "water" + "tired", + "diversity", + "steam" ], "moji": "🛀" }, "bath_tone1": { "unicode": "1F6C0-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bath tone 1", "shortname": ":bath_tone1:", "category": "activity", @@ -1705,11 +1790,12 @@ "clean", "shampoo", "lather" - ] + ], + "moji": "🛀ðŸ»" }, "bath_tone2": { "unicode": "1F6C0-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bath tone 2", "shortname": ":bath_tone2:", "category": "activity", @@ -1728,11 +1814,12 @@ "clean", "shampoo", "lather" - ] + ], + "moji": "🛀ðŸ¼" }, "bath_tone3": { "unicode": "1F6C0-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bath tone 3", "shortname": ":bath_tone3:", "category": "activity", @@ -1751,11 +1838,12 @@ "clean", "shampoo", "lather" - ] + ], + "moji": "🛀ðŸ½" }, "bath_tone4": { "unicode": "1F6C0-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bath tone 4", "shortname": ":bath_tone4:", "category": "activity", @@ -1774,11 +1862,12 @@ "clean", "shampoo", "lather" - ] + ], + "moji": "🛀ðŸ¾" }, "bath_tone5": { "unicode": "1F6C0-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bath tone 5", "shortname": ":bath_tone5:", "category": "activity", @@ -1797,7 +1886,8 @@ "clean", "shampoo", "lather" - ] + ], + "moji": "🛀ðŸ¿" }, "bathtub": { "unicode": "1F6C1", @@ -1819,10 +1909,11 @@ "bathroom", "soap", "water", - "clean", "shampoo", "lather", - "water" + "object", + "tired", + "steam" ], "moji": "ðŸ›" }, @@ -1837,7 +1928,8 @@ "keywords": [ "energy", "power", - "sustain" + "sustain", + "object" ], "moji": "🔋" }, @@ -1846,7 +1938,7 @@ "unicode_alternates": [], "name": "beach with umbrella", "shortname": ":beach:", - "category": "travel_places", + "category": "travel", "aliases": [ ":beach_with_umbrella:" ], @@ -1859,12 +1951,18 @@ "relaxation", "tanning", "tan", - "swimming" - ] + "swimming", + "places", + "travel", + "tropical", + "beach", + "swim" + ], + "moji": "ðŸ–" }, "beach_umbrella": { "unicode": "26F1", - "unicode_alternates": "", + "unicode_alternates": [], "name": "umbrella on ground", "shortname": ":beach_umbrella:", "category": "objects", @@ -1877,8 +1975,11 @@ "rain", "sun", "travel", - "weather" - ] + "weather", + "vacation", + "tropical" + ], + "moji": "â›±" }, "bear": { "unicode": "1F43B", @@ -1890,7 +1991,9 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" + "nature", + "wildlife", + "roar" ], "moji": "ðŸ»" }, @@ -1899,7 +2002,7 @@ "unicode_alternates": [], "name": "bed", "shortname": ":bed:", - "category": "travel_places", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1909,8 +2012,11 @@ "full", "twin", "king", - "mattress" - ] + "mattress", + "object", + "tired" + ], + "moji": "ðŸ›" }, "bee": { "unicode": "1F41D", @@ -1932,7 +2038,8 @@ "honey", "hive", "bumble", - "pollination" + "pollination", + "insects" ], "moji": "ðŸ" }, @@ -1941,7 +2048,7 @@ "unicode_alternates": [], "name": "beer mug", "shortname": ":beer:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1962,7 +2069,9 @@ "brewery", "micro", "pint", - "boot" + "boot", + "alcohol", + "parties" ], "moji": "ðŸº" }, @@ -1971,7 +2080,7 @@ "unicode_alternates": [], "name": "clinking beer mugs", "shortname": ":beers:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -1987,11 +2096,14 @@ "mug", "toast", "celebrate", - "pub", "bar", "jolly", "hops", - "clink" + "clink", + "alcohol", + "thank you", + "boys night", + "parties" ], "moji": "ðŸ»" }, @@ -2013,8 +2125,9 @@ "beetle", "cow", "lady cow", - "insect", - "endearment" + "endearment", + "insects", + "animal" ], "moji": "ðŸž" }, @@ -2023,12 +2136,13 @@ "unicode_alternates": [], "name": "japanese symbol for beginner", "shortname": ":beginner:", - "category": "places", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "badge", - "shield" + "shield", + "symbol" ], "moji": "🔰" }, @@ -2037,7 +2151,7 @@ "unicode_alternates": [], "name": "bell", "shortname": ":bell:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2045,7 +2159,10 @@ "christmas", "notification", "sound", - "xmas" + "xmas", + "object", + "alarm", + "symbol" ], "moji": "🔔" }, @@ -2054,7 +2171,7 @@ "unicode_alternates": [], "name": "bellhop bell", "shortname": ":bellhop:", - "category": "travel_places", + "category": "objects", "aliases": [ ":bellhop_bell:" ], @@ -2062,15 +2179,17 @@ "keywords": [ "hotel", "porter", - "ding" - ] + "ding", + "object" + ], + "moji": "🛎" }, "bento": { "unicode": "1F371", "unicode_alternates": [], "name": "bento box", "shortname": ":bento:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2078,13 +2197,14 @@ "food", "japanese", "bento", - "japanese", "rice", "meal", - "box", "obento", "convenient", - "lunchbox" + "lunchbox", + "object", + "sushi", + "japan" ], "moji": "ðŸ±" }, @@ -2093,7 +2213,7 @@ "unicode_alternates": [], "name": "bicyclist", "shortname": ":bicyclist:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2103,16 +2223,19 @@ "sports", "bicyclist", "road", - "bike", "pedal", "bicycle", - "transportation" + "transportation", + "men", + "workout", + "sport", + "diversity" ], "moji": "🚴" }, "bicyclist_tone1": { "unicode": "1F6B4-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bicyclist tone 1", "shortname": ":bicyclist_tone1:", "category": "activity", @@ -2127,11 +2250,12 @@ "pedal", "bicycle", "transportation" - ] + ], + "moji": "🚴ðŸ»" }, "bicyclist_tone2": { "unicode": "1F6B4-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bicyclist tone 2", "shortname": ":bicyclist_tone2:", "category": "activity", @@ -2146,11 +2270,12 @@ "pedal", "bicycle", "transportation" - ] + ], + "moji": "🚴ðŸ¼" }, "bicyclist_tone3": { "unicode": "1F6B4-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bicyclist tone 3", "shortname": ":bicyclist_tone3:", "category": "activity", @@ -2165,11 +2290,12 @@ "pedal", "bicycle", "transportation" - ] + ], + "moji": "🚴ðŸ½" }, "bicyclist_tone4": { "unicode": "1F6B4-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bicyclist tone 4", "shortname": ":bicyclist_tone4:", "category": "activity", @@ -2184,11 +2310,12 @@ "pedal", "bicycle", "transportation" - ] + ], + "moji": "🚴ðŸ¾" }, "bicyclist_tone5": { "unicode": "1F6B4-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bicyclist tone 5", "shortname": ":bicyclist_tone5:", "category": "activity", @@ -2203,14 +2330,15 @@ "pedal", "bicycle", "transportation" - ] + ], + "moji": "🚴ðŸ¿" }, "bike": { "unicode": "1F6B2", "unicode_alternates": [], "name": "bicycle", "shortname": ":bike:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2220,8 +2348,8 @@ "sports", "bike", "pedal", - "bicycle", - "transportation" + "transportation", + "travel" ], "moji": "🚲" }, @@ -2230,7 +2358,7 @@ "unicode_alternates": [], "name": "bikini", "shortname": ":bikini:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2239,13 +2367,18 @@ "female", "girl", "swimming", - "woman" + "woman", + "women", + "sexy", + "vacation", + "tropical", + "swim" ], "moji": "👙" }, "biohazard": { "unicode": "2623", - "unicode_alternates": "", + "unicode_alternates": [], "name": "biohazard sign", "shortname": ":biohazard:", "category": "symbols", @@ -2254,8 +2387,10 @@ ], "aliases_ascii": [], "keywords": [ - "symbol" - ] + "symbol", + "science" + ], + "moji": "☣" }, "bird": { "unicode": "1F426", @@ -2269,7 +2404,8 @@ "animal", "fly", "nature", - "tweet" + "tweet", + "wildlife" ], "moji": "ðŸ¦" }, @@ -2278,7 +2414,7 @@ "unicode_alternates": [], "name": "birthday cake", "shortname": ":birthday:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2286,10 +2422,11 @@ "party", "birthday", "birth", - "cake", "dessert", "wish", - "celebrate" + "celebrate", + "food", + "parties" ], "moji": "🎂" }, @@ -2300,26 +2437,42 @@ ], "name": "medium black circle", "shortname": ":black_circle:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "circle" ], "moji": "âš«" }, + "black_heart": { + "unicode": "1F5A4", + "unicode_alternates": [], + "name": "black heart", + "shortname": ":black_heart:", + "category": "symbols", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🖤" + }, "black_joker": { "unicode": "1F0CF", "unicode_alternates": [], "name": "playing card black joker", "shortname": ":black_joker:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "cards", "game", - "poker" + "poker", + "object", + "symbol" ], "moji": "ðŸƒ" }, @@ -2330,11 +2483,14 @@ ], "name": "black large square", "shortname": ":black_large_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "square" ], "moji": "⬛" }, @@ -2345,10 +2501,14 @@ ], "name": "black medium small square", "shortname": ":black_medium_small_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [], + "keywords": [ + "shapes", + "symbol", + "square" + ], "moji": "â—¾" }, "black_medium_square": { @@ -2358,11 +2518,14 @@ ], "name": "black medium square", "shortname": ":black_medium_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "square" ], "moji": "â—¼" }, @@ -2378,7 +2541,10 @@ "aliases_ascii": [], "keywords": [ "pen", - "stationery" + "stationery", + "object", + "office", + "write" ], "moji": "✒" }, @@ -2389,10 +2555,14 @@ ], "name": "black small square", "shortname": ":black_small_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [], + "keywords": [ + "shapes", + "symbol", + "square" + ], "moji": "â–ª" }, "black_square_button": { @@ -2400,11 +2570,14 @@ "unicode_alternates": [], "name": "black square button", "shortname": ":black_square_button:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "frame" + "frame", + "shapes", + "symbol", + "square" ], "moji": "🔲" }, @@ -2422,7 +2595,8 @@ "yellow", "blossom", "daisy", - "flower" + "flower", + "plant" ], "moji": "🌼" }, @@ -2445,7 +2619,9 @@ "ballonfish", "toadfish", "fugu fish", - "sushi" + "sushi", + "wildlife", + "animal" ], "moji": "ðŸ¡" }, @@ -2460,7 +2636,11 @@ "keywords": [ "knowledge", "library", - "read" + "read", + "object", + "office", + "write", + "book" ], "moji": "📘" }, @@ -2469,15 +2649,16 @@ "unicode_alternates": [], "name": "recreational vehicle", "shortname": ":blue_car:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "car", "suv", - "car", "wagon", - "automobile" + "automobile", + "transportation", + "travel" ], "moji": "🚙" }, @@ -2486,7 +2667,7 @@ "unicode_alternates": [], "name": "blue heart", "shortname": ":blue_heart:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2496,11 +2677,11 @@ "valentines", "blue", "heart", - "love", "stability", "truth", "loyalty", - "trust" + "trust", + "symbol" ], "moji": "💙" }, @@ -2509,7 +2690,7 @@ "unicode_alternates": [], "name": "smiling face with smiling eyes", "shortname": ":blush:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2521,8 +2702,10 @@ "shy", "smile", "smiling", - "smile", - "smiley" + "smiley", + "emotion", + "good", + "beautiful" ], "moji": "😊" }, @@ -2536,7 +2719,8 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" + "nature", + "wildlife" ], "moji": "ðŸ—" }, @@ -2550,7 +2734,11 @@ "aliases_ascii": [], "keywords": [ "boom", - "explode" + "explode", + "object", + "weapon", + "dead", + "blast" ], "moji": "💣" }, @@ -2564,26 +2752,14 @@ "aliases_ascii": [], "keywords": [ "library", - "literature" + "literature", + "object", + "office", + "write", + "book" ], "moji": "📖" }, - "book2": { - "unicode": "1F56E", - "unicode_alternates": [], - "name": "book", - "shortname": ":book2:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "library", - "literature", - "novel", - "reading", - "story" - ] - }, "bookmark": { "unicode": "1F516", "unicode_alternates": [], @@ -2593,7 +2769,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "favorite" + "favorite", + "object", + "book" ], "moji": "🔖" }, @@ -2606,7 +2784,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "favorite" + "favorite", + "office", + "write" ], "moji": "📑" }, @@ -2620,7 +2800,11 @@ "aliases_ascii": [], "keywords": [ "library", - "literature" + "literature", + "object", + "office", + "write", + "book" ], "moji": "📚" }, @@ -2629,7 +2813,7 @@ "unicode_alternates": [], "name": "collision symbol", "shortname": ":boom:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2642,7 +2826,9 @@ "fire", "emphasis", "wow", - "bam" + "bam", + "symbol", + "blast" ], "moji": "💥" }, @@ -2651,12 +2837,16 @@ "unicode_alternates": [], "name": "womans boots", "shortname": ":boot:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "fashion", - "shoes" + "shoes", + "women", + "shoe", + "sexy", + "accessories" ], "moji": "👢" }, @@ -2670,33 +2860,20 @@ "aliases_ascii": [], "keywords": [ "flowers", - "nature" + "nature", + "flower", + "plant", + "rip", + "condolence" ], "moji": "ðŸ’" }, - "bouquet2": { - "unicode": "1F395", - "unicode_alternates": [], - "name": "bouquet of flowers", - "shortname": ":bouquet2:", - "category": "celebration", - "aliases": [ - ":bouquet_of_flowers:" - ], - "aliases_ascii": [], - "keywords": [ - "nature", - "marriage", - "wedding", - "bride" - ] - }, "bow": { "unicode": "1F647", "unicode_alternates": [], "name": "person bowing deeply", "shortname": ":bow:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2707,13 +2884,16 @@ "bow", "respect", "curtsy", - "bend" + "bend", + "people", + "pray", + "diversity" ], "moji": "🙇" }, "bow_and_arrow": { "unicode": "1F3F9", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bow and arrow", "shortname": ":bow_and_arrow:", "category": "activity", @@ -2721,11 +2901,15 @@ ":archery:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "weapon", + "sport" + ], + "moji": "ðŸ¹" }, "bow_tone1": { "unicode": "1F647-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person bowing deeply tone 1", "shortname": ":bow_tone1:", "category": "people", @@ -2739,11 +2923,12 @@ "bow", "respect", "bend" - ] + ], + "moji": "🙇ðŸ»" }, "bow_tone2": { "unicode": "1F647-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person bowing deeply tone 2", "shortname": ":bow_tone2:", "category": "people", @@ -2757,11 +2942,12 @@ "bow", "respect", "bend" - ] + ], + "moji": "🙇ðŸ¼" }, "bow_tone3": { "unicode": "1F647-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person bowing deeply tone 3", "shortname": ":bow_tone3:", "category": "people", @@ -2775,11 +2961,12 @@ "bow", "respect", "bend" - ] + ], + "moji": "🙇ðŸ½" }, "bow_tone4": { "unicode": "1F647-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person bowing deeply tone 4", "shortname": ":bow_tone4:", "category": "people", @@ -2793,11 +2980,12 @@ "bow", "respect", "bend" - ] + ], + "moji": "🙇ðŸ¾" }, "bow_tone5": { "unicode": "1F647-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person bowing deeply tone 5", "shortname": ":bow_tone5:", "category": "people", @@ -2811,14 +2999,15 @@ "bow", "respect", "bend" - ] + ], + "moji": "🙇ðŸ¿" }, "bowling": { "unicode": "1F3B3", "unicode_alternates": [], "name": "bowling", "shortname": ":bowling:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2831,28 +3020,46 @@ "pin", "strike", "spare", - "game" + "game", + "sport", + "boys night" ], "moji": "🎳" }, + "boxing_glove": { + "unicode": "1F94A", + "unicode_alternates": [], + "name": "boxing glove", + "shortname": ":boxing_glove:", + "category": "activity", + "aliases": [ + ":boxing_gloves:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥊" + }, "boy": { "unicode": "1F466", "unicode_alternates": [], "name": "boy", "shortname": ":boy:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "guy", "male", - "man" + "man", + "people", + "baby", + "diversity" ], "moji": "👦" }, "boy_tone1": { "unicode": "1F466-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "boy tone 1", "shortname": ":boy_tone1:", "category": "people", @@ -2862,11 +3069,12 @@ "male", "kid", "child" - ] + ], + "moji": "👦ðŸ»" }, "boy_tone2": { "unicode": "1F466-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "boy tone 2", "shortname": ":boy_tone2:", "category": "people", @@ -2876,11 +3084,12 @@ "male", "kid", "child" - ] + ], + "moji": "👦ðŸ¼" }, "boy_tone3": { "unicode": "1F466-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "boy tone 3", "shortname": ":boy_tone3:", "category": "people", @@ -2890,11 +3099,12 @@ "male", "kid", "child" - ] + ], + "moji": "👦ðŸ½" }, "boy_tone4": { "unicode": "1F466-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "boy tone 4", "shortname": ":boy_tone4:", "category": "people", @@ -2904,11 +3114,12 @@ "male", "kid", "child" - ] + ], + "moji": "👦ðŸ¾" }, "boy_tone5": { "unicode": "1F466-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "boy tone 5", "shortname": ":boy_tone5:", "category": "people", @@ -2918,27 +3129,15 @@ "male", "kid", "child" - ] - }, - "boys_symbol": { - "unicode": "1F6C9", - "unicode_alternates": [], - "name": "boys symbol", - "shortname": ":boys_symbol:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "male", - "child" - ] + ], + "moji": "👦ðŸ¿" }, "bread": { "unicode": "1F35E", "unicode_alternates": [], "name": "bread", "shortname": ":bread:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2957,7 +3156,7 @@ "unicode_alternates": [], "name": "bride with veil", "shortname": ":bride_with_veil:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -2965,19 +3164,21 @@ "marriage", "wedding", "bride", - "wedding", "planning", "veil", "gown", "dress", "engagement", - "white" + "white", + "people", + "women", + "diversity" ], "moji": "👰" }, "bride_with_veil_tone1": { "unicode": "1F470-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bride with veil tone 1", "shortname": ":bride_with_veil_tone1:", "category": "people", @@ -2987,17 +3188,17 @@ "couple", "marriage", "wedding", - "wedding", "planning", "gown", "dress", "engagement", "white" - ] + ], + "moji": "👰ðŸ»" }, "bride_with_veil_tone2": { "unicode": "1F470-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bride with veil tone 2", "shortname": ":bride_with_veil_tone2:", "category": "people", @@ -3007,17 +3208,17 @@ "couple", "marriage", "wedding", - "wedding", "planning", "gown", "dress", "engagement", "white" - ] + ], + "moji": "👰ðŸ¼" }, "bride_with_veil_tone3": { "unicode": "1F470-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bride with veil tone 3", "shortname": ":bride_with_veil_tone3:", "category": "people", @@ -3027,17 +3228,17 @@ "couple", "marriage", "wedding", - "wedding", "planning", "gown", "dress", "engagement", "white" - ] + ], + "moji": "👰ðŸ½" }, "bride_with_veil_tone4": { "unicode": "1F470-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bride with veil tone 4", "shortname": ":bride_with_veil_tone4:", "category": "people", @@ -3047,17 +3248,17 @@ "couple", "marriage", "wedding", - "wedding", "planning", "gown", "dress", "engagement", "white" - ] + ], + "moji": "👰ðŸ¾" }, "bride_with_veil_tone5": { "unicode": "1F470-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bride with veil tone 5", "shortname": ":bride_with_veil_tone5:", "category": "people", @@ -3067,20 +3268,20 @@ "couple", "marriage", "wedding", - "wedding", "planning", "gown", "dress", "engagement", "white" - ] + ], + "moji": "👰ðŸ¿" }, "bridge_at_night": { "unicode": "1F309", "unicode_alternates": [], "name": "bridge at night", "shortname": ":bridge_at_night:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3093,7 +3294,11 @@ "evening", "suspension", "golden", - "gate" + "gate", + "places", + "travel", + "vacation", + "goodnight" ], "moji": "🌉" }, @@ -3102,13 +3307,17 @@ "unicode_alternates": [], "name": "briefcase", "shortname": ":briefcase:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "business", "documents", - "work" + "work", + "bag", + "accessories", + "nutcase", + "job" ], "moji": "💼" }, @@ -3117,14 +3326,17 @@ "unicode_alternates": [], "name": "broken heart", "shortname": ":broken_heart:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [ "</3" ], "keywords": [ "sad", - "sorry" + "sorry", + "love", + "symbol", + "heartbreak" ], "moji": "💔" }, @@ -3140,9 +3352,10 @@ "insect", "nature", "bug", - "insect", "virus", - "error" + "error", + "insects", + "animal" ], "moji": "ðŸ›" }, @@ -3159,7 +3372,8 @@ "light", "idea", "bulb", - "light" + "object", + "science" ], "moji": "💡" }, @@ -3168,14 +3382,15 @@ "unicode_alternates": [], "name": "high-speed train with bullet nose", "shortname": ":bullettrain_front:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "transportation", "train", "bullet", - "rail" + "rail", + "travel" ], "moji": "🚅" }, @@ -3184,7 +3399,7 @@ "unicode_alternates": [], "name": "high-speed train", "shortname": ":bullettrain_side:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3192,58 +3407,31 @@ "vehicle", "train", "bullet", - "rail" + "rail", + "travel" ], "moji": "🚄" }, - "bullhorn": { - "unicode": "1F56B", + "burrito": { + "unicode": "1F32F", "unicode_alternates": [], - "name": "bullhorn", - "shortname": ":bullhorn:", - "category": "objects_symbols", + "name": "burrito", + "shortname": ":burrito:", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ - "sound", - "noise", - "announcement", - "megaphone" - ] + "food", + "mexican" + ], + "moji": "🌯" }, - "bullhorn_waves": { - "unicode": "1F56C", - "unicode_alternates": [], - "name": "bullhorn with sound waves", - "shortname": ":bullhorn_waves:", - "category": "objects_symbols", - "aliases": [ - ":bullhorn_with_sound_waves:" - ], - "aliases_ascii": [], - "keywords": [ - "sound", - "noise", - "announcement", - "megaphone" - ] - }, - "burrito": { - "unicode": "1F32F", - "unicode_alternates": "", - "name": "burrito", - "shortname": ":burrito:", - "category": "foods", - "aliases": [], - "aliases_ascii": [], - "keywords": [] - }, - "bus": { - "unicode": "1F68C", + "bus": { + "unicode": "1F68C", "unicode_alternates": [], "name": "bus", "shortname": ":bus:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3253,8 +3441,8 @@ "bus", "school", "city", - "transportation", - "public" + "public", + "office" ], "moji": "🚌" }, @@ -3263,7 +3451,7 @@ "unicode_alternates": [], "name": "bus stop", "shortname": ":busstop:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3272,7 +3460,7 @@ "stop", "city", "transport", - "transportation" + "object" ], "moji": "ðŸš" }, @@ -3281,7 +3469,7 @@ "unicode_alternates": [], "name": "bust in silhouette", "shortname": ":bust_in_silhouette:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3290,8 +3478,6 @@ "person", "user", "silhouette", - "person", - "user", "member", "account", "guest", @@ -3300,7 +3486,8 @@ "profile", "me", "myself", - "i" + "i", + "people" ], "moji": "👤" }, @@ -3309,7 +3496,7 @@ "unicode_alternates": [], "name": "busts in silhouette", "shortname": ":busts_in_silhouette:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3322,7 +3509,6 @@ "silhouette", "silhouettes", "people", - "user", "members", "accounts", "relationship", @@ -3330,6 +3516,17 @@ ], "moji": "👥" }, + "butterfly": { + "unicode": "1F98B", + "unicode_alternates": [], + "name": "butterfly", + "shortname": ":butterfly:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦋" + }, "cactus": { "unicode": "1F335", "unicode_alternates": [], @@ -3346,7 +3543,8 @@ "desert", "drought", "spike", - "poke" + "poke", + "trees" ], "moji": "🌵" }, @@ -3355,7 +3553,7 @@ "unicode_alternates": [], "name": "shortcake", "shortname": ":cake:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3368,24 +3566,6 @@ ], "moji": "ðŸ°" }, - "calculator": { - "unicode": "1F5A9", - "unicode_alternates": [], - "name": "pocket calculator", - "shortname": ":calculator:", - "category": "objects_symbols", - "aliases": [ - ":pocket calculator:" - ], - "aliases_ascii": [], - "keywords": [ - "add", - "subtract", - "multiple", - "divide", - "scientific" - ] - }, "calendar": { "unicode": "1F4C6", "unicode_alternates": [], @@ -3395,7 +3575,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "schedule" + "schedule", + "object", + "office" ], "moji": "📆" }, @@ -3404,7 +3586,7 @@ "unicode_alternates": [], "name": "spiral calendar pad", "shortname": ":calendar_spiral:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":spiral_calendar_pad:" ], @@ -3412,8 +3594,89 @@ "keywords": [ "schedule", "date", - "day" - ] + "day", + "object", + "office" + ], + "moji": "🗓" + }, + "call_me": { + "unicode": "1F919", + "unicode_alternates": [], + "name": "call me hand", + "shortname": ":call_me:", + "category": "people", + "aliases": [ + ":call_me_hand:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙" + }, + "call_me_tone1": { + "unicode": "1F919-1F3FB", + "unicode_alternates": [], + "name": "call me hand tone 1", + "shortname": ":call_me_tone1:", + "category": "people", + "aliases": [ + ":call_me_hand_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙ðŸ»" + }, + "call_me_tone2": { + "unicode": "1F919-1F3FC", + "unicode_alternates": [], + "name": "call me hand tone 2", + "shortname": ":call_me_tone2:", + "category": "people", + "aliases": [ + ":call_me_hand_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙ðŸ¼" + }, + "call_me_tone3": { + "unicode": "1F919-1F3FD", + "unicode_alternates": [], + "name": "call me hand tone 3", + "shortname": ":call_me_tone3:", + "category": "people", + "aliases": [ + ":call_me_hand_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙ðŸ½" + }, + "call_me_tone4": { + "unicode": "1F919-1F3FE", + "unicode_alternates": [], + "name": "call me hand tone 4", + "shortname": ":call_me_tone4:", + "category": "people", + "aliases": [ + ":call_me_hand_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙ðŸ¾" + }, + "call_me_tone5": { + "unicode": "1F919-1F3FF", + "unicode_alternates": [], + "name": "call me hand tone 5", + "shortname": ":call_me_tone5:", + "category": "people", + "aliases": [ + ":call_me_hand_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤙ðŸ¿" }, "calling": { "unicode": "1F4F2", @@ -3425,7 +3688,10 @@ "aliases_ascii": [], "keywords": [ "incoming", - "iphone" + "iphone", + "electronics", + "phone", + "selfie" ], "moji": "📲" }, @@ -3447,11 +3713,11 @@ "desert", "central asia", "heat", - "hot", "water", "hump day", "wednesday", - "sex" + "sex", + "wildlife" ], "moji": "ðŸ«" }, @@ -3465,7 +3731,10 @@ "aliases_ascii": [], "keywords": [ "gadgets", - "photo" + "photo", + "electronics", + "camera", + "selfie" ], "moji": "📷" }, @@ -3474,20 +3743,23 @@ "unicode_alternates": [], "name": "camera with flash", "shortname": ":camera_with_flash:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "photo", - "picture" - ] + "picture", + "electronics", + "camera" + ], + "moji": "📸" }, "camping": { "unicode": "1F3D5", "unicode_alternates": [], "name": "camping", "shortname": ":camping:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3495,22 +3767,13 @@ "nature", "wilderness", "roughing", - "activity" - ] - }, - "cancellation_x": { - "unicode": "1F5D9", - "unicode_alternates": [], - "name": "cancellation x", - "shortname": ":cancellation_x:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "cancel", - "stop", - "delete" - ] + "activity", + "places", + "travel", + "vacation", + "camp" + ], + "moji": "ðŸ•" }, "cancer": { "unicode": "264B", @@ -3519,7 +3782,7 @@ ], "name": "cancer", "shortname": ":cancer:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3531,9 +3794,8 @@ "stars", "zodiac", "sign", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♋" }, @@ -3542,20 +3804,22 @@ "unicode_alternates": [], "name": "candle", "shortname": ":candle:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "light", - "wax" - ] + "wax", + "object" + ], + "moji": "🕯" }, "candy": { "unicode": "1F36C", "unicode_alternates": [], "name": "candy", "shortname": ":candy:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3564,22 +3828,38 @@ "candy", "sugar", "sweet", - "hard" + "hard", + "food", + "halloween" ], "moji": "ðŸ¬" }, + "canoe": { + "unicode": "1F6F6", + "unicode_alternates": [], + "name": "canoe", + "shortname": ":canoe:", + "category": "travel", + "aliases": [ + ":kayak:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🛶" + }, "capital_abcd": { "unicode": "1F520", "unicode_alternates": [], "name": "input symbol for latin capital letters", "shortname": ":capital_abcd:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", "blue-square", - "words" + "words", + "symbol" ], "moji": "🔠" }, @@ -3590,7 +3870,7 @@ ], "name": "capricorn", "shortname": ":capricorn:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3603,9 +3883,8 @@ "stars", "zodiac", "sign", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♑" }, @@ -3614,15 +3893,19 @@ "unicode_alternates": [], "name": "card file box", "shortname": ":card_box:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":card_file_box:" ], "aliases_ascii": [], "keywords": [ "index", - "organization" - ] + "organization", + "object", + "work", + "office" + ], + "moji": "🗃" }, "card_index": { "unicode": "1F4C7", @@ -3634,7 +3917,10 @@ "aliases_ascii": [], "keywords": [ "business", - "stationery" + "stationery", + "object", + "work", + "office" ], "moji": "📇" }, @@ -3643,7 +3929,7 @@ "unicode_alternates": [], "name": "carousel horse", "shortname": ":carousel_horse:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3651,37 +3937,106 @@ "horse", "photo", "carousel", - "horse", "amusement", "park", "ride", "entertainment", - "park", - "fair" + "fair", + "places", + "object", + "vacation", + "roller coaster" ], "moji": "🎠" }, - "cartridge": { - "unicode": "1F5AD", + "carrot": { + "unicode": "1F955", "unicode_alternates": [], - "name": "tape cartridge", - "shortname": ":cartridge:", - "category": "objects_symbols", + "name": "carrot", + "shortname": ":carrot:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🥕" + }, + "cartwheel": { + "unicode": "1F938", + "unicode_alternates": [], + "name": "person doing cartwheel", + "shortname": ":cartwheel:", + "category": "activity", "aliases": [ - ":tape_cartridge:" + ":person_doing_cartwheel:" ], "aliases_ascii": [], - "keywords": [ - "oldschool", - "save", - "technology", - "disk", - "storage", - "information", - "computer", - "drive", - "megabyte" - ] + "keywords": [], + "moji": "🤸" + }, + "cartwheel_tone1": { + "unicode": "1F938-1F3FB", + "unicode_alternates": [], + "name": "person doing cartwheel tone 1", + "shortname": ":cartwheel_tone1:", + "category": "activity", + "aliases": [ + ":person_doing_cartwheel_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤸ðŸ»" + }, + "cartwheel_tone2": { + "unicode": "1F938-1F3FC", + "unicode_alternates": [], + "name": "person doing cartwheel tone 2", + "shortname": ":cartwheel_tone2:", + "category": "activity", + "aliases": [ + ":person_doing_cartwheel_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤸ðŸ¼" + }, + "cartwheel_tone3": { + "unicode": "1F938-1F3FD", + "unicode_alternates": [], + "name": "person doing cartwheel tone 3", + "shortname": ":cartwheel_tone3:", + "category": "activity", + "aliases": [ + ":person_doing_cartwheel_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤸ðŸ½" + }, + "cartwheel_tone4": { + "unicode": "1F938-1F3FE", + "unicode_alternates": [], + "name": "person doing cartwheel tone 4", + "shortname": ":cartwheel_tone4:", + "category": "activity", + "aliases": [ + ":person_doing_cartwheel_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤸ðŸ¾," + }, + "cartwheel_tone5": { + "unicode": "1F938-1F3FF", + "unicode_alternates": [], + "name": "person doing cartwheel tone 5", + "shortname": ":cartwheel_tone5:", + "category": "activity", + "aliases": [ + ":person_doing_cartwheel_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤸ðŸ¿" }, "cat": { "unicode": "1F431", @@ -3693,7 +4048,10 @@ "aliases_ascii": [], "keywords": [ "animal", - "meow" + "meow", + "halloween", + "vagina", + "cat" ], "moji": "ðŸ±" }, @@ -3711,13 +4069,13 @@ "pet", "cat", "kitten", - "meow" + "halloween" ], "moji": "ðŸˆ" }, "cd": { "unicode": "1F4BF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "optical disc", "shortname": ":cd:", "category": "objects", @@ -3732,25 +4090,14 @@ "cd", "computer", "object", - "office" - ] - }, - "celtic_cross": { - "unicode": "1F548", - "unicode_alternates": [], - "name": "celtic cross", - "shortname": ":celtic_cross:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "religion", - "symbol" - ] + "office", + "electronics" + ], + "moji": "💿" }, "chains": { "unicode": "26D3", - "unicode_alternates": "", + "unicode_alternates": [], "name": "chains", "shortname": ":chains:", "category": "objects", @@ -3758,32 +4105,55 @@ "aliases_ascii": [], "keywords": [ "chain", - "object" - ] + "object", + "tool" + ], + "moji": "⛓" }, "champagne": { "unicode": "1F37E", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bottle with popping cork", "shortname": ":champagne:", - "category": "foods", + "category": "food", "aliases": [ ":bottle_with_popping_cork:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "drink", + "cheers", + "alcohol", + "parties" + ], + "moji": "ðŸ¾" + }, + "champagne_glass": { + "unicode": "1F942", + "unicode_alternates": [], + "name": "clinking glasses", + "shortname": ":champagne_glass:", + "category": "food", + "aliases": [ + ":clinking_glass:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥂" }, "chart": { "unicode": "1F4B9", "unicode_alternates": [], "name": "chart with upwards trend and yen sign", "shortname": ":chart:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "graph", - "green-square" + "green-square", + "symbol", + "money" ], "moji": "💹" }, @@ -3796,7 +4166,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "graph" + "graph", + "work", + "office" ], "moji": "📉" }, @@ -3809,7 +4181,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "graph" + "graph", + "work", + "office" ], "moji": "📈" }, @@ -3818,7 +4192,7 @@ "unicode_alternates": [], "name": "chequered flag", "shortname": ":checkered_flag:", - "category": "objects", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3832,28 +4206,32 @@ "flag", "finish", "complete", - "end" + "end", + "object" ], "moji": "ðŸ" }, "cheese": { "unicode": "1F9C0", - "unicode_alternates": "", + "unicode_alternates": [], "name": "cheese wedge", "shortname": ":cheese:", - "category": "foods", + "category": "food", "aliases": [ ":cheese_wedge:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "food" + ], + "moji": "🧀" }, "cherries": { "unicode": "1F352", "unicode_alternates": [], "name": "cherries", "shortname": ":cherries:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3862,7 +4240,6 @@ "cherry", "cherries", "tree", - "fruit", "pit" ], "moji": "ðŸ’" @@ -3882,7 +4259,7 @@ "cherry", "blossom", "tree", - "flower" + "tropical" ], "moji": "🌸" }, @@ -3899,8 +4276,9 @@ "squirrel", "chestnut", "roasted", - "food", - "tree" + "tree", + "nature", + "plant" ], "moji": "🌰" }, @@ -3927,7 +4305,7 @@ "unicode_alternates": [], "name": "children crossing", "shortname": ":children_crossing:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3938,7 +4316,8 @@ "crossing", "street", "crosswalk", - "slow" + "slow", + "symbol" ], "moji": "🚸" }, @@ -3952,15 +4331,17 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" - ] + "nature", + "wildlife" + ], + "moji": "ðŸ¿" }, "chocolate_bar": { "unicode": "1F36B", "unicode_alternates": [], "name": "chocolate bar", "shortname": ":chocolate_bar:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3971,7 +4352,8 @@ "bar", "candy", "coca", - "hershey's" + "hershey's", + "halloween" ], "moji": "ðŸ«" }, @@ -3980,7 +4362,7 @@ "unicode_alternates": [], "name": "christmas tree", "shortname": ":christmas_tree:", - "category": "objects", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -3990,17 +4372,17 @@ "vacation", "xmas", "christmas", - "xmas", "santa", "holiday", "winter", - "december", - "santa", "evergreen", "ornaments", "jesus", "gifts", - "presents" + "presents", + "plant", + "holidays", + "trees" ], "moji": "🎄" }, @@ -4011,13 +4393,16 @@ ], "name": "church", "shortname": ":church:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "building", "christ", - "religion" + "religion", + "places", + "wedding", + "condolence" ], "moji": "⛪" }, @@ -4026,7 +4411,7 @@ "unicode_alternates": [], "name": "cinema", "shortname": ":cinema:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4035,10 +4420,11 @@ "movie", "record", "cinema", - "movie", "theater", "motion", - "picture" + "picture", + "symbol", + "camera" ], "moji": "🎦" }, @@ -4047,7 +4433,7 @@ "unicode_alternates": [], "name": "circus tent", "shortname": ":circus_tent:", - "category": "places", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4057,10 +4443,10 @@ "circus", "tent", "event", - "carnival", "big", "top", - "canvas" + "canvas", + "circus tent" ], "moji": "🎪" }, @@ -4069,7 +4455,7 @@ "unicode_alternates": [], "name": "cityscape at dusk", "shortname": ":city_dusk:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4082,7 +4468,9 @@ "evening", "metropolitan", "night", - "dark" + "dark", + "places", + "building" ], "moji": "🌆" }, @@ -4091,7 +4479,7 @@ "unicode_alternates": [], "name": "sunset over buildings", "shortname": ":city_sunset:", - "category": "places", + "category": "travel", "aliases": [ ":city_sunrise:" ], @@ -4106,7 +4494,11 @@ "morning", "metropolitan", "rise", - "sun" + "sun", + "places", + "building", + "sky", + "vacation" ], "moji": "🌇" }, @@ -4115,7 +4507,7 @@ "unicode_alternates": [], "name": "cityscape", "shortname": ":cityscape:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4124,12 +4516,16 @@ "view", "lights", "buiildings", - "metropolis" - ] + "metropolis", + "places", + "building", + "vacation" + ], + "moji": "ðŸ™" }, "cl": { "unicode": "1F191", - "unicode_alternates": "", + "unicode_alternates": [], "name": "squared cl", "shortname": ":cl:", "category": "symbols", @@ -4143,14 +4539,15 @@ "clear", "symbol", "word" - ] + ], + "moji": "🆑" }, "clap": { "unicode": "1F44F", "unicode_alternates": [], "name": "clapping hands sign", "shortname": ":clap:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4163,13 +4560,18 @@ "approval", "sound", "encouragement", - "enthusiasm" + "enthusiasm", + "body", + "win", + "diversity", + "good", + "beautiful" ], "moji": "ðŸ‘" }, "clap_tone1": { "unicode": "1F44F-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "clapping hands sign tone 1", "shortname": ":clap_tone1:", "category": "people", @@ -4185,11 +4587,12 @@ "sound", "encouragement", "enthusiasm" - ] + ], + "moji": "ðŸ‘ðŸ»" }, "clap_tone2": { "unicode": "1F44F-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "clapping hands sign tone 2", "shortname": ":clap_tone2:", "category": "people", @@ -4205,11 +4608,12 @@ "sound", "encouragement", "enthusiasm" - ] + ], + "moji": "ðŸ‘ðŸ¼" }, "clap_tone3": { "unicode": "1F44F-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "clapping hands sign tone 3", "shortname": ":clap_tone3:", "category": "people", @@ -4225,11 +4629,12 @@ "sound", "encouragement", "enthusiasm" - ] + ], + "moji": "ðŸ‘ðŸ½" }, "clap_tone4": { "unicode": "1F44F-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "clapping hands sign tone 4", "shortname": ":clap_tone4:", "category": "people", @@ -4245,11 +4650,12 @@ "sound", "encouragement", "enthusiasm" - ] + ], + "moji": "ðŸ‘ðŸ¾" }, "clap_tone5": { "unicode": "1F44F-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "clapping hands sign tone 5", "shortname": ":clap_tone5:", "category": "people", @@ -4265,14 +4671,15 @@ "sound", "encouragement", "enthusiasm" - ] + ], + "moji": "ðŸ‘ðŸ¿" }, "clapper": { "unicode": "1F3AC", "unicode_alternates": [], "name": "clapper board", "shortname": ":clapper:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4282,8 +4689,6 @@ "clapper", "board", "clapboard", - "movie", - "film", "take" ], "moji": "🎬" @@ -4293,7 +4698,7 @@ "unicode_alternates": [], "name": "classical building", "shortname": ":classical_building:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4301,8 +4706,13 @@ "architecture", "history", "iconic", - "genre" - ] + "genre", + "places", + "building", + "travel", + "vacation" + ], + "moji": "ðŸ›" }, "clipboard": { "unicode": "1F4CB", @@ -4314,7 +4724,11 @@ "aliases_ascii": [], "keywords": [ "documents", - "stationery" + "stationery", + "object", + "work", + "office", + "write" ], "moji": "📋" }, @@ -4323,26 +4737,29 @@ "unicode_alternates": [], "name": "mantlepiece clock", "shortname": ":clock:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":mantlepiece_clock:" ], "aliases_ascii": [], "keywords": [ - "time" - ] + "time", + "object" + ], + "moji": "🕰" }, "clock1": { "unicode": "1F550", "unicode_alternates": [], "name": "clock face one oclock", "shortname": ":clock1:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "ðŸ•" }, @@ -4351,12 +4768,13 @@ "unicode_alternates": [], "name": "clock face ten oclock", "shortname": ":clock10:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕙" }, @@ -4365,12 +4783,13 @@ "unicode_alternates": [], "name": "clock face ten-thirty", "shortname": ":clock1030:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕥" }, @@ -4379,12 +4798,13 @@ "unicode_alternates": [], "name": "clock face eleven oclock", "shortname": ":clock11:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕚" }, @@ -4393,12 +4813,13 @@ "unicode_alternates": [], "name": "clock face eleven-thirty", "shortname": ":clock1130:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕦" }, @@ -4407,12 +4828,13 @@ "unicode_alternates": [], "name": "clock face twelve oclock", "shortname": ":clock12:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕛" }, @@ -4421,25 +4843,28 @@ "unicode_alternates": [], "name": "clock face twelve-thirty", "shortname": ":clock1230:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" - ] + "time", + "symbol" + ], + "moji": "🕧" }, "clock130": { "unicode": "1F55C", "unicode_alternates": [], "name": "clock face one-thirty", "shortname": ":clock130:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕜" }, @@ -4448,12 +4873,13 @@ "unicode_alternates": [], "name": "clock face two oclock", "shortname": ":clock2:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕑" }, @@ -4462,12 +4888,13 @@ "unicode_alternates": [], "name": "clock face two-thirty", "shortname": ":clock230:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "ðŸ•" }, @@ -4476,12 +4903,13 @@ "unicode_alternates": [], "name": "clock face three oclock", "shortname": ":clock3:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕒" }, @@ -4490,12 +4918,13 @@ "unicode_alternates": [], "name": "clock face three-thirty", "shortname": ":clock330:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕞" }, @@ -4504,12 +4933,13 @@ "unicode_alternates": [], "name": "clock face four oclock", "shortname": ":clock4:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕓" }, @@ -4518,12 +4948,13 @@ "unicode_alternates": [], "name": "clock face four-thirty", "shortname": ":clock430:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕟" }, @@ -4532,12 +4963,13 @@ "unicode_alternates": [], "name": "clock face five oclock", "shortname": ":clock5:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕔" }, @@ -4546,12 +4978,13 @@ "unicode_alternates": [], "name": "clock face five-thirty", "shortname": ":clock530:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕠" }, @@ -4560,12 +4993,13 @@ "unicode_alternates": [], "name": "clock face six oclock", "shortname": ":clock6:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕕" }, @@ -4574,12 +5008,13 @@ "unicode_alternates": [], "name": "clock face six-thirty", "shortname": ":clock630:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕡" }, @@ -4588,12 +5023,13 @@ "unicode_alternates": [], "name": "clock face seven oclock", "shortname": ":clock7:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕖" }, @@ -4602,12 +5038,13 @@ "unicode_alternates": [], "name": "clock face seven-thirty", "shortname": ":clock730:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕢" }, @@ -4616,12 +5053,13 @@ "unicode_alternates": [], "name": "clock face eight oclock", "shortname": ":clock8:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕗" }, @@ -4630,12 +5068,13 @@ "unicode_alternates": [], "name": "clock face eight-thirty", "shortname": ":clock830:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕣" }, @@ -4644,12 +5083,13 @@ "unicode_alternates": [], "name": "clock face nine oclock", "shortname": ":clock9:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕘" }, @@ -4658,29 +5098,16 @@ "unicode_alternates": [], "name": "clock face nine-thirty", "shortname": ":clock930:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "clock", - "time" + "time", + "symbol" ], "moji": "🕤" }, - "clockwise_arrows": { - "unicode": "1F5D8", - "unicode_alternates": [], - "name": "clockwise right and left semicircle arrows", - "shortname": ":clockwise_arrows:", - "category": "objects_symbols", - "aliases": [ - ":clockwise_right_and_left_semicircle_arrows:" - ], - "aliases_ascii": [], - "keywords": [ - "sync" - ] - }, "closed_book": { "unicode": "1F4D5", "unicode_alternates": [], @@ -4692,7 +5119,11 @@ "keywords": [ "knowledge", "library", - "read" + "read", + "object", + "office", + "write", + "book" ], "moji": "📕" }, @@ -4706,7 +5137,9 @@ "aliases_ascii": [], "keywords": [ "privacy", - "security" + "security", + "object", + "lock" ], "moji": "ðŸ”" }, @@ -4715,7 +5148,7 @@ "unicode_alternates": [], "name": "closed umbrella", "shortname": ":closed_umbrella:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4724,12 +5157,14 @@ "weather", "umbrella", "closed", - "rain", "moisture", "protection", "sun", "ultraviolet", - "uv" + "uv", + "object", + "sky", + "accessories" ], "moji": "🌂" }, @@ -4745,7 +5180,10 @@ "aliases_ascii": [], "keywords": [ "sky", - "weather" + "weather", + "cloud", + "cold", + "rain" ], "moji": "â˜" }, @@ -4761,8 +5199,13 @@ "aliases_ascii": [], "keywords": [ "weather", - "thunder" - ] + "thunder", + "sky", + "cloud", + "cold", + "rain" + ], + "moji": "🌩" }, "cloud_rain": { "unicode": "1F327", @@ -4776,8 +5219,14 @@ "aliases_ascii": [], "keywords": [ "weather", - "wet" - ] + "wet", + "winter", + "sky", + "cloud", + "cold", + "rain" + ], + "moji": "🌧" }, "cloud_snow": { "unicode": "1F328", @@ -4791,8 +5240,13 @@ "aliases_ascii": [], "keywords": [ "weather", - "cold" - ] + "cold", + "winter", + "sky", + "cloud", + "snow" + ], + "moji": "🌨" }, "cloud_tornado": { "unicode": "1F32A", @@ -4807,8 +5261,24 @@ "keywords": [ "weather", "destruction", - "funnel" - ] + "funnel", + "sky", + "cold" + ], + "moji": "🌪" + }, + "clown": { + "unicode": "1F921", + "unicode_alternates": [], + "name": "clown face", + "shortname": ":clown:", + "category": "people", + "aliases": [ + ":clown_face:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤡" }, "clubs": { "unicode": "2663", @@ -4817,12 +5287,14 @@ ], "name": "black club suit", "shortname": ":clubs:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "cards", - "poker" + "poker", + "symbol", + "game" ], "moji": "♣" }, @@ -4831,7 +5303,7 @@ "unicode_alternates": [], "name": "cocktail glass", "shortname": ":cocktail:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4841,11 +5313,11 @@ "drunk", "cocktail", "mixed", - "drink", - "alcohol", "glass", "martini", - "bar" + "bar", + "girls night", + "parties" ], "moji": "ðŸ¸" }, @@ -4856,20 +5328,23 @@ ], "name": "hot beverage", "shortname": ":coffee:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ "beverage", "cafe", "drink", - "espresso" + "espresso", + "caffeine", + "steam", + "morning" ], "moji": "☕" }, "coffin": { "unicode": "26B0", - "unicode_alternates": "", + "unicode_alternates": [], "name": "coffin", "shortname": ":coffin:", "category": "objects", @@ -4877,15 +5352,18 @@ "aliases_ascii": [], "keywords": [ "death", - "object" - ] + "object", + "dead", + "rip" + ], + "moji": "âš°" }, "cold_sweat": { "unicode": "1F630", "unicode_alternates": [], "name": "face with open mouth and cold sweat", "shortname": ":cold_sweat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4893,13 +5371,15 @@ "nervous", "sweat", "exasperated", - "frustrated" + "frustrated", + "smiley", + "emotion" ], "moji": "😰" }, "comet": { "unicode": "2604", - "unicode_alternates": "", + "unicode_alternates": [], "name": "comet", "shortname": ":comet:", "category": "nature", @@ -4907,20 +5387,23 @@ "aliases_ascii": [], "keywords": [ "object", - "space" - ] + "space", + "sky" + ], + "moji": "☄" }, "compression": { "unicode": "1F5DC", "unicode_alternates": [], "name": "compression", "shortname": ":compression:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "reduce" - ] + ], + "moji": "🗜" }, "computer": { "unicode": "1F4BB", @@ -4932,25 +5415,13 @@ "aliases_ascii": [], "keywords": [ "laptop", - "tech" + "tech", + "electronics", + "work", + "office" ], "moji": "💻" }, - "computer_old": { - "unicode": "1F5B3", - "unicode_alternates": [], - "name": "old personal computer", - "shortname": ":computer_old:", - "category": "objects_symbols", - "aliases": [ - ":old_personal_computer:" - ], - "aliases_ascii": [], - "keywords": [ - "cpu", - "terminal" - ] - }, "confetti_ball": { "unicode": "1F38A", "unicode_alternates": [], @@ -4962,7 +5433,6 @@ "keywords": [ "festival", "party", - "party", "congratulations", "confetti", "ball", @@ -4970,7 +5440,13 @@ "win", "birthday", "new years", - "wedding" + "wedding", + "object", + "holidays", + "cheers", + "girls night", + "boys night", + "parties" ], "moji": "🎊" }, @@ -4979,7 +5455,7 @@ "unicode_alternates": [], "name": "confounded face", "shortname": ":confounded:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -4991,7 +5467,11 @@ "amaze", "perplex", "puzzle", - "mystify" + "mystify", + "sad", + "smiley", + "angry", + "emotion" ], "moji": "😖" }, @@ -5000,7 +5480,7 @@ "unicode_alternates": [], "name": "confused face", "shortname": ":confused:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ">:\\", @@ -5024,7 +5504,10 @@ "skeptical", "undecided", "uneasy", - "hesitant" + "hesitant", + "smiley", + "surprised", + "emotion" ], "moji": "😕" }, @@ -5035,13 +5518,15 @@ ], "name": "circled ideograph congratulation", "shortname": ":congratulations:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "japanese", - "kanji" + "kanji", + "japan", + "symbol" ], "moji": "㊗" }, @@ -5050,19 +5535,20 @@ "unicode_alternates": [], "name": "construction sign", "shortname": ":construction:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "caution", "progress", - "wip" + "wip", + "object" ], "moji": "🚧" }, "construction_site": { "unicode": "1F3D7", - "unicode_alternates": "", + "unicode_alternates": [], "name": "building construction", "shortname": ":construction_site:", "category": "travel", @@ -5073,28 +5559,36 @@ "keywords": [ "site", "work", - "place" - ] + "place", + "building", + "crane" + ], + "moji": "ðŸ—" }, "construction_worker": { "unicode": "1F477", "unicode_alternates": [], "name": "construction worker", "shortname": ":construction_worker:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "human", "male", "man", - "wip" + "wip", + "people", + "hat", + "men", + "diversity", + "job" ], "moji": "👷" }, "construction_worker_tone1": { "unicode": "1F477-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "construction worker tone 1", "shortname": ":construction_worker_tone1:", "category": "people", @@ -5105,11 +5599,12 @@ "male", "man", "wip" - ] + ], + "moji": "👷ðŸ»" }, "construction_worker_tone2": { "unicode": "1F477-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "construction worker tone 2", "shortname": ":construction_worker_tone2:", "category": "people", @@ -5120,11 +5615,12 @@ "male", "man", "wip" - ] + ], + "moji": "👷ðŸ¼" }, "construction_worker_tone3": { "unicode": "1F477-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "construction worker tone 3", "shortname": ":construction_worker_tone3:", "category": "people", @@ -5135,11 +5631,12 @@ "male", "man", "wip" - ] + ], + "moji": "👷ðŸ½" }, "construction_worker_tone4": { "unicode": "1F477-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "construction worker tone 4", "shortname": ":construction_worker_tone4:", "category": "people", @@ -5150,11 +5647,12 @@ "male", "man", "wip" - ] + ], + "moji": "👷ðŸ¾" }, "construction_worker_tone5": { "unicode": "1F477-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "construction worker tone 5", "shortname": ":construction_worker_tone5:", "category": "people", @@ -5165,45 +5663,34 @@ "male", "man", "wip" - ] + ], + "moji": "👷ðŸ¿" }, "control_knobs": { "unicode": "1F39B", "unicode_alternates": [], "name": "control knobs", "shortname": ":control_knobs:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ - "dial" - ] - }, - "contruction_site": { - "unicode": "1F3D7", - "unicode_alternates": [], - "name": "building construction", - "shortname": ":contruction_site:", - "category": "travel_places", - "aliases": [ - ":building_construction:" + "dial", + "time" ], - "aliases_ascii": [], - "keywords": [ - "site", - "work" - ] + "moji": "🎛" }, "convenience_store": { "unicode": "1F3EA", "unicode_alternates": [], "name": "convenience store", "shortname": ":convenience_store:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "building" + "building", + "places" ], "moji": "ðŸª" }, @@ -5212,7 +5699,7 @@ "unicode_alternates": [], "name": "cookie", "shortname": ":cookie:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5224,21 +5711,44 @@ "dessert", "biscuit", "sweet", - "chocolate" + "vagina" ], "moji": "ðŸª" }, + "cooking": { + "unicode": "1F373", + "unicode_alternates": [], + "name": "cooking", + "shortname": ":cooking:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "breakfast", + "food", + "egg", + "fry", + "pan", + "flat", + "cook", + "frying", + "cooking", + "utensil" + ], + "moji": "ðŸ³" + }, "cool": { "unicode": "1F192", "unicode_alternates": [], "name": "squared cool", "shortname": ":cool:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "words" + "words", + "symbol" ], "moji": "🆒" }, @@ -5247,7 +5757,7 @@ "unicode_alternates": [], "name": "police officer", "shortname": ":cop:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5255,13 +5765,19 @@ "enforcement", "law", "man", - "police" + "police", + "people", + "hat", + "men", + "diversity", + "job", + "911" ], "moji": "👮" }, "cop_tone1": { "unicode": "1F46E-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "police officer tone 1", "shortname": ":cop_tone1:", "category": "people", @@ -5273,11 +5789,12 @@ "law", "man", "cop" - ] + ], + "moji": "👮ðŸ»" }, "cop_tone2": { "unicode": "1F46E-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "police officer tone 2", "shortname": ":cop_tone2:", "category": "people", @@ -5289,11 +5806,12 @@ "law", "man", "cop" - ] + ], + "moji": "👮ðŸ¼" }, "cop_tone3": { "unicode": "1F46E-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "police officer tone 3", "shortname": ":cop_tone3:", "category": "people", @@ -5305,11 +5823,12 @@ "law", "man", "cop" - ] + ], + "moji": "👮ðŸ½" }, "cop_tone4": { "unicode": "1F46E-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "police officer tone 4", "shortname": ":cop_tone4:", "category": "people", @@ -5321,11 +5840,12 @@ "law", "man", "cop" - ] + ], + "moji": "👮ðŸ¾" }, "cop_tone5": { "unicode": "1F46E-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "police officer tone 5", "shortname": ":cop_tone5:", "category": "people", @@ -5337,7 +5857,8 @@ "law", "man", "cop" - ] + ], + "moji": "👮ðŸ¿" }, "copyright": { "moji": "©", @@ -5345,12 +5866,13 @@ "unicode_alternates": [], "name": "copyright sign", "shortname": ":copyright:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "ip", - "license" + "license", + "symbol" ] }, "corn": { @@ -5358,7 +5880,7 @@ "unicode_alternates": [], "name": "ear of maize", "shortname": ":corn:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5367,7 +5889,6 @@ "vegetable", "corn", "maize", - "food", "iowa", "kernel", "popcorn", @@ -5375,7 +5896,8 @@ "yellow", "stalk", "cob", - "ear" + "ear", + "vegetables" ], "moji": "🌽" }, @@ -5384,7 +5906,7 @@ "unicode_alternates": [], "name": "couch and lamp", "shortname": ":couch:", - "category": "travel_places", + "category": "objects", "aliases": [ ":couch_and_lamp:" ], @@ -5397,15 +5919,17 @@ "leather", "microfiber", "sit", - "relax" - ] + "relax", + "object" + ], + "moji": "🛋" }, "couple": { "unicode": "1F46B", "unicode_alternates": [], "name": "man and woman holding hands", "shortname": ":couple:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5417,7 +5941,9 @@ "love", "marriage", "people", - "valentines" + "valentines", + "sex", + "creationism" ], "moji": "👫" }, @@ -5440,15 +5966,21 @@ "like", "love", "marriage", - "valentines" - ] + "valentines", + "people", + "gay", + "men", + "sex", + "lgbt" + ], + "moji": "👨â€â¤ï¸â€ðŸ‘¨" }, "couple_with_heart": { "unicode": "1F491", "unicode_alternates": [], "name": "couple with heart", "shortname": ":couple_with_heart:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5458,7 +5990,9 @@ "like", "love", "marriage", - "valentines" + "valentines", + "people", + "sex" ], "moji": "💑" }, @@ -5481,15 +6015,20 @@ "like", "love", "marriage", - "valentines" - ] + "valentines", + "people", + "women", + "sex", + "lgbt" + ], + "moji": "👩â€â¤ï¸â€ðŸ‘©" }, "couplekiss": { "unicode": "1F48F", "unicode_alternates": [], "name": "kiss", "shortname": ":couplekiss:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5497,7 +6036,9 @@ "like", "love", "marriage", - "valentines" + "valentines", + "people", + "sex" ], "moji": "ðŸ’" }, @@ -5532,28 +6073,44 @@ "cow", "milk", "dairy", - "beef", "bessie", "moo" ], "moji": "ðŸ„" }, + "cowboy": { + "unicode": "1F920", + "unicode_alternates": [], + "name": "face with cowboy hat", + "shortname": ":cowboy:", + "category": "people", + "aliases": [ + ":face_with_cowboy_hat:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤠" + }, "crab": { "unicode": "1F980", - "unicode_alternates": "", + "unicode_alternates": [], "name": "crab", "shortname": ":crab:", "category": "nature", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "tropical", + "animal" + ], + "moji": "🦀" }, "crayon": { "unicode": "1F58D", "unicode_alternates": [], "name": "lower left crayon", "shortname": ":crayon:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":lower_left_crayon:" ], @@ -5562,8 +6119,11 @@ "write", "draw", "color", - "wax" - ] + "wax", + "object", + "office" + ], + "moji": "ðŸ–" }, "credit_card": { "unicode": "1F4B3", @@ -5588,7 +6148,9 @@ "visa", "american express", "wallet", - "signature" + "signature", + "object", + "boys night" ], "moji": "💳" }, @@ -5606,15 +6168,16 @@ "crescent", "waxing", "sky", - "night", "cheese", - "phase" + "phase", + "space", + "goodnight" ], "moji": "🌙" }, "cricket": { "unicode": "1F3CF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "cricket bat and ball", "shortname": ":cricket:", "category": "activity", @@ -5622,7 +6185,12 @@ ":cricket_bat_ball:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "ball", + "sport", + "cricket" + ], + "moji": "ðŸ" }, "crocodile": { "unicode": "1F40A", @@ -5639,13 +6207,26 @@ "croc", "alligator", "gator", - "cranky" + "cranky", + "wildlife", + "reptile" ], "moji": "ðŸŠ" }, + "croissant": { + "unicode": "1F950", + "unicode_alternates": [], + "name": "croissant", + "shortname": ":croissant:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¥" + }, "cross": { "unicode": "271D", - "unicode_alternates": "", + "unicode_alternates": [], "name": "latin cross", "shortname": ":cross:", "category": "symbols", @@ -5657,53 +6238,8 @@ "religion", "symbol", "christian" - ] - }, - "cross_heavy": { - "unicode": "1F547", - "unicode_alternates": [], - "name": "heavy latin cross", - "shortname": ":cross_heavy:", - "category": "objects_symbols", - "aliases": [ - ":heavy_latin_cross:" - ], - "aliases_ascii": [], - "keywords": [ - "religion", - "symbol" - ] - }, - "cross_white": { - "unicode": "1F546", - "unicode_alternates": [], - "name": "white latin cross", - "shortname": ":cross_white:", - "category": "objects_symbols", - "aliases": [ - ":white_latin_cross:" - ], - "aliases_ascii": [], - "keywords": [ - "religion", - "symbol" - ] - }, - "crossbones": { - "unicode": "1F571", - "unicode_alternates": [], - "name": "black skull and crossbones", - "shortname": ":crossbones:", - "category": "objects_symbols", - "aliases": [ - ":black_skull_and_crossbones:" ], - "aliases_ascii": [], - "keywords": [ - "poison", - "danger", - "death" - ] + "moji": "âœ" }, "crossed_flags": { "unicode": "1F38C", @@ -5714,13 +6250,14 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "japan" + "japan", + "object" ], "moji": "🎌" }, "crossed_swords": { "unicode": "2694", - "unicode_alternates": "", + "unicode_alternates": [], "name": "crossed swords", "shortname": ":crossed_swords:", "category": "objects", @@ -5729,21 +6266,25 @@ "keywords": [ "object", "weapon" - ] + ], + "moji": "âš”" }, "crown": { "unicode": "1F451", "unicode_alternates": [], "name": "crown", "shortname": ":crown:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "king", "kod", "leader", - "royalty" + "royalty", + "object", + "gem", + "accessories" ], "moji": "👑" }, @@ -5752,7 +6293,7 @@ "unicode_alternates": [], "name": "passenger ship", "shortname": ":cruise_ship:", - "category": "travel_places", + "category": "travel", "aliases": [ ":passenger_ship:" ], @@ -5760,15 +6301,18 @@ "keywords": [ "titanic", "transportation", - "boat" - ] + "boat", + "travel", + "vacation" + ], + "moji": "🛳" }, "cry": { "unicode": "1F622", "unicode_alternates": [], "name": "crying face", "shortname": ":cry:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":'(", @@ -5779,11 +6323,14 @@ "keywords": [ "face", "sad", - "sad", "cry", "tear", "weep", - "tears" + "tears", + "smiley", + "emotion", + "rip", + "heartbreak" ], "moji": "😢" }, @@ -5792,7 +6339,7 @@ "unicode_alternates": [], "name": "crying cat face", "shortname": ":crying_cat_face:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5804,8 +6351,6 @@ "cry", "cat", "sob", - "tears", - "sad", "melancholy", "morn", "somber", @@ -5823,16 +6368,29 @@ "aliases_ascii": [], "keywords": [ "disco", - "party" + "party", + "object", + "ball" ], "moji": "🔮" }, + "cucumber": { + "unicode": "1F952", + "unicode_alternates": [], + "name": "cucumber", + "shortname": ":cucumber:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🥒" + }, "cupid": { "unicode": "1F498", "unicode_alternates": [], "name": "heart with arrow", "shortname": ":cupid:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5840,7 +6398,8 @@ "heart", "like", "love", - "valentines" + "valentines", + "symbol" ], "moji": "💘" }, @@ -5849,11 +6408,12 @@ "unicode_alternates": [], "name": "curly loop", "shortname": ":curly_loop:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "scribble" + "scribble", + "symbol" ], "moji": "âž°" }, @@ -5862,13 +6422,14 @@ "unicode_alternates": [], "name": "currency exchange", "shortname": ":currency_exchange:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "dollar", "money", - "travel" + "travel", + "symbol" ], "moji": "💱" }, @@ -5877,7 +6438,7 @@ "unicode_alternates": [], "name": "curry and rice", "shortname": ":curry:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5888,7 +6449,6 @@ "curry", "spice", "flavor", - "food", "meal" ], "moji": "ðŸ›" @@ -5898,7 +6458,7 @@ "unicode_alternates": [], "name": "custard", "shortname": ":custard:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5920,7 +6480,7 @@ "unicode_alternates": [], "name": "customs", "shortname": ":customs:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5932,7 +6492,8 @@ "goods", "check", "authority", - "government" + "government", + "symbol" ], "moji": "🛃" }, @@ -5942,7 +6503,7 @@ "unicode_alternates": [], "name": "cyclone", "shortname": ":cyclone:", - "category": "nature", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5954,7 +6515,9 @@ "hurricane", "typhoon", "storm", - "ocean" + "ocean", + "symbol", + "drugs" ] }, "dagger": { @@ -5962,22 +6525,25 @@ "unicode_alternates": [], "name": "dagger knife", "shortname": ":dagger:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":dagger_knife:" ], "aliases_ascii": [], "keywords": [ "blade", - "knife" - ] + "knife", + "object", + "weapon" + ], + "moji": "🗡" }, "dancer": { "unicode": "1F483", "unicode_alternates": [], "name": "dancer", "shortname": ":dancer:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -5995,13 +6561,18 @@ "ballet", "tango", "cha cha", - "music" + "music", + "people", + "women", + "sexy", + "diversity", + "girls night" ], "moji": "💃" }, "dancer_tone1": { "unicode": "1F483-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "dancer tone 1", "shortname": ":dancer_tone1:", "category": "people", @@ -6021,11 +6592,12 @@ "tango", "cha cha", "music" - ] + ], + "moji": "💃ðŸ»" }, "dancer_tone2": { "unicode": "1F483-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "dancer tone 2", "shortname": ":dancer_tone2:", "category": "people", @@ -6045,11 +6617,12 @@ "tango", "cha cha", "music" - ] + ], + "moji": "💃ðŸ¼" }, "dancer_tone3": { "unicode": "1F483-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "dancer tone 3", "shortname": ":dancer_tone3:", "category": "people", @@ -6069,11 +6642,12 @@ "tango", "cha cha", "music" - ] + ], + "moji": "💃ðŸ½" }, "dancer_tone4": { "unicode": "1F483-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "dancer tone 4", "shortname": ":dancer_tone4:", "category": "people", @@ -6093,11 +6667,12 @@ "tango", "cha cha", "music" - ] + ], + "moji": "💃ðŸ¾" }, "dancer_tone5": { "unicode": "1F483-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "dancer tone 5", "shortname": ":dancer_tone5:", "category": "people", @@ -6117,14 +6692,15 @@ "tango", "cha cha", "music" - ] + ], + "moji": "💃ðŸ¿" }, "dancers": { "unicode": "1F46F", "unicode_alternates": [], "name": "woman with bunny ears", "shortname": ":dancers:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6137,8 +6713,13 @@ "showgirl", "playboy", "costume", - "bunny", - "cancan" + "cancan", + "people", + "sexy", + "girls night", + "boys night", + "parties", + "dance" ], "moji": "👯" }, @@ -6147,7 +6728,7 @@ "unicode_alternates": [], "name": "dango", "shortname": ":dango:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6166,20 +6747,24 @@ "unicode_alternates": [], "name": "dark sunglasses", "shortname": ":dark_sunglasses:", - "category": "objects_symbols", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "shades", - "eyes" - ] + "eyes", + "fashion", + "glasses", + "accessories" + ], + "moji": "🕶" }, "dart": { "unicode": "1F3AF", "unicode_alternates": [], "name": "direct hit", "shortname": ":dart:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6190,10 +6775,10 @@ "bullseye", "dart", "archery", - "game", "fletching", "arrow", - "sport" + "sport", + "boys night" ], "moji": "🎯" }, @@ -6202,14 +6787,17 @@ "unicode_alternates": [], "name": "dash symbol", "shortname": ":dash:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ "air", "fast", "shoo", - "wind" + "wind", + "cloud", + "cold", + "smoking" ], "moji": "💨" }, @@ -6223,7 +6811,9 @@ "aliases_ascii": [], "keywords": [ "calendar", - "schedule" + "schedule", + "object", + "office" ], "moji": "📅" }, @@ -6242,16 +6832,29 @@ "tree", "leaves", "fall", - "color" + "color", + "camp", + "trees" ], "moji": "🌳" }, + "deer": { + "unicode": "1F98C", + "unicode_alternates": [], + "name": "deer", + "shortname": ":deer:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦌" + }, "department_store": { "unicode": "1F3EC", "unicode_alternates": [], "name": "department store", "shortname": ":department_store:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6262,31 +6865,17 @@ "store", "retail", "sale", - "merchandise" + "merchandise", + "places" ], "moji": "ðŸ¬" }, - "descending_notes": { - "unicode": "1F39D", - "unicode_alternates": [], - "name": "beamed descending musical notes", - "shortname": ":descending_notes:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "score", - "music", - "sound", - "tone" - ] - }, "desert": { "unicode": "1F3DC", "unicode_alternates": [], "name": "desert", "shortname": ":desert:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6295,41 +6884,36 @@ "sandy", "cactus", "sunny", - "barren" - ] + "barren", + "places", + "travel", + "vacation" + ], + "moji": "ðŸœ" }, "desktop": { "unicode": "1F5A5", "unicode_alternates": [], "name": "desktop computer", "shortname": ":desktop:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":desktop_computer:" ], "aliases_ascii": [], "keywords": [ - "cpu" - ] - }, - "desktop_window": { - "unicode": "1F5D4", - "unicode_alternates": [], - "name": "desktop window", - "shortname": ":desktop_window:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "computer" - ] + "cpu", + "electronics", + "work" + ], + "moji": "🖥" }, "diamond_shape_with_a_dot_inside": { "unicode": "1F4A0", "unicode_alternates": [], "name": "diamond shape with a dot inside", "shortname": ":diamond_shape_with_a_dot_inside:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6339,7 +6923,8 @@ "kawaii", "japanese", "glyph", - "adorable" + "adorable", + "symbol" ], "moji": "💠" }, @@ -6350,12 +6935,15 @@ ], "name": "black diamond suit", "shortname": ":diamonds:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "cards", - "poker" + "poker", + "shapes", + "symbol", + "game" ], "moji": "♦" }, @@ -6364,7 +6952,7 @@ "unicode_alternates": [], "name": "disappointed face", "shortname": ":disappointed:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ">:[", @@ -6382,7 +6970,10 @@ "discouraged", "face", "sad", - "upset" + "upset", + "smiley", + "tired", + "emotion" ], "moji": "😞" }, @@ -6391,7 +6982,7 @@ "unicode_alternates": [], "name": "disappointed but relieved face", "shortname": ":disappointed_relieved:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6400,7 +6991,12 @@ "phew", "sweat", "disappoint", - "relief" + "relief", + "sad", + "smiley", + "stressed", + "cry", + "emotion" ], "moji": "😥" }, @@ -6409,22 +7005,25 @@ "unicode_alternates": [], "name": "card index dividers", "shortname": ":dividers:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":card_index_dividers:" ], "aliases_ascii": [], "keywords": [ "stationery", - "rolodex" - ] + "rolodex", + "work", + "office" + ], + "moji": "🗂" }, "dizzy": { "unicode": "1F4AB", "unicode_alternates": [], "name": "dizzy symbol", "shortname": ":dizzy:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6437,7 +7036,7 @@ "intoxicated", "squeans", "starburst", - "star" + "symbol" ], "moji": "💫" }, @@ -6446,7 +7045,7 @@ "unicode_alternates": [], "name": "dizzy face", "shortname": ":dizzy_face:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ "#-)", @@ -6463,7 +7062,13 @@ "face", "spent", "unconscious", - "xox" + "xox", + "smiley", + "surprised", + "dead", + "wow", + "emotion", + "omg" ], "moji": "😵" }, @@ -6472,7 +7077,7 @@ "unicode_alternates": [], "name": "do not litter symbol", "shortname": ":do_not_litter:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6480,40 +7085,13 @@ "garbage", "trash", "litter", - "garbage", "waste", "no", "can", - "trash" + "symbol" ], "moji": "🚯" }, - "document": { - "unicode": "1F5CE", - "unicode_alternates": [], - "name": "document", - "shortname": ":document:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "page" - ] - }, - "document_text": { - "unicode": "1F5B9", - "unicode_alternates": [], - "name": "document with text", - "shortname": ":document_text:", - "category": "objects_symbols", - "aliases": [ - ":document_with_text:" - ], - "aliases_ascii": [], - "keywords": [ - "page" - ] - }, "dog": { "unicode": "1F436", "unicode_alternates": [], @@ -6526,7 +7104,9 @@ "animal", "friend", "nature", - "woof" + "woof", + "dog", + "pug" ], "moji": "ðŸ¶" }, @@ -6546,11 +7126,10 @@ "pet", "dog", "puppy", - "pet", - "friend", "woof", "bark", - "fido" + "fido", + "pug" ], "moji": "ðŸ•" }, @@ -6571,8 +7150,6 @@ "canada", "australia", "banknote", - "money", - "currency", "paper", "cash", "bills" @@ -6593,7 +7170,6 @@ "toy", "dolls", "japan", - "japanese", "day", "girls", "emperor", @@ -6602,7 +7178,8 @@ "blessing", "imperial", "family", - "royal" + "royal", + "people" ], "moji": "🎎" }, @@ -6621,7 +7198,9 @@ "flipper", "nature", "ocean", - "sea" + "sea", + "wildlife", + "tropical" ], "moji": "ðŸ¬" }, @@ -6641,8 +7220,7 @@ "doorway", "entrance", "enter", - "exit", - "entry" + "object" ], "moji": "🚪" }, @@ -6651,7 +7229,7 @@ "unicode_alternates": [], "name": "doughnut", "shortname": ":doughnut:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6666,8 +7244,7 @@ "dessert", "breakfast", "police", - "homer", - "sweet" + "homer" ], "moji": "ðŸ©" }, @@ -6676,15 +7253,17 @@ "unicode_alternates": [], "name": "dove of peace", "shortname": ":dove:", - "category": "objects_symbols", + "category": "nature", "aliases": [ ":dove_of_peace:" ], "aliases_ascii": [], "keywords": [ "symbol", - "bird" - ] + "bird", + "animal" + ], + "moji": "🕊" }, "dragon": { "unicode": "1F409", @@ -6703,7 +7282,8 @@ "dragon", "fire", "legendary", - "myth" + "roar", + "reptile" ], "moji": "ðŸ‰" }, @@ -6725,7 +7305,9 @@ "head", "fire", "legendary", - "myth" + "roar", + "monster", + "reptile" ], "moji": "ðŸ²" }, @@ -6734,12 +7316,15 @@ "unicode_alternates": [], "name": "dress", "shortname": ":dress:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "clothes", - "fashion" + "fashion", + "women", + "sexy", + "girls night" ], "moji": "👗" }, @@ -6758,23 +7343,35 @@ "dromedary", "camel", "hump", - "desert", "middle east", "heat", - "hot", "water", "hump day", "wednesday", - "sex" + "sex", + "wildlife" ], "moji": "ðŸª" }, + "drooling_face": { + "unicode": "1F924", + "unicode_alternates": [], + "name": "drooling face", + "shortname": ":drooling_face:", + "category": "people", + "aliases": [ + ":drool:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤤" + }, "droplet": { "unicode": "1F4A7", "unicode_alternates": [], "name": "droplet", "shortname": ":droplet:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -6784,7 +7381,6 @@ "drop", "droplet", "h20", - "water", "aqua", "tear", "sweat", @@ -6792,10 +7388,36 @@ "moisture", "wet", "moist", - "spit" + "spit", + "weather", + "sky" ], "moji": "💧" }, + "drum": { + "unicode": "1F941", + "unicode_alternates": [], + "name": "drum with drumsticks", + "shortname": ":drum:", + "category": "activity", + "aliases": [ + ":drum_with_drumsticks:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¥" + }, + "duck": { + "unicode": "1F986", + "unicode_alternates": [], + "name": "duck", + "shortname": ":duck:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦆" + }, "dvd": { "unicode": "1F4C0", "unicode_alternates": [], @@ -6807,7 +7429,8 @@ "keywords": [ "cd", "disc", - "disk" + "disk", + "electronics" ], "moji": "📀" }, @@ -6823,23 +7446,37 @@ "aliases_ascii": [], "keywords": [ "communication", - "inbox" + "inbox", + "office" ], "moji": "📧" }, + "eagle": { + "unicode": "1F985", + "unicode_alternates": [], + "name": "eagle", + "shortname": ":eagle:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦅" + }, "ear": { "unicode": "1F442", "unicode_alternates": [], "name": "ear", "shortname": ":ear:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "face", "hear", "listen", - "sound" + "sound", + "body", + "diversity" ], "moji": "👂" }, @@ -6857,14 +7494,14 @@ "ear", "rice", "food", - "plant", - "seed" + "seed", + "leaf" ], "moji": "🌾" }, "ear_tone1": { "unicode": "1F442-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ear tone 1", "shortname": ":ear_tone1:", "category": "people", @@ -6874,11 +7511,12 @@ "hear", "listen", "sound" - ] + ], + "moji": "👂ðŸ»" }, "ear_tone2": { "unicode": "1F442-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ear tone 2", "shortname": ":ear_tone2:", "category": "people", @@ -6888,11 +7526,12 @@ "hear", "listen", "sound" - ] + ], + "moji": "👂ðŸ¼" }, "ear_tone3": { "unicode": "1F442-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ear tone 3", "shortname": ":ear_tone3:", "category": "people", @@ -6902,11 +7541,12 @@ "hear", "listen", "sound" - ] + ], + "moji": "👂ðŸ½" }, "ear_tone4": { "unicode": "1F442-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ear tone 4", "shortname": ":ear_tone4:", "category": "people", @@ -6916,11 +7556,12 @@ "hear", "listen", "sound" - ] + ], + "moji": "👂ðŸ¾" }, "ear_tone5": { "unicode": "1F442-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ear tone 5", "shortname": ":ear_tone5:", "category": "people", @@ -6930,7 +7571,8 @@ "hear", "listen", "sound" - ] + ], + "moji": "👂ðŸ¿" }, "earth_africa": { "unicode": "1F30D", @@ -6945,12 +7587,13 @@ "international", "world", "earth", - "globe", "space", "planet", "africa", "europe", - "home" + "home", + "map", + "vacation" ], "moji": "ðŸŒ" }, @@ -6968,14 +7611,15 @@ "international", "world", "earth", - "globe", "space", "planet", "north", "south", "america", "americas", - "home" + "home", + "map", + "vacation" ], "moji": "🌎" }, @@ -6993,43 +7637,33 @@ "international", "world", "earth", - "globe", "space", "planet", "asia", "australia", - "home" + "home", + "map", + "vacation" ], "moji": "ðŸŒ" }, "egg": { - "unicode": "1F373", + "unicode": "1F95A", "unicode_alternates": [], - "name": "cooking", + "name": "egg", "shortname": ":egg:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], - "keywords": [ - "breakfast", - "food", - "egg", - "fry", - "pan", - "flat", - "cook", - "frying", - "cooking", - "utensil" - ], - "moji": "ðŸ³" + "keywords": [], + "moji": "🥚" }, "eggplant": { "unicode": "1F346", "unicode_alternates": [], "name": "aubergine", "shortname": ":eggplant:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -7038,10 +7672,10 @@ "nature", "vegetable", "eggplant", - "aubergine", "fruit", "purple", - "penis" + "penis", + "vegetables" ], "moji": "ðŸ†" }, @@ -7051,15 +7685,18 @@ "unicode_alternates": [ "0038-FE0F-20E3" ], - "name": "digit eight", + "name": "keycap digit eight", "shortname": ":eight:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "8", "blue-square", - "numbers" + "numbers", + "number", + "math", + "symbol" ] }, "eight_pointed_black_star": { @@ -7069,10 +7706,12 @@ ], "name": "eight pointed black star", "shortname": ":eight_pointed_black_star:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [], + "keywords": [ + "symbol" + ], "moji": "✴" }, "eight_spoked_asterisk": { @@ -7082,16 +7721,32 @@ ], "name": "eight spoked asterisk", "shortname": ":eight_spoked_asterisk:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "green-square", "sparkle", - "star" + "star", + "symbol" ], "moji": "✳" }, + "eject": { + "unicode": "23CF", + "unicode_alternates": [ + "23CF-FE0F" + ], + "name": "eject symbol", + "shortname": ":eject:", + "category": "symbols", + "aliases": [ + ":eject_symbol:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "â" + }, "electric_plug": { "unicode": "1F50C", "unicode_alternates": [], @@ -7102,7 +7757,8 @@ "aliases_ascii": [], "keywords": [ "charger", - "power" + "power", + "electronics" ], "moji": "🔌" }, @@ -7118,7 +7774,8 @@ "animal", "nature", "nose", - "thailand" + "thailand", + "wildlife" ], "moji": "ðŸ˜" }, @@ -7127,100 +7784,36 @@ "unicode_alternates": [], "name": "end with leftwards arrow above", "shortname": ":end:", - "category": "other", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "arrow", - "words" - ], - "moji": "🔚" - }, - "envelope": { - "unicode": "2709", - "unicode_alternates": [ - "2709-FE0F" - ], - "name": "envelope", - "shortname": ":envelope:", - "category": "objects", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "communication", - "letter", - "mail", - "postal" - ], - "moji": "✉" - }, - "envelope_back": { - "unicode": "1F582", - "unicode_alternates": [], - "name": "back of envelope", - "shortname": ":envelope_back:", - "category": "objects_symbols", - "aliases": [ - ":back_of_envelope:" - ], - "aliases_ascii": [], - "keywords": [ - "communication", - "letter", - "mail", - "postal" - ] - }, - "envelope_flying": { - "unicode": "1F585", - "unicode_alternates": [], - "name": "flying envelope", - "shortname": ":envelope_flying:", - "category": "objects_symbols", - "aliases": [ - ":flying_envelope:" - ], - "aliases_ascii": [], - "keywords": [ - "communication", - "letter", - "mail", - "postal" - ] - }, - "envelope_stamped": { - "unicode": "1F583", - "unicode_alternates": [], - "name": "stamped envelope", - "shortname": ":envelope_stamped:", - "category": "objects_symbols", - "aliases": [ - ":stamped_envelope:" - ], + "category": "symbols", + "aliases": [], "aliases_ascii": [], "keywords": [ - "communication", - "letter", - "mail", - "postal" - ] + "arrow", + "words", + "symbol" + ], + "moji": "🔚" }, - "envelope_stamped_pen": { - "unicode": "1F586", - "unicode_alternates": [], - "name": "pen over stamped envelope", - "shortname": ":envelope_stamped_pen:", - "category": "objects_symbols", - "aliases": [ - ":pen_over_stamped_envelope:" + "envelope": { + "unicode": "2709", + "unicode_alternates": [ + "2709-FE0F" ], + "name": "envelope", + "shortname": ":envelope:", + "category": "objects", + "aliases": [], "aliases_ascii": [], "keywords": [ "communication", "letter", "mail", - "postal" - ] + "postal", + "object", + "office", + "write" + ], + "moji": "✉" }, "envelope_with_arrow": { "unicode": "1F4E9", @@ -7231,7 +7824,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "email" + "email", + "object", + "office" ], "moji": "📩" }, @@ -7250,8 +7845,6 @@ "euro", "europe", "banknote", - "money", - "currency", "paper", "cash", "bills" @@ -7263,7 +7856,7 @@ "unicode_alternates": [], "name": "european castle", "shortname": ":european_castle:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -7273,7 +7866,6 @@ "castle", "european", "residence", - "royalty", "disneyland", "disney", "fort", @@ -7287,7 +7879,10 @@ "queen", "fortress", "nobel", - "stronghold" + "stronghold", + "places", + "travel", + "vacation" ], "moji": "ðŸ°" }, @@ -7296,11 +7891,13 @@ "unicode_alternates": [], "name": "european post office", "shortname": ":european_post_office:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "building" + "building", + "places", + "post office" ], "moji": "ðŸ¤" }, @@ -7318,7 +7915,10 @@ "evergreen", "tree", "needles", - "christmas" + "christmas", + "holidays", + "camp", + "trees" ], "moji": "🌲" }, @@ -7329,11 +7929,13 @@ ], "name": "heavy exclamation mark symbol", "shortname": ":exclamation:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "surprise" + "surprise", + "symbol", + "punctuation" ], "moji": "â—" }, @@ -7342,7 +7944,7 @@ "unicode_alternates": [], "name": "expressionless face", "shortname": ":expressionless:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ "-_-", @@ -7356,7 +7958,11 @@ "vapid", "without expression", "face", - "indifferent" + "indifferent", + "mad", + "smiley", + "neutral", + "emotion" ], "moji": "😑" }, @@ -7371,25 +7977,36 @@ "keywords": [ "look", "peek", - "watch" - ] + "watch", + "body", + "eyes" + ], + "moji": "ðŸ‘" }, "eye_in_speech_bubble": { "unicode": "1F441-1F5E8", - "unicode_alternates": "1f441-200d-1f5e8", + "unicode_alternates": [ + "1F441-200D-1F5E8" + ], "name": "eye in speech bubble", "shortname": ":eye_in_speech_bubble:", "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "object", + "symbol", + "eyes", + "talk" + ], + "moji": "ðŸ‘â€ðŸ—¨" }, "eyeglasses": { "unicode": "1F453", "unicode_alternates": [], "name": "eyeglasses", "shortname": ":eyeglasses:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -7408,7 +8025,8 @@ "vision", "see", "blurry", - "contacts" + "contacts", + "glasses" ], "moji": "👓" }, @@ -7417,27 +8035,110 @@ "unicode_alternates": [], "name": "eyes", "shortname": ":eyes:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "look", "peek", "stalk", - "watch" + "watch", + "body", + "eyes" ], "moji": "👀" }, + "face_palm": { + "unicode": "1F926", + "unicode_alternates": [], + "name": "face palm", + "shortname": ":face_palm:", + "category": "people", + "aliases": [ + ":facepalm:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦" + }, + "face_palm_tone1": { + "unicode": "1F926-1F3FB", + "unicode_alternates": [], + "name": "face palm tone 1", + "shortname": ":face_palm_tone1:", + "category": "people", + "aliases": [ + ":facepalm_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦ðŸ»" + }, + "face_palm_tone2": { + "unicode": "1F926-1F3FC", + "unicode_alternates": [], + "name": "face palm tone 2", + "shortname": ":face_palm_tone2:", + "category": "people", + "aliases": [ + ":facepalm_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦ðŸ¼" + }, + "face_palm_tone3": { + "unicode": "1F926-1F3FD", + "unicode_alternates": [], + "name": "face palm tone 3", + "shortname": ":face_palm_tone3:", + "category": "people", + "aliases": [ + ":facepalm_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦ðŸ½" + }, + "face_palm_tone4": { + "unicode": "1F926-1F3FE", + "unicode_alternates": [], + "name": "face palm tone 4", + "shortname": ":face_palm_tone4:", + "category": "people", + "aliases": [ + ":facepalm_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦ðŸ¾" + }, + "face_palm_tone5": { + "unicode": "1F926-1F3FF", + "unicode_alternates": [], + "name": "face palm tone 5", + "shortname": ":face_palm_tone5:", + "category": "people", + "aliases": [ + ":facepalm_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤦ðŸ¿" + }, "factory": { "unicode": "1F3ED", "unicode_alternates": [], "name": "factory", "shortname": ":factory:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "building" + "building", + "places", + "travel", + "steam" ], "moji": "ðŸ" }, @@ -7467,7 +8168,7 @@ "unicode_alternates": [], "name": "family", "shortname": ":family:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -7479,13 +8180,12 @@ "mother", "parents", "family", - "mother", - "father", - "child", "girl", "boy", "group", - "unit" + "unit", + "people", + "baby" ], "moji": "👪" }, @@ -7509,8 +8209,14 @@ "gay", "homosexual", "man", - "boy" - ] + "boy", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨â€ðŸ‘¨â€ðŸ‘¦" }, "family_mmbb": { "unicode": "1F468-1F468-1F466-1F466", @@ -7532,8 +8238,14 @@ "gay", "homosexual", "man", - "boy" - ] + "boy", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨â€ðŸ‘¨â€ðŸ‘¦â€ðŸ‘¦" }, "family_mmg": { "unicode": "1F468-1F468-1F467", @@ -7555,8 +8267,14 @@ "gay", "homosexual", "man", - "girl" - ] + "girl", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨â€ðŸ‘¨â€ðŸ‘§" }, "family_mmgb": { "unicode": "1F468-1F468-1F467-1F466", @@ -7579,8 +8297,14 @@ "homosexual", "man", "girl", - "boy" - ] + "boy", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘¦" }, "family_mmgg": { "unicode": "1F468-1F468-1F467-1F467", @@ -7602,8 +8326,14 @@ "gay", "homosexual", "man", - "girl" - ] + "girl", + "people", + "family", + "men", + "baby", + "lgbt" + ], + "moji": "👨â€ðŸ‘¨â€ðŸ‘§â€ðŸ‘§" }, "family_mwbb": { "unicode": "1F468-1F469-1F466-1F466", @@ -7626,8 +8356,12 @@ "group", "unit", "man", - "woman" - ] + "woman", + "people", + "family", + "baby" + ], + "moji": "👨â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦" }, "family_mwg": { "unicode": "1F468-1F469-1F467", @@ -7651,8 +8385,12 @@ "group", "unit", "man", - "woman" - ] + "woman", + "people", + "family", + "baby" + ], + "moji": "👨â€ðŸ‘©â€ðŸ‘§" }, "family_mwgb": { "unicode": "1F468-1F469-1F467-1F466", @@ -7676,8 +8414,12 @@ "group", "unit", "man", - "woman" - ] + "woman", + "people", + "family", + "baby" + ], + "moji": "👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦" }, "family_mwgg": { "unicode": "1F468-1F469-1F467-1F467", @@ -7700,8 +8442,12 @@ "group", "unit", "man", - "woman" - ] + "woman", + "people", + "family", + "baby" + ], + "moji": "👨â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§" }, "family_wwb": { "unicode": "1F469-1F469-1F466", @@ -7724,8 +8470,14 @@ "gay", "lesbian", "homosexual", - "woman" - ] + "woman", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩â€ðŸ‘©â€ðŸ‘¦" }, "family_wwbb": { "unicode": "1F469-1F469-1F466-1F466", @@ -7748,8 +8500,14 @@ "lesbian", "homosexual", "woman", - "boy" - ] + "boy", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩â€ðŸ‘©â€ðŸ‘¦â€ðŸ‘¦" }, "family_wwg": { "unicode": "1F469-1F469-1F467", @@ -7772,8 +8530,14 @@ "unit", "gay", "lesbian", - "homosexual" - ] + "homosexual", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩â€ðŸ‘©â€ðŸ‘§" }, "family_wwgb": { "unicode": "1F469-1F469-1F467-1F466", @@ -7797,8 +8561,14 @@ "homosexual", "woman", "girl", - "boy" - ] + "boy", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘¦" }, "family_wwgg": { "unicode": "1F469-1F469-1F467-1F467", @@ -7821,19 +8591,27 @@ "lesbian", "homosexual", "woman", - "girl" - ] + "girl", + "people", + "family", + "women", + "baby", + "lgbt" + ], + "moji": "👩â€ðŸ‘©â€ðŸ‘§â€ðŸ‘§" }, "fast_forward": { "unicode": "23E9", "unicode_alternates": [], "name": "black right-pointing double triangle", "shortname": ":fast_forward:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol" ], "moji": "â©" }, @@ -7847,7 +8625,10 @@ "aliases_ascii": [], "keywords": [ "communication", - "technology" + "technology", + "electronics", + "work", + "office" ], "moji": "📠" }, @@ -7856,7 +8637,7 @@ "unicode_alternates": [], "name": "fearful face", "shortname": ":fearful:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -7867,8 +8648,10 @@ "terrified", "fear", "fearful", - "scared", - "frightened" + "frightened", + "smiley", + "surprised", + "emotion" ], "moji": "😨" }, @@ -7888,16 +8671,12 @@ "paw", "pet", "tracking", - "paw", "prints", "mark", "imprints", "footsteps", - "animal", "lion", "bear", - "dog", - "cat", "raccoon", "critter", "feet", @@ -7905,12 +8684,25 @@ ], "moji": "ðŸ¾" }, + "fencer": { + "unicode": "1F93A", + "unicode_alternates": [], + "name": "fencer", + "shortname": ":fencer:", + "category": "activity", + "aliases": [ + ":fencing:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤺" + }, "ferris_wheel": { "unicode": "1F3A1", "unicode_alternates": [], "name": "ferris wheel", "shortname": ":ferris_wheel:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -7923,13 +8715,16 @@ "park", "fair", "ride", - "entertainment" + "entertainment", + "places", + "vacation", + "ferris wheel" ], "moji": "🎡" }, "ferry": { "unicode": "26F4", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ferry", "shortname": ":ferry:", "category": "travel", @@ -7938,33 +8733,44 @@ "keywords": [ "boat", "place", - "travel" - ] + "travel", + "transportation", + "vacation" + ], + "moji": "â›´" }, "field_hockey": { "unicode": "1F3D1", - "unicode_alternates": "", + "unicode_alternates": [], "name": "field hockey stick and ball", "shortname": ":field_hockey:", "category": "activity", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "ball", + "sport", + "hockey" + ], + "moji": "ðŸ‘" }, "file_cabinet": { "unicode": "1F5C4", "unicode_alternates": [], "name": "file cabinet", "shortname": ":file_cabinet:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "folders", "office", "documents", - "storage" - ] + "storage", + "object", + "work" + ], + "moji": "🗄" }, "file_folder": { "unicode": "1F4C1", @@ -7975,7 +8781,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "documents" + "documents", + "work", + "office" ], "moji": "ðŸ“" }, @@ -7984,7 +8792,7 @@ "unicode_alternates": [], "name": "film frames", "shortname": ":film_frames:", - "category": "activity", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -7993,95 +8801,96 @@ "8mm", "16mm", "reel", - "celluloid" - ] + "celluloid", + "object", + "camera" + ], + "moji": "🎞" }, - "finger_pointing_down": { - "unicode": "1F597", + "fingers_crossed": { + "unicode": "1F91E", "unicode_alternates": [], - "name": "white down pointing left hand index", - "shortname": ":finger_pointing_down:", + "name": "hand with first and index finger crossed", + "shortname": ":fingers_crossed:", "category": "people", "aliases": [ - ":white_down_pointing_left_hand_index:" + ":hand_with_index_and_middle_finger_crossed:" ], "aliases_ascii": [], - "keywords": [ - "direction", - "finger", - "hand" - ] + "keywords": [], + "moji": "🤞" }, - "finger_pointing_down2": { - "unicode": "1F59F", + "fingers_crossed_tone1": { + "unicode": "1F91E-1F3FB", "unicode_alternates": [], - "name": "sideways white down pointing index", - "shortname": ":finger_pointing_down2:", + "name": "hand with index and middle fingers crossed tone 1", + "shortname": ":fingers_crossed_tone1:", "category": "people", "aliases": [ - ":sideways_white_down_pointing_index:" + ":hand_with_index_and_middle_fingers_crossed_tone1:" ], "aliases_ascii": [], - "keywords": [ - "direction", - "finger", - "hand" - ] + "keywords": [], + "moji": "🤞ðŸ»" }, - "finger_pointing_left": { - "unicode": "1F598", + "fingers_crossed_tone2": { + "unicode": "1F91E-1F3FC", "unicode_alternates": [], - "name": "sideways white left pointing index", - "shortname": ":finger_pointing_left:", + "name": "hand with index and middle fingers crossed tone 2", + "shortname": ":fingers_crossed_tone2:", "category": "people", "aliases": [ - ":sideways_white_left_pointing_index:" + ":hand_with_index_and_middle_fingers_crossed_tone2:" ], "aliases_ascii": [], - "keywords": [ - "direction", - "finger", - "hand" - ] + "keywords": [], + "moji": "🤞ðŸ¼" }, - "finger_pointing_right": { - "unicode": "1F599", + "fingers_crossed_tone3": { + "unicode": "1F91E-1F3FD", "unicode_alternates": [], - "name": "sideways white right pointing index", - "shortname": ":finger_pointing_right:", + "name": "hand with index and middle fingers crossed tone 3", + "shortname": ":fingers_crossed_tone3:", "category": "people", "aliases": [ - ":sideways_white_right_pointing_index:" + ":hand_with_index_and_middle_fingers_crossed_tone3:" ], "aliases_ascii": [], - "keywords": [ - "direction", - "finger", - "hand" - ] + "keywords": [], + "moji": "🤞ðŸ½" }, - "finger_pointing_up": { - "unicode": "1F59E", + "fingers_crossed_tone4": { + "unicode": "1F91E-1F3FE", "unicode_alternates": [], - "name": "sideways white up pointing index", - "shortname": ":finger_pointing_up:", + "name": "hand with index and middle fingers crossed tone 4", + "shortname": ":fingers_crossed_tone4:", "category": "people", "aliases": [ - ":sideways_white_up_pointing_index:" + ":hand_with_index_and_middle_fingers_crossed_tone4:" ], "aliases_ascii": [], - "keywords": [ - "direction", - "finger", - "hand" - ] + "keywords": [], + "moji": "🤞ðŸ¾" + }, + "fingers_crossed_tone5": { + "unicode": "1F91E-1F3FF", + "unicode_alternates": [], + "name": "hand with index and middle fingers crossed tone 5", + "shortname": ":fingers_crossed_tone5:", + "category": "people", + "aliases": [ + ":hand_with_index_and_middle_fingers_crossed_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤞ðŸ¿" }, "fire": { "unicode": "1F525", "unicode_alternates": [], "name": "fire", "shortname": ":fire:", - "category": "emoticons", + "category": "nature", "aliases": [ ":flame:" ], @@ -8089,7 +8898,8 @@ "keywords": [ "cook", "hot", - "flame" + "flame", + "wth" ], "moji": "🔥" }, @@ -8098,7 +8908,7 @@ "unicode_alternates": [], "name": "fire engine", "shortname": ":fire_engine:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -8110,34 +8920,17 @@ "engine", "truck", "emergency", - "medical" + "medical", + "911" ], "moji": "🚒" }, - "fire_engine_oncoming": { - "unicode": "1F6F1", - "unicode_alternates": [], - "name": "oncoming fire engine", - "shortname": ":fire_engine_oncoming:", - "category": "travel_places", - "aliases": [ - ":oncoming_fire_engine:" - ], - "aliases_ascii": [], - "keywords": [ - "transportation", - "vehicle", - "fighter", - "truck", - "emergency" - ] - }, "fireworks": { "unicode": "1F386", "unicode_alternates": [], "name": "fireworks", "shortname": ":fireworks:", - "category": "objects", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -8154,10 +8947,24 @@ "rocket", "sky", "idea", - "excitement" + "excitement", + "parties" ], "moji": "🎆" }, + "first_place": { + "unicode": "1F947", + "unicode_alternates": [], + "name": "first place medal", + "shortname": ":first_place:", + "category": "activity", + "aliases": [ + ":first_place_medal:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥇" + }, "first_quarter_moon": { "unicode": "1F313", "unicode_alternates": [], @@ -8174,7 +8981,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌓" }, @@ -8196,7 +9004,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌛" }, @@ -8211,7 +9020,8 @@ "keywords": [ "animal", "food", - "nature" + "nature", + "wildlife" ], "moji": "ðŸŸ" }, @@ -8220,7 +9030,7 @@ "unicode_alternates": [], "name": "fish cake with swirl design", "shortname": ":fish_cake:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -8231,7 +9041,8 @@ "swirl", "ramen", "noodles", - "naruto" + "naruto", + "sushi" ], "moji": "ðŸ¥" }, @@ -8240,7 +9051,7 @@ "unicode_alternates": [], "name": "fishing pole and fish", "shortname": ":fishing_pole_and_fish:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -8248,7 +9059,9 @@ "hobby", "fish", "fishing", - "pole" + "pole", + "vacation", + "sport" ], "moji": "🎣" }, @@ -8257,19 +9070,25 @@ "unicode_alternates": [], "name": "raised fist", "shortname": ":fist:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "fingers", "grasp", - "hand" + "hand", + "body", + "hands", + "hi", + "fist bump", + "diversity", + "condolence" ], "moji": "✊" }, "fist_tone1": { "unicode": "270A-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised fist tone 1", "shortname": ":fist_tone1:", "category": "people", @@ -8279,11 +9098,12 @@ "fingers", "grasp", "hand" - ] + ], + "moji": "✊ðŸ»" }, "fist_tone2": { "unicode": "270A-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised fist tone 2", "shortname": ":fist_tone2:", "category": "people", @@ -8293,11 +9113,12 @@ "fingers", "grasp", "hand" - ] + ], + "moji": "✊ðŸ¼" }, "fist_tone3": { "unicode": "270A-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised fist tone 3", "shortname": ":fist_tone3:", "category": "people", @@ -8307,11 +9128,12 @@ "fingers", "grasp", "hand" - ] + ], + "moji": "✊ðŸ½" }, "fist_tone4": { "unicode": "270A-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised fist tone 4", "shortname": ":fist_tone4:", "category": "people", @@ -8321,11 +9143,12 @@ "fingers", "grasp", "hand" - ] + ], + "moji": "✊ðŸ¾" }, "fist_tone5": { "unicode": "270A-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised fist tone 5", "shortname": ":fist_tone5:", "category": "people", @@ -8335,7 +9158,8 @@ "fingers", "grasp", "hand" - ] + ], + "moji": "✊ðŸ¿" }, "five": { "moji": "5ï¸âƒ£", @@ -8343,15 +9167,18 @@ "unicode_alternates": [ "0035-FE0F-20E3" ], - "name": "digit five", + "name": "keycap digit five", "shortname": ":five:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", "numbers", - "prime" + "prime", + "number", + "math", + "symbol" ] }, "flag_ac": { @@ -8367,8 +9194,10 @@ "keywords": [ "country", "nation", - "ac" - ] + "ac", + "flag" + ], + "moji": "🇦🇨" }, "flag_ad": { "unicode": "1F1E6-1F1E9", @@ -8383,8 +9212,10 @@ "keywords": [ "country", "nation", - "ad" - ] + "ad", + "flag" + ], + "moji": "🇦🇩" }, "flag_ae": { "unicode": "1F1E6-1F1EA", @@ -8399,8 +9230,10 @@ "keywords": [ "country", "nation", - "ae" - ] + "ae", + "flag" + ], + "moji": "🇦🇪" }, "flag_af": { "unicode": "1F1E6-1F1EB", @@ -8416,8 +9249,10 @@ "country", "nation", "afghanestan", - "af" - ] + "af", + "flag" + ], + "moji": "🇦🇫" }, "flag_ag": { "unicode": "1F1E6-1F1EC", @@ -8432,8 +9267,10 @@ "keywords": [ "country", "nation", - "ag" - ] + "ag", + "flag" + ], + "moji": "🇦🇬" }, "flag_ai": { "unicode": "1F1E6-1F1EE", @@ -8448,8 +9285,10 @@ "keywords": [ "country", "nation", - "ai" - ] + "ai", + "flag" + ], + "moji": "🇦🇮" }, "flag_al": { "unicode": "1F1E6-1F1F1", @@ -8465,8 +9304,10 @@ "country", "nation", "shqiperia", - "al" - ] + "al", + "flag" + ], + "moji": "🇦🇱" }, "flag_am": { "unicode": "1F1E6-1F1F2", @@ -8482,8 +9323,10 @@ "country", "nation", "hayastan", - "am" - ] + "am", + "flag" + ], + "moji": "🇦🇲" }, "flag_ao": { "unicode": "1F1E6-1F1F4", @@ -8498,12 +9341,14 @@ "keywords": [ "country", "nation", - "ao" - ] + "ao", + "flag" + ], + "moji": "🇦🇴" }, "flag_aq": { "unicode": "1F1E6-1F1F6", - "unicode_alternates": "", + "unicode_alternates": [], "name": "antarctica", "shortname": ":flag_aq:", "category": "flags", @@ -8511,7 +9356,11 @@ ":aq:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇦🇶" }, "flag_ar": { "unicode": "1F1E6-1F1F7", @@ -8526,12 +9375,14 @@ "keywords": [ "country", "nation", - "ar" - ] + "ar", + "flag" + ], + "moji": "🇦🇷" }, "flag_as": { "unicode": "1F1E6-1F1F8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "american samoa", "shortname": ":flag_as:", "category": "flags", @@ -8539,7 +9390,11 @@ ":as:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇦🇸" }, "flag_at": { "unicode": "1F1E6-1F1F9", @@ -8556,8 +9411,10 @@ "nation", "österreich", "osterreich", - "at" - ] + "at", + "flag" + ], + "moji": "🇦🇹" }, "flag_au": { "unicode": "1F1E6-1F1FA", @@ -8572,8 +9429,10 @@ "keywords": [ "country", "nation", - "au" - ] + "au", + "flag" + ], + "moji": "🇦🇺" }, "flag_aw": { "unicode": "1F1E6-1F1FC", @@ -8588,12 +9447,14 @@ "keywords": [ "country", "nation", - "aw" - ] + "aw", + "flag" + ], + "moji": "🇦🇼" }, "flag_ax": { "unicode": "1F1E6-1F1FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "Ã¥land islands", "shortname": ":flag_ax:", "category": "flags", @@ -8601,7 +9462,11 @@ ":ax:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇦🇽" }, "flag_az": { "unicode": "1F1E6-1F1FF", @@ -8617,8 +9482,10 @@ "country", "nation", "azarbaycan", - "az" - ] + "az", + "flag" + ], + "moji": "🇦🇿" }, "flag_ba": { "unicode": "1F1E7-1F1E6", @@ -8634,8 +9501,10 @@ "country", "nation", "bosna i hercegovina", - "ba" - ] + "ba", + "flag" + ], + "moji": "🇧🇦" }, "flag_bb": { "unicode": "1F1E7-1F1E7", @@ -8650,8 +9519,10 @@ "keywords": [ "country", "nation", - "bb" - ] + "bb", + "flag" + ], + "moji": "🇧🇧" }, "flag_bd": { "unicode": "1F1E7-1F1E9", @@ -8666,8 +9537,10 @@ "keywords": [ "country", "nation", - "bd" - ] + "bd", + "flag" + ], + "moji": "🇧🇩" }, "flag_be": { "unicode": "1F1E7-1F1EA", @@ -8684,8 +9557,10 @@ "nation", "belgique", "belgie", - "be" - ] + "be", + "flag" + ], + "moji": "🇧🇪" }, "flag_bf": { "unicode": "1F1E7-1F1EB", @@ -8700,8 +9575,10 @@ "keywords": [ "country", "nation", - "bf" - ] + "bf", + "flag" + ], + "moji": "🇧🇫" }, "flag_bg": { "unicode": "1F1E7-1F1EC", @@ -8716,8 +9593,10 @@ "keywords": [ "country", "nation", - "bg" - ] + "bg", + "flag" + ], + "moji": "🇧🇬" }, "flag_bh": { "unicode": "1F1E7-1F1ED", @@ -8733,8 +9612,10 @@ "country", "nation", "al bahrayn", - "bh" - ] + "bh", + "flag" + ], + "moji": "🇧ðŸ‡" }, "flag_bi": { "unicode": "1F1E7-1F1EE", @@ -8749,8 +9630,10 @@ "keywords": [ "country", "nation", - "bi" - ] + "bi", + "flag" + ], + "moji": "🇧🇮" }, "flag_bj": { "unicode": "1F1E7-1F1EF", @@ -8765,12 +9648,14 @@ "keywords": [ "country", "nation", - "bj" - ] + "bj", + "flag" + ], + "moji": "🇧🇯" }, "flag_bl": { "unicode": "1F1E7-1F1F1", - "unicode_alternates": "", + "unicode_alternates": [], "name": "saint barthélemy", "shortname": ":flag_bl:", "category": "flags", @@ -8778,22 +9663,28 @@ ":bl:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇧🇱" }, "flag_black": { "unicode": "1F3F4", "unicode_alternates": [], "name": "waving black flag", "shortname": ":flag_black:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":waving_black_flag:" ], "aliases_ascii": [], "keywords": [ "symbol", - "signal" - ] + "signal", + "object" + ], + "moji": "ðŸ´" }, "flag_bm": { "unicode": "1F1E7-1F1F2", @@ -8808,8 +9699,10 @@ "keywords": [ "country", "nation", - "bm" - ] + "bm", + "flag" + ], + "moji": "🇧🇲" }, "flag_bn": { "unicode": "1F1E7-1F1F3", @@ -8824,8 +9717,10 @@ "keywords": [ "country", "nation", - "bn" - ] + "bn", + "flag" + ], + "moji": "🇧🇳" }, "flag_bo": { "unicode": "1F1E7-1F1F4", @@ -8840,12 +9735,14 @@ "keywords": [ "country", "nation", - "bo" - ] + "bo", + "flag" + ], + "moji": "🇧🇴" }, "flag_bq": { "unicode": "1F1E7-1F1F6", - "unicode_alternates": "", + "unicode_alternates": [], "name": "caribbean netherlands", "shortname": ":flag_bq:", "category": "flags", @@ -8853,7 +9750,11 @@ ":bq:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇧🇶" }, "flag_br": { "unicode": "1F1E7-1F1F7", @@ -8869,8 +9770,10 @@ "country", "nation", "brasil", - "br" - ] + "br", + "flag" + ], + "moji": "🇧🇷" }, "flag_bs": { "unicode": "1F1E7-1F1F8", @@ -8885,8 +9788,10 @@ "keywords": [ "country", "nation", - "bs" - ] + "bs", + "flag" + ], + "moji": "🇧🇸" }, "flag_bt": { "unicode": "1F1E7-1F1F9", @@ -8901,12 +9806,14 @@ "keywords": [ "country", "nation", - "bt" - ] + "bt", + "flag" + ], + "moji": "🇧🇹" }, "flag_bv": { "unicode": "1F1E7-1F1FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "bouvet island", "shortname": ":flag_bv:", "category": "flags", @@ -8914,7 +9821,11 @@ ":bv:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇧🇻" }, "flag_bw": { "unicode": "1F1E7-1F1FC", @@ -8929,8 +9840,10 @@ "keywords": [ "country", "nation", - "bw" - ] + "bw", + "flag" + ], + "moji": "🇧🇼" }, "flag_by": { "unicode": "1F1E7-1F1FE", @@ -8946,8 +9859,10 @@ "country", "nation", "byelarus", - "by" - ] + "by", + "flag" + ], + "moji": "🇧🇾" }, "flag_bz": { "unicode": "1F1E7-1F1FF", @@ -8962,8 +9877,10 @@ "keywords": [ "country", "nation", - "bz" - ] + "bz", + "flag" + ], + "moji": "🇧🇿" }, "flag_ca": { "unicode": "1F1E8-1F1E6", @@ -8978,12 +9895,14 @@ "keywords": [ "country", "nation", - "ca" - ] + "ca", + "flag" + ], + "moji": "🇨🇦" }, "flag_cc": { "unicode": "1F1E8-1F1E8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "cocos (keeling) islands", "shortname": ":flag_cc:", "category": "flags", @@ -8991,7 +9910,11 @@ ":cc:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇨🇨" }, "flag_cd": { "unicode": "1F1E8-1F1E9", @@ -9008,8 +9931,10 @@ "nation", "république démocratique du congo", "republique democratique du congo", - "cd" - ] + "cd", + "flag" + ], + "moji": "🇨🇩" }, "flag_cf": { "unicode": "1F1E8-1F1EB", @@ -9024,8 +9949,10 @@ "keywords": [ "country", "nation", - "cf" - ] + "cf", + "flag" + ], + "moji": "🇨🇫" }, "flag_cg": { "unicode": "1F1E8-1F1EC", @@ -9040,8 +9967,10 @@ "keywords": [ "country", "nation", - "cg" - ] + "cg", + "flag" + ], + "moji": "🇨🇬" }, "flag_ch": { "unicode": "1F1E8-1F1ED", @@ -9056,8 +9985,11 @@ "keywords": [ "country", "nation", - "swiss" - ] + "swiss", + "neutral", + "flag" + ], + "moji": "🇨ðŸ‡" }, "flag_ci": { "unicode": "1F1E8-1F1EE", @@ -9072,12 +10004,14 @@ "keywords": [ "country", "nation", - "ci" - ] + "ci", + "flag" + ], + "moji": "🇨🇮" }, "flag_ck": { "unicode": "1F1E8-1F1F0", - "unicode_alternates": "", + "unicode_alternates": [], "name": "cook islands", "shortname": ":flag_ck:", "category": "flags", @@ -9085,7 +10019,11 @@ ":ck:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇨🇰" }, "flag_cl": { "unicode": "1F1E8-1F1F1", @@ -9100,8 +10038,10 @@ "keywords": [ "country", "nation", - "cl" - ] + "cl", + "flag" + ], + "moji": "🇨🇱" }, "flag_cm": { "unicode": "1F1E8-1F1F2", @@ -9116,8 +10056,10 @@ "keywords": [ "country", "nation", - "cm" - ] + "cm", + "flag" + ], + "moji": "🇨🇲" }, "flag_cn": { "unicode": "1F1E8-1F1F3", @@ -9135,8 +10077,10 @@ "zhong guo", "country", "nation", - "cn" - ] + "cn", + "flag" + ], + "moji": "🇨🇳" }, "flag_co": { "unicode": "1F1E8-1F1F4", @@ -9151,12 +10095,14 @@ "keywords": [ "country", "nation", - "co" - ] + "co", + "flag" + ], + "moji": "🇨🇴" }, "flag_cp": { "unicode": "1F1E8-1F1F5", - "unicode_alternates": "", + "unicode_alternates": [], "name": "clipperton island", "shortname": ":flag_cp:", "category": "flags", @@ -9164,7 +10110,11 @@ ":cp:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇨🇵" }, "flag_cr": { "unicode": "1F1E8-1F1F7", @@ -9179,8 +10129,10 @@ "keywords": [ "country", "nation", - "cr" - ] + "cr", + "flag" + ], + "moji": "🇨🇷" }, "flag_cu": { "unicode": "1F1E8-1F1FA", @@ -9195,8 +10147,10 @@ "keywords": [ "country", "nation", - "cu" - ] + "cu", + "flag" + ], + "moji": "🇨🇺" }, "flag_cv": { "unicode": "1F1E8-1F1FB", @@ -9212,12 +10166,14 @@ "country", "nation", "cabo verde", - "cv" - ] + "cv", + "flag" + ], + "moji": "🇨🇻" }, "flag_cw": { "unicode": "1F1E8-1F1FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "curaçao", "shortname": ":flag_cw:", "category": "flags", @@ -9225,11 +10181,15 @@ ":cw:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇨🇼" }, "flag_cx": { "unicode": "1F1E8-1F1FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "christmas island", "shortname": ":flag_cx:", "category": "flags", @@ -9237,7 +10197,11 @@ ":cx:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇨🇽" }, "flag_cy": { "unicode": "1F1E8-1F1FE", @@ -9254,8 +10218,10 @@ "nation", "kibris", "kypros", - "cy" - ] + "cy", + "flag" + ], + "moji": "🇨🇾" }, "flag_cz": { "unicode": "1F1E8-1F1FF", @@ -9271,8 +10237,10 @@ "country", "nation", "ceska republika", - "cz" - ] + "cz", + "flag" + ], + "moji": "🇨🇿" }, "flag_de": { "unicode": "1F1E9-1F1EA", @@ -9289,20 +10257,26 @@ "nation", "deutschland", "country", - "de" - ] + "de", + "flag" + ], + "moji": "🇩🇪" }, "flag_dg": { "unicode": "1F1E9-1F1EC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "diego garcia", "shortname": ":flag_dg:", "category": "flags", "aliases": [ ":dg:" ], - "aliases_ascii": [], - "keywords": [] + "aliases_ascii": [], + "keywords": [ + "country", + "flag" + ], + "moji": "🇩🇬" }, "flag_dj": { "unicode": "1F1E9-1F1EF", @@ -9317,8 +10291,10 @@ "keywords": [ "country", "nation", - "dj" - ] + "dj", + "flag" + ], + "moji": "🇩🇯" }, "flag_dk": { "unicode": "1F1E9-1F1F0", @@ -9334,8 +10310,10 @@ "country", "nation", "danmark", - "dk" - ] + "dk", + "flag" + ], + "moji": "🇩🇰" }, "flag_dm": { "unicode": "1F1E9-1F1F2", @@ -9350,8 +10328,10 @@ "keywords": [ "country", "nation", - "dm" - ] + "dm", + "flag" + ], + "moji": "🇩🇲" }, "flag_do": { "unicode": "1F1E9-1F1F4", @@ -9366,8 +10346,10 @@ "keywords": [ "country", "nation", - "do" - ] + "do", + "flag" + ], + "moji": "🇩🇴" }, "flag_dz": { "unicode": "1F1E9-1F1FF", @@ -9384,12 +10366,14 @@ "nation", "al jaza'ir", "al jazair", - "dz" - ] + "dz", + "flag" + ], + "moji": "🇩🇿" }, "flag_ea": { "unicode": "1F1EA-1F1E6", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ceuta, melilla", "shortname": ":flag_ea:", "category": "flags", @@ -9397,7 +10381,11 @@ ":ea:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇪🇦" }, "flag_ec": { "unicode": "1F1EA-1F1E8", @@ -9412,8 +10400,10 @@ "keywords": [ "country", "nation", - "ec" - ] + "ec", + "flag" + ], + "moji": "🇪🇨" }, "flag_ee": { "unicode": "1F1EA-1F1EA", @@ -9429,8 +10419,10 @@ "country", "nation", "eesti vabariik", - "ee" - ] + "ee", + "flag" + ], + "moji": "🇪🇪" }, "flag_eg": { "unicode": "1F1EA-1F1EC", @@ -9446,8 +10438,10 @@ "country", "nation", "misr", - "eg" - ] + "eg", + "flag" + ], + "moji": "🇪🇬" }, "flag_eh": { "unicode": "1F1EA-1F1ED", @@ -9465,8 +10459,10 @@ "aá¹£-á¹¢aḥrÄ’ al-gharbÄ«yah", "sahra", "gharbiyah", - "eh" - ] + "eh", + "flag" + ], + "moji": "🇪ðŸ‡" }, "flag_er": { "unicode": "1F1EA-1F1F7", @@ -9482,8 +10478,10 @@ "country", "nation", "hagere ertra", - "er" - ] + "er", + "flag" + ], + "moji": "🇪🇷" }, "flag_es": { "unicode": "1F1EA-1F1F8", @@ -9500,8 +10498,10 @@ "españa", "country", "espana", - "es" - ] + "es", + "flag" + ], + "moji": "🇪🇸" }, "flag_et": { "unicode": "1F1EA-1F1F9", @@ -9518,12 +10518,14 @@ "nation", "ityop'iya", "ityopiya", - "et" - ] + "et", + "flag" + ], + "moji": "🇪🇹" }, "flag_eu": { "unicode": "1F1EA-1F1FA", - "unicode_alternates": "", + "unicode_alternates": [], "name": "european union", "shortname": ":flag_eu:", "category": "flags", @@ -9531,7 +10533,11 @@ ":eu:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇪🇺" }, "flag_fi": { "unicode": "1F1EB-1F1EE", @@ -9547,8 +10553,10 @@ "country", "nation", "suomen tasavalta", - "fi" - ] + "fi", + "flag" + ], + "moji": "🇫🇮" }, "flag_fj": { "unicode": "1F1EB-1F1EF", @@ -9563,8 +10571,10 @@ "keywords": [ "country", "nation", - "fj" - ] + "fj", + "flag" + ], + "moji": "🇫🇯" }, "flag_fk": { "unicode": "1F1EB-1F1F0", @@ -9580,8 +10590,10 @@ "country", "nation", "islas malvinas", - "fk" - ] + "fk", + "flag" + ], + "moji": "🇫🇰" }, "flag_fm": { "unicode": "1F1EB-1F1F2", @@ -9596,8 +10608,10 @@ "keywords": [ "country", "nation", - "fm" - ] + "fm", + "flag" + ], + "moji": "🇫🇲" }, "flag_fo": { "unicode": "1F1EB-1F1F4", @@ -9613,8 +10627,10 @@ "country", "nation", "foroyar", - "fo" - ] + "fo", + "flag" + ], + "moji": "🇫🇴" }, "flag_fr": { "unicode": "1F1EB-1F1F7", @@ -9630,8 +10646,10 @@ "french", "nation", "country", - "fr" - ] + "fr", + "flag" + ], + "moji": "🇫🇷" }, "flag_ga": { "unicode": "1F1EC-1F1E6", @@ -9646,8 +10664,10 @@ "keywords": [ "country", "nation", - "ga" - ] + "ga", + "flag" + ], + "moji": "🇬🇦" }, "flag_gb": { "unicode": "1F1EC-1F1E7", @@ -9666,8 +10686,10 @@ "nation", "united kingdom", "england", - "country" - ] + "country", + "flag" + ], + "moji": "🇬🇧" }, "flag_gd": { "unicode": "1F1EC-1F1E9", @@ -9682,8 +10704,10 @@ "keywords": [ "country", "nation", - "gd" - ] + "gd", + "flag" + ], + "moji": "🇬🇩" }, "flag_ge": { "unicode": "1F1EC-1F1EA", @@ -9700,12 +10724,14 @@ "nation", "sak'art'velo", "sakartvelo", - "ge" - ] + "ge", + "flag" + ], + "moji": "🇬🇪" }, "flag_gf": { "unicode": "1F1EC-1F1EB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "french guiana", "shortname": ":flag_gf:", "category": "flags", @@ -9713,11 +10739,15 @@ ":gf:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇬🇫" }, "flag_gg": { "unicode": "1F1EC-1F1EC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "guernsey", "shortname": ":flag_gg:", "category": "flags", @@ -9725,7 +10755,11 @@ ":gg:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇬🇬" }, "flag_gh": { "unicode": "1F1EC-1F1ED", @@ -9740,8 +10774,10 @@ "keywords": [ "country", "nation", - "gh" - ] + "gh", + "flag" + ], + "moji": "🇬ðŸ‡" }, "flag_gi": { "unicode": "1F1EC-1F1EE", @@ -9756,8 +10792,10 @@ "keywords": [ "country", "nation", - "gi" - ] + "gi", + "flag" + ], + "moji": "🇬🇮" }, "flag_gl": { "unicode": "1F1EC-1F1F1", @@ -9773,8 +10811,10 @@ "country", "nation", "kalaallit nunaat", - "gl" - ] + "gl", + "flag" + ], + "moji": "🇬🇱" }, "flag_gm": { "unicode": "1F1EC-1F1F2", @@ -9789,8 +10829,10 @@ "keywords": [ "country", "nation", - "gm" - ] + "gm", + "flag" + ], + "moji": "🇬🇲" }, "flag_gn": { "unicode": "1F1EC-1F1F3", @@ -9806,12 +10848,14 @@ "country", "nation", "guinee", - "gn" - ] + "gn", + "flag" + ], + "moji": "🇬🇳" }, "flag_gp": { "unicode": "1F1EC-1F1F5", - "unicode_alternates": "", + "unicode_alternates": [], "name": "guadeloupe", "shortname": ":flag_gp:", "category": "flags", @@ -9819,7 +10863,11 @@ ":gp:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇬🇵" }, "flag_gq": { "unicode": "1F1EC-1F1F6", @@ -9835,8 +10883,10 @@ "country", "nation", "guinea ecuatorial", - "gq" - ] + "gq", + "flag" + ], + "moji": "🇬🇶" }, "flag_gr": { "unicode": "1F1EC-1F1F7", @@ -9853,12 +10903,14 @@ "nation", "ellas", "ellada", - "gr" - ] + "gr", + "flag" + ], + "moji": "🇬🇷" }, "flag_gs": { "unicode": "1F1EC-1F1F8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "south georgia", "shortname": ":flag_gs:", "category": "flags", @@ -9866,7 +10918,11 @@ ":gs:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇬🇸" }, "flag_gt": { "unicode": "1F1EC-1F1F9", @@ -9881,8 +10937,10 @@ "keywords": [ "country", "nation", - "gt" - ] + "gt", + "flag" + ], + "moji": "🇬🇹" }, "flag_gu": { "unicode": "1F1EC-1F1FA", @@ -9897,8 +10955,10 @@ "keywords": [ "country", "nation", - "gu" - ] + "gu", + "flag" + ], + "moji": "🇬🇺" }, "flag_gw": { "unicode": "1F1EC-1F1FC", @@ -9915,8 +10975,10 @@ "nation", "guine-bissau", "guine bissau", - "gw" - ] + "gw", + "flag" + ], + "moji": "🇬🇼" }, "flag_gy": { "unicode": "1F1EC-1F1FE", @@ -9931,8 +10993,10 @@ "keywords": [ "country", "nation", - "gy" - ] + "gy", + "flag" + ], + "moji": "🇬🇾" }, "flag_hk": { "unicode": "1F1ED-1F1F0", @@ -9948,12 +11012,14 @@ "country", "nation", "xianggang", - "hk" - ] + "hk", + "flag" + ], + "moji": "ðŸ‡ðŸ‡°" }, "flag_hm": { "unicode": "1F1ED-1F1F2", - "unicode_alternates": "", + "unicode_alternates": [], "name": "heard island and mcdonald islands", "shortname": ":flag_hm:", "category": "flags", @@ -9961,7 +11027,11 @@ ":hm:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "ðŸ‡ðŸ‡²" }, "flag_hn": { "unicode": "1F1ED-1F1F3", @@ -9976,8 +11046,10 @@ "keywords": [ "country", "nation", - "hn" - ] + "hn", + "flag" + ], + "moji": "ðŸ‡ðŸ‡³" }, "flag_hr": { "unicode": "1F1ED-1F1F7", @@ -9993,8 +11065,10 @@ "country", "nation", "hrvatska", - "hr" - ] + "hr", + "flag" + ], + "moji": "ðŸ‡ðŸ‡·" }, "flag_ht": { "unicode": "1F1ED-1F1F9", @@ -10009,8 +11083,10 @@ "keywords": [ "country", "nation", - "ht" - ] + "ht", + "flag" + ], + "moji": "ðŸ‡ðŸ‡¹" }, "flag_hu": { "unicode": "1F1ED-1F1FA", @@ -10026,12 +11102,14 @@ "country", "nation", "magyarorszag", - "hu" - ] + "hu", + "flag" + ], + "moji": "ðŸ‡ðŸ‡º" }, "flag_ic": { "unicode": "1F1EE-1F1E8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "canary islands", "shortname": ":flag_ic:", "category": "flags", @@ -10039,7 +11117,11 @@ ":ic:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇮🇨" }, "flag_id": { "unicode": "1F1EE-1F1E9", @@ -10054,8 +11136,10 @@ "keywords": [ "country", "nation", - "id" - ] + "id", + "flag" + ], + "moji": "🇮🇩" }, "flag_ie": { "unicode": "1F1EE-1F1EA", @@ -10072,8 +11156,10 @@ "nation", "éire", "eire", - "ie" - ] + "ie", + "flag" + ], + "moji": "🇮🇪" }, "flag_il": { "unicode": "1F1EE-1F1F1", @@ -10090,12 +11176,15 @@ "nation", "yisra'el", "yisrael", - "il" - ] + "il", + "jew", + "flag" + ], + "moji": "🇮🇱" }, "flag_im": { "unicode": "1F1EE-1F1F2", - "unicode_alternates": "", + "unicode_alternates": [], "name": "isle of man", "shortname": ":flag_im:", "category": "flags", @@ -10103,7 +11192,11 @@ ":im:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇮🇲" }, "flag_in": { "unicode": "1F1EE-1F1F3", @@ -10119,12 +11212,14 @@ "country", "nation", "bharat", - "in" - ] + "in", + "flag" + ], + "moji": "🇮🇳" }, "flag_io": { "unicode": "1F1EE-1F1F4", - "unicode_alternates": "", + "unicode_alternates": [], "name": "british indian ocean territory", "shortname": ":flag_io:", "category": "flags", @@ -10132,7 +11227,11 @@ ":io:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇮🇴" }, "flag_iq": { "unicode": "1F1EE-1F1F6", @@ -10147,8 +11246,10 @@ "keywords": [ "country", "nation", - "iq" - ] + "iq", + "flag" + ], + "moji": "🇮🇶" }, "flag_ir": { "unicode": "1F1EE-1F1F7", @@ -10163,8 +11264,10 @@ "keywords": [ "country", "nation", - "ir" - ] + "ir", + "flag" + ], + "moji": "🇮🇷" }, "flag_is": { "unicode": "1F1EE-1F1F8", @@ -10180,8 +11283,10 @@ "country", "nation", "lyoveldio island", - "is" - ] + "is", + "flag" + ], + "moji": "🇮🇸" }, "flag_it": { "unicode": "1F1EE-1F1F9", @@ -10197,8 +11302,11 @@ "italia", "country", "nation", - "it" - ] + "it", + "italian", + "flag" + ], + "moji": "🇮🇹" }, "flag_je": { "unicode": "1F1EF-1F1EA", @@ -10213,8 +11321,10 @@ "keywords": [ "country", "nation", - "je" - ] + "je", + "flag" + ], + "moji": "🇯🇪" }, "flag_jm": { "unicode": "1F1EF-1F1F2", @@ -10229,8 +11339,10 @@ "keywords": [ "country", "nation", - "jm" - ] + "jm", + "flag" + ], + "moji": "🇯🇲" }, "flag_jo": { "unicode": "1F1EF-1F1F4", @@ -10246,8 +11358,10 @@ "country", "nation", "al urdun", - "jo" - ] + "jo", + "flag" + ], + "moji": "🇯🇴" }, "flag_jp": { "unicode": "1F1EF-1F1F5", @@ -10263,8 +11377,11 @@ "nation", "nippon", "country", - "jp" - ] + "jp", + "japan", + "flag" + ], + "moji": "🇯🇵" }, "flag_ke": { "unicode": "1F1F0-1F1EA", @@ -10279,8 +11396,10 @@ "keywords": [ "country", "nation", - "ke" - ] + "ke", + "flag" + ], + "moji": "🇰🇪" }, "flag_kg": { "unicode": "1F1F0-1F1EC", @@ -10296,8 +11415,10 @@ "country", "nation", "kyrgyz respublikasy", - "kg" - ] + "kg", + "flag" + ], + "moji": "🇰🇬" }, "flag_kh": { "unicode": "1F1F0-1F1ED", @@ -10313,8 +11434,10 @@ "country", "nation", "kampuchea", - "kh" - ] + "kh", + "flag" + ], + "moji": "🇰ðŸ‡" }, "flag_ki": { "unicode": "1F1F0-1F1EE", @@ -10331,8 +11454,10 @@ "nation", "kiribati", "kiribas", - "ki" - ] + "ki", + "flag" + ], + "moji": "🇰🇮" }, "flag_km": { "unicode": "1F1F0-1F1F2", @@ -10347,8 +11472,10 @@ "keywords": [ "country", "nation", - "km" - ] + "km", + "flag" + ], + "moji": "🇰🇲" }, "flag_kn": { "unicode": "1F1F0-1F1F3", @@ -10363,8 +11490,10 @@ "keywords": [ "country", "nation", - "kn" - ] + "kn", + "flag" + ], + "moji": "🇰🇳" }, "flag_kp": { "unicode": "1F1F0-1F1F5", @@ -10379,8 +11508,10 @@ "keywords": [ "country", "nation", - "kp" - ] + "kp", + "flag" + ], + "moji": "🇰🇵" }, "flag_kr": { "unicode": "1F1F0-1F1F7", @@ -10396,8 +11527,10 @@ "nation", "country", "south korea", - "kr" - ] + "kr", + "flag" + ], + "moji": "🇰🇷" }, "flag_kw": { "unicode": "1F1F0-1F1FC", @@ -10413,8 +11546,10 @@ "country", "nation", "al kuwayt", - "kw" - ] + "kw", + "flag" + ], + "moji": "🇰🇼" }, "flag_ky": { "unicode": "1F1F0-1F1FE", @@ -10429,8 +11564,10 @@ "keywords": [ "country", "nation", - "ky" - ] + "ky", + "flag" + ], + "moji": "🇰🇾" }, "flag_kz": { "unicode": "1F1F0-1F1FF", @@ -10446,8 +11583,10 @@ "country", "nation", "qazaqstan", - "kz" - ] + "kz", + "flag" + ], + "moji": "🇰🇿" }, "flag_la": { "unicode": "1F1F1-1F1E6", @@ -10462,8 +11601,10 @@ "keywords": [ "country", "nation", - "la" - ] + "la", + "flag" + ], + "moji": "🇱🇦" }, "flag_lb": { "unicode": "1F1F1-1F1E7", @@ -10479,8 +11620,10 @@ "country", "nation", "lubnan", - "lb" - ] + "lb", + "flag" + ], + "moji": "🇱🇧" }, "flag_lc": { "unicode": "1F1F1-1F1E8", @@ -10495,8 +11638,10 @@ "keywords": [ "country", "nation", - "lc" - ] + "lc", + "flag" + ], + "moji": "🇱🇨" }, "flag_li": { "unicode": "1F1F1-1F1EE", @@ -10511,8 +11656,10 @@ "keywords": [ "country", "nation", - "li" - ] + "li", + "flag" + ], + "moji": "🇱🇮" }, "flag_lk": { "unicode": "1F1F1-1F1F0", @@ -10527,8 +11674,10 @@ "keywords": [ "country", "nation", - "lk" - ] + "lk", + "flag" + ], + "moji": "🇱🇰" }, "flag_lr": { "unicode": "1F1F1-1F1F7", @@ -10543,8 +11692,10 @@ "keywords": [ "country", "nation", - "lr" - ] + "lr", + "flag" + ], + "moji": "🇱🇷" }, "flag_ls": { "unicode": "1F1F1-1F1F8", @@ -10559,8 +11710,10 @@ "keywords": [ "country", "nation", - "ls" - ] + "ls", + "flag" + ], + "moji": "🇱🇸" }, "flag_lt": { "unicode": "1F1F1-1F1F9", @@ -10576,8 +11729,10 @@ "country", "nation", "lietuva", - "lt" - ] + "lt", + "flag" + ], + "moji": "🇱🇹" }, "flag_lu": { "unicode": "1F1F1-1F1FA", @@ -10594,8 +11749,10 @@ "nation", "luxembourg", "letzebuerg", - "lu" - ] + "lu", + "flag" + ], + "moji": "🇱🇺" }, "flag_lv": { "unicode": "1F1F1-1F1FB", @@ -10611,8 +11768,10 @@ "country", "nation", "latvija", - "lv" - ] + "lv", + "flag" + ], + "moji": "🇱🇻" }, "flag_ly": { "unicode": "1F1F1-1F1FE", @@ -10628,8 +11787,10 @@ "country", "nation", "libiyah", - "ly" - ] + "ly", + "flag" + ], + "moji": "🇱🇾" }, "flag_ma": { "unicode": "1F1F2-1F1E6", @@ -10645,8 +11806,10 @@ "country", "nation", "al maghrib", - "ma" - ] + "ma", + "flag" + ], + "moji": "🇲🇦" }, "flag_mc": { "unicode": "1F1F2-1F1E8", @@ -10661,8 +11824,10 @@ "keywords": [ "country", "nation", - "mc" - ] + "mc", + "flag" + ], + "moji": "🇲🇨" }, "flag_md": { "unicode": "1F1F2-1F1E9", @@ -10677,8 +11842,10 @@ "keywords": [ "country", "nation", - "md" - ] + "md", + "flag" + ], + "moji": "🇲🇩" }, "flag_me": { "unicode": "1F1F2-1F1EA", @@ -10694,12 +11861,14 @@ "country", "nation", "crna gora", - "me" - ] + "me", + "flag" + ], + "moji": "🇲🇪" }, "flag_mf": { "unicode": "1F1F2-1F1EB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "saint martin", "shortname": ":flag_mf:", "category": "flags", @@ -10707,7 +11876,11 @@ ":mf:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇲🇫" }, "flag_mg": { "unicode": "1F1F2-1F1EC", @@ -10722,8 +11895,10 @@ "keywords": [ "country", "nation", - "mg" - ] + "mg", + "flag" + ], + "moji": "🇲🇬" }, "flag_mh": { "unicode": "1F1F2-1F1ED", @@ -10738,8 +11913,10 @@ "keywords": [ "country", "nation", - "mh" - ] + "mh", + "flag" + ], + "moji": "🇲ðŸ‡" }, "flag_mk": { "unicode": "1F1F2-1F1F0", @@ -10754,8 +11931,10 @@ "keywords": [ "country", "nation", - "mk" - ] + "mk", + "flag" + ], + "moji": "🇲🇰" }, "flag_ml": { "unicode": "1F1F2-1F1F1", @@ -10770,8 +11949,10 @@ "keywords": [ "country", "nation", - "ml" - ] + "ml", + "flag" + ], + "moji": "🇲🇱" }, "flag_mm": { "unicode": "1F1F2-1F1F2", @@ -10787,8 +11968,10 @@ "country", "nation", "myanma naingngandaw", - "mm" - ] + "mm", + "flag" + ], + "moji": "🇲🇲" }, "flag_mn": { "unicode": "1F1F2-1F1F3", @@ -10804,8 +11987,10 @@ "country", "nation", "mongol uls", - "mn" - ] + "mn", + "flag" + ], + "moji": "🇲🇳" }, "flag_mo": { "unicode": "1F1F2-1F1F4", @@ -10821,12 +12006,14 @@ "country", "nation", "aomen", - "mo" - ] + "mo", + "flag" + ], + "moji": "🇲🇴" }, "flag_mp": { "unicode": "1F1F2-1F1F5", - "unicode_alternates": "", + "unicode_alternates": [], "name": "northern mariana islands", "shortname": ":flag_mp:", "category": "flags", @@ -10834,11 +12021,15 @@ ":mp:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇲🇵" }, "flag_mq": { "unicode": "1F1F2-1F1F6", - "unicode_alternates": "", + "unicode_alternates": [], "name": "martinique", "shortname": ":flag_mq:", "category": "flags", @@ -10846,7 +12037,11 @@ ":mq:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇲🇶" }, "flag_mr": { "unicode": "1F1F2-1F1F7", @@ -10862,8 +12057,10 @@ "country", "nation", "muritaniyah", - "mr" - ] + "mr", + "flag" + ], + "moji": "🇲🇷" }, "flag_ms": { "unicode": "1F1F2-1F1F8", @@ -10878,8 +12075,10 @@ "keywords": [ "country", "nation", - "ms" - ] + "ms", + "flag" + ], + "moji": "🇲🇸" }, "flag_mt": { "unicode": "1F1F2-1F1F9", @@ -10894,8 +12093,10 @@ "keywords": [ "country", "nation", - "mt" - ] + "mt", + "flag" + ], + "moji": "🇲🇹" }, "flag_mu": { "unicode": "1F1F2-1F1FA", @@ -10910,8 +12111,10 @@ "keywords": [ "country", "nation", - "mu" - ] + "mu", + "flag" + ], + "moji": "🇲🇺" }, "flag_mv": { "unicode": "1F1F2-1F1FB", @@ -10927,8 +12130,10 @@ "country", "nation", "dhivehi raajje", - "mv" - ] + "mv", + "flag" + ], + "moji": "🇲🇻" }, "flag_mw": { "unicode": "1F1F2-1F1FC", @@ -10943,8 +12148,10 @@ "keywords": [ "country", "nation", - "mw" - ] + "mw", + "flag" + ], + "moji": "🇲🇼" }, "flag_mx": { "unicode": "1F1F2-1F1FD", @@ -10959,8 +12166,11 @@ "keywords": [ "country", "nation", - "mx" - ] + "mx", + "mexican", + "flag" + ], + "moji": "🇲🇽" }, "flag_my": { "unicode": "1F1F2-1F1FE", @@ -10975,8 +12185,10 @@ "keywords": [ "country", "nation", - "my" - ] + "my", + "flag" + ], + "moji": "🇲🇾" }, "flag_mz": { "unicode": "1F1F2-1F1FF", @@ -10992,8 +12204,10 @@ "country", "nation", "mocambique", - "mz" - ] + "mz", + "flag" + ], + "moji": "🇲🇿" }, "flag_na": { "unicode": "1F1F3-1F1E6", @@ -11008,8 +12222,10 @@ "keywords": [ "country", "nation", - "na" - ] + "na", + "flag" + ], + "moji": "🇳🇦" }, "flag_nc": { "unicode": "1F1F3-1F1E8", @@ -11027,8 +12243,10 @@ "nouvelle", "calédonie", "caledonie", - "nc" - ] + "nc", + "flag" + ], + "moji": "🇳🇨" }, "flag_ne": { "unicode": "1F1F3-1F1EA", @@ -11043,12 +12261,14 @@ "keywords": [ "country", "nation", - "ne" - ] + "ne", + "flag" + ], + "moji": "🇳🇪" }, "flag_nf": { "unicode": "1F1F3-1F1EB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "norfolk island", "shortname": ":flag_nf:", "category": "flags", @@ -11056,7 +12276,11 @@ ":nf:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇳🇫" }, "flag_ng": { "unicode": "1F1F3-1F1EC", @@ -11071,8 +12295,10 @@ "keywords": [ "country", "nation", - "ng" - ] + "ng", + "flag" + ], + "moji": "🇳🇬" }, "flag_ni": { "unicode": "1F1F3-1F1EE", @@ -11087,8 +12313,10 @@ "keywords": [ "country", "nation", - "ni" - ] + "ni", + "flag" + ], + "moji": "🇳🇮" }, "flag_nl": { "unicode": "1F1F3-1F1F1", @@ -11105,8 +12333,10 @@ "nation", "nederland", "holland", - "nl" - ] + "nl", + "flag" + ], + "moji": "🇳🇱" }, "flag_no": { "unicode": "1F1F3-1F1F4", @@ -11122,8 +12352,10 @@ "country", "nation", "norge", - "no" - ] + "no", + "flag" + ], + "moji": "🇳🇴" }, "flag_np": { "unicode": "1F1F3-1F1F5", @@ -11138,8 +12370,10 @@ "keywords": [ "country", "nation", - "np" - ] + "np", + "flag" + ], + "moji": "🇳🇵" }, "flag_nr": { "unicode": "1F1F3-1F1F7", @@ -11154,8 +12388,10 @@ "keywords": [ "country", "nation", - "nr" - ] + "nr", + "flag" + ], + "moji": "🇳🇷" }, "flag_nu": { "unicode": "1F1F3-1F1FA", @@ -11170,8 +12406,10 @@ "keywords": [ "country", "nation", - "nu" - ] + "nu", + "flag" + ], + "moji": "🇳🇺" }, "flag_nz": { "unicode": "1F1F3-1F1FF", @@ -11187,8 +12425,10 @@ "country", "nation", "aotearoa", - "nz" - ] + "nz", + "flag" + ], + "moji": "🇳🇿" }, "flag_om": { "unicode": "1F1F4-1F1F2", @@ -11204,8 +12444,10 @@ "country", "nation", "saltanat uman", - "om" - ] + "om", + "flag" + ], + "moji": "🇴🇲" }, "flag_pa": { "unicode": "1F1F5-1F1E6", @@ -11220,8 +12462,10 @@ "keywords": [ "country", "nation", - "pa" - ] + "pa", + "flag" + ], + "moji": "🇵🇦" }, "flag_pe": { "unicode": "1F1F5-1F1EA", @@ -11236,8 +12480,10 @@ "keywords": [ "country", "nation", - "pe" - ] + "pe", + "flag" + ], + "moji": "🇵🇪" }, "flag_pf": { "unicode": "1F1F5-1F1EB", @@ -11254,8 +12500,10 @@ "nation", "polynésie française", "polynesie francaise", - "pf" - ] + "pf", + "flag" + ], + "moji": "🇵🇫" }, "flag_pg": { "unicode": "1F1F5-1F1EC", @@ -11271,8 +12519,10 @@ "country", "nation", "papua niu gini", - "pg" - ] + "pg", + "flag" + ], + "moji": "🇵🇬" }, "flag_ph": { "unicode": "1F1F5-1F1ED", @@ -11288,8 +12538,10 @@ "country", "nation", "pilipinas", - "ph" - ] + "ph", + "flag" + ], + "moji": "🇵ðŸ‡" }, "flag_pk": { "unicode": "1F1F5-1F1F0", @@ -11304,8 +12556,10 @@ "keywords": [ "country", "nation", - "pk" - ] + "pk", + "flag" + ], + "moji": "🇵🇰" }, "flag_pl": { "unicode": "1F1F5-1F1F1", @@ -11321,12 +12575,14 @@ "country", "nation", "polska", - "pl" - ] + "pl", + "flag" + ], + "moji": "🇵🇱" }, "flag_pm": { "unicode": "1F1F5-1F1F2", - "unicode_alternates": "", + "unicode_alternates": [], "name": "saint pierre and miquelon", "shortname": ":flag_pm:", "category": "flags", @@ -11334,11 +12590,15 @@ ":pm:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇵🇲" }, "flag_pn": { "unicode": "1F1F5-1F1F3", - "unicode_alternates": "", + "unicode_alternates": [], "name": "pitcairn", "shortname": ":flag_pn:", "category": "flags", @@ -11346,7 +12606,11 @@ ":pn:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇵🇳" }, "flag_pr": { "unicode": "1F1F5-1F1F7", @@ -11361,8 +12625,10 @@ "keywords": [ "country", "nation", - "pr" - ] + "pr", + "flag" + ], + "moji": "🇵🇷" }, "flag_ps": { "unicode": "1F1F5-1F1F8", @@ -11377,8 +12643,10 @@ "keywords": [ "country", "nation", - "ps" - ] + "ps", + "flag" + ], + "moji": "🇵🇸" }, "flag_pt": { "unicode": "1F1F5-1F1F9", @@ -11393,8 +12661,10 @@ "keywords": [ "country", "nation", - "pt" - ] + "pt", + "flag" + ], + "moji": "🇵🇹" }, "flag_pw": { "unicode": "1F1F5-1F1FC", @@ -11410,8 +12680,10 @@ "country", "nation", "belau", - "pw" - ] + "pw", + "flag" + ], + "moji": "🇵🇼" }, "flag_py": { "unicode": "1F1F5-1F1FE", @@ -11426,8 +12698,10 @@ "keywords": [ "country", "nation", - "py" - ] + "py", + "flag" + ], + "moji": "🇵🇾" }, "flag_qa": { "unicode": "1F1F6-1F1E6", @@ -11443,12 +12717,14 @@ "country", "nation", "dawlat qatar", - "qa" - ] + "qa", + "flag" + ], + "moji": "🇶🇦" }, "flag_re": { "unicode": "1F1F7-1F1EA", - "unicode_alternates": "", + "unicode_alternates": [], "name": "réunion", "shortname": ":flag_re:", "category": "flags", @@ -11456,7 +12732,11 @@ ":re:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇷🇪" }, "flag_ro": { "unicode": "1F1F7-1F1F4", @@ -11471,8 +12751,10 @@ "keywords": [ "country", "nation", - "ro" - ] + "ro", + "flag" + ], + "moji": "🇷🇴" }, "flag_rs": { "unicode": "1F1F7-1F1F8", @@ -11488,8 +12770,10 @@ "country", "nation", "srbija", - "rs" - ] + "rs", + "flag" + ], + "moji": "🇷🇸" }, "flag_ru": { "unicode": "1F1F7-1F1FA", @@ -11505,8 +12789,10 @@ "nation", "russian", "country", - "ru" - ] + "ru", + "flag" + ], + "moji": "🇷🇺" }, "flag_rw": { "unicode": "1F1F7-1F1FC", @@ -11521,8 +12807,10 @@ "keywords": [ "country", "nation", - "rw" - ] + "rw", + "flag" + ], + "moji": "🇷🇼" }, "flag_sa": { "unicode": "1F1F8-1F1E6", @@ -11539,8 +12827,10 @@ "country", "nation", "al arabiyah as suudiyah", - "sa" - ] + "sa", + "flag" + ], + "moji": "🇸🇦" }, "flag_sb": { "unicode": "1F1F8-1F1E7", @@ -11555,8 +12845,10 @@ "keywords": [ "country", "nation", - "sb" - ] + "sb", + "flag" + ], + "moji": "🇸🇧" }, "flag_sc": { "unicode": "1F1F8-1F1E8", @@ -11572,8 +12864,10 @@ "country", "nation", "seychelles", - "sc" - ] + "sc", + "flag" + ], + "moji": "🇸🇨" }, "flag_sd": { "unicode": "1F1F8-1F1E9", @@ -11589,8 +12883,10 @@ "country", "nation", "as-sudan", - "sd" - ] + "sd", + "flag" + ], + "moji": "🇸🇩" }, "flag_se": { "unicode": "1F1F8-1F1EA", @@ -11606,8 +12902,10 @@ "country", "nation", "sverige", - "se" - ] + "se", + "flag" + ], + "moji": "🇸🇪" }, "flag_sg": { "unicode": "1F1F8-1F1EC", @@ -11622,8 +12920,10 @@ "keywords": [ "country", "nation", - "sg" - ] + "sg", + "flag" + ], + "moji": "🇸🇬" }, "flag_sh": { "unicode": "1F1F8-1F1ED", @@ -11638,8 +12938,10 @@ "keywords": [ "country", "nation", - "sh" - ] + "sh", + "flag" + ], + "moji": "🇸ðŸ‡" }, "flag_si": { "unicode": "1F1F8-1F1EE", @@ -11655,12 +12957,14 @@ "country", "nation", "slovenija", - "si" - ] + "si", + "flag" + ], + "moji": "🇸🇮" }, "flag_sj": { "unicode": "1F1F8-1F1EF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "svalbard and jan mayen", "shortname": ":flag_sj:", "category": "flags", @@ -11668,7 +12972,11 @@ ":sj:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇸🇯" }, "flag_sk": { "unicode": "1F1F8-1F1F0", @@ -11683,8 +12991,10 @@ "keywords": [ "country", "nation", - "sk" - ] + "sk", + "flag" + ], + "moji": "🇸🇰" }, "flag_sl": { "unicode": "1F1F8-1F1F1", @@ -11699,8 +13009,10 @@ "keywords": [ "country", "nation", - "sl" - ] + "sl", + "flag" + ], + "moji": "🇸🇱" }, "flag_sm": { "unicode": "1F1F8-1F1F2", @@ -11715,8 +13027,10 @@ "keywords": [ "country", "nation", - "sm" - ] + "sm", + "flag" + ], + "moji": "🇸🇲" }, "flag_sn": { "unicode": "1F1F8-1F1F3", @@ -11731,8 +13045,10 @@ "keywords": [ "country", "nation", - "sn" - ] + "sn", + "flag" + ], + "moji": "🇸🇳" }, "flag_so": { "unicode": "1F1F8-1F1F4", @@ -11747,8 +13063,10 @@ "keywords": [ "country", "nation", - "so" - ] + "so", + "flag" + ], + "moji": "🇸🇴" }, "flag_sr": { "unicode": "1F1F8-1F1F7", @@ -11763,12 +13081,14 @@ "keywords": [ "country", "nation", - "sr" - ] + "sr", + "flag" + ], + "moji": "🇸🇷" }, "flag_ss": { "unicode": "1F1F8-1F1F8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "south sudan", "shortname": ":flag_ss:", "category": "flags", @@ -11776,7 +13096,11 @@ ":ss:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇸🇸" }, "flag_st": { "unicode": "1F1F8-1F1F9", @@ -11792,8 +13116,10 @@ "country", "nation", "sao tome e principe", - "st" - ] + "st", + "flag" + ], + "moji": "🇸🇹" }, "flag_sv": { "unicode": "1F1F8-1F1FB", @@ -11808,12 +13134,14 @@ "keywords": [ "country", "nation", - "sv" - ] + "sv", + "flag" + ], + "moji": "🇸🇻" }, "flag_sx": { "unicode": "1F1F8-1F1FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sint maarten", "shortname": ":flag_sx:", "category": "flags", @@ -11821,7 +13149,11 @@ ":sx:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇸🇽" }, "flag_sy": { "unicode": "1F1F8-1F1FE", @@ -11836,8 +13168,10 @@ "keywords": [ "country", "nation", - "sy" - ] + "sy", + "flag" + ], + "moji": "🇸🇾" }, "flag_sz": { "unicode": "1F1F8-1F1FF", @@ -11852,12 +13186,14 @@ "keywords": [ "country", "nation", - "sz" - ] + "sz", + "flag" + ], + "moji": "🇸🇿" }, "flag_ta": { "unicode": "1F1F9-1F1E6", - "unicode_alternates": "", + "unicode_alternates": [], "name": "tristan da cunha", "shortname": ":flag_ta:", "category": "flags", @@ -11865,11 +13201,15 @@ ":ta:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇹🇦" }, "flag_tc": { "unicode": "1F1F9-1F1E8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "turks and caicos islands", "shortname": ":flag_tc:", "category": "flags", @@ -11877,7 +13217,11 @@ ":tc:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇹🇨" }, "flag_td": { "unicode": "1F1F9-1F1E9", @@ -11893,12 +13237,14 @@ "country", "nation", "tchad", - "td" - ] + "td", + "flag" + ], + "moji": "🇹🇩" }, "flag_tf": { "unicode": "1F1F9-1F1EB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "french southern territories", "shortname": ":flag_tf:", "category": "flags", @@ -11906,7 +13252,11 @@ ":tf:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇹🇫" }, "flag_tg": { "unicode": "1F1F9-1F1EC", @@ -11922,8 +13272,10 @@ "country", "nation", "republique togolaise", - "tg" - ] + "tg", + "flag" + ], + "moji": "🇹🇬" }, "flag_th": { "unicode": "1F1F9-1F1ED", @@ -11939,8 +13291,10 @@ "country", "nation", "prathet thai", - "th" - ] + "th", + "flag" + ], + "moji": "🇹ðŸ‡" }, "flag_tj": { "unicode": "1F1F9-1F1EF", @@ -11956,12 +13310,14 @@ "country", "nation", "jumhurii tojikiston", - "tj" - ] + "tj", + "flag" + ], + "moji": "🇹🇯" }, "flag_tk": { "unicode": "1F1F9-1F1F0", - "unicode_alternates": "", + "unicode_alternates": [], "name": "tokelau", "shortname": ":flag_tk:", "category": "flags", @@ -11969,7 +13325,11 @@ ":tk:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇹🇰" }, "flag_tl": { "unicode": "1F1F9-1F1F1", @@ -11984,8 +13344,10 @@ "keywords": [ "country", "nation", - "tl" - ] + "tl", + "flag" + ], + "moji": "🇹🇱" }, "flag_tm": { "unicode": "1F1F9-1F1F2", @@ -12000,8 +13362,10 @@ "keywords": [ "country", "nation", - "tm" - ] + "tm", + "flag" + ], + "moji": "🇹🇲" }, "flag_tn": { "unicode": "1F1F9-1F1F3", @@ -12017,8 +13381,10 @@ "country", "nation", "tunis", - "tn" - ] + "tn", + "flag" + ], + "moji": "🇹🇳" }, "flag_to": { "unicode": "1F1F9-1F1F4", @@ -12033,8 +13399,10 @@ "keywords": [ "country", "nation", - "to" - ] + "to", + "flag" + ], + "moji": "🇹🇴" }, "flag_tr": { "unicode": "1F1F9-1F1F7", @@ -12049,8 +13417,10 @@ "keywords": [ "country", "nation", - "turkiye" - ] + "turkiye", + "flag" + ], + "moji": "🇹🇷" }, "flag_tt": { "unicode": "1F1F9-1F1F9", @@ -12065,8 +13435,10 @@ "keywords": [ "country", "nation", - "tt" - ] + "tt", + "flag" + ], + "moji": "🇹🇹" }, "flag_tv": { "unicode": "1F1F9-1F1FB", @@ -12081,8 +13453,10 @@ "keywords": [ "country", "nation", - "tv" - ] + "tv", + "flag" + ], + "moji": "🇹🇻" }, "flag_tw": { "unicode": "1F1F9-1F1FC", @@ -12098,8 +13472,10 @@ "country", "nation", "taiwan", - "tw" - ] + "tw", + "flag" + ], + "moji": "🇹🇼" }, "flag_tz": { "unicode": "1F1F9-1F1FF", @@ -12114,8 +13490,10 @@ "keywords": [ "country", "nation", - "tz" - ] + "tz", + "flag" + ], + "moji": "🇹🇿" }, "flag_ua": { "unicode": "1F1FA-1F1E6", @@ -12131,8 +13509,10 @@ "country", "nation", "ukrayina", - "ua" - ] + "ua", + "flag" + ], + "moji": "🇺🇦" }, "flag_ug": { "unicode": "1F1FA-1F1EC", @@ -12147,12 +13527,14 @@ "keywords": [ "country", "nation", - "ug" - ] + "ug", + "flag" + ], + "moji": "🇺🇬" }, "flag_um": { "unicode": "1F1FA-1F1F2", - "unicode_alternates": "", + "unicode_alternates": [], "name": "united states minor outlying islands", "shortname": ":flag_um:", "category": "flags", @@ -12160,7 +13542,11 @@ ":um:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇺🇲" }, "flag_us": { "unicode": "1F1FA-1F1F8", @@ -12180,8 +13566,10 @@ "united states of america", "america", "old glory", - "us" - ] + "us", + "flag" + ], + "moji": "🇺🇸" }, "flag_uy": { "unicode": "1F1FA-1F1FE", @@ -12196,8 +13584,10 @@ "keywords": [ "country", "nation", - "uy" - ] + "uy", + "flag" + ], + "moji": "🇺🇾" }, "flag_uz": { "unicode": "1F1FA-1F1FF", @@ -12213,8 +13603,10 @@ "country", "nation", "uzbekiston respublikasi", - "uz" - ] + "uz", + "flag" + ], + "moji": "🇺🇿" }, "flag_va": { "unicode": "1F1FB-1F1E6", @@ -12229,8 +13621,10 @@ "keywords": [ "country", "nation", - "va" - ] + "va", + "flag" + ], + "moji": "🇻🇦" }, "flag_vc": { "unicode": "1F1FB-1F1E8", @@ -12245,8 +13639,10 @@ "keywords": [ "country", "nation", - "vc" - ] + "vc", + "flag" + ], + "moji": "🇻🇨" }, "flag_ve": { "unicode": "1F1FB-1F1EA", @@ -12261,12 +13657,14 @@ "keywords": [ "country", "nation", - "ve" - ] + "ve", + "flag" + ], + "moji": "🇻🇪" }, "flag_vg": { "unicode": "1F1FB-1F1EC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "british virgin islands", "shortname": ":flag_vg:", "category": "flags", @@ -12274,7 +13672,11 @@ ":vg:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇻🇬" }, "flag_vi": { "unicode": "1F1FB-1F1EE", @@ -12289,8 +13691,10 @@ "keywords": [ "country", "nation", - "vi" - ] + "vi", + "flag" + ], + "moji": "🇻🇮" }, "flag_vn": { "unicode": "1F1FB-1F1F3", @@ -12306,8 +13710,10 @@ "country", "nation", "viet nam", - "vn" - ] + "vn", + "flag" + ], + "moji": "🇻🇳" }, "flag_vu": { "unicode": "1F1FB-1F1FA", @@ -12322,8 +13728,10 @@ "keywords": [ "country", "nation", - "vu" - ] + "vu", + "flag" + ], + "moji": "🇻🇺" }, "flag_wf": { "unicode": "1F1FC-1F1EB", @@ -12338,23 +13746,27 @@ "keywords": [ "country", "nation", - "wf" - ] + "wf", + "flag" + ], + "moji": "🇼🇫" }, "flag_white": { "unicode": "1F3F3", "unicode_alternates": [], "name": "waving white flag", "shortname": ":flag_white:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":waving_white_flag:" ], "aliases_ascii": [], "keywords": [ "symbol", - "signal" - ] + "signal", + "object" + ], + "moji": "ðŸ³" }, "flag_ws": { "unicode": "1F1FC-1F1F8", @@ -12370,8 +13782,10 @@ "country", "nation", "american samoa", - "ws" - ] + "ws", + "flag" + ], + "moji": "🇼🇸" }, "flag_xk": { "unicode": "1F1FD-1F1F0", @@ -12386,8 +13800,10 @@ "keywords": [ "country", "nation", - "xk" - ] + "xk", + "flag" + ], + "moji": "🇽🇰" }, "flag_ye": { "unicode": "1F1FE-1F1EA", @@ -12403,12 +13819,14 @@ "country", "nation", "al yaman", - "ye" - ] + "ye", + "flag" + ], + "moji": "🇾🇪" }, "flag_yt": { "unicode": "1F1FE-1F1F9", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mayotte", "shortname": ":flag_yt:", "category": "flags", @@ -12416,7 +13834,11 @@ ":yt:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "country", + "flag" + ], + "moji": "🇾🇹" }, "flag_za": { "unicode": "1F1FF-1F1E6", @@ -12430,8 +13852,10 @@ "aliases_ascii": [], "keywords": [ "country", - "nation" - ] + "nation", + "flag" + ], + "moji": "🇿🇦" }, "flag_zm": { "unicode": "1F1FF-1F1F2", @@ -12446,8 +13870,10 @@ "keywords": [ "country", "nation", - "zm" - ] + "zm", + "flag" + ], + "moji": "🇿🇲" }, "flag_zw": { "unicode": "1F1FF-1F1FC", @@ -12462,8 +13888,10 @@ "keywords": [ "country", "nation", - "zw" - ] + "zw", + "flag" + ], + "moji": "🇿🇼" }, "flags": { "unicode": "1F38F", @@ -12484,11 +13912,11 @@ "boys", "celebration", "happiness", - "carp", "streamers", - "japanese", "holiday", - "flags" + "flags", + "object", + "japan" ], "moji": "ðŸŽ" }, @@ -12501,56 +13929,25 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "dark" + "dark", + "electronics", + "object" ], "moji": "🔦" }, "fleur-de-lis": { "unicode": "269C", - "unicode_alternates": "", + "unicode_alternates": [], "name": "fleur-de-lis", "shortname": ":fleur-de-lis:", "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "symbol" - ] - }, - "flip_phone": { - "unicode": "1F581", - "unicode_alternates": [], - "name": "clamshell mobile phone", - "shortname": ":flip_phone:", - "category": "objects_symbols", - "aliases": [ - ":clamshell_mobile_phone:" - ], - "aliases_ascii": [], - "keywords": [ - "cellphone" - ] - }, - "floppy_black": { - "unicode": "1F5AA", - "unicode_alternates": [], - "name": "black hard shell floppy disk", - "shortname": ":floppy_black:", - "category": "objects_symbols", - "aliases": [ - ":black_hard_shell_floppy_disk:" + "symbol", + "object" ], - "aliases_ascii": [], - "keywords": [ - "oldschool", - "save", - "technology", - "storage", - "information", - "computer", - "drive", - "megabyte" - ] + "moji": "âšœ" }, "floppy_disk": { "unicode": "1F4BE", @@ -12570,37 +13967,18 @@ "information", "computer", "drive", - "megabyte" - ], - "moji": "💾" - }, - "floppy_white": { - "unicode": "1F5AB", - "unicode_alternates": [], - "name": "white hard shell floppy disk", - "shortname": ":floppy_white:", - "category": "objects_symbols", - "aliases": [ - ":white_hard_shell_floppy_disk:" - ], - "aliases_ascii": [], - "keywords": [ - "oldschool", - "save", - "technology", - "storage", - "information", - "computer", - "drive", - "megabyte" - ] + "megabyte", + "electronics", + "office" + ], + "moji": "💾" }, "flower_playing_cards": { "unicode": "1F3B4", "unicode_alternates": [], "name": "flower playing cards", "shortname": ":flower_playing_cards:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -12610,7 +13988,9 @@ "game", "august", "moon", - "special" + "special", + "object", + "symbol" ], "moji": "🎴" }, @@ -12619,7 +13999,7 @@ "unicode_alternates": [], "name": "flushed face", "shortname": ":flushed:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":$", @@ -12630,11 +14010,13 @@ "face", "flattered", "flush", - "blush", "red", "pink", "cheeks", - "shy" + "shy", + "smiley", + "emotion", + "omg" ], "moji": "😳" }, @@ -12650,15 +14032,18 @@ "weather", "damp", "cloud", - "hazy" - ] + "hazy", + "sky", + "cold" + ], + "moji": "🌫" }, "foggy": { "unicode": "1F301", "unicode_alternates": [], "name": "foggy", "shortname": ":foggy:", - "category": "nature", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -12667,43 +14052,21 @@ "bridge", "weather", "fog", - "foggy" + "foggy", + "places", + "building", + "sky", + "travel", + "vacation" ], "moji": "ðŸŒ" }, - "folder": { - "unicode": "1F5C0", - "unicode_alternates": [], - "name": "folder", - "shortname": ":folder:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "documents" - ] - }, - "folder_open": { - "unicode": "1F5C1", - "unicode_alternates": [], - "name": "open folder", - "shortname": ":folder_open:", - "category": "objects_symbols", - "aliases": [ - ":open_folder:" - ], - "aliases_ascii": [], - "keywords": [ - "documents", - "load" - ] - }, "football": { "unicode": "1F3C8", "unicode_alternates": [], "name": "american football", "shortname": ":football:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -12714,7 +14077,8 @@ "ball", "sport", "america", - "american" + "american", + "game" ], "moji": "ðŸˆ" }, @@ -12723,7 +14087,7 @@ "unicode_alternates": [], "name": "footprints", "shortname": ":footprints:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -12736,7 +14100,7 @@ "unicode_alternates": [], "name": "fork and knife", "shortname": ":fork_and_knife:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -12747,7 +14111,9 @@ "restaurant", "meal", "food", - "eat" + "eat", + "object", + "weapon" ], "moji": "ðŸ´" }, @@ -12756,7 +14122,7 @@ "unicode_alternates": [], "name": "fork and knife with plate", "shortname": ":fork_knife_plate:", - "category": "travel_places", + "category": "food", "aliases": [ ":fork_and_knife_with_plate:" ], @@ -12768,8 +14134,10 @@ "lunch", "dinner", "utensils", - "setting" - ] + "setting", + "object" + ], + "moji": "ðŸ½" }, "fountain": { "unicode": "26F2", @@ -12778,11 +14146,13 @@ ], "name": "fountain", "shortname": ":fountain:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "photo" + "photo", + "travel", + "vacation" ], "moji": "⛲" }, @@ -12792,15 +14162,18 @@ "unicode_alternates": [ "0034-FE0F-20E3" ], - "name": "digit four", + "name": "keycap digit four", "shortname": ":four:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "4", "blue-square", - "numbers" + "numbers", + "number", + "math", + "symbol" ] }, "four_leaf_clover": { @@ -12823,74 +14196,75 @@ "irish", "saint", "patrick", - "green" + "green", + "sol" ], "moji": "ðŸ€" }, - "frame_photo": { - "unicode": "1F5BC", + "fox": { + "unicode": "1F98A", "unicode_alternates": [], - "name": "frame with picture", - "shortname": ":frame_photo:", - "category": "objects_symbols", + "name": "fox face", + "shortname": ":fox:", + "category": "nature", "aliases": [ - ":frame_with_picture:" + ":fox_face:" ], "aliases_ascii": [], - "keywords": [ - "photo" - ] + "keywords": [], + "moji": "🦊" }, - "frame_tiles": { - "unicode": "1F5BD", + "frame_photo": { + "unicode": "1F5BC", "unicode_alternates": [], - "name": "frame with tiles", - "shortname": ":frame_tiles:", - "category": "objects_symbols", + "name": "frame with picture", + "shortname": ":frame_photo:", + "category": "objects", "aliases": [ - ":frame_with_tiles:" + ":frame_with_picture:" ], "aliases_ascii": [], "keywords": [ "photo", - "painting" - ] - }, - "frame_x": { - "unicode": "1F5BE", - "unicode_alternates": [], - "name": "frame with an x", - "shortname": ":frame_x:", - "category": "objects_symbols", - "aliases": [ - ":frame_with_an_x:" + "travel", + "vacation" ], - "aliases_ascii": [], - "keywords": [ - "photo", - "painting" - ] + "moji": "🖼" }, "free": { "unicode": "1F193", "unicode_alternates": [], "name": "squared free", "shortname": ":free:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "words" + "words", + "symbol" ], "moji": "🆓" }, + "french_bread": { + "unicode": "1F956", + "unicode_alternates": [], + "name": "baguette bread", + "shortname": ":french_bread:", + "category": "food", + "aliases": [ + ":baguette_bread:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥖" + }, "fried_shrimp": { "unicode": "1F364", "unicode_alternates": [], "name": "fried shrimp", "shortname": ":fried_shrimp:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -12909,7 +14283,7 @@ "unicode_alternates": [], "name": "french fries", "shortname": ":fries:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -12920,7 +14294,8 @@ "potato", "fry", "russet", - "idaho" + "idaho", + "america" ], "moji": "ðŸŸ" }, @@ -12934,7 +14309,8 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" + "nature", + "wildlife" ], "moji": "ðŸ¸" }, @@ -12943,7 +14319,7 @@ "unicode_alternates": [], "name": "frowning face with open mouth", "shortname": ":frowning:", - "category": "emoticons", + "category": "people", "aliases": [ ":anguished:" ], @@ -12955,13 +14331,16 @@ "sad", "pout", "sulk", - "glower" + "glower", + "smiley", + "surprised", + "emotion" ], "moji": "😦" }, "frowning2": { "unicode": "2639", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white frowning face", "shortname": ":frowning2:", "category": "people", @@ -12971,8 +14350,12 @@ "aliases_ascii": [], "keywords": [ "frown", - "person" - ] + "person", + "sad", + "smiley", + "emotion" + ], + "moji": "☹" }, "fuelpump": { "unicode": "26FD", @@ -12981,12 +14364,14 @@ ], "name": "fuel pump", "shortname": ":fuelpump:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "gas station", - "petroleum" + "petroleum", + "object", + "gas pump" ], "moji": "⛽" }, @@ -13010,7 +14395,8 @@ "monster", "spooky", "werewolves", - "twilight" + "twilight", + "space" ], "moji": "🌕" }, @@ -13029,12 +14415,13 @@ "anthropomorphic", "face", "sky", - "night", "cheese", "phase", "spooky", "werewolves", - "monsters" + "monsters", + "space", + "goodnight" ], "moji": "ðŸŒ" }, @@ -13043,23 +14430,24 @@ "unicode_alternates": [], "name": "game die", "shortname": ":game_die:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ "dice", "game", "die", - "dice", "craps", "gamble", - "play" + "play", + "object", + "boys night" ], "moji": "🎲" }, "gear": { "unicode": "2699", - "unicode_alternates": "", + "unicode_alternates": [], "name": "gear", "shortname": ":gear:", "category": "objects", @@ -13068,19 +14456,22 @@ "keywords": [ "object", "tool" - ] + ], + "moji": "âš™" }, "gem": { "unicode": "1F48E", "unicode_alternates": [], "name": "gem stone", "shortname": ":gem:", - "category": "emoticons", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "blue", - "ruby" + "ruby", + "object", + "gem" ], "moji": "💎" }, @@ -13091,7 +14482,7 @@ ], "name": "gemini", "shortname": ":gemini:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13103,9 +14494,8 @@ "stars", "zodiac", "sign", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♊" }, @@ -13114,11 +14504,13 @@ "unicode_alternates": [], "name": "ghost", "shortname": ":ghost:", - "category": "objects", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ - "halloween" + "halloween", + "holidays", + "monster" ], "moji": "👻" }, @@ -13136,11 +14528,12 @@ "present", "xmas", "gift", - "present", "wrap", "package", - "birthday", - "wedding" + "wedding", + "object", + "holidays", + "parties" ], "moji": "ðŸŽ" }, @@ -13149,12 +14542,14 @@ "unicode_alternates": [], "name": "heart with ribbon", "shortname": ":gift_heart:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "love", - "valentines" + "valentines", + "symbol", + "condolence" ], "moji": "ðŸ’" }, @@ -13163,18 +14558,22 @@ "unicode_alternates": [], "name": "girl", "shortname": ":girl:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "female", - "woman" + "woman", + "people", + "women", + "baby", + "diversity" ], "moji": "👧" }, "girl_tone1": { "unicode": "1F467-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "girl tone 1", "shortname": ":girl_tone1:", "category": "people", @@ -13184,11 +14583,12 @@ "female", "kid", "child" - ] + ], + "moji": "👧ðŸ»" }, "girl_tone2": { "unicode": "1F467-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "girl tone 2", "shortname": ":girl_tone2:", "category": "people", @@ -13198,11 +14598,12 @@ "female", "kid", "child" - ] + ], + "moji": "👧ðŸ¼" }, "girl_tone3": { "unicode": "1F467-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "girl tone 3", "shortname": ":girl_tone3:", "category": "people", @@ -13212,11 +14613,12 @@ "female", "kid", "child" - ] + ], + "moji": "👧ðŸ½" }, "girl_tone4": { "unicode": "1F467-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "girl tone 4", "shortname": ":girl_tone4:", "category": "people", @@ -13226,11 +14628,12 @@ "female", "kid", "child" - ] + ], + "moji": "👧ðŸ¾" }, "girl_tone5": { "unicode": "1F467-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "girl tone 5", "shortname": ":girl_tone5:", "category": "people", @@ -13240,42 +14643,43 @@ "female", "kid", "child" - ] - }, - "girls_symbol": { - "unicode": "1F6CA", - "unicode_alternates": [], - "name": "girls symbol", - "shortname": ":girls_symbol:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "female", - "child" - ] + ], + "moji": "👧ðŸ¿" }, "globe_with_meridians": { "unicode": "1F310", "unicode_alternates": [], "name": "globe with meridians", "shortname": ":globe_with_meridians:", - "category": "nature", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "earth", "international", "world", - "earth", "meridian", "globe", "space", "planet", - "home" + "home", + "symbol" ], "moji": "ðŸŒ" }, + "goal": { + "unicode": "1F945", + "unicode_alternates": [], + "name": "goal net", + "shortname": ":goal:", + "category": "activity", + "aliases": [ + ":goal_net:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥅" + }, "goat": { "unicode": "1F410", "unicode_alternates": [], @@ -13302,12 +14706,17 @@ ], "name": "flag in hole", "shortname": ":golf:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ "business", - "sports" + "sports", + "game", + "ball", + "vacation", + "sport", + "golf" ], "moji": "⛳" }, @@ -13324,15 +14733,32 @@ "par", "birdie", "eagle", - "mulligan" - ] + "mulligan", + "men", + "game", + "ball", + "vacation", + "golf" + ], + "moji": "ðŸŒ" + }, + "gorilla": { + "unicode": "1F98D", + "unicode_alternates": [], + "name": "gorilla", + "shortname": ":gorilla:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¦" }, "grapes": { "unicode": "1F347", "unicode_alternates": [], "name": "grapes", "shortname": ":grapes:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13341,7 +14767,6 @@ "grapes", "wine", "vinegar", - "fruit", "cluster", "vine" ], @@ -13352,19 +14777,19 @@ "unicode_alternates": [], "name": "green apple", "shortname": ":green_apple:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ "fruit", "nature", "apple", - "fruit", "green", "pie", "granny", "smith", - "core" + "core", + "food" ], "moji": "ðŸ" }, @@ -13379,7 +14804,10 @@ "keywords": [ "knowledge", "library", - "read" + "read", + "object", + "office", + "book" ], "moji": "📗" }, @@ -13388,7 +14816,7 @@ "unicode_alternates": [], "name": "green heart", "shortname": ":green_heart:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13398,14 +14826,14 @@ "valentines", "green", "heart", - "love", "nature", "rebirth", "reborn", "jealous", "clingy", "envious", - "possessive" + "possessive", + "symbol" ], "moji": "💚" }, @@ -13414,11 +14842,13 @@ "unicode_alternates": [], "name": "white exclamation mark ornament", "shortname": ":grey_exclamation:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "surprise" + "surprise", + "symbol", + "punctuation" ], "moji": "â•" }, @@ -13427,11 +14857,13 @@ "unicode_alternates": [], "name": "white question mark ornament", "shortname": ":grey_question:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "doubts" + "doubts", + "symbol", + "punctuation" ], "moji": "â”" }, @@ -13440,16 +14872,19 @@ "unicode_alternates": [], "name": "grimacing face", "shortname": ":grimacing:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "face", "grimace", "teeth", - "grimace", "disapprove", - "pain" + "pain", + "silly", + "smiley", + "emotion", + "selfie" ], "moji": "😬" }, @@ -13458,7 +14893,7 @@ "unicode_alternates": [], "name": "grinning face with smiling eyes", "shortname": ":grin:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13469,8 +14904,11 @@ "grin", "grinning", "smiling", - "smile", - "smiley" + "smiley", + "silly", + "emotion", + "good", + "selfie" ], "moji": "ðŸ˜" }, @@ -13479,7 +14917,7 @@ "unicode_alternates": [], "name": "grinning face", "shortname": ":grinning:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13490,17 +14928,17 @@ "grin", "grinning", "smiling", - "smile", - "smiley" + "smiley", + "emotion" ], - "moji": "🕧" + "moji": "😀" }, "guardsman": { "unicode": "1F482", "unicode_alternates": [], "name": "guardsman", "shortname": ":guardsman:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13513,16 +14951,19 @@ "guard", "bearskin", "hat", - "british", "queen", "ceremonial", - "military" + "military", + "people", + "men", + "diversity", + "job" ], "moji": "💂" }, "guardsman_tone1": { "unicode": "1F482-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "guardsman tone 1", "shortname": ":guardsman_tone1:", "category": "people", @@ -13537,15 +14978,15 @@ "guard", "bearskin", "hat", - "british", "queen", "ceremonial", "military" - ] + ], + "moji": "💂ðŸ»" }, "guardsman_tone2": { "unicode": "1F482-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "guardsman tone 2", "shortname": ":guardsman_tone2:", "category": "people", @@ -13560,15 +15001,15 @@ "guard", "bearskin", "hat", - "british", "queen", "ceremonial", "military" - ] + ], + "moji": "💂ðŸ¼" }, "guardsman_tone3": { "unicode": "1F482-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "guardsman tone 3", "shortname": ":guardsman_tone3:", "category": "people", @@ -13583,15 +15024,15 @@ "guard", "bearskin", "hat", - "british", "queen", "ceremonial", "military" - ] + ], + "moji": "💂ðŸ½" }, "guardsman_tone4": { "unicode": "1F482-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "guardsman tone 4", "shortname": ":guardsman_tone4:", "category": "people", @@ -13606,15 +15047,15 @@ "guard", "bearskin", "hat", - "british", "queen", "ceremonial", "military" - ] + ], + "moji": "💂ðŸ¾" }, "guardsman_tone5": { "unicode": "1F482-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "guardsman tone 5", "shortname": ":guardsman_tone5:", "category": "people", @@ -13629,18 +15070,18 @@ "guard", "bearskin", "hat", - "british", "queen", "ceremonial", "military" - ] + ], + "moji": "💂ðŸ¿" }, "guitar": { "unicode": "1F3B8", "unicode_alternates": [], "name": "guitar", "shortname": ":guitar:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13648,12 +15089,11 @@ "music", "guitar", "string", - "music", - "instrument", "jam", "rock", "acoustic", - "electric" + "electric", + "instruments" ], "moji": "🎸" }, @@ -13667,7 +15107,11 @@ "aliases_ascii": [], "keywords": [ "violence", - "weapon" + "weapon", + "object", + "dead", + "gun", + "sarcastic" ], "moji": "🔫" }, @@ -13676,19 +15120,22 @@ "unicode_alternates": [], "name": "haircut", "shortname": ":haircut:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "female", "girl", - "woman" + "woman", + "people", + "women", + "diversity" ], "moji": "💇" }, "haircut_tone1": { "unicode": "1F487-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "haircut tone 1", "shortname": ":haircut_tone1:", "category": "people", @@ -13698,11 +15145,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💇ðŸ»" }, "haircut_tone2": { "unicode": "1F487-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "haircut tone 2", "shortname": ":haircut_tone2:", "category": "people", @@ -13712,11 +15160,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💇ðŸ¼" }, "haircut_tone3": { "unicode": "1F487-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "haircut tone 3", "shortname": ":haircut_tone3:", "category": "people", @@ -13726,11 +15175,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💇ðŸ½" }, "haircut_tone4": { "unicode": "1F487-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "haircut tone 4", "shortname": ":haircut_tone4:", "category": "people", @@ -13740,11 +15190,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💇ðŸ¾" }, "haircut_tone5": { "unicode": "1F487-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "haircut tone 5", "shortname": ":haircut_tone5:", "category": "people", @@ -13754,14 +15205,15 @@ "female", "girl", "woman" - ] + ], + "moji": "💇ðŸ¿" }, "hamburger": { "unicode": "1F354", "unicode_alternates": [], "name": "hamburger", "shortname": ":hamburger:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -13769,9 +15221,9 @@ "meat", "hamburger", "burger", - "meat", "cow", - "beef" + "beef", + "america" ], "moji": "ðŸ”" }, @@ -13789,13 +15241,16 @@ "law", "ruling", "tools", - "verdict" + "verdict", + "object", + "tool", + "weapon" ], "moji": "🔨" }, "hammer_pick": { "unicode": "2692", - "unicode_alternates": "", + "unicode_alternates": [], "name": "hammer and pick", "shortname": ":hammer_pick:", "category": "objects", @@ -13805,8 +15260,10 @@ "aliases_ascii": [], "keywords": [ "object", - "tool" - ] + "tool", + "weapon" + ], + "moji": "âš’" }, "hamster": { "unicode": "1F439", @@ -13836,29 +15293,16 @@ "hi", "five", "stop", - "halt" - ] - }, - "hand_splayed_reverse": { - "unicode": "1F591", - "unicode_alternates": [], - "name": "reversed raised hand with fingers splayed", - "shortname": ":hand_splayed_reverse:", - "category": "people", - "aliases": [ - ":reversed_raised_hand_with_fingers_splayed:" + "halt", + "body", + "hands", + "diversity" ], - "aliases_ascii": [], - "keywords": [ - "hi", - "five", - "stop", - "halt" - ] + "moji": "ðŸ–" }, "hand_splayed_tone1": { "unicode": "1F590-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with fingers splayed tone 1", "shortname": ":hand_splayed_tone1:", "category": "people", @@ -13871,11 +15315,12 @@ "five", "stop", "halt" - ] + ], + "moji": "ðŸ–ðŸ»" }, "hand_splayed_tone2": { "unicode": "1F590-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with fingers splayed tone 2", "shortname": ":hand_splayed_tone2:", "category": "people", @@ -13888,11 +15333,12 @@ "five", "stop", "halt" - ] + ], + "moji": "ðŸ–ðŸ¼" }, "hand_splayed_tone3": { "unicode": "1F590-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with fingers splayed tone 3", "shortname": ":hand_splayed_tone3:", "category": "people", @@ -13905,11 +15351,12 @@ "five", "stop", "halt" - ] + ], + "moji": "ðŸ–ðŸ½" }, "hand_splayed_tone4": { "unicode": "1F590-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with fingers splayed tone 4", "shortname": ":hand_splayed_tone4:", "category": "people", @@ -13922,11 +15369,12 @@ "five", "stop", "halt" - ] + ], + "moji": "ðŸ–ðŸ¾" }, "hand_splayed_tone5": { "unicode": "1F590-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with fingers splayed tone 5", "shortname": ":hand_splayed_tone5:", "category": "people", @@ -13939,57 +15387,170 @@ "five", "stop", "halt" - ] - }, - "hand_victory": { - "unicode": "1F594", - "unicode_alternates": [], - "name": "reversed victory hand", - "shortname": ":hand_victory:", - "category": "people", - "aliases": [ - ":reversed_victory_hand:" ], - "aliases_ascii": [], - "keywords": [ - "fu" - ] + "moji": "ðŸ–ðŸ¿" }, "handbag": { "unicode": "1F45C", "unicode_alternates": [], "name": "handbag", "shortname": ":handbag:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "accessories", "accessory", "bag", - "fashion" + "fashion", + "women", + "vacation" ], "moji": "👜" }, - "hard_disk": { - "unicode": "1F5B4", + "handball": { + "unicode": "1F93E", "unicode_alternates": [], - "name": "hard disk", - "shortname": ":hard_disk:", - "category": "objects_symbols", + "name": "handball", + "shortname": ":handball:", + "category": "activity", "aliases": [], "aliases_ascii": [], - "keywords": [ - "save", - "technology", - "storage", - "information", - "computer", - "drive", - "megabyte", - "gigabyte", - "hd" - ] + "keywords": [], + "moji": "🤾" + }, + "handball_tone1": { + "unicode": "1F93E-1F3FB", + "unicode_alternates": [], + "name": "handball tone 1", + "shortname": ":handball_tone1:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤾ðŸ»" + }, + "handball_tone2": { + "unicode": "1F93E-1F3FC", + "unicode_alternates": [], + "name": "handball tone 2", + "shortname": ":handball_tone2:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤾ðŸ¼" + }, + "handball_tone3": { + "unicode": "1F93E-1F3FD", + "unicode_alternates": [], + "name": "handball tone 3", + "shortname": ":handball_tone3:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤾ðŸ½" + }, + "handball_tone4": { + "unicode": "1F93E-1F3FE", + "unicode_alternates": [], + "name": "handball tone 4", + "shortname": ":handball_tone4:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤾ðŸ¾" + }, + "handball_tone5": { + "unicode": "1F93E-1F3FF", + "unicode_alternates": [], + "name": "handball tone 5", + "shortname": ":handball_tone5:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤾ðŸ¿" + }, + "handshake": { + "unicode": "1F91D", + "unicode_alternates": [], + "name": "handshake", + "shortname": ":handshake:", + "category": "people", + "aliases": [ + ":shaking_hands:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¤" + }, + "handshake_tone1": { + "unicode": "1F91D-1F3FB", + "unicode_alternates": [], + "name": "handshake tone 1", + "shortname": ":handshake_tone1:", + "category": "people", + "aliases": [ + ":shaking_hands_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¤ðŸ»" + }, + "handshake_tone2": { + "unicode": "1F91D-1F3FC", + "unicode_alternates": [], + "name": "handshake tone 2", + "shortname": ":handshake_tone2:", + "category": "people", + "aliases": [ + ":shaking_hands_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¤ðŸ¼" + }, + "handshake_tone3": { + "unicode": "1F91D-1F3FD", + "unicode_alternates": [], + "name": "handshake tone 3", + "shortname": ":handshake_tone3:", + "category": "people", + "aliases": [ + ":shaking_hands_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¤ðŸ½" + }, + "handshake_tone4": { + "unicode": "1F91D-1F3FE", + "unicode_alternates": [], + "name": "handshake tone 4", + "shortname": ":handshake_tone4:", + "category": "people", + "aliases": [ + ":shaking_hands_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¤ðŸ¾" + }, + "handshake_tone5": { + "unicode": "1F91D-1F3FF", + "unicode_alternates": [], + "name": "handshake tone 5", + "shortname": ":handshake_tone5:", + "category": "people", + "aliases": [ + ":shaking_hands_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¤ðŸ¿" }, "hash": { "moji": "#⃣", @@ -13999,11 +15560,12 @@ ], "name": "number sign", "shortname": ":hash:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "symbol" + "symbol", + "number" ] }, "hatched_chick": { @@ -14018,12 +15580,11 @@ "baby", "chicken", "chick", - "baby", "bird", - "chicken", "young", "woman", - "cute" + "cute", + "animal" ], "moji": "ðŸ¥" }, @@ -14040,19 +15601,18 @@ "chicken", "egg", "chick", - "egg", "baby", "bird", - "chicken", "young", "woman", - "cute" + "cute", + "animal" ], "moji": "ðŸ£" }, "head_bandage": { "unicode": "1F915", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with head-bandage", "shortname": ":head_bandage:", "category": "people", @@ -14060,14 +15620,20 @@ ":face_with_head_bandage:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "smiley", + "health", + "sick", + "emotion" + ], + "moji": "🤕" }, "headphones": { "unicode": "1F3A7", "unicode_alternates": [], "name": "headphone", "shortname": ":headphones:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14076,12 +15642,12 @@ "score", "headphone", "sound", - "music", "ears", "beats", "buds", "audio", - "listen" + "listen", + "instruments" ], "moji": "🎧" }, @@ -14090,13 +15656,12 @@ "unicode_alternates": [], "name": "hear-no-evil monkey", "shortname": ":hear_no_evil:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ "animal", "monkey", - "monkey", "ears", "hear", "sound", @@ -14112,7 +15677,7 @@ ], "name": "heavy black heart", "shortname": ":heart:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [ "<3" @@ -14124,7 +15689,6 @@ "pink", "black", "heart", - "love", "passion", "romance", "intense", @@ -14132,7 +15696,9 @@ "death", "evil", "cold", - "valentines" + "valentines", + "symbol", + "parties" ] }, "heart_decoration": { @@ -14140,19 +15706,20 @@ "unicode_alternates": [], "name": "heart decoration", "shortname": ":heart_decoration:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "like", "love", - "purple-square" + "purple-square", + "symbol" ], "moji": "💟" }, "heart_exclamation": { "unicode": "2763", - "unicode_alternates": "", + "unicode_alternates": [], "name": "heavy heart exclamation mark ornament", "shortname": ":heart_exclamation:", "category": "symbols", @@ -14163,15 +15730,17 @@ "keywords": [ "emotion", "punctuation", - "symbol" - ] + "symbol", + "love" + ], + "moji": "â£" }, "heart_eyes": { "unicode": "1F60D", "unicode_alternates": [], "name": "smiling face with heart-shaped eyes", "shortname": ":heart_eyes:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14185,10 +15754,15 @@ "smiling", "heart", "lovestruck", - "love", "flirt", "smile", - "heart-shaped" + "heart-shaped", + "happy", + "smiley", + "sex", + "heart eyes", + "emotion", + "beautiful" ], "moji": "ðŸ˜" }, @@ -14197,7 +15771,7 @@ "unicode_alternates": [], "name": "smiling cat face with heart-shaped eyes", "shortname": ":heart_eyes_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14208,41 +15782,27 @@ "love", "valentines", "lovestruck", - "love", - "heart" + "heart", + "heart eyes", + "cat", + "beautiful" ], "moji": "😻" }, - "heart_tip": { - "unicode": "1F394", - "unicode_alternates": [], - "name": "heart with tip on the left", - "shortname": ":heart_tip:", - "category": "celebration", - "aliases": [ - ":heart_with_tip_on_the_left:" - ], - "aliases_ascii": [], - "keywords": [ - "affection", - "like", - "love", - "valentines" - ] - }, "heartbeat": { "unicode": "1F493", "unicode_alternates": [], "name": "beating heart", "shortname": ":heartbeat:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "affection", "like", "love", - "valentines" + "valentines", + "symbol" ], "moji": "💓" }, @@ -14251,14 +15811,15 @@ "unicode_alternates": [], "name": "growing heart", "shortname": ":heartpulse:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "affection", "like", "love", - "valentines" + "valentines", + "symbol" ], "moji": "💗" }, @@ -14269,12 +15830,15 @@ ], "name": "black heart suit", "shortname": ":hearts:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "cards", - "poker" + "poker", + "love", + "symbol", + "game" ], "moji": "♥" }, @@ -14285,12 +15849,13 @@ ], "name": "heavy check mark", "shortname": ":heavy_check_mark:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "nike", - "ok" + "ok", + "symbol" ], "moji": "✔" }, @@ -14299,13 +15864,14 @@ "unicode_alternates": [], "name": "heavy division sign", "shortname": ":heavy_division_sign:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "calculation", "divide", - "math" + "math", + "symbol" ], "moji": "âž—" }, @@ -14314,7 +15880,7 @@ "unicode_alternates": [], "name": "heavy dollar sign", "shortname": ":heavy_dollar_sign:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14322,12 +15888,12 @@ "money", "payment", "dollar", - "currency", - "money", "cash", "sale", "purchase", - "value" + "value", + "math", + "symbol" ], "moji": "💲" }, @@ -14336,12 +15902,13 @@ "unicode_alternates": [], "name": "heavy minus sign", "shortname": ":heavy_minus_sign:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "calculation", - "math" + "math", + "symbol" ], "moji": "âž–" }, @@ -14352,12 +15919,13 @@ ], "name": "heavy multiplication x", "shortname": ":heavy_multiplication_x:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "calculation", - "math" + "math", + "symbol" ], "moji": "✖" }, @@ -14366,12 +15934,13 @@ "unicode_alternates": [], "name": "heavy plus sign", "shortname": ":heavy_plus_sign:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "calculation", - "math" + "math", + "symbol" ], "moji": "âž•" }, @@ -14380,7 +15949,7 @@ "unicode_alternates": [], "name": "helicopter", "shortname": ":helicopter:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14389,13 +15958,16 @@ "helicopter", "helo", "gyro", - "gyrocopter" + "gyrocopter", + "plane", + "travel", + "fly" ], "moji": "ðŸš" }, "helmet_with_cross": { "unicode": "26D1", - "unicode_alternates": "", + "unicode_alternates": [], "name": "helmet with white cross", "shortname": ":helmet_with_cross:", "category": "people", @@ -14407,8 +15979,12 @@ "aid", "face", "hat", - "person" - ] + "person", + "object", + "accessories", + "job" + ], + "moji": "⛑" }, "herb": { "unicode": "1F33F", @@ -14427,9 +16003,10 @@ "weed", "herb", "spice", - "plant", "cook", - "cooking" + "cooking", + "nature", + "leaf" ], "moji": "🌿" }, @@ -14447,7 +16024,9 @@ "vegetable", "hibiscus", "flower", - "warm" + "warm", + "nature", + "tropical" ], "moji": "🌺" }, @@ -14456,13 +16035,14 @@ "unicode_alternates": [], "name": "high brightness symbol", "shortname": ":high_brightness:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "light", "summer", - "sun" + "sun", + "symbol" ], "moji": "🔆" }, @@ -14471,45 +16051,57 @@ "unicode_alternates": [], "name": "high-heeled shoe", "shortname": ":high_heel:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "fashion", "female", - "shoes" + "shoes", + "women", + "shoe", + "sexy", + "accessories", + "girls night" ], "moji": "👠" }, "hockey": { "unicode": "1F3D2", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ice hockey stick and puck", "shortname": ":hockey:", "category": "activity", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "game", + "sport", + "hockey" + ], + "moji": "ðŸ’" }, "hole": { "unicode": "1F573", "unicode_alternates": [], "name": "hole", "shortname": ":hole:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "pit", - "well" - ] + "well", + "object" + ], + "moji": "🕳" }, "homes": { "unicode": "1F3D8", "unicode_alternates": [], "name": "house buildings", "shortname": ":homes:", - "category": "travel_places", + "category": "travel", "aliases": [ ":house_buildings:" ], @@ -14521,15 +16113,19 @@ "mansion", "bungalow", "ranch", - "craftsman" - ] + "craftsman", + "places", + "building", + "house" + ], + "moji": "ðŸ˜" }, "honey_pot": { "unicode": "1F36F", "unicode_alternates": [], "name": "honey pot", "shortname": ":honey_pot:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14537,9 +16133,10 @@ "sweet", "honey", "pot", - "bees", "pooh", - "bear" + "bear", + "food", + "vagina" ], "moji": "ðŸ¯" }, @@ -14553,7 +16150,8 @@ "aliases_ascii": [], "keywords": [ "animal", - "brown" + "brown", + "wildlife" ], "moji": "ðŸ´" }, @@ -14562,7 +16160,7 @@ "unicode_alternates": [], "name": "horse racing", "shortname": ":horse_racing:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14573,13 +16171,16 @@ "race", "racing", "jockey", - "triple crown" + "triple crown", + "men", + "sport", + "horse racing" ], "moji": "ðŸ‡" }, "horse_racing_tone1": { "unicode": "1F3C7-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "horse racing tone 1", "shortname": ":horse_racing_tone1:", "category": "activity", @@ -14592,11 +16193,12 @@ "race", "jockey", "triple crown" - ] + ], + "moji": "ðŸ‡ðŸ»" }, "horse_racing_tone2": { "unicode": "1F3C7-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "horse racing tone 2", "shortname": ":horse_racing_tone2:", "category": "activity", @@ -14609,11 +16211,12 @@ "race", "jockey", "triple crown" - ] + ], + "moji": "ðŸ‡ðŸ¼" }, "horse_racing_tone3": { "unicode": "1F3C7-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "horse racing tone 3", "shortname": ":horse_racing_tone3:", "category": "activity", @@ -14626,11 +16229,12 @@ "race", "jockey", "triple crown" - ] + ], + "moji": "ðŸ‡ðŸ½" }, "horse_racing_tone4": { "unicode": "1F3C7-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "horse racing tone 4", "shortname": ":horse_racing_tone4:", "category": "activity", @@ -14643,11 +16247,12 @@ "race", "jockey", "triple crown" - ] + ], + "moji": "ðŸ‡ðŸ¾" }, "horse_racing_tone5": { "unicode": "1F3C7-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "horse racing tone 5", "shortname": ":horse_racing_tone5:", "category": "activity", @@ -14660,21 +16265,24 @@ "race", "jockey", "triple crown" - ] + ], + "moji": "ðŸ‡ðŸ¿" }, "hospital": { "unicode": "1F3E5", "unicode_alternates": [], "name": "hospital", "shortname": ":hospital:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "building", "doctor", "health", - "surgery" + "surgery", + "places", + "911" ], "moji": "ðŸ¥" }, @@ -14683,7 +16291,7 @@ "unicode_alternates": [], "name": "hot pepper", "shortname": ":hot_pepper:", - "category": "food_drink", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14693,27 +16301,33 @@ "chili", "cayenne", "habanero", - "jalapeno" - ] + "jalapeno", + "vegetables" + ], + "moji": "🌶" }, "hotdog": { "unicode": "1F32D", - "unicode_alternates": "", + "unicode_alternates": [], "name": "hot dog", "shortname": ":hotdog:", - "category": "foods", + "category": "food", "aliases": [ ":hot_dog:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "america", + "food" + ], + "moji": "ðŸŒ" }, "hotel": { "unicode": "1F3E8", "unicode_alternates": [], "name": "hotel", "shortname": ":hotel:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14724,7 +16338,9 @@ "hotel", "motel", "holiday inn", - "hospital" + "hospital", + "places", + "vacation" ], "moji": "ðŸ¨" }, @@ -14735,13 +16351,14 @@ ], "name": "hot springs", "shortname": ":hotsprings:", - "category": "places", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "bath", "relax", - "warm" + "warm", + "symbol" ], "moji": "♨" }, @@ -14758,7 +16375,8 @@ "keywords": [ "clock", "oldschool", - "time" + "time", + "object" ], "moji": "⌛" }, @@ -14773,7 +16391,8 @@ "keywords": [ "countdown", "oldschool", - "time" + "time", + "object" ], "moji": "â³" }, @@ -14782,20 +16401,20 @@ "unicode_alternates": [], "name": "house building", "shortname": ":house:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "building", "home", "house", - "home", "residence", "dwelling", "mansion", "bungalow", "ranch", - "craftsman" + "craftsman", + "places" ], "moji": "ðŸ " }, @@ -14804,7 +16423,7 @@ "unicode_alternates": [], "name": "derelict house building", "shortname": ":house_abandoned:", - "category": "travel_places", + "category": "travel", "aliases": [ ":derelict_house_building:" ], @@ -14821,27 +16440,34 @@ "abandoned", "vacant", "run down", - "shoddy" - ] + "shoddy", + "places", + "building", + "house" + ], + "moji": "ðŸš" }, "house_with_garden": { "unicode": "1F3E1", "unicode_alternates": [], "name": "house with garden", "shortname": ":house_with_garden:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "home", "nature", - "plant" + "plant", + "places", + "building", + "house" ], "moji": "ðŸ¡" }, "hugging": { "unicode": "1F917", - "unicode_alternates": "", + "unicode_alternates": [], "name": "hugging face", "shortname": ":hugging:", "category": "people", @@ -14849,14 +16475,19 @@ ":hugging_face:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "smiley", + "hug", + "thank you" + ], + "moji": "🤗" }, "hushed": { "unicode": "1F62F", "unicode_alternates": [], "name": "hushed face", "shortname": ":hushed:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14865,7 +16496,10 @@ "quiet", "hush", "whisper", - "silent" + "silent", + "smiley", + "surprised", + "wow" ], "moji": "😯" }, @@ -14874,7 +16508,7 @@ "unicode_alternates": [], "name": "ice cream", "shortname": ":ice_cream:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14896,7 +16530,7 @@ }, "ice_skate": { "unicode": "26F8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ice skate", "shortname": ":ice_skate:", "category": "activity", @@ -14905,15 +16539,18 @@ "keywords": [ "place", "sport", - "travel" - ] + "travel", + "cold", + "ice skating" + ], + "moji": "⛸" }, "icecream": { "unicode": "1F366", "unicode_alternates": [], "name": "soft ice cream", "shortname": ":icecream:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14935,7 +16572,7 @@ }, "id": { "unicode": "1F194", - "unicode_alternates": "", + "unicode_alternates": [], "name": "squared id", "shortname": ":id:", "category": "symbols", @@ -14947,21 +16584,24 @@ "identity", "symbol", "word" - ] + ], + "moji": "🆔" }, "ideograph_advantage": { "unicode": "1F250", "unicode_alternates": [], "name": "circled ideograph advantage", "shortname": ":ideograph_advantage:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "get", "kanji", - "obtain" + "obtain", + "japan", + "symbol" ], "moji": "ðŸ‰" }, @@ -14970,7 +16610,7 @@ "unicode_alternates": [], "name": "imp", "shortname": ":imp:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -14979,7 +16619,9 @@ "evil", "horns", "cute", - "devil" + "smiley", + "monster", + "wth" ], "moji": "👿" }, @@ -14993,7 +16635,9 @@ "aliases_ascii": [], "keywords": [ "documents", - "email" + "email", + "work", + "office" ], "moji": "📥" }, @@ -15007,30 +16651,17 @@ "aliases_ascii": [], "keywords": [ "email", - "inbox" + "inbox", + "object" ], "moji": "📨" }, - "info": { - "unicode": "1F6C8", - "unicode_alternates": [], - "name": "circled information source", - "shortname": ":info:", - "category": "objects_symbols", - "aliases": [ - ":circled_information_source:" - ], - "aliases_ascii": [], - "keywords": [ - "icon" - ] - }, "information_desk_person": { "unicode": "1F481", "unicode_alternates": [], "name": "information desk person", "shortname": ":information_desk_person:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15045,13 +16676,16 @@ "sassy", "unimpressed", "attitude", - "snarky" + "snarky", + "people", + "women", + "diversity" ], "moji": "ðŸ’" }, "information_desk_person_tone1": { "unicode": "1F481-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "information desk person tone 1", "shortname": ":information_desk_person_tone1:", "category": "people", @@ -15069,11 +16703,12 @@ "unimpressed", "attitude", "snarky" - ] + ], + "moji": "ðŸ’ðŸ»" }, "information_desk_person_tone2": { "unicode": "1F481-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "information desk person tone 2", "shortname": ":information_desk_person_tone2:", "category": "people", @@ -15091,11 +16726,12 @@ "unimpressed", "attitude", "snarky" - ] + ], + "moji": "ðŸ’ðŸ¼" }, "information_desk_person_tone3": { "unicode": "1F481-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "information desk person tone 3", "shortname": ":information_desk_person_tone3:", "category": "people", @@ -15113,11 +16749,12 @@ "unimpressed", "attitude", "snarky" - ] + ], + "moji": "ðŸ’ðŸ½" }, "information_desk_person_tone4": { "unicode": "1F481-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "information desk person tone 4", "shortname": ":information_desk_person_tone4:", "category": "people", @@ -15135,11 +16772,12 @@ "unimpressed", "attitude", "snarky" - ] + ], + "moji": "ðŸ’ðŸ¾" }, "information_desk_person_tone5": { "unicode": "1F481-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "information desk person tone 5", "shortname": ":information_desk_person_tone5:", "category": "people", @@ -15157,7 +16795,8 @@ "unimpressed", "attitude", "snarky" - ] + ], + "moji": "ðŸ’ðŸ¿" }, "information_source": { "unicode": "2139", @@ -15166,13 +16805,14 @@ ], "name": "information source", "shortname": ":information_source:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", "blue-square", - "letter" + "letter", + "symbol" ], "moji": "ℹ" }, @@ -15181,7 +16821,7 @@ "unicode_alternates": [], "name": "smiling face with halo", "shortname": ":innocent:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ "O:-)", @@ -15202,12 +16842,12 @@ "angel", "face", "halo", - "halo", - "angel", "innocent", "ring", "circle", - "heaven" + "heaven", + "smiley", + "emotion" ], "moji": "😇" }, @@ -15218,13 +16858,14 @@ ], "name": "exclamation question mark", "shortname": ":interrobang:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "punctuation", "surprise", - "wat" + "wat", + "symbol" ], "moji": "â‰" }, @@ -15240,7 +16881,10 @@ "apple", "dial", "gadgets", - "technology" + "technology", + "electronics", + "phone", + "selfie" ], "moji": "📱" }, @@ -15249,7 +16893,7 @@ "unicode_alternates": [], "name": "desert island", "shortname": ":island:", - "category": "travel_places", + "category": "travel", "aliases": [ ":desert_island:" ], @@ -15257,15 +16901,22 @@ "keywords": [ "land", "solitude", - "alone" - ] + "alone", + "places", + "travel", + "vacation", + "tropical", + "beach", + "swim" + ], + "moji": "ðŸ" }, "izakaya_lantern": { "unicode": "1F3EE", "unicode_alternates": [], "name": "izakaya lantern", "shortname": ":izakaya_lantern:", - "category": "places", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15277,7 +16928,9 @@ "alcohol", "bar", "sake", - "restaurant" + "restaurant", + "object", + "japan" ], "moji": "ðŸ®" }, @@ -15286,14 +16939,13 @@ "unicode_alternates": [], "name": "jack-o-lantern", "shortname": ":jack_o_lantern:", - "category": "objects", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ "halloween", "jack-o-lantern", "pumpkin", - "halloween", "holiday", "carve", "autumn", @@ -15305,7 +16957,8 @@ "horror", "scary", "scared", - "dead" + "dead", + "holidays" ], "moji": "🎃" }, @@ -15314,11 +16967,16 @@ "unicode_alternates": [], "name": "silhouette of japan", "shortname": ":japan:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "nation" + "nation", + "places", + "travel", + "map", + "vacation", + "tropical" ], "moji": "🗾" }, @@ -15327,7 +16985,7 @@ "unicode_alternates": [], "name": "japanese castle", "shortname": ":japanese_castle:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15339,7 +16997,10 @@ "royalty", "fort", "fortified", - "fortress" + "fortress", + "places", + "travel", + "vacation" ], "moji": "ðŸ¯" }, @@ -15348,7 +17009,7 @@ "unicode_alternates": [], "name": "japanese goblin", "shortname": ":japanese_goblin:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15361,13 +17022,14 @@ "avian", "demon", "goblin", - "mask", "theater", "nose", "frown", "mustache", "anger", - "frustration" + "frustration", + "angry", + "monster" ], "moji": "👺" }, @@ -15376,7 +17038,7 @@ "unicode_alternates": [], "name": "japanese ogre", "shortname": ":japanese_ogre:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15387,7 +17049,6 @@ "troll", "ogre", "folklore", - "monster", "devil", "mask", "theater", @@ -15401,7 +17062,7 @@ "unicode_alternates": [], "name": "jeans", "shortname": ":jeans:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15419,26 +17080,12 @@ ], "moji": "👖" }, - "jet_up": { - "unicode": "1F6E6", - "unicode_alternates": [], - "name": "up-pointing military airplane", - "shortname": ":jet_up:", - "category": "travel_places", - "aliases": [ - ":up_pointing_military_airplane:" - ], - "aliases_ascii": [], - "keywords": [ - "jet" - ] - }, "joy": { "unicode": "1F602", "unicode_alternates": [], "name": "face with tears of joy", "shortname": ":joy:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":')", @@ -15450,11 +17097,13 @@ "haha", "happy", "tears", - "tears", - "cry", "joy", - "happy", - "weep" + "weep", + "silly", + "smiley", + "laugh", + "emotion", + "sarcastic" ], "moji": "😂" }, @@ -15463,7 +17112,7 @@ "unicode_alternates": [], "name": "cat face with tears of joy", "shortname": ":joy_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15472,36 +17121,126 @@ "haha", "happy", "tears", - "happy", - "tears", "cry", - "joy" + "joy", + "silly", + "laugh", + "cat", + "sarcastic" + ], + "moji": "😹" + }, + "joystick": { + "unicode": "1F579", + "unicode_alternates": [], + "name": "joystick", + "shortname": ":joystick:", + "category": "objects", + "aliases": [], + "aliases_ascii": [], + "keywords": [ + "games", + "atari", + "controller", + "electronics", + "game", + "boys night" + ], + "moji": "🕹" + }, + "juggling": { + "unicode": "1F939", + "unicode_alternates": [], + "name": "juggling", + "shortname": ":juggling:", + "category": "activity", + "aliases": [ + ":juggler:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤹" + }, + "juggling_tone1": { + "unicode": "1F939-1F3FB", + "unicode_alternates": [], + "name": "juggling tone 1", + "shortname": ":juggling_tone1:", + "category": "activity", + "aliases": [ + ":juggler_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤹ðŸ»" + }, + "juggling_tone2": { + "unicode": "1F939-1F3FC", + "unicode_alternates": [], + "name": "juggling tone 2", + "shortname": ":juggling_tone2:", + "category": "activity", + "aliases": [ + ":juggler_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤹ðŸ¼" + }, + "juggling_tone3": { + "unicode": "1F939-1F3FD", + "unicode_alternates": [], + "name": "juggling tone 3", + "shortname": ":juggling_tone3:", + "category": "activity", + "aliases": [ + ":juggler_tone3:" ], - "moji": "😹" + "aliases_ascii": [], + "keywords": [], + "moji": "🤹ðŸ½" }, - "joystick": { - "unicode": "1F579", + "juggling_tone4": { + "unicode": "1F939-1F3FE", "unicode_alternates": [], - "name": "joystick", - "shortname": ":joystick:", - "category": "objects_symbols", - "aliases": [], + "name": "juggling tone 4", + "shortname": ":juggling_tone4:", + "category": "activity", + "aliases": [ + ":juggler_tone4:" + ], "aliases_ascii": [], - "keywords": [ - "games", - "atari", - "controller" - ] + "keywords": [], + "moji": "🤹ðŸ¾" + }, + "juggling_tone5": { + "unicode": "1F939-1F3FF", + "unicode_alternates": [], + "name": "juggling tone 5", + "shortname": ":juggling_tone5:", + "category": "activity", + "aliases": [ + ":juggler_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤹ðŸ¿" }, "kaaba": { "unicode": "1F54B", - "unicode_alternates": "", + "unicode_alternates": [], "name": "kaaba", "shortname": ":kaaba:", "category": "travel", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "places", + "religion", + "building", + "condolence" + ], + "moji": "🕋" }, "key": { "unicode": "1F511", @@ -15514,7 +17253,8 @@ "keywords": [ "door", "lock", - "password" + "password", + "object" ], "moji": "🔑" }, @@ -15523,7 +17263,7 @@ "unicode_alternates": [], "name": "old key", "shortname": ":key2:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":old_key:" ], @@ -15532,79 +17272,34 @@ "door", "lock", "password", - "skeleton" - ] - }, - "keyboard": { - "unicode": "1F5AE", - "unicode_alternates": [], - "name": "wired keyboard", - "shortname": ":keyboard:", - "category": "objects_symbols", - "aliases": [ - ":wired_keyboard:" - ], - "aliases_ascii": [], - "keywords": [ - "typing", - "keys", - "input", - "device" - ] - }, - "keyboard_mouse": { - "unicode": "1F5A6", - "unicode_alternates": [], - "name": "keyboard and mouse", - "shortname": ":keyboard_mouse:", - "category": "objects_symbols", - "aliases": [ - ":keyboard_and_mouse:" + "skeleton", + "object" ], - "aliases_ascii": [], - "keywords": [ - "computer", - "input", - "desktop" - ] + "moji": "ðŸ—" }, - "keyboard_with_jacks": { - "unicode": "1F398", - "unicode_alternates": [], - "name": "musical keyboard with jacks", - "shortname": ":keyboard_with_jacks:", - "category": "objects_symbols", - "aliases": [ - ":musical_keyboard_with_jacks:" + "keyboard": { + "unicode": "2328", + "unicode_alternates": [ + "2328-FE0F" ], - "aliases_ascii": [], - "keywords": [ - "music", - "instrument", - "midi" - ] - }, - "keycap_ten": { - "unicode": "1F51F", - "unicode_alternates": [], - "name": "keycap ten", - "shortname": ":keycap_ten:", - "category": "other", + "name": "keyboard", + "shortname": ":keyboard:", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ - "10", - "blue-square", - "numbers" + "electronics", + "work", + "office" ], - "moji": "🔟" + "moji": "⌨" }, "kimono": { "unicode": "1F458", "unicode_alternates": [], "name": "kimono", "shortname": ":kimono:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15621,7 +17316,7 @@ "unicode_alternates": [], "name": "kiss mark", "shortname": ":kiss:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15630,7 +17325,12 @@ "like", "lips", "love", - "valentines" + "valentines", + "women", + "sexy", + "lip", + "beautiful", + "girls night" ], "moji": "💋" }, @@ -15652,8 +17352,14 @@ "love", "marriage", "valentines", - "couple" - ] + "couple", + "people", + "gay", + "men", + "sex", + "lgbt" + ], + "moji": "👨â€â¤ï¸â€ðŸ’‹â€ðŸ‘¨" }, "kiss_ww": { "unicode": "1F469-2764-1F48B-1F469", @@ -15673,15 +17379,21 @@ "love", "marriage", "valentines", - "couple" - ] + "couple", + "people", + "women", + "sex", + "lgbt", + "lesbian" + ], + "moji": "👩â€â¤ï¸â€ðŸ’‹â€ðŸ‘©" }, "kissing": { "unicode": "1F617", "unicode_alternates": [], "name": "kissing face", "shortname": ":kissing:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15695,7 +17407,9 @@ "kiss", "pucker", "lips", - "smooch" + "smooch", + "smiley", + "sexy" ], "moji": "😗" }, @@ -15704,7 +17418,7 @@ "unicode_alternates": [], "name": "kissing cat face with closed eyes", "shortname": ":kissing_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15714,7 +17428,8 @@ "kiss", "puckered", "heart", - "love" + "love", + "cat" ], "moji": "😽" }, @@ -15723,7 +17438,7 @@ "unicode_alternates": [], "name": "kissing face with closed eyes", "shortname": ":kissing_closed_eyes:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15738,8 +17453,9 @@ "passion", "puckered", "heart", - "love", - "smooch" + "smooch", + "smiley", + "sexy" ], "moji": "😚" }, @@ -15748,7 +17464,7 @@ "unicode_alternates": [], "name": "face throwing a kiss", "shortname": ":kissing_heart:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":*", @@ -15766,8 +17482,9 @@ "love", "lips", "like", - "love", - "valentines" + "valentines", + "smiley", + "sexy" ], "moji": "😘" }, @@ -15776,7 +17493,7 @@ "unicode_alternates": [], "name": "kissing face with smiling eyes", "shortname": ":kissing_smiling_eyes:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15789,10 +17506,25 @@ "smile", "pucker", "lips", - "smooch" + "smooch", + "smiley", + "sexy" ], "moji": "😙" }, + "kiwi": { + "unicode": "1F95D", + "unicode_alternates": [], + "name": "kiwifruit", + "shortname": ":kiwi:", + "category": "food", + "aliases": [ + ":kiwifruit:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¥" + }, "knife": { "unicode": "1F52A", "unicode_alternates": [], @@ -15801,7 +17533,10 @@ "category": "objects", "aliases": [], "aliases_ascii": [], - "keywords": [], + "keywords": [ + "object", + "weapon" + ], "moji": "🔪" }, "koala": { @@ -15814,7 +17549,8 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" + "nature", + "wildlife" ], "moji": "ðŸ¨" }, @@ -15823,7 +17559,7 @@ "unicode_alternates": [], "name": "squared katakana koko", "shortname": ":koko:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -15831,7 +17567,8 @@ "destination", "here", "japanese", - "katakana" + "katakana", + "symbol" ], "moji": "ðŸˆ" }, @@ -15840,22 +17577,28 @@ "unicode_alternates": [], "name": "label", "shortname": ":label:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ - "tag" - ] + "tag", + "object" + ], + "moji": "ðŸ·" }, "large_blue_circle": { "unicode": "1F535", "unicode_alternates": [], "name": "large blue circle", "shortname": ":large_blue_circle:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [], + "keywords": [ + "shapes", + "symbol", + "circle" + ], "moji": "🔵" }, "large_blue_diamond": { @@ -15863,11 +17606,13 @@ "unicode_alternates": [], "name": "large blue diamond", "shortname": ":large_blue_diamond:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol" ], "moji": "🔷" }, @@ -15876,11 +17621,13 @@ "unicode_alternates": [], "name": "large orange diamond", "shortname": ":large_orange_diamond:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol" ], "moji": "🔶" }, @@ -15900,7 +17647,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌗" }, @@ -15922,7 +17670,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌜" }, @@ -15931,7 +17680,7 @@ "unicode_alternates": [], "name": "smiling face with open mouth and tightly-closed ey", "shortname": ":laughing:", - "category": "emoticons", + "category": "people", "aliases": [ ":satisfied:" ], @@ -15947,7 +17696,9 @@ "lol", "smiling", "laughing", - "laugh" + "laugh", + "smiley", + "emotion" ], "moji": "😆" }, @@ -15984,16 +17735,97 @@ "aliases_ascii": [], "keywords": [ "notes", - "paper" + "paper", + "object", + "office", + "write" ], "moji": "📒" }, + "left_facing_fist": { + "unicode": "1F91B", + "unicode_alternates": [], + "name": "left-facing fist", + "shortname": ":left_facing_fist:", + "category": "people", + "aliases": [ + ":left_fist:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛" + }, + "left_facing_fist_tone1": { + "unicode": "1F91B-1F3FB", + "unicode_alternates": [], + "name": "left facing fist tone 1", + "shortname": ":left_facing_fist_tone1:", + "category": "people", + "aliases": [ + ":left_fist_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛ðŸ»" + }, + "left_facing_fist_tone2": { + "unicode": "1F91B-1F3FC", + "unicode_alternates": [], + "name": "left facing fist tone 2", + "shortname": ":left_facing_fist_tone2:", + "category": "people", + "aliases": [ + ":left_fist_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛ðŸ¼" + }, + "left_facing_fist_tone3": { + "unicode": "1F91B-1F3FD", + "unicode_alternates": [], + "name": "left facing fist tone 3", + "shortname": ":left_facing_fist_tone3:", + "category": "people", + "aliases": [ + ":left_fist_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛ðŸ½" + }, + "left_facing_fist_tone4": { + "unicode": "1F91B-1F3FE", + "unicode_alternates": [], + "name": "left facing fist tone 4", + "shortname": ":left_facing_fist_tone4:", + "category": "people", + "aliases": [ + ":left_fist_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛ðŸ¾" + }, + "left_facing_fist_tone5": { + "unicode": "1F91B-1F3FF", + "unicode_alternates": [], + "name": "left facing fist tone 5", + "shortname": ":left_facing_fist_tone5:", + "category": "people", + "aliases": [ + ":left_fist_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤛ðŸ¿" + }, "left_luggage": { "unicode": "1F6C5", "unicode_alternates": [], "name": "left luggage", "shortname": ":left_luggage:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16002,26 +17834,10 @@ "bag", "baggage", "luggage", - "travel" + "symbol" ], "moji": "🛅" }, - "left_receiver": { - "unicode": "1F57B", - "unicode_alternates": [], - "name": "left hand telephone receiver", - "shortname": ":left_receiver:", - "category": "objects_symbols", - "aliases": [ - ":left_hand_telephone_receiver:" - ], - "aliases_ascii": [], - "keywords": [ - "communication", - "dial", - "technology" - ] - }, "left_right_arrow": { "unicode": "2194", "unicode_alternates": [ @@ -16029,11 +17845,13 @@ ], "name": "left right arrow", "shortname": ":left_right_arrow:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "arrow", + "symbol" ], "moji": "↔" }, @@ -16044,10 +17862,13 @@ ], "name": "leftwards arrow with hook", "shortname": ":leftwards_arrow_with_hook:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [], + "keywords": [ + "arrow", + "symbol" + ], "moji": "↩" }, "lemon": { @@ -16055,7 +17876,7 @@ "unicode_alternates": [], "name": "lemon", "shortname": ":lemon:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16063,7 +17884,8 @@ "nature", "lemon", "yellow", - "citrus" + "citrus", + "food" ], "moji": "ðŸ‹" }, @@ -16074,7 +17896,7 @@ ], "name": "leo", "shortname": ":leo:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16087,9 +17909,8 @@ "zodiac", "sign", "purple-square", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♌" }, @@ -16108,7 +17929,9 @@ "cat", "spot", "spotted", - "sexy" + "sexy", + "wildlife", + "roar" ], "moji": "ðŸ†" }, @@ -16117,27 +17940,31 @@ "unicode_alternates": [], "name": "level slider", "shortname": ":level_slider:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "controls" - ] + ], + "moji": "🎚" }, "levitate": { "unicode": "1F574", "unicode_alternates": [], "name": "man in business suit levitating", "shortname": ":levitate:", - "category": "people", + "category": "activity", "aliases": [ ":man_in_business_suit_levitating:" ], "aliases_ascii": [], "keywords": [ "hover", - "exclamation" - ] + "exclamation", + "men", + "job" + ], + "moji": "🕴" }, "libra": { "unicode": "264E", @@ -16146,7 +17973,7 @@ ], "name": "libra", "shortname": ":libra:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16159,9 +17986,8 @@ "zodiac", "sign", "purple-square", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♎" }, @@ -16179,12 +18005,20 @@ "bench", "press", "squats", - "deadlift" - ] + "deadlift", + "men", + "workout", + "flex", + "sport", + "weight lifting", + "win", + "diversity" + ], + "moji": "ðŸ‹" }, "lifter_tone1": { "unicode": "1F3CB-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "weight lifter tone 1", "shortname": ":lifter_tone1:", "category": "activity", @@ -16197,11 +18031,12 @@ "press", "squats", "deadlift" - ] + ], + "moji": "ðŸ‹ðŸ»" }, "lifter_tone2": { "unicode": "1F3CB-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "weight lifter tone 2", "shortname": ":lifter_tone2:", "category": "activity", @@ -16214,11 +18049,12 @@ "press", "squats", "deadlift" - ] + ], + "moji": "ðŸ‹ðŸ¼" }, "lifter_tone3": { "unicode": "1F3CB-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "weight lifter tone 3", "shortname": ":lifter_tone3:", "category": "activity", @@ -16231,11 +18067,12 @@ "press", "squats", "deadlift" - ] + ], + "moji": "ðŸ‹ðŸ½" }, "lifter_tone4": { "unicode": "1F3CB-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "weight lifter tone 4", "shortname": ":lifter_tone4:", "category": "activity", @@ -16248,11 +18085,12 @@ "press", "squats", "deadlift" - ] + ], + "moji": "ðŸ‹ðŸ¾" }, "lifter_tone5": { "unicode": "1F3CB-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "weight lifter tone 5", "shortname": ":lifter_tone5:", "category": "activity", @@ -16265,28 +18103,15 @@ "press", "squats", "deadlift" - ] - }, - "light_check_mark": { - "unicode": "1F5F8", - "unicode_alternates": [], - "name": "light check mark", - "shortname": ":light_check_mark:", - "category": "objects_symbols", - "aliases": [ - ":light_mark:" ], - "aliases_ascii": [], - "keywords": [ - "vote" - ] + "moji": "ðŸ‹ðŸ¿" }, "light_rail": { "unicode": "1F688", "unicode_alternates": [], "name": "light rail", "shortname": ":light_rail:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16294,7 +18119,8 @@ "vehicle", "train", "rail", - "light" + "light", + "travel" ], "moji": "🚈" }, @@ -16303,18 +18129,20 @@ "unicode_alternates": [], "name": "link symbol", "shortname": ":link:", - "category": "other", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "rings", - "url" + "url", + "symbol", + "office" ], "moji": "🔗" }, "lion_face": { "unicode": "1F981", - "unicode_alternates": "", + "unicode_alternates": [], "name": "lion face", "shortname": ":lion_face:", "category": "nature", @@ -16322,50 +18150,62 @@ ":lion:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "wildlife", + "roar", + "cat", + "animal" + ], + "moji": "ðŸ¦" }, "lips": { "unicode": "1F444", "unicode_alternates": [], "name": "mouth", "shortname": ":lips:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "kiss", - "mouth" + "mouth", + "women", + "body", + "sexy", + "lip" ], "moji": "👄" }, - "lips2": { - "unicode": "1F5E2", - "unicode_alternates": [], - "name": "lips", - "shortname": ":lips2:", - "category": "people", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "kiss", - "mouth" - ] - }, "lipstick": { "unicode": "1F484", "unicode_alternates": [], "name": "lipstick", "shortname": ":lipstick:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "fashion", "female", - "girl" + "girl", + "object", + "women", + "sexy", + "lip" ], "moji": "💄" }, + "lizard": { + "unicode": "1F98E", + "unicode_alternates": [], + "name": "lizard", + "shortname": ":lizard:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦎" + }, "lock": { "unicode": "1F512", "unicode_alternates": [], @@ -16376,7 +18216,9 @@ "aliases_ascii": [], "keywords": [ "password", - "security" + "security", + "object", + "lock" ], "moji": "🔒" }, @@ -16390,7 +18232,9 @@ "aliases_ascii": [], "keywords": [ "secret", - "security" + "security", + "object", + "lock" ], "moji": "ðŸ”" }, @@ -16399,7 +18243,7 @@ "unicode_alternates": [], "name": "lollipop", "shortname": ":lollipop:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16410,9 +18254,8 @@ "lollipop", "stick", "lick", - "sweet", "sugar", - "candy" + "halloween" ], "moji": "ðŸ" }, @@ -16421,11 +18264,12 @@ "unicode_alternates": [], "name": "double curly loop", "shortname": ":loop:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "curly" + "curly", + "symbol" ], "moji": "âž¿" }, @@ -16434,10 +18278,13 @@ "unicode_alternates": [], "name": "speaker with three sound waves", "shortname": ":loud_sound:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [], + "keywords": [ + "alarm", + "symbol" + ], "moji": "🔊" }, "loudspeaker": { @@ -16445,12 +18292,15 @@ "unicode_alternates": [], "name": "public address loudspeaker", "shortname": ":loudspeaker:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "sound", - "volume" + "volume", + "object", + "alarm", + "symbol" ], "moji": "📢" }, @@ -16459,7 +18309,7 @@ "unicode_alternates": [], "name": "love hotel", "shortname": ":love_hotel:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16468,7 +18318,6 @@ "like", "love", "hotel", - "love", "sex", "romance", "leisure", @@ -16476,7 +18325,9 @@ "prostitution", "hospital", "birth", - "happy" + "happy", + "places", + "building" ], "moji": "ðŸ©" }, @@ -16485,7 +18336,7 @@ "unicode_alternates": [], "name": "love letter", "shortname": ":love_letter:", - "category": "emoticons", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16497,7 +18348,8 @@ "love", "letter", "kiss", - "heart" + "heart", + "object" ], "moji": "💌" }, @@ -16506,15 +18358,29 @@ "unicode_alternates": [], "name": "low brightness symbol", "shortname": ":low_brightness:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "summer", - "sun" + "sun", + "symbol" ], "moji": "🔅" }, + "lying_face": { + "unicode": "1F925", + "unicode_alternates": [], + "name": "lying face", + "shortname": ":lying_face:", + "category": "people", + "aliases": [ + ":liar:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤥" + }, "m": { "unicode": "24C2", "unicode_alternates": [ @@ -16522,13 +18388,14 @@ ], "name": "circled latin capital letter m", "shortname": ":m:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", "blue-circle", - "letter" + "letter", + "symbol" ], "moji": "â“‚" }, @@ -16546,7 +18413,8 @@ "detective", "investigator", "detail", - "details" + "details", + "object" ], "moji": "ðŸ”" }, @@ -16564,7 +18432,8 @@ "detective", "investigator", "detail", - "details" + "details", + "object" ], "moji": "🔎" }, @@ -16575,13 +18444,15 @@ ], "name": "mahjong tile red dragon", "shortname": ":mahjong:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "game", - "kanji" + "kanji", + "object", + "symbol" ], "moji": "🀄" }, @@ -16596,7 +18467,8 @@ "keywords": [ "communication", "email", - "inbox" + "inbox", + "object" ], "moji": "📫" }, @@ -16611,7 +18483,9 @@ "keywords": [ "communication", "email", - "inbox" + "inbox", + "object", + "office" ], "moji": "📪" }, @@ -16626,7 +18500,8 @@ "keywords": [ "communication", "email", - "inbox" + "inbox", + "object" ], "moji": "📬" }, @@ -16640,7 +18515,8 @@ "aliases_ascii": [], "keywords": [ "email", - "inbox" + "inbox", + "object" ], "moji": "ðŸ“" }, @@ -16649,7 +18525,7 @@ "unicode_alternates": [], "name": "man", "shortname": ":man:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16657,13 +18533,173 @@ "dad", "father", "guy", - "mustashe" + "mustashe", + "people", + "men", + "sex", + "diversity", + "selfie", + "boys night" ], "moji": "👨" }, + "man_dancing": { + "unicode": "1F57A", + "unicode_alternates": [], + "name": "man dancing", + "shortname": ":man_dancing:", + "category": "people", + "aliases": [ + ":male_dancer:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🕺" + }, + "man_dancing_tone1": { + "unicode": "1F57A-1F3FB", + "unicode_alternates": [], + "name": "man dancing tone 1", + "shortname": ":man_dancing_tone1:", + "category": "activity", + "aliases": [ + ":male_dancer_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🕺ðŸ»" + }, + "man_dancing_tone2": { + "unicode": "1F57A-1F3FC", + "unicode_alternates": [], + "name": "man dancing tone 2", + "shortname": ":man_dancing_tone2:", + "category": "activity", + "aliases": [ + ":male_dancer_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🕺ðŸ¼" + }, + "man_dancing_tone3": { + "unicode": "1F57A-1F3FD", + "unicode_alternates": [], + "name": "man dancing tone 3", + "shortname": ":man_dancing_tone3:", + "category": "activity", + "aliases": [ + ":male_dancer_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🕺ðŸ½" + }, + "man_dancing_tone4": { + "unicode": "1F57A-1F3FE", + "unicode_alternates": [], + "name": "man dancing tone 4", + "shortname": ":man_dancing_tone4:", + "category": "activity", + "aliases": [ + ":male_dancer_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🕺ðŸ¾" + }, + "man_dancing_tone5": { + "unicode": "1F57A-1F3FF", + "unicode_alternates": [], + "name": "man dancing tone 5", + "shortname": ":man_dancing_tone5:", + "category": "activity", + "aliases": [ + ":male_dancer_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🕺ðŸ¿" + }, + "man_in_tuxedo": { + "unicode": "1F935", + "unicode_alternates": [], + "name": "man in tuxedo", + "shortname": ":man_in_tuxedo:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵" + }, + "man_in_tuxedo_tone1": { + "unicode": "1F935-1F3FB", + "unicode_alternates": [], + "name": "man in tuxedo tone 1", + "shortname": ":man_in_tuxedo_tone1:", + "category": "people", + "aliases": [ + ":tuxedo_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵ðŸ»" + }, + "man_in_tuxedo_tone2": { + "unicode": "1F935-1F3FC", + "unicode_alternates": [], + "name": "man in tuxedo tone 2", + "shortname": ":man_in_tuxedo_tone2:", + "category": "people", + "aliases": [ + ":tuxedo_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵ðŸ¼" + }, + "man_in_tuxedo_tone3": { + "unicode": "1F935-1F3FD", + "unicode_alternates": [], + "name": "man in tuxedo tone 3", + "shortname": ":man_in_tuxedo_tone3:", + "category": "people", + "aliases": [ + ":tuxedo_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵ðŸ½" + }, + "man_in_tuxedo_tone4": { + "unicode": "1F935-1F3FE", + "unicode_alternates": [], + "name": "man in tuxedo tone 4", + "shortname": ":man_in_tuxedo_tone4:", + "category": "people", + "aliases": [ + ":tuxedo_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵ðŸ¾" + }, + "man_in_tuxedo_tone5": { + "unicode": "1F935-1F3FF", + "unicode_alternates": [], + "name": "man in tuxedo tone 5", + "shortname": ":man_in_tuxedo_tone5:", + "category": "people", + "aliases": [ + ":tuxedo_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤵ðŸ¿" + }, "man_tone1": { "unicode": "1F468-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man tone 1", "shortname": ":man_tone1:", "category": "people", @@ -16675,11 +18711,12 @@ "father", "guy", "mustache" - ] + ], + "moji": "👨ðŸ»" }, "man_tone2": { "unicode": "1F468-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man tone 2", "shortname": ":man_tone2:", "category": "people", @@ -16691,11 +18728,12 @@ "father", "guy", "mustache" - ] + ], + "moji": "👨ðŸ¼" }, "man_tone3": { "unicode": "1F468-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man tone 3", "shortname": ":man_tone3:", "category": "people", @@ -16707,11 +18745,12 @@ "father", "guy", "mustache" - ] + ], + "moji": "👨ðŸ½" }, "man_tone4": { "unicode": "1F468-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man tone 4", "shortname": ":man_tone4:", "category": "people", @@ -16723,11 +18762,12 @@ "father", "guy", "mustache" - ] + ], + "moji": "👨ðŸ¾" }, "man_tone5": { "unicode": "1F468-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man tone 5", "shortname": ":man_tone5:", "category": "people", @@ -16739,14 +18779,15 @@ "father", "guy", "mustache" - ] + ], + "moji": "👨ðŸ¿" }, "man_with_gua_pi_mao": { "unicode": "1F472", "unicode_alternates": [], "name": "man with gua pi mao", "shortname": ":man_with_gua_pi_mao:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16755,13 +18796,17 @@ "skullcap", "chinese", "asian", - "qing" + "qing", + "people", + "hat", + "men", + "diversity" ], "moji": "👲" }, "man_with_gua_pi_mao_tone1": { "unicode": "1F472-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with gua pi mao tone 1", "shortname": ":man_with_gua_pi_mao_tone1:", "category": "people", @@ -16774,11 +18819,12 @@ "chinese", "asian", "qing" - ] + ], + "moji": "👲ðŸ»" }, "man_with_gua_pi_mao_tone2": { "unicode": "1F472-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with gua pi mao tone 2", "shortname": ":man_with_gua_pi_mao_tone2:", "category": "people", @@ -16791,11 +18837,12 @@ "chinese", "asian", "qing" - ] + ], + "moji": "👲ðŸ¼" }, "man_with_gua_pi_mao_tone3": { "unicode": "1F472-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with gua pi mao tone 3", "shortname": ":man_with_gua_pi_mao_tone3:", "category": "people", @@ -16808,11 +18855,12 @@ "chinese", "asian", "qing" - ] + ], + "moji": "👲ðŸ½" }, "man_with_gua_pi_mao_tone4": { "unicode": "1F472-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with gua pi mao tone 4", "shortname": ":man_with_gua_pi_mao_tone4:", "category": "people", @@ -16825,11 +18873,12 @@ "chinese", "asian", "qing" - ] + ], + "moji": "👲ðŸ¾" }, "man_with_gua_pi_mao_tone5": { "unicode": "1F472-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with gua pi mao tone 5", "shortname": ":man_with_gua_pi_mao_tone5:", "category": "people", @@ -16842,14 +18891,15 @@ "chinese", "asian", "qing" - ] + ], + "moji": "👲ðŸ¿" }, "man_with_turban": { "unicode": "1F473", "unicode_alternates": [], "name": "man with turban", "shortname": ":man_with_turban:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -16862,13 +18912,16 @@ "indian", "mummy", "wisdom", - "peace" + "peace", + "people", + "hat", + "diversity" ], "moji": "👳" }, "man_with_turban_tone1": { "unicode": "1F473-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with turban tone 1", "shortname": ":man_with_turban_tone1:", "category": "people", @@ -16884,11 +18937,12 @@ "mummy", "wisdom", "peace" - ] + ], + "moji": "👳ðŸ»" }, "man_with_turban_tone2": { "unicode": "1F473-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with turban tone 2", "shortname": ":man_with_turban_tone2:", "category": "people", @@ -16904,11 +18958,12 @@ "mummy", "wisdom", "peace" - ] + ], + "moji": "👳ðŸ¼" }, "man_with_turban_tone3": { "unicode": "1F473-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with turban tone 3", "shortname": ":man_with_turban_tone3:", "category": "people", @@ -16924,11 +18979,12 @@ "mummy", "wisdom", "peace" - ] + ], + "moji": "👳ðŸ½" }, "man_with_turban_tone4": { "unicode": "1F473-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with turban tone 4", "shortname": ":man_with_turban_tone4:", "category": "people", @@ -16944,11 +19000,12 @@ "mummy", "wisdom", "peace" - ] + ], + "moji": "👳ðŸ¾" }, "man_with_turban_tone5": { "unicode": "1F473-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "man with turban tone 5", "shortname": ":man_with_turban_tone5:", "category": "people", @@ -16964,19 +19021,22 @@ "mummy", "wisdom", "peace" - ] + ], + "moji": "👳ðŸ¿" }, "mans_shoe": { "unicode": "1F45E", "unicode_alternates": [], "name": "mans shoe", "shortname": ":mans_shoe:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "fashion", - "male" + "male", + "shoe", + "accessories" ], "moji": "👞" }, @@ -16985,7 +19045,7 @@ "unicode_alternates": [], "name": "world map", "shortname": ":map:", - "category": "travel_places", + "category": "objects", "aliases": [ ":world_map:" ], @@ -16993,8 +19053,12 @@ "keywords": [ "atlas", "earth", - "cartography" - ] + "cartography", + "travel", + "map", + "vacation" + ], + "moji": "🗺" }, "maple_leaf": { "unicode": "1F341", @@ -17012,28 +19076,42 @@ "maple", "leaf", "syrup", - "canada", "tree" ], "moji": "ðŸ" }, + "martial_arts_uniform": { + "unicode": "1F94B", + "unicode_alternates": [], + "name": "martial arts uniform", + "shortname": ":martial_arts_uniform:", + "category": "activity", + "aliases": [ + ":karate_uniform:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥋" + }, "mask": { "unicode": "1F637", "unicode_alternates": [], "name": "face with medical mask", "shortname": ":mask:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "face", "ill", "sick", - "sick", "virus", "flu", "medical", - "mask" + "mask", + "smiley", + "dead", + "health" ], "moji": "😷" }, @@ -17042,19 +19120,22 @@ "unicode_alternates": [], "name": "face massage", "shortname": ":massage:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "female", "girl", - "woman" + "woman", + "people", + "women", + "diversity" ], "moji": "💆" }, "massage_tone1": { "unicode": "1F486-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face massage tone 1", "shortname": ":massage_tone1:", "category": "people", @@ -17064,11 +19145,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💆ðŸ»" }, "massage_tone2": { "unicode": "1F486-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face massage tone 2", "shortname": ":massage_tone2:", "category": "people", @@ -17078,11 +19160,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💆ðŸ¼" }, "massage_tone3": { "unicode": "1F486-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face massage tone 3", "shortname": ":massage_tone3:", "category": "people", @@ -17092,11 +19175,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💆ðŸ½" }, "massage_tone4": { "unicode": "1F486-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face massage tone 4", "shortname": ":massage_tone4:", "category": "people", @@ -17106,11 +19190,12 @@ "female", "girl", "woman" - ] + ], + "moji": "💆ðŸ¾" }, "massage_tone5": { "unicode": "1F486-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face massage tone 5", "shortname": ":massage_tone5:", "category": "people", @@ -17120,14 +19205,15 @@ "female", "girl", "woman" - ] + ], + "moji": "💆ðŸ¿" }, "meat_on_bone": { "unicode": "1F356", "unicode_alternates": [], "name": "meat on bone", "shortname": ":meat_on_bone:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17160,21 +19246,27 @@ "first", "show", "reward", - "achievement" - ] + "achievement", + "object", + "sport", + "perfect" + ], + "moji": "ðŸ…" }, "mega": { "unicode": "1F4E3", "unicode_alternates": [], "name": "cheering megaphone", "shortname": ":mega:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "sound", "speaker", - "volume" + "volume", + "object", + "sport" ], "moji": "📣" }, @@ -17183,7 +19275,7 @@ "unicode_alternates": [], "name": "melon", "shortname": ":melon:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17192,26 +19284,34 @@ "nature", "melon", "cantaloupe", - "honeydew" + "honeydew", + "boobs" ], "moji": "ðŸˆ" }, "menorah": { "unicode": "1F54E", - "unicode_alternates": "", + "unicode_alternates": [], "name": "menorah with nine branches", "shortname": ":menorah:", "category": "symbols", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "religion", + "object", + "jew", + "symbol", + "holidays" + ], + "moji": "🕎" }, "mens": { "unicode": "1F6B9", "unicode_alternates": [], "name": "mens symbol", "shortname": ":mens:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17220,17 +19320,17 @@ "wc", "men", "bathroom", - "restroom", "sign", "boy", "male", - "avatar" + "avatar", + "symbol" ], "moji": "🚹" }, "metal": { "unicode": "1F918", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sign of the horns", "shortname": ":metal:", "category": "people", @@ -17242,12 +19342,19 @@ "band", "concert", "fingers", - "rocknroll" - ] + "rocknroll", + "body", + "hands", + "hi", + "diversity", + "boys night", + "parties" + ], + "moji": "🤘" }, "metal_tone1": { "unicode": "1F918-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sign of the horns tone 1", "shortname": ":metal_tone1:", "category": "people", @@ -17260,11 +19367,12 @@ "concert", "fingers", "rocknroll" - ] + ], + "moji": "🤘ðŸ»" }, "metal_tone2": { "unicode": "1F918-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sign of the horns tone 2", "shortname": ":metal_tone2:", "category": "people", @@ -17277,11 +19385,12 @@ "concert", "fingers", "rocknroll" - ] + ], + "moji": "🤘ðŸ¼" }, "metal_tone3": { "unicode": "1F918-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sign of the horns tone 3", "shortname": ":metal_tone3:", "category": "people", @@ -17294,11 +19403,12 @@ "concert", "fingers", "rocknroll" - ] + ], + "moji": "🤘ðŸ½" }, "metal_tone4": { "unicode": "1F918-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sign of the horns tone 4", "shortname": ":metal_tone4:", "category": "people", @@ -17311,11 +19421,12 @@ "concert", "fingers", "rocknroll" - ] + ], + "moji": "🤘ðŸ¾" }, "metal_tone5": { "unicode": "1F918-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sign of the horns tone 5", "shortname": ":metal_tone5:", "category": "people", @@ -17328,14 +19439,15 @@ "concert", "fingers", "rocknroll" - ] + ], + "moji": "🤘ðŸ¿" }, "metro": { "unicode": "1F687", "unicode_alternates": [], "name": "metro", "shortname": ":metro:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17346,8 +19458,8 @@ "underground", "metro", "subway", - "underground", - "train" + "train", + "travel" ], "moji": "🚇" }, @@ -17356,7 +19468,7 @@ "unicode_alternates": [], "name": "microphone", "shortname": ":microphone:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17366,9 +19478,9 @@ "microphone", "mic", "audio", - "sound", "voice", - "karaoke" + "karaoke", + "instruments" ], "moji": "🎤" }, @@ -17377,7 +19489,7 @@ "unicode_alternates": [], "name": "studio microphone", "shortname": ":microphone2:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":studio_microphone:" ], @@ -17385,8 +19497,11 @@ "keywords": [ "mic", "audio", - "recording" - ] + "recording", + "electronics", + "object" + ], + "moji": "🎙" }, "microscope": { "unicode": "1F52C", @@ -17399,7 +19514,9 @@ "keywords": [ "experiment", "laboratory", - "zoomin" + "zoomin", + "object", + "science" ], "moji": "🔬" }, @@ -17414,12 +19531,17 @@ ], "aliases_ascii": [], "keywords": [ - "fu" - ] + "fu", + "body", + "hands", + "middle finger", + "diversity" + ], + "moji": "🖕" }, "middle_finger_tone1": { "unicode": "1F595-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "reversed hand with middle finger extended tone 1", "shortname": ":middle_finger_tone1:", "category": "people", @@ -17429,11 +19551,12 @@ "aliases_ascii": [], "keywords": [ "fu" - ] + ], + "moji": "🖕ðŸ»" }, "middle_finger_tone2": { "unicode": "1F595-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "reversed hand with middle finger extended tone 2", "shortname": ":middle_finger_tone2:", "category": "people", @@ -17443,11 +19566,12 @@ "aliases_ascii": [], "keywords": [ "fu" - ] + ], + "moji": "🖕ðŸ¼" }, "middle_finger_tone3": { "unicode": "1F595-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "reversed hand with middle finger extended tone 3", "shortname": ":middle_finger_tone3:", "category": "people", @@ -17457,11 +19581,12 @@ "aliases_ascii": [], "keywords": [ "fu" - ] + ], + "moji": "🖕ðŸ½" }, "middle_finger_tone4": { "unicode": "1F595-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "reversed hand with middle finger extended tone 4", "shortname": ":middle_finger_tone4:", "category": "people", @@ -17471,11 +19596,12 @@ "aliases_ascii": [], "keywords": [ "fu" - ] + ], + "moji": "🖕ðŸ¾" }, "middle_finger_tone5": { "unicode": "1F595-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "reversed hand with middle finger extended tone 5", "shortname": ":middle_finger_tone5:", "category": "people", @@ -17485,14 +19611,15 @@ "aliases_ascii": [], "keywords": [ "fu" - ] + ], + "moji": "🖕ðŸ¿" }, "military_medal": { "unicode": "1F396", "unicode_alternates": [], "name": "military medal", "shortname": ":military_medal:", - "category": "celebration", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17500,15 +19627,32 @@ "acknowledgment", "purple heart", "heroism", - "veteran" - ] + "veteran", + "object", + "award", + "win" + ], + "moji": "🎖" + }, + "milk": { + "unicode": "1F95B", + "unicode_alternates": [], + "name": "glass of milk", + "shortname": ":milk:", + "category": "food", + "aliases": [ + ":glass_of_milk:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥛" }, "milky_way": { "unicode": "1F30C", "unicode_alternates": [], "name": "milky way", "shortname": ":milky_way:", - "category": "nature", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17519,8 +19663,10 @@ "star", "stars", "planets", - "space", - "sky" + "sky", + "places", + "travel", + "vacation" ], "moji": "🌌" }, @@ -17529,7 +19675,7 @@ "unicode_alternates": [], "name": "minibus", "shortname": ":minibus:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17538,8 +19684,7 @@ "vehicle", "bus", "city", - "transport", - "transportation" + "transport" ], "moji": "ðŸš" }, @@ -17556,7 +19701,8 @@ "disc", "disk", "record", - "technology" + "technology", + "electronics" ], "moji": "💽" }, @@ -17565,17 +19711,18 @@ "unicode_alternates": [], "name": "mobile phone off", "shortname": ":mobile_phone_off:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "mute" + "mute", + "symbol" ], "moji": "📴" }, "money_mouth": { "unicode": "1F911", - "unicode_alternates": "", + "unicode_alternates": [], "name": "money-mouth face", "shortname": ":money_mouth:", "category": "people", @@ -17583,7 +19730,14 @@ ":money_mouth_face:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "smiley", + "win", + "money", + "emotion", + "boys night" + ], + "moji": "🤑" }, "money_with_wings": { "unicode": "1F4B8", @@ -17607,7 +19761,7 @@ "burned", "gift", "cash", - "dollar" + "boys night" ], "moji": "💸" }, @@ -17622,7 +19776,10 @@ "keywords": [ "coins", "dollar", - "payment" + "payment", + "bag", + "award", + "money" ], "moji": "💰" }, @@ -17640,7 +19797,8 @@ "monkey", "primate", "banana", - "silly" + "silly", + "wildlife" ], "moji": "ðŸ’" }, @@ -17663,7 +19821,7 @@ "unicode_alternates": [], "name": "monorail", "shortname": ":monorail:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17672,66 +19830,18 @@ "train", "mono", "rail", - "transport" + "transport", + "travel", + "vacation" ], "moji": "ðŸš" }, - "mood_bubble": { - "unicode": "1F5F0", - "unicode_alternates": [], - "name": "mood bubble", - "shortname": ":mood_bubble:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "balloon", - "conversation", - "communication", - "comic", - "feeling" - ] - }, - "mood_bubble_lightning": { - "unicode": "1F5F1", - "unicode_alternates": [], - "name": "lightning mood bubble", - "shortname": ":mood_bubble_lightning:", - "category": "objects_symbols", - "aliases": [ - ":lightning_mood_bubble:" - ], - "aliases_ascii": [], - "keywords": [ - "balloon", - "conversation", - "communication", - "comic", - "feeling" - ] - }, - "mood_lightning": { - "unicode": "1F5F2", - "unicode_alternates": [], - "name": "lightning mood", - "shortname": ":mood_lightning:", - "category": "objects_symbols", - "aliases": [ - ":lightning_mood:" - ], - "aliases_ascii": [], - "keywords": [ - "zap", - "electric", - "current" - ] - }, "mortar_board": { "unicode": "1F393", "unicode_alternates": [], "name": "graduation cap", "shortname": ":mortar_board:", - "category": "objects", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17742,33 +19852,55 @@ "hat", "school", "university", - "graduation", - "cap", "mortarboard", "academic", "education", "ceremony", "square", - "tassel" + "tassel", + "office", + "accessories" ], "moji": "🎓" }, "mosque": { "unicode": "1F54C", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mosque", "shortname": ":mosque:", "category": "travel", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "places", + "religion", + "building", + "vacation", + "condolence" + ], + "moji": "🕌" + }, + "motor_scooter": { + "unicode": "1F6F5", + "unicode_alternates": [], + "name": "motor scooter", + "shortname": ":motor_scooter:", + "category": "travel", + "aliases": [ + ":motorbike:" + ], + "aliases_ascii": [], + "keywords": [ + "moped" + ], + "moji": "🛵" }, "motorboat": { "unicode": "1F6E5", "unicode_alternates": [], "name": "motorboat", "shortname": ":motorboat:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17776,30 +19908,35 @@ "vehicle", "boat", "speedboat", - "powerboat" - ] + "powerboat", + "travel" + ], + "moji": "🛥" }, "motorcycle": { "unicode": "1F3CD", "unicode_alternates": [], "name": "racing motorcycle", "shortname": ":motorcycle:", - "category": "activity", + "category": "travel", "aliases": [ ":racing_motorcycle:" ], "aliases_ascii": [], "keywords": [ "bike", - "speed" - ] + "speed", + "transportation", + "travel" + ], + "moji": "ðŸ" }, "motorway": { "unicode": "1F6E3", "unicode_alternates": [], "name": "motorway", "shortname": ":motorway:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17807,43 +19944,56 @@ "highway", "freeway", "traffic", - "travel" - ] + "travel", + "vacation", + "camp" + ], + "moji": "🛣" }, "mount_fuji": { "unicode": "1F5FB", "unicode_alternates": [], "name": "mount fuji", "shortname": ":mount_fuji:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "japan", "mountain", "nature", - "photo" + "photo", + "places", + "travel", + "vacation", + "cold", + "camp" ], "moji": "🗻" }, "mountain": { "unicode": "26F0", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mountain", "shortname": ":mountain:", "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "place" - ] + "place", + "places", + "travel", + "vacation", + "camp" + ], + "moji": "â›°" }, "mountain_bicyclist": { "unicode": "1F6B5", "unicode_alternates": [], "name": "mountain bicyclist", "shortname": ":mountain_bicyclist:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17855,13 +20005,15 @@ "bike", "pedal", "bicycle", - "transportation" + "men", + "sport", + "diversity" ], "moji": "🚵" }, "mountain_bicyclist_tone1": { "unicode": "1F6B5-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mountain bicyclist tone 1", "shortname": ":mountain_bicyclist_tone1:", "category": "activity", @@ -17872,13 +20024,13 @@ "transportation", "bike", "pedal", - "bicycle", - "transportation" - ] + "bicycle" + ], + "moji": "🚵ðŸ»" }, "mountain_bicyclist_tone2": { "unicode": "1F6B5-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mountain bicyclist tone 2", "shortname": ":mountain_bicyclist_tone2:", "category": "activity", @@ -17889,13 +20041,13 @@ "transportation", "bike", "pedal", - "bicycle", - "transportation" - ] + "bicycle" + ], + "moji": "🚵ðŸ¼" }, "mountain_bicyclist_tone3": { "unicode": "1F6B5-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mountain bicyclist tone 3", "shortname": ":mountain_bicyclist_tone3:", "category": "activity", @@ -17906,13 +20058,13 @@ "transportation", "bike", "pedal", - "bicycle", - "transportation" - ] + "bicycle" + ], + "moji": "🚵ðŸ½" }, "mountain_bicyclist_tone4": { "unicode": "1F6B5-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mountain bicyclist tone 4", "shortname": ":mountain_bicyclist_tone4:", "category": "activity", @@ -17923,13 +20075,13 @@ "transportation", "bike", "pedal", - "bicycle", - "transportation" - ] + "bicycle" + ], + "moji": "🚵ðŸ¾" }, "mountain_bicyclist_tone5": { "unicode": "1F6B5-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "mountain bicyclist tone 5", "shortname": ":mountain_bicyclist_tone5:", "category": "activity", @@ -17940,16 +20092,16 @@ "transportation", "bike", "pedal", - "bicycle", - "transportation" - ] + "bicycle" + ], + "moji": "🚵ðŸ¿" }, "mountain_cableway": { "unicode": "1F6A0", "unicode_alternates": [], "name": "mountain cableway", "shortname": ":mountain_cableway:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17959,7 +20111,8 @@ "cable", "rail", "train", - "railway" + "railway", + "travel" ], "moji": "🚠" }, @@ -17968,7 +20121,7 @@ "unicode_alternates": [], "name": "mountain railway", "shortname": ":mountain_railway:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -17977,7 +20130,8 @@ "railway", "rail", "train", - "transport" + "transport", + "travel" ], "moji": "🚞" }, @@ -17986,7 +20140,7 @@ "unicode_alternates": [], "name": "snow capped mountain", "shortname": ":mountain_snow:", - "category": "travel_places", + "category": "travel", "aliases": [ ":snow_capped_mountain:" ], @@ -17995,8 +20149,13 @@ "cold", "elevation", "hiking", - "peak" - ] + "peak", + "places", + "travel", + "vacation", + "camp" + ], + "moji": "ðŸ”" }, "mouse": { "unicode": "1F42D", @@ -18029,25 +20188,9 @@ ], "moji": "ðŸ" }, - "mouse_one": { - "unicode": "1F5AF", - "unicode_alternates": [], - "name": "one button mouse", - "shortname": ":mouse_one:", - "category": "objects_symbols", - "aliases": [ - ":one_button_mouse:" - ], - "aliases_ascii": [], - "keywords": [ - "computer", - "input", - "device" - ] - }, "mouse_three_button": { "unicode": "1F5B1", - "unicode_alternates": "", + "unicode_alternates": [], "name": "three button mouse", "shortname": ":mouse_three_button:", "category": "objects", @@ -18059,8 +20202,12 @@ "3", "computer", "object", - "office" - ] + "office", + "electronics", + "work", + "game" + ], + "moji": "🖱" }, "movie_camera": { "unicode": "1F3A5", @@ -18078,7 +20225,8 @@ "camcorder", "video", "motion", - "picture" + "picture", + "object" ], "moji": "🎥" }, @@ -18087,21 +20235,101 @@ "unicode_alternates": [], "name": "moyai", "shortname": ":moyai:", - "category": "places", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "island", - "stone" + "stone", + "travel", + "vacation" ], "moji": "🗿" }, + "mrs_claus": { + "unicode": "1F936", + "unicode_alternates": [], + "name": "mother christmas", + "shortname": ":mrs_claus:", + "category": "people", + "aliases": [ + ":mother_christmas:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶" + }, + "mrs_claus_tone1": { + "unicode": "1F936-1F3FB", + "unicode_alternates": [], + "name": "mother christmas tone 1", + "shortname": ":mrs_claus_tone1:", + "category": "people", + "aliases": [ + ":mother_christmas_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶ðŸ»" + }, + "mrs_claus_tone2": { + "unicode": "1F936-1F3FC", + "unicode_alternates": [], + "name": "mother christmas tone 2", + "shortname": ":mrs_claus_tone2:", + "category": "people", + "aliases": [ + ":mother_christmas_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶ðŸ¼" + }, + "mrs_claus_tone3": { + "unicode": "1F936-1F3FD", + "unicode_alternates": [], + "name": "mother christmas tone 3", + "shortname": ":mrs_claus_tone3:", + "category": "people", + "aliases": [ + ":mother_christmas_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶ðŸ½" + }, + "mrs_claus_tone4": { + "unicode": "1F936-1F3FE", + "unicode_alternates": [], + "name": "mother christmas tone 4", + "shortname": ":mrs_claus_tone4:", + "category": "people", + "aliases": [ + ":mother_christmas_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶ðŸ¾" + }, + "mrs_claus_tone5": { + "unicode": "1F936-1F3FF", + "unicode_alternates": [], + "name": "mother christmas tone 5", + "shortname": ":mrs_claus_tone5:", + "category": "people", + "aliases": [ + ":mother_christmas_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤶ðŸ¿" + }, "muscle": { "unicode": "1F4AA", "unicode_alternates": [], "name": "flexed biceps", "shortname": ":muscle:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18110,13 +20338,20 @@ "hand", "strong", "muscle", - "bicep" + "bicep", + "body", + "hands", + "workout", + "win", + "diversity", + "feminist", + "boys night" ], "moji": "💪" }, "muscle_tone1": { "unicode": "1F4AA-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "flexed biceps tone 1", "shortname": ":muscle_tone1:", "category": "people", @@ -18129,11 +20364,12 @@ "strong", "muscle", "bicep" - ] + ], + "moji": "💪ðŸ»" }, "muscle_tone2": { "unicode": "1F4AA-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "flexed biceps tone 2", "shortname": ":muscle_tone2:", "category": "people", @@ -18146,11 +20382,12 @@ "strong", "muscle", "bicep" - ] + ], + "moji": "💪ðŸ¼" }, "muscle_tone3": { "unicode": "1F4AA-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "flexed biceps tone 3", "shortname": ":muscle_tone3:", "category": "people", @@ -18163,11 +20400,12 @@ "strong", "muscle", "bicep" - ] + ], + "moji": "💪ðŸ½" }, "muscle_tone4": { "unicode": "1F4AA-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "flexed biceps tone 4", "shortname": ":muscle_tone4:", "category": "people", @@ -18180,11 +20418,12 @@ "strong", "muscle", "bicep" - ] + ], + "moji": "💪ðŸ¾" }, "muscle_tone5": { "unicode": "1F4AA-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "flexed biceps tone 5", "shortname": ":muscle_tone5:", "category": "people", @@ -18197,7 +20436,8 @@ "strong", "muscle", "bicep" - ] + ], + "moji": "💪ðŸ¿" }, "mushroom": { "unicode": "1F344", @@ -18213,7 +20453,9 @@ "mushroom", "fungi", "food", - "fungus" + "fungus", + "nature", + "drugs" ], "moji": "ðŸ„" }, @@ -18222,7 +20464,7 @@ "unicode_alternates": [], "name": "musical keyboard", "shortname": ":musical_keyboard:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18230,10 +20472,9 @@ "piano", "music", "keyboard", - "piano", "organ", - "instrument", - "electric" + "electric", + "instruments" ], "moji": "🎹" }, @@ -18242,7 +20483,7 @@ "unicode_alternates": [], "name": "musical note", "shortname": ":musical_note:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18250,8 +20491,9 @@ "musical", "music", "note", - "music", - "sound" + "sound", + "instruments", + "symbol" ], "moji": "🎵" }, @@ -18260,7 +20502,7 @@ "unicode_alternates": [], "name": "musical score", "shortname": ":musical_score:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18269,10 +20511,10 @@ "music", "musical", "score", - "clef", "g-clef", "stave", - "staff" + "staff", + "instruments" ], "moji": "🎼" }, @@ -18281,12 +20523,14 @@ "unicode_alternates": [], "name": "speaker with cancellation stroke", "shortname": ":mute:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "sound", - "volume" + "volume", + "alarm", + "symbol" ], "moji": "🔇" }, @@ -18295,18 +20539,24 @@ "unicode_alternates": [], "name": "nail polish", "shortname": ":nail_care:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "beauty", - "manicure" + "manicure", + "women", + "body", + "hands", + "nailpolish", + "diversity", + "girls night" ], "moji": "💅" }, "nail_care_tone1": { "unicode": "1F485-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nail polish tone 1", "shortname": ":nail_care_tone1:", "category": "people", @@ -18315,11 +20565,12 @@ "keywords": [ "beauty", "manicure" - ] + ], + "moji": "💅ðŸ»" }, "nail_care_tone2": { "unicode": "1F485-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nail polish tone 2", "shortname": ":nail_care_tone2:", "category": "people", @@ -18328,11 +20579,12 @@ "keywords": [ "beauty", "manicure" - ] + ], + "moji": "💅ðŸ¼" }, "nail_care_tone3": { "unicode": "1F485-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nail polish tone 3", "shortname": ":nail_care_tone3:", "category": "people", @@ -18341,11 +20593,12 @@ "keywords": [ "beauty", "manicure" - ] + ], + "moji": "💅ðŸ½" }, "nail_care_tone4": { "unicode": "1F485-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nail polish tone 4", "shortname": ":nail_care_tone4:", "category": "people", @@ -18354,11 +20607,12 @@ "keywords": [ "beauty", "manicure" - ] + ], + "moji": "💅ðŸ¾" }, "nail_care_tone5": { "unicode": "1F485-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nail polish tone 5", "shortname": ":nail_care_tone5:", "category": "people", @@ -18367,28 +20621,43 @@ "keywords": [ "beauty", "manicure" - ] + ], + "moji": "💅ðŸ¿" }, "name_badge": { "unicode": "1F4DB", "unicode_alternates": [], "name": "name badge", "shortname": ":name_badge:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "fire", - "forbid" + "forbid", + "work" ], "moji": "📛" }, + "nauseated_face": { + "unicode": "1F922", + "unicode_alternates": [], + "name": "nauseated face", + "shortname": ":nauseated_face:", + "category": "people", + "aliases": [ + ":sick:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤢" + }, "necktie": { "unicode": "1F454", "unicode_alternates": [], "name": "necktie", "shortname": ":necktie:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18405,20 +20674,21 @@ "unicode_alternates": [], "name": "negative squared cross mark", "shortname": ":negative_squared_cross_mark:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "deny", "green-square", "no", - "x" + "x", + "symbol" ], "moji": "âŽ" }, "nerd": { "unicode": "1F913", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nerd face", "shortname": ":nerd:", "category": "people", @@ -18426,31 +20696,18 @@ ":nerd_face:" ], "aliases_ascii": [], - "keywords": [] - }, - "network": { - "unicode": "1F5A7", - "unicode_alternates": [], - "name": "three networked computers", - "shortname": ":network:", - "category": "objects_symbols", - "aliases": [ - ":three_networked_computers:" - ], - "aliases_ascii": [], "keywords": [ - "lan", - "wan", - "network", - "technology" - ] + "smiley", + "glasses" + ], + "moji": "🤓" }, "neutral_face": { "unicode": "1F610", "unicode_alternates": [], "name": "neutral face", "shortname": ":neutral_face:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18459,7 +20716,11 @@ "neutral", "objective", "impartial", - "blank" + "blank", + "mad", + "smiley", + "shrug", + "emotion" ], "moji": "ðŸ˜" }, @@ -18468,11 +20729,12 @@ "unicode_alternates": [], "name": "squared new", "shortname": ":new:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "symbol" ], "moji": "🆕" }, @@ -18491,7 +20753,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌑" }, @@ -18512,7 +20775,9 @@ "sky", "night", "cheese", - "phase" + "phase", + "space", + "goodnight" ], "moji": "🌚" }, @@ -18526,7 +20791,9 @@ "aliases_ascii": [], "keywords": [ "headline", - "press" + "press", + "office", + "write" ], "moji": "📰" }, @@ -18535,19 +20802,22 @@ "unicode_alternates": [], "name": "rolled-up newspaper", "shortname": ":newspaper2:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":rolled_up_newspaper:" ], "aliases_ascii": [], "keywords": [ "headline", - "press" - ] + "press", + "office", + "write" + ], + "moji": "🗞" }, "ng": { "unicode": "1F196", - "unicode_alternates": "", + "unicode_alternates": [], "name": "squared ng", "shortname": ":ng:", "category": "symbols", @@ -18558,14 +20828,15 @@ "no good", "symbol", "word" - ] + ], + "moji": "🆖" }, "night_with_stars": { "unicode": "1F303", "unicode_alternates": [], "name": "night with stars", "shortname": ":night_with_stars:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18575,7 +20846,11 @@ "evening", "planets", "space", - "sky" + "sky", + "places", + "building", + "vacation", + "goodnight" ], "moji": "🌃" }, @@ -18585,15 +20860,18 @@ "unicode_alternates": [ "0039-FE0F-20E3" ], - "name": "digit nine", + "name": "keycap digit nine", "shortname": ":nine:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "9", "blue-square", - "numbers" + "numbers", + "number", + "math", + "symbol" ] }, "no_bell": { @@ -18601,13 +20879,15 @@ "unicode_alternates": [], "name": "bell with cancellation stroke", "shortname": ":no_bell:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "mute", "sound", - "volume" + "volume", + "alarm", + "symbol" ], "moji": "🔕" }, @@ -18616,7 +20896,7 @@ "unicode_alternates": [], "name": "no bicycles", "shortname": ":no_bicycles:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18624,7 +20904,8 @@ "prohibited", "bicycle", "bike pedal", - "no" + "no", + "symbol" ], "moji": "🚳" }, @@ -18635,7 +20916,7 @@ ], "name": "no entry", "shortname": ":no_entry:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18644,7 +20925,9 @@ "limit", "privacy", "security", - "stop" + "stop", + "symbol", + "circle" ], "moji": "â›”" }, @@ -18653,7 +20936,7 @@ "unicode_alternates": [], "name": "no entry sign", "shortname": ":no_entry_sign:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18663,8 +20946,9 @@ "limit", "stop", "no", - "stop", - "entry" + "entry", + "symbol", + "circle" ], "moji": "🚫" }, @@ -18673,7 +20957,7 @@ "unicode_alternates": [], "name": "face with no good gesture", "shortname": ":no_good:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18684,13 +20968,17 @@ "stop", "nope", "don't", - "not" + "not", + "people", + "women", + "diversity", + "girls night" ], "moji": "🙅" }, "no_good_tone1": { "unicode": "1F645-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with no good gesture tone 1", "shortname": ":no_good_tone1:", "category": "people", @@ -18708,11 +20996,12 @@ "hand", "person", "prohibited" - ] + ], + "moji": "🙅ðŸ»" }, "no_good_tone2": { "unicode": "1F645-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with no good gesture tone 2", "shortname": ":no_good_tone2:", "category": "people", @@ -18730,11 +21019,12 @@ "hand", "person", "prohibited" - ] + ], + "moji": "🙅ðŸ¼" }, "no_good_tone3": { "unicode": "1F645-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with no good gesture tone 3", "shortname": ":no_good_tone3:", "category": "people", @@ -18752,11 +21042,12 @@ "hand", "person", "prohibited" - ] + ], + "moji": "🙅ðŸ½" }, "no_good_tone4": { "unicode": "1F645-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with no good gesture tone 4", "shortname": ":no_good_tone4:", "category": "people", @@ -18774,11 +21065,12 @@ "hand", "person", "prohibited" - ] + ], + "moji": "🙅ðŸ¾" }, "no_good_tone5": { "unicode": "1F645-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with no good gesture tone 5", "shortname": ":no_good_tone5:", "category": "people", @@ -18796,19 +21088,22 @@ "hand", "person", "prohibited" - ] + ], + "moji": "🙅ðŸ¿" }, "no_mobile_phones": { "unicode": "1F4F5", "unicode_alternates": [], "name": "no mobile phones", "shortname": ":no_mobile_phones:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "iphone", - "mute" + "mute", + "symbol", + "phone" ], "moji": "📵" }, @@ -18817,7 +21112,7 @@ "unicode_alternates": [], "name": "face without mouth", "shortname": ":no_mouth:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":-X", @@ -18835,7 +21130,11 @@ "hellokitty", "mouth", "silent", - "vapid" + "vapid", + "mad", + "smiley", + "neutral", + "emotion" ], "moji": "😶" }, @@ -18844,7 +21143,7 @@ "unicode_alternates": [], "name": "no pedestrians", "shortname": ":no_pedestrians:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18857,7 +21156,8 @@ "stroll", "stride", "foot", - "feet" + "feet", + "symbol" ], "moji": "🚷" }, @@ -18866,20 +21166,20 @@ "unicode_alternates": [], "name": "no smoking symbol", "shortname": ":no_smoking:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "cigarette", "no", "smoking", - "cigarette", "smoke", "cancer", "lungs", "inhale", "tar", - "nicotine" + "nicotine", + "symbol" ], "moji": "ðŸš" }, @@ -18888,7 +21188,7 @@ "unicode_alternates": [], "name": "non-potable water symbol", "shortname": ":non-potable_water:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -18901,7 +21201,8 @@ "dirty", "gross", "aqua", - "h20" + "h20", + "symbol" ], "moji": "🚱" }, @@ -18910,18 +21211,20 @@ "unicode_alternates": [], "name": "nose", "shortname": ":nose:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "smell", - "sniff" + "sniff", + "body", + "diversity" ], "moji": "👃" }, "nose_tone1": { "unicode": "1F443-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nose tone 1", "shortname": ":nose_tone1:", "category": "people", @@ -18930,11 +21233,12 @@ "keywords": [ "smell", "sniff" - ] + ], + "moji": "👃ðŸ»" }, "nose_tone2": { "unicode": "1F443-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nose tone 2", "shortname": ":nose_tone2:", "category": "people", @@ -18943,11 +21247,12 @@ "keywords": [ "smell", "sniff" - ] + ], + "moji": "👃ðŸ¼" }, "nose_tone3": { "unicode": "1F443-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nose tone 3", "shortname": ":nose_tone3:", "category": "people", @@ -18956,11 +21261,12 @@ "keywords": [ "smell", "sniff" - ] + ], + "moji": "👃ðŸ½" }, "nose_tone4": { "unicode": "1F443-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nose tone 4", "shortname": ":nose_tone4:", "category": "people", @@ -18969,11 +21275,12 @@ "keywords": [ "smell", "sniff" - ] + ], + "moji": "👃ðŸ¾" }, "nose_tone5": { "unicode": "1F443-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "nose tone 5", "shortname": ":nose_tone5:", "category": "people", @@ -18982,37 +21289,8 @@ "keywords": [ "smell", "sniff" - ] - }, - "note": { - "unicode": "1F5C9", - "unicode_alternates": [], - "name": "note page", - "shortname": ":note:", - "category": "objects_symbols", - "aliases": [ - ":note_page:" - ], - "aliases_ascii": [], - "keywords": [ - "stationery", - "post-it" - ] - }, - "note_empty": { - "unicode": "1F5C6", - "unicode_alternates": [], - "name": "empty note page", - "shortname": ":note_empty:", - "category": "objects_symbols", - "aliases": [ - ":empty_note_page:" ], - "aliases_ascii": [], - "keywords": [ - "stationery", - "post-it" - ] + "moji": "👃ðŸ¿" }, "notebook": { "unicode": "1F4D3", @@ -19026,7 +21304,10 @@ "notes", "paper", "record", - "stationery" + "stationery", + "object", + "office", + "write" ], "moji": "📓" }, @@ -19042,71 +21323,48 @@ "classroom", "notes", "paper", - "record" + "record", + "object", + "office", + "write" ], "moji": "📔" }, - "notepad": { - "unicode": "1F5CA", - "unicode_alternates": [], - "name": "note pad", - "shortname": ":notepad:", - "category": "objects_symbols", - "aliases": [ - ":note_pad:" - ], - "aliases_ascii": [], - "keywords": [ - "stationery", - "post-it" - ] - }, - "notepad_empty": { - "unicode": "1F5C7", - "unicode_alternates": [], - "name": "empty note pad", - "shortname": ":notepad_empty:", - "category": "objects_symbols", - "aliases": [ - ":empty_note_pad:" - ], - "aliases_ascii": [], - "keywords": [ - "stationery", - "post-it" - ] - }, "notepad_spiral": { "unicode": "1F5D2", "unicode_alternates": [], "name": "spiral note pad", "shortname": ":notepad_spiral:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":spiral_note_pad:" ], "aliases_ascii": [], "keywords": [ - "stationery" - ] + "stationery", + "work", + "office", + "write" + ], + "moji": "🗒" }, "notes": { "unicode": "1F3B6", "unicode_alternates": [], "name": "multiple musical notes", "shortname": ":notes:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "music", "score", "musical", - "music", "notes", - "music", "sound", - "melody" + "melody", + "instruments", + "symbol" ], "moji": "🎶" }, @@ -19120,7 +21378,10 @@ "aliases_ascii": [], "keywords": [ "handy", - "tools" + "tools", + "object", + "tool", + "nutcase" ], "moji": "🔩" }, @@ -19131,12 +21392,13 @@ ], "name": "heavy large circle", "shortname": ":o:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "circle", - "round" + "round", + "symbol" ], "moji": "â•" }, @@ -19145,13 +21407,14 @@ "unicode_alternates": [], "name": "negative squared latin capital letter o", "shortname": ":o2:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", "letter", - "red-square" + "red-square", + "symbol" ], "moji": "🅾" }, @@ -19168,13 +21431,29 @@ "water", "wave", "ocean", - "wave", "surf", "beach", - "tide" + "tide", + "weather", + "boat", + "tropical", + "swim" ], "moji": "🌊" }, + "octagonal_sign": { + "unicode": "1F6D1", + "unicode_alternates": [], + "name": "octagonal sign", + "shortname": ":octagonal_sign:", + "category": "symbols", + "aliases": [ + ":stop_sign:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🛑" + }, "octopus": { "unicode": "1F419", "unicode_alternates": [], @@ -19187,7 +21466,8 @@ "animal", "creature", "ocean", - "sea" + "sea", + "wildlife" ], "moji": "ðŸ™" }, @@ -19196,7 +21476,7 @@ "unicode_alternates": [], "name": "oden", "shortname": ":oden:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19214,13 +21494,14 @@ "unicode_alternates": [], "name": "office building", "shortname": ":office:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "building", "bureau", - "work" + "work", + "places" ], "moji": "ðŸ¢" }, @@ -19229,28 +21510,31 @@ "unicode_alternates": [], "name": "oil drum", "shortname": ":oil:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":oil_drum:" ], "aliases_ascii": [], "keywords": [ - "petroleum" - ] + "petroleum", + "object" + ], + "moji": "🛢" }, "ok": { "unicode": "1F197", "unicode_alternates": [], "name": "squared ok", "shortname": ":ok:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "agree", "blue-square", "good", - "yes" + "yes", + "symbol" ], "moji": "🆗" }, @@ -19259,7 +21543,7 @@ "unicode_alternates": [], "name": "ok hand sign", "shortname": ":ok_hand:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19273,13 +21557,19 @@ "marijuana", "joint", "pot", - "420" + "420", + "body", + "hands", + "hi", + "diversity", + "good", + "beautiful" ], "moji": "👌" }, "ok_hand_tone1": { "unicode": "1F44C-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ok hand sign tone 1", "shortname": ":ok_hand_tone1:", "category": "people", @@ -19296,11 +21586,12 @@ "joint", "pot", "420" - ] + ], + "moji": "👌ðŸ»" }, "ok_hand_tone2": { "unicode": "1F44C-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ok hand sign tone 2", "shortname": ":ok_hand_tone2:", "category": "people", @@ -19317,11 +21608,12 @@ "joint", "pot", "420" - ] + ], + "moji": "👌ðŸ¼" }, "ok_hand_tone3": { "unicode": "1F44C-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ok hand sign tone 3", "shortname": ":ok_hand_tone3:", "category": "people", @@ -19338,11 +21630,12 @@ "joint", "pot", "420" - ] + ], + "moji": "👌ðŸ½" }, "ok_hand_tone4": { "unicode": "1F44C-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ok hand sign tone 4", "shortname": ":ok_hand_tone4:", "category": "people", @@ -19359,11 +21652,12 @@ "joint", "pot", "420" - ] + ], + "moji": "👌ðŸ¾" }, "ok_hand_tone5": { "unicode": "1F44C-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "ok hand sign tone 5", "shortname": ":ok_hand_tone5:", "category": "people", @@ -19380,14 +21674,15 @@ "joint", "pot", "420" - ] + ], + "moji": "👌ðŸ¿" }, "ok_woman": { "unicode": "1F646", "unicode_alternates": [], "name": "face with ok gesture", "shortname": ":ok_woman:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ "*\\0/*", @@ -19404,13 +21699,15 @@ "yes", "ok", "okay", - "accept" + "accept", + "people", + "diversity" ], "moji": "🙆" }, "ok_woman_tone1": { "unicode": "1F646-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with ok gesture tone1", "shortname": ":ok_woman_tone1:", "category": "people", @@ -19425,11 +21722,12 @@ "yes", "okay", "accept" - ] + ], + "moji": "🙆ðŸ»" }, "ok_woman_tone2": { "unicode": "1F646-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with ok gesture tone2", "shortname": ":ok_woman_tone2:", "category": "people", @@ -19444,11 +21742,12 @@ "yes", "okay", "accept" - ] + ], + "moji": "🙆ðŸ¼" }, "ok_woman_tone3": { "unicode": "1F646-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with ok gesture tone3", "shortname": ":ok_woman_tone3:", "category": "people", @@ -19463,11 +21762,12 @@ "yes", "okay", "accept" - ] + ], + "moji": "🙆ðŸ½" }, "ok_woman_tone4": { "unicode": "1F646-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with ok gesture tone4", "shortname": ":ok_woman_tone4:", "category": "people", @@ -19482,11 +21782,12 @@ "yes", "okay", "accept" - ] + ], + "moji": "🙆ðŸ¾" }, "ok_woman_tone5": { "unicode": "1F646-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with ok gesture tone5", "shortname": ":ok_woman_tone5:", "category": "people", @@ -19501,26 +21802,30 @@ "yes", "okay", "accept" - ] + ], + "moji": "🙆ðŸ¿" }, "older_man": { "unicode": "1F474", "unicode_alternates": [], "name": "older man", "shortname": ":older_man:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "human", "male", - "men" + "men", + "people", + "old people", + "diversity" ], "moji": "👴" }, "older_man_tone1": { "unicode": "1F474-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older man tone 1", "shortname": ":older_man_tone1:", "category": "people", @@ -19531,11 +21836,12 @@ "men", "grandpa", "grandfather" - ] + ], + "moji": "👴ðŸ»" }, "older_man_tone2": { "unicode": "1F474-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older man tone 2", "shortname": ":older_man_tone2:", "category": "people", @@ -19546,11 +21852,12 @@ "men", "grandpa", "grandfather" - ] + ], + "moji": "👴ðŸ¼" }, "older_man_tone3": { "unicode": "1F474-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older man tone 3", "shortname": ":older_man_tone3:", "category": "people", @@ -19561,11 +21868,12 @@ "men", "grandpa", "grandfather" - ] + ], + "moji": "👴ðŸ½" }, "older_man_tone4": { "unicode": "1F474-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older man tone 4", "shortname": ":older_man_tone4:", "category": "people", @@ -19576,11 +21884,12 @@ "men", "grandpa", "grandfather" - ] + ], + "moji": "👴ðŸ¾" }, "older_man_tone5": { "unicode": "1F474-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older man tone 5", "shortname": ":older_man_tone5:", "category": "people", @@ -19591,14 +21900,15 @@ "men", "grandpa", "grandfather" - ] + ], + "moji": "👴ðŸ¿" }, "older_woman": { "unicode": "1F475", "unicode_alternates": [], "name": "older woman", "shortname": ":older_woman:", - "category": "emoticons", + "category": "people", "aliases": [ ":grandma:" ], @@ -19608,13 +21918,16 @@ "girl", "women", "grandma", - "grandmother" + "grandmother", + "people", + "old people", + "diversity" ], "moji": "👵" }, "older_woman_tone1": { "unicode": "1F475-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older woman tone 1", "shortname": ":older_woman_tone1:", "category": "people", @@ -19628,11 +21941,12 @@ "lady", "grandma", "grandmother" - ] + ], + "moji": "👵ðŸ»" }, "older_woman_tone2": { "unicode": "1F475-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older woman tone 2", "shortname": ":older_woman_tone2:", "category": "people", @@ -19646,11 +21960,12 @@ "lady", "grandma", "grandmother" - ] + ], + "moji": "👵ðŸ¼" }, "older_woman_tone3": { "unicode": "1F475-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older woman tone 3", "shortname": ":older_woman_tone3:", "category": "people", @@ -19664,11 +21979,12 @@ "lady", "grandma", "grandmother" - ] + ], + "moji": "👵ðŸ½" }, "older_woman_tone4": { "unicode": "1F475-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older woman tone 4", "shortname": ":older_woman_tone4:", "category": "people", @@ -19682,11 +21998,12 @@ "lady", "grandma", "grandmother" - ] + ], + "moji": "👵ðŸ¾" }, "older_woman_tone5": { "unicode": "1F475-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "older woman tone 5", "shortname": ":older_woman_tone5:", "category": "people", @@ -19700,14 +22017,15 @@ "lady", "grandma", "grandmother" - ] + ], + "moji": "👵ðŸ¿" }, "om_symbol": { "unicode": "1F549", "unicode_alternates": [], "name": "om symbol", "shortname": ":om_symbol:", - "category": "objects_symbols", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19718,20 +22036,24 @@ "dharmic", "buddhism", "jainism", - "meditate" - ] + "meditate", + "religion", + "symbol" + ], + "moji": "🕉" }, "on": { "unicode": "1F51B", "unicode_alternates": [], "name": "on with exclamation mark with left right arrow abo", "shortname": ":on:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "words" + "words", + "symbol" ], "moji": "🔛" }, @@ -19740,7 +22062,7 @@ "unicode_alternates": [], "name": "oncoming automobile", "shortname": ":oncoming_automobile:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19748,8 +22070,8 @@ "transportation", "vehicle", "sedan", - "car", - "automobile" + "automobile", + "travel" ], "moji": "🚘" }, @@ -19758,7 +22080,7 @@ "unicode_alternates": [], "name": "oncoming bus", "shortname": ":oncoming_bus:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19767,8 +22089,8 @@ "bus", "school", "city", - "transportation", - "public" + "public", + "travel" ], "moji": "ðŸš" }, @@ -19777,7 +22099,7 @@ "unicode_alternates": [], "name": "oncoming police car", "shortname": ":oncoming_police_car:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19791,7 +22113,9 @@ "citation", "crime", "help", - "officer" + "officer", + "transportation", + "911" ], "moji": "🚔" }, @@ -19800,7 +22124,7 @@ "unicode_alternates": [], "name": "oncoming taxi", "shortname": ":oncoming_taxi:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19812,7 +22136,9 @@ "automobile", "city", "transport", - "service" + "service", + "transportation", + "travel" ], "moji": "🚖" }, @@ -19822,15 +22148,18 @@ "unicode_alternates": [ "0031-FE0F-20E3" ], - "name": "digit one", + "name": "keycap digit one", "shortname": ":one:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "1", "blue-square", - "numbers" + "numbers", + "number", + "math", + "symbol" ] }, "open_file_folder": { @@ -19843,7 +22172,9 @@ "aliases_ascii": [], "keywords": [ "documents", - "load" + "load", + "work", + "office" ], "moji": "📂" }, @@ -19852,18 +22183,22 @@ "unicode_alternates": [], "name": "open hands sign", "shortname": ":open_hands:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "butterfly", - "fingers" + "fingers", + "body", + "hands", + "diversity", + "condolence" ], "moji": "ðŸ‘" }, "open_hands_tone1": { "unicode": "1F450-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "open hands sign tone 1", "shortname": ":open_hands_tone1:", "category": "people", @@ -19872,11 +22207,12 @@ "keywords": [ "butterfly", "fingers" - ] + ], + "moji": "ðŸ‘ðŸ»" }, "open_hands_tone2": { "unicode": "1F450-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "open hands sign tone 2", "shortname": ":open_hands_tone2:", "category": "people", @@ -19885,11 +22221,12 @@ "keywords": [ "butterfly", "fingers" - ] + ], + "moji": "ðŸ‘ðŸ¼" }, "open_hands_tone3": { "unicode": "1F450-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "open hands sign tone 3", "shortname": ":open_hands_tone3:", "category": "people", @@ -19898,11 +22235,12 @@ "keywords": [ "butterfly", "fingers" - ] + ], + "moji": "ðŸ‘ðŸ½" }, "open_hands_tone4": { "unicode": "1F450-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "open hands sign tone 4", "shortname": ":open_hands_tone4:", "category": "people", @@ -19911,11 +22249,12 @@ "keywords": [ "butterfly", "fingers" - ] + ], + "moji": "ðŸ‘ðŸ¾" }, "open_hands_tone5": { "unicode": "1F450-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "open hands sign tone 5", "shortname": ":open_hands_tone5:", "category": "people", @@ -19924,14 +22263,15 @@ "keywords": [ "butterfly", "fingers" - ] + ], + "moji": "ðŸ‘ðŸ¿" }, "open_mouth": { "unicode": "1F62E", "unicode_alternates": [], "name": "face with open mouth", "shortname": ":open_mouth:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":-O", @@ -19949,7 +22289,10 @@ "jaw", "gapping", "surprise", - "wow" + "wow", + "smiley", + "surprised", + "emotion" ], "moji": "😮" }, @@ -19958,7 +22301,7 @@ "unicode_alternates": [], "name": "ophiuchus", "shortname": ":ophiuchus:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -19972,28 +22315,11 @@ "zodiac", "purple-square", "sign", - "horoscope" + "horoscope", + "symbol" ], "moji": "⛎" }, - "optical_disk": { - "unicode": "1F5B8", - "unicode_alternates": [], - "name": "optical disc icon", - "shortname": ":optical_disk:", - "category": "objects_symbols", - "aliases": [ - ":optical_disc_icon:" - ], - "aliases_ascii": [], - "keywords": [ - "cd", - "dvd", - "disc", - "disk", - "technology" - ] - }, "orange_book": { "unicode": "1F4D9", "unicode_alternates": [], @@ -20005,13 +22331,17 @@ "keywords": [ "knowledge", "library", - "read" + "read", + "object", + "office", + "write", + "book" ], "moji": "📙" }, "orthodox_cross": { "unicode": "2626", - "unicode_alternates": "", + "unicode_alternates": [], "name": "orthodox cross", "shortname": ":orthodox_cross:", "category": "symbols", @@ -20021,7 +22351,8 @@ "christian", "religion", "symbol" - ] + ], + "moji": "☦" }, "outbox_tray": { "unicode": "1F4E4", @@ -20033,10 +22364,23 @@ "aliases_ascii": [], "keywords": [ "email", - "inbox" + "inbox", + "work", + "office" ], "moji": "📤" }, + "owl": { + "unicode": "1F989", + "unicode_alternates": [], + "name": "owl", + "shortname": ":owl:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦉" + }, "ox": { "unicode": "1F402", "unicode_alternates": [], @@ -20062,22 +22406,12 @@ "aliases_ascii": [], "keywords": [ "gift", - "mail" + "mail", + "object", + "office" ], "moji": "📦" }, - "page": { - "unicode": "1F5CF", - "unicode_alternates": [], - "name": "page", - "shortname": ":page:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "document" - ] - }, "page_facing_up": { "unicode": "1F4C4", "unicode_alternates": [], @@ -20087,7 +22421,10 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "documents" + "documents", + "work", + "office", + "write" ], "moji": "📄" }, @@ -20100,7 +22437,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "documents" + "documents", + "office", + "write" ], "moji": "📃" }, @@ -20114,28 +22453,18 @@ "aliases_ascii": [], "keywords": [ "bbcall", - "oldschool" + "oldschool", + "electronics", + "work" ], "moji": "📟" }, - "pages": { - "unicode": "1F5D0", - "unicode_alternates": [], - "name": "pages", - "shortname": ":pages:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "documents" - ] - }, "paintbrush": { "unicode": "1F58C", "unicode_alternates": [], "name": "lower left paintbrush", "shortname": ":paintbrush:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":lower_left_paintbrush:" ], @@ -20143,8 +22472,12 @@ "keywords": [ "brush", "art", - "painting" - ] + "painting", + "object", + "office", + "write" + ], + "moji": "🖌" }, "palm_tree": { "unicode": "1F334", @@ -20163,10 +22496,22 @@ "coconuts", "fronds", "warm", - "tropical" + "tropical", + "trees" ], "moji": "🌴" }, + "pancakes": { + "unicode": "1F95E", + "unicode_alternates": [], + "name": "pancakes", + "shortname": ":pancakes:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🥞" + }, "panda_face": { "unicode": "1F43C", "unicode_alternates": [], @@ -20189,7 +22534,9 @@ "bamboo", "china", "black", - "white" + "white", + "wildlife", + "roar" ], "moji": "ðŸ¼" }, @@ -20203,7 +22550,10 @@ "aliases_ascii": [], "keywords": [ "documents", - "stationery" + "stationery", + "object", + "work", + "office" ], "moji": "📎" }, @@ -20212,22 +22562,26 @@ "unicode_alternates": [], "name": "linked paperclips", "shortname": ":paperclips:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":linked_paperclips:" ], "aliases_ascii": [], "keywords": [ "documents", - "stationery" - ] + "stationery", + "object", + "work", + "office" + ], + "moji": "🖇" }, "park": { "unicode": "1F3DE", "unicode_alternates": [], "name": "national park", "shortname": ":park:", - "category": "travel_places", + "category": "travel", "aliases": [ ":national_park:" ], @@ -20238,8 +22592,13 @@ "wildlife", "forest", "wilderness", - "national" - ] + "national", + "travel", + "vacation", + "park", + "camp" + ], + "moji": "ðŸž" }, "parking": { "unicode": "1F17F", @@ -20248,14 +22607,15 @@ ], "name": "negative squared latin capital letter p", "shortname": ":parking:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", "blue-square", "cars", - "letter" + "letter", + "symbol" ], "moji": "🅿" }, @@ -20266,7 +22626,7 @@ ], "name": "part alternation mark", "shortname": ":part_alternation_mark:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20279,7 +22639,8 @@ "cue", "letter", "m", - "japanese" + "japanese", + "symbol" ], "moji": "〽" }, @@ -20297,7 +22658,9 @@ "cloud", "morning", "nature", - "weather" + "weather", + "sky", + "sun" ], "moji": "â›…" }, @@ -20306,7 +22669,7 @@ "unicode_alternates": [], "name": "passport control", "shortname": ":passport_control:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20317,13 +22680,14 @@ "travel", "control", "foreign", - "identification" + "identification", + "symbol" ], "moji": "🛂" }, "pause_button": { "unicode": "23F8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "double vertical bar", "shortname": ":pause_button:", "category": "symbols", @@ -20335,11 +22699,12 @@ "pause", "sound", "symbol" - ] + ], + "moji": "â¸" }, "peace": { "unicode": "262E", - "unicode_alternates": "", + "unicode_alternates": [], "name": "peace symbol", "shortname": ":peace:", "category": "symbols", @@ -20348,15 +22713,19 @@ ], "aliases_ascii": [], "keywords": [ - "sign" - ] + "sign", + "symbol", + "peace", + "drugs" + ], + "moji": "☮" }, "peach": { "unicode": "1F351", "unicode_alternates": [], "name": "peach", "shortname": ":peach:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20364,26 +22733,39 @@ "fruit", "nature", "peach", - "fruit", "juicy", - "pit" + "pit", + "butt" ], "moji": "ðŸ‘" }, + "peanuts": { + "unicode": "1F95C", + "unicode_alternates": [], + "name": "peanuts", + "shortname": ":peanuts:", + "category": "food", + "aliases": [ + ":shelled_peanut:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥜" + }, "pear": { "unicode": "1F350", "unicode_alternates": [], "name": "pear", "shortname": ":pear:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ "fruit", "nature", "pear", - "fruit", - "shape" + "shape", + "food" ], "moji": "ðŸ" }, @@ -20392,7 +22774,7 @@ "unicode_alternates": [], "name": "lower left ballpoint pen", "shortname": ":pen_ballpoint:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":lower_left_ballpoint_pen:" ], @@ -20400,15 +22782,18 @@ "keywords": [ "write", "bic", - "ink" - ] + "ink", + "object", + "office" + ], + "moji": "🖊" }, "pen_fountain": { "unicode": "1F58B", "unicode_alternates": [], "name": "lower left fountain pen", "shortname": ":pen_fountain:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":lower_left_fountain_pen:" ], @@ -20416,8 +22801,11 @@ "keywords": [ "write", "calligraphy", - "ink" - ] + "ink", + "object", + "office" + ], + "moji": "🖋" }, "pencil": { "unicode": "1F4DD", @@ -20433,7 +22821,9 @@ "documents", "paper", "station", - "write" + "write", + "work", + "office" ], "moji": "ðŸ“" }, @@ -20450,26 +22840,12 @@ "keywords": [ "paper", "stationery", - "write" + "write", + "object", + "office" ], "moji": "âœ" }, - "pencil3": { - "unicode": "1F589", - "unicode_alternates": [], - "name": "lower left pencil", - "shortname": ":pencil3:", - "category": "objects_symbols", - "aliases": [ - ":lower_left_pencil:" - ], - "aliases_ascii": [], - "keywords": [ - "paper", - "stationery", - "write" - ] - }, "penguin": { "unicode": "1F427", "unicode_alternates": [], @@ -20480,46 +22856,17 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" + "nature", + "wildlife" ], "moji": "ðŸ§" }, - "pennant_black": { - "unicode": "1F3F2", - "unicode_alternates": [], - "name": "black pennant", - "shortname": ":pennant_black:", - "category": "objects_symbols", - "aliases": [ - ":black_pennant:" - ], - "aliases_ascii": [], - "keywords": [ - "flag", - "athletics" - ] - }, - "pennant_white": { - "unicode": "1F3F1", - "unicode_alternates": [], - "name": "white pennant", - "shortname": ":pennant_white:", - "category": "objects_symbols", - "aliases": [ - ":white_pennant:" - ], - "aliases_ascii": [], - "keywords": [ - "flag", - "athletics" - ] - }, "pensive": { "unicode": "1F614", "unicode_alternates": [], "name": "pensive face", "shortname": ":pensive:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20532,7 +22879,10 @@ "reflective", "wistful", "meditate", - "serious" + "serious", + "smiley", + "emotion", + "rip" ], "moji": "😔" }, @@ -20541,7 +22891,7 @@ "unicode_alternates": [], "name": "performing arts", "shortname": ":performing_arts:", - "category": "places", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20552,10 +22902,11 @@ "arts", "performance", "entertainment", - "acting", "story", "mask", - "masks" + "masks", + "theatre", + "movie" ], "moji": "ðŸŽ" }, @@ -20564,7 +22915,7 @@ "unicode_alternates": [], "name": "persevering face", "shortname": ":persevere:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ">.<" @@ -20575,7 +22926,11 @@ "face", "no", "sick", - "upset" + "upset", + "sad", + "smiley", + "angry", + "emotion" ], "moji": "😣" }, @@ -20584,7 +22939,7 @@ "unicode_alternates": [], "name": "person frowning", "shortname": ":person_frowning:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20594,13 +22949,16 @@ "dejected", "rejected", "sad", - "frown" + "frown", + "people", + "women", + "diversity" ], "moji": "ðŸ™" }, "person_frowning_tone1": { "unicode": "1F64D-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person frowning tone 1", "shortname": ":person_frowning_tone1:", "category": "people", @@ -20614,11 +22972,12 @@ "rejected", "sad", "frown" - ] + ], + "moji": "ðŸ™ðŸ»" }, "person_frowning_tone2": { "unicode": "1F64D-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person frowning tone 2", "shortname": ":person_frowning_tone2:", "category": "people", @@ -20632,11 +22991,12 @@ "rejected", "sad", "frown" - ] + ], + "moji": "ðŸ™ðŸ¼" }, "person_frowning_tone3": { "unicode": "1F64D-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person frowning tone 3", "shortname": ":person_frowning_tone3:", "category": "people", @@ -20650,11 +23010,12 @@ "rejected", "sad", "frown" - ] + ], + "moji": "ðŸ™ðŸ½" }, "person_frowning_tone4": { "unicode": "1F64D-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person frowning tone 4", "shortname": ":person_frowning_tone4:", "category": "people", @@ -20668,11 +23029,12 @@ "rejected", "sad", "frown" - ] + ], + "moji": "ðŸ™ðŸ¾" }, "person_frowning_tone5": { "unicode": "1F64D-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person frowning tone 5", "shortname": ":person_frowning_tone5:", "category": "people", @@ -20686,14 +23048,15 @@ "rejected", "sad", "frown" - ] + ], + "moji": "ðŸ™ðŸ¿" }, "person_with_blond_hair": { "unicode": "1F471", "unicode_alternates": [], "name": "person with blond hair", "shortname": ":person_with_blond_hair:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20703,13 +23066,16 @@ "young", "western", "westerner", - "occidental" + "occidental", + "people", + "men", + "diversity" ], "moji": "👱" }, "person_with_blond_hair_tone1": { "unicode": "1F471-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with blond hair tone 1", "shortname": ":person_with_blond_hair_tone1:", "category": "people", @@ -20723,11 +23089,12 @@ "western", "westerner", "occidental" - ] + ], + "moji": "👱ðŸ»" }, "person_with_blond_hair_tone2": { "unicode": "1F471-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with blond hair tone 2", "shortname": ":person_with_blond_hair_tone2:", "category": "people", @@ -20741,11 +23108,12 @@ "western", "westerner", "occidental" - ] + ], + "moji": "👱ðŸ¼" }, "person_with_blond_hair_tone3": { "unicode": "1F471-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with blond hair tone 3", "shortname": ":person_with_blond_hair_tone3:", "category": "people", @@ -20759,11 +23127,12 @@ "western", "westerner", "occidental" - ] + ], + "moji": "👱ðŸ½" }, "person_with_blond_hair_tone4": { "unicode": "1F471-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with blond hair tone 4", "shortname": ":person_with_blond_hair_tone4:", "category": "people", @@ -20777,11 +23146,12 @@ "western", "westerner", "occidental" - ] + ], + "moji": "👱ðŸ¾" }, "person_with_blond_hair_tone5": { "unicode": "1F471-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with blond hair tone 5", "shortname": ":person_with_blond_hair_tone5:", "category": "people", @@ -20795,14 +23165,15 @@ "western", "westerner", "occidental" - ] + ], + "moji": "👱ðŸ¿" }, "person_with_pouting_face": { "unicode": "1F64E", "unicode_alternates": [], "name": "person with pouting face", "shortname": ":person_with_pouting_face:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -20812,13 +23183,16 @@ "pout", "sexy", "cute", - "annoyed" + "annoyed", + "people", + "women", + "diversity" ], "moji": "🙎" }, "person_with_pouting_face_tone1": { "unicode": "1F64E-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with pouting face tone1", "shortname": ":person_with_pouting_face_tone1:", "category": "people", @@ -20832,11 +23206,12 @@ "sexy", "cute", "annoyed" - ] + ], + "moji": "🙎ðŸ»" }, "person_with_pouting_face_tone2": { "unicode": "1F64E-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with pouting face tone2", "shortname": ":person_with_pouting_face_tone2:", "category": "people", @@ -20850,11 +23225,12 @@ "sexy", "cute", "annoyed" - ] + ], + "moji": "🙎ðŸ¼" }, "person_with_pouting_face_tone3": { "unicode": "1F64E-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with pouting face tone3", "shortname": ":person_with_pouting_face_tone3:", "category": "people", @@ -20868,11 +23244,12 @@ "sexy", "cute", "annoyed" - ] + ], + "moji": "🙎ðŸ½" }, "person_with_pouting_face_tone4": { "unicode": "1F64E-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with pouting face tone4", "shortname": ":person_with_pouting_face_tone4:", "category": "people", @@ -20886,11 +23263,12 @@ "sexy", "cute", "annoyed" - ] + ], + "moji": "🙎ðŸ¾" }, "person_with_pouting_face_tone5": { "unicode": "1F64E-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with pouting face tone5", "shortname": ":person_with_pouting_face_tone5:", "category": "people", @@ -20904,11 +23282,12 @@ "sexy", "cute", "annoyed" - ] + ], + "moji": "🙎ðŸ¿" }, "pick": { "unicode": "26CF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "pick", "shortname": ":pick:", "category": "objects", @@ -20917,8 +23296,10 @@ "keywords": [ "mining", "object", - "tool" - ] + "tool", + "weapon" + ], + "moji": "â›" }, "pig": { "unicode": "1F437", @@ -20976,7 +23357,6 @@ "food", "eat", "cute", - "oink", "pink", "smell", "truffle" @@ -20993,7 +23373,9 @@ "aliases_ascii": [], "keywords": [ "health", - "medicine" + "medicine", + "object", + "drugs" ], "moji": "💊" }, @@ -21002,7 +23384,7 @@ "unicode_alternates": [], "name": "pineapple", "shortname": ":pineapple:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21018,7 +23400,7 @@ }, "ping_pong": { "unicode": "1F3D3", - "unicode_alternates": "", + "unicode_alternates": [], "name": "table tennis paddle and ball", "shortname": ":ping_pong:", "category": "activity", @@ -21026,22 +23408,13 @@ ":table_tennis:" ], "aliases_ascii": [], - "keywords": [] - }, - "piracy": { - "unicode": "1F572", - "unicode_alternates": [], - "name": "no piracy", - "shortname": ":piracy:", - "category": "objects_symbols", - "aliases": [ - ":no_piracy:" - ], - "aliases_ascii": [], "keywords": [ - "theft", - "rule" - ] + "game", + "ball", + "sport", + "ping pong" + ], + "moji": "ðŸ“" }, "pisces": { "unicode": "2653", @@ -21050,7 +23423,7 @@ ], "name": "pisces", "shortname": ":pisces:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21063,9 +23436,8 @@ "zodiac", "sign", "purple-square", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♓" }, @@ -21074,7 +23446,7 @@ "unicode_alternates": [], "name": "slice of pizza", "shortname": ":pizza:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21086,13 +23458,14 @@ "italian", "italy", "slice", - "peperoni" + "peperoni", + "boys night" ], "moji": "ðŸ•" }, "place_of_worship": { "unicode": "1F6D0", - "unicode_alternates": "", + "unicode_alternates": [], "name": "place of worship", "shortname": ":place_of_worship:", "category": "symbols", @@ -21100,11 +23473,16 @@ ":worship_symbol:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "religion", + "symbol", + "pray" + ], + "moji": "ðŸ›" }, "play_pause": { "unicode": "23EF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "black right-pointing double triangle with double vertical bar", "shortname": ":play_pause:", "category": "symbols", @@ -21117,26 +23495,30 @@ "right", "sound", "symbol" - ] + ], + "moji": "â¯" }, "point_down": { "unicode": "1F447", "unicode_alternates": [], "name": "white down pointing backhand index", "shortname": ":point_down:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "direction", "fingers", - "hand" + "hand", + "body", + "hands", + "diversity" ], "moji": "👇" }, "point_down_tone1": { "unicode": "1F447-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white down pointing backhand index tone 1", "shortname": ":point_down_tone1:", "category": "people", @@ -21146,11 +23528,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👇ðŸ»" }, "point_down_tone2": { "unicode": "1F447-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white down pointing backhand index tone 2", "shortname": ":point_down_tone2:", "category": "people", @@ -21160,11 +23543,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👇ðŸ¼" }, "point_down_tone3": { "unicode": "1F447-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white down pointing backhand index tone 3", "shortname": ":point_down_tone3:", "category": "people", @@ -21174,11 +23558,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👇ðŸ½" }, "point_down_tone4": { "unicode": "1F447-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white down pointing backhand index tone 4", "shortname": ":point_down_tone4:", "category": "people", @@ -21188,11 +23573,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👇ðŸ¾" }, "point_down_tone5": { "unicode": "1F447-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white down pointing backhand index tone 5", "shortname": ":point_down_tone5:", "category": "people", @@ -21202,26 +23588,31 @@ "direction", "finger", "hand" - ] + ], + "moji": "👇ðŸ¿" }, "point_left": { "unicode": "1F448", "unicode_alternates": [], "name": "white left pointing backhand index", "shortname": ":point_left:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "direction", "fingers", - "hand" + "hand", + "body", + "hands", + "hi", + "diversity" ], "moji": "👈" }, "point_left_tone1": { "unicode": "1F448-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white left pointing backhand index tone 1", "shortname": ":point_left_tone1:", "category": "people", @@ -21231,11 +23622,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👈ðŸ»" }, "point_left_tone2": { "unicode": "1F448-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white left pointing backhand index tone 2", "shortname": ":point_left_tone2:", "category": "people", @@ -21245,11 +23637,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👈ðŸ¼" }, "point_left_tone3": { "unicode": "1F448-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white left pointing backhand index tone 3", "shortname": ":point_left_tone3:", "category": "people", @@ -21259,11 +23652,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👈ðŸ½" }, "point_left_tone4": { "unicode": "1F448-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white left pointing backhand index tone 4", "shortname": ":point_left_tone4:", "category": "people", @@ -21273,11 +23667,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👈ðŸ¾" }, "point_left_tone5": { "unicode": "1F448-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white left pointing backhand index tone 5", "shortname": ":point_left_tone5:", "category": "people", @@ -21287,26 +23682,31 @@ "direction", "finger", "hand" - ] + ], + "moji": "👈ðŸ¿" }, "point_right": { "unicode": "1F449", "unicode_alternates": [], "name": "white right pointing backhand index", "shortname": ":point_right:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "direction", "fingers", - "hand" + "hand", + "body", + "hands", + "hi", + "diversity" ], "moji": "👉" }, "point_right_tone1": { "unicode": "1F449-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white right pointing backhand index tone 1", "shortname": ":point_right_tone1:", "category": "people", @@ -21316,11 +23716,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👉ðŸ»" }, "point_right_tone2": { "unicode": "1F449-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white right pointing backhand index tone 2", "shortname": ":point_right_tone2:", "category": "people", @@ -21330,11 +23731,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👉ðŸ¼" }, "point_right_tone3": { "unicode": "1F449-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white right pointing backhand index tone 3", "shortname": ":point_right_tone3:", "category": "people", @@ -21344,11 +23746,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👉ðŸ½" }, "point_right_tone4": { "unicode": "1F449-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white right pointing backhand index tone 4", "shortname": ":point_right_tone4:", "category": "people", @@ -21358,11 +23761,12 @@ "direction", "finger", "hand" - ] + ], + "moji": "👉ðŸ¾" }, "point_right_tone5": { "unicode": "1F449-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white right pointing backhand index tone 5", "shortname": ":point_right_tone5:", "category": "people", @@ -21372,7 +23776,8 @@ "direction", "finger", "hand" - ] + ], + "moji": "👉ðŸ¿" }, "point_up": { "unicode": "261D", @@ -21381,13 +23786,17 @@ ], "name": "white up pointing index", "shortname": ":point_up:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "direction", "fingers", - "hand" + "hand", + "body", + "hands", + "emojione", + "diversity" ], "moji": "â˜" }, @@ -21396,19 +23805,22 @@ "unicode_alternates": [], "name": "white up pointing backhand index", "shortname": ":point_up_2:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "direction", "fingers", - "hand" + "hand", + "body", + "hands", + "diversity" ], "moji": "👆" }, "point_up_2_tone1": { "unicode": "1F446-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing backhand index tone 1", "shortname": ":point_up_2_tone1:", "category": "people", @@ -21419,11 +23831,12 @@ "finger", "hand", "one" - ] + ], + "moji": "👆ðŸ»" }, "point_up_2_tone2": { "unicode": "1F446-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing backhand index tone 2", "shortname": ":point_up_2_tone2:", "category": "people", @@ -21434,11 +23847,12 @@ "finger", "hand", "one" - ] + ], + "moji": "👆ðŸ¼" }, "point_up_2_tone3": { "unicode": "1F446-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing backhand index tone 3", "shortname": ":point_up_2_tone3:", "category": "people", @@ -21449,11 +23863,12 @@ "finger", "hand", "one" - ] + ], + "moji": "👆ðŸ½" }, "point_up_2_tone4": { "unicode": "1F446-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing backhand index tone 4", "shortname": ":point_up_2_tone4:", "category": "people", @@ -21464,11 +23879,12 @@ "finger", "hand", "one" - ] + ], + "moji": "👆ðŸ¾" }, "point_up_2_tone5": { "unicode": "1F446-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing backhand index tone 5", "shortname": ":point_up_2_tone5:", "category": "people", @@ -21479,11 +23895,12 @@ "finger", "hand", "one" - ] + ], + "moji": "👆ðŸ¿" }, "point_up_tone1": { "unicode": "261D-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing index tone 1", "shortname": ":point_up_tone1:", "category": "people", @@ -21494,11 +23911,12 @@ "finger", "hand", "one" - ] + ], + "moji": "â˜ðŸ»" }, "point_up_tone2": { "unicode": "261D-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing index tone 2", "shortname": ":point_up_tone2:", "category": "people", @@ -21509,11 +23927,12 @@ "finger", "hand", "one" - ] + ], + "moji": "â˜ðŸ¼" }, "point_up_tone3": { "unicode": "261D-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing index tone 3", "shortname": ":point_up_tone3:", "category": "people", @@ -21524,11 +23943,12 @@ "finger", "hand", "one" - ] + ], + "moji": "â˜ðŸ½" }, "point_up_tone4": { "unicode": "261D-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing index tone 4", "shortname": ":point_up_tone4:", "category": "people", @@ -21539,11 +23959,12 @@ "finger", "hand", "one" - ] + ], + "moji": "â˜ðŸ¾" }, "point_up_tone5": { "unicode": "261D-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white up pointing index tone 5", "shortname": ":point_up_tone5:", "category": "people", @@ -21554,14 +23975,15 @@ "finger", "hand", "one" - ] + ], + "moji": "â˜ðŸ¿" }, "police_car": { "unicode": "1F693", "unicode_alternates": [], "name": "police car", "shortname": ":police_car:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21577,7 +23999,8 @@ "citation", "crime", "help", - "officer" + "officer", + "911" ], "moji": "🚓" }, @@ -21595,7 +24018,6 @@ "dog", "nature", "poodle", - "dog", "clip", "showy", "sophisticated", @@ -21608,7 +24030,7 @@ "unicode_alternates": [], "name": "pile of poo", "shortname": ":poop:", - "category": "emoticons", + "category": "people", "aliases": [ ":shit:", ":hankey:", @@ -21620,32 +24042,41 @@ "shit", "shitface", "turd", - "poo" + "poo", + "bathroom", + "sol", + "diarrhea" ], "moji": "💩" }, "popcorn": { "unicode": "1F37F", - "unicode_alternates": "", + "unicode_alternates": [], "name": "popcorn", "shortname": ":popcorn:", - "category": "foods", + "category": "food", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "food", + "parties" + ], + "moji": "ðŸ¿" }, "post_office": { "unicode": "1F3E3", "unicode_alternates": [], "name": "japanese post office", "shortname": ":post_office:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "building", "communication", - "email" + "email", + "places", + "post office" ], "moji": "ðŸ£" }, @@ -21659,7 +24090,8 @@ "aliases_ascii": [], "keywords": [ "instrument", - "music" + "music", + "object" ], "moji": "📯" }, @@ -21674,7 +24106,8 @@ "keywords": [ "email", "envelope", - "letter" + "letter", + "object" ], "moji": "📮" }, @@ -21683,7 +24116,7 @@ "unicode_alternates": [], "name": "potable water symbol", "shortname": ":potable_water:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21699,27 +24132,40 @@ "clear", "clean", "aqua", - "h20" + "h20", + "symbol" ], "moji": "🚰" }, + "potato": { + "unicode": "1F954", + "unicode_alternates": [], + "name": "potato", + "shortname": ":potato:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🥔" + }, "pouch": { "unicode": "1F45D", "unicode_alternates": [], "name": "pouch", "shortname": ":pouch:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "accessories", "bag", "pouch", - "bag", "cosmetic", "packing", "grandma", - "makeup" + "makeup", + "women", + "fashion" ], "moji": "ðŸ‘" }, @@ -21728,7 +24174,7 @@ "unicode_alternates": [], "name": "poultry leg", "shortname": ":poultry_leg:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21737,7 +24183,8 @@ "poultry", "leg", "chicken", - "fried" + "fried", + "holidays" ], "moji": "ðŸ—" }, @@ -21759,13 +24206,9 @@ "uk", "pound", "britain", - "british", "banknote", - "money", - "currency", "paper", - "cash", - "bills" + "cash" ], "moji": "💷" }, @@ -21774,7 +24217,7 @@ "unicode_alternates": [], "name": "pouting cat face", "shortname": ":pouting_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21784,7 +24227,8 @@ "annoyed", "miffed", "glower", - "frown" + "frown", + "cat" ], "moji": "😾" }, @@ -21793,7 +24237,7 @@ "unicode_alternates": [], "name": "person with folded hands", "shortname": ":pray:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21807,13 +24251,19 @@ "hands", "sorrow", "regret", - "sorry" + "sorry", + "body", + "hi", + "luck", + "thank you", + "diversity", + "scientology" ], "moji": "ðŸ™" }, "pray_tone1": { "unicode": "1F64F-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with folded hands tone 1", "shortname": ":pray_tone1:", "category": "people", @@ -21830,11 +24280,12 @@ "sorrow", "regret", "sorry" - ] + ], + "moji": "ðŸ™ðŸ»" }, "pray_tone2": { "unicode": "1F64F-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with folded hands tone 2", "shortname": ":pray_tone2:", "category": "people", @@ -21851,11 +24302,12 @@ "sorrow", "regret", "sorry" - ] + ], + "moji": "ðŸ™ðŸ¼" }, "pray_tone3": { "unicode": "1F64F-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with folded hands tone 3", "shortname": ":pray_tone3:", "category": "people", @@ -21872,11 +24324,12 @@ "sorrow", "regret", "sorry" - ] + ], + "moji": "ðŸ™ðŸ½" }, "pray_tone4": { "unicode": "1F64F-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with folded hands tone 4", "shortname": ":pray_tone4:", "category": "people", @@ -21893,11 +24346,12 @@ "sorrow", "regret", "sorry" - ] + ], + "moji": "ðŸ™ðŸ¾" }, "pray_tone5": { "unicode": "1F64F-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person with folded hands tone 5", "shortname": ":pray_tone5:", "category": "people", @@ -21914,24 +24368,173 @@ "sorrow", "regret", "sorry" - ] + ], + "moji": "ðŸ™ðŸ¿" }, "prayer_beads": { "unicode": "1F4FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "prayer beads", "shortname": ":prayer_beads:", "category": "objects", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "object", + "rosary" + ], + "moji": "📿" + }, + "pregnant_woman": { + "unicode": "1F930", + "unicode_alternates": [], + "name": "pregnant woman", + "shortname": ":pregnant_woman:", + "category": "people", + "aliases": [ + ":expecting_woman:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰" + }, + "pregnant_woman_tone1": { + "unicode": "1F930-1F3FB", + "unicode_alternates": [], + "name": "pregnant woman tone 1", + "shortname": ":pregnant_woman_tone1:", + "category": "people", + "aliases": [ + ":expecting_woman_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰ðŸ»" + }, + "pregnant_woman_tone2": { + "unicode": "1F930-1F3FC", + "unicode_alternates": [], + "name": "pregnant woman tone 2", + "shortname": ":pregnant_woman_tone2:", + "category": "people", + "aliases": [ + ":expecting_woman_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰ðŸ¼" + }, + "pregnant_woman_tone3": { + "unicode": "1F930-1F3FD", + "unicode_alternates": [], + "name": "pregnant woman tone 3", + "shortname": ":pregnant_woman_tone3:", + "category": "people", + "aliases": [ + ":expecting_woman_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰ðŸ½" + }, + "pregnant_woman_tone4": { + "unicode": "1F930-1F3FE", + "unicode_alternates": [], + "name": "pregnant woman tone 4", + "shortname": ":pregnant_woman_tone4:", + "category": "people", + "aliases": [ + ":expecting_woman_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰ðŸ¾" + }, + "pregnant_woman_tone5": { + "unicode": "1F930-1F3FF", + "unicode_alternates": [], + "name": "pregnant woman tone 5", + "shortname": ":pregnant_woman_tone5:", + "category": "people", + "aliases": [ + ":expecting_woman_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤰ðŸ¿" + }, + "prince": { + "unicode": "1F934", + "unicode_alternates": [], + "name": "prince", + "shortname": ":prince:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴" + }, + "prince_tone1": { + "unicode": "1F934-1F3FB", + "unicode_alternates": [], + "name": "prince tone 1", + "shortname": ":prince_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴ðŸ»" + }, + "prince_tone2": { + "unicode": "1F934-1F3FC", + "unicode_alternates": [], + "name": "prince tone 2", + "shortname": ":prince_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴ðŸ¼" + }, + "prince_tone3": { + "unicode": "1F934-1F3FD", + "unicode_alternates": [], + "name": "prince tone 3", + "shortname": ":prince_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴ðŸ½" + }, + "prince_tone4": { + "unicode": "1F934-1F3FE", + "unicode_alternates": [], + "name": "prince tone 4", + "shortname": ":prince_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴ðŸ¾" + }, + "prince_tone5": { + "unicode": "1F934-1F3FF", + "unicode_alternates": [], + "name": "prince tone 5", + "shortname": ":prince_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤴ðŸ¿" }, "princess": { "unicode": "1F478", "unicode_alternates": [], "name": "princess", "shortname": ":princess:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -21947,13 +24550,18 @@ "queen", "daughter", "disney", - "high-maintenance" + "high-maintenance", + "people", + "women", + "diversity", + "beautiful", + "girls night" ], "moji": "👸" }, "princess_tone1": { "unicode": "1F478-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "princess tone 1", "shortname": ":princess_tone1:", "category": "people", @@ -21972,11 +24580,12 @@ "daughter", "disney", "high-maintenance" - ] + ], + "moji": "👸ðŸ»" }, "princess_tone2": { "unicode": "1F478-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "princess tone 2", "shortname": ":princess_tone2:", "category": "people", @@ -21995,11 +24604,12 @@ "daughter", "disney", "high-maintenance" - ] + ], + "moji": "👸ðŸ¼" }, "princess_tone3": { "unicode": "1F478-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "princess tone 3", "shortname": ":princess_tone3:", "category": "people", @@ -22018,11 +24628,12 @@ "daughter", "disney", "high-maintenance" - ] + ], + "moji": "👸ðŸ½" }, "princess_tone4": { "unicode": "1F478-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "princess tone 4", "shortname": ":princess_tone4:", "category": "people", @@ -22041,11 +24652,12 @@ "daughter", "disney", "high-maintenance" - ] + ], + "moji": "👸ðŸ¾" }, "princess_tone5": { "unicode": "1F478-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "princess tone 5", "shortname": ":princess_tone5:", "category": "people", @@ -22064,49 +24676,34 @@ "daughter", "disney", "high-maintenance" - ] + ], + "moji": "👸ðŸ¿" }, "printer": { "unicode": "1F5A8", "unicode_alternates": [], "name": "printer", "shortname": ":printer:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "hardcopy", "paper", "inkjet", - "laser" - ] - }, - "prohibited": { - "unicode": "1F6C7", - "unicode_alternates": [], - "name": "prohibited sign", - "shortname": ":prohibited:", - "category": "objects_symbols", - "aliases": [ - ":prohibited_sign:" + "laser", + "electronics", + "work", + "office" ], - "aliases_ascii": [], - "keywords": [ - "no", - "not", - "denied", - "disallow", - "forbid", - "limit", - "stop" - ] + "moji": "🖨" }, "projector": { "unicode": "1F4FD", "unicode_alternates": [], "name": "film projector", "shortname": ":projector:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":film_projector:" ], @@ -22117,26 +24714,35 @@ "motion", "picture", "8mm", - "16mm" - ] + "16mm", + "object", + "camera" + ], + "moji": "📽" }, "punch": { "unicode": "1F44A", "unicode_alternates": [], "name": "fisted hand sign", "shortname": ":punch:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "fist", - "hand" + "hand", + "body", + "hands", + "hi", + "fist bump", + "diversity", + "boys night" ], "moji": "👊" }, "punch_tone1": { "unicode": "1F44A-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "fisted hand sign tone 1", "shortname": ":punch_tone1:", "category": "people", @@ -22145,11 +24751,12 @@ "keywords": [ "fist", "punch" - ] + ], + "moji": "👊ðŸ»" }, "punch_tone2": { "unicode": "1F44A-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "fisted hand sign tone 2", "shortname": ":punch_tone2:", "category": "people", @@ -22158,11 +24765,12 @@ "keywords": [ "fist", "punch" - ] + ], + "moji": "👊ðŸ¼" }, "punch_tone3": { "unicode": "1F44A-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "fisted hand sign tone 3", "shortname": ":punch_tone3:", "category": "people", @@ -22171,11 +24779,12 @@ "keywords": [ "fist", "punch" - ] + ], + "moji": "👊ðŸ½" }, "punch_tone4": { "unicode": "1F44A-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "fisted hand sign tone 4", "shortname": ":punch_tone4:", "category": "people", @@ -22184,11 +24793,12 @@ "keywords": [ "fist", "punch" - ] + ], + "moji": "👊ðŸ¾" }, "punch_tone5": { "unicode": "1F44A-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "fisted hand sign tone 5", "shortname": ":punch_tone5:", "category": "people", @@ -22197,14 +24807,15 @@ "keywords": [ "fist", "punch" - ] + ], + "moji": "👊ðŸ¿" }, "purple_heart": { "unicode": "1F49C", "unicode_alternates": [], "name": "purple heart", "shortname": ":purple_heart:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22215,7 +24826,6 @@ "purple", "violet", "heart", - "love", "sensitive", "understanding", "compassionate", @@ -22224,7 +24834,8 @@ "honor", "royalty", "veteran", - "sacrifice" + "sacrifice", + "symbol" ], "moji": "💜" }, @@ -22233,7 +24844,7 @@ "unicode_alternates": [], "name": "purse", "shortname": ":purse:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22246,9 +24857,9 @@ "handbag", "coin bag", "accessory", - "money", "ladies", - "shopping" + "shopping", + "women" ], "moji": "👛" }, @@ -22261,28 +24872,18 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "stationery" + "stationery", + "object", + "office" ], "moji": "📌" }, - "pushpin_black": { - "unicode": "1F588", - "unicode_alternates": [], - "name": "black pushpin", - "shortname": ":pushpin_black:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "stationery" - ] - }, "put_litter_in_its_place": { "unicode": "1F6AE", "unicode_alternates": [], "name": "put litter in its place symbol", "shortname": ":put_litter_in_its_place:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22292,7 +24893,8 @@ "trash", "garbage", "receptacle", - "can" + "can", + "symbol" ], "moji": "🚮" }, @@ -22301,12 +24903,15 @@ "unicode_alternates": [], "name": "black question mark ornament", "shortname": ":question:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "confused", - "doubt" + "doubt", + "symbol", + "punctuation", + "wth" ], "moji": "â“" }, @@ -22320,7 +24925,8 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" + "nature", + "wildlife" ], "moji": "ðŸ°" }, @@ -22339,7 +24945,8 @@ "bunny", "easter", "reproduction", - "prolific" + "prolific", + "wildlife" ], "moji": "ðŸ‡" }, @@ -22348,7 +24955,7 @@ "unicode_alternates": [], "name": "racing car", "shortname": ":race_car:", - "category": "activity", + "category": "travel", "aliases": [ ":racing_car:" ], @@ -22359,8 +24966,11 @@ "stock", "nascar", "speed", - "drive" - ] + "drive", + "transportation", + "car" + ], + "moji": "ðŸŽ" }, "racehorse": { "unicode": "1F40E", @@ -22391,7 +25001,8 @@ "gelding", "yearling", "thoroughbred", - "pony" + "pony", + "wildlife" ], "moji": "ðŸŽ" }, @@ -22407,7 +25018,8 @@ "communication", "music", "podcast", - "program" + "program", + "electronics" ], "moji": "📻" }, @@ -22416,17 +25028,19 @@ "unicode_alternates": [], "name": "radio button", "shortname": ":radio_button:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "input" + "input", + "symbol", + "circle" ], "moji": "🔘" }, "radioactive": { "unicode": "2622", - "unicode_alternates": "", + "unicode_alternates": [], "name": "radioactive sign", "shortname": ":radioactive:", "category": "symbols", @@ -22435,15 +25049,17 @@ ], "aliases_ascii": [], "keywords": [ - "symbol" - ] + "symbol", + "science" + ], + "moji": "☢" }, "rage": { "unicode": "1F621", "unicode_alternates": [], "name": "pouting face", "shortname": ":rage:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22454,7 +25070,9 @@ "pout", "anger", "rage", - "irate" + "irate", + "smiley", + "emotion" ], "moji": "😡" }, @@ -22463,7 +25081,7 @@ "unicode_alternates": [], "name": "railway car", "shortname": ":railway_car:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22473,7 +25091,8 @@ "rail", "car", "coach", - "train" + "train", + "travel" ], "moji": "🚃" }, @@ -22482,7 +25101,7 @@ "unicode_alternates": [], "name": "railway track", "shortname": ":railway_track:", - "category": "travel_places", + "category": "travel", "aliases": [ ":railroad_track:" ], @@ -22492,15 +25111,18 @@ "trolley", "subway", "locomotive", - "transit" - ] + "transit", + "travel", + "vacation" + ], + "moji": "🛤" }, "rainbow": { "unicode": "1F308", "unicode_alternates": [], "name": "rainbow", "shortname": ":rainbow:", - "category": "nature", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22516,28 +25138,114 @@ "spectrum", "refract", "leprechaun", - "gold" + "gold", + "weather", + "gay", + "rain" ], "moji": "🌈" }, + "raised_back_of_hand": { + "unicode": "1F91A", + "unicode_alternates": [], + "name": "raised back of hand", + "shortname": ":raised_back_of_hand:", + "category": "people", + "aliases": [ + ":back_of_hand:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚" + }, + "raised_back_of_hand_tone1": { + "unicode": "1F91A-1F3FB", + "unicode_alternates": [], + "name": "raised back of hand tone 1", + "shortname": ":raised_back_of_hand_tone1:", + "category": "people", + "aliases": [ + ":back_of_hand_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚ðŸ»" + }, + "raised_back_of_hand_tone2": { + "unicode": "1F91A-1F3FC", + "unicode_alternates": [], + "name": "raised back of hand tone 2", + "shortname": ":raised_back_of_hand_tone2:", + "category": "people", + "aliases": [ + ":back_of_hand_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚ðŸ¼" + }, + "raised_back_of_hand_tone3": { + "unicode": "1F91A-1F3FD", + "unicode_alternates": [], + "name": "raised back of hand tone 3", + "shortname": ":raised_back_of_hand_tone3:", + "category": "people", + "aliases": [ + ":back_of_hand_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚ðŸ½" + }, + "raised_back_of_hand_tone4": { + "unicode": "1F91A-1F3FE", + "unicode_alternates": [], + "name": "raised back of hand tone 4", + "shortname": ":raised_back_of_hand_tone4:", + "category": "people", + "aliases": [ + ":back_of_hand_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚ðŸ¾" + }, + "raised_back_of_hand_tone5": { + "unicode": "1F91A-1F3FF", + "unicode_alternates": [], + "name": "raised back of hand tone 5", + "shortname": ":raised_back_of_hand_tone5:", + "category": "people", + "aliases": [ + ":back_of_hand_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤚ðŸ¿" + }, "raised_hand": { "unicode": "270B", "unicode_alternates": [], "name": "raised hand", "shortname": ":raised_hand:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "female", "girl", - "woman" + "woman", + "body", + "hands", + "hi", + "diversity", + "girls night" ], "moji": "✋" }, "raised_hand_tone1": { "unicode": "270B-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand tone 1", "shortname": ":raised_hand_tone1:", "category": "people", @@ -22547,11 +25255,12 @@ "female", "girl", "woman" - ] + ], + "moji": "✋ðŸ»" }, "raised_hand_tone2": { "unicode": "270B-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand tone 2", "shortname": ":raised_hand_tone2:", "category": "people", @@ -22561,11 +25270,12 @@ "female", "girl", "woman" - ] + ], + "moji": "✋ðŸ¼" }, "raised_hand_tone3": { "unicode": "270B-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand tone 3", "shortname": ":raised_hand_tone3:", "category": "people", @@ -22575,11 +25285,12 @@ "female", "girl", "woman" - ] + ], + "moji": "✋ðŸ½" }, "raised_hand_tone4": { "unicode": "270B-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand tone 4", "shortname": ":raised_hand_tone4:", "category": "people", @@ -22589,11 +25300,12 @@ "female", "girl", "woman" - ] + ], + "moji": "✋ðŸ¾" }, "raised_hand_tone5": { "unicode": "270B-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand tone 5", "shortname": ":raised_hand_tone5:", "category": "people", @@ -22603,14 +25315,15 @@ "female", "girl", "woman" - ] + ], + "moji": "✋ðŸ¿" }, "raised_hands": { "unicode": "1F64C", "unicode_alternates": [], "name": "person raising both hands in celebration", "shortname": ":raised_hands:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22619,13 +25332,19 @@ "winning", "woot", "yay", - "banzai" + "banzai", + "body", + "hands", + "diversity", + "perfect", + "good", + "parties" ], "moji": "🙌" }, "raised_hands_tone1": { "unicode": "1F64C-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person raising both hands in celebration tone 1", "shortname": ":raised_hands_tone1:", "category": "people", @@ -22639,11 +25358,12 @@ "yay", "banzai", "raised" - ] + ], + "moji": "🙌ðŸ»" }, "raised_hands_tone2": { "unicode": "1F64C-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person raising both hands in celebration tone 2", "shortname": ":raised_hands_tone2:", "category": "people", @@ -22657,11 +25377,12 @@ "yay", "banzai", "raised" - ] + ], + "moji": "🙌ðŸ¼" }, "raised_hands_tone3": { "unicode": "1F64C-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person raising both hands in celebration tone 3", "shortname": ":raised_hands_tone3:", "category": "people", @@ -22675,11 +25396,12 @@ "yay", "banzai", "raised" - ] + ], + "moji": "🙌ðŸ½" }, "raised_hands_tone4": { "unicode": "1F64C-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person raising both hands in celebration tone 4", "shortname": ":raised_hands_tone4:", "category": "people", @@ -22693,11 +25415,12 @@ "yay", "banzai", "raised" - ] + ], + "moji": "🙌ðŸ¾" }, "raised_hands_tone5": { "unicode": "1F64C-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "person raising both hands in celebration tone 5", "shortname": ":raised_hands_tone5:", "category": "people", @@ -22711,14 +25434,15 @@ "yay", "banzai", "raised" - ] + ], + "moji": "🙌ðŸ¿" }, "raising_hand": { "unicode": "1F64B", "unicode_alternates": [], "name": "happy person raising one hand", "shortname": ":raising_hand:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22729,13 +25453,16 @@ "raise", "notice", "attention", - "answer" + "answer", + "people", + "women", + "diversity" ], "moji": "🙋" }, "raising_hand_tone1": { "unicode": "1F64B-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "happy person raising one hand tone1", "shortname": ":raising_hand_tone1:", "category": "people", @@ -22749,11 +25476,12 @@ "notice", "attention", "answer" - ] + ], + "moji": "🙋ðŸ»" }, "raising_hand_tone2": { "unicode": "1F64B-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "happy person raising one hand tone2", "shortname": ":raising_hand_tone2:", "category": "people", @@ -22767,11 +25495,12 @@ "notice", "attention", "answer" - ] + ], + "moji": "🙋ðŸ¼" }, "raising_hand_tone3": { "unicode": "1F64B-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "happy person raising one hand tone3", "shortname": ":raising_hand_tone3:", "category": "people", @@ -22785,11 +25514,12 @@ "notice", "attention", "answer" - ] + ], + "moji": "🙋ðŸ½" }, "raising_hand_tone4": { "unicode": "1F64B-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "happy person raising one hand tone4", "shortname": ":raising_hand_tone4:", "category": "people", @@ -22803,11 +25533,12 @@ "notice", "attention", "answer" - ] + ], + "moji": "🙋ðŸ¾" }, "raising_hand_tone5": { "unicode": "1F64B-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "happy person raising one hand tone5", "shortname": ":raising_hand_tone5:", "category": "people", @@ -22821,7 +25552,8 @@ "notice", "attention", "answer" - ] + ], + "moji": "🙋ðŸ¿" }, "ram": { "unicode": "1F40F", @@ -22836,10 +25568,10 @@ "nature", "sheep", "ram", - "sheep", "male", "horn", - "horns" + "horns", + "wildlife" ], "moji": "ðŸ" }, @@ -22848,7 +25580,7 @@ "unicode_alternates": [], "name": "steaming bowl", "shortname": ":ramen:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22860,7 +25592,8 @@ "noodles", "bowl", "steaming", - "soup" + "soup", + "japan" ], "moji": "ðŸœ" }, @@ -22884,7 +25617,7 @@ }, "record_button": { "unicode": "23FA", - "unicode_alternates": "", + "unicode_alternates": [], "name": "black circle for record", "shortname": ":record_button:", "category": "symbols", @@ -22892,8 +25625,10 @@ "aliases_ascii": [], "keywords": [ "sound", - "symbol" - ] + "symbol", + "circle" + ], + "moji": "âº" }, "recycle": { "unicode": "267B", @@ -22902,14 +25637,15 @@ ], "name": "black universal recycling symbol", "shortname": ":recycle:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", "environment", "garbage", - "trash" + "trash", + "symbol" ], "moji": "â™»" }, @@ -22918,12 +25654,14 @@ "unicode_alternates": [], "name": "automobile", "shortname": ":red_car:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "transportation", - "vehicle" + "vehicle", + "car", + "travel" ], "moji": "🚗" }, @@ -22932,11 +25670,14 @@ "unicode_alternates": [], "name": "large red circle", "shortname": ":red_circle:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "circle" ], "moji": "🔴" }, @@ -22946,12 +25687,13 @@ "unicode_alternates": [], "name": "registered sign", "shortname": ":registered:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "alphabet", - "circle" + "circle", + "symbol" ] }, "relaxed": { @@ -22961,7 +25703,7 @@ ], "name": "white smiling face", "shortname": ":relaxed:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22969,7 +25711,9 @@ "face", "happiness", "massage", - "smile" + "smile", + "happy", + "smiley" ], "moji": "☺" }, @@ -22978,7 +25722,7 @@ "unicode_alternates": [], "name": "relieved face", "shortname": ":relieved:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -22989,8 +25733,9 @@ "relaxed", "relieved", "satisfied", - "phew", - "relief" + "relief", + "smiley", + "emotion" ], "moji": "😌" }, @@ -22999,24 +25744,28 @@ "unicode_alternates": [], "name": "reminder ribbon", "shortname": ":reminder_ribbon:", - "category": "celebration", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ - "awareness" - ] + "awareness", + "award" + ], + "moji": "🎗" }, "repeat": { "unicode": "1F501", "unicode_alternates": [], "name": "clockwise rightwards and leftwards open circle arr", "shortname": ":repeat:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "loop", - "record" + "record", + "arrow", + "symbol" ], "moji": "ðŸ”" }, @@ -23025,12 +25774,14 @@ "unicode_alternates": [], "name": "clockwise rightwards and leftwards open circle arr", "shortname": ":repeat_one:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "loop" + "loop", + "arrow", + "symbol" ], "moji": "🔂" }, @@ -23039,7 +25790,7 @@ "unicode_alternates": [], "name": "restroom", "shortname": ":restroom:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23051,7 +25802,8 @@ "restroom", "sign", "shared", - "toilet" + "toilet", + "symbol" ], "moji": "🚻" }, @@ -23060,7 +25812,7 @@ "unicode_alternates": [], "name": "revolving hearts", "shortname": ":revolving_hearts:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23074,7 +25826,8 @@ "moving", "circle", "multiple", - "lovers" + "lovers", + "symbol" ], "moji": "💞" }, @@ -23083,21 +25836,36 @@ "unicode_alternates": [], "name": "black left-pointing double triangle", "shortname": ":rewind:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "play" + "play", + "arrow", + "symbol" ], "moji": "âª" }, + "rhino": { + "unicode": "1F98F", + "unicode_alternates": [], + "name": "rhinoceros", + "shortname": ":rhino:", + "category": "nature", + "aliases": [ + ":rhinoceros:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¦" + }, "ribbon": { "unicode": "1F380", "unicode_alternates": [], "name": "ribbon", "shortname": ":ribbon:", - "category": "emoticons", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23108,7 +25876,10 @@ "ribbon", "lace", "wrap", - "decorate" + "decorate", + "object", + "gift", + "birthday" ], "moji": "🎀" }, @@ -23117,7 +25888,7 @@ "unicode_alternates": [], "name": "cooked rice", "shortname": ":rice:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23125,8 +25896,9 @@ "rice", "white", "grain", - "food", - "bowl" + "bowl", + "sushi", + "japan" ], "moji": "ðŸš" }, @@ -23135,7 +25907,7 @@ "unicode_alternates": [], "name": "rice ball", "shortname": ":rice_ball:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23146,7 +25918,8 @@ "white", "nori", "seaweed", - "japanese" + "sushi", + "japan" ], "moji": "ðŸ™" }, @@ -23155,7 +25928,7 @@ "unicode_alternates": [], "name": "rice cracker", "shortname": ":rice_cracker:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23164,8 +25937,7 @@ "rice", "cracker", "seaweed", - "food", - "japanese" + "sushi" ], "moji": "ðŸ˜" }, @@ -23174,7 +25946,7 @@ "unicode_alternates": [], "name": "moon viewing ceremony", "shortname": ":rice_scene:", - "category": "objects", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23187,92 +25959,115 @@ "rice", "scene", "festival", - "autumn" + "autumn", + "places", + "space", + "sky", + "travel" ], "moji": "🎑" }, - "right_speaker": { - "unicode": "1F568", + "right_facing_fist": { + "unicode": "1F91C", "unicode_alternates": [], - "name": "right speaker", - "shortname": ":right_speaker:", - "category": "objects_symbols", - "aliases": [], + "name": "right-facing fist", + "shortname": ":right_facing_fist:", + "category": "people", + "aliases": [ + ":right_fist:" + ], "aliases_ascii": [], - "keywords": [ - "sound", - "listen", - "hear", - "noise", - "volume" - ] + "keywords": [], + "moji": "🤜" }, - "right_speaker_one": { - "unicode": "1F569", + "right_facing_fist_tone1": { + "unicode": "1F91C-1F3FB", "unicode_alternates": [], - "name": "right speaker with one sound wave", - "shortname": ":right_speaker_one:", - "category": "objects_symbols", + "name": "right facing fist tone 1", + "shortname": ":right_facing_fist_tone1:", + "category": "people", "aliases": [ - ":right_speaker_with_one_sound_wave:" + ":right_fist_tone1:" ], "aliases_ascii": [], - "keywords": [ - "low", - "volume" - ] + "keywords": [], + "moji": "🤜ðŸ»" }, - "right_speaker_three": { - "unicode": "1F56A", + "right_facing_fist_tone2": { + "unicode": "1F91C-1F3FC", "unicode_alternates": [], - "name": "right speaker with three sound waves", - "shortname": ":right_speaker_three:", - "category": "objects_symbols", + "name": "right facing fist tone 2", + "shortname": ":right_facing_fist_tone2:", + "category": "people", "aliases": [ - ":right_speaker_with_three_sound_waves:" + ":right_fist_tone2:" ], "aliases_ascii": [], - "keywords": [ - "loud", - "high", - "volume" - ] + "keywords": [], + "moji": "🤜ðŸ¼" + }, + "right_facing_fist_tone3": { + "unicode": "1F91C-1F3FD", + "unicode_alternates": [], + "name": "right facing fist tone 3", + "shortname": ":right_facing_fist_tone3:", + "category": "people", + "aliases": [ + ":right_fist_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜ðŸ½" + }, + "right_facing_fist_tone4": { + "unicode": "1F91C-1F3FE", + "unicode_alternates": [], + "name": "right facing fist tone 4", + "shortname": ":right_facing_fist_tone4:", + "category": "people", + "aliases": [ + ":right_fist_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜ðŸ¾" + }, + "right_facing_fist_tone5": { + "unicode": "1F91C-1F3FF", + "unicode_alternates": [], + "name": "right facing fist tone 5", + "shortname": ":right_facing_fist_tone5:", + "category": "people", + "aliases": [ + ":right_fist_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤜ðŸ¿" }, "ring": { "unicode": "1F48D", "unicode_alternates": [], "name": "ring", "shortname": ":ring:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "marriage", "propose", "valentines", - "wedding" + "wedding", + "object", + "fashion", + "gem", + "accessories" ], "moji": "ðŸ’" }, - "ringing_bell": { - "unicode": "1F56D", - "unicode_alternates": [], - "name": "ringing bell", - "shortname": ":ringing_bell:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "alert", - "ding", - "volume", - "sound", - "chime" - ] - }, "robot": { "unicode": "1F916", - "unicode_alternates": "", + "unicode_alternates": [], "name": "robot face", "shortname": ":robot:", "category": "people", @@ -23280,14 +26075,18 @@ ":robot_face:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "monster", + "robot" + ], + "moji": "🤖" }, "rocket": { "unicode": "1F680", "unicode_alternates": [], "name": "rocket", "shortname": ":rocket:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23298,16 +26097,33 @@ "space", "spacecraft", "astronaut", - "cosmonaut" + "cosmonaut", + "transportation", + "object", + "fly", + "blast" ], "moji": "🚀" }, + "rofl": { + "unicode": "1F923", + "unicode_alternates": [], + "name": "rolling on the floor laughing", + "shortname": ":rofl:", + "category": "people", + "aliases": [ + ":rolling_on_the_floor_laughing:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤣" + }, "roller_coaster": { "unicode": "1F3A2", "unicode_alternates": [], "name": "roller coaster", "shortname": ":roller_coaster:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23322,13 +26138,16 @@ "park", "fair", "ride", - "entertainment" + "entertainment", + "places", + "vacation", + "roller coaster" ], "moji": "🎢" }, "rolling_eyes": { "unicode": "1F644", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with rolling eyes", "shortname": ":rolling_eyes:", "category": "people", @@ -23336,7 +26155,14 @@ ":face_with_rolling_eyes:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "mad", + "smiley", + "rolling eyes", + "emotion", + "sarcastic" + ], + "moji": "🙄" }, "rooster": { "unicode": "1F413", @@ -23375,9 +26201,13 @@ "fragrant", "flower", "thorns", - "love", "petals", - "romance" + "romance", + "nature", + "plant", + "rip", + "condolence", + "beautiful" ], "moji": "🌹" }, @@ -23386,31 +26216,21 @@ "unicode_alternates": [], "name": "rosette", "shortname": ":rosette:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "flower" - ] - }, - "rosette_black": { - "unicode": "1F3F6", - "unicode_alternates": [], - "name": "black rosette", - "shortname": ":rosette_black:", - "category": "objects_symbols", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ - "flower" - ] + "flower", + "tropical" + ], + "moji": "ðŸµ" }, "rotating_light": { "unicode": "1F6A8", "unicode_alternates": [], "name": "police cars revolving light", "shortname": ":rotating_light:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23419,8 +26239,8 @@ "emergency", "police", "light", - "police", - "emergency" + "transportation", + "object" ], "moji": "🚨" }, @@ -23429,11 +26249,13 @@ "unicode_alternates": [], "name": "round pushpin", "shortname": ":round_pushpin:", - "category": "places", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ - "stationery" + "stationery", + "object", + "office" ], "moji": "ðŸ“" }, @@ -23442,7 +26264,7 @@ "unicode_alternates": [], "name": "rowboat", "shortname": ":rowboat:", - "category": "places", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23453,13 +26275,18 @@ "boat", "row", "oar", - "paddle" + "paddle", + "men", + "workout", + "sport", + "rowing", + "diversity" ], "moji": "🚣" }, "rowboat_tone1": { "unicode": "1F6A3-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "rowboat tone 1", "shortname": ":rowboat_tone1:", "category": "activity", @@ -23473,11 +26300,12 @@ "row", "oar", "paddle" - ] + ], + "moji": "🚣ðŸ»" }, "rowboat_tone2": { "unicode": "1F6A3-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "rowboat tone 2", "shortname": ":rowboat_tone2:", "category": "activity", @@ -23491,11 +26319,12 @@ "row", "oar", "paddle" - ] + ], + "moji": "🚣ðŸ¼" }, "rowboat_tone3": { "unicode": "1F6A3-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "rowboat tone 3", "shortname": ":rowboat_tone3:", "category": "activity", @@ -23509,11 +26338,12 @@ "row", "oar", "paddle" - ] + ], + "moji": "🚣ðŸ½" }, "rowboat_tone4": { "unicode": "1F6A3-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "rowboat tone 4", "shortname": ":rowboat_tone4:", "category": "activity", @@ -23527,11 +26357,12 @@ "row", "oar", "paddle" - ] + ], + "moji": "🚣ðŸ¾" }, "rowboat_tone5": { "unicode": "1F6A3-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "rowboat tone 5", "shortname": ":rowboat_tone5:", "category": "activity", @@ -23545,14 +26376,15 @@ "row", "oar", "paddle" - ] + ], + "moji": "🚣ðŸ¿" }, "rugby_football": { "unicode": "1F3C9", "unicode_alternates": [], "name": "rugby football", "shortname": ":rugby_football:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23562,7 +26394,8 @@ "ball", "sport", "team", - "england" + "england", + "game" ], "moji": "ðŸ‰" }, @@ -23571,7 +26404,7 @@ "unicode_alternates": [], "name": "runner", "shortname": ":runner:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23581,16 +26414,19 @@ "run", "runner", "jog", - "exercise", "sprint", "race", - "dash" + "dash", + "people", + "men", + "diversity", + "boys night" ], "moji": "ðŸƒ" }, "runner_tone1": { "unicode": "1F3C3-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "runner tone 1", "shortname": ":runner_tone1:", "category": "people", @@ -23605,11 +26441,12 @@ "race", "dash", "marathon" - ] + ], + "moji": "ðŸƒðŸ»" }, "runner_tone2": { "unicode": "1F3C3-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "runner tone 2", "shortname": ":runner_tone2:", "category": "people", @@ -23624,11 +26461,12 @@ "race", "dash", "marathon" - ] + ], + "moji": "ðŸƒðŸ¼" }, "runner_tone3": { "unicode": "1F3C3-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "runner tone 3", "shortname": ":runner_tone3:", "category": "people", @@ -23643,11 +26481,12 @@ "race", "dash", "marathon" - ] + ], + "moji": "ðŸƒðŸ½" }, "runner_tone4": { "unicode": "1F3C3-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "runner tone 4", "shortname": ":runner_tone4:", "category": "people", @@ -23662,11 +26501,12 @@ "race", "dash", "marathon" - ] + ], + "moji": "ðŸƒðŸ¾" }, "runner_tone5": { "unicode": "1F3C3-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "runner tone 5", "shortname": ":runner_tone5:", "category": "people", @@ -23681,14 +26521,15 @@ "race", "dash", "marathon" - ] + ], + "moji": "ðŸƒðŸ¿" }, "running_shirt_with_sash": { "unicode": "1F3BD", "unicode_alternates": [], "name": "running shirt with sash", "shortname": ":running_shirt_with_sash:", - "category": "emoticons", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23699,13 +26540,14 @@ "shirt", "cloths", "compete", - "sports" + "sports", + "award" ], "moji": "🎽" }, "sa": { "unicode": "1F202", - "unicode_alternates": "", + "unicode_alternates": [], "name": "squared katakana sa", "shortname": ":sa:", "category": "symbols", @@ -23716,7 +26558,8 @@ "japanese", "symbol", "word" - ] + ], + "moji": "🈂" }, "sagittarius": { "unicode": "2650", @@ -23725,7 +26568,7 @@ ], "name": "sagittarius", "shortname": ":sagittarius:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23738,9 +26581,8 @@ "stars", "zodiac", "sign", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "â™" }, @@ -23751,12 +26593,15 @@ ], "name": "sailboat", "shortname": ":sailboat:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "ship", - "transportation" + "transportation", + "travel", + "boat", + "vacation" ], "moji": "⛵" }, @@ -23765,7 +26610,7 @@ "unicode_alternates": [], "name": "sake bottle and cup", "shortname": ":sake:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23774,26 +26619,41 @@ "drunk", "wine", "sake", - "wine", "rice", "ferment", "alcohol", "japanese", - "drink" + "japan", + "girls night" ], "moji": "ðŸ¶" }, + "salad": { + "unicode": "1F957", + "unicode_alternates": [], + "name": "green salad", + "shortname": ":salad:", + "category": "food", + "aliases": [ + ":green_salad:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥗" + }, "sandal": { "unicode": "1F461", "unicode_alternates": [], "name": "womans sandal", "shortname": ":sandal:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "fashion", - "shoes" + "shoes", + "shoe", + "accessories" ], "moji": "👡" }, @@ -23802,7 +26662,7 @@ "unicode_alternates": [], "name": "father christmas", "shortname": ":santa:", - "category": "objects", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23823,14 +26683,18 @@ "nice", "sleigh", "father", - "christmas", - "holiday" + "holiday", + "people", + "hat", + "winter", + "holidays", + "diversity" ], "moji": "🎅" }, "santa_tone1": { "unicode": "1F385-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "father christmas tone 1", "shortname": ":santa_tone1:", "category": "people", @@ -23852,11 +26716,12 @@ "nice", "sleigh", "holiday" - ] + ], + "moji": "🎅ðŸ»" }, "santa_tone2": { "unicode": "1F385-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "father christmas tone 2", "shortname": ":santa_tone2:", "category": "people", @@ -23878,11 +26743,12 @@ "nice", "sleigh", "holiday" - ] + ], + "moji": "🎅ðŸ¼" }, "santa_tone3": { "unicode": "1F385-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "father christmas tone 3", "shortname": ":santa_tone3:", "category": "people", @@ -23904,11 +26770,12 @@ "nice", "sleigh", "holiday" - ] + ], + "moji": "🎅ðŸ½" }, "santa_tone4": { "unicode": "1F385-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "father christmas tone 4", "shortname": ":santa_tone4:", "category": "people", @@ -23930,11 +26797,12 @@ "nice", "sleigh", "holiday" - ] + ], + "moji": "🎅ðŸ¾" }, "santa_tone5": { "unicode": "1F385-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "father christmas tone 5", "shortname": ":santa_tone5:", "category": "people", @@ -23956,7 +26824,8 @@ "nice", "sleigh", "holiday" - ] + ], + "moji": "🎅ðŸ¿" }, "satellite": { "unicode": "1F4E1", @@ -23967,7 +26836,8 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "communication" + "communication", + "object" ], "moji": "📡" }, @@ -23976,21 +26846,23 @@ "unicode_alternates": [], "name": "satellite", "shortname": ":satellite_orbital:", - "category": "objects_symbols", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "communication", "orbital", - "space" - ] + "space", + "object" + ], + "moji": "🛰" }, "saxophone": { "unicode": "1F3B7", "unicode_alternates": [], "name": "saxophone", "shortname": ":saxophone:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -23998,15 +26870,14 @@ "music", "saxophone", "sax", - "music", - "instrument", - "woodwind" + "woodwind", + "instruments" ], "moji": "🎷" }, "scales": { "unicode": "2696", - "unicode_alternates": "", + "unicode_alternates": [], "name": "scales", "shortname": ":scales:", "category": "objects", @@ -24020,14 +26891,15 @@ "tool", "weight", "zodiac" - ] + ], + "moji": "âš–" }, "school": { "unicode": "1F3EB", "unicode_alternates": [], "name": "school", "shortname": ":school:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24039,7 +26911,8 @@ "high", "college", "teach", - "education" + "education", + "places" ], "moji": "ðŸ«" }, @@ -24048,7 +26921,7 @@ "unicode_alternates": [], "name": "school satchel", "shortname": ":school_satchel:", - "category": "objects", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24058,14 +26931,16 @@ "school", "satchel", "backpack", - "bag", "packing", "pack", "hike", - "education", "adventure", "travel", - "sightsee" + "sightsee", + "fashion", + "office", + "vacation", + "accessories" ], "moji": "🎒" }, @@ -24081,19 +26956,39 @@ "aliases_ascii": [], "keywords": [ "cut", - "stationery" + "stationery", + "object", + "tool", + "weapon", + "office" ], "moji": "✂" }, + "scooter": { + "unicode": "1F6F4", + "unicode_alternates": [], + "name": "scooter", + "shortname": ":scooter:", + "category": "travel", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🛴" + }, "scorpion": { "unicode": "1F982", - "unicode_alternates": "", + "unicode_alternates": [], "name": "scorpion", "shortname": ":scorpion:", "category": "nature", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "insects", + "reptile", + "animal" + ], + "moji": "🦂" }, "scorpius": { "unicode": "264F", @@ -24102,7 +26997,7 @@ ], "name": "scorpius", "shortname": ":scorpius:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24115,9 +27010,8 @@ "stars", "zodiac", "sign", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "â™" }, @@ -24126,7 +27020,7 @@ "unicode_alternates": [], "name": "face screaming in fear", "shortname": ":scream:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24135,7 +27029,12 @@ "scream", "painting", "artist", - "alien" + "alien", + "smiley", + "surprised", + "wow", + "emotion", + "omg" ], "moji": "😱" }, @@ -24144,7 +27043,7 @@ "unicode_alternates": [], "name": "weary cat face", "shortname": ":scream_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24161,7 +27060,8 @@ "exhausted", "scream", "painting", - "artist" + "artist", + "cat" ], "moji": "🙀" }, @@ -24174,7 +27074,9 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "documents" + "documents", + "object", + "office" ], "moji": "📜" }, @@ -24183,14 +27085,31 @@ "unicode_alternates": [], "name": "seat", "shortname": ":seat:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ - "sit" + "sit", + "transportation", + "object", + "travel", + "vacation" ], "moji": "💺" }, + "second_place": { + "unicode": "1F948", + "unicode_alternates": [], + "name": "second place medal", + "shortname": ":second_place:", + "category": "activity", + "aliases": [ + ":second_place_medal:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥈" + }, "secret": { "unicode": "3299", "unicode_alternates": [ @@ -24198,11 +27117,13 @@ ], "name": "circled ideograph secret", "shortname": ":secret:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "privacy" + "privacy", + "japan", + "symbol" ], "moji": "㊙" }, @@ -24211,14 +27132,13 @@ "unicode_alternates": [], "name": "see-no-evil monkey", "shortname": ":see_no_evil:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ "animal", "monkey", "nature", - "monkey", "see", "eyes", "vision", @@ -24241,34 +27161,118 @@ "nature", "plant", "seedling", - "plant", "new", "start", - "grow" + "grow", + "leaf" ], "moji": "🌱" }, + "selfie": { + "unicode": "1F933", + "unicode_alternates": [], + "name": "selfie", + "shortname": ":selfie:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳" + }, + "selfie_tone1": { + "unicode": "1F933-1F3FB", + "unicode_alternates": [], + "name": "selfie tone 1", + "shortname": ":selfie_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳ðŸ»" + }, + "selfie_tone2": { + "unicode": "1F933-1F3FC", + "unicode_alternates": [], + "name": "selfie tone 2", + "shortname": ":selfie_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳ðŸ¼" + }, + "selfie_tone3": { + "unicode": "1F933-1F3FD", + "unicode_alternates": [], + "name": "selfie tone 3", + "shortname": ":selfie_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳ðŸ½" + }, + "selfie_tone4": { + "unicode": "1F933-1F3FE", + "unicode_alternates": [], + "name": "selfie tone 4", + "shortname": ":selfie_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳ðŸ¾" + }, + "selfie_tone5": { + "unicode": "1F933-1F3FF", + "unicode_alternates": [], + "name": "selfie tone 5", + "shortname": ":selfie_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤳ðŸ¿" + }, "seven": { "moji": "7ï¸âƒ£", "unicode": "0037-20E3", "unicode_alternates": [ "0037-FE0F-20E3" ], - "name": "digit seven", + "name": "keycap digit seven", "shortname": ":seven:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "7", "blue-square", "numbers", - "prime" + "prime", + "number", + "math", + "symbol" ] }, + "shallow_pan_of_food": { + "unicode": "1F958", + "unicode_alternates": [], + "name": "shallow pan of food", + "shortname": ":shallow_pan_of_food:", + "category": "food", + "aliases": [ + ":paella:" + ], + "aliases_ascii": [], + "keywords": [ + "pan of food" + ], + "moji": "🥘" + }, "shamrock": { "unicode": "2618", - "unicode_alternates": "", + "unicode_alternates": [], "name": "shamrock", "shortname": ":shamrock:", "category": "nature", @@ -24276,15 +27280,29 @@ "aliases_ascii": [], "keywords": [ "nature", - "plant" - ] + "plant", + "luck", + "leaf" + ], + "moji": "☘" + }, + "shark": { + "unicode": "1F988", + "unicode_alternates": [], + "name": "shark", + "shortname": ":shark:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦈" }, "shaved_ice": { "unicode": "1F367", "unicode_alternates": [], "name": "shaved ice", "shortname": ":shaved_ice:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24295,7 +27313,8 @@ "dessert", "treat", "syrup", - "flavoring" + "flavoring", + "food" ], "moji": "ðŸ§" }, @@ -24334,7 +27353,6 @@ "sea", "shell", "spiral", - "beach", "sand", "crab", "nautilus" @@ -24346,7 +27364,7 @@ "unicode_alternates": [], "name": "shield", "shortname": ":shield:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24354,12 +27372,13 @@ "route", "sign", "highway", - "interstate" - ] + "object" + ], + "moji": "🛡" }, "shinto_shrine": { "unicode": "26E9", - "unicode_alternates": "", + "unicode_alternates": [], "name": "shinto shrine", "shortname": ":shinto_shrine:", "category": "travel", @@ -24367,15 +27386,20 @@ "aliases_ascii": [], "keywords": [ "religion", - "symbol" - ] + "symbol", + "places", + "building", + "travel", + "vacation" + ], + "moji": "⛩" }, "ship": { "unicode": "1F6A2", "unicode_alternates": [], "name": "ship", "shortname": ":ship:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24383,7 +27407,9 @@ "transportation", "ferry", "ship", - "boat" + "boat", + "travel", + "vacation" ], "moji": "🚢" }, @@ -24392,7 +27418,7 @@ "unicode_alternates": [], "name": "t-shirt", "shortname": ":shirt:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24406,7 +27432,7 @@ "unicode_alternates": [], "name": "shopping bags", "shortname": ":shopping_bags:", - "category": "travel_places", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24414,8 +27440,25 @@ "mall", "buy", "store", - "shop" - ] + "shop", + "object", + "birthday", + "parties" + ], + "moji": "ðŸ›" + }, + "shopping_cart": { + "unicode": "1F6D2", + "unicode_alternates": [], + "name": "shopping trolley", + "shortname": ":shopping_cart:", + "category": "objects", + "aliases": [ + ":shopping_trolley:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🛒" }, "shower": { "unicode": "1F6BF", @@ -24433,22 +27476,100 @@ "shower", "soap", "water", - "clean", "shampoo", - "lather" + "lather", + "object" ], "moji": "🚿" }, + "shrimp": { + "unicode": "1F990", + "unicode_alternates": [], + "name": "shrimp", + "shortname": ":shrimp:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "ðŸ¦" + }, + "shrug": { + "unicode": "1F937", + "unicode_alternates": [], + "name": "shrug", + "shortname": ":shrug:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷" + }, + "shrug_tone1": { + "unicode": "1F937-1F3FB", + "unicode_alternates": [], + "name": "shrug tone 1", + "shortname": ":shrug_tone1:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷ðŸ»" + }, + "shrug_tone2": { + "unicode": "1F937-1F3FC", + "unicode_alternates": [], + "name": "shrug tone 2", + "shortname": ":shrug_tone2:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷ðŸ¼" + }, + "shrug_tone3": { + "unicode": "1F937-1F3FD", + "unicode_alternates": [], + "name": "shrug tone 3", + "shortname": ":shrug_tone3:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷ðŸ½" + }, + "shrug_tone4": { + "unicode": "1F937-1F3FE", + "unicode_alternates": [], + "name": "shrug tone 4", + "shortname": ":shrug_tone4:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷ðŸ¾" + }, + "shrug_tone5": { + "unicode": "1F937-1F3FF", + "unicode_alternates": [], + "name": "shrug tone 5", + "shortname": ":shrug_tone5:", + "category": "people", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤷ðŸ¿" + }, "signal_strength": { "unicode": "1F4F6", "unicode_alternates": [], "name": "antenna with bars", "shortname": ":signal_strength:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "symbol" ], "moji": "📶" }, @@ -24458,15 +27579,18 @@ "unicode_alternates": [ "0036-FE0F-20E3" ], - "name": "digit six", + "name": "keycap digit six", "shortname": ":six:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "6", "blue-square", - "numbers" + "numbers", + "number", + "math", + "symbol" ] }, "six_pointed_star": { @@ -24474,11 +27598,15 @@ "unicode_alternates": [], "name": "six pointed star with middle dot", "shortname": ":six_pointed_star:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "purple-square" + "purple-square", + "religion", + "jew", + "star", + "symbol" ], "moji": "🔯" }, @@ -24487,7 +27615,7 @@ "unicode_alternates": [], "name": "ski and ski boot", "shortname": ":ski:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24499,18 +27627,19 @@ "cross-country", "poles", "snow", - "winter", "mountain", "alpine", "powder", "slalom", - "freestyle" + "freestyle", + "sport", + "skiing" ], "moji": "🎿" }, "skier": { "unicode": "26F7", - "unicode_alternates": "", + "unicode_alternates": [], "name": "skier", "shortname": ":skier:", "category": "activity", @@ -24521,15 +27650,20 @@ "ski", "snow", "sport", - "travel" - ] + "travel", + "hat", + "vacation", + "cold", + "skiing" + ], + "moji": "â›·" }, "skull": { "unicode": "1F480", "unicode_alternates": [], "name": "skull", "shortname": ":skull:", - "category": "emoticons", + "category": "people", "aliases": [ ":skeleton:" ], @@ -24537,13 +27671,15 @@ "keywords": [ "dead", "skeleton", - "dying" + "dying", + "halloween", + "skull" ], "moji": "💀" }, "skull_crossbones": { "unicode": "2620", - "unicode_alternates": "", + "unicode_alternates": [], "name": "skull and crossbones", "shortname": ":skull_crossbones:", "category": "objects", @@ -24556,15 +27692,19 @@ "death", "face", "monster", - "person" - ] + "person", + "symbol", + "dead", + "skull" + ], + "moji": "☠" }, "sleeping": { "unicode": "1F634", "unicode_alternates": [], "name": "sleeping face", "shortname": ":sleeping:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24572,9 +27712,11 @@ "sleepy", "tired", "sleep", - "sleepy", "sleeping", - "snore" + "snore", + "smiley", + "emotion", + "goodnight" ], "moji": "😴" }, @@ -24583,21 +27725,23 @@ "unicode_alternates": [], "name": "sleeping accommodation", "shortname": ":sleeping_accommodation:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "hotel", "motel", - "rest" - ] + "rest", + "tired" + ], + "moji": "🛌" }, "sleepy": { "unicode": "1F62A", "unicode_alternates": [], "name": "sleepy face", "shortname": ":sleepy:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24605,8 +27749,10 @@ "rest", "tired", "sleepy", - "tired", - "exhausted" + "exhausted", + "smiley", + "sick", + "emotion" ], "moji": "😪" }, @@ -24624,8 +27770,12 @@ "slight", "frown", "unhappy", - "disappointed" - ] + "disappointed", + "sad", + "smiley", + "emotion" + ], + "moji": "ðŸ™" }, "slight_smile": { "unicode": "1F642", @@ -24640,15 +27790,17 @@ "keywords": [ "slight", "smile", - "happy" - ] + "happy", + "smiley" + ], + "moji": "🙂" }, "slot_machine": { "unicode": "1F3B0", "unicode_alternates": [], "name": "slot machine", "shortname": ":slot_machine:", - "category": "places", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24657,10 +27809,11 @@ "vegas", "slot", "machine", - "gamble", "one-armed bandit", "slots", - "luck" + "luck", + "game", + "boys night" ], "moji": "🎰" }, @@ -24669,11 +27822,13 @@ "unicode_alternates": [], "name": "small blue diamond", "shortname": ":small_blue_diamond:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol" ], "moji": "🔹" }, @@ -24682,11 +27837,13 @@ "unicode_alternates": [], "name": "small orange diamond", "shortname": ":small_orange_diamond:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol" ], "moji": "🔸" }, @@ -24695,11 +27852,14 @@ "unicode_alternates": [], "name": "up-pointing red triangle", "shortname": ":small_red_triangle:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "triangle" ], "moji": "🔺" }, @@ -24708,11 +27868,14 @@ "unicode_alternates": [], "name": "down-pointing red triangle", "shortname": ":small_red_triangle_down:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "triangle" ], "moji": "🔻" }, @@ -24721,7 +27884,7 @@ "unicode_alternates": [], "name": "smiling face with open mouth and smiling eyes", "shortname": ":smile:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":)", @@ -24739,7 +27902,8 @@ "laugh", "smile", "smiley", - "smiling" + "smiling", + "emotion" ], "moji": "😄" }, @@ -24748,7 +27912,7 @@ "unicode_alternates": [], "name": "grinning cat face with smiling eyes", "shortname": ":smile_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24757,7 +27921,8 @@ "cat", "smile", "grin", - "grinning" + "grinning", + "happy" ], "moji": "😸" }, @@ -24766,7 +27931,7 @@ "unicode_alternates": [], "name": "smiling face with open mouth", "shortname": ":smiley:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":D", @@ -24780,7 +27945,9 @@ "joy", "smiling", "smile", - "smiley" + "smiley", + "emotion", + "good" ], "moji": "😃" }, @@ -24789,7 +27956,7 @@ "unicode_alternates": [], "name": "smiling cat face with open mouth", "shortname": ":smiley_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24798,8 +27965,7 @@ "happy", "smile", "smiley", - "cat", - "happy" + "cat" ], "moji": "😺" }, @@ -24808,16 +27974,19 @@ "unicode_alternates": [], "name": "smiling face with horns", "shortname": ":smiling_imp:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "devil", "horns", - "horns", - "devil", "impish", - "trouble" + "trouble", + "silly", + "smiley", + "angry", + "monster", + "boys night" ], "moji": "😈" }, @@ -24826,7 +27995,7 @@ "unicode_alternates": [], "name": "smirking face", "shortname": ":smirk:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24836,10 +28005,12 @@ "smug", "smirking", "smirk", - "smug", - "smile", "half-smile", - "conceited" + "conceited", + "silly", + "smiley", + "sexy", + "sarcastic" ], "moji": "ðŸ˜" }, @@ -24848,7 +28019,7 @@ "unicode_alternates": [], "name": "cat face with wry smile", "shortname": ":smirk_cat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24858,7 +28029,8 @@ "smirking", "wry", "confident", - "confidence" + "confidence", + "cat" ], "moji": "😼" }, @@ -24875,13 +28047,14 @@ "kills", "tobacco", "smoking", - "cigarette", "smoke", "cancer", "lungs", "inhale", "tar", - "nicotine" + "nicotine", + "symbol", + "drugs" ], "moji": "🚬" }, @@ -24898,10 +28071,10 @@ "shell", "slow", "snail", - "slow", "escargot", "french", - "appetizer" + "appetizer", + "insects" ], "moji": "ðŸŒ" }, @@ -24915,16 +28088,32 @@ "aliases_ascii": [], "keywords": [ "animal", - "evil" + "evil", + "wildlife", + "reptile", + "creationism" ], "moji": "ðŸ" }, + "sneezing_face": { + "unicode": "1F927", + "unicode_alternates": [], + "name": "sneezing face", + "shortname": ":sneezing_face:", + "category": "people", + "aliases": [ + ":sneeze:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤧" + }, "snowboarder": { "unicode": "1F3C2", "unicode_alternates": [], "name": "snowboarder", "shortname": ":snowboarder:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -24932,13 +28121,16 @@ "winter", "snow", "boarding", - "sports", "freestyle", "halfpipe", "board", "mountain", "alpine", - "winter" + "hat", + "vacation", + "cold", + "sport", + "snowboarding" ], "moji": "ðŸ‚" }, @@ -24965,13 +28157,13 @@ "droplet", "ice", "crystal", - "cold", "chilly", - "winter", "unique", "special", "below zero", - "elsa" + "elsa", + "sky", + "holidays" ], "moji": "â„" }, @@ -24991,13 +28183,15 @@ "season", "weather", "winter", - "xmas" + "xmas", + "holidays", + "snow" ], "moji": "⛄" }, "snowman2": { "unicode": "2603", - "unicode_alternates": "", + "unicode_alternates": [], "name": "snowman", "shortname": ":snowman2:", "category": "nature", @@ -25007,15 +28201,19 @@ "cold", "nature", "snow", - "weather" - ] + "weather", + "winter", + "holidays", + "christmas" + ], + "moji": "☃" }, "sob": { "unicode": "1F62D", "unicode_alternates": [], "name": "loudly crying face", "shortname": ":sob:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25024,14 +28222,14 @@ "sad", "tears", "upset", - "cry", "sob", - "tears", - "sad", "melancholy", "morn", "somber", - "hurt" + "hurt", + "smiley", + "emotion", + "heartbreak" ], "moji": "ðŸ˜" }, @@ -25042,7 +28240,7 @@ ], "name": "soccer ball", "shortname": ":soccer:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25051,7 +28249,10 @@ "football", "sports", "european", - "football" + "game", + "ball", + "sport", + "soccer" ], "moji": "âš½" }, @@ -25060,12 +28261,13 @@ "unicode_alternates": [], "name": "soon with rightwards arrow above", "shortname": ":soon:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "arrow", - "words" + "words", + "symbol" ], "moji": "🔜" }, @@ -25074,14 +28276,15 @@ "unicode_alternates": [], "name": "squared sos", "shortname": ":sos:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "emergency", "help", "red-square", - "words" + "words", + "symbol" ], "moji": "🆘" }, @@ -25090,12 +28293,14 @@ "unicode_alternates": [], "name": "speaker with one sound wave", "shortname": ":sound:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "speaker", - "volume" + "volume", + "alarm", + "symbol" ], "moji": "🔉" }, @@ -25104,12 +28309,14 @@ "unicode_alternates": [], "name": "alien monster", "shortname": ":space_invader:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ "arcade", - "game" + "game", + "monster", + "alien" ], "moji": "👾" }, @@ -25120,12 +28327,14 @@ ], "name": "black spade suit", "shortname": ":spades:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "cards", - "poker" + "poker", + "symbol", + "game" ], "moji": "â™ " }, @@ -25134,7 +28343,7 @@ "unicode_alternates": [], "name": "spaghetti", "shortname": ":spaghetti:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25145,7 +28354,7 @@ "noodles", "tomato", "sauce", - "italian" + "pasta" ], "moji": "ðŸ" }, @@ -25156,12 +28365,13 @@ ], "name": "sparkle", "shortname": ":sparkle:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "green-square", - "stars" + "stars", + "symbol" ], "moji": "â‡" }, @@ -25170,13 +28380,14 @@ "unicode_alternates": [], "name": "firework sparkler", "shortname": ":sparkler:", - "category": "objects", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "night", "shine", - "stars" + "stars", + "parties" ], "moji": "🎇" }, @@ -25185,14 +28396,16 @@ "unicode_alternates": [], "name": "sparkles", "shortname": ":sparkles:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ "cool", "shine", "shiny", - "stars" + "stars", + "star", + "girls night" ], "moji": "✨" }, @@ -25201,14 +28414,16 @@ "unicode_alternates": [], "name": "sparkling heart", "shortname": ":sparkling_heart:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "affection", "like", "love", - "valentines" + "valentines", + "symbol", + "girls night" ], "moji": "💖" }, @@ -25217,13 +28432,12 @@ "unicode_alternates": [], "name": "speak-no-evil monkey", "shortname": ":speak_no_evil:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ "animal", "monkey", - "monkey", "mouth", "talk", "say", @@ -25240,36 +28454,41 @@ "unicode_alternates": [], "name": "speaker", "shortname": ":speaker:", - "category": "objects", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "sound", "listen", "hear", - "noise" - ] + "noise", + "alarm", + "symbol" + ], + "moji": "🔈" }, "speaking_head": { "unicode": "1F5E3", "unicode_alternates": [], "name": "speaking head in silhouette", "shortname": ":speaking_head:", - "category": "objects_symbols", + "category": "people", "aliases": [ ":speaking_head_in_silhouette:" ], "aliases_ascii": [], "keywords": [ - "talk" - ] + "talk", + "people" + ], + "moji": "🗣" }, "speech_balloon": { "unicode": "1F4AC", "unicode_alternates": [], "name": "speech balloon", "shortname": ":speech_balloon:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25281,96 +28500,18 @@ "conversation", "communication", "comic", - "dialogue" + "dialogue", + "symbol", + "free speech" ], "moji": "💬" }, - "speech_left": { - "unicode": "1F5E8", - "unicode_alternates": [], - "name": "left speech bubble", - "shortname": ":speech_left:", - "category": "objects_symbols", - "aliases": [ - ":left_speech_bubble:" - ], - "aliases_ascii": [], - "keywords": [ - "balloon", - "words", - "talk", - "conversation", - "communication", - "comic", - "dialogue" - ] - }, - "speech_right": { - "unicode": "1F5E9", - "unicode_alternates": [], - "name": "right speech bubble", - "shortname": ":speech_right:", - "category": "objects_symbols", - "aliases": [ - ":right_speech_bubble:" - ], - "aliases_ascii": [], - "keywords": [ - "balloon", - "words", - "talk", - "conversation", - "communication", - "comic", - "dialogue" - ] - }, - "speech_three": { - "unicode": "1F5EB", - "unicode_alternates": [], - "name": "three speech bubbles", - "shortname": ":speech_three:", - "category": "objects_symbols", - "aliases": [ - ":three_speech_bubbles:" - ], - "aliases_ascii": [], - "keywords": [ - "balloon", - "words", - "talk", - "conversation", - "communication", - "comic", - "dialogue" - ] - }, - "speech_two": { - "unicode": "1F5EA", - "unicode_alternates": [], - "name": "two speech bubbles", - "shortname": ":speech_two:", - "category": "objects_symbols", - "aliases": [ - ":two_speech_bubbles:" - ], - "aliases_ascii": [], - "keywords": [ - "balloon", - "words", - "talk", - "conversation", - "communication", - "comic", - "dialogue" - ] - }, "speedboat": { "unicode": "1F6A4", "unicode_alternates": [], "name": "speedboat", "shortname": ":speedboat:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25381,7 +28522,10 @@ "speed", "ski", "power", - "boat" + "boat", + "travel", + "vacation", + "tropical" ], "moji": "🚤" }, @@ -25395,8 +28539,12 @@ "aliases_ascii": [], "keywords": [ "arachnid", - "eight-legged" - ] + "eight-legged", + "insects", + "halloween", + "animal" + ], + "moji": "🕷" }, "spider_web": { "unicode": "1F578", @@ -25407,8 +28555,21 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "cobweb" - ] + "cobweb", + "halloween" + ], + "moji": "🕸" + }, + "spoon": { + "unicode": "1F944", + "unicode_alternates": [], + "name": "spoon", + "shortname": ":spoon:", + "category": "food", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🥄" }, "spy": { "unicode": "1F575", @@ -25423,12 +28584,19 @@ "keywords": [ "pi", "undercover", - "investigator" - ] + "investigator", + "people", + "hat", + "men", + "glasses", + "diversity", + "job" + ], + "moji": "🕵" }, "spy_tone1": { "unicode": "1F575-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sleuth or spy tone 1", "shortname": ":spy_tone1:", "category": "people", @@ -25441,11 +28609,12 @@ "undercover", "investigator", "person" - ] + ], + "moji": "🕵ðŸ»" }, "spy_tone2": { "unicode": "1F575-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sleuth or spy tone 2", "shortname": ":spy_tone2:", "category": "people", @@ -25458,11 +28627,12 @@ "undercover", "investigator", "person" - ] + ], + "moji": "🕵ðŸ¼" }, "spy_tone3": { "unicode": "1F575-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sleuth or spy tone 3", "shortname": ":spy_tone3:", "category": "people", @@ -25475,11 +28645,12 @@ "undercover", "investigator", "person" - ] + ], + "moji": "🕵ðŸ½" }, "spy_tone4": { "unicode": "1F575-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sleuth or spy tone 4", "shortname": ":spy_tone4:", "category": "people", @@ -25492,11 +28663,12 @@ "undercover", "investigator", "person" - ] + ], + "moji": "🕵ðŸ¾" }, "spy_tone5": { "unicode": "1F575-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "sleuth or spy tone 5", "shortname": ":spy_tone5:", "category": "people", @@ -25509,14 +28681,26 @@ "undercover", "investigator", "person" - ] + ], + "moji": "🕵ðŸ¿" + }, + "squid": { + "unicode": "1F991", + "unicode_alternates": [], + "name": "squid", + "shortname": ":squid:", + "category": "nature", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🦑" }, "stadium": { "unicode": "1F3DF", "unicode_alternates": [], "name": "stadium", "shortname": ":stadium:", - "category": "travel_places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25524,8 +28708,14 @@ "event", "concert", "convention", - "game" - ] + "game", + "places", + "building", + "travel", + "vacation", + "boys night" + ], + "moji": "ðŸŸ" }, "star": { "unicode": "2B50", @@ -25539,7 +28729,10 @@ "aliases_ascii": [], "keywords": [ "night", - "yellow" + "yellow", + "space", + "sky", + "star" ], "moji": "â" }, @@ -25548,7 +28741,7 @@ "unicode_alternates": [], "name": "glowing star", "shortname": ":star2:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25559,13 +28752,15 @@ "star", "five", "points", - "classic" + "classic", + "space", + "sky" ], "moji": "🌟" }, "star_and_crescent": { "unicode": "262A", - "unicode_alternates": "", + "unicode_alternates": [], "name": "star and crescent", "shortname": ":star_and_crescent:", "category": "symbols", @@ -25576,11 +28771,12 @@ "muslim", "religion", "symbol" - ] + ], + "moji": "☪" }, "star_of_david": { "unicode": "2721", - "unicode_alternates": "", + "unicode_alternates": [], "name": "star of david", "shortname": ":star_of_david:", "category": "symbols", @@ -25590,15 +28786,17 @@ "jew", "jewish", "religion", - "symbol" - ] + "symbol", + "star" + ], + "moji": "✡" }, "stars": { "unicode": "1F320", "unicode_alternates": [], "name": "shooting star", "shortname": ":stars:", - "category": "nature", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25608,9 +28806,9 @@ "shoot", "star", "sky", - "night", "comet", - "meteoroid" + "meteoroid", + "space" ], "moji": "🌠" }, @@ -25619,7 +28817,7 @@ "unicode_alternates": [], "name": "station", "shortname": ":station:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25628,7 +28826,8 @@ "vehicle", "station", "train", - "subway" + "subway", + "travel" ], "moji": "🚉" }, @@ -25637,12 +28836,18 @@ "unicode_alternates": [], "name": "statue of liberty", "shortname": ":statue_of_liberty:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "american", - "newyork" + "newyork", + "places", + "america", + "travel", + "vacation", + "statue of liberty", + "free speech" ], "moji": "🗽" }, @@ -25651,7 +28856,7 @@ "unicode_alternates": [], "name": "steam locomotive", "shortname": ":steam_locomotive:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25660,35 +28865,17 @@ "vehicle", "locomotive", "steam", - "train", - "engine" + "engine", + "travel" ], "moji": "🚂" }, - "stereo": { - "unicode": "1F4FE", - "unicode_alternates": [], - "name": "portable stereo", - "shortname": ":stereo:", - "category": "objects_symbols", - "aliases": [ - ":portable_stereo:" - ], - "aliases_ascii": [], - "keywords": [ - "communication", - "music", - "program", - "boom", - "box" - ] - }, "stew": { "unicode": "1F372", "unicode_alternates": [], "name": "pot of food", "shortname": ":stew:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25697,30 +28884,16 @@ "stew", "hearty", "soup", - "thick", - "hot", - "pot" - ], - "moji": "ðŸ²" - }, - "stock_chart": { - "unicode": "1F5E0", - "unicode_alternates": [], - "name": "stock chart", - "shortname": ":stock_chart:", - "category": "objects_symbols", - "aliases": [], - "aliases_ascii": [], - "keywords": [ - "graph", - "presentation", - "stats", - "business" - ] + "thick", + "hot", + "pot", + "steam" + ], + "moji": "ðŸ²" }, "stop_button": { "unicode": "23F9", - "unicode_alternates": "", + "unicode_alternates": [], "name": "black square for stop", "shortname": ":stop_button:", "category": "symbols", @@ -25728,12 +28901,14 @@ "aliases_ascii": [], "keywords": [ "sound", - "symbol" - ] + "symbol", + "square" + ], + "moji": "â¹" }, "stopwatch": { "unicode": "23F1", - "unicode_alternates": "", + "unicode_alternates": [], "name": "stopwatch", "shortname": ":stopwatch:", "category": "objects", @@ -25742,8 +28917,10 @@ "keywords": [ "clock", "object", - "time" - ] + "time", + "electronics" + ], + "moji": "â±" }, "straight_ruler": { "unicode": "1F4CF", @@ -25754,7 +28931,10 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "stationery" + "stationery", + "object", + "tool", + "office" ], "moji": "ðŸ“" }, @@ -25763,7 +28943,7 @@ "unicode_alternates": [], "name": "strawberry", "shortname": ":strawberry:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25782,7 +28962,7 @@ "unicode_alternates": [], "name": "face with stuck-out tongue", "shortname": ":stuck_out_tongue:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ":P", @@ -25807,8 +28987,10 @@ "prank", "tongue", "silly", - "playful", - "cheeky" + "cheeky", + "smiley", + "sex", + "emotion" ], "moji": "😛" }, @@ -25817,7 +28999,7 @@ "unicode_alternates": [], "name": "face with stuck-out tongue and tightly-closed eyes", "shortname": ":stuck_out_tongue_closed_eyes:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25828,8 +29010,10 @@ "tongue", "kidding", "silly", - "playful", - "ecstatic" + "ecstatic", + "happy", + "smiley", + "emotion" ], "moji": "ðŸ˜" }, @@ -25838,7 +29022,7 @@ "unicode_alternates": [], "name": "face with stuck-out tongue and winking eye", "shortname": ":stuck_out_tongue_winking_eye:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ">:P", @@ -25856,11 +29040,27 @@ "winking", "kidding", "silly", - "playful", - "crazy" + "crazy", + "happy", + "smiley", + "emotion", + "parties" ], "moji": "😜" }, + "stuffed_flatbread": { + "unicode": "1F959", + "unicode_alternates": [], + "name": "stuffed flatbread", + "shortname": ":stuffed_flatbread:", + "category": "food", + "aliases": [ + ":stuffed_pita:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥙" + }, "sun_with_face": { "unicode": "1F31E", "unicode_alternates": [], @@ -25874,7 +29074,9 @@ "sun", "anthropomorphic", "face", - "sky" + "sky", + "day", + "hump day" ], "moji": "🌞" }, @@ -25902,7 +29104,7 @@ "unicode_alternates": [], "name": "smiling face with sunglasses", "shortname": ":sunglasses:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ "B-)", @@ -25920,8 +29122,11 @@ "sun", "glasses", "sunny", - "cool", - "smooth" + "smooth", + "silly", + "smiley", + "emojione", + "boys night" ], "moji": "😎" }, @@ -25937,15 +29142,21 @@ "aliases_ascii": [], "keywords": [ "brightness", - "weather" - ] + "weather", + "sky", + "day", + "sun", + "hot", + "morning" + ], + "moji": "☀" }, "sunrise": { "unicode": "1F305", "unicode_alternates": [], "name": "sunrise", "shortname": ":sunrise:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25955,9 +29166,13 @@ "view", "sunrise", "sun", - "morning", "color", - "sky" + "sky", + "places", + "travel", + "tropical", + "day", + "hump day" ], "moji": "🌅" }, @@ -25966,7 +29181,7 @@ "unicode_alternates": [], "name": "sunrise over mountains", "shortname": ":sunrise_over_mountains:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25979,7 +29194,11 @@ "mountain", "rural", "color", - "sky" + "sky", + "places", + "travel", + "day", + "camp" ], "moji": "🌄" }, @@ -25988,7 +29207,7 @@ "unicode_alternates": [], "name": "surfer", "shortname": ":surfer:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -25998,15 +29217,19 @@ "surfer", "surf", "wave", - "ocean", "ride", - "swell" + "swell", + "men", + "vacation", + "tropical", + "sport", + "diversity" ], "moji": "ðŸ„" }, "surfer_tone1": { "unicode": "1F3C4-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "surfer tone 1", "shortname": ":surfer_tone1:", "category": "activity", @@ -26018,14 +29241,14 @@ "sport", "surf", "wave", - "ocean", "ride", "swell" - ] + ], + "moji": "ðŸ„ðŸ»" }, "surfer_tone2": { "unicode": "1F3C4-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "surfer tone 2", "shortname": ":surfer_tone2:", "category": "activity", @@ -26037,14 +29260,14 @@ "sport", "surf", "wave", - "ocean", "ride", "swell" - ] + ], + "moji": "ðŸ„ðŸ¼" }, "surfer_tone3": { "unicode": "1F3C4-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "surfer tone 3", "shortname": ":surfer_tone3:", "category": "activity", @@ -26056,14 +29279,14 @@ "sport", "surf", "wave", - "ocean", "ride", "swell" - ] + ], + "moji": "ðŸ„ðŸ½" }, "surfer_tone4": { "unicode": "1F3C4-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "surfer tone 4", "shortname": ":surfer_tone4:", "category": "activity", @@ -26075,14 +29298,14 @@ "sport", "surf", "wave", - "ocean", "ride", "swell" - ] + ], + "moji": "ðŸ„ðŸ¾" }, "surfer_tone5": { "unicode": "1F3C4-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "surfer tone 5", "shortname": ":surfer_tone5:", "category": "activity", @@ -26094,17 +29317,17 @@ "sport", "surf", "wave", - "ocean", "ride", "swell" - ] + ], + "moji": "ðŸ„ðŸ¿" }, "sushi": { "unicode": "1F363", "unicode_alternates": [], "name": "sushi", "shortname": ":sushi:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26114,7 +29337,7 @@ "fish", "raw", "nigiri", - "japanese" + "japan" ], "moji": "ðŸ£" }, @@ -26123,7 +29346,7 @@ "unicode_alternates": [], "name": "suspension railway", "shortname": ":suspension_railway:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26133,7 +29356,7 @@ "railway", "rail", "train", - "transportation" + "travel" ], "moji": "🚟" }, @@ -26142,7 +29365,7 @@ "unicode_alternates": [], "name": "face with cold sweat", "shortname": ":sweat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ "':(", @@ -26158,7 +29381,11 @@ "clammy", "diaphoresis", "face", - "hot" + "hot", + "sad", + "smiley", + "stressed", + "emotion" ], "moji": "😓" }, @@ -26167,11 +29394,14 @@ "unicode_alternates": [], "name": "splashing sweat symbol", "shortname": ":sweat_drops:", - "category": "emoticons", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ - "water" + "water", + "rain", + "stressed", + "sweat" ], "moji": "💦" }, @@ -26180,7 +29410,7 @@ "unicode_alternates": [], "name": "smiling face with open mouth and cold sweat", "shortname": ":sweat_smile:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ "':)", @@ -26197,7 +29427,10 @@ "smiling", "cold", "sweat", - "perspiration" + "perspiration", + "smiley", + "workout", + "emotion" ], "moji": "😅" }, @@ -26206,7 +29439,7 @@ "unicode_alternates": [], "name": "roasted sweet potato", "shortname": ":sweet_potato:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26216,7 +29449,8 @@ "potato", "potassium", "roasted", - "roast" + "roast", + "vegetables" ], "moji": "ðŸ " }, @@ -26225,7 +29459,7 @@ "unicode_alternates": [], "name": "swimmer", "shortname": ":swimmer:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26238,13 +29472,16 @@ "freestyle", "butterfly", "breaststroke", - "backstroke" + "backstroke", + "workout", + "sport", + "diversity" ], "moji": "ðŸŠ" }, "swimmer_tone1": { "unicode": "1F3CA-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "swimmer tone 1", "shortname": ":swimmer_tone1:", "category": "activity", @@ -26260,11 +29497,12 @@ "butterfly", "breaststroke", "backstroke" - ] + ], + "moji": "ðŸŠðŸ»" }, "swimmer_tone2": { "unicode": "1F3CA-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "swimmer tone 2", "shortname": ":swimmer_tone2:", "category": "activity", @@ -26280,11 +29518,12 @@ "butterfly", "breaststroke", "backstroke" - ] + ], + "moji": "ðŸŠðŸ¼" }, "swimmer_tone3": { "unicode": "1F3CA-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "swimmer tone 3", "shortname": ":swimmer_tone3:", "category": "activity", @@ -26300,11 +29539,12 @@ "butterfly", "breaststroke", "backstroke" - ] + ], + "moji": "ðŸŠðŸ½" }, "swimmer_tone4": { "unicode": "1F3CA-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "swimmer tone 4", "shortname": ":swimmer_tone4:", "category": "activity", @@ -26320,11 +29560,12 @@ "butterfly", "breaststroke", "backstroke" - ] + ], + "moji": "ðŸŠðŸ¾" }, "swimmer_tone5": { "unicode": "1F3CA-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "swimmer tone 5", "shortname": ":swimmer_tone5:", "category": "activity", @@ -26340,30 +29581,40 @@ "butterfly", "breaststroke", "backstroke" - ] + ], + "moji": "ðŸŠðŸ¿" }, "symbols": { "unicode": "1F523", "unicode_alternates": [], "name": "input symbol for symbols", "shortname": ":symbols:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "symbol" ], "moji": "🔣" }, "synagogue": { "unicode": "1F54D", - "unicode_alternates": "", + "unicode_alternates": [], "name": "synagogue", "shortname": ":synagogue:", "category": "travel", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "places", + "religion", + "building", + "travel", + "vacation", + "condolence" + ], + "moji": "ðŸ•" }, "syringe": { "unicode": "1F489", @@ -26379,19 +29630,26 @@ "health", "hospital", "medicine", - "needle" + "needle", + "object", + "weapon" ], "moji": "💉" }, "taco": { "unicode": "1F32E", - "unicode_alternates": "", + "unicode_alternates": [], "name": "taco", "shortname": ":taco:", - "category": "foods", + "category": "food", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "food", + "mexican", + "vagina" + ], + "moji": "🌮" }, "tada": { "unicode": "1F389", @@ -26404,14 +29662,21 @@ "keywords": [ "contulations", "party", - "party", "popper", "tada", "celebration", "victory", "announcement", "climax", - "congratulations" + "congratulations", + "object", + "birthday", + "holidays", + "cheers", + "good", + "girls night", + "boys night", + "parties" ], "moji": "🎉" }, @@ -26420,7 +29685,7 @@ "unicode_alternates": [], "name": "tanabata tree", "shortname": ":tanabata_tree:", - "category": "objects", + "category": "nature", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26431,7 +29696,8 @@ "festival", "star", "wish", - "holiday" + "holiday", + "trees" ], "moji": "🎋" }, @@ -26440,7 +29706,7 @@ "unicode_alternates": [], "name": "tangerine", "shortname": ":tangerine:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26460,7 +29726,7 @@ ], "name": "taurus", "shortname": ":taurus:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26473,9 +29739,8 @@ "constellation", "stars", "zodiac", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "♉" }, @@ -26484,7 +29749,7 @@ "unicode_alternates": [], "name": "taxi", "shortname": ":taxi:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26497,7 +29762,8 @@ "automobile", "city", "transport", - "service" + "service", + "travel" ], "moji": "🚕" }, @@ -26506,7 +29772,7 @@ "unicode_alternates": [], "name": "teacup without handle", "shortname": ":tea:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26517,10 +29783,13 @@ "green", "tea", "leaf", - "drink", "teacup", "hot", - "beverage" + "beverage", + "japan", + "caffeine", + "steam", + "morning" ], "moji": "ðŸµ" }, @@ -26537,26 +29806,12 @@ "keywords": [ "communication", "dial", - "technology" + "technology", + "electronics", + "phone" ], "moji": "☎" }, - "telephone_black": { - "unicode": "1F57F", - "unicode_alternates": [], - "name": "black touchtone telephone", - "shortname": ":telephone_black:", - "category": "objects_symbols", - "aliases": [ - ":black_touchtone_telephone:" - ], - "aliases_ascii": [], - "keywords": [ - "communication", - "dial", - "technology" - ] - }, "telephone_receiver": { "unicode": "1F4DE", "unicode_alternates": [], @@ -26568,26 +29823,12 @@ "keywords": [ "communication", "dial", - "technology" + "technology", + "electronics", + "phone" ], "moji": "📞" }, - "telephone_white": { - "unicode": "1F57E", - "unicode_alternates": [], - "name": "white touchtone telephone", - "shortname": ":telephone_white:", - "category": "objects_symbols", - "aliases": [ - ":white_touchtone_telephone:" - ], - "aliases_ascii": [], - "keywords": [ - "communication", - "dial", - "technology" - ] - }, "telescope": { "unicode": "1F52D", "unicode_alternates": [], @@ -26598,13 +29839,15 @@ "aliases_ascii": [], "keywords": [ "space", - "stars" + "stars", + "object", + "science" ], "moji": "ðŸ”" }, "ten": { "unicode": "1F51F", - "unicode_alternates": "", + "unicode_alternates": [], "name": "keycap ten", "shortname": ":ten:", "category": "symbols", @@ -26615,15 +29858,18 @@ "blue-square", "numbers", "symbol", - "word" - ] + "word", + "number", + "math" + ], + "moji": "🔟" }, "tennis": { "unicode": "1F3BE", "unicode_alternates": [], "name": "tennis racquet and ball", "shortname": ":tennis:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -26637,7 +29883,8 @@ "game", "net", "court", - "love" + "love", + "sport" ], "moji": "🎾" }, @@ -26648,13 +29895,16 @@ ], "name": "tent", "shortname": ":tent:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "camp", "outdoors", - "photo" + "photo", + "places", + "travel", + "vacation" ], "moji": "⛺" }, @@ -26663,16 +29913,21 @@ "unicode_alternates": [], "name": "thermometer", "shortname": ":thermometer:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ - "temperature" - ] + "temperature", + "object", + "science", + "health", + "hot" + ], + "moji": "🌡" }, "thermometer_face": { "unicode": "1F912", - "unicode_alternates": "", + "unicode_alternates": [], "name": "face with thermometer", "shortname": ":thermometer_face:", "category": "people", @@ -26680,11 +29935,17 @@ ":face_with_thermometer:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "smiley", + "health", + "sick", + "emotion" + ], + "moji": "🤒" }, "thinking": { "unicode": "1F914", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thinking face", "shortname": ":thinking:", "category": "people", @@ -26692,66 +29953,47 @@ ":thinking_face:" ], "aliases_ascii": [], - "keywords": [] - }, - "thought_balloon": { - "unicode": "1F4AD", - "unicode_alternates": [], - "name": "thought balloon", - "shortname": ":thought_balloon:", - "category": "emoticons", - "aliases": [], - "aliases_ascii": [], "keywords": [ - "bubble", - "cloud", - "speech", - "thought", - "balloon", - "comic", - "think", - "day dream", - "wonder" + "smiley", + "thinking", + "boys night" ], - "moji": "ðŸ’" + "moji": "🤔" }, - "thought_left": { - "unicode": "1F5EC", + "third_place": { + "unicode": "1F949", "unicode_alternates": [], - "name": "left thought bubble", - "shortname": ":thought_left:", - "category": "objects_symbols", + "name": "third place medal", + "shortname": ":third_place:", + "category": "activity", "aliases": [ - ":left_thought_bubble:" + ":third_place_medal:" ], "aliases_ascii": [], - "keywords": [ - "balloon", - "cloud", - "comic", - "think", - "day dream", - "wonder" - ] + "keywords": [], + "moji": "🥉" }, - "thought_right": { - "unicode": "1F5ED", - "unicode_alternates": [], - "name": "right thought bubble", - "shortname": ":thought_right:", - "category": "objects_symbols", - "aliases": [ - ":right_thought_bubble:" - ], + "thought_balloon": { + "unicode": "1F4AD", + "unicode_alternates": [], + "name": "thought balloon", + "shortname": ":thought_balloon:", + "category": "symbols", + "aliases": [], "aliases_ascii": [], "keywords": [ - "balloon", + "bubble", "cloud", + "speech", + "thought", + "balloon", "comic", "think", "day dream", - "wonder" - ] + "wonder", + "symbol" + ], + "moji": "ðŸ’" }, "three": { "moji": "3ï¸âƒ£", @@ -26759,50 +30001,19 @@ "unicode_alternates": [ "0033-FE0F-20E3" ], - "name": "digit three", + "name": "keycap digit three", "shortname": ":three:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "3", "blue-square", "numbers", - "prime" - ] - }, - "thumbs_down_reverse": { - "unicode": "1F593", - "unicode_alternates": [], - "name": "reversed thumbs down sign", - "shortname": ":thumbs_down_reverse:", - "category": "people", - "aliases": [ - ":reversed_thumbs_down_sign:" - ], - "aliases_ascii": [], - "keywords": [ - "hand", - "no", - "-1" - ] - }, - "thumbs_up_reverse": { - "unicode": "1F592", - "unicode_alternates": [], - "name": "reversed thumbs up sign", - "shortname": ":thumbs_up_reverse:", - "category": "people", - "aliases": [ - ":reversed_thumbs_up_sign:" - ], - "aliases_ascii": [], - "keywords": [ - "cool", - "hand", - "like", - "yes", - "+1" + "prime", + "number", + "math", + "symbol" ] }, "thumbsdown": { @@ -26810,20 +30021,23 @@ "unicode_alternates": [], "name": "thumbs down sign", "shortname": ":thumbsdown:", - "category": "emoticons", + "category": "people", "aliases": [ ":-1:" ], "aliases_ascii": [], "keywords": [ "hand", - "no" + "no", + "body", + "hands", + "diversity" ], "moji": "👎" }, "thumbsdown_tone1": { "unicode": "1F44E-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs down sign tone 1", "shortname": ":thumbsdown_tone1:", "category": "people", @@ -26835,11 +30049,12 @@ "hand", "no", "-1" - ] + ], + "moji": "👎ðŸ»" }, "thumbsdown_tone2": { "unicode": "1F44E-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs down sign tone 2", "shortname": ":thumbsdown_tone2:", "category": "people", @@ -26851,11 +30066,12 @@ "hand", "no", "-1" - ] + ], + "moji": "👎ðŸ¼" }, "thumbsdown_tone3": { "unicode": "1F44E-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs down sign tone 3", "shortname": ":thumbsdown_tone3:", "category": "people", @@ -26867,11 +30083,12 @@ "hand", "no", "-1" - ] + ], + "moji": "👎ðŸ½" }, "thumbsdown_tone4": { "unicode": "1F44E-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs down sign tone 4", "shortname": ":thumbsdown_tone4:", "category": "people", @@ -26883,11 +30100,12 @@ "hand", "no", "-1" - ] + ], + "moji": "👎ðŸ¾" }, "thumbsdown_tone5": { "unicode": "1F44E-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs down sign tone 5", "shortname": ":thumbsdown_tone5:", "category": "people", @@ -26899,14 +30117,15 @@ "hand", "no", "-1" - ] + ], + "moji": "👎ðŸ¿" }, "thumbsup": { "unicode": "1F44D", "unicode_alternates": [], "name": "thumbs up sign", "shortname": ":thumbsup:", - "category": "emoticons", + "category": "people", "aliases": [ ":+1:" ], @@ -26915,13 +30134,22 @@ "cool", "hand", "like", - "yes" + "yes", + "body", + "hands", + "hi", + "luck", + "thank you", + "diversity", + "perfect", + "good", + "beautiful" ], "moji": "ðŸ‘" }, "thumbsup_tone1": { "unicode": "1F44D-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs up sign tone 1", "shortname": ":thumbsup_tone1:", "category": "people", @@ -26935,11 +30163,12 @@ "like", "yes", "+1" - ] + ], + "moji": "ðŸ‘ðŸ»" }, "thumbsup_tone2": { "unicode": "1F44D-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs up sign tone 2", "shortname": ":thumbsup_tone2:", "category": "people", @@ -26953,11 +30182,12 @@ "like", "yes", "+1" - ] + ], + "moji": "ðŸ‘ðŸ¼" }, "thumbsup_tone3": { "unicode": "1F44D-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs up sign tone 3", "shortname": ":thumbsup_tone3:", "category": "people", @@ -26971,11 +30201,12 @@ "like", "yes", "+1" - ] + ], + "moji": "ðŸ‘ðŸ½" }, "thumbsup_tone4": { "unicode": "1F44D-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs up sign tone 4", "shortname": ":thumbsup_tone4:", "category": "people", @@ -26989,11 +30220,12 @@ "like", "yes", "+1" - ] + ], + "moji": "ðŸ‘ðŸ¾" }, "thumbsup_tone5": { "unicode": "1F44D-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thumbs up sign tone 5", "shortname": ":thumbsup_tone5:", "category": "people", @@ -27007,11 +30239,12 @@ "like", "yes", "+1" - ] + ], + "moji": "ðŸ‘ðŸ¿" }, "thunder_cloud_rain": { "unicode": "26C8", - "unicode_alternates": "", + "unicode_alternates": [], "name": "thunder cloud and rain", "shortname": ":thunder_cloud_rain:", "category": "nature", @@ -27021,15 +30254,20 @@ "aliases_ascii": [], "keywords": [ "nature", - "weather" - ] + "weather", + "sky", + "cloud", + "cold", + "rain" + ], + "moji": "⛈" }, "ticket": { "unicode": "1F3AB", "unicode_alternates": [], "name": "ticket", "shortname": ":ticket:", - "category": "places", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27042,7 +30280,10 @@ "stub", "admission", "proof", - "purchase" + "purchase", + "theatre", + "movie", + "parties" ], "moji": "🎫" }, @@ -27064,8 +30305,12 @@ "entertainment", "stub", "proof", - "purchase" - ] + "purchase", + "theatre", + "movie", + "parties" + ], + "moji": "🎟" }, "tiger": { "unicode": "1F42F", @@ -27076,7 +30321,10 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "animal" + "animal", + "wildlife", + "roar", + "cat" ], "moji": "ðŸ¯" }, @@ -27096,13 +30344,15 @@ "striped", "tony", "tigger", - "hobs" + "hobs", + "wildlife", + "roar" ], "moji": "ðŸ…" }, "timer": { "unicode": "23F2", - "unicode_alternates": "", + "unicode_alternates": [], "name": "timer clock", "shortname": ":timer:", "category": "objects", @@ -27113,14 +30363,15 @@ "keywords": [ "object", "time" - ] + ], + "moji": "â²" }, "tired_face": { "unicode": "1F62B", "unicode_alternates": [], "name": "tired face", "shortname": ":tired_face:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27131,13 +30382,18 @@ "whine", "exhausted", "sleepy", - "tired" + "tired", + "sad", + "smiley", + "emotion" ], "moji": "😫" }, "tm": { "unicode": "2122", - "unicode_alternates": "2122-fe0f", + "unicode_alternates": [ + "2122-FE0F" + ], "name": "trade mark sign", "shortname": ":tm:", "category": "symbols", @@ -27149,7 +30405,8 @@ "symbol", "tm", "word" - ] + ], + "moji": "â„¢" }, "toilet": { "unicode": "1F6BD", @@ -27168,7 +30425,8 @@ "porcelain", "waste", "flush", - "plumbing" + "plumbing", + "object" ], "moji": "🚽" }, @@ -27177,12 +30435,16 @@ "unicode_alternates": [], "name": "tokyo tower", "shortname": ":tokyo_tower:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "japan", - "photo" + "photo", + "places", + "travel", + "vacation", + "eiffel tower" ], "moji": "🗼" }, @@ -27191,7 +30453,7 @@ "unicode_alternates": [], "name": "tomato", "shortname": ":tomato:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27200,80 +30462,83 @@ "nature", "vegetable", "tomato", - "fruit", "sauce", - "italian" + "italian", + "vegetables" ], "moji": "ðŸ…" }, "tone1": { "unicode": "1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "emoji modifier Fitzpatrick type-1-2", "shortname": ":tone1:", "category": "modifier", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [], + "moji": "ðŸ»" }, "tone2": { "unicode": "1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "emoji modifier Fitzpatrick type-3", "shortname": ":tone2:", "category": "modifier", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [], + "moji": "ðŸ¼" }, "tone3": { "unicode": "1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "emoji modifier Fitzpatrick type-4", "shortname": ":tone3:", "category": "modifier", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [], + "moji": "ðŸ½" }, "tone4": { "unicode": "1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "emoji modifier Fitzpatrick type-5", "shortname": ":tone4:", "category": "modifier", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [], + "moji": "ðŸ¾" }, "tone5": { "unicode": "1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "emoji modifier Fitzpatrick type-6", "shortname": ":tone5:", "category": "modifier", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [], + "moji": "ðŸ¿" }, "tongue": { "unicode": "1F445", "unicode_alternates": [], "name": "tongue", "shortname": ":tongue:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "mouth", "playful", "tongue", - "mouth", "taste", "buds", "food", "silly", - "playful", "tease", "kiss", "french kiss", @@ -27281,7 +30546,10 @@ "tasty", "playfulness", "silliness", - "intimacy" + "intimacy", + "body", + "sexy", + "lip" ], "moji": "👅" }, @@ -27290,26 +30558,31 @@ "unicode_alternates": [], "name": "hammer and wrench", "shortname": ":tools:", - "category": "objects_symbols", + "category": "objects", "aliases": [ ":hammer_and_wrench:" ], "aliases_ascii": [], "keywords": [ - "tools" - ] + "tools", + "object", + "tool" + ], + "moji": "🛠" }, "top": { "unicode": "1F51D", "unicode_alternates": [], "name": "top with upwards arrow above", "shortname": ":top:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "words" + "words", + "arrow", + "symbol" ], "moji": "ðŸ”" }, @@ -27318,7 +30591,7 @@ "unicode_alternates": [], "name": "top hat", "shortname": ":tophat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27337,14 +30610,15 @@ "topper", "london", "period piece", - "magic", - "magician" + "magician", + "fashion", + "accessories" ], "moji": "🎩" }, "track_next": { "unicode": "23ED", - "unicode_alternates": "", + "unicode_alternates": [], "name": "black right-pointing double triangle with vertical bar", "shortname": ":track_next:", "category": "symbols", @@ -27358,11 +30632,12 @@ "next track", "sound", "symbol" - ] + ], + "moji": "â" }, "track_previous": { "unicode": "23EE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "black left-pointing double triangle with vertical bar", "shortname": ":track_previous:", "category": "symbols", @@ -27376,28 +30651,34 @@ "previous track", "sound", "symbol" - ] + ], + "moji": "â®" }, "trackball": { "unicode": "1F5B2", "unicode_alternates": [], "name": "trackball", "shortname": ":trackball:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "input", "device", - "gadget" - ] + "gadget", + "electronics", + "work", + "game", + "office" + ], + "moji": "🖲" }, "tractor": { "unicode": "1F69C", "unicode_alternates": [], "name": "tractor", "shortname": ":tractor:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27409,7 +30690,8 @@ "farm", "construction", "machine", - "digger" + "digger", + "transportation" ], "moji": "🚜" }, @@ -27418,18 +30700,19 @@ "unicode_alternates": [], "name": "horizontal traffic light", "shortname": ":traffic_light:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "traffic", "transportation", - "traffic", "light", "stop", "go", "yield", - "horizontal" + "horizontal", + "object", + "stop light" ], "moji": "🚥" }, @@ -27438,20 +30721,24 @@ "unicode_alternates": [], "name": "Tram Car", "shortname": ":train:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "tram", - "rail" - ] + "rail", + "transportation", + "travel", + "train" + ], + "moji": "🚋" }, "train2": { "unicode": "1F686", "unicode_alternates": [], "name": "train", "shortname": ":train2:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27459,66 +30746,35 @@ "vehicle", "train", "locomotive", - "rail" + "rail", + "travel" ], "moji": "🚆" }, - "train_diesel": { - "unicode": "1F6F2", - "unicode_alternates": [], - "name": "diesel locomotive", - "shortname": ":train_diesel:", - "category": "travel_places", - "aliases": [ - ":diesel_locomotive:" - ], - "aliases_ascii": [], - "keywords": [ - "train", - "transportation", - "engine", - "rail" - ] - }, "tram": { "unicode": "1F68A", "unicode_alternates": [], "name": "tram", "shortname": ":tram:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ "transportation", "vehicle", "tram", - "transportation", - "transport" + "transport", + "travel", + "train" ], "moji": "🚊" }, - "triangle_round": { - "unicode": "1F6C6", - "unicode_alternates": [], - "name": "triangle with rounded corners", - "shortname": ":triangle_round:", - "category": "objects_symbols", - "aliases": [ - ":triangle_with_rounded_corners:" - ], - "aliases_ascii": [], - "keywords": [ - "caution", - "warning", - "alert" - ] - }, "triangular_flag_on_post": { "unicode": "1F6A9", "unicode_alternates": [], "name": "triangular flag on post", "shortname": ":triangular_flag_on_post:", - "category": "places", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27527,7 +30783,8 @@ "flag", "golf", "post", - "flagpole" + "flagpole", + "object" ], "moji": "🚩" }, @@ -27543,7 +30800,10 @@ "architect", "math", "sketch", - "stationery" + "stationery", + "object", + "tool", + "office" ], "moji": "ðŸ“" }, @@ -27552,12 +30812,14 @@ "unicode_alternates": [], "name": "trident emblem", "shortname": ":trident:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "spear", - "weapon" + "weapon", + "object", + "symbol" ], "moji": "🔱" }, @@ -27566,7 +30828,7 @@ "unicode_alternates": [], "name": "face with look of triumph", "shortname": ":triumph:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27575,7 +30837,11 @@ "phew", "triumph", "steam", - "breath" + "breath", + "mad", + "smiley", + "angry", + "emotion" ], "moji": "😤" }, @@ -27584,7 +30850,7 @@ "unicode_alternates": [], "name": "trolleybus", "shortname": ":trolleybus:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27595,7 +30861,7 @@ "bus", "city", "transport", - "transportation" + "travel" ], "moji": "🚎" }, @@ -27604,7 +30870,7 @@ "unicode_alternates": [], "name": "trophy", "shortname": ":trophy:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27617,11 +30883,13 @@ "trophy", "first", "show", - "place", - "win", "reward", "achievement", - "medal" + "medal", + "object", + "game", + "perfect", + "parties" ], "moji": "ðŸ†" }, @@ -27630,7 +30898,7 @@ "unicode_alternates": [], "name": "tropical drink", "shortname": ":tropical_drink:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27642,7 +30910,9 @@ "coconut", "pina", "fruit", - "umbrella" + "umbrella", + "cocktail", + "alcohol" ], "moji": "ðŸ¹" }, @@ -27656,7 +30926,8 @@ "aliases_ascii": [], "keywords": [ "animal", - "swim" + "swim", + "wildlife" ], "moji": "ðŸ " }, @@ -27665,7 +30936,7 @@ "unicode_alternates": [], "name": "delivery truck", "shortname": ":truck:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27682,16 +30953,15 @@ "unicode_alternates": [], "name": "trumpet", "shortname": ":trumpet:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ "brass", "music", "trumpet", - "brass", - "music", - "instrument" + "instrument", + "instruments" ], "moji": "🎺" }, @@ -27711,34 +30981,40 @@ "flower", "bulb", "spring", - "easter" + "easter", + "vagina", + "girls night" ], "moji": "🌷" }, - "turkey": { - "unicode": "1F983", - "unicode_alternates": "", - "name": "turkey", - "shortname": ":turkey:", - "category": "nature", - "aliases": [], - "aliases_ascii": [], - "keywords": [] - }, - "turned_ok_hand": { - "unicode": "1F58F", + "tumbler_glass": { + "unicode": "1F943", "unicode_alternates": [], - "name": "turned ok hand sign", - "shortname": ":turned_ok_hand:", - "category": "people", + "name": "tumbler glass", + "shortname": ":tumbler_glass:", + "category": "food", "aliases": [ - ":turned_ok_hand_sign:" + ":whisky:" + ], + "aliases_ascii": [], + "keywords": [ + "booze" ], + "moji": "🥃" + }, + "turkey": { + "unicode": "1F983", + "unicode_alternates": [], + "name": "turkey", + "shortname": ":turkey:", + "category": "nature", + "aliases": [], "aliases_ascii": [], "keywords": [ - "perfect", - "okay" - ] + "wildlife", + "animal" + ], + "moji": "🦃" }, "turtle": { "unicode": "1F422", @@ -27756,15 +31032,15 @@ "tortoise", "chelonian", "reptile", - "slow", "snap", - "steady" + "steady", + "wildlife" ], "moji": "ðŸ¢" }, "tv": { "unicode": "1F4FA", - "unicode_alternates": "", + "unicode_alternates": [], "name": "television", "shortname": ":tv:", "category": "objects", @@ -27778,19 +31054,23 @@ "tv", "entertainment", "object", - "video" - ] + "video", + "electronics" + ], + "moji": "📺" }, "twisted_rightwards_arrows": { "unicode": "1F500", "unicode_alternates": [], "name": "twisted rightwards arrows", "shortname": ":twisted_rightwards_arrows:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "arrow", + "symbol" ], "moji": "🔀" }, @@ -27800,16 +31080,19 @@ "unicode_alternates": [ "0032-FE0F-20E3" ], - "name": "digit two", + "name": "keycap digit two", "shortname": ":two:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "2", "blue-square", "numbers", - "prime" + "prime", + "number", + "math", + "symbol" ] }, "two_hearts": { @@ -27817,7 +31100,7 @@ "unicode_alternates": [], "name": "two hearts", "shortname": ":two_hearts:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27828,8 +31111,8 @@ "heart", "hearts", "two", - "love", - "emotion" + "emotion", + "symbol" ], "moji": "💕" }, @@ -27838,7 +31121,7 @@ "unicode_alternates": [], "name": "two men holding hands", "shortname": ":two_men_holding_hands:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27850,11 +31133,13 @@ "men", "gay", "homosexual", - "friends", "hands", "holding", "team", - "unity" + "unity", + "people", + "sex", + "lgbt" ], "moji": "👬" }, @@ -27863,7 +31148,7 @@ "unicode_alternates": [], "name": "two women holding hands", "shortname": ":two_women_holding_hands:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27875,14 +31160,17 @@ "women", "hands", "girlfriends", - "friends", "sisters", "mother", "daughter", "gay", "homosexual", - "couple", - "unity" + "unity", + "people", + "sex", + "lgbt", + "lesbian", + "girls night" ], "moji": "ðŸ‘" }, @@ -27891,7 +31179,7 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-5272", "shortname": ":u5272:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27899,7 +31187,8 @@ "cut", "divide", "kanji", - "pink" + "pink", + "symbol" ], "moji": "🈹" }, @@ -27908,14 +31197,16 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-5408", "shortname": ":u5408:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "japanese", "join", - "kanji" + "kanji", + "japan", + "symbol" ], "moji": "🈴" }, @@ -27924,12 +31215,13 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-55b6", "shortname": ":u55b6:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "japanese", - "opening hours" + "opening hours", + "symbol" ], "moji": "🈺" }, @@ -27940,14 +31232,15 @@ ], "name": "squared cjk unified ideograph-6307", "shortname": ":u6307:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "green-square", "kanji", - "point" + "point", + "symbol" ], "moji": "🈯" }, @@ -27956,7 +31249,7 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-6708", "shortname": ":u6708:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27964,7 +31257,8 @@ "japanese", "kanji", "moon", - "orange-square" + "orange-square", + "symbol" ], "moji": "🈷" }, @@ -27973,14 +31267,15 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-6709", "shortname": ":u6709:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "have", "kanji", - "orange-square" + "orange-square", + "symbol" ], "moji": "🈶" }, @@ -27989,7 +31284,7 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-6e80", "shortname": ":u6e80:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -27997,7 +31292,9 @@ "full", "japanese", "kanji", - "red-square" + "red-square", + "japan", + "symbol" ], "moji": "🈵" }, @@ -28008,7 +31305,7 @@ ], "name": "squared cjk unified ideograph-7121", "shortname": ":u7121:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28017,7 +31314,8 @@ "kanji", "no", "nothing", - "orange-square" + "orange-square", + "symbol" ], "moji": "🈚" }, @@ -28026,13 +31324,14 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-7533", "shortname": ":u7533:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "japanese", - "kanji" + "kanji", + "symbol" ], "moji": "🈸" }, @@ -28041,7 +31340,7 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-7981", "shortname": ":u7981:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28050,7 +31349,9 @@ "japanese", "kanji", "limit", - "restricted" + "restricted", + "japan", + "symbol" ], "moji": "🈲" }, @@ -28059,14 +31360,15 @@ "unicode_alternates": [], "name": "squared cjk unified ideograph-7a7a", "shortname": ":u7a7a:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "chinese", "empty", "japanese", - "kanji" + "kanji", + "symbol" ], "moji": "🈳" }, @@ -28082,13 +31384,15 @@ "aliases_ascii": [], "keywords": [ "rain", - "weather" + "weather", + "sky", + "cold" ], "moji": "☔" }, "umbrella2": { "unicode": "2602", - "unicode_alternates": "", + "unicode_alternates": [], "name": "umbrella", "shortname": ":umbrella2:", "category": "nature", @@ -28098,15 +31402,19 @@ "clothing", "nature", "rain", - "weather" - ] + "weather", + "object", + "sky", + "cold" + ], + "moji": "☂" }, "unamused": { "unicode": "1F612", "unicode_alternates": [], "name": "unamused face", "shortname": ":unamused:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28120,7 +31428,12 @@ "depressed", "unhappy", "disapprove", - "lame" + "lame", + "sad", + "mad", + "smiley", + "tired", + "emotion" ], "moji": "😒" }, @@ -28129,20 +31442,21 @@ "unicode_alternates": [], "name": "no one under eighteen symbol", "shortname": ":underage:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "18", "drink", "night", - "pub" + "pub", + "symbol" ], "moji": "🔞" }, "unicorn": { "unicode": "1F984", - "unicode_alternates": "", + "unicode_alternates": [], "name": "unicorn face", "shortname": ":unicorn:", "category": "nature", @@ -28150,7 +31464,10 @@ ":unicorn_face:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "animal" + ], + "moji": "🦄" }, "unlock": { "unicode": "1F513", @@ -28162,7 +31479,9 @@ "aliases_ascii": [], "keywords": [ "privacy", - "security" + "security", + "object", + "lock" ], "moji": "🔓" }, @@ -28171,17 +31490,18 @@ "unicode_alternates": [], "name": "squared up with exclamation mark", "shortname": ":up:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "blue-square" + "blue-square", + "symbol" ], "moji": "🆙" }, "upside_down": { "unicode": "1F643", - "unicode_alternates": "", + "unicode_alternates": [], "name": "upside-down face", "shortname": ":upside_down:", "category": "people", @@ -28189,11 +31509,16 @@ ":upside_down_face:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "silly", + "smiley", + "sarcastic" + ], + "moji": "🙃" }, "urn": { "unicode": "26B1", - "unicode_alternates": "", + "unicode_alternates": [], "name": "funeral urn", "shortname": ":urn:", "category": "objects", @@ -28203,8 +31528,11 @@ "aliases_ascii": [], "keywords": [ "death", - "object" - ] + "object", + "dead", + "rip" + ], + "moji": "âš±" }, "v": { "unicode": "270C", @@ -28213,7 +31541,7 @@ ], "name": "victory hand", "shortname": ":v:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28222,13 +31550,19 @@ "ohyeah", "peace", "two", - "victory" + "victory", + "body", + "hands", + "hi", + "thank you", + "diversity", + "girls night" ], "moji": "✌" }, "v_tone1": { "unicode": "270C-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "victory hand tone 1", "shortname": ":v_tone1:", "category": "people", @@ -28240,11 +31574,12 @@ "peace", "two", "v" - ] + ], + "moji": "✌ðŸ»" }, "v_tone2": { "unicode": "270C-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "victory hand tone 2", "shortname": ":v_tone2:", "category": "people", @@ -28256,11 +31591,12 @@ "peace", "two", "v" - ] + ], + "moji": "✌ðŸ¼" }, "v_tone3": { "unicode": "270C-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "victory hand tone 3", "shortname": ":v_tone3:", "category": "people", @@ -28272,11 +31608,12 @@ "peace", "two", "v" - ] + ], + "moji": "✌ðŸ½" }, "v_tone4": { "unicode": "270C-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "victory hand tone 4", "shortname": ":v_tone4:", "category": "people", @@ -28288,11 +31625,12 @@ "peace", "two", "v" - ] + ], + "moji": "✌ðŸ¾" }, "v_tone5": { "unicode": "270C-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "victory hand tone 5", "shortname": ":v_tone5:", "category": "people", @@ -28304,14 +31642,15 @@ "peace", "two", "v" - ] + ], + "moji": "✌ðŸ¿" }, "vertical_traffic_light": { "unicode": "1F6A6", "unicode_alternates": [], "name": "vertical traffic light", "shortname": ":vertical_traffic_light:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28321,7 +31660,9 @@ "stop", "go", "yield", - "vertical" + "vertical", + "object", + "stop light" ], "moji": "🚦" }, @@ -28336,7 +31677,8 @@ "keywords": [ "oldschool", "record", - "video" + "video", + "electronics" ], "moji": "📼" }, @@ -28345,12 +31687,13 @@ "unicode_alternates": [], "name": "vibration mode", "shortname": ":vibration_mode:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "orange-square", - "phone" + "phone", + "symbol" ], "moji": "📳" }, @@ -28364,7 +31707,10 @@ "aliases_ascii": [], "keywords": [ "film", - "record" + "record", + "electronics", + "camera", + "movie" ], "moji": "📹" }, @@ -28373,7 +31719,7 @@ "unicode_alternates": [], "name": "video game", "shortname": ":video_game:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28383,11 +31729,11 @@ "play", "video", "game", - "console", - "controller", "nintendo", "xbox", - "playstation" + "playstation", + "electronics", + "boys night" ], "moji": "🎮" }, @@ -28396,7 +31742,7 @@ "unicode_alternates": [], "name": "violin", "shortname": ":violin:", - "category": "objects", + "category": "activity", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28404,8 +31750,8 @@ "music", "violin", "fiddle", - "music", - "instrument" + "instruments", + "sarcastic" ], "moji": "🎻" }, @@ -28416,7 +31762,7 @@ ], "name": "virgo", "shortname": ":virgo:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28428,9 +31774,8 @@ "constellation", "stars", "zodiac", - "sign", - "zodiac", - "horoscope" + "horoscope", + "symbol" ], "moji": "â™" }, @@ -28439,7 +31784,7 @@ "unicode_alternates": [], "name": "volcano", "shortname": ":volcano:", - "category": "nature", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28449,31 +31794,40 @@ "lava", "magma", "hot", - "explode" + "explode", + "places", + "tropical" ], "moji": "🌋" }, "volleyball": { "unicode": "1F3D0", - "unicode_alternates": "", + "unicode_alternates": [], "name": "volleyball", "shortname": ":volleyball:", "category": "activity", "aliases": [], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "game", + "ball", + "sport", + "volleyball" + ], + "moji": "ðŸ" }, "vs": { "unicode": "1F19A", "unicode_alternates": [], "name": "squared vs", "shortname": ":vs:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "orange-square", - "words" + "words", + "symbol" ], "moji": "🆚" }, @@ -28493,12 +31847,17 @@ "leonard", "nimoy", "star trek", - "live long" - ] + "live long", + "body", + "hands", + "hi", + "diversity" + ], + "moji": "🖖" }, "vulcan_tone1": { "unicode": "1F596-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with part between middle and ring fingers tone 1", "shortname": ":vulcan_tone1:", "category": "people", @@ -28513,11 +31872,12 @@ "nimoy", "star trek", "live long" - ] + ], + "moji": "🖖ðŸ»" }, "vulcan_tone2": { "unicode": "1F596-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with part between middle and ring fingers tone 2", "shortname": ":vulcan_tone2:", "category": "people", @@ -28532,11 +31892,12 @@ "nimoy", "star trek", "live long" - ] + ], + "moji": "🖖ðŸ¼" }, "vulcan_tone3": { "unicode": "1F596-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with part between middle and ring fingers tone 3", "shortname": ":vulcan_tone3:", "category": "people", @@ -28551,11 +31912,12 @@ "nimoy", "star trek", "live long" - ] + ], + "moji": "🖖ðŸ½" }, "vulcan_tone4": { "unicode": "1F596-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with part between middle and ring fingers tone 4", "shortname": ":vulcan_tone4:", "category": "people", @@ -28570,11 +31932,12 @@ "nimoy", "star trek", "live long" - ] + ], + "moji": "🖖ðŸ¾" }, "vulcan_tone5": { "unicode": "1F596-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "raised hand with part between middle and ring fingers tone 5", "shortname": ":vulcan_tone5:", "category": "people", @@ -28589,14 +31952,15 @@ "nimoy", "star trek", "live long" - ] + ], + "moji": "🖖ðŸ¿" }, "walking": { "unicode": "1F6B6", "unicode_alternates": [], "name": "pedestrian", "shortname": ":walking:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28607,13 +31971,16 @@ "stroll", "stride", "foot", - "feet" + "feet", + "people", + "men", + "diversity" ], "moji": "🚶" }, "walking_tone1": { "unicode": "1F6B6-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "pedestrian tone 1", "shortname": ":walking_tone1:", "category": "people", @@ -28626,11 +31993,12 @@ "stride", "hiking", "hike" - ] + ], + "moji": "🚶ðŸ»" }, "walking_tone2": { "unicode": "1F6B6-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "pedestrian tone 2", "shortname": ":walking_tone2:", "category": "people", @@ -28643,11 +32011,12 @@ "stride", "hiking", "hike" - ] + ], + "moji": "🚶ðŸ¼" }, "walking_tone3": { "unicode": "1F6B6-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "pedestrian tone 3", "shortname": ":walking_tone3:", "category": "people", @@ -28660,11 +32029,12 @@ "stride", "hiking", "hike" - ] + ], + "moji": "🚶ðŸ½" }, "walking_tone4": { "unicode": "1F6B6-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "pedestrian tone 4", "shortname": ":walking_tone4:", "category": "people", @@ -28677,11 +32047,12 @@ "stride", "hiking", "hike" - ] + ], + "moji": "🚶ðŸ¾" }, "walking_tone5": { "unicode": "1F6B6-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "pedestrian tone 5", "shortname": ":walking_tone5:", "category": "people", @@ -28694,7 +32065,8 @@ "stride", "hiking", "hike" - ] + ], + "moji": "🚶ðŸ¿" }, "waning_crescent_moon": { "unicode": "1F318", @@ -28712,7 +32084,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌘" }, @@ -28732,7 +32105,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌖" }, @@ -28743,12 +32117,14 @@ ], "name": "warning sign", "shortname": ":warning:", - "category": "places", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "exclamation", - "wip" + "wip", + "symbol", + "punctuation" ], "moji": "âš " }, @@ -28757,14 +32133,17 @@ "unicode_alternates": [], "name": "wastebasket", "shortname": ":wastebasket:", - "category": "objects_symbols", + "category": "objects", "aliases": [], "aliases_ascii": [], "keywords": [ "trash", "garbage", - "dispose" - ] + "dispose", + "object", + "work" + ], + "moji": "🗑" }, "watch": { "unicode": "231A", @@ -28778,7 +32157,8 @@ "aliases_ascii": [], "keywords": [ "accessories", - "time" + "time", + "electronics" ], "moji": "⌚" }, @@ -28800,16 +32180,83 @@ "asia", "bovine", "milk", - "dairy" + "dairy", + "wildlife" ], "moji": "ðŸƒ" }, + "water_polo": { + "unicode": "1F93D", + "unicode_alternates": [], + "name": "water polo", + "shortname": ":water_polo:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤽" + }, + "water_polo_tone1": { + "unicode": "1F93D-1F3FB", + "unicode_alternates": [], + "name": "water polo tone 1", + "shortname": ":water_polo_tone1:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤽ðŸ»" + }, + "water_polo_tone2": { + "unicode": "1F93D-1F3FC", + "unicode_alternates": [], + "name": "water polo tone 2", + "shortname": ":water_polo_tone2:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤽ðŸ¼" + }, + "water_polo_tone3": { + "unicode": "1F93D-1F3FD", + "unicode_alternates": [], + "name": "water polo tone 3", + "shortname": ":water_polo_tone3:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤽ðŸ½" + }, + "water_polo_tone4": { + "unicode": "1F93D-1F3FE", + "unicode_alternates": [], + "name": "water polo tone 4", + "shortname": ":water_polo_tone4:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤽ðŸ¾" + }, + "water_polo_tone5": { + "unicode": "1F93D-1F3FF", + "unicode_alternates": [], + "name": "water polo tone 5", + "shortname": ":water_polo_tone5:", + "category": "activity", + "aliases": [], + "aliases_ascii": [], + "keywords": [], + "moji": "🤽ðŸ¿" + }, "watermelon": { "unicode": "1F349", "unicode_alternates": [], "name": "watermelon", "shortname": ":watermelon:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28818,7 +32265,6 @@ "melon", "watermelon", "summer", - "fruit", "large" ], "moji": "ðŸ‰" @@ -28828,7 +32274,7 @@ "unicode_alternates": [], "name": "waving hand sign", "shortname": ":wave:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28836,13 +32282,16 @@ "gesture", "goodbye", "hands", - "solong" + "solong", + "body", + "hi", + "diversity" ], "moji": "👋" }, "wave_tone1": { "unicode": "1F44B-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "waving hand sign tone 1", "shortname": ":wave_tone1:", "category": "people", @@ -28855,11 +32304,12 @@ "solong", "hi", "wave" - ] + ], + "moji": "👋ðŸ»" }, "wave_tone2": { "unicode": "1F44B-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "waving hand sign tone 2", "shortname": ":wave_tone2:", "category": "people", @@ -28872,11 +32322,12 @@ "solong", "hi", "wave" - ] + ], + "moji": "👋ðŸ¼" }, "wave_tone3": { "unicode": "1F44B-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "waving hand sign tone 3", "shortname": ":wave_tone3:", "category": "people", @@ -28889,11 +32340,12 @@ "solong", "hi", "wave" - ] + ], + "moji": "👋ðŸ½" }, "wave_tone4": { "unicode": "1F44B-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "waving hand sign tone 4", "shortname": ":wave_tone4:", "category": "people", @@ -28906,11 +32358,12 @@ "solong", "hi", "wave" - ] + ], + "moji": "👋ðŸ¾" }, "wave_tone5": { "unicode": "1F44B-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "waving hand sign tone 5", "shortname": ":wave_tone5:", "category": "people", @@ -28923,19 +32376,21 @@ "solong", "hi", "wave" - ] + ], + "moji": "👋ðŸ¿" }, "wavy_dash": { "unicode": "3030", "unicode_alternates": [], "name": "wavy dash", "shortname": ":wavy_dash:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "draw", - "line" + "line", + "symbol" ], "moji": "〰" }, @@ -28954,7 +32409,8 @@ "sky", "night", "cheese", - "phase" + "phase", + "space" ], "moji": "🌒" }, @@ -28967,7 +32423,10 @@ "aliases": [], "aliases_ascii": [], "keywords": [ - "nature" + "nature", + "space", + "sky", + "moon" ], "moji": "🌔" }, @@ -28976,7 +32435,7 @@ "unicode_alternates": [], "name": "water closet", "shortname": ":wc:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -28985,13 +32444,13 @@ "toilet", "water", "closet", - "toilet", "bathroom", "throne", "porcelain", "waste", "flush", - "plumbing" + "plumbing", + "symbol" ], "moji": "🚾" }, @@ -29000,7 +32459,7 @@ "unicode_alternates": [], "name": "weary face", "shortname": ":weary:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29010,13 +32469,14 @@ "sleepy", "tired", "weary", - "sleepy", - "tired", "tiredness", "study", "finals", "school", - "exhausted" + "exhausted", + "smiley", + "stressed", + "emotion" ], "moji": "😩" }, @@ -29025,7 +32485,7 @@ "unicode_alternates": [], "name": "wedding", "shortname": ":wedding:", - "category": "places", + "category": "travel", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29035,7 +32495,11 @@ "groom", "like", "love", - "marriage" + "marriage", + "places", + "wedding", + "building", + "parties" ], "moji": "💒" }, @@ -29051,7 +32515,10 @@ "animal", "nature", "ocean", - "sea" + "sea", + "wildlife", + "tropical", + "whales" ], "moji": "ðŸ³" }, @@ -29073,13 +32540,16 @@ "bloated", "fat", "large", - "massive" + "massive", + "wildlife", + "tropical", + "whales" ], "moji": "ðŸ‹" }, "wheel_of_dharma": { "unicode": "2638", - "unicode_alternates": "", + "unicode_alternates": [], "name": "wheel of dharma", "shortname": ":wheel_of_dharma:", "category": "symbols", @@ -29089,7 +32559,8 @@ "buddhist", "religion", "symbol" - ] + ], + "moji": "☸" }, "wheelchair": { "unicode": "267F", @@ -29098,12 +32569,13 @@ ], "name": "wheelchair symbol", "shortname": ":wheelchair:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", - "disabled" + "disabled", + "symbol" ], "moji": "♿" }, @@ -29112,13 +32584,14 @@ "unicode_alternates": [], "name": "white heavy check mark", "shortname": ":white_check_mark:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "agree", "green-square", - "ok" + "ok", + "symbol" ], "moji": "✅" }, @@ -29129,11 +32602,14 @@ ], "name": "medium white circle", "shortname": ":white_circle:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "circle" ], "moji": "⚪" }, @@ -29142,7 +32618,7 @@ "unicode_alternates": [], "name": "white flower", "shortname": ":white_flower:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29158,7 +32634,8 @@ "homework", "student", "assignment", - "praise" + "praise", + "symbol" ], "moji": "💮" }, @@ -29169,11 +32646,14 @@ ], "name": "white large square", "shortname": ":white_large_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "square" ], "moji": "⬜" }, @@ -29184,11 +32664,14 @@ ], "name": "white medium small square", "shortname": ":white_medium_small_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "square" ], "moji": "â—½" }, @@ -29199,11 +32682,14 @@ ], "name": "white medium square", "shortname": ":white_medium_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "square" ], "moji": "â—»" }, @@ -29214,11 +32700,14 @@ ], "name": "white small square", "shortname": ":white_small_square:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "square" ], "moji": "â–«" }, @@ -29227,17 +32716,20 @@ "unicode_alternates": [], "name": "white square button", "shortname": ":white_square_button:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ - "shape" + "shape", + "shapes", + "symbol", + "square" ], "moji": "🔳" }, "white_sun_cloud": { "unicode": "1F325", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white sun behind cloud", "shortname": ":white_sun_cloud:", "category": "nature", @@ -29247,12 +32739,17 @@ "aliases_ascii": [], "keywords": [ "nature", - "weather" - ] + "weather", + "sky", + "cloud", + "cold", + "sun" + ], + "moji": "🌥" }, "white_sun_rain_cloud": { "unicode": "1F326", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white sun behind cloud with rain", "shortname": ":white_sun_rain_cloud:", "category": "nature", @@ -29262,12 +32759,18 @@ "aliases_ascii": [], "keywords": [ "nature", - "weather" - ] + "weather", + "sky", + "cloud", + "cold", + "rain", + "sun" + ], + "moji": "🌦" }, "white_sun_small_cloud": { "unicode": "1F324", - "unicode_alternates": "", + "unicode_alternates": [], "name": "white sun with small cloud", "shortname": ":white_sun_small_cloud:", "category": "nature", @@ -29277,8 +32780,25 @@ "aliases_ascii": [], "keywords": [ "nature", - "weather" - ] + "weather", + "sky", + "cloud", + "sun" + ], + "moji": "🌤" + }, + "wilted_rose": { + "unicode": "1F940", + "unicode_alternates": [], + "name": "wilted flower", + "shortname": ":wilted_rose:", + "category": "nature", + "aliases": [ + ":wilted_flower:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🥀" }, "wind_blowing_face": { "unicode": "1F32C", @@ -29290,8 +32810,11 @@ "aliases_ascii": [], "keywords": [ "mother", - "nature" - ] + "nature", + "weather", + "cold" + ], + "moji": "🌬" }, "wind_chime": { "unicode": "1F390", @@ -29314,7 +32837,9 @@ "soothing", "protective", "spiritual", - "sound" + "sound", + "object", + "japan" ], "moji": "ðŸŽ" }, @@ -29323,7 +32848,7 @@ "unicode_alternates": [], "name": "wine glass", "shortname": ":wine_glass:", - "category": "objects", + "category": "food", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29338,7 +32863,10 @@ "grapes", "tasting", "wine", - "winery" + "winery", + "italian", + "girls night", + "parties" ], "moji": "ðŸ·" }, @@ -29347,7 +32875,7 @@ "unicode_alternates": [], "name": "winking face", "shortname": ":wink:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [ ";)", @@ -29367,7 +32895,10 @@ "wink", "winking", "friendly", - "joke" + "joke", + "silly", + "smiley", + "emotion" ], "moji": "😉" }, @@ -29381,7 +32912,9 @@ "aliases_ascii": [], "keywords": [ "animal", - "nature" + "nature", + "wildlife", + "roar" ], "moji": "ðŸº" }, @@ -29390,18 +32923,25 @@ "unicode_alternates": [], "name": "woman", "shortname": ":woman:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "female", - "girls" + "girls", + "people", + "women", + "sex", + "diversity", + "feminist", + "selfie", + "girls night" ], "moji": "👩" }, "woman_tone1": { "unicode": "1F469-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "woman tone 1", "shortname": ":woman_tone1:", "category": "people", @@ -29411,11 +32951,12 @@ "female", "girl", "lady" - ] + ], + "moji": "👩ðŸ»" }, "woman_tone2": { "unicode": "1F469-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "woman tone 2", "shortname": ":woman_tone2:", "category": "people", @@ -29425,11 +32966,12 @@ "female", "girl", "lady" - ] + ], + "moji": "👩ðŸ¼" }, "woman_tone3": { "unicode": "1F469-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "woman tone 3", "shortname": ":woman_tone3:", "category": "people", @@ -29439,11 +32981,12 @@ "female", "girl", "lady" - ] + ], + "moji": "👩ðŸ½" }, "woman_tone4": { "unicode": "1F469-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "woman tone 4", "shortname": ":woman_tone4:", "category": "people", @@ -29453,11 +32996,12 @@ "female", "girl", "lady" - ] + ], + "moji": "👩ðŸ¾" }, "woman_tone5": { "unicode": "1F469-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "woman tone 5", "shortname": ":woman_tone5:", "category": "people", @@ -29467,14 +33011,15 @@ "female", "girl", "lady" - ] + ], + "moji": "👩ðŸ¿" }, "womans_clothes": { "unicode": "1F45A", "unicode_alternates": [], "name": "womans clothes", "shortname": ":womans_clothes:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29490,7 +33035,8 @@ "shopping", "shop", "dressing", - "dressed" + "dressed", + "women" ], "moji": "👚" }, @@ -29499,13 +33045,14 @@ "unicode_alternates": [], "name": "womans hat", "shortname": ":womans_hat:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "accessories", "fashion", - "female" + "female", + "women" ], "moji": "👒" }, @@ -29514,7 +33061,7 @@ "unicode_alternates": [], "name": "womens symbol", "shortname": ":womens:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29525,7 +33072,8 @@ "sign", "girl", "female", - "avatar" + "avatar", + "symbol" ], "moji": "🚺" }, @@ -29534,7 +33082,7 @@ "unicode_alternates": [], "name": "worried face", "shortname": ":worried:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29544,8 +33092,10 @@ "worried", "anxious", "distressed", - "nervous", - "tense" + "tense", + "sad", + "smiley", + "emotion" ], "moji": "😟" }, @@ -29560,30 +33110,111 @@ "keywords": [ "diy", "ikea", - "tools" + "tools", + "object", + "tool" ], "moji": "🔧" }, - "writing_hand": { - "unicode": "1F58E", + "wrestlers": { + "unicode": "1F93C", "unicode_alternates": [], - "name": "left writing hand", - "shortname": ":writing_hand:", - "category": "people", + "name": "wrestlers", + "shortname": ":wrestlers:", + "category": "activity", + "aliases": [ + ":wrestling:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤼" + }, + "wrestlers_tone1": { + "unicode": "1F93C-1F3FB", + "unicode_alternates": [], + "name": "wrestlers tone 1", + "shortname": ":wrestlers_tone1:", + "category": "activity", + "aliases": [ + ":wrestling_tone1:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤼ðŸ»" + }, + "wrestlers_tone2": { + "unicode": "1F93C-1F3FC", + "unicode_alternates": [], + "name": "wrestlers tone 2", + "shortname": ":wrestlers_tone2:", + "category": "activity", + "aliases": [ + ":wrestling_tone2:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤼ðŸ¼" + }, + "wrestlers_tone3": { + "unicode": "1F93C-1F3FD", + "unicode_alternates": [], + "name": "wrestlers tone 3", + "shortname": ":wrestlers_tone3:", + "category": "activity", + "aliases": [ + ":wrestling_tone3:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤼ðŸ½" + }, + "wrestlers_tone4": { + "unicode": "1F93C-1F3FE", + "unicode_alternates": [], + "name": "wrestlers tone 4", + "shortname": ":wrestlers_tone4:", + "category": "activity", + "aliases": [ + ":wrestling_tone4:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤼ðŸ¾" + }, + "wrestlers_tone5": { + "unicode": "1F93C-1F3FF", + "unicode_alternates": [], + "name": "wrestlers tone 5", + "shortname": ":wrestlers_tone5:", + "category": "activity", "aliases": [ - ":left_writing_hand:" + ":wrestling_tone5:" + ], + "aliases_ascii": [], + "keywords": [], + "moji": "🤼ðŸ¿" + }, + "writing_hand": { + "unicode": "270D", + "unicode_alternates": [ + "270D-FE0F" ], + "name": "writing hand", + "shortname": ":writing_hand:", + "category": "people", + "aliases": [], "aliases_ascii": [], "keywords": [ + "body", + "hands", "write", - "sign", - "signature", - "draw" - ] + "diversity" + ], + "moji": "âœ" }, "writing_hand_tone1": { "unicode": "270D-1F3FB", - "unicode_alternates": "", + "unicode_alternates": [], "name": "writing hand tone 1", "shortname": ":writing_hand_tone1:", "category": "people", @@ -29594,11 +33225,12 @@ "sign", "signature", "draw" - ] + ], + "moji": "âœðŸ»" }, "writing_hand_tone2": { "unicode": "270D-1F3FC", - "unicode_alternates": "", + "unicode_alternates": [], "name": "writing hand tone 2", "shortname": ":writing_hand_tone2:", "category": "people", @@ -29609,11 +33241,12 @@ "sign", "signature", "draw" - ] + ], + "moji": "âœðŸ¼" }, "writing_hand_tone3": { "unicode": "270D-1F3FD", - "unicode_alternates": "", + "unicode_alternates": [], "name": "writing hand tone 3", "shortname": ":writing_hand_tone3:", "category": "people", @@ -29624,11 +33257,12 @@ "sign", "signature", "draw" - ] + ], + "moji": "âœðŸ½" }, "writing_hand_tone4": { "unicode": "270D-1F3FE", - "unicode_alternates": "", + "unicode_alternates": [], "name": "writing hand tone 4", "shortname": ":writing_hand_tone4:", "category": "people", @@ -29639,11 +33273,12 @@ "sign", "signature", "draw" - ] + ], + "moji": "âœðŸ¾" }, "writing_hand_tone5": { "unicode": "270D-1F3FF", - "unicode_alternates": "", + "unicode_alternates": [], "name": "writing hand tone 5", "shortname": ":writing_hand_tone5:", "category": "people", @@ -29654,20 +33289,23 @@ "sign", "signature", "draw" - ] + ], + "moji": "âœðŸ¿" }, "x": { "unicode": "274C", "unicode_alternates": [], "name": "cross mark", "shortname": ":x:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "delete", "no", - "remove" + "remove", + "symbol", + "sol" ], "moji": "âŒ" }, @@ -29676,7 +33314,7 @@ "unicode_alternates": [], "name": "yellow heart", "shortname": ":yellow_heart:", - "category": "emoticons", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29687,7 +33325,6 @@ "yellow", "gold", "heart", - "love", "friendship", "happy", "happiness", @@ -29696,7 +33333,8 @@ "respectful", "honest", "caring", - "selfless" + "selfless", + "symbol" ], "moji": "💛" }, @@ -29715,10 +33353,7 @@ "money", "yen", "japan", - "japanese", "banknote", - "money", - "currency", "paper", "cash", "bill" @@ -29727,7 +33362,7 @@ }, "yin_yang": { "unicode": "262F", - "unicode_alternates": "", + "unicode_alternates": [], "name": "yin yang", "shortname": ":yin_yang:", "category": "symbols", @@ -29739,14 +33374,15 @@ "symbol", "tao", "taoist" - ] + ], + "moji": "☯" }, "yum": { "unicode": "1F60B", "unicode_alternates": [], "name": "face savouring delicious food", "shortname": ":yum:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ @@ -29762,7 +33398,12 @@ "yummy", "yum", "tasty", - "savory" + "savory", + "silly", + "smiley", + "emotion", + "sarcastic", + "good" ], "moji": "😋" }, @@ -29779,7 +33420,9 @@ "keywords": [ "lightning bolt", "thunder", - "weather" + "weather", + "sky", + "diarrhea" ], "moji": "âš¡" }, @@ -29789,20 +33432,23 @@ "unicode_alternates": [ "0030-FE0F-20E3" ], - "name": "digit zero", + "name": "keycap digit zero", "shortname": ":zero:", - "category": "other", + "category": "symbols", "aliases": [], "aliases_ascii": [], "keywords": [ "blue-square", "null", - "numbers" + "numbers", + "number", + "math", + "symbol" ] }, "zipper_mouth": { "unicode": "1F910", - "unicode_alternates": "", + "unicode_alternates": [], "name": "zipper-mouth face", "shortname": ":zipper_mouth:", "category": "people", @@ -29810,19 +33456,24 @@ ":zipper_mouth_face:" ], "aliases_ascii": [], - "keywords": [] + "keywords": [ + "mad", + "smiley" + ], + "moji": "ðŸ¤" }, "zzz": { "unicode": "1F4A4", "unicode_alternates": [], "name": "sleeping symbol", "shortname": ":zzz:", - "category": "emoticons", + "category": "people", "aliases": [], "aliases_ascii": [], "keywords": [ "sleepy", - "tired" + "tired", + "goodnight" ], "moji": "💤" } diff --git a/lib/api/branches.rb b/lib/api/branches.rb index d467eb9d4742c31a7a07c4783a860d3cc18b85b3..66b853eb342cb37244be0d442062ca4525a3052e 100644 --- a/lib/api/branches.rb +++ b/lib/api/branches.rb @@ -15,7 +15,8 @@ module API # GET /projects/:id/repository/branches get ":id/repository/branches" do branches = user_project.repository.branches.sort_by(&:name) - present branches, with: Entities::RepoObject, project: user_project + + present branches, with: Entities::RepoBranch, project: user_project end # Get a single branch @@ -28,7 +29,8 @@ module API get ':id/repository/branches/:branch', requirements: { branch: /.+/ } do @branch = user_project.repository.branches.find { |item| item.name == params[:branch] } not_found!("Branch") unless @branch - present @branch, with: Entities::RepoObject, project: user_project + + present @branch, with: Entities::RepoBranch, project: user_project end # Protect a single branch @@ -36,6 +38,8 @@ module API # Parameters: # id (required) - The ID of a project # branch (required) - The name of the branch + # developers_can_push (optional) - Flag if developers can push to that branch + # developers_can_merge (optional) - Flag if developers can merge to that branch # Example Request: # PUT /projects/:id/repository/branches/:branch/protect put ':id/repository/branches/:branch/protect', @@ -43,11 +47,22 @@ module API authorize_admin_project @branch = user_project.repository.find_branch(params[:branch]) - not_found!("Branch") unless @branch + not_found!('Branch') unless @branch protected_branch = user_project.protected_branches.find_by(name: @branch.name) - user_project.protected_branches.create(name: @branch.name) unless protected_branch + developers_can_push = to_boolean(params[:developers_can_push]) + developers_can_merge = to_boolean(params[:developers_can_merge]) + + if protected_branch + protected_branch.developers_can_push = developers_can_push unless developers_can_push.nil? + protected_branch.developers_can_merge = developers_can_merge unless developers_can_merge.nil? + protected_branch.save + else + user_project.protected_branches.create(name: @branch.name, + developers_can_push: developers_can_push || false, + developers_can_merge: developers_can_merge || false) + end - present @branch, with: Entities::RepoObject, project: user_project + present @branch, with: Entities::RepoBranch, project: user_project end # Unprotect a single branch @@ -66,7 +81,7 @@ module API protected_branch = user_project.protected_branches.find_by(name: @branch.name) protected_branch.destroy if protected_branch - present @branch, with: Entities::RepoObject, project: user_project + present @branch, with: Entities::RepoBranch, project: user_project end # Create branch @@ -84,7 +99,7 @@ module API if result[:status] == :success present result[:branch], - with: Entities::RepoObject, + with: Entities::RepoBranch, project: user_project else render_api_error!(result[:message], 400) diff --git a/lib/api/commit_statuses.rb b/lib/api/commit_statuses.rb index 323a70868900afd1277eada973162f2a70cb8375..acb4812b5cf5ab22d65e5da017c2ed08e912cf30 100644 --- a/lib/api/commit_statuses.rb +++ b/lib/api/commit_statuses.rb @@ -64,7 +64,7 @@ module API ref = branches.first end - pipeline = @project.ensure_pipeline(commit.sha, ref) + pipeline = @project.ensure_pipeline(commit.sha, ref, current_user) name = params[:name] || params[:context] status = GenericCommitStatus.running_or_pending.find_by(pipeline: pipeline, name: name, ref: params[:ref]) diff --git a/lib/api/entities.rb b/lib/api/entities.rb index 8e03c08f47b80fbbdb03c32673c866403988909b..d7e745824599f2fd87e47e36c17319d9dad70f71 100644 --- a/lib/api/entities.rb +++ b/lib/api/entities.rb @@ -114,21 +114,23 @@ module API end end - class RepoObject < Grape::Entity + class RepoBranch < Grape::Entity expose :name - expose :commit do |repo_obj, options| - if repo_obj.respond_to?(:commit) - repo_obj.commit - elsif options[:project] - options[:project].repository.commit(repo_obj.target) - end + expose :commit do |repo_branch, options| + options[:project].repository.commit(repo_branch.target) end - expose :protected do |repo, options| - if options[:project] - options[:project].protected_branch? repo.name - end + expose :protected do |repo_branch, options| + options[:project].protected_branch? repo_branch.name + end + + expose :developers_can_push do |repo_branch, options| + options[:project].developers_can_push_to_protected_branch? repo_branch.name + end + + expose :developers_can_merge do |repo_branch, options| + options[:project].developers_can_merge_to_protected_branch? repo_branch.name end end @@ -187,6 +189,7 @@ module API end expose :user_notes_count expose :upvotes, :downvotes + expose :due_date end class ExternalIssue < Grape::Entity @@ -424,27 +427,14 @@ module API end class RepoTag < Grape::Entity - expose :name - expose :message do |repo_obj, _options| - if repo_obj.respond_to?(:message) - repo_obj.message - else - nil - end - end + expose :name, :message - expose :commit do |repo_obj, options| - if repo_obj.respond_to?(:commit) - repo_obj.commit - elsif options[:project] - options[:project].repository.commit(repo_obj.target) - end + expose :commit do |repo_tag, options| + options[:project].repository.commit(repo_tag.target) end - expose :release, using: Entities::Release do |repo_obj, options| - if options[:project] - options[:project].releases.find_by(tag: repo_obj.name) - end + expose :release, using: Entities::Release do |repo_tag, options| + options[:project].releases.find_by(tag: repo_tag.name) end end diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb index 77e407b54c54f95920fb8b22a4375a4bcc06eb8b..d6e4eb2afd77d818bc3139fed5827c6267d27387 100644 --- a/lib/api/helpers.rb +++ b/lib/api/helpers.rb @@ -9,6 +9,13 @@ module API [ true, 1, '1', 't', 'T', 'true', 'TRUE', 'on', 'ON' ].include?(value) end + def to_boolean(value) + return true if value =~ /^(true|t|yes|y|1|on)$/i + return false if value =~ /^(false|f|no|n|0|off)$/i + + nil + end + def find_user_by_private_token token_string = (params[PRIVATE_TOKEN_PARAM] || env[PRIVATE_TOKEN_HEADER]).to_s User.find_by_authentication_token(token_string) || User.find_by_personal_access_token(token_string) @@ -17,7 +24,7 @@ module API def current_user @current_user ||= (find_user_by_private_token || doorkeeper_guard) - unless @current_user && Gitlab::UserAccess.allowed?(@current_user) + unless @current_user && Gitlab::UserAccess.new(@current_user).allowed? return nil end diff --git a/lib/api/issues.rb b/lib/api/issues.rb index 8a03a41e9c592345685ce44e96375a82923387f6..c588103e517eb05894ba94b7d0d9292786004a09 100644 --- a/lib/api/issues.rb +++ b/lib/api/issues.rb @@ -152,12 +152,13 @@ module API # milestone_id (optional) - The ID of a milestone to assign issue # labels (optional) - The labels of an issue # created_at (optional) - Date time string, ISO 8601 formatted + # due_date (optional) - Date time string in the format YEAR-MONTH-DAY # Example Request: # POST /projects/:id/issues - post ":id/issues" do + post ':id/issues' do required_attributes! [:title] - keys = [:title, :description, :assignee_id, :milestone_id] + keys = [:title, :description, :assignee_id, :milestone_id, :due_date] keys << :created_at if current_user.admin? || user_project.owner == current_user attrs = attributes_for_keys(keys) @@ -201,12 +202,13 @@ module API # labels (optional) - The labels of an issue # state_event (optional) - The state event of an issue (close|reopen) # updated_at (optional) - Date time string, ISO 8601 formatted + # due_date (optional) - Date time string in the format YEAR-MONTH-DAY # Example Request: # PUT /projects/:id/issues/:issue_id - put ":id/issues/:issue_id" do + put ':id/issues/:issue_id' do issue = user_project.issues.find(params[:issue_id]) authorize! :update_issue, issue - keys = [:title, :description, :assignee_id, :milestone_id, :state_event] + keys = [:title, :description, :assignee_id, :milestone_id, :state_event, :due_date] keys << :updated_at if current_user.admin? || user_project.owner == current_user attrs = attributes_for_keys(keys) diff --git a/lib/api/todos.rb b/lib/api/todos.rb index 2a6bfa98ca4c666c002dcf12fd2fecfbd4252f58..26c24c3baffcf67b71630651c5f80cfefd9bfe2d 100644 --- a/lib/api/todos.rb +++ b/lib/api/todos.rb @@ -75,7 +75,7 @@ module API todos = find_todos todos.each(&:done) - present paginate(Kaminari.paginate_array(todos)), with: Entities::Todo, current_user: current_user + todos.length end end end diff --git a/lib/banzai/filter/autolink_filter.rb b/lib/banzai/filter/autolink_filter.rb index fac7dad324333593f0f745f133224989b77db460..9ed45707515c16a2d0baa4f09777f3876c7832e6 100644 --- a/lib/banzai/filter/autolink_filter.rb +++ b/lib/banzai/filter/autolink_filter.rb @@ -56,6 +56,8 @@ module Banzai # period (e.g., http://localhost:3000/) rinku = Rinku.auto_link(html, :urls, options, IGNORE_PARENTS.to_a, 1) + return if rinku == html + # Rinku returns a String, so parse it back to a Nokogiri::XML::Document # for further processing. @doc = parse_html(rinku) diff --git a/lib/ci/gitlab_ci_yaml_processor.rb b/lib/ci/gitlab_ci_yaml_processor.rb index aa2f7743a5ef0199edc4e303e87302ea2bd153e4..013813ef00b2aa512f0bdd953a02edc3cd19362d 100644 --- a/lib/ci/gitlab_ci_yaml_processor.rb +++ b/lib/ci/gitlab_ci_yaml_processor.rb @@ -19,28 +19,62 @@ module Ci raise ValidationError, e.message end - def builds_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil) - builds.select do |build| - build[:stage] == stage && - process?(build[:only], build[:except], ref, tag, trigger_request) + def jobs_for_ref(ref, tag = false, trigger_request = nil) + @jobs.select do |_, job| + process?(job[:only], job[:except], ref, tag, trigger_request) end end - def builds - @jobs.map do |name, job| - build_job(name, job) + def jobs_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil) + jobs_for_ref(ref, tag, trigger_request).select do |_, job| + job[:stage] == stage end end - def global_variables - @variables + def builds_for_ref(ref, tag = false, trigger_request = nil) + jobs_for_ref(ref, tag, trigger_request).map do |name, _| + build_attributes(name) + end end - def job_variables(name) - job = @jobs[name.to_sym] - return [] unless job + def builds_for_stage_and_ref(stage, ref, tag = false, trigger_request = nil) + jobs_for_stage_and_ref(stage, ref, tag, trigger_request).map do |name, _| + build_attributes(name) + end + end - job[:variables] || [] + def builds + @jobs.map do |name, _| + build_attributes(name) + end + end + + def build_attributes(name) + job = @jobs[name.to_sym] || {} + { + stage_idx: @stages.index(job[:stage]), + stage: job[:stage], + ## + # Refactoring note: + # - before script behaves differently than after script + # - after script returns an array of commands + # - before script should be a concatenated command + commands: [job[:before_script] || @before_script, job[:script]].flatten.compact.join("\n"), + tag_list: job[:tags] || [], + name: job[:name], + allow_failure: job[:allow_failure] || false, + when: job[:when] || 'on_success', + environment: job[:environment], + yaml_variables: yaml_variables(name), + options: { + image: job[:image] || @image, + services: job[:services] || @services, + artifacts: job[:artifacts], + cache: job[:cache] || @cache, + dependencies: job[:dependencies], + after_script: job[:after_script] || @after_script, + }.compact + } end private @@ -67,27 +101,22 @@ module Ci end end - def build_job(name, job) - { - stage_idx: @stages.index(job[:stage]), - stage: job[:stage], - commands: [job[:before_script] || @before_script, job[:script]].flatten.compact.join("\n"), - tag_list: job[:tags] || [], - name: job[:name], - only: job[:only], - except: job[:except], - allow_failure: job[:allow_failure] || false, - when: job[:when] || 'on_success', - environment: job[:environment], - options: { - image: job[:image] || @image, - services: job[:services] || @services, - artifacts: job[:artifacts], - cache: job[:cache] || @cache, - dependencies: job[:dependencies], - after_script: job[:after_script] || @after_script, - }.compact - } + def yaml_variables(name) + variables = global_variables.merge(job_variables(name)) + variables.map do |key, value| + { key: key, value: value, public: true } + end + end + + def global_variables + @variables || {} + end + + def job_variables(name) + job = @jobs[name.to_sym] + return {} unless job + + job[:variables] || {} end def validate_job!(name, job) diff --git a/lib/container_registry/client.rb b/lib/container_registry/client.rb index 42232b7129d2c4ab7f284d80d39b9f9d95aeebb4..2edddb84fc3f7b4d49324269f2d360dc4ee3fcd8 100644 --- a/lib/container_registry/client.rb +++ b/lib/container_registry/client.rb @@ -7,62 +7,91 @@ module ContainerRegistry MANIFEST_VERSION = 'application/vnd.docker.distribution.manifest.v2+json' + # Taken from: FaradayMiddleware::FollowRedirects + REDIRECT_CODES = Set.new [301, 302, 303, 307] + def initialize(base_uri, options = {}) @base_uri = base_uri - @faraday = Faraday.new(@base_uri) do |conn| - initialize_connection(conn, options) - end + @options = options end def repository_tags(name) - response_body @faraday.get("/v2/#{name}/tags/list") + response_body faraday.get("/v2/#{name}/tags/list") end def repository_manifest(name, reference) - response_body @faraday.get("/v2/#{name}/manifests/#{reference}") + response_body faraday.get("/v2/#{name}/manifests/#{reference}") end def repository_tag_digest(name, reference) - response = @faraday.head("/v2/#{name}/manifests/#{reference}") + response = faraday.head("/v2/#{name}/manifests/#{reference}") response.headers['docker-content-digest'] if response.success? end def delete_repository_tag(name, reference) - @faraday.delete("/v2/#{name}/manifests/#{reference}").success? + faraday.delete("/v2/#{name}/manifests/#{reference}").success? end def blob(name, digest, type = nil) - headers = {} - headers['Accept'] = type if type - response_body @faraday.get("/v2/#{name}/blobs/#{digest}", nil, headers) + type ||= 'application/octet-stream' + response_body faraday_blob.get("/v2/#{name}/blobs/#{digest}", nil, 'Accept' => type), allow_redirect: true end def delete_blob(name, digest) - @faraday.delete("/v2/#{name}/blobs/#{digest}").success? + faraday.delete("/v2/#{name}/blobs/#{digest}").success? end - + private - + def initialize_connection(conn, options) conn.request :json + + if options[:user] && options[:password] + conn.request(:basic_auth, options[:user].to_s, options[:password].to_s) + elsif options[:token] + conn.request(:authorization, :bearer, options[:token].to_s) + end + + conn.adapter :net_http + end + + def accept_manifest(conn) conn.headers['Accept'] = MANIFEST_VERSION conn.response :json, content_type: 'application/json' conn.response :json, content_type: 'application/vnd.docker.distribution.manifest.v1+prettyjws' conn.response :json, content_type: 'application/vnd.docker.distribution.manifest.v1+json' conn.response :json, content_type: 'application/vnd.docker.distribution.manifest.v2+json' + end - if options[:user] && options[:password] - conn.request(:basic_auth, options[:user].to_s, options[:password].to_s) - elsif options[:token] - conn.request(:authorization, :bearer, options[:token].to_s) + def response_body(response, allow_redirect: false) + if allow_redirect && REDIRECT_CODES.include?(response.status) + response = redirect_response(response.headers['location']) end - conn.adapter :net_http + response.body if response && response.success? + end + + def redirect_response(location) + return unless location + + # We explicitly remove authorization token + faraday_blob.get(location) do |req| + req['Authorization'] = '' + end end - def response_body(response) - response.body if response.success? + def faraday + @faraday ||= Faraday.new(@base_uri) do |conn| + initialize_connection(conn, @options) + accept_manifest(conn) + end + end + + def faraday_blob + @faraday_blob ||= Faraday.new(@base_uri) do |conn| + initialize_connection(conn, @options) + end end end end diff --git a/lib/container_registry/tag.rb b/lib/container_registry/tag.rb index 708d01b95a1b14595cebb63580e3481e261e5d69..59040199920de94acbf180ba1771785120d620bf 100644 --- a/lib/container_registry/tag.rb +++ b/lib/container_registry/tag.rb @@ -53,7 +53,7 @@ module ContainerRegistry def config return unless config_blob - @config ||= ContainerRegistry::Config.new(self, config_blob) + @config ||= ContainerRegistry::Config.new(self, config_blob) if config_blob.data end def created_at diff --git a/lib/gitlab/access.rb b/lib/gitlab/access.rb index 831f1e635baca56b041c8c4e1f0c0de61eb3fb47..de41ea415a67d17ab461dde421c7a6fc551d7649 100644 --- a/lib/gitlab/access.rb +++ b/lib/gitlab/access.rb @@ -14,9 +14,10 @@ module Gitlab OWNER = 50 # Branch protection settings - PROTECTION_NONE = 0 - PROTECTION_DEV_CAN_PUSH = 1 - PROTECTION_FULL = 2 + PROTECTION_NONE = 0 + PROTECTION_DEV_CAN_PUSH = 1 + PROTECTION_FULL = 2 + PROTECTION_DEV_CAN_MERGE = 3 class << self def values @@ -54,6 +55,7 @@ module Gitlab def protection_options { "Not protected: Both developers and masters can push new commits, force push, or delete the branch." => PROTECTION_NONE, + "Protected against pushes: Developers cannot push new commits, but are allowed to accept merge requests to the branch." => PROTECTION_DEV_CAN_MERGE, "Partially protected: Developers can push new commits, but cannot force push or delete the branch. Masters can do all of those." => PROTECTION_DEV_CAN_PUSH, "Fully protected: Developers cannot push new commits, force push, or delete the branch. Only masters can do any of those." => PROTECTION_FULL, } diff --git a/lib/gitlab/award_emoji.rb b/lib/gitlab/award_emoji.rb index c94bfc0e65ff751232d869c355f7e59289175d77..39b43ab5489a362ed9cfc3da7ba83209d653ce35 100644 --- a/lib/gitlab/award_emoji.rb +++ b/lib/gitlab/award_emoji.rb @@ -1,24 +1,14 @@ module Gitlab class AwardEmoji CATEGORIES = { - other: "Other", objects: "Objects", - places: "Places", - travel_places: "Travel", - emoticons: "Emoticons", - objects_symbols: "Symbols", + travel: "Travel", + symbols: "Symbols", nature: "Nature", - celebration: "Celebration", people: "People", activity: "Activity", flags: "Flags", - food_drink: "Food" - }.with_indifferent_access - - CATEGORY_ALIASES = { - symbols: "objects_symbols", - foods: "food_drink", - travel: "travel_places" + food: "Food" }.with_indifferent_access def self.normalize_emoji_name(name) @@ -35,7 +25,7 @@ module Gitlab # Skip Fitzpatrick(tone) modifiers next if data["category"] == "modifier" - category = CATEGORY_ALIASES[data["category"]] || data["category"] + category = data["category"] @emoji_by_category[category] << data end @@ -57,9 +47,9 @@ module Gitlab def self.aliases @aliases ||= begin - json_path = File.join(Rails.root, 'fixtures', 'emojis', 'aliases.json' ) - JSON.parse(File.read(json_path)) - end + json_path = File.join(Rails.root, 'fixtures', 'emojis', 'aliases.json') + JSON.parse(File.read(json_path)) + end end # Returns an Array of Emoji names and their asset URLs. diff --git a/lib/gitlab/backend/grack_auth.rb b/lib/gitlab/backend/grack_auth.rb index 478f145bfedaf9782c3fccc433775e889d3528f0..ab94abeda7719396865170842a90219816319ed0 100644 --- a/lib/gitlab/backend/grack_auth.rb +++ b/lib/gitlab/backend/grack_auth.rb @@ -63,7 +63,7 @@ module Grack def ci_request?(login, password) matched_login = /(?<s>^[a-zA-Z]*-ci)-token$/.match(login) - if project && matched_login.present? && git_cmd == 'git-upload-pack' + if project && matched_login.present? underscored_service = matched_login['s'].underscore if underscored_service == 'gitlab_ci' diff --git a/lib/gitlab/checks/change_access.rb b/lib/gitlab/checks/change_access.rb new file mode 100644 index 0000000000000000000000000000000000000000..5551fac4b8bdf6b14400ffe699bf0be43d3dba0a --- /dev/null +++ b/lib/gitlab/checks/change_access.rb @@ -0,0 +1,96 @@ +module Gitlab + module Checks + class ChangeAccess + attr_reader :user_access, :project + + def initialize(change, user_access:, project:) + @oldrev, @newrev, @ref = change.split(' ') + @branch_name = branch_name(@ref) + @user_access = user_access + @project = project + end + + def exec + error = protected_branch_checks || tag_checks || push_checks + + if error + GitAccessStatus.new(false, error) + else + GitAccessStatus.new(true) + end + end + + protected + + def protected_branch_checks + return unless project.protected_branch?(@branch_name) + + if forced_push? && user_access.cannot_do_action?(:force_push_code_to_protected_branches) + return "You are not allowed to force push code to a protected branch on this project." + elsif Gitlab::Git.blank_ref?(@newrev) && user_access.cannot_do_action?(:remove_protected_branches) + return "You are not allowed to delete protected branches from this project." + end + + if matching_merge_request? + if user_access.can_merge_to_branch?(@branch_name) || user_access.can_push_to_branch?(@branch_name) + return + else + "You are not allowed to merge code into protected branches on this project." + end + else + if user_access.can_push_to_branch?(@branch_name) + return + else + "You are not allowed to push code to protected branches on this project." + end + end + end + + def tag_checks + tag_ref = tag_name(@ref) + + if tag_ref && protected_tag?(tag_ref) && user_access.cannot_do_action?(:admin_project) + "You are not allowed to change existing tags on this project." + end + end + + def push_checks + if user_access.cannot_do_action?(:push_code) + "You are not allowed to push code to this project." + end + end + + private + + def protected_tag?(tag_name) + project.repository.tag_exists?(tag_name) + end + + def forced_push? + Gitlab::Checks::ForcePush.force_push?(@project, @oldrev, @newrev) + end + + def matching_merge_request? + Checks::MatchingMergeRequest.new(@newrev, @branch_name, @project).match? + end + + def branch_name(ref) + ref = @ref.to_s + if Gitlab::Git.branch_ref?(ref) + Gitlab::Git.ref_name(ref) + else + nil + end + end + + def tag_name(ref) + ref = @ref.to_s + if Gitlab::Git.tag_ref?(ref) + Gitlab::Git.ref_name(ref) + else + nil + end + end + end + end +end diff --git a/lib/gitlab/checks/force_push.rb b/lib/gitlab/checks/force_push.rb new file mode 100644 index 0000000000000000000000000000000000000000..5fe86553bd014486944dc6fa936457e490e93628 --- /dev/null +++ b/lib/gitlab/checks/force_push.rb @@ -0,0 +1,17 @@ +module Gitlab + module Checks + class ForcePush + def self.force_push?(project, oldrev, newrev) + return false if project.empty_repo? + + # Created or deleted branch + if Gitlab::Git.blank_ref?(oldrev) || Gitlab::Git.blank_ref?(newrev) + false + else + missed_ref, _ = Gitlab::Popen.popen(%W(#{Gitlab.config.git.bin_path} --git-dir=#{project.repository.path_to_repo} rev-list --max-count=1 #{oldrev} ^#{newrev})) + missed_ref.present? + end + end + end + end +end diff --git a/lib/gitlab/checks/matching_merge_request.rb b/lib/gitlab/checks/matching_merge_request.rb new file mode 100644 index 0000000000000000000000000000000000000000..849848515da66a210ff00a0f2c9de3ce6f306f7f --- /dev/null +++ b/lib/gitlab/checks/matching_merge_request.rb @@ -0,0 +1,18 @@ +module Gitlab + module Checks + class MatchingMergeRequest + def initialize(newrev, branch_name, project) + @newrev = newrev + @branch_name = branch_name + @project = project + end + + def match? + @project.merge_requests + .with_state(:locked) + .where(in_progress_merge_commit_sha: @newrev, target_branch: @branch_name) + .exists? + end + end + end +end diff --git a/lib/gitlab/ci/config/node/job.rb b/lib/gitlab/ci/config/node/job.rb index 464abd4d2d81d439e706c3bf36703de79c50932a..aea9fef82296c996a38feb55a74f230ae1689a7f 100644 --- a/lib/gitlab/ci/config/node/job.rb +++ b/lib/gitlab/ci/config/node/job.rb @@ -25,9 +25,9 @@ module Gitlab validates :tags, array_of_strings: true validates :allow_failure, boolean: true validates :when, - inclusion: { in: %w[on_success on_failure always], - message: 'should be on_success, on_failure ' \ - 'or always' } + inclusion: { in: %w[on_success on_failure always manual], + message: 'should be on_success, on_failure, ' \ + 'always or manual' } validates :environment, type: { with: String, diff --git a/lib/gitlab/diff/file.rb b/lib/gitlab/diff/file.rb index 7e01f7b61fba1ff5f4e807dbe11ed77603eee3fd..b09ca1fb8b0c785f4d6cf78683b78137706d54cb 100644 --- a/lib/gitlab/diff/file.rb +++ b/lib/gitlab/diff/file.rb @@ -5,7 +5,7 @@ module Gitlab delegate :new_file, :deleted_file, :renamed_file, :old_path, :new_path, :a_mode, :b_mode, - :submodule?, :too_large?, to: :diff, prefix: false + :submodule?, :too_large?, :collapsed?, to: :diff, prefix: false def initialize(diff, repository:, diff_refs: nil) @diff = diff @@ -68,10 +68,6 @@ module Gitlab @lines ||= Gitlab::Diff::Parser.new.parse(raw_diff.each_line).to_a end - def collapsed_by_default? - diff.diff.bytesize > 10240 # 10 KB - end - def highlighted_diff_lines @highlighted_diff_lines ||= Gitlab::Diff::Highlight.new(self, repository: self.repository).highlight end diff --git a/lib/gitlab/force_push_check.rb b/lib/gitlab/force_push_check.rb deleted file mode 100644 index 93c6a5bb7f58ea0c5a56d3f6da1d57cd7c70d25a..0000000000000000000000000000000000000000 --- a/lib/gitlab/force_push_check.rb +++ /dev/null @@ -1,15 +0,0 @@ -module Gitlab - class ForcePushCheck - def self.force_push?(project, oldrev, newrev) - return false if project.empty_repo? - - # Created or deleted branch - if Gitlab::Git.blank_ref?(oldrev) || Gitlab::Git.blank_ref?(newrev) - false - else - missed_refs, _ = Gitlab::Popen.popen(%W(#{Gitlab.config.git.bin_path} --git-dir=#{project.repository.path_to_repo} rev-list #{oldrev} ^#{newrev})) - missed_refs.split("\n").size > 0 - end - end - end -end diff --git a/lib/gitlab/git_access.rb b/lib/gitlab/git_access.rb index 7679c7e4bb8e4192918417c4859214213150406b..8e8f39d9cb25435ee7a8bb9faafda59b8e3eeb79 100644 --- a/lib/gitlab/git_access.rb +++ b/lib/gitlab/git_access.rb @@ -1,52 +1,17 @@ +# Check a user's access to perform a git action. All public methods in this +# class return an instance of `GitlabAccessStatus` module Gitlab class GitAccess DOWNLOAD_COMMANDS = %w{ git-upload-pack git-upload-archive } PUSH_COMMANDS = %w{ git-receive-pack } - attr_reader :actor, :project, :protocol + attr_reader :actor, :project, :protocol, :user_access def initialize(actor, project, protocol) @actor = actor @project = project @protocol = protocol - end - - def user - return @user if defined?(@user) - - @user = - case actor - when User - actor - when DeployKey - nil - when Key - actor.user - end - end - - def deploy_key - actor if actor.is_a?(DeployKey) - end - - def can_push_to_branch?(ref) - return false unless user - - if project.protected_branch?(ref) && !project.developers_can_push_to_protected_branch?(ref) - user.can?(:push_code_to_protected_branches, project) - else - user.can?(:push_code, project) - end - end - - def can_read_project? - if user - user.can?(:read_project, project) - elsif deploy_key - deploy_key.projects.include?(project) - else - false - end + @user_access = UserAccess.new(user, project: project) end def check(cmd, changes = nil) @@ -56,11 +21,11 @@ module Gitlab return build_status_object(false, "No user or key was provided.") end - if user && !user_allowed? + if user && !user_access.allowed? return build_status_object(false, "Your account has been blocked.") end - unless project && can_read_project? + unless project && (user_access.can_read_project? || deploy_key_can_read_project?) return build_status_object(false, 'The project you were looking for could not be found.') end @@ -95,7 +60,7 @@ module Gitlab end def user_download_access_check - unless user.can?(:download_code, project) + unless user_access.can_do_action?(:download_code) return build_status_object(false, "You are not allowed to download code from this project.") end @@ -125,46 +90,8 @@ module Gitlab build_status_object(true) end - def can_user_do_action?(action) - @permission_cache ||= {} - @permission_cache[action] ||= user.can?(action, project) - end - def change_access_check(change) - oldrev, newrev, ref = change.split(' ') - - action = - if project.protected_branch?(branch_name(ref)) - protected_branch_action(oldrev, newrev, branch_name(ref)) - elsif (tag_ref = tag_name(ref)) && protected_tag?(tag_ref) - # Prevent any changes to existing git tag unless user has permissions - :admin_project - else - :push_code - end - - unless can_user_do_action?(action) - status = - case action - when :force_push_code_to_protected_branches - build_status_object(false, "You are not allowed to force push code to a protected branch on this project.") - when :remove_protected_branches - build_status_object(false, "You are not allowed to deleted protected branches from this project.") - when :push_code_to_protected_branches - build_status_object(false, "You are not allowed to push code to protected branches on this project.") - when :admin_project - build_status_object(false, "You are not allowed to change existing tags on this project.") - else # :push_code - build_status_object(false, "You are not allowed to push code to this project.") - end - return status - end - - build_status_object(true) - end - - def forced_push?(oldrev, newrev) - Gitlab::ForcePushCheck.force_push?(project, oldrev, newrev) + Checks::ChangeAccess.new(change, user_access: user_access, project: project).exec end def protocol_allowed? @@ -173,48 +100,39 @@ module Gitlab private - def protected_branch_action(oldrev, newrev, branch_name) - # we dont allow force push to protected branch - if forced_push?(oldrev, newrev) - :force_push_code_to_protected_branches - elsif Gitlab::Git.blank_ref?(newrev) - # and we dont allow remove of protected branch - :remove_protected_branches - elsif project.developers_can_push_to_protected_branch?(branch_name) - :push_code - else - :push_code_to_protected_branches - end + def matching_merge_request?(newrev, branch_name) + Checks::MatchingMergeRequest.new(newrev, branch_name, project).match? end - def protected_tag?(tag_name) - project.repository.tag_exists?(tag_name) - end - - def user_allowed? - Gitlab::UserAccess.allowed?(user) - end - - def branch_name(ref) - ref = ref.to_s - if Gitlab::Git.branch_ref?(ref) - Gitlab::Git.ref_name(ref) - else - nil - end + def deploy_key + actor if actor.is_a?(DeployKey) end - def tag_name(ref) - ref = ref.to_s - if Gitlab::Git.tag_ref?(ref) - Gitlab::Git.ref_name(ref) + def deploy_key_can_read_project? + if deploy_key + return true if project.public? + deploy_key.projects.include?(project) else - nil + false end end protected + def user + return @user if defined?(@user) + + @user = + case actor + when User + actor + when DeployKey + nil + when Key + actor.user + end + end + def build_status_object(status, message = '') GitAccessStatus.new(status, message) end diff --git a/lib/gitlab/git_access_wiki.rb b/lib/gitlab/git_access_wiki.rb index 8672cbc0ec44ad4a276557dfec60faa24836c5ce..f71d3575909c68567203edd33958e3da97b5dea9 100644 --- a/lib/gitlab/git_access_wiki.rb +++ b/lib/gitlab/git_access_wiki.rb @@ -1,7 +1,7 @@ module Gitlab class GitAccessWiki < GitAccess def change_access_check(change) - if user.can?(:create_wiki, project) + if user_access.can_do_action?(:create_wiki) build_status_object(true) else build_status_object(false, "You are not allowed to write to this project's wiki.") diff --git a/lib/gitlab/gon_helper.rb b/lib/gitlab/gon_helper.rb index d4f12cb1df9716cc86c7b115049ec03f9a370ee6..c5a11148d33f7c5dae8fa1c8b5811b91a177b9b7 100644 --- a/lib/gitlab/gon_helper.rb +++ b/lib/gitlab/gon_helper.rb @@ -5,7 +5,7 @@ module Gitlab gon.default_avatar_url = URI::join(Gitlab.config.gitlab.url, ActionController::Base.helpers.image_path('no_avatar.png')).to_s gon.max_file_size = current_application_settings.max_attachment_size gon.relative_url_root = Gitlab.config.gitlab.relative_url_root - gon.shortcuts_path = help_shortcuts_path + gon.shortcuts_path = help_page_path('shortcuts') gon.user_color_scheme = Gitlab::ColorSchemes.for_user(current_user).css_class gon.award_menu_url = emojis_path diff --git a/lib/gitlab/import_export.rb b/lib/gitlab/import_export.rb index bab2ea73c4f10a63636a81dabd66cb3eecddeb0a..d6d14bd98a0fdb192c4c0e0a3d267f2ee1cca68b 100644 --- a/lib/gitlab/import_export.rb +++ b/lib/gitlab/import_export.rb @@ -2,7 +2,7 @@ module Gitlab module ImportExport extend self - VERSION = '0.1.1' + VERSION = '0.1.2' FILENAME_LIMIT = 50 def export_path(relative_path:) diff --git a/lib/gitlab/import_export/avatar_restorer.rb b/lib/gitlab/import_export/avatar_restorer.rb new file mode 100644 index 0000000000000000000000000000000000000000..352539eb594ead70aec67accc7d348ba31776f15 --- /dev/null +++ b/lib/gitlab/import_export/avatar_restorer.rb @@ -0,0 +1,31 @@ +module Gitlab + module ImportExport + class AvatarRestorer + + def initialize(project:, shared:) + @project = project + @shared = shared + end + + def restore + return true unless avatar_export_file + + @project.avatar = File.open(avatar_export_file) + @project.save! + rescue => e + @shared.error(e) + false + end + + private + + def avatar_export_file + @avatar_export_file ||= Dir["#{avatar_export_path}/*"].first + end + + def avatar_export_path + File.join(@shared.export_path, 'avatar') + end + end + end +end diff --git a/lib/gitlab/import_export/avatar_saver.rb b/lib/gitlab/import_export/avatar_saver.rb new file mode 100644 index 0000000000000000000000000000000000000000..998c21e25869c3daa7529d722d19e421b9cdec83 --- /dev/null +++ b/lib/gitlab/import_export/avatar_saver.rb @@ -0,0 +1,31 @@ +module Gitlab + module ImportExport + class AvatarSaver + include Gitlab::ImportExport::CommandLineUtil + + def initialize(project:, shared:) + @project = project + @shared = shared + end + + def save + return true unless @project.avatar.exists? + + copy_files(avatar_path, avatar_export_path) + rescue => e + @shared.error(e) + false + end + + private + + def avatar_export_path + File.join(@shared.export_path, 'avatar', @project.avatar_identifier) + end + + def avatar_path + @project.avatar.path + end + end + end +end diff --git a/lib/gitlab/import_export/command_line_util.rb b/lib/gitlab/import_export/command_line_util.rb index 2249904145c7df427cff988c0a6159fa1781a5aa..5dd0e34c18ea5b04420b66dab081895660ed3780 100644 --- a/lib/gitlab/import_export/command_line_util.rb +++ b/lib/gitlab/import_export/command_line_util.rb @@ -36,6 +36,15 @@ module Gitlab def git_bin_path Gitlab.config.git.bin_path end + + def copy_files(source, destination) + # if we are copying files, create the destination folder + destination_folder = File.file?(source) ? File.dirname(destination) : destination + + FileUtils.mkdir_p(destination_folder) + FileUtils.copy_entry(source, destination) + true + end end end end diff --git a/lib/gitlab/import_export/import_export.yml b/lib/gitlab/import_export/import_export.yml index 05f4ad527ac356ca14130690202d9a626e9d3f45..15afe8174a476ec5f970c73fbec40b54f47ec26c 100644 --- a/lib/gitlab/import_export/import_export.yml +++ b/lib/gitlab/import_export/import_export.yml @@ -53,7 +53,11 @@ included_attributes: excluded_attributes: snippets: - :expired_at + merge_request_diff: + - :st_diffs methods: statuses: - - :type \ No newline at end of file + - :type + merge_request_diff: + - :utf8_st_diffs \ No newline at end of file diff --git a/lib/gitlab/import_export/importer.rb b/lib/gitlab/import_export/importer.rb index 8f66f48cbfeff88fb39d6fb63b294d51e5e4ec52..e9ee47fc090d5091bed7cfbccee80fa129c6006e 100644 --- a/lib/gitlab/import_export/importer.rb +++ b/lib/gitlab/import_export/importer.rb @@ -9,7 +9,7 @@ module Gitlab end def execute - if import_file && check_version! && [project_tree, repo_restorer, wiki_restorer, uploads_restorer].all?(&:restore) + if import_file && check_version! && [project_tree, avatar_restorer, repo_restorer, wiki_restorer, uploads_restorer].all?(&:restore) project_tree.restored_project else raise Projects::ImportService::Error.new(@shared.errors.join(', ')) @@ -35,6 +35,10 @@ module Gitlab project: @project) end + def avatar_restorer + Gitlab::ImportExport::AvatarRestorer.new(project: project_tree.restored_project, shared: @shared) + end + def repo_restorer Gitlab::ImportExport::RepoRestorer.new(path_to_bundle: repo_path, shared: @shared, @@ -44,8 +48,7 @@ module Gitlab def wiki_restorer Gitlab::ImportExport::RepoRestorer.new(path_to_bundle: wiki_repo_path, shared: @shared, - project: ProjectWiki.new(project_tree.restored_project), - wiki: true) + project: ProjectWiki.new(project_tree.restored_project)) end def uploads_restorer diff --git a/lib/gitlab/import_export/relation_factory.rb b/lib/gitlab/import_export/relation_factory.rb index 6ba25a31641bd87b844b30f3102a334caa3f9560..e41c7e6bf4f5be0d8e1ecb872fa79b71c29292d5 100644 --- a/lib/gitlab/import_export/relation_factory.rb +++ b/lib/gitlab/import_export/relation_factory.rb @@ -33,6 +33,7 @@ module Gitlab update_project_references reset_ci_tokens if @relation_name == 'Ci::Trigger' @relation_hash['data'].deep_symbolize_keys! if @relation_name == :events && @relation_hash['data'] + set_st_diffs if @relation_name == :merge_request_diff generate_imported_object end @@ -129,6 +130,10 @@ module Gitlab def parsed_relation_hash @relation_hash.reject { |k, _v| !relation_class.attribute_method?(k) } end + + def set_st_diffs + @relation_hash['st_diffs'] = @relation_hash.delete('utf8_st_diffs') + end end end end diff --git a/lib/gitlab/import_export/repo_restorer.rb b/lib/gitlab/import_export/repo_restorer.rb index 546dae4d122547d12ad29bed5858950694472cbd..f84de652a572e602c7cb89b642eb712fef8f2e9f 100644 --- a/lib/gitlab/import_export/repo_restorer.rb +++ b/lib/gitlab/import_export/repo_restorer.rb @@ -3,15 +3,14 @@ module Gitlab class RepoRestorer include Gitlab::ImportExport::CommandLineUtil - def initialize(project:, shared:, path_to_bundle:, wiki: false) + def initialize(project:, shared:, path_to_bundle:) @project = project @path_to_bundle = path_to_bundle @shared = shared - @wiki = wiki end def restore - return wiki? unless File.exist?(@path_to_bundle) + return true unless File.exist?(@path_to_bundle) FileUtils.mkdir_p(path_to_repo) @@ -30,10 +29,6 @@ module Gitlab def path_to_repo @project.repository.path_to_repo end - - def wiki? - @wiki - end end end end diff --git a/lib/gitlab/import_export/repo_saver.rb b/lib/gitlab/import_export/repo_saver.rb index cce43fe994bbd7b55d4b1d2b532caa3ce0fbb8a0..331e14021e6831ef388720ede3abcc99d65791a3 100644 --- a/lib/gitlab/import_export/repo_saver.rb +++ b/lib/gitlab/import_export/repo_saver.rb @@ -11,7 +11,7 @@ module Gitlab end def save - return false if @project.empty_repo? + return true if @project.empty_repo? # it's ok to have no repo @full_path = File.join(@shared.export_path, ImportExport.project_bundle_filename) bundle_to_disk diff --git a/lib/gitlab/import_export/uploads_saver.rb b/lib/gitlab/import_export/uploads_saver.rb index d6f4fa5751055e8aaca02a95e835852fe616c059..62a2553675cd927dd434de381fcc0b32ea5e1bf2 100644 --- a/lib/gitlab/import_export/uploads_saver.rb +++ b/lib/gitlab/import_export/uploads_saver.rb @@ -1,6 +1,8 @@ module Gitlab module ImportExport class UploadsSaver + include Gitlab::ImportExport::CommandLineUtil + def initialize(project:, shared:) @project = project @shared = shared @@ -17,12 +19,6 @@ module Gitlab private - def copy_files(source, destination) - FileUtils.mkdir_p(destination) - FileUtils.copy_entry(source, destination) - true - end - def uploads_export_path File.join(@shared.export_path, 'uploads') end diff --git a/lib/gitlab/import_export/wiki_repo_saver.rb b/lib/gitlab/import_export/wiki_repo_saver.rb index 1eedae39f8a3a7017f46ceb0cc4149da17a899ac..6107420e4dd79ab6bb8b7d1d60b72e2111877e21 100644 --- a/lib/gitlab/import_export/wiki_repo_saver.rb +++ b/lib/gitlab/import_export/wiki_repo_saver.rb @@ -4,6 +4,7 @@ module Gitlab def save @wiki = ProjectWiki.new(@project) return true unless wiki_repository_exists? # it's okay to have no Wiki + bundle_to_disk(File.join(@shared.export_path, project_filename)) end diff --git a/lib/gitlab/lfs/response.rb b/lib/gitlab/lfs/response.rb index 811363405a813110f1ee5df06e3b24a9a57ac5b3..a1ee1aa81ff090de51b6c1db73076ed5261a5dca 100644 --- a/lib/gitlab/lfs/response.rb +++ b/lib/gitlab/lfs/response.rb @@ -47,6 +47,8 @@ module Gitlab end def render_storage_upload_store_response(oid, size, tmp_file_name) + return render_forbidden unless tmp_file_name + render_response_to_push do render_lfs_upload_ok(oid, size, tmp_file_name) end diff --git a/lib/gitlab/lfs/router.rb b/lib/gitlab/lfs/router.rb index 69bd5e6230587830b381fcf1a4adb378b09b2e61..f2a76a56b8f2452ea1a789e90feb20a548830060 100644 --- a/lib/gitlab/lfs/router.rb +++ b/lib/gitlab/lfs/router.rb @@ -74,8 +74,6 @@ module Gitlab lfs.render_storage_upload_authorize_response(oid, size) else tmp_file_name = sanitize_tmp_filename(@request.env['HTTP_X_GITLAB_LFS_TMP']) - return nil unless tmp_file_name - lfs.render_storage_upload_store_response(oid, size, tmp_file_name) end end diff --git a/lib/gitlab/user_access.rb b/lib/gitlab/user_access.rb index d1b42c1f9b97a0c45bd0bfde190b129e6ec1aa9f..c0f85e9b3a85a509be84b9ece06c8ddc364d1160 100644 --- a/lib/gitlab/user_access.rb +++ b/lib/gitlab/user_access.rb @@ -1,7 +1,23 @@ module Gitlab - module UserAccess - def self.allowed?(user) - return false if user.blocked? + class UserAccess + attr_reader :user, :project + + def initialize(user, project: nil) + @user = user + @project = project + end + + def can_do_action?(action) + @permission_cache ||= {} + @permission_cache[action] ||= user.can?(action, project) + end + + def cannot_do_action?(action) + !can_do_action?(action) + end + + def allowed? + return false if user.blank? || user.blocked? if user.requires_ldap_check? && user.try_obtain_ldap_lease return false unless Gitlab::LDAP::Access.allowed?(user) @@ -9,5 +25,31 @@ module Gitlab true end + + def can_push_to_branch?(ref) + return false unless user + + if project.protected_branch?(ref) && !project.developers_can_push_to_protected_branch?(ref) + user.can?(:push_code_to_protected_branches, project) + else + user.can?(:push_code, project) + end + end + + def can_merge_to_branch?(ref) + return false unless user + + if project.protected_branch?(ref) && !project.developers_can_merge_to_protected_branch?(ref) + user.can?(:push_code_to_protected_branches, project) + else + user.can?(:push_code, project) + end + end + + def can_read_project? + return false unless user + + user.can?(:read_project, project) + end end end diff --git a/lib/tasks/gemojione.rake b/lib/tasks/gemojione.rake index e930ace1041ad446e2203e136314b6019e293d2f..993112aee3be341125b045c64e91d7747f1ff8d4 100644 --- a/lib/tasks/gemojione.rake +++ b/lib/tasks/gemojione.rake @@ -4,7 +4,7 @@ namespace :gemojione do require 'digest/sha2' require 'json' - dir = Gemojione.index.images_path + dir = Gemojione.images_path digests = [] aliases = Hash.new { |hash, key| hash[key] = [] } aliases_path = File.join(Rails.root, 'fixtures', 'emojis', 'aliases.json') @@ -50,9 +50,14 @@ namespace :gemojione do SIZE = 20 RETINA = SIZE * 2 + # Update these values to the width and height of the spritesheet when + # new emoji are added. + SPRITESHEET_WIDTH = 860 + SPRITESHEET_HEIGHT = 840 + Dir.mktmpdir do |tmpdir| # Copy the Gemojione assets to the temporary folder for resizing - FileUtils.cp_r(Gemojione.index.images_path, tmpdir) + FileUtils.cp_r(Gemojione.images_path, tmpdir) Dir.chdir(tmpdir) do Dir["**/*.png"].each do |png| @@ -64,7 +69,7 @@ namespace :gemojione do # Combine the resized assets into a packed sprite and re-generate the SCSS SpriteFactory.cssurl = "image-url('$IMAGE')" - SpriteFactory.run!(File.join(tmpdir, 'images'), { + SpriteFactory.run!(File.join(tmpdir, 'png'), { output_style: style_path, output_image: "app/assets/images/emoji.png", selector: '.emoji-', @@ -97,7 +102,7 @@ namespace :gemojione do only screen and (min-resolution: 192dpi), only screen and (min-resolution: 2dppx) { background-image: image-url('emoji@2x.png'); - background-size: 840px 820px; + background-size: #{SPRITESHEET_WIDTH}px #{SPRITESHEET_HEIGHT}px; } } CSS @@ -107,7 +112,7 @@ namespace :gemojione do # Now do it again but for Retina Dir.mktmpdir do |tmpdir| # Copy the Gemojione assets to the temporary folder for resizing - FileUtils.cp_r(Gemojione.index.images_path, tmpdir) + FileUtils.cp_r(Gemojione.images_path, tmpdir) Dir.chdir(tmpdir) do Dir["**/*.png"].each do |png| @@ -116,7 +121,7 @@ namespace :gemojione do end # Combine the resized assets into a packed sprite and re-generate the SCSS - SpriteFactory.run!(File.join(tmpdir, 'images'), { + SpriteFactory.run!(File.join(tmpdir), { output_image: "app/assets/images/emoji@2x.png", style: false, nocomments: true, diff --git a/lib/tasks/gitlab/track_deployment.rake b/lib/tasks/gitlab/track_deployment.rake new file mode 100644 index 0000000000000000000000000000000000000000..84aa2e8507a16c67b7c3ff2437b99974d4849e36 --- /dev/null +++ b/lib/tasks/gitlab/track_deployment.rake @@ -0,0 +1,9 @@ +namespace :gitlab do + desc 'GitLab | Tracks a deployment in GitLab Performance Monitoring' + task track_deployment: :environment do + metric = Gitlab::Metrics::Metric. + new('deployments', version: Gitlab::VERSION) + + Gitlab::Metrics.submit_metrics([metric.to_hash]) + end +end diff --git a/spec/controllers/help_controller_spec.rb b/spec/controllers/help_controller_spec.rb index 267d511c2dbca06342b188b0c7fa2dd3533b8a38..347bef1e129c1d549d84b1d1d5b1b1d8607bf94c 100644 --- a/spec/controllers/help_controller_spec.rb +++ b/spec/controllers/help_controller_spec.rb @@ -63,4 +63,13 @@ describe HelpController do end end end + + describe 'GET #ui' do + context 'for UI Development Kit' do + it 'renders found' do + get :ui + expect(response).to have_http_status(200) + end + end + end end diff --git a/spec/controllers/projects_controller_spec.rb b/spec/controllers/projects_controller_spec.rb index 1b1b1bdf52d23cd36845df856b25c12a71150513..3edce4d339c53979daf98e29fe7cdca0f4208f34 100644 --- a/spec/controllers/projects_controller_spec.rb +++ b/spec/controllers/projects_controller_spec.rb @@ -43,6 +43,26 @@ describe ProjectsController do end end + context "project with empty repo" do + let(:empty_project) { create(:project_empty_repo, :public) } + + before { sign_in(user) } + + User.project_views.keys.each do |project_view| + context "with #{project_view} view set" do + before do + user.update_attributes(project_view: project_view) + + get :show, namespace_id: empty_project.namespace.path, id: empty_project.path + end + + it "renders the empty project view" do + expect(response).to render_template('empty') + end + end + end + end + context "rendering default project view" do render_views diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb index fe05a0cfc001977e51100f58a15f6c238dd462cc..5e19e403c6bb4e2be2adf022ef414ac0d76e29e4 100644 --- a/spec/factories/ci/builds.rb +++ b/spec/factories/ci/builds.rb @@ -3,6 +3,8 @@ include ActionDispatch::TestProcess FactoryGirl.define do factory :ci_build, class: Ci::Build do name 'test' + stage 'test' + stage_idx 0 ref 'master' tag false created_at 'Di 29. Okt 09:50:00 CET 2013' @@ -15,6 +17,11 @@ FactoryGirl.define do services: ["postgres"] } end + yaml_variables do + [ + { key: :DB_NAME, value: 'postgres', public: true } + ] + end pipeline factory: :ci_pipeline @@ -38,6 +45,11 @@ FactoryGirl.define do status 'pending' end + trait :manual do + status 'skipped' + self.when 'manual' + end + trait :allowed_to_fail do allow_failure true end diff --git a/spec/features/admin/admin_builds_spec.rb b/spec/features/admin/admin_builds_spec.rb index a6198389f04357f24d7f89d47352b6f78ad5e49a..e177059d9597c2d790869dfda97c9a9abd371662 100644 --- a/spec/features/admin/admin_builds_spec.rb +++ b/spec/features/admin/admin_builds_spec.rb @@ -36,12 +36,45 @@ describe 'Admin Builds' do end end + context 'Pending tab' do + context 'when have pending builds' do + it 'shows pending builds' do + build1 = create(:ci_build, pipeline: pipeline, status: :pending) + build2 = create(:ci_build, pipeline: pipeline, status: :running) + build3 = create(:ci_build, pipeline: pipeline, status: :success) + build4 = create(:ci_build, pipeline: pipeline, status: :failed) + + visit admin_builds_path(scope: :pending) + + expect(page).to have_selector('.nav-links li.active', text: 'Pending') + expect(page.find('.build-link')).to have_content(build1.id) + expect(page.find('.build-link')).not_to have_content(build2.id) + expect(page.find('.build-link')).not_to have_content(build3.id) + expect(page.find('.build-link')).not_to have_content(build4.id) + expect(page).to have_link 'Cancel all' + end + end + + context 'when have no builds pending' do + it 'shows a message' do + create(:ci_build, pipeline: pipeline, status: :success) + + visit admin_builds_path(scope: :pending) + + expect(page).to have_selector('.nav-links li.active', text: 'Pending') + expect(page).to have_content 'No builds to show' + expect(page).not_to have_link 'Cancel all' + end + end + end + context 'Running tab' do context 'when have running builds' do it 'shows running builds' do - build1 = create(:ci_build, pipeline: pipeline, status: :pending) + build1 = create(:ci_build, pipeline: pipeline, status: :running) build2 = create(:ci_build, pipeline: pipeline, status: :success) build3 = create(:ci_build, pipeline: pipeline, status: :failed) + build4 = create(:ci_build, pipeline: pipeline, status: :pending) visit admin_builds_path(scope: :running) @@ -49,6 +82,7 @@ describe 'Admin Builds' do expect(page.find('.build-link')).to have_content(build1.id) expect(page.find('.build-link')).not_to have_content(build2.id) expect(page.find('.build-link')).not_to have_content(build3.id) + expect(page.find('.build-link')).not_to have_content(build4.id) expect(page).to have_link 'Cancel all' end end diff --git a/spec/features/builds_spec.rb b/spec/features/builds_spec.rb index 16832c297acd6c14d7d53d0406c3d29af2d3219c..cab3dc1d167c8672259767e2512d185a4dcff864 100644 --- a/spec/features/builds_spec.rb +++ b/spec/features/builds_spec.rb @@ -13,17 +13,33 @@ describe "Builds" do end describe "GET /:project/builds" do + context "Pending scope" do + before do + visit namespace_project_builds_path(@project.namespace, @project, scope: :pending) + end + + it "shows Pending tab builds" do + expect(page).to have_link 'Cancel running' + expect(page).to have_selector('.nav-links li.active', text: 'Pending') + expect(page).to have_content @build.short_sha + expect(page).to have_content @build.ref + expect(page).to have_content @build.name + end + end + context "Running scope" do before do @build.run! visit namespace_project_builds_path(@project.namespace, @project, scope: :running) end - it { expect(page).to have_selector('.nav-links li.active', text: 'Running') } - it { expect(page).to have_link 'Cancel running' } - it { expect(page).to have_content @build.short_sha } - it { expect(page).to have_content @build.ref } - it { expect(page).to have_content @build.name } + it "shows Running tab builds" do + expect(page).to have_selector('.nav-links li.active', text: 'Running') + expect(page).to have_link 'Cancel running' + expect(page).to have_content @build.short_sha + expect(page).to have_content @build.ref + expect(page).to have_content @build.name + end end context "Finished scope" do @@ -32,9 +48,11 @@ describe "Builds" do visit namespace_project_builds_path(@project.namespace, @project, scope: :finished) end - it { expect(page).to have_selector('.nav-links li.active', text: 'Finished') } - it { expect(page).to have_content 'No builds to show' } - it { expect(page).to have_link 'Cancel running' } + it "shows Finished tab builds" do + expect(page).to have_selector('.nav-links li.active', text: 'Finished') + expect(page).to have_content 'No builds to show' + expect(page).to have_link 'Cancel running' + end end context "All builds" do @@ -43,11 +61,13 @@ describe "Builds" do visit namespace_project_builds_path(@project.namespace, @project) end - it { expect(page).to have_selector('.nav-links li.active', text: 'All') } - it { expect(page).to have_content @build.short_sha } - it { expect(page).to have_content @build.ref } - it { expect(page).to have_content @build.name } - it { expect(page).not_to have_link 'Cancel running' } + it "shows All tab builds" do + expect(page).to have_selector('.nav-links li.active', text: 'All') + expect(page).to have_content @build.short_sha + expect(page).to have_content @build.ref + expect(page).to have_content @build.name + expect(page).not_to have_link 'Cancel running' + end end end diff --git a/spec/features/environments_spec.rb b/spec/features/environments_spec.rb index 7fb28f4174b01be2c13a32657d016700ecb6ecf0..9c018be14b7400a273554ed657bc4bd3e7c721e2 100644 --- a/spec/features/environments_spec.rb +++ b/spec/features/environments_spec.rb @@ -13,6 +13,7 @@ feature 'Environments', feature: true do describe 'when showing environments' do given!(:environment) { } given!(:deployment) { } + given!(:manual) { } before do visit namespace_project_environments_path(project.namespace, project) @@ -43,6 +44,24 @@ feature 'Environments', feature: true do scenario 'does show deployment SHA' do expect(page).to have_link(deployment.short_sha) end + + context 'with build and manual actions' do + given(:pipeline) { create(:ci_pipeline, project: project) } + given(:build) { create(:ci_build, pipeline: pipeline) } + given(:deployment) { create(:deployment, environment: environment, deployable: build) } + given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy to production') } + + scenario 'does show a play button' do + expect(page).to have_link(manual.name.humanize) + end + + scenario 'does allow to play manual action' do + expect(manual).to be_skipped + expect{ click_link(manual.name.humanize) }.not_to change { Ci::Pipeline.count } + expect(page).to have_content(manual.name) + expect(manual.reload).to be_pending + end + end end end @@ -54,6 +73,7 @@ feature 'Environments', feature: true do describe 'when showing the environment' do given(:environment) { create(:environment, project: project) } given!(:deployment) { } + given!(:manual) { } before do visit namespace_project_environment_path(project.namespace, project, environment) @@ -77,7 +97,8 @@ feature 'Environments', feature: true do end context 'with build' do - given(:build) { create(:ci_build, project: project) } + given(:pipeline) { create(:ci_pipeline, project: project) } + given(:build) { create(:ci_build, pipeline: pipeline) } given(:deployment) { create(:deployment, environment: environment, deployable: build) } scenario 'does show build name' do @@ -87,6 +108,21 @@ feature 'Environments', feature: true do scenario 'does show retry button' do expect(page).to have_link('Retry') end + + context 'with manual action' do + given(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy to production') } + + scenario 'does show a play button' do + expect(page).to have_link(manual.name.humanize) + end + + scenario 'does allow to play manual action' do + expect(manual).to be_skipped + expect{ click_link(manual.name.humanize) }.not_to change { Ci::Pipeline.count } + expect(page).to have_content(manual.name) + expect(manual.reload).to be_pending + end + end end end end diff --git a/spec/features/expand_collapse_diffs_spec.rb b/spec/features/expand_collapse_diffs_spec.rb index 78bc888f2a6e3fa1ab2d255ead1f10bca603885c..688f68d3cff30c56dd75ed2919af35e398b27ed0 100644 --- a/spec/features/expand_collapse_diffs_spec.rb +++ b/spec/features/expand_collapse_diffs_spec.rb @@ -3,10 +3,11 @@ require 'spec_helper' feature 'Expand and collapse diffs', js: true, feature: true do include WaitForAjax + let(:branch) { 'expand-collapse-diffs' } + before do login_as :admin project = create(:project) - branch = 'expand-collapse-diffs' # Ensure that undiffable.md is in .gitattributes project.repository.copy_gitattributes(branch) @@ -167,6 +168,46 @@ feature 'Expand and collapse diffs', js: true, feature: true do end end + context 'visiting a commit without collapsed diffs' do + let(:branch) { 'feature' } + + it 'does not show Expand all button' do + expect(page).not_to have_link('Expand all') + end + end + + context 'visiting a commit with more than safe files' do + let(:branch) { 'expand-collapse-files' } + + # safe-files -> 100 | safe-lines -> 5000 | commit-files -> 105 + it 'does collapsing from the safe number of files to the end on small files' do + expect(page).to have_link('Expand all') + + expect(page).to have_selector('.diff-content', count: 105) + expect(page).to have_selector('.diff-collapsed', count: 5) + + %w(file-95.txt file-96.txt file-97.txt file-98.txt file-99.txt).each do |filename| + expect(find("[data-blob-diff-path*='#{filename}']")).to have_selector('.diff-collapsed') + end + end + end + + context 'visiting a commit with more than safe lines' do + let(:branch) { 'expand-collapse-lines' } + + # safe-files -> 100 | safe-lines -> 5000 | commit_files -> 8 (each 1250 lines) + it 'does collapsing from the safe number of lines to the end' do + expect(page).to have_link('Expand all') + + expect(page).to have_selector('.diff-content', count: 6) + expect(page).to have_selector('.diff-collapsed', count: 2) + + %w(file-4.txt file-5.txt).each do |filename| + expect(find("[data-blob-diff-path*='#{filename}']")).to have_selector('.diff-collapsed') + end + end + end + context 'expanding all diffs' do before do click_link('Expand all') diff --git a/spec/features/pipelines_spec.rb b/spec/features/pipelines_spec.rb index e7ee0aaea3c6cf7feabecca37be9f54132f91acd..7f861db196981a1651e80e5d6a3b9b2222b00c85 100644 --- a/spec/features/pipelines_spec.rb +++ b/spec/features/pipelines_spec.rb @@ -62,6 +62,20 @@ describe "Pipelines" do end end + context 'with manual actions' do + let!(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'manual build', stage: 'test', commands: 'test') } + + before { visit namespace_project_pipelines_path(project.namespace, project) } + + it { expect(page).to have_link('Manual build') } + + context 'when playing' do + before { click_link('Manual build') } + + it { expect(manual.reload).to be_pending } + end + end + context 'for generic statuses' do context 'when running' do let!(:running) { create(:generic_commit_status, status: 'running', pipeline: pipeline, stage: 'test') } @@ -117,6 +131,7 @@ describe "Pipelines" do @success = create(:ci_build, :success, pipeline: pipeline, stage: 'build', name: 'build') @failed = create(:ci_build, :failed, pipeline: pipeline, stage: 'test', name: 'test', commands: 'test') @running = create(:ci_build, :running, pipeline: pipeline, stage: 'deploy', name: 'deploy') + @manual = create(:ci_build, :manual, pipeline: pipeline, stage: 'deploy', name: 'manual build') @external = create(:generic_commit_status, status: 'success', pipeline: pipeline, name: 'jenkins', stage: 'external') end @@ -131,6 +146,7 @@ describe "Pipelines" do expect(page).to have_content(@external.id) expect(page).to have_content('Retry failed') expect(page).to have_content('Cancel running') + expect(page).to have_link('Play') end context 'retrying builds' do @@ -154,6 +170,12 @@ describe "Pipelines" do it { expect(page).to have_selector('.ci-canceled') } end end + + context 'playing manual build' do + before { click_link('Play') } + + it { expect(@manual.reload).to be_pending } + end end describe 'POST /:project/pipelines' do diff --git a/spec/features/security/project/internal_access_spec.rb b/spec/features/security/project/internal_access_spec.rb index 13d980a326f512f9656c16e6a1dc3e0e808b9e2f..b6acc509342af993f534b124a8faf6f065a42b93 100644 --- a/spec/features/security/project/internal_access_spec.rb +++ b/spec/features/security/project/internal_access_spec.rb @@ -426,4 +426,23 @@ describe "Internal Project Access", feature: true do it { is_expected.to be_denied_for :external } it { is_expected.to be_denied_for :visitor } end + + describe "GET /:project_path/container_registry" do + before do + stub_container_registry_tags('latest') + stub_container_registry_config(enabled: true) + end + + subject { namespace_project_container_registry_index_path(project.namespace, project) } + + it { is_expected.to be_allowed_for :admin } + it { is_expected.to be_allowed_for owner } + it { is_expected.to be_allowed_for master } + it { is_expected.to be_allowed_for developer } + it { is_expected.to be_allowed_for reporter } + it { is_expected.to be_allowed_for guest } + it { is_expected.to be_allowed_for :user } + it { is_expected.to be_denied_for :external } + it { is_expected.to be_denied_for :visitor } + end end diff --git a/spec/features/security/project/private_access_spec.rb b/spec/features/security/project/private_access_spec.rb index ac9690cc12796f7001a98cfe7efd2df49229018f..ccb5c06dab013144d0d6974d892a9ecb40357954 100644 --- a/spec/features/security/project/private_access_spec.rb +++ b/spec/features/security/project/private_access_spec.rb @@ -362,4 +362,23 @@ describe "Private Project Access", feature: true do it { is_expected.to be_denied_for :external } it { is_expected.to be_denied_for :visitor } end + + describe "GET /:project_path/container_registry" do + before do + stub_container_registry_tags('latest') + stub_container_registry_config(enabled: true) + end + + subject { namespace_project_container_registry_index_path(project.namespace, project) } + + it { is_expected.to be_allowed_for :admin } + it { is_expected.to be_allowed_for owner } + it { is_expected.to be_allowed_for master } + it { is_expected.to be_allowed_for developer } + it { is_expected.to be_allowed_for reporter } + it { is_expected.to be_denied_for guest } + it { is_expected.to be_denied_for :user } + it { is_expected.to be_denied_for :external } + it { is_expected.to be_denied_for :visitor } + end end diff --git a/spec/features/security/project/public_access_spec.rb b/spec/features/security/project/public_access_spec.rb index 737897de52b694b006a7043b5053be28206569ec..985663e7c989a4c9d76bd9bdab53c99ebb2819a2 100644 --- a/spec/features/security/project/public_access_spec.rb +++ b/spec/features/security/project/public_access_spec.rb @@ -426,4 +426,23 @@ describe "Public Project Access", feature: true do it { is_expected.to be_denied_for :external } it { is_expected.to be_denied_for :visitor } end + + describe "GET /:project_path/container_registry" do + before do + stub_container_registry_tags('latest') + stub_container_registry_config(enabled: true) + end + + subject { namespace_project_container_registry_index_path(project.namespace, project) } + + it { is_expected.to be_allowed_for :admin } + it { is_expected.to be_allowed_for owner } + it { is_expected.to be_allowed_for master } + it { is_expected.to be_allowed_for developer } + it { is_expected.to be_allowed_for reporter } + it { is_expected.to be_allowed_for guest } + it { is_expected.to be_allowed_for :user } + it { is_expected.to be_allowed_for :external } + it { is_expected.to be_allowed_for :visitor } + end end diff --git a/spec/helpers/ci_status_helper_spec.rb b/spec/helpers/ci_status_helper_spec.rb index 45199d0f09da61489db4f2d3ed95452faa654605..637b02d938877df3b8d3df37b5d5d3a107522afe 100644 --- a/spec/helpers/ci_status_helper_spec.rb +++ b/spec/helpers/ci_status_helper_spec.rb @@ -7,7 +7,13 @@ describe CiStatusHelper do let(:failed_commit) { double("Ci::Pipeline", status: 'failed') } describe 'ci_icon_for_status' do - it { expect(helper.ci_icon_for_status(success_commit.status)).to include('fa-check') } - it { expect(helper.ci_icon_for_status(failed_commit.status)).to include('fa-close') } + it 'renders to correct svg on success' do + expect(helper).to receive(:render).with('shared/icons/icon_status_success.svg', anything) + helper.ci_icon_for_status(success_commit.status) + end + it 'renders the correct svg on failure' do + expect(helper).to receive(:render).with('shared/icons/icon_status_failed.svg', anything) + helper.ci_icon_for_status(failed_commit.status) + end end end diff --git a/spec/helpers/diff_helper_spec.rb b/spec/helpers/diff_helper_spec.rb index 4b134a4841008a7c62dbd989bc566dd0c7cef2ad..c2fd2c8a5336e43eebda2225418195b2f6ae8ab2 100644 --- a/spec/helpers/diff_helper_spec.rb +++ b/spec/helpers/diff_helper_spec.rb @@ -30,12 +30,31 @@ describe DiffHelper do expect(helper.diff_view).to eq 'inline' end end - + describe 'diff_options' do - it 'should return hard limit for a diff' do + it 'should return hard limit for a diff if force diff is true' do allow(controller).to receive(:params) { { force_show_diff: true } } expect(diff_options).to include(Commit.max_diff_options) end + + it 'should return hard limit for a diff if expand_all_diffs is true' do + allow(controller).to receive(:params) { { expand_all_diffs: true } } + expect(diff_options).to include(Commit.max_diff_options) + end + + it 'should return no collapse false' do + expect(diff_options).to include(no_collapse: false) + end + + it 'should return no collapse true if expand_all_diffs' do + allow(controller).to receive(:params) { { expand_all_diffs: true } } + expect(diff_options).to include(no_collapse: true) + end + + it 'should return no collapse true if action name diff_for_path' do + allow(controller).to receive(:action_name) { 'diff_for_path' } + expect(diff_options).to include(no_collapse: true) + end end describe 'unfold_bottom_class' do diff --git a/spec/helpers/time_helper_spec.rb b/spec/helpers/time_helper_spec.rb index 3f62527c5bbc1e756e69b89ba376d6e198530f04..413ead944b9ab422f0be56c0bb3d4636380d138d 100644 --- a/spec/helpers/time_helper_spec.rb +++ b/spec/helpers/time_helper_spec.rb @@ -1,7 +1,7 @@ require 'spec_helper' describe TimeHelper do - describe "#duration_in_words" do + describe "#time_interval_in_words" do it "returns minutes and seconds" do intervals_in_words = { 100 => "1 minute 40 seconds", @@ -11,26 +11,23 @@ describe TimeHelper do } intervals_in_words.each do |interval, expectation| - expect(duration_in_words(Time.now + interval, Time.now)).to eq(expectation) + expect(time_interval_in_words(interval)).to eq(expectation) end end - - it "calculates interval from now if there is no finished_at" do - expect(duration_in_words(nil, Time.now - 5)).to eq("5 seconds") - end end - describe "#time_interval_in_words" do + describe "#duration_in_numbers" do it "returns minutes and seconds" do - intervals_in_words = { - 100 => "1 minute 40 seconds", - 121 => "2 minutes 1 second", - 3721 => "62 minutes 1 second", - 0 => "0 seconds" + duration_in_numbers = { + [100, 0] => "01:40", + [121, 0] => "02:01", + [3721, 0] => "01:02:01", + [0, 0] => "00:00", + [nil, Time.now.to_i - 42] => "00:42" } - intervals_in_words.each do |interval, expectation| - expect(time_interval_in_words(interval)).to eq(expectation) + duration_in_numbers.each do |interval, expectation| + expect(duration_in_numbers(*interval)).to eq(expectation) end end end diff --git a/spec/lib/banzai/filter/autolink_filter_spec.rb b/spec/lib/banzai/filter/autolink_filter_spec.rb index 84c2ddf444e6f071944825c7f7be554b3383f6f7..dca7f9975701dd90ccc86d89baba7a3bbf569898 100644 --- a/spec/lib/banzai/filter/autolink_filter_spec.rb +++ b/spec/lib/banzai/filter/autolink_filter_spec.rb @@ -15,6 +15,16 @@ describe Banzai::Filter::AutolinkFilter, lib: true do expect(filter(act).to_html).to eq exp end + context 'when the input contains no links' do + it 'does not parse_html back the rinku returned value' do + act = HTML::Pipeline.parse('<p>This text contains no links to autolink</p>') + + expect_any_instance_of(described_class).not_to receive(:parse_html) + + filter(act).to_html + end + end + context 'Rinku schemes' do it 'autolinks http' do doc = filter("See #{link}") @@ -58,6 +68,16 @@ describe Banzai::Filter::AutolinkFilter, lib: true do expect(filter(act).to_html).to eq exp end end + + context 'when the input contains link' do + it 'does parse_html back the rinku returned value' do + act = HTML::Pipeline.parse("<p>See #{link}</p>") + + expect_any_instance_of(described_class).to receive(:parse_html).at_least(:once).and_call_original + + filter(act).to_html + end + end end context 'other schemes' do diff --git a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb index 9735af27aa1b98f4ad7a5e6ff243c8e2f3f6d1d5..5785b7e59fb4f1362dcc511d0d451abbb20aa911 100644 --- a/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb +++ b/spec/lib/ci/gitlab_ci_yaml_processor_spec.rb @@ -19,15 +19,14 @@ module Ci expect(config_processor.builds_for_stage_and_ref(type, "master").first).to eq({ stage: "test", stage_idx: 1, - except: nil, name: :rspec, - only: nil, commands: "pwd\nrspec", tag_list: [], options: {}, allow_failure: false, when: "on_success", environment: nil, + yaml_variables: [] }) end @@ -432,11 +431,9 @@ module Ci expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1) expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({ - except: nil, stage: "test", stage_idx: 1, name: :rspec, - only: nil, commands: "pwd\nrspec", tag_list: [], options: { @@ -446,6 +443,7 @@ module Ci allow_failure: false, when: "on_success", environment: nil, + yaml_variables: [] }) end @@ -461,11 +459,9 @@ module Ci expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1) expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({ - except: nil, stage: "test", stage_idx: 1, name: :rspec, - only: nil, commands: "pwd\nrspec", tag_list: [], options: { @@ -475,101 +471,126 @@ module Ci allow_failure: false, when: "on_success", environment: nil, + yaml_variables: [] }) end end describe 'Variables' do - context 'when global variables are defined' do - it 'returns global variables' do - variables = { - VAR1: 'value1', - VAR2: 'value2', - } + let(:config_processor) { GitlabCiYamlProcessor.new(YAML.dump(config), path) } - config = YAML.dump({ + subject { config_processor.builds.first[:yaml_variables] } + + context 'when global variables are defined' do + let(:variables) do + { VAR1: 'value1', VAR2: 'value2' } + end + let(:config) do + { variables: variables, before_script: ['pwd'], rspec: { script: 'rspec' } - }) + } + end - config_processor = GitlabCiYamlProcessor.new(config, path) + it 'returns global variables' do + expect(subject).to contain_exactly( + { key: :VAR1, value: 'value1', public: true }, + { key: :VAR2, value: 'value2', public: true } + ) + end + end + + context 'when job and global variables are defined' do + let(:global_variables) do + { VAR1: 'global1', VAR3: 'global3' } + end + let(:job_variables) do + { VAR1: 'value1', VAR2: 'value2' } + end + let(:config) do + { + before_script: ['pwd'], + variables: global_variables, + rspec: { script: 'rspec', variables: job_variables } + } + end - expect(config_processor.global_variables).to eq(variables) + it 'returns all unique variables' do + expect(subject).to contain_exactly( + { key: :VAR3, value: 'global3', public: true }, + { key: :VAR1, value: 'value1', public: true }, + { key: :VAR2, value: 'value2', public: true } + ) end end context 'when job variables are defined' do - context 'when syntax is correct' do - it 'returns job variables' do - variables = { - KEY1: 'value1', - SOME_KEY_2: 'value2' - } + let(:config) do + { + before_script: ['pwd'], + rspec: { script: 'rspec', variables: variables } + } + end + + context 'when also global variables are defined' do - config = YAML.dump( - { before_script: ['pwd'], - rspec: { - variables: variables, - script: 'rspec' } - }) + end - config_processor = GitlabCiYamlProcessor.new(config, path) + context 'when syntax is correct' do + let(:variables) do + { VAR1: 'value1', VAR2: 'value2' } + end - expect(config_processor.job_variables(:rspec)).to eq variables + it 'returns job variables' do + expect(subject).to contain_exactly( + { key: :VAR1, value: 'value1', public: true }, + { key: :VAR2, value: 'value2', public: true } + ) end end context 'when syntax is incorrect' do context 'when variables defined but invalid' do - it 'raises error' do - variables = [:KEY1, 'value1', :KEY2, 'value2'] - - config = YAML.dump( - { before_script: ['pwd'], - rspec: { - variables: variables, - script: 'rspec' } - }) + let(:variables) do + [ :VAR1, 'value1', :VAR2, 'value2' ] + end - expect { GitlabCiYamlProcessor.new(config, path) } + it 'raises error' do + expect { subject } .to raise_error(GitlabCiYamlProcessor::ValidationError, /jobs:rspec:variables config should be a hash of key value pairs/) end end context 'when variables key defined but value not specified' do - it 'returns empty array' do - config = YAML.dump( - { before_script: ['pwd'], - rspec: { - variables: nil, - script: 'rspec' } - }) - - config_processor = GitlabCiYamlProcessor.new(config, path) + let(:variables) do + nil + end + it 'returns empty array' do ## # When variables config is empty, we assume this is a valid # configuration, see issue #18775 # - expect(config_processor.job_variables(:rspec)) - .to be_an_instance_of(Array).and be_empty + expect(subject).to be_an_instance_of(Array) + expect(subject).to be_empty end end end end context 'when job variables are not defined' do - it 'returns empty array' do - config = YAML.dump({ + let(:config) do + { before_script: ['pwd'], rspec: { script: 'rspec' } - }) - - config_processor = GitlabCiYamlProcessor.new(config, path) + } + end - expect(config_processor.job_variables(:rspec)).to eq [] + it 'returns empty array' do + expect(subject).to be_an_instance_of(Array) + expect(subject).to be_empty end end end @@ -681,11 +702,9 @@ module Ci expect(config_processor.builds_for_stage_and_ref("test", "master").size).to eq(1) expect(config_processor.builds_for_stage_and_ref("test", "master").first).to eq({ - except: nil, stage: "test", stage_idx: 1, name: :rspec, - only: nil, commands: "pwd\nrspec", tag_list: [], options: { @@ -701,6 +720,7 @@ module Ci when: "on_success", allow_failure: false, environment: nil, + yaml_variables: [] }) end @@ -819,17 +839,16 @@ module Ci it "doesn't create jobs that start with dot" do expect(subject.size).to eq(1) expect(subject.first).to eq({ - except: nil, stage: "test", stage_idx: 1, name: :normal_job, - only: nil, commands: "test", tag_list: [], options: {}, when: "on_success", allow_failure: false, environment: nil, + yaml_variables: [] }) end end @@ -865,30 +884,28 @@ module Ci it "is correctly supported for jobs" do expect(subject.size).to eq(2) expect(subject.first).to eq({ - except: nil, stage: "build", stage_idx: 0, name: :job1, - only: nil, commands: "execute-script-for-job", tag_list: [], options: {}, when: "on_success", allow_failure: false, environment: nil, + yaml_variables: [] }) expect(subject.second).to eq({ - except: nil, stage: "build", stage_idx: 0, name: :job2, - only: nil, commands: "execute-script-for-job", tag_list: [], options: {}, when: "on_success", allow_failure: false, environment: nil, + yaml_variables: [] }) end end @@ -1131,7 +1148,7 @@ EOT config = YAML.dump({ rspec: { script: "test", when: 1 } }) expect do GitlabCiYamlProcessor.new(config, path) - end.to raise_error(GitlabCiYamlProcessor::ValidationError, "jobs:rspec when should be on_success, on_failure or always") + end.to raise_error(GitlabCiYamlProcessor::ValidationError, "jobs:rspec when should be on_success, on_failure, always or manual") end it "returns errors if job artifacts:name is not an a string" do diff --git a/spec/lib/container_registry/blob_spec.rb b/spec/lib/container_registry/blob_spec.rb index 4d8cb787ddeef5924d15064bfbe89933f0440793..bbacdc67ebd30d8dd7eb2c39da9cebf4762147b0 100644 --- a/spec/lib/container_registry/blob_spec.rb +++ b/spec/lib/container_registry/blob_spec.rb @@ -9,8 +9,9 @@ describe ContainerRegistry::Blob do 'size' => 1000 } end + let(:token) { 'authorization-token' } - let(:registry) { ContainerRegistry::Registry.new('http://example.com') } + let(:registry) { ContainerRegistry::Registry.new('http://example.com', token: token) } let(:repository) { registry.repository('group/test') } let(:blob) { repository.blob(config) } @@ -58,4 +59,53 @@ describe ContainerRegistry::Blob do it { is_expected.to be_truthy } end + + context '#data' do + let(:data) { '{"key":"value"}' } + + subject { blob.data } + + context 'when locally stored' do + before do + stub_request(:get, 'http://example.com/v2/group/test/blobs/sha256:0123456789012345'). + to_return( + status: 200, + headers: { 'Content-Type' => 'application/json' }, + body: data) + end + + it { is_expected.to eq(data) } + end + + context 'when externally stored' do + before do + stub_request(:get, 'http://example.com/v2/group/test/blobs/sha256:0123456789012345'). + with(headers: { 'Authorization' => "bearer #{token}" }). + to_return( + status: 307, + headers: { 'Location' => location }) + end + + context 'for a valid address' do + let(:location) { 'http://external.com/blob/file' } + + before do + stub_request(:get, location). + with(headers: { 'Authorization' => nil }). + to_return( + status: 200, + headers: { 'Content-Type' => 'application/json' }, + body: data) + end + + it { is_expected.to eq(data) } + end + + context 'for invalid file' do + let(:location) { 'file:///etc/passwd' } + + it { expect{ subject }.to raise_error(ArgumentError, 'invalid address') } + end + end + end end diff --git a/spec/lib/container_registry/tag_spec.rb b/spec/lib/container_registry/tag_spec.rb index c7324c2bf7726554615a5f800880c966192479c1..c5e31ae82b6a2cf1d709bafef3bc39bb8385b6b0 100644 --- a/spec/lib/container_registry/tag_spec.rb +++ b/spec/lib/container_registry/tag_spec.rb @@ -77,24 +77,47 @@ describe ContainerRegistry::Tag do end context 'config processing' do - before do - stub_request(:get, 'http://example.com/v2/group/test/blobs/sha256:d7a513a663c1a6dcdba9ed832ca53c02ac2af0c333322cd6ca92936d1d9917ac'). - with(headers: { 'Accept' => 'application/octet-stream' }). - to_return( - status: 200, - body: File.read(Rails.root + 'spec/fixtures/container_registry/config_blob.json')) - end + shared_examples 'a processable' do + context '#config' do + subject { tag.config } - context '#config' do - subject { tag.config } + it { is_expected.not_to be_nil } + end + + context '#created_at' do + subject { tag.created_at } - it { is_expected.not_to be_nil } + it { is_expected.not_to be_nil } + end end - context '#created_at' do - subject { tag.created_at } + context 'when locally stored' do + before do + stub_request(:get, 'http://example.com/v2/group/test/blobs/sha256:d7a513a663c1a6dcdba9ed832ca53c02ac2af0c333322cd6ca92936d1d9917ac'). + with(headers: { 'Accept' => 'application/octet-stream' }). + to_return( + status: 200, + body: File.read(Rails.root + 'spec/fixtures/container_registry/config_blob.json')) + end + + it_behaves_like 'a processable' + end - it { is_expected.not_to be_nil } + context 'when externally stored' do + before do + stub_request(:get, 'http://example.com/v2/group/test/blobs/sha256:d7a513a663c1a6dcdba9ed832ca53c02ac2af0c333322cd6ca92936d1d9917ac'). + with(headers: { 'Accept' => 'application/octet-stream' }). + to_return( + status: 307, + headers: { 'Location' => 'http://external.com/blob/file' }) + + stub_request(:get, 'http://external.com/blob/file'). + to_return( + status: 200, + body: File.read(Rails.root + 'spec/fixtures/container_registry/config_blob.json')) + end + + it_behaves_like 'a processable' end end end diff --git a/spec/lib/gitlab/badge/build_spec.rb b/spec/lib/gitlab/badge/build_spec.rb index 2034445a197320280ae1c625988b25c6188e104b..f3b522a02f52d173e5fa06f0a8e09775c5dca69c 100644 --- a/spec/lib/gitlab/badge/build_spec.rb +++ b/spec/lib/gitlab/badge/build_spec.rb @@ -113,7 +113,7 @@ describe Gitlab::Badge::Build do sha: sha, ref: branch) - create(:ci_build, pipeline: pipeline) + create(:ci_build, pipeline: pipeline, stage: 'notify') end def status_node(data, status) diff --git a/spec/lib/gitlab/bitbucket_import/client_spec.rb b/spec/lib/gitlab/bitbucket_import/client_spec.rb index 760d66a148883cfe786dc3b8732078da9ee6d410..7543c29bcc449f5f94551b4cfc90f497415cfa5d 100644 --- a/spec/lib/gitlab/bitbucket_import/client_spec.rb +++ b/spec/lib/gitlab/bitbucket_import/client_spec.rb @@ -54,12 +54,12 @@ describe Gitlab::BitbucketImport::Client, lib: true do context 'project import' do it 'calls .from_project with no errors' do project = create(:empty_project) + project.import_url = "ssh://git@bitbucket.org/test/test.git" project.create_or_update_import_data(credentials: { user: "git", password: nil, bb_session: { bitbucket_access_token: "test", bitbucket_access_token_secret: "test" } }) - project.import_url = "ssh://git@bitbucket.org/test/test.git" expect { described_class.from_project(project) }.not_to raise_error end diff --git a/spec/lib/gitlab/diff/file_spec.rb b/spec/lib/gitlab/diff/file_spec.rb index 0460dcf4658afd8fa0be42def6d40591de575eaa..e883a6eb9c2e120f0ecbefc7a0bedd75c6090580 100644 --- a/spec/lib/gitlab/diff/file_spec.rb +++ b/spec/lib/gitlab/diff/file_spec.rb @@ -32,4 +32,18 @@ describe Gitlab::Diff::File, lib: true do expect(diff_file.too_large?).to eq(false) end end + + describe '#collapsed?' do + it 'returns true for a file that is quite big' do + expect(diff).to receive(:collapsed?).and_return(true) + + expect(diff_file.collapsed?).to eq(true) + end + + it 'returns false for a file that is small enough' do + expect(diff).to receive(:collapsed?).and_return(false) + + expect(diff_file.collapsed?).to eq(false) + end + end end diff --git a/spec/lib/gitlab/diff/position_tracer_spec.rb b/spec/lib/gitlab/diff/position_tracer_spec.rb index 08312e60f4a7f40b45df10e55a951b279bf919d5..c268f84c75900ddea0c604fb40503cf8685ea981 100644 --- a/spec/lib/gitlab/diff/position_tracer_spec.rb +++ b/spec/lib/gitlab/diff/position_tracer_spec.rb @@ -1639,7 +1639,8 @@ describe Gitlab::Diff::PositionTracer, lib: true do committer: committer } - repository.merge(current_user, second_create_file_commit.sha, branch_name, options) + merge_request = create(:merge_request, source_branch: second_create_file_commit.sha, target_branch: branch_name, source_project: project) + repository.merge(current_user, merge_request, options) project.commit(branch_name) end diff --git a/spec/lib/gitlab/git_access_spec.rb b/spec/lib/gitlab/git_access_spec.rb index c79ba11f782dbe0e946e483a41db568908f47be3..ae064a878b03c687338c2be5795beda7826a72e8 100644 --- a/spec/lib/gitlab/git_access_spec.rb +++ b/spec/lib/gitlab/git_access_spec.rb @@ -6,67 +6,6 @@ describe Gitlab::GitAccess, lib: true do let(:user) { create(:user) } let(:actor) { user } - describe 'can_push_to_branch?' do - describe 'push to none protected branch' do - it "returns true if user is a master" do - project.team << [user, :master] - expect(access.can_push_to_branch?("random_branch")).to be_truthy - end - - it "returns true if user is a developer" do - project.team << [user, :developer] - expect(access.can_push_to_branch?("random_branch")).to be_truthy - end - - it "returns false if user is a reporter" do - project.team << [user, :reporter] - expect(access.can_push_to_branch?("random_branch")).to be_falsey - end - end - - describe 'push to protected branch' do - before do - @branch = create :protected_branch, project: project - end - - it "returns true if user is a master" do - project.team << [user, :master] - expect(access.can_push_to_branch?(@branch.name)).to be_truthy - end - - it "returns false if user is a developer" do - project.team << [user, :developer] - expect(access.can_push_to_branch?(@branch.name)).to be_falsey - end - - it "returns false if user is a reporter" do - project.team << [user, :reporter] - expect(access.can_push_to_branch?(@branch.name)).to be_falsey - end - end - - describe 'push to protected branch if allowed for developers' do - before do - @branch = create :protected_branch, project: project, developers_can_push: true - end - - it "returns true if user is a master" do - project.team << [user, :master] - expect(access.can_push_to_branch?(@branch.name)).to be_truthy - end - - it "returns true if user is a developer" do - project.team << [user, :developer] - expect(access.can_push_to_branch?(@branch.name)).to be_truthy - end - - it "returns false if user is a reporter" do - project.team << [user, :reporter] - expect(access.can_push_to_branch?(@branch.name)).to be_falsey - end - end - end - describe '#check with single protocols allowed' do def disable_protocol(protocol) settings = ::ApplicationSetting.create_from_defaults @@ -105,12 +44,12 @@ describe Gitlab::GitAccess, lib: true do end describe 'download_access_check' do + subject { access.check('git-upload-pack') } + describe 'master permissions' do before { project.team << [user, :master] } context 'pull code' do - subject { access.download_access_check } - it { expect(subject.allowed?).to be_truthy } end end @@ -119,8 +58,6 @@ describe Gitlab::GitAccess, lib: true do before { project.team << [user, :guest] } context 'pull code' do - subject { access.download_access_check } - it { expect(subject.allowed?).to be_falsey } end end @@ -132,16 +69,12 @@ describe Gitlab::GitAccess, lib: true do end context 'pull code' do - subject { access.download_access_check } - it { expect(subject.allowed?).to be_falsey } end end describe 'without acccess to project' do context 'pull code' do - subject { access.download_access_check } - it { expect(subject.allowed?).to be_falsey } end end @@ -151,110 +84,208 @@ describe Gitlab::GitAccess, lib: true do let(:actor) { key } context 'pull code' do - before { key.projects << project } - subject { access.download_access_check } + context 'when project is authorized' do + before { key.projects << project } - it { expect(subject.allowed?).to be_truthy } + it { expect(subject).to be_allowed } + end + + context 'when unauthorized' do + context 'from public project' do + let(:project) { create(:project, :public) } + + it { expect(subject).to be_allowed } + end + + context 'from internal project' do + let(:project) { create(:project, :internal) } + + it { expect(subject).not_to be_allowed } + end + + context 'from private project' do + let(:project) { create(:project, :internal) } + + it { expect(subject).not_to be_allowed } + end + end end end end describe 'push_access_check' do - def protect_feature_branch - create(:protected_branch, name: 'feature', project: project) - end + before { merge_into_protected_branch } + let(:unprotected_branch) { FFaker::Internet.user_name } - def changes - { - push_new_branch: "#{Gitlab::Git::BLANK_SHA} 570e7b2ab refs/heads/wow", + let(:changes) do + { push_new_branch: "#{Gitlab::Git::BLANK_SHA} 570e7b2ab refs/heads/wow", push_master: '6f6d7e7ed 570e7b2ab refs/heads/master', push_protected_branch: '6f6d7e7ed 570e7b2ab refs/heads/feature', push_remove_protected_branch: "570e7b2ab #{Gitlab::Git::BLANK_SHA} "\ 'refs/heads/feature', push_tag: '6f6d7e7ed 570e7b2ab refs/tags/v1.0.0', push_new_tag: "#{Gitlab::Git::BLANK_SHA} 570e7b2ab refs/tags/v7.8.9", - push_all: ['6f6d7e7ed 570e7b2ab refs/heads/master', '6f6d7e7ed 570e7b2ab refs/heads/feature'] - } + push_all: ['6f6d7e7ed 570e7b2ab refs/heads/master', '6f6d7e7ed 570e7b2ab refs/heads/feature'], + merge_into_protected_branch: "0b4bc9a #{merge_into_protected_branch} refs/heads/feature" } end - def self.permissions_matrix - { - master: { - push_new_branch: true, - push_master: true, - push_protected_branch: true, - push_remove_protected_branch: false, - push_tag: true, - push_new_tag: true, - push_all: true, - }, - - developer: { - push_new_branch: true, - push_master: true, - push_protected_branch: false, - push_remove_protected_branch: false, - push_tag: false, - push_new_tag: true, - push_all: false, - }, - - reporter: { - push_new_branch: false, - push_master: false, - push_protected_branch: false, - push_remove_protected_branch: false, - push_tag: false, - push_new_tag: false, - push_all: false, - }, - - guest: { - push_new_branch: false, - push_master: false, - push_protected_branch: false, - push_remove_protected_branch: false, - push_tag: false, - push_new_tag: false, - push_all: false, - } - } + def stub_git_hooks + # Running the `pre-receive` hook is expensive, and not necessary for this test. + allow_any_instance_of(GitHooksService).to receive(:execute).and_yield end - def self.updated_permissions_matrix - updated_permissions_matrix = permissions_matrix.dup - updated_permissions_matrix[:developer][:push_protected_branch] = true - updated_permissions_matrix[:developer][:push_all] = true - updated_permissions_matrix + def merge_into_protected_branch + @protected_branch_merge_commit ||= begin + stub_git_hooks + project.repository.add_branch(user, unprotected_branch, 'feature') + target_branch = project.repository.lookup('feature') + source_branch = project.repository.commit_file(user, FFaker::InternetSE.login_user_name, FFaker::HipsterIpsum.paragraph, FFaker::HipsterIpsum.sentence, unprotected_branch, false) + rugged = project.repository.rugged + author = { email: "email@example.com", time: Time.now, name: "Example Git User" } + + merge_index = rugged.merge_commits(target_branch, source_branch) + Rugged::Commit.create(rugged, author: author, committer: author, message: "commit message", parents: [target_branch, source_branch], tree: merge_index.write_tree(rugged)) + end end - permissions_matrix.keys.each do |role| - describe "#{role} access" do - before { protect_feature_branch } - before { project.team << [user, role] } + def self.run_permission_checks(permissions_matrix) + permissions_matrix.keys.each do |role| + describe "#{role} access" do + before { project.team << [user, role] } - permissions_matrix[role].each do |action, allowed| - context action do - subject { access.push_access_check(changes[action]) } + permissions_matrix[role].each do |action, allowed| + context action do + subject { access.push_access_check(changes[action]) } - it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey } + it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey } + end end end end end - context "with enabled developers push to protected branches " do - updated_permissions_matrix.keys.each do |role| - describe "#{role} access" do - before { create(:protected_branch, name: 'feature', developers_can_push: true, project: project) } - before { project.team << [user, role] } + permissions_matrix = { + master: { + push_new_branch: true, + push_master: true, + push_protected_branch: true, + push_remove_protected_branch: false, + push_tag: true, + push_new_tag: true, + push_all: true, + merge_into_protected_branch: true + }, + + developer: { + push_new_branch: true, + push_master: true, + push_protected_branch: false, + push_remove_protected_branch: false, + push_tag: false, + push_new_tag: true, + push_all: false, + merge_into_protected_branch: false + }, + + reporter: { + push_new_branch: false, + push_master: false, + push_protected_branch: false, + push_remove_protected_branch: false, + push_tag: false, + push_new_tag: false, + push_all: false, + merge_into_protected_branch: false + }, + + guest: { + push_new_branch: false, + push_master: false, + push_protected_branch: false, + push_remove_protected_branch: false, + push_tag: false, + push_new_tag: false, + push_all: false, + merge_into_protected_branch: false + } + } - updated_permissions_matrix[role].each do |action, allowed| - context action do - subject { access.push_access_check(changes[action]) } + [['feature', 'exact'], ['feat*', 'wildcard']].each do |protected_branch_name, protected_branch_type| + context do + before { create(:protected_branch, name: protected_branch_name, project: project) } - it { expect(subject.allowed?).to allowed ? be_truthy : be_falsey } + run_permission_checks(permissions_matrix) + end + + context "when 'developers can push' is turned on for the #{protected_branch_type} protected branch" do + before { create(:protected_branch, name: protected_branch_name, developers_can_push: true, project: project) } + + run_permission_checks(permissions_matrix.deep_merge(developer: { push_protected_branch: true, push_all: true, merge_into_protected_branch: true })) + end + + context "when 'developers can merge' is turned on for the #{protected_branch_type} protected branch" do + before { create(:protected_branch, name: protected_branch_name, developers_can_merge: true, project: project) } + + context "when a merge request exists for the given source/target branch" do + context "when the merge request is in progress" do + before do + create(:merge_request, source_project: project, source_branch: unprotected_branch, target_branch: 'feature', state: 'locked', in_progress_merge_commit_sha: merge_into_protected_branch) end + + run_permission_checks(permissions_matrix.deep_merge(developer: { merge_into_protected_branch: true })) + end + + context "when the merge request is not in progress" do + before do + create(:merge_request, source_project: project, source_branch: unprotected_branch, target_branch: 'feature', in_progress_merge_commit_sha: nil) + end + + run_permission_checks(permissions_matrix.deep_merge(developer: { merge_into_protected_branch: false })) + end + end + + context "when a merge request does not exist for the given source/target branch" do + run_permission_checks(permissions_matrix.deep_merge(developer: { merge_into_protected_branch: false })) + end + end + + context "when 'developers can merge' and 'developers can push' are turned on for the #{protected_branch_type} protected branch" do + before { create(:protected_branch, name: protected_branch_name, developers_can_merge: true, developers_can_push: true, project: project) } + + run_permission_checks(permissions_matrix.deep_merge(developer: { push_protected_branch: true, push_all: true, merge_into_protected_branch: true })) + end + end + + describe 'deploy key permissions' do + let(:key) { create(:deploy_key) } + let(:actor) { key } + + context 'push code' do + subject { access.check('git-receive-pack') } + + context 'when project is authorized' do + before { key.projects << project } + + it { expect(subject).not_to be_allowed } + end + + context 'when unauthorized' do + context 'to public project' do + let(:project) { create(:project, :public) } + + it { expect(subject).not_to be_allowed } + end + + context 'to internal project' do + let(:project) { create(:project, :internal) } + + it { expect(subject).not_to be_allowed } + end + + context 'to private project' do + let(:project) { create(:project, :internal) } + + it { expect(subject).not_to be_allowed } end end end diff --git a/spec/lib/gitlab/import_export/avatar_restorer_spec.rb b/spec/lib/gitlab/import_export/avatar_restorer_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..5ae178414cc240f529a55e96e557b4c64956f61d --- /dev/null +++ b/spec/lib/gitlab/import_export/avatar_restorer_spec.rb @@ -0,0 +1,25 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::AvatarRestorer, lib: true do + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: 'test') } + let(:project) { create(:empty_project) } + + before do + allow_any_instance_of(described_class).to receive(:avatar_export_file) + .and_return(Rails.root + "spec/fixtures/dk.png") + end + + after do + project.remove_avatar! + end + + it 'restores a project avatar' do + expect(described_class.new(project: project, shared: shared).restore).to be true + end + + it 'saves the avatar into the project' do + described_class.new(project: project, shared: shared).restore + + expect(project.reload.avatar.file.exists?).to be true + end +end diff --git a/spec/lib/gitlab/import_export/avatar_saver_spec.rb b/spec/lib/gitlab/import_export/avatar_saver_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..d6ee94442cbc7a6ef3a3fc5f6091fee15a886ddd --- /dev/null +++ b/spec/lib/gitlab/import_export/avatar_saver_spec.rb @@ -0,0 +1,27 @@ +require 'spec_helper' + +describe Gitlab::ImportExport::AvatarSaver, lib: true do + let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: 'test') } + let(:export_path) { "#{Dir::tmpdir}/project_tree_saver_spec" } + let(:project_with_avatar) { create(:empty_project, avatar: fixture_file_upload(Rails.root + "spec/fixtures/dk.png", "image/png")) } + let(:project) { create(:empty_project) } + + before do + FileUtils.mkdir_p("#{shared.export_path}/avatar/") + allow_any_instance_of(Gitlab::ImportExport).to receive(:storage_path).and_return(export_path) + end + + after do + FileUtils.rm_rf("#{shared.export_path}/avatar") + end + + it 'saves a project avatar' do + described_class.new(project: project_with_avatar, shared: shared).save + + expect(File).to exist("#{shared.export_path}/avatar/dk.png") + end + + it 'is fine not to have an avatar' do + expect(described_class.new(project: project, shared: shared).save).to be true + end +end diff --git a/spec/lib/gitlab/import_export/project.json b/spec/lib/gitlab/import_export/project.json index 4113d829c3c60f04a244cb47f29b1439a14585dd..b1a5d72c6241433d674c52d995a5cbdf59079b02 100644 --- a/spec/lib/gitlab/import_export/project.json +++ b/spec/lib/gitlab/import_export/project.json @@ -2765,7 +2765,7 @@ "committer_email": "dmitriy.zaporozhets@gmail.com" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "Binary files a/.DS_Store and /dev/null differ\n", "new_path": ".DS_Store", @@ -3138,7 +3138,7 @@ "committer_email": "dmitriy.zaporozhets@gmail.com" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "--- /dev/null\n+++ b/files/ruby/feature.rb\n@@ -0,0 +1,5 @@\n+class Feature\n+ def foo\n+ puts 'bar'\n+ end\n+end\n", "new_path": "files/ruby/feature.rb", @@ -3423,7 +3423,7 @@ "committer_email": "james@jameslopez.es" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "--- /dev/null\n+++ b/test\n", "new_path": "test", @@ -3960,7 +3960,7 @@ "committer_email": "dmitriy.zaporozhets@gmail.com" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "Binary files a/.DS_Store and /dev/null differ\n", "new_path": ".DS_Store", @@ -4597,7 +4597,7 @@ "committer_email": "marmis85@gmail.com" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n", "new_path": "CHANGELOG", @@ -5108,7 +5108,7 @@ "committer_email": "stanhu@packetzoom.com" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "--- a/CHANGELOG\n+++ b/CHANGELOG\n@@ -1,4 +1,6 @@\n-v 6.7.0\n+v6.8.0\n+\n+v6.7.0\n - Add support for Gemnasium as a Project Service (Olivier Gonzalez)\n - Add edit file button to MergeRequest diff\n - Public groups (Jason Hollingsworth)\n", "new_path": "CHANGELOG", @@ -5434,7 +5434,7 @@ "id": 11, "state": "empty", "st_commits": null, - "st_diffs": [ + "utf8_st_diffs": [ ], "merge_request_id": 11, @@ -5961,7 +5961,7 @@ "committer_email": "dmitriy.zaporozhets@gmail.com" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "Binary files a/.DS_Store and /dev/null differ\n", "new_path": ".DS_Store", @@ -6400,7 +6400,7 @@ "committer_email": "james@jameslopez.es" } ], - "st_diffs": [ + "utf8_st_diffs": [ { "diff": "--- /dev/null\n+++ b/test\n", "new_path": "test", diff --git a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb index 877be300262ae4289e1fbc6969ab2eb3d0a81e4e..6ae20c943b1610bc355ff62e6023aa6803e08f8e 100644 --- a/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_restorer_spec.rb @@ -2,6 +2,7 @@ require 'spec_helper' describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do describe 'restore project tree' do + let(:user) { create(:user) } let(:namespace) { create(:namespace, owner: user) } let(:shared) { Gitlab::ImportExport::Shared.new(relative_path: "", project_path: 'path') } @@ -53,6 +54,12 @@ describe Gitlab::ImportExport::ProjectTreeRestorer, services: true do expect(event.note.noteable.project).not_to be_nil end end + + it 'has the correct data for merge request st_diffs' do + # makes sure we are renaming the custom method +utf8_st_diffs+ into +st_diffs+ + + expect { restored_project_json }.to change(MergeRequestDiff.where.not(st_diffs: nil), :count).by(9) + end end end end diff --git a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb index 1424de9e60be25b17d483da5100982db6e7e5fef..057ef6e76a06bca0bc9c622bb19e26e038c69c2a 100644 --- a/spec/lib/gitlab/import_export/project_tree_saver_spec.rb +++ b/spec/lib/gitlab/import_export/project_tree_saver_spec.rb @@ -102,12 +102,17 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do it 'has ci pipeline notes' do expect(saved_project_json['pipelines'].first['notes']).not_to be_empty end + + it 'does not complain about non UTF-8 characters in MR diffs' do + ActiveRecord::Base.connection.execute("UPDATE merge_request_diffs SET st_diffs = '---\n- :diff: !binary |-\n LS0tIC9kZXYvbnVsbAorKysgYi9pbWFnZXMvbnVjb3IucGRmCkBAIC0wLDAg\n KzEsMTY3OSBAQAorJVBERi0xLjUNJeLjz9MNCisxIDAgb2JqDTw8L01ldGFk\n YXR'") + + expect(project_tree_saver.save).to be true + end end end def setup_project issue = create(:issue, assignee: user) - merge_request = create(:merge_request) label = create(:label) snippet = create(:project_snippet) release = create(:release) @@ -115,12 +120,12 @@ describe Gitlab::ImportExport::ProjectTreeSaver, services: true do project = create(:project, :public, issues: [issue], - merge_requests: [merge_request], labels: [label], snippets: [snippet], releases: [release] ) + merge_request = create(:merge_request, source_project: project) commit_status = create(:commit_status, project: project) ci_pipeline = create(:ci_pipeline, diff --git a/spec/lib/gitlab/lfs/lfs_router_spec.rb b/spec/lib/gitlab/lfs/lfs_router_spec.rb deleted file mode 100644 index 659facd6c19e663dfa06f4b061c5c2b80cd227e2..0000000000000000000000000000000000000000 --- a/spec/lib/gitlab/lfs/lfs_router_spec.rb +++ /dev/null @@ -1,730 +0,0 @@ -require 'spec_helper' - -describe Gitlab::Lfs::Router, lib: true do - let(:project) { create(:project) } - let(:public_project) { create(:project, :public) } - let(:forked_project) { fork_project(public_project, user) } - - let(:user) { create(:user) } - let(:user_two) { create(:user) } - let!(:lfs_object) { create(:lfs_object, :with_file) } - - let(:request) { Rack::Request.new(env) } - let(:env) do - { - 'rack.input' => '', - 'REQUEST_METHOD' => 'GET', - } - end - - let(:lfs_router_auth) { new_lfs_router(project, user: user) } - let(:lfs_router_ci_auth) { new_lfs_router(project, ci: true) } - let(:lfs_router_noauth) { new_lfs_router(project) } - let(:lfs_router_public_auth) { new_lfs_router(public_project, user: user) } - let(:lfs_router_public_ci_auth) { new_lfs_router(public_project, ci: true) } - let(:lfs_router_public_noauth) { new_lfs_router(public_project) } - let(:lfs_router_forked_noauth) { new_lfs_router(forked_project) } - let(:lfs_router_forked_auth) { new_lfs_router(forked_project, user: user_two) } - let(:lfs_router_forked_ci_auth) { new_lfs_router(forked_project, ci: true) } - - let(:sample_oid) { "b68143e6463773b1b6c6fd009a76c32aeec041faff32ba2ed42fd7f708a17f80" } - let(:sample_size) { 499013 } - let(:respond_with_deprecated) {[ 501, { "Content-Type" => "application/json; charset=utf-8" }, ["{\"message\":\"Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.\",\"documentation_url\":\"#{Gitlab.config.gitlab.url}/help\"}"]]} - let(:respond_with_disabled) {[ 501, { "Content-Type" => "application/json; charset=utf-8" }, ["{\"message\":\"Git LFS is not enabled on this GitLab server, contact your admin.\",\"documentation_url\":\"#{Gitlab.config.gitlab.url}/help\"}"]]} - - describe 'when lfs is disabled' do - before do - allow(Gitlab.config.lfs).to receive(:enabled).and_return(false) - env['REQUEST_METHOD'] = 'POST' - body = { - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 - }, - { 'oid' => sample_oid, - 'size' => sample_size - } - ], - 'operation' => 'upload' - }.to_json - env['rack.input'] = StringIO.new(body) - env["PATH_INFO"] = "#{project.repository.path_with_namespace}.git/info/lfs/objects/batch" - end - - it 'responds with 501' do - expect(lfs_router_auth.try_call).to match_array(respond_with_disabled) - end - end - - describe 'when fetching lfs object using deprecated API' do - before do - enable_lfs - env["PATH_INFO"] = "#{project.repository.path_with_namespace}.git/info/lfs/objects/#{sample_oid}" - end - - it 'responds with 501' do - expect(lfs_router_auth.try_call).to match_array(respond_with_deprecated) - end - end - - describe 'when fetching lfs object' do - before do - enable_lfs - env['HTTP_ACCEPT'] = "application/vnd.git-lfs+json; charset=utf-8" - env["PATH_INFO"] = "#{project.repository.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}" - end - - describe 'and request comes from gitlab-workhorse' do - context 'without user being authorized' do - it "responds with status 401" do - expect(lfs_router_noauth.try_call.first).to eq(401) - end - end - - context 'with required headers' do - before do - project.lfs_objects << lfs_object - env['HTTP_X_SENDFILE_TYPE'] = "X-Sendfile" - end - - context 'when user does not have project access' do - it "responds with status 403" do - expect(lfs_router_auth.try_call.first).to eq(403) - end - end - - context 'when user has project access' do - before do - project.team << [user, :master] - end - - it "responds with status 200" do - expect(lfs_router_auth.try_call.first).to eq(200) - end - - it "responds with the file location" do - expect(lfs_router_auth.try_call[1]['Content-Type']).to eq("application/octet-stream") - expect(lfs_router_auth.try_call[1]['X-Sendfile']).to eq(lfs_object.file.path) - end - end - - context 'when CI is authorized' do - it "responds with status 200" do - expect(lfs_router_ci_auth.try_call.first).to eq(200) - end - - it "responds with the file location" do - expect(lfs_router_ci_auth.try_call[1]['Content-Type']).to eq("application/octet-stream") - expect(lfs_router_ci_auth.try_call[1]['X-Sendfile']).to eq(lfs_object.file.path) - end - end - end - - context 'without required headers' do - it "responds with status 403" do - expect(lfs_router_auth.try_call.first).to eq(403) - end - end - end - end - - describe 'when handling lfs request using deprecated API' do - before do - enable_lfs - env['REQUEST_METHOD'] = 'POST' - env["PATH_INFO"] = "#{project.repository.path_with_namespace}.git/info/lfs/objects" - end - - it 'responds with 501' do - expect(lfs_router_auth.try_call).to match_array(respond_with_deprecated) - end - end - - describe 'when handling lfs batch request' do - before do - enable_lfs - env['REQUEST_METHOD'] = 'POST' - env['PATH_INFO'] = "#{project.repository.path_with_namespace}.git/info/lfs/objects/batch" - end - - describe 'download' do - before do - body = { 'operation' => 'download', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size - }] - }.to_json - env['rack.input'] = StringIO.new(body) - end - - shared_examples 'an authorized requests' do - context 'when downloading an lfs object that is assigned to our project' do - before do - project.lfs_objects << lfs_object - end - - it 'responds with status 200 and href to download' do - response = router.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) - - expect(response_body).to eq('objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size, - 'actions' => { - 'download' => { - 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => { 'Authorization' => auth } - } - } - }]) - end - end - - context 'when downloading an lfs object that is assigned to other project' do - before do - public_project.lfs_objects << lfs_object - end - - it 'responds with status 200 and error message' do - response = router.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) - - expect(response_body).to eq('objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it", - } - }]) - end - end - - context 'when downloading a lfs object that does not exist' do - before do - body = { 'operation' => 'download', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 - }] - }.to_json - env['rack.input'] = StringIO.new(body) - end - - it "responds with status 200 and error message" do - response = router.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) - - expect(response_body).to eq('objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it", - } - }]) - end - end - - context 'when downloading one new and one existing lfs object' do - before do - body = { 'operation' => 'download', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 - }, - { 'oid' => sample_oid, - 'size' => sample_size - } - ] - }.to_json - env['rack.input'] = StringIO.new(body) - project.lfs_objects << lfs_object - end - - it "responds with status 200 with upload hypermedia link for the new object" do - response = router.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) - - expect(response_body).to eq('objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078, - 'error' => { - 'code' => 404, - 'message' => "Object does not exist on the server or you don't have permissions to access it", - } - }, - { 'oid' => sample_oid, - 'size' => sample_size, - 'actions' => { - 'download' => { - 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => { 'Authorization' => auth } - } - } - }]) - end - end - end - - context 'when user is authenticated' do - let(:auth) { authorize(user) } - - before do - env["HTTP_AUTHORIZATION"] = auth - project.team << [user, role] - end - - it_behaves_like 'an authorized requests' do - let(:role) { :reporter } - let(:router) { lfs_router_auth } - end - - context 'when user does is not member of the project' do - let(:role) { :guest } - - it 'responds with 403' do - expect(lfs_router_auth.try_call.first).to eq(403) - end - end - - context 'when user does not have download access' do - let(:role) { :guest } - - it 'responds with 403' do - expect(lfs_router_auth.try_call.first).to eq(403) - end - end - end - - context 'when CI is authorized' do - let(:auth) { 'gitlab-ci-token:password' } - - before do - env["HTTP_AUTHORIZATION"] = auth - end - - it_behaves_like 'an authorized requests' do - let(:router) { lfs_router_ci_auth } - end - end - - context 'when user is not authenticated' do - describe 'is accessing public project' do - before do - public_project.lfs_objects << lfs_object - end - - it 'responds with status 200 and href to download' do - response = lfs_router_public_noauth.try_call - expect(response.first).to eq(200) - response_body = ActiveSupport::JSON.decode(response.last.first) - - expect(response_body).to eq('objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size, - 'actions' => { - 'download' => { - 'href' => "#{public_project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", - 'header' => {} - } - } - }]) - end - end - - describe 'is accessing non-public project' do - before do - project.lfs_objects << lfs_object - end - - it 'responds with authorization required' do - expect(lfs_router_noauth.try_call.first).to eq(401) - end - end - end - end - - describe 'upload' do - before do - body = { 'operation' => 'upload', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size - }] - }.to_json - env['rack.input'] = StringIO.new(body) - end - - describe 'when request is authenticated' do - describe 'when user has project push access' do - before do - @auth = authorize(user) - env["HTTP_AUTHORIZATION"] = @auth - project.team << [user, :developer] - end - - context 'when pushing an lfs object that already exists' do - before do - public_project.lfs_objects << lfs_object - end - - it "responds with status 200 and links the object to the project" do - response_body = lfs_router_auth.try_call.last - response = ActiveSupport::JSON.decode(response_body.first) - - expect(response['objects']).to be_kind_of(Array) - expect(response['objects'].first['oid']).to eq(sample_oid) - expect(response['objects'].first['size']).to eq(sample_size) - expect(lfs_object.projects.pluck(:id)).not_to include(project.id) - expect(lfs_object.projects.pluck(:id)).to include(public_project.id) - expect(response['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}") - expect(response['objects'].first['actions']['upload']['header']).to eq('Authorization' => @auth) - end - end - - context 'when pushing a lfs object that does not exist' do - before do - body = { 'operation' => 'upload', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 - }] - }.to_json - env['rack.input'] = StringIO.new(body) - end - - it "responds with status 200 and upload hypermedia link" do - response = lfs_router_auth.try_call - expect(response.first).to eq(200) - - response_body = ActiveSupport::JSON.decode(response.last.first) - expect(response_body['objects']).to be_kind_of(Array) - expect(response_body['objects'].first['oid']).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897") - expect(response_body['objects'].first['size']).to eq(1575078) - expect(lfs_object.projects.pluck(:id)).not_to include(project.id) - expect(response_body['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}.git/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/1575078") - expect(response_body['objects'].first['actions']['upload']['header']).to eq('Authorization' => @auth) - end - end - - context 'when pushing one new and one existing lfs object' do - before do - body = { 'operation' => 'upload', - 'objects' => [ - { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', - 'size' => 1575078 - }, - { 'oid' => sample_oid, - 'size' => sample_size - } - ] - }.to_json - env['rack.input'] = StringIO.new(body) - project.lfs_objects << lfs_object - end - - it "responds with status 200 with upload hypermedia link for the new object" do - response = lfs_router_auth.try_call - expect(response.first).to eq(200) - - response_body = ActiveSupport::JSON.decode(response.last.first) - expect(response_body['objects']).to be_kind_of(Array) - - expect(response_body['objects'].first['oid']).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897") - expect(response_body['objects'].first['size']).to eq(1575078) - expect(response_body['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}.git/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/1575078") - expect(response_body['objects'].first['actions']['upload']['header']).to eq("Authorization" => @auth) - - expect(response_body['objects'].last['oid']).to eq(sample_oid) - expect(response_body['objects'].last['size']).to eq(sample_size) - expect(response_body['objects'].last).not_to have_key('actions') - end - end - end - - context 'when user does not have push access' do - it 'responds with 403' do - expect(lfs_router_auth.try_call.first).to eq(403) - end - end - - context 'when CI is authorized' do - it 'responds with 401' do - expect(lfs_router_ci_auth.try_call.first).to eq(401) - end - end - end - - context 'when user is not authenticated' do - context 'when user has push access' do - before do - project.team << [user, :master] - end - - it "responds with status 401" do - expect(lfs_router_public_noauth.try_call.first).to eq(401) - end - end - - context 'when user does not have push access' do - it "responds with status 401" do - expect(lfs_router_public_noauth.try_call.first).to eq(401) - end - end - end - - context 'when CI is authorized' do - let(:auth) { 'gitlab-ci-token:password' } - - before do - env["HTTP_AUTHORIZATION"] = auth - end - - it "responds with status 403" do - expect(lfs_router_public_ci_auth.try_call.first).to eq(401) - end - end - end - - describe 'unsupported' do - before do - body = { 'operation' => 'other', - 'objects' => [ - { 'oid' => sample_oid, - 'size' => sample_size - }] - }.to_json - env['rack.input'] = StringIO.new(body) - end - - it 'responds with status 404' do - expect(lfs_router_public_noauth.try_call.first).to eq(404) - end - end - end - - describe 'when pushing a lfs object' do - before do - enable_lfs - env['REQUEST_METHOD'] = 'PUT' - end - - shared_examples 'unauthorized' do - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(router.project) - end - - it 'responds with status 401' do - expect(router.try_call.first).to eq(401) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(router.project) - end - - it 'responds with status 401' do - expect(router.try_call.first).to eq(401) - end - end - - context 'and request is sent with a malformed headers' do - before do - env["PATH_INFO"] = "#{router.project.repository.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}" - env["HTTP_X_GITLAB_LFS_TMP"] = "cat /etc/passwd" - end - - it 'does not recognize it as a valid lfs command' do - expect(router.try_call).to eq(nil) - end - end - end - - shared_examples 'forbidden' do - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(router.project) - end - - it 'responds with 403' do - expect(router.try_call.first).to eq(403) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(router.project) - end - - it 'responds with 403' do - expect(router.try_call.first).to eq(403) - end - end - end - - describe 'to one project' do - describe 'when user is authenticated' do - describe 'when user has push access to the project' do - before do - project.team << [user, :developer] - end - - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(project) - end - - it 'responds with status 200, location of lfs store and object details' do - json_response = ActiveSupport::JSON.decode(lfs_router_auth.try_call.last.first) - - expect(lfs_router_auth.try_call.first).to eq(200) - expect(json_response['StoreLFSPath']).to eq("#{Gitlab.config.shared.path}/lfs-objects/tmp/upload") - expect(json_response['LfsOid']).to eq(sample_oid) - expect(json_response['LfsSize']).to eq(sample_size) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(project) - end - - it 'responds with status 200 and lfs object is linked to the project' do - expect(lfs_router_auth.try_call.first).to eq(200) - expect(lfs_object.projects.pluck(:id)).to include(project.id) - end - end - end - - describe 'and user does not have push access' do - let(:router) { lfs_router_auth } - - it_behaves_like 'forbidden' - end - end - - context 'when CI is authenticated' do - let(:router) { lfs_router_ci_auth } - - it_behaves_like 'unauthorized' - end - - context 'for unauthenticated' do - let(:router) { new_lfs_router(project) } - - it_behaves_like 'unauthorized' - end - end - - describe 'to a forked project' do - let(:forked_project) { fork_project(public_project, user) } - - describe 'when user is authenticated' do - describe 'when user has push access to the project' do - before do - forked_project.team << [user_two, :developer] - end - - context 'and request is sent by gitlab-workhorse to authorize the request' do - before do - header_for_upload_authorize(forked_project) - end - - it 'responds with status 200, location of lfs store and object details' do - json_response = ActiveSupport::JSON.decode(lfs_router_forked_auth.try_call.last.first) - - expect(lfs_router_forked_auth.try_call.first).to eq(200) - expect(json_response['StoreLFSPath']).to eq("#{Gitlab.config.shared.path}/lfs-objects/tmp/upload") - expect(json_response['LfsOid']).to eq(sample_oid) - expect(json_response['LfsSize']).to eq(sample_size) - end - end - - context 'and request is sent by gitlab-workhorse to finalize the upload' do - before do - headers_for_upload_finalize(forked_project) - end - - it 'responds with status 200 and lfs object is linked to the source project' do - expect(lfs_router_forked_auth.try_call.first).to eq(200) - expect(lfs_object.projects.pluck(:id)).to include(public_project.id) - end - end - end - - describe 'and user does not have push access' do - let(:router) { lfs_router_forked_auth } - - it_behaves_like 'forbidden' - end - end - - context 'when CI is authenticated' do - let(:router) { lfs_router_forked_ci_auth } - - it_behaves_like 'unauthorized' - end - - context 'for unauthenticated' do - let(:router) { lfs_router_forked_noauth } - - it_behaves_like 'unauthorized' - end - - describe 'and second project not related to fork or a source project' do - let(:second_project) { create(:project) } - let(:lfs_router_second_project) { new_lfs_router(second_project, user: user) } - - before do - public_project.lfs_objects << lfs_object - headers_for_upload_finalize(second_project) - end - - context 'when pushing the same lfs object to the second project' do - before do - second_project.team << [user, :master] - end - - it 'responds with 200 and links the lfs object to the project' do - expect(lfs_router_second_project.try_call.first).to eq(200) - expect(lfs_object.projects.pluck(:id)).to include(second_project.id, public_project.id) - end - end - end - end - end - - def enable_lfs - allow(Gitlab.config.lfs).to receive(:enabled).and_return(true) - end - - def authorize(user) - ActionController::HttpAuthentication::Basic.encode_credentials(user.username, user.password) - end - - def new_lfs_router(project, user: nil, ci: false) - Gitlab::Lfs::Router.new(project, user, ci, request) - end - - def header_for_upload_authorize(project) - env["PATH_INFO"] = "#{project.repository.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}/authorize" - end - - def headers_for_upload_finalize(project) - env["PATH_INFO"] = "#{project.repository.path_with_namespace}.git/gitlab-lfs/objects/#{sample_oid}/#{sample_size}" - env["HTTP_X_GITLAB_LFS_TMP"] = "#{sample_oid}6e561c9d4" - end - - def fork_project(project, user, object = nil) - allow(RepositoryForkWorker).to receive(:perform_async).and_return(true) - Projects::ForkService.new(project, user, {}).execute - end -end diff --git a/spec/lib/gitlab/user_access_spec.rb b/spec/lib/gitlab/user_access_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..aa9ec243498bd9d706ec135fb7aa6afee2f26fa1 --- /dev/null +++ b/spec/lib/gitlab/user_access_spec.rb @@ -0,0 +1,88 @@ +require 'spec_helper' + +describe Gitlab::UserAccess, lib: true do + let(:access) { Gitlab::UserAccess.new(user, project: project) } + let(:project) { create(:project) } + let(:user) { create(:user) } + + describe 'can_push_to_branch?' do + describe 'push to none protected branch' do + it 'returns true if user is a master' do + project.team << [user, :master] + expect(access.can_push_to_branch?('random_branch')).to be_truthy + end + + it 'returns true if user is a developer' do + project.team << [user, :developer] + expect(access.can_push_to_branch?('random_branch')).to be_truthy + end + + it 'returns false if user is a reporter' do + project.team << [user, :reporter] + expect(access.can_push_to_branch?('random_branch')).to be_falsey + end + end + + describe 'push to protected branch' do + let(:branch) { create :protected_branch, project: project } + + it 'returns true if user is a master' do + project.team << [user, :master] + expect(access.can_push_to_branch?(branch.name)).to be_truthy + end + + it 'returns false if user is a developer' do + project.team << [user, :developer] + expect(access.can_push_to_branch?(branch.name)).to be_falsey + end + + it 'returns false if user is a reporter' do + project.team << [user, :reporter] + expect(access.can_push_to_branch?(branch.name)).to be_falsey + end + end + + describe 'push to protected branch if allowed for developers' do + before do + @branch = create :protected_branch, project: project, developers_can_push: true + end + + it 'returns true if user is a master' do + project.team << [user, :master] + expect(access.can_push_to_branch?(@branch.name)).to be_truthy + end + + it 'returns true if user is a developer' do + project.team << [user, :developer] + expect(access.can_push_to_branch?(@branch.name)).to be_truthy + end + + it 'returns false if user is a reporter' do + project.team << [user, :reporter] + expect(access.can_push_to_branch?(@branch.name)).to be_falsey + end + end + + describe 'merge to protected branch if allowed for developers' do + before do + @branch = create :protected_branch, project: project, developers_can_merge: true + end + + it 'returns true if user is a master' do + project.team << [user, :master] + expect(access.can_merge_to_branch?(@branch.name)).to be_truthy + end + + it 'returns true if user is a developer' do + project.team << [user, :developer] + expect(access.can_merge_to_branch?(@branch.name)).to be_truthy + end + + it 'returns false if user is a reporter' do + project.team << [user, :reporter] + expect(access.can_merge_to_branch?(@branch.name)).to be_falsey + end + end + + end +end diff --git a/spec/models/build_spec.rb b/spec/models/build_spec.rb index e8171788872383d1b9645919fa32b49170263f6e..06d984c7a404f053e02ad7c54b7f3e53524f39a6 100644 --- a/spec/models/build_spec.rb +++ b/spec/models/build_spec.rb @@ -191,16 +191,16 @@ describe Ci::Build, models: true do end describe '#variables' do - context 'returns variables' do - subject { build.variables } + let(:predefined_variables) do + [ + { key: :CI_BUILD_NAME, value: 'test', public: true }, + { key: :CI_BUILD_STAGE, value: 'test', public: true }, + ] + end - let(:predefined_variables) do - [ - { key: :CI_BUILD_NAME, value: 'test', public: true }, - { key: :CI_BUILD_STAGE, value: 'stage', public: true }, - ] - end + subject { build.variables } + context 'returns variables' do let(:yaml_variables) do [ { key: :DB_NAME, value: 'postgres', public: true } @@ -208,7 +208,7 @@ describe Ci::Build, models: true do end before do - build.update_attributes(stage: 'stage') + build.yaml_variables = yaml_variables end it { is_expected.to eq(predefined_variables + yaml_variables) } @@ -260,21 +260,53 @@ describe Ci::Build, models: true do it { is_expected.to eq(predefined_variables + predefined_trigger_variable + yaml_variables + secure_variables + trigger_variables) } end + end + end + + context 'when yaml_variables is undefined' do + before do + build.yaml_variables = nil + end - context 'when job variables are defined' do - ## - # Job-level variables are defined in gitlab_ci.yml fixture - # - context 'when job variables are unique' do - let(:build) { create(:ci_build, name: 'staging') } - - it 'includes job variables' do - expect(subject).to include( - { key: :KEY1, value: 'value1', public: true }, - { key: :KEY2, value: 'value2', public: true } - ) - end + context 'use from gitlab-ci.yml' do + before do + stub_ci_pipeline_yaml_file(config) + end + + context 'if config is not found' do + let(:config) { nil } + + it { is_expected.to eq(predefined_variables) } + end + + context 'if config does not have a questioned job' do + let(:config) do + YAML.dump({ + test_other: { + script: 'Hello World' + } + }) end + + it { is_expected.to eq(predefined_variables) } + end + + context 'if config has variables' do + let(:config) do + YAML.dump({ + test: { + script: 'Hello World', + variables: { + KEY: 'value' + } + } + }) + end + let(:variables) do + [{ key: :KEY, value: 'value', public: true }] + end + + it { is_expected.to eq(predefined_variables + variables) } end end end @@ -686,4 +718,120 @@ describe Ci::Build, models: true do end end end + + describe '#manual?' do + before do + build.update(when: value) + end + + subject { build.manual? } + + context 'when is set to manual' do + let(:value) { 'manual' } + + it { is_expected.to be_truthy } + end + + context 'when set to something else' do + let(:value) { 'something else' } + + it { is_expected.to be_falsey } + end + end + + describe '#other_actions' do + let(:build) { create(:ci_build, :manual, pipeline: pipeline) } + let!(:other_build) { create(:ci_build, :manual, pipeline: pipeline, name: 'other action') } + + subject { build.other_actions } + + it 'returns other actions' do + is_expected.to contain_exactly(other_build) + end + end + + describe '#play' do + let(:build) { create(:ci_build, :manual, pipeline: pipeline) } + + subject { build.play } + + it 'enques a build' do + is_expected.to be_pending + is_expected.to eq(build) + end + + context 'for success build' do + before { build.queue } + + it 'creates a new build' do + is_expected.to be_pending + is_expected.not_to eq(build) + end + end + end + + describe '#when' do + subject { build.when } + + context 'if is undefined' do + before do + build.when = nil + end + + context 'use from gitlab-ci.yml' do + before do + stub_ci_pipeline_yaml_file(config) + end + + context 'if config is not found' do + let(:config) { nil } + + it { is_expected.to eq('on_success') } + end + + context 'if config does not have a questioned job' do + let(:config) do + YAML.dump({ + test_other: { + script: 'Hello World' + } + }) + end + + it { is_expected.to eq('on_success') } + end + + context 'if config has when' do + let(:config) do + YAML.dump({ + test: { + script: 'Hello World', + when: 'always' + } + }) + end + + it { is_expected.to eq('always') } + end + end + end + end + + describe '#retryable?' do + context 'when build is running' do + before { build.run! } + + it 'should return false' do + expect(build.retryable?).to be false + end + end + + context 'when build is finished' do + before { build.success! } + + it 'should return true' do + expect(build.retryable?).to be true + end + end + end end diff --git a/spec/models/ci/pipeline_spec.rb b/spec/models/ci/pipeline_spec.rb index 4e5481f9154f052aed94b1d27bf63f198be7dd52..c29e4811385a7a754f92dcebce99b637fbf84d7c 100644 --- a/spec/models/ci/pipeline_spec.rb +++ b/spec/models/ci/pipeline_spec.rb @@ -5,9 +5,12 @@ describe Ci::Pipeline, models: true do let(:pipeline) { FactoryGirl.create :ci_pipeline, project: project } it { is_expected.to belong_to(:project) } + it { is_expected.to belong_to(:user) } + it { is_expected.to have_many(:statuses) } it { is_expected.to have_many(:trigger_requests) } it { is_expected.to have_many(:builds) } + it { is_expected.to validate_presence_of :sha } it { is_expected.to validate_presence_of :status } @@ -257,6 +260,68 @@ describe Ci::Pipeline, models: true do expect(pipeline.reload.status).to eq('canceled') end end + + context 'when listing manual actions' do + let(:yaml) do + { + stages: ["build", "test", "test_failure", "deploy", "cleanup"], + build: { + stage: "build", + script: "BUILD", + }, + test: { + stage: "test", + script: "TEST", + }, + test_failure: { + stage: "test_failure", + script: "ON test failure", + when: "on_failure", + }, + deploy: { + stage: "deploy", + script: "PUBLISH", + }, + production: { + stage: "deploy", + script: "PUBLISH", + when: "manual", + }, + cleanup: { + stage: "cleanup", + script: "TIDY UP", + when: "always", + }, + clear_cache: { + stage: "cleanup", + script: "CLEAR CACHE", + when: "manual", + } + } + end + + it 'returns only for skipped builds' do + # currently all builds are created + expect(create_builds).to be_truthy + expect(manual_actions).to be_empty + + # succeed stage build + pipeline.builds.running_or_pending.each(&:success) + expect(manual_actions).to be_empty + + # succeed stage test + pipeline.builds.running_or_pending.each(&:success) + expect(manual_actions).to be_one # production + + # succeed stage deploy + pipeline.builds.running_or_pending.each(&:success) + expect(manual_actions).to be_many # production and clear cache + end + + def manual_actions + pipeline.manual_actions + end + end end context 'when no builds created' do @@ -413,4 +478,28 @@ describe Ci::Pipeline, models: true do end end end + + describe '#manual_actions' do + subject { pipeline.manual_actions } + + it 'when none defined' do + is_expected.to be_empty + end + + context 'when action defined' do + let!(:manual) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy') } + + it 'returns one action' do + is_expected.to contain_exactly(manual) + end + + context 'there are multiple of the same name' do + let!(:manual2) { create(:ci_build, :manual, pipeline: pipeline, name: 'deploy') } + + it 'returns latest one' do + is_expected.to contain_exactly(manual2) + end + end + end + end end diff --git a/spec/models/commit_status_spec.rb b/spec/models/commit_status_spec.rb index 05f22c7a9ebd79749178366ee2524b9a20dd94a4..ff6371ad68540677ac639f1090d4bbeb8dc9935a 100644 --- a/spec/models/commit_status_spec.rb +++ b/spec/models/commit_status_spec.rb @@ -177,10 +177,10 @@ describe CommitStatus, models: true do describe '#stages' do before do - FactoryGirl.create :commit_status, pipeline: pipeline, stage: 'build', stage_idx: 0, status: 'success' - FactoryGirl.create :commit_status, pipeline: pipeline, stage: 'build', stage_idx: 0, status: 'failed' - FactoryGirl.create :commit_status, pipeline: pipeline, stage: 'deploy', stage_idx: 2, status: 'running' - FactoryGirl.create :commit_status, pipeline: pipeline, stage: 'test', stage_idx: 1, status: 'success' + create :commit_status, pipeline: pipeline, stage: 'build', name: 'linux', stage_idx: 0, status: 'success' + create :commit_status, pipeline: pipeline, stage: 'build', name: 'mac', stage_idx: 0, status: 'failed' + create :commit_status, pipeline: pipeline, stage: 'deploy', name: 'staging', stage_idx: 2, status: 'running' + create :commit_status, pipeline: pipeline, stage: 'test', name: 'rspec', stage_idx: 1, status: 'success' end context 'stages list' do @@ -192,7 +192,7 @@ describe CommitStatus, models: true do end context 'stages with statuses' do - subject { CommitStatus.where(pipeline: pipeline).stages_status } + subject { CommitStatus.where(pipeline: pipeline).latest.stages_status } it 'return list of stages with statuses' do is_expected.to eq({ @@ -201,6 +201,20 @@ describe CommitStatus, models: true do 'deploy' => 'running' }) end + + context 'when build is retried' do + before do + create :commit_status, pipeline: pipeline, stage: 'build', name: 'mac', stage_idx: 0, status: 'success' + end + + it 'ignores a previous state' do + is_expected.to eq({ + 'build' => 'success', + 'test' => 'success', + 'deploy' => 'running' + }) + end + end end end diff --git a/spec/models/deployment_spec.rb b/spec/models/deployment_spec.rb index b273018707f491a8d2cf3c53a201ac78f998e164..7df3df4bb9e652016122d0e6ed99b605a15ca28e 100644 --- a/spec/models/deployment_spec.rb +++ b/spec/models/deployment_spec.rb @@ -11,6 +11,7 @@ describe Deployment, models: true do it { is_expected.to delegate_method(:name).to(:environment).with_prefix } it { is_expected.to delegate_method(:commit).to(:project) } it { is_expected.to delegate_method(:commit_title).to(:commit).as(:try) } + it { is_expected.to delegate_method(:manual_actions).to(:deployable).as(:try) } it { is_expected.to validate_presence_of(:ref) } it { is_expected.to validate_presence_of(:sha) } diff --git a/spec/models/project_services/builds_email_service_spec.rb b/spec/models/project_services/builds_email_service_spec.rb index 236df8f047df335a682329594893cde6110c1311..ca2cd8aa551f7727cb045a1a83ca5da0275fe6a7 100644 --- a/spec/models/project_services/builds_email_service_spec.rb +++ b/spec/models/project_services/builds_email_service_spec.rb @@ -23,6 +23,44 @@ describe BuildsEmailService do end end + describe '#test_data' do + let(:build) { create(:ci_build) } + let(:project) { build.project } + let(:user) { create(:user) } + + before { project.team << [user, :developer] } + + it 'builds test data' do + data = subject.test_data(project) + + expect(data[:object_kind]).to eq("build") + end + end + + describe '#test' do + it 'sends email' do + data = Gitlab::BuildDataBuilder.build(create(:ci_build)) + subject.recipients = 'test@gitlab.com' + + expect(BuildEmailWorker).to receive(:perform_async) + + subject.test(data) + end + + context 'notify only failed builds is true' do + it 'sends email' do + data = Gitlab::BuildDataBuilder.build(create(:ci_build)) + data[:build_status] = "success" + subject.recipients = 'test@gitlab.com' + + expect(subject).not_to receive(:notify_only_broken_builds) + expect(BuildEmailWorker).to receive(:perform_async) + + subject.test(data) + end + end + end + describe '#execute' do it 'sends email' do subject.recipients = 'test@gitlab.com' diff --git a/spec/models/project_spec.rb b/spec/models/project_spec.rb index e842c58dd8245d885943ed08b80f17e82d5fafc8..9dc34276f188edbb0617ccb1434e3c67180e22bb 100644 --- a/spec/models/project_spec.rb +++ b/spec/models/project_spec.rb @@ -142,10 +142,10 @@ describe Project, models: true do expect(project2).to be_valid end - it 'does not allow to introduce an empty URI' do + it 'allows an empty URI' do project2 = build(:project, import_url: '') - expect(project2).not_to be_valid + expect(project2).to be_valid end it 'does not produce import data on an empty URI' do diff --git a/spec/models/repository_spec.rb b/spec/models/repository_spec.rb index b39b958450c0ef17d9375824bc846f6ad024d993..110df6bbd22cc80579445e3c4351c8262f3590d3 100644 --- a/spec/models/repository_spec.rb +++ b/spec/models/repository_spec.rb @@ -4,16 +4,17 @@ describe Repository, models: true do include RepoHelpers TestBlob = Struct.new(:name) - let(:repository) { create(:project).repository } + let(:project) { create(:project) } + let(:repository) { project.repository } let(:user) { create(:user) } let(:commit_options) do author = repository.user_to_committer(user) { message: 'Test message', committer: author, author: author } end let(:merge_commit) do - source_sha = repository.find_branch('feature').target - merge_commit_sha = repository.merge(user, source_sha, 'master', commit_options) - repository.commit(merge_commit_sha) + merge_request = create(:merge_request, source_branch: 'feature', target_branch: 'master', source_project: project) + merge_commit_id = repository.merge(user, merge_request, commit_options) + repository.commit(merge_commit_id) end describe '#branch_names_contains' do @@ -129,6 +130,36 @@ describe Repository, models: true do end end + describe :commit_file do + it 'commits change to a file successfully' do + expect do + repository.commit_file(user, 'CHANGELOG', 'Changelog!', + 'Updates file content', + 'master', true) + end.to change { repository.commits('master').count }.by(1) + + blob = repository.blob_at('master', 'CHANGELOG') + + expect(blob.data).to eq('Changelog!') + end + end + + describe :update_file do + it 'updates filename successfully' do + expect do + repository.update_file(user, 'NEWLICENSE', 'Copyright!', + branch: 'master', + previous_path: 'LICENSE', + message: 'Changes filename') + end.to change { repository.commits('master').count }.by(1) + + files = repository.ls_files('master') + + expect(files).not_to include('LICENSE') + expect(files).to include('NEWLICENSE') + end + end + describe "search_files" do let(:results) { repository.search_files('feature', 'master') } subject { results } diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb index ff39f187759192ac471f73dca05ec845f5662259..3bf82cf2668de2cbfbc825ce2e9e79e59e852c51 100644 --- a/spec/models/user_spec.rb +++ b/spec/models/user_spec.rb @@ -31,6 +31,8 @@ describe User, models: true do it { is_expected.to have_many(:spam_logs).dependent(:destroy) } it { is_expected.to have_many(:todos).dependent(:destroy) } it { is_expected.to have_many(:award_emoji).dependent(:destroy) } + it { is_expected.to have_many(:builds).dependent(:nullify) } + it { is_expected.to have_many(:pipelines).dependent(:nullify) } describe '#group_members' do it 'does not include group memberships for which user is a requester' do @@ -885,16 +887,25 @@ describe User, models: true do end describe '#authorized_projects' do - let!(:user) { create(:user) } - let!(:private_project) { create(:project, :private) } + context 'with a minimum access level' do + it 'includes projects for which the user is an owner' do + user = create(:user) + project = create(:empty_project, :private, namespace: user.namespace) - before do - private_project.team << [user, Gitlab::Access::MASTER] - end + expect(user.authorized_projects(Gitlab::Access::REPORTER)) + .to contain_exactly(project) + end - subject { user.authorized_projects } + it 'includes projects for which the user is a master' do + user = create(:user) + project = create(:empty_project, :private) + + project.team << [user, Gitlab::Access::MASTER] - it { is_expected.to eq([private_project]) } + expect(user.authorized_projects(Gitlab::Access::REPORTER)) + .to contain_exactly(project) + end + end end describe '#ci_authorized_runners' do diff --git a/spec/requests/api/api_helpers_spec.rb b/spec/requests/api/api_helpers_spec.rb index 830259538899382380009f8e3c35a5812d909c5d..831889afb6c894fc2b783acb38223e02292aad17 100644 --- a/spec/requests/api/api_helpers_spec.rb +++ b/spec/requests/api/api_helpers_spec.rb @@ -49,7 +49,7 @@ describe API::Helpers, api: true do it "should return nil for a user without access" do env[API::Helpers::PRIVATE_TOKEN_HEADER] = user.private_token - allow(Gitlab::UserAccess).to receive(:allowed?).and_return(false) + allow_any_instance_of(Gitlab::UserAccess).to receive(:allowed?).and_return(false) expect(current_user).to be_nil end @@ -73,7 +73,7 @@ describe API::Helpers, api: true do it "should return nil for a user without access" do env[API::Helpers::PRIVATE_TOKEN_HEADER] = personal_access_token.token - allow(Gitlab::UserAccess).to receive(:allowed?).and_return(false) + allow_any_instance_of(Gitlab::UserAccess).to receive(:allowed?).and_return(false) expect(current_user).to be_nil end @@ -211,4 +211,27 @@ describe API::Helpers, api: true do expect(sudo_identifier).to eq(' 123') end end + + describe '.to_boolean' do + it 'converts a valid string to a boolean' do + expect(to_boolean('true')).to be_truthy + expect(to_boolean('YeS')).to be_truthy + expect(to_boolean('t')).to be_truthy + expect(to_boolean('1')).to be_truthy + expect(to_boolean('ON')).to be_truthy + expect(to_boolean('FaLse')).to be_falsy + expect(to_boolean('F')).to be_falsy + expect(to_boolean('NO')).to be_falsy + expect(to_boolean('n')).to be_falsy + expect(to_boolean('0')).to be_falsy + expect(to_boolean('oFF')).to be_falsy + end + + it 'converts an invalid string to nil' do + expect(to_boolean('fals')).to be_nil + expect(to_boolean('yeah')).to be_nil + expect(to_boolean('')).to be_nil + expect(to_boolean(nil)).to be_nil + end + end end diff --git a/spec/requests/api/branches_spec.rb b/spec/requests/api/branches_spec.rb index b11ca26ee68563c35302d14fad5fcb0318c94e20..719da27f91982c5f7182be71fabb271f4933f4e5 100644 --- a/spec/requests/api/branches_spec.rb +++ b/spec/requests/api/branches_spec.rb @@ -32,6 +32,8 @@ describe API::API, api: true do expect(json_response['name']).to eq(branch_name) expect(json_response['commit']['id']).to eq(branch_sha) expect(json_response['protected']).to eq(false) + expect(json_response['developers_can_push']).to eq(false) + expect(json_response['developers_can_merge']).to eq(false) end it "should return a 403 error if guest" do @@ -45,14 +47,95 @@ describe API::API, api: true do end end - describe "PUT /projects/:id/repository/branches/:branch/protect" do - it "should protect a single branch" do + describe 'PUT /projects/:id/repository/branches/:branch/protect' do + it 'protects a single branch' do put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user) + expect(response).to have_http_status(200) + expect(json_response['name']).to eq(branch_name) + expect(json_response['commit']['id']).to eq(branch_sha) + expect(json_response['protected']).to eq(true) + expect(json_response['developers_can_push']).to eq(false) + expect(json_response['developers_can_merge']).to eq(false) + end + + it 'protects a single branch and developers can push' do + put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user), + developers_can_push: true + + expect(response).to have_http_status(200) + expect(json_response['name']).to eq(branch_name) + expect(json_response['commit']['id']).to eq(branch_sha) + expect(json_response['protected']).to eq(true) + expect(json_response['developers_can_push']).to eq(true) + expect(json_response['developers_can_merge']).to eq(false) + end + it 'protects a single branch and developers can merge' do + put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user), + developers_can_merge: true + + expect(response).to have_http_status(200) expect(json_response['name']).to eq(branch_name) expect(json_response['commit']['id']).to eq(branch_sha) expect(json_response['protected']).to eq(true) + expect(json_response['developers_can_push']).to eq(false) + expect(json_response['developers_can_merge']).to eq(true) + end + + it 'protects a single branch and developers can push and merge' do + put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user), + developers_can_push: true, developers_can_merge: true + + expect(response).to have_http_status(200) + expect(json_response['name']).to eq(branch_name) + expect(json_response['commit']['id']).to eq(branch_sha) + expect(json_response['protected']).to eq(true) + expect(json_response['developers_can_push']).to eq(true) + expect(json_response['developers_can_merge']).to eq(true) + end + + it 'protects a single branch and developers cannot push and merge' do + put api("/projects/#{project.id}/repository/branches/#{branch_name}/protect", user), + developers_can_push: 'tru', developers_can_merge: 'tr' + + expect(response).to have_http_status(200) + expect(json_response['name']).to eq(branch_name) + expect(json_response['commit']['id']).to eq(branch_sha) + expect(json_response['protected']).to eq(true) + expect(json_response['developers_can_push']).to eq(false) + expect(json_response['developers_can_merge']).to eq(false) + end + + context 'on a protected branch' do + let(:protected_branch) { 'foo' } + + before do + project.repository.add_branch(user, protected_branch, 'master') + create(:protected_branch, project: project, name: protected_branch, developers_can_push: true, developers_can_merge: true) + end + + it 'updates that a developer can push' do + put api("/projects/#{project.id}/repository/branches/#{protected_branch}/protect", user), + developers_can_push: false, developers_can_merge: false + + expect(response).to have_http_status(200) + expect(json_response['name']).to eq(protected_branch) + expect(json_response['protected']).to eq(true) + expect(json_response['developers_can_push']).to eq(false) + expect(json_response['developers_can_merge']).to eq(false) + end + + it 'does not update that a developer can push' do + put api("/projects/#{project.id}/repository/branches/#{protected_branch}/protect", user), + developers_can_push: 'foobar', developers_can_merge: 'foo' + + expect(response).to have_http_status(200) + expect(json_response['name']).to eq(protected_branch) + expect(json_response['protected']).to eq(true) + expect(json_response['developers_can_push']).to eq(true) + expect(json_response['developers_can_merge']).to eq(true) + end end it "should return a 404 error if branch not found" do diff --git a/spec/requests/api/issues_spec.rb b/spec/requests/api/issues_spec.rb index 6adccb4ebae9348f8d7e928b602a70b68267b2ef..12f2cfa69426d4dce431f72ebcd0a70792c4a0d1 100644 --- a/spec/requests/api/issues_spec.rb +++ b/spec/requests/api/issues_spec.rb @@ -503,6 +503,20 @@ describe API::API, api: true do ]) end + context 'with due date' do + it 'creates a new project issue' do + due_date = 2.weeks.from_now.strftime('%Y-%m-%d') + + post api("/projects/#{project.id}/issues", user), + title: 'new issue', due_date: due_date + + expect(response).to have_http_status(201) + expect(json_response['title']).to eq('new issue') + expect(json_response['description']).to be_nil + expect(json_response['due_date']).to eq(due_date) + end + end + context 'when an admin or owner makes the request' do it 'accepts the creation date to be set' do creation_time = 2.weeks.ago @@ -683,6 +697,17 @@ describe API::API, api: true do end end + describe 'PUT /projects/:id/issues/:issue_id to update due date' do + it 'creates a new project issue' do + due_date = 2.weeks.from_now.strftime('%Y-%m-%d') + + put api("/projects/#{project.id}/issues/#{issue.id}", user), due_date: due_date + + expect(response).to have_http_status(200) + expect(json_response['due_date']).to eq(due_date) + end + end + describe "DELETE /projects/:id/issues/:issue_id" do it "rejects a non member from deleting an issue" do delete api("/projects/#{project.id}/issues/#{issue.id}", non_member) diff --git a/spec/requests/api/todos_spec.rb b/spec/requests/api/todos_spec.rb index 92a4fa216cd2b4d4c3fea0f5094837def558bdcb..3ccd0af652f7a05fb1f9c7743cca64c432482429 100644 --- a/spec/requests/api/todos_spec.rb +++ b/spec/requests/api/todos_spec.rb @@ -134,8 +134,7 @@ describe API::Todos, api: true do delete api('/todos', john_doe) expect(response.status).to eq(200) - expect(json_response).to be_an Array - expect(json_response.length).to eq(3) + expect(response.body).to eq('3') expect(pending_1.reload).to be_done expect(pending_2.reload).to be_done expect(pending_3.reload).to be_done diff --git a/spec/requests/lfs_http_spec.rb b/spec/requests/lfs_http_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..93d2bc160cc8fc3ca3abcc52b3c773417a24c0b5 --- /dev/null +++ b/spec/requests/lfs_http_spec.rb @@ -0,0 +1,768 @@ +require 'spec_helper' + +describe Gitlab::Lfs::Router do + let(:user) { create(:user) } + let!(:lfs_object) { create(:lfs_object, :with_file) } + + let(:headers) do + { + 'Authorization' => authorization, + 'X-Sendfile-Type' => sendfile + }.compact + end + let(:authorization) { } + let(:sendfile) { } + + let(:sample_oid) { lfs_object.oid } + let(:sample_size) { lfs_object.size } + + describe 'when lfs is disabled' do + let(:project) { create(:empty_project) } + let(:body) do + { + 'objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078 + }, + { 'oid' => sample_oid, + 'size' => sample_size + } + ], + 'operation' => 'upload' + } + end + + before do + allow(Gitlab.config.lfs).to receive(:enabled).and_return(false) + post_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers + end + + it 'responds with 501' do + expect(response).to have_http_status(501) + expect(json_response).to include('message' => 'Git LFS is not enabled on this GitLab server, contact your admin.') + end + end + + describe 'deprecated API' do + let(:project) { create(:empty_project) } + + before do + enable_lfs + end + + shared_examples 'a deprecated' do + it 'responds with 501' do + expect(response).to have_http_status(501) + end + + it 'returns deprecated message' do + expect(json_response).to include('message' => 'Server supports batch API only, please update your Git LFS client to version 1.0.1 and up.') + end + end + + context 'when fetching lfs object using deprecated API' do + let(:authorization) { authorize_user } + + before do + get "#{project.http_url_to_repo}/info/lfs/objects/#{sample_oid}", nil, headers + end + + it_behaves_like 'a deprecated' + end + + context 'when handling lfs request using deprecated API' do + before do + post_json "#{project.http_url_to_repo}/info/lfs/objects", nil, headers + end + + it_behaves_like 'a deprecated' + end + end + + describe 'when fetching lfs object' do + let(:project) { create(:empty_project) } + let(:update_permissions) { } + + before do + enable_lfs + update_permissions + get "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", nil, headers + end + + context 'and request comes from gitlab-workhorse' do + context 'without user being authorized' do + it 'responds with status 401' do + expect(response).to have_http_status(401) + end + end + + context 'with required headers' do + shared_examples 'responds with a file' do + let(:sendfile) { 'X-Sendfile' } + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'responds with the file location' do + expect(response.headers['Content-Type']).to eq('application/octet-stream') + expect(response.headers['X-Sendfile']).to eq(lfs_object.file.path) + end + end + + context 'with user is authorized' do + let(:authorization) { authorize_user } + + context 'and does not have project access' do + let(:update_permissions) do + project.lfs_objects << lfs_object + end + + it 'responds with status 403' do + expect(response).to have_http_status(403) + end + end + + context 'and does have project access' do + let(:update_permissions) do + project.team << [user, :master] + project.lfs_objects << lfs_object + end + + it_behaves_like 'responds with a file' + end + end + + context 'when CI is authorized' do + let(:authorization) { authorize_ci_project } + + let(:update_permissions) do + project.lfs_objects << lfs_object + end + + it_behaves_like 'responds with a file' + end + end + + context 'without required headers' do + let(:authorization) { authorize_user } + + it 'responds with status 403' do + expect(response).to have_http_status(403) + end + end + end + end + + describe 'when handling lfs batch request' do + let(:update_lfs_permissions) { } + let(:update_user_permissions) { } + + before do + enable_lfs + update_lfs_permissions + update_user_permissions + post_json "#{project.http_url_to_repo}/info/lfs/objects/batch", body, headers + end + + describe 'download' do + let(:project) { create(:empty_project) } + let(:body) do + { 'operation' => 'download', + 'objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size + }] + } + end + + shared_examples 'an authorized requests' do + context 'when downloading an lfs object that is assigned to our project' do + let(:update_lfs_permissions) do + project.lfs_objects << lfs_object + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'with href to download' do + expect(json_response).to eq('objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size, + 'actions' => { + 'download' => { + 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + 'header' => { 'Authorization' => authorization } + } + } + }]) + end + end + + context 'when downloading an lfs object that is assigned to other project' do + let(:other_project) { create(:empty_project) } + let(:update_lfs_permissions) do + other_project.lfs_objects << lfs_object + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'with href to download' do + expect(json_response).to eq('objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size, + 'error' => { + 'code' => 404, + 'message' => "Object does not exist on the server or you don't have permissions to access it", + } + }]) + end + end + + context 'when downloading a lfs object that does not exist' do + let(:body) do + { 'operation' => 'download', + 'objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078 + }] + } + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'with an 404 for specific object' do + expect(json_response).to eq('objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078, + 'error' => { + 'code' => 404, + 'message' => "Object does not exist on the server or you don't have permissions to access it", + } + }]) + end + end + + context 'when downloading one new and one existing lfs object' do + let(:body) do + { 'operation' => 'download', + 'objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078 + }, + { 'oid' => sample_oid, + 'size' => sample_size + } + ] + } + end + + let(:update_lfs_permissions) do + project.lfs_objects << lfs_object + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'responds with upload hypermedia link for the new object' do + expect(json_response).to eq('objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078, + 'error' => { + 'code' => 404, + 'message' => "Object does not exist on the server or you don't have permissions to access it", + } + }, + { 'oid' => sample_oid, + 'size' => sample_size, + 'actions' => { + 'download' => { + 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + 'header' => { 'Authorization' => authorization } + } + } + }]) + end + end + end + + context 'when user is authenticated' do + let(:authorization) { authorize_user } + + let(:update_user_permissions) do + project.team << [user, role] + end + + it_behaves_like 'an authorized requests' do + let(:role) { :reporter } + end + + context 'when user does is not member of the project' do + let(:role) { :guest } + + it 'responds with 403' do + expect(response).to have_http_status(403) + end + end + + context 'when user does not have download access' do + let(:role) { :guest } + + it 'responds with 403' do + expect(response).to have_http_status(403) + end + end + end + + context 'when CI is authorized' do + let(:authorization) { authorize_ci_project } + + it_behaves_like 'an authorized requests' + end + + context 'when user is not authenticated' do + describe 'is accessing public project' do + let(:project) { create(:project, :public) } + + let(:update_lfs_permissions) do + project.lfs_objects << lfs_object + end + + it 'responds with status 200 and href to download' do + expect(response).to have_http_status(200) + end + + it 'responds with status 200 and href to download' do + expect(json_response).to eq('objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size, + 'actions' => { + 'download' => { + 'href' => "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}", + 'header' => {} + } + } + }]) + end + end + + describe 'is accessing non-public project' do + let(:update_lfs_permissions) do + project.lfs_objects << lfs_object + end + + it 'responds with authorization required' do + expect(response).to have_http_status(401) + end + end + end + end + + describe 'upload' do + let(:project) { create(:project, :public) } + let(:body) do + { 'operation' => 'upload', + 'objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size + }] + } + end + + describe 'when request is authenticated' do + describe 'when user has project push access' do + let(:authorization) { authorize_user } + + let(:update_user_permissions) do + project.team << [user, :developer] + end + + context 'when pushing an lfs object that already exists' do + let(:other_project) { create(:empty_project) } + let(:update_lfs_permissions) do + other_project.lfs_objects << lfs_object + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'responds with links the object to the project' do + expect(json_response['objects']).to be_kind_of(Array) + expect(json_response['objects'].first['oid']).to eq(sample_oid) + expect(json_response['objects'].first['size']).to eq(sample_size) + expect(lfs_object.projects.pluck(:id)).not_to include(project.id) + expect(lfs_object.projects.pluck(:id)).to include(other_project.id) + expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}") + expect(json_response['objects'].first['actions']['upload']['header']).to eq('Authorization' => authorization) + end + end + + context 'when pushing a lfs object that does not exist' do + let(:body) do + { 'operation' => 'upload', + 'objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078 + }] + } + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'responds with upload hypermedia link' do + expect(json_response['objects']).to be_kind_of(Array) + expect(json_response['objects'].first['oid']).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897") + expect(json_response['objects'].first['size']).to eq(1575078) + expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{Gitlab.config.gitlab.url}/#{project.path_with_namespace}.git/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/1575078") + expect(json_response['objects'].first['actions']['upload']['header']).to eq('Authorization' => authorization) + end + end + + context 'when pushing one new and one existing lfs object' do + let(:body) do + { 'operation' => 'upload', + 'objects' => [ + { 'oid' => '91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897', + 'size' => 1575078 + }, + { 'oid' => sample_oid, + 'size' => sample_size + } + ] + } + end + + let(:update_lfs_permissions) do + project.lfs_objects << lfs_object + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'responds with upload hypermedia link for the new object' do + expect(json_response['objects']).to be_kind_of(Array) + + expect(json_response['objects'].first['oid']).to eq("91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897") + expect(json_response['objects'].first['size']).to eq(1575078) + expect(json_response['objects'].first['actions']['upload']['href']).to eq("#{project.http_url_to_repo}/gitlab-lfs/objects/91eff75a492a3ed0dfcb544d7f31326bc4014c8551849c192fd1e48d4dd2c897/1575078") + expect(json_response['objects'].first['actions']['upload']['header']).to eq("Authorization" => authorization) + + expect(json_response['objects'].last['oid']).to eq(sample_oid) + expect(json_response['objects'].last['size']).to eq(sample_size) + expect(json_response['objects'].last).not_to have_key('actions') + end + end + end + + context 'when user does not have push access' do + let(:authorization) { authorize_user } + + it 'responds with 403' do + expect(response).to have_http_status(403) + end + end + + context 'when CI is authorized' do + let(:authorization) { authorize_ci_project } + + it 'responds with 401' do + expect(response).to have_http_status(401) + end + end + end + + context 'when user is not authenticated' do + context 'when user has push access' do + let(:update_user_permissions) do + project.team << [user, :master] + end + + it 'responds with status 401' do + expect(response).to have_http_status(401) + end + end + + context 'when user does not have push access' do + it 'responds with status 401' do + expect(response).to have_http_status(401) + end + end + end + + context 'when CI is authorized' do + let(:authorization) { authorize_ci_project } + + it 'responds with status 403' do + expect(response).to have_http_status(401) + end + end + end + + describe 'unsupported' do + let(:project) { create(:empty_project) } + let(:body) do + { 'operation' => 'other', + 'objects' => [ + { 'oid' => sample_oid, + 'size' => sample_size + }] + } + end + + it 'responds with status 404' do + expect(response).to have_http_status(404) + end + end + end + + describe 'when pushing a lfs object' do + before do + enable_lfs + end + + shared_examples 'unauthorized' do + context 'and request is sent by gitlab-workhorse to authorize the request' do + before do + put_authorize + end + + it 'responds with status 401' do + expect(response).to have_http_status(401) + end + end + + context 'and request is sent by gitlab-workhorse to finalize the upload' do + before do + put_finalize + end + + it 'responds with status 401' do + expect(response).to have_http_status(401) + end + end + + context 'and request is sent with a malformed headers' do + before do + put_finalize('cat /etc/passwd') + end + + it 'does not recognize it as a valid lfs command' do + expect(response).to have_http_status(403) + end + end + end + + shared_examples 'forbidden' do + context 'and request is sent by gitlab-workhorse to authorize the request' do + before do + put_authorize + end + + it 'responds with 403' do + expect(response).to have_http_status(403) + end + end + + context 'and request is sent by gitlab-workhorse to finalize the upload' do + before do + put_finalize + end + + it 'responds with 403' do + expect(response).to have_http_status(403) + end + end + end + + describe 'to one project' do + let(:project) { create(:empty_project) } + + describe 'when user is authenticated' do + let(:authorization) { authorize_user } + + describe 'when user has push access to the project' do + before do + project.team << [user, :developer] + end + + context 'and request is sent by gitlab-workhorse to authorize the request' do + before do + put_authorize + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'responds with status 200, location of lfs store and object details' do + expect(json_response['StoreLFSPath']).to eq("#{Gitlab.config.shared.path}/lfs-objects/tmp/upload") + expect(json_response['LfsOid']).to eq(sample_oid) + expect(json_response['LfsSize']).to eq(sample_size) + end + end + + context 'and request is sent by gitlab-workhorse to finalize the upload' do + before do + put_finalize + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'lfs object is linked to the project' do + expect(lfs_object.projects.pluck(:id)).to include(project.id) + end + end + end + + describe 'and user does not have push access' do + it_behaves_like 'forbidden' + end + end + + context 'when CI is authenticated' do + let(:authorization) { authorize_ci_project } + + it_behaves_like 'unauthorized' + end + + context 'for unauthenticated' do + it_behaves_like 'unauthorized' + end + end + + describe 'to a forked project' do + let(:upstream_project) { create(:project, :public) } + let(:project_owner) { create(:user) } + let(:project) { fork_project(upstream_project, project_owner) } + + describe 'when user is authenticated' do + let(:authorization) { authorize_user } + + describe 'when user has push access to the project' do + before do + project.team << [user, :developer] + end + + context 'and request is sent by gitlab-workhorse to authorize the request' do + before do + put_authorize + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'with location of lfs store and object details' do + expect(json_response['StoreLFSPath']).to eq("#{Gitlab.config.shared.path}/lfs-objects/tmp/upload") + expect(json_response['LfsOid']).to eq(sample_oid) + expect(json_response['LfsSize']).to eq(sample_size) + end + end + + context 'and request is sent by gitlab-workhorse to finalize the upload' do + before do + put_finalize + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'lfs object is linked to the source project' do + expect(lfs_object.projects.pluck(:id)).to include(upstream_project.id) + end + end + end + + describe 'and user does not have push access' do + it_behaves_like 'forbidden' + end + end + + context 'when CI is authenticated' do + let(:authorization) { authorize_ci_project } + + it_behaves_like 'unauthorized' + end + + context 'for unauthenticated' do + it_behaves_like 'unauthorized' + end + + describe 'and second project not related to fork or a source project' do + let(:second_project) { create(:empty_project) } + let(:authorization) { authorize_user } + + before do + second_project.team << [user, :master] + upstream_project.lfs_objects << lfs_object + end + + context 'when pushing the same lfs object to the second project' do + before do + put "#{second_project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}", nil, + headers.merge('X-Gitlab-Lfs-Tmp' => lfs_tmp_file).compact + end + + it 'responds with status 200' do + expect(response).to have_http_status(200) + end + + it 'links the lfs object to the project' do + expect(lfs_object.projects.pluck(:id)).to include(second_project.id, upstream_project.id) + end + end + end + end + + def put_authorize + put "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}/authorize", nil, headers + end + + def put_finalize(lfs_tmp = lfs_tmp_file) + put "#{project.http_url_to_repo}/gitlab-lfs/objects/#{sample_oid}/#{sample_size}", nil, + headers.merge('X-Gitlab-Lfs-Tmp' => lfs_tmp).compact + end + + def lfs_tmp_file + "#{sample_oid}012345678" + end + end + + def enable_lfs + allow(Gitlab.config.lfs).to receive(:enabled).and_return(true) + end + + def authorize_ci_project + ActionController::HttpAuthentication::Basic.encode_credentials('gitlab-ci-token', project.runners_token) + end + + def authorize_user + ActionController::HttpAuthentication::Basic.encode_credentials(user.username, user.password) + end + + def fork_project(project, user, object = nil) + allow(RepositoryForkWorker).to receive(:perform_async).and_return(true) + Projects::ForkService.new(project, user, {}).execute + end + + def post_json(url, body = nil, headers = nil) + post(url, body.try(:to_json), (headers || {}).merge('Content-Type' => 'application/json')) + end + + def json_response + @json_response ||= JSON.parse(response.body) + end +end diff --git a/spec/routing/routing_spec.rb b/spec/routing/routing_spec.rb index 2c755919456cf9207e6ddfa94c8673fee31237b1..0a52c1ab9332575da7c6a048ee548dda0568191d 100644 --- a/spec/routing/routing_spec.rb +++ b/spec/routing/routing_spec.rb @@ -116,12 +116,9 @@ describe HelpController, "routing" do expect(get(path)).to route_to('help#show', path: 'workflow/protected_branches/protected_branches1', format: 'png') - path = '/help/shortcuts' - expect(get(path)).to route_to('help#show', - path: 'shortcuts') + path = '/help/ui' - expect(get(path)).to route_to('help#show', - path: 'ui') + expect(get(path)).to route_to('help#ui') end end diff --git a/spec/services/auth/container_registry_authentication_service_spec.rb b/spec/services/auth/container_registry_authentication_service_spec.rb index 67777ad48bc69c45cd164c99f8297ea9c998d502..7cc71f706ce6c9638b473408ece6f204d5335125 100644 --- a/spec/services/auth/container_registry_authentication_service_spec.rb +++ b/spec/services/auth/container_registry_authentication_service_spec.rb @@ -87,51 +87,105 @@ describe Auth::ContainerRegistryAuthenticationService, services: true do end context 'user authorization' do - let(:project) { create(:project) } let(:current_user) { create(:user) } - context 'allow to use scope-less authentication' do - it_behaves_like 'a valid token' - end + context 'for private project' do + let(:project) { create(:empty_project) } - context 'allow developer to push images' do - before { project.team << [current_user, :developer] } + context 'allow to use scope-less authentication' do + it_behaves_like 'a valid token' + end - let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:push" } + context 'allow developer to push images' do + before { project.team << [current_user, :developer] } + + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:push" } + end + + it_behaves_like 'a pushable' end - it_behaves_like 'a pushable' - end + context 'allow reporter to pull images' do + before { project.team << [current_user, :reporter] } + + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:pull" } + end - context 'allow reporter to pull images' do - before { project.team << [current_user, :reporter] } + it_behaves_like 'a pullable' + end - let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:pull" } + context 'return a least of privileges' do + before { project.team << [current_user, :reporter] } + + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:push,pull" } + end + + it_behaves_like 'a pullable' end - it_behaves_like 'a pullable' + context 'disallow guest to pull or push images' do + before { project.team << [current_user, :guest] } + + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:pull,push" } + end + + it_behaves_like 'an inaccessible' + end end - context 'return a least of privileges' do - before { project.team << [current_user, :reporter] } + context 'for public project' do + let(:project) { create(:empty_project, :public) } - let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:push,pull" } + context 'allow anyone to pull images' do + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:pull" } + end + + it_behaves_like 'a pullable' end - it_behaves_like 'a pullable' + context 'disallow anyone to push images' do + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:push" } + end + + it_behaves_like 'an inaccessible' + end end - context 'disallow guest to pull or push images' do - before { project.team << [current_user, :guest] } + context 'for internal project' do + let(:project) { create(:empty_project, :internal) } - let(:current_params) do - { scope: "repository:#{project.path_with_namespace}:pull,push" } + context 'for internal user' do + context 'allow anyone to pull images' do + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:pull" } + end + + it_behaves_like 'a pullable' + end + + context 'disallow anyone to push images' do + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:push" } + end + + it_behaves_like 'an inaccessible' + end end - it_behaves_like 'an inaccessible' + context 'for external user' do + let(:current_user) { create(:user, external: true) } + let(:current_params) do + { scope: "repository:#{project.path_with_namespace}:pull,push" } + end + + it_behaves_like 'an inaccessible' + end end end diff --git a/spec/services/create_commit_builds_service_spec.rb b/spec/services/create_commit_builds_service_spec.rb index 4d09bc5fb12cee43b1cab104368aac1b32b2b32e..d4c5e584421627b21d1a08fc59d975bf0aa6d4b4 100644 --- a/spec/services/create_commit_builds_service_spec.rb +++ b/spec/services/create_commit_builds_service_spec.rb @@ -3,7 +3,7 @@ require 'spec_helper' describe CreateCommitBuildsService, services: true do let(:service) { CreateCommitBuildsService.new } let(:project) { FactoryGirl.create(:empty_project) } - let(:user) { nil } + let(:user) { create(:user) } before do stub_ci_pipeline_to_return_yaml_file @@ -24,6 +24,7 @@ describe CreateCommitBuildsService, services: true do it { expect(pipeline).to be_valid } it { expect(pipeline).to be_persisted } it { expect(pipeline).to eq(project.pipelines.last) } + it { expect(pipeline).to have_attributes(user: user) } it { expect(pipeline.builds.first).to be_kind_of(Ci::Build) } end diff --git a/spec/services/create_deployment_service_spec.rb b/spec/services/create_deployment_service_spec.rb index 654e441f3cd44f404d0d40facadf0fdcd5e3f69e..8da2a2b3c1b2c430d51cd93bce5c09383abf8b79 100644 --- a/spec/services/create_deployment_service_spec.rb +++ b/spec/services/create_deployment_service_spec.rb @@ -89,6 +89,12 @@ describe CreateDeploymentService, services: true do expect_any_instance_of(described_class).to receive(:execute) subject end + + it 'is set as deployable' do + subject + + expect(Deployment.last.deployable).to eq(deployable) + end end context 'without environment specified' do @@ -105,6 +111,8 @@ describe CreateDeploymentService, services: true do context 'when build succeeds' do it_behaves_like 'does create environment and deployment' do + let(:deployable) { build } + subject { build.success } end end @@ -114,6 +122,14 @@ describe CreateDeploymentService, services: true do subject { build.drop } end end + + context 'when build is retried' do + it_behaves_like 'does create environment and deployment' do + let(:deployable) { Ci::Build.retry(build) } + + subject { deployable.success } + end + end end end end diff --git a/spec/services/git_push_service_spec.rb b/spec/services/git_push_service_spec.rb index afabeed4a80f095df92c7efff04047189acca865..47c0580e0f044339888250b46ceecf915ab4f947 100644 --- a/spec/services/git_push_service_spec.rb +++ b/spec/services/git_push_service_spec.rb @@ -224,7 +224,7 @@ describe GitPushService, services: true do it "when pushing a branch for the first time" do expect(project).to receive(:execute_hooks) expect(project.default_branch).to eq("master") - expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: false }) + expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: false, developers_can_merge: false }) execute_service(project, user, @blankrev, 'newrev', 'refs/heads/master' ) end @@ -242,7 +242,17 @@ describe GitPushService, services: true do expect(project).to receive(:execute_hooks) expect(project.default_branch).to eq("master") - expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: true }) + expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: true, developers_can_merge: false }) + + execute_service(project, user, @blankrev, 'newrev', 'refs/heads/master') + end + + it "when pushing a branch for the first time with default branch protection set to 'developers can merge'" do + stub_application_setting(default_branch_protection: Gitlab::Access::PROTECTION_DEV_CAN_MERGE) + + expect(project).to receive(:execute_hooks) + expect(project.default_branch).to eq("master") + expect(project.protected_branches).to receive(:create).with({ name: "master", developers_can_push: false, developers_can_merge: true }) execute_service(project, user, @blankrev, 'newrev', 'refs/heads/master' ) end diff --git a/spec/services/issues/bulk_update_service_spec.rb b/spec/services/issues/bulk_update_service_spec.rb index 4a689e64dc5d0641bcb0accd71381b2b050e5e9f..ba3a4dfc048fd742fa9aedd324130a53c790fdfe 100644 --- a/spec/services/issues/bulk_update_service_spec.rb +++ b/spec/services/issues/bulk_update_service_spec.rb @@ -262,4 +262,42 @@ describe Issues::BulkUpdateService, services: true do end end end + + describe :subscribe_issues do + let(:issues) { create_list(:issue, 5, project: project) } + let(:params) do + { + subscription_event: 'subscribe', + issues_ids: issues.map(&:id).join(',') + } + end + + it 'subscribes the given user' do + issues.each do |issue| + expect(issue.subscribed?(user)).to be_truthy + end + end + end + + describe :unsubscribe_issues do + let(:issues) { create_list(:closed_issue, 5, project: project) } + let(:params) do + { + subscription_event: 'unsubscribe', + issues_ids: issues.map(&:id).join(',') + } + end + + before do + issues.each do |issue| + issue.subscriptions.create(user: user, subscribed: true) + end + end + + it 'unsubscribes the given user' do + issues.each do |issue| + expect(issue.subscribed?(user)).to be_falsey + end + end + end end diff --git a/spec/services/merge_requests/refresh_service_spec.rb b/spec/services/merge_requests/refresh_service_spec.rb index 06f56d85aa86955c733bc0ff0e90a51eff3b5469..ce643b3f860be7505ad8f04447eeeb12f159cdb6 100644 --- a/spec/services/merge_requests/refresh_service_spec.rb +++ b/spec/services/merge_requests/refresh_service_spec.rb @@ -88,8 +88,7 @@ describe MergeRequests::RefreshService, services: true do # Merge master -> feature branch author = { email: 'test@gitlab.com', time: Time.now, name: "Me" } commit_options = { message: 'Test message', committer: author, author: author } - master_commit = @project.repository.commit('master') - @project.repository.merge(@user, master_commit.id, 'feature', commit_options) + @project.repository.merge(@user, @merge_request, commit_options) commit = @project.repository.commit('feature') service.new(@project, @user).execute(@oldrev, commit.id, 'refs/heads/feature') reload_mrs diff --git a/spec/support/test_env.rb b/spec/support/test_env.rb index bb6c84262f6144c91df9c57bb8cca0ab0c5649a9..83f2ad96fd8bad4071b573c32b87dd03ce1d8788 100644 --- a/spec/support/test_env.rb +++ b/spec/support/test_env.rb @@ -18,7 +18,9 @@ module TestEnv 'orphaned-branch' => '45127a9', 'binary-encoding' => '7b1cf43', 'gitattributes' => '5a62481', - 'expand-collapse-diffs' => '4842455' + 'expand-collapse-diffs' => '4842455', + 'expand-collapse-files' => '025db92', + 'expand-collapse-lines' => '238e82d' } # gitlab-test-fork is a fork of gitlab-fork, but we don't necessarily diff --git a/spec/views/projects/builds/show.html.haml_spec.rb b/spec/views/projects/builds/show.html.haml_spec.rb index cd18d19ef5e7c2cbc5eedd34bd7b4e146a8b696b..42220a20c75bef6f547687af1b4cdaa08f26d93d 100644 --- a/spec/views/projects/builds/show.html.haml_spec.rb +++ b/spec/views/projects/builds/show.html.haml_spec.rb @@ -3,8 +3,12 @@ require 'spec_helper' describe 'projects/builds/show' do include Devise::TestHelpers - let(:build) { create(:ci_build) } - let(:project) { build.project } + let(:project) { create(:project) } + let(:pipeline) do + create(:ci_pipeline, project: project, + sha: project.commit.id) + end + let(:build) { create(:ci_build, pipeline: pipeline) } before do assign(:build, build) @@ -34,4 +38,15 @@ describe 'projects/builds/show' do expect(rendered).to have_link('Retry') end end + + describe 'commit title in sidebar' do + let(:commit_title) { project.commit.title } + + it 'shows commit title and not show commit message' do + render + + expect(rendered).to have_css('p.build-light-text.append-bottom-0', + text: /\A\n#{Regexp.escape(commit_title)}\n\Z/) + end + end end