Compare commits

...

2 Commits

Author SHA1 Message Date
Philipp ea2e6747d9
Added basic nvim config, replaced vim with nvim 2024-03-03 15:33:59 +01:00
Philipp 624d12439c
Added alacritty config 2024-03-03 15:01:37 +01:00
1974 changed files with 126669 additions and 0 deletions

View File

@ -0,0 +1,15 @@
# Import our style
import = ["~/.config/alacritty/dracula.toml"]
# Lets setup copying to system clipboard
[selection]
save_to_clipboard = true
# Change our cursor to a line
[cursor]
style.shape = "Beam"
style.blinking = "On"
# We want something different for vim
vi_mode_style.shape = "Block"
vi_mode_style.blinking = "Off"

View File

@ -0,0 +1,76 @@
# Dracula theme for Alacritty
# https://draculatheme.com/alacritty
#
# Color palette
# https://spec.draculatheme.com
#
# Instructions
# https://github.com/alacritty/alacritty/blob/master/extra/man/alacritty.5.scd
[colors.primary]
background = "#282a36"
foreground = "#f8f8f2"
bright_foreground = "#ffffff"
[colors.cursor]
text = "#282a36"
cursor = "#f8f8f2"
[colors.vi_mode_cursor]
text = "CellBackground"
cursor = "CellForeground"
[colors.selection]
text = "CellForeground"
background = "#44475a"
[colors.normal]
black = "#21222c"
red = "#ff5555"
green = "#50fa7b"
yellow = "#f1fa8c"
blue = "#bd93f9"
magenta = "#ff79c6"
cyan = "#8be9fd"
white = "#f8f8f2"
[colors.bright]
black = "#6272a4"
red = "#ff6e6e"
green = "#69ff94"
yellow = "#ffffa5"
blue = "#d6acff"
magenta = "#ff92df"
cyan = "#a4ffff"
white = "#ffffff"
[colors.search.matches]
foreground = "#44475a"
background = "#50fa7b"
[colors.search.focused_match]
foreground = "#44475a"
background = "#ffb86c"
[colors.footer_bar]
background = "#282a36"
foreground = "#f8f8f2"
[colors.hints.start]
foreground = "#282a36"
background = "#f1fa8c"
[colors.hints.end]
foreground = "#f1fa8c"
background = "#282a36"

44
dot_config/nvim/init.vim Normal file
View File

@ -0,0 +1,44 @@
" Get us some plugins
call plug#begin("~/.vim/plugged")
" Plugin Section
Plug 'dracula/vim'
Plug 'ryanoasis/vim-devicons'
Plug 'scrooloose/nerdtree'
call plug#end()
" Show matching
set showmatch
" case insensitive
set ignorecase
" Enable middle mouse click pasting
set mouse=v
" Highlight our search
set hlsearch
" Set columns for tab stop
set tabstop=4
" convert tabs to white spaces
set expandtab
" indent a new line the same amount as the line just typed
set autoindent
" show line numbers
set number
" enable syntax highlighting
syntax on
" use system clipboard
set clipboard=unnamedplus
" highlight current cursorline
set cursorline
" disable creating swap file
set noswapfile

View File

@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies within all project spaces, and it also applies when
an individual is representing the project or its community in public spaces.
Examples of representing a project or community include using an official
project e-mail address, posting via an official social media account, or acting
as an appointed representative at an online or offline event. Representation of
a project may be further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at ohmyzsh@planetargon.com. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

View File

@ -0,0 +1,245 @@
# CONTRIBUTING GUIDELINES
Oh-My-Zsh is a community-driven project. Contribution is welcome, encouraged, and appreciated.
It is also essential for the development of the project.
First, please take a moment to review our [code of conduct](CODE_OF_CONDUCT.md).
These guidelines are an attempt at better addressing the huge amount of pending
issues and pull requests. Please read them closely.
Foremost, be so kind as to [search](#use-the-search-luke). This ensures any contribution
you would make is not already covered.
<!-- TOC updateonsave:true depthfrom:2 -->
- [Reporting Issues](#reporting-issues)
- [You have a problem](#you-have-a-problem)
- [You have a suggestion](#you-have-a-suggestion)
- [Submitting Pull Requests](#submitting-pull-requests)
- [Getting started](#getting-started)
- [You have a solution](#you-have-a-solution)
- [You have an addition](#you-have-an-addition)
- [Use the Search, Luke](#use-the-search-luke)
- [Commit Guidelines](#commit-guidelines)
- [Format](#format)
- [Style](#style)
- [Volunteer](#volunteer)
<!-- /TOC -->
## Reporting Issues
### You have a problem
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
your problem.
If you find one, comment on it, so we know more people are experiencing it.
If not, look at the [Troubleshooting](https://github.com/ohmyzsh/ohmyzsh/wiki/Troubleshooting)
page for instructions on how to gather data to better debug your problem.
Then, you can go ahead and create an issue with as much detail as you can provide.
It should include the data gathered as indicated above, along with the following:
1. How to reproduce the problem
2. What the correct behavior should be
3. What the actual behavior is
Please copy to anyone relevant (e.g. plugin maintainers) by mentioning their GitHub handle
(starting with `@`) in your message.
We will do our very best to help you.
### You have a suggestion
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
your suggestion.
If you find one, comment on it, so we know more people are supporting it.
If not, you can go ahead and create an issue. Please copy to anyone relevant (e.g. plugin
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
## Submitting Pull Requests
### Getting started
You should be familiar with the basics of
[contributing on GitHub](https://help.github.com/articles/using-pull-requests) and have a fork
[properly set up](https://github.com/ohmyzsh/ohmyzsh/wiki/Contribution-Technical-Practices).
You MUST always create PRs with _a dedicated branch_ based on the latest upstream tree.
If you create your own PR, please make sure you do it right. Also be so kind as to reference
any issue that would be solved in the PR description body,
[for instance](https://help.github.com/articles/closing-issues-via-commit-messages/)
_"Fixes #XXXX"_ for issue number XXXX.
### You have a solution
Please be so kind as to [search](#use-the-search-luke) for any open issue already covering
your [problem](#you-have-a-problem), and any pending/merged/rejected PR covering your solution.
If the solution is already reported, try it out and +1 the pull request if the
solution works ok. On the other hand, if you think your solution is better, post
it with reference to the other one so we can have both solutions to compare.
If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
### You have an addition
Please [do not](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#dont-send-us-your-theme-for-now)
send themes for now.
Please be so kind as to [search](#use-the-search-luke) for any pending, merged or rejected Pull Requests
covering or related to what you want to add.
If you find one, try it out and work with the author on a common solution.
If not, then go ahead and submit a PR. Please copy to anyone relevant (e.g. plugin
maintainers) by mentioning their GitHub handle (starting with `@`) in your message.
For any extensive change, such as a new plugin, you will have to find testers to +1 your PR.
### New plugin aliases
We acknowledge that aliases are a core part of Oh My Zsh. There are plugins that have +100 aliases!
This has become an issue for two opposing reasons:
- Some users want to have their personal aliases in Oh My Zsh.
- Some users don't want any aliases at all and feel that there are too many.
Because of this, from now on, we require that new aliases follow these conditions:
1. They will be used by many people, not just a few.
2. The aliases will be used many times and for common tasks.
3. Prefer one generic alias over many specific ones.
4. When justifying the need for an alias, talk about workflows where you'll use it,
preferably in combination with other aliases.
5. If a command with the same name exists, look for a different alias name.
This list is not exhaustive! Please remember that your alias will be in the machines of many people,
so it should be justified why they should have it.
----
## Use the Search, Luke
_May the Force (of past experiences) be with you_
GitHub offers [many search features](https://help.github.com/articles/searching-github/)
to help you check whether a similar contribution to yours already exists. Please search
before making any contribution, it avoids duplicates and eases maintenance. Trust me,
that works 90% of the time.
You can also take a look at the [FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ)
to be sure your contribution has not already come up.
If all fails, your thing has probably not been reported yet, so you can go ahead
and [create an issue](#reporting-issues) or [submit a PR](#submitting-pull-requests).
----
## Commit Guidelines
Oh My Zsh uses the [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/)
specification. The automatic changelog tool uses these to automatically generate
a changelog based on the commit messages. Here's a guide to writing a commit message
to allow this:
### Format
```
type(scope)!: subject
```
- `type`: the type of the commit is one of the following:
- `feat`: new features.
- `fix`: bug fixes.
- `docs`: documentation changes.
- `refactor`: refactor of a particular code section without introducing
new features or bug fixes.
- `style`: code style improvements.
- `perf`: performance improvements.
- `test`: changes to the test suite.
- `ci`: changes to the CI system.
- `build`: changes to the build system (we don't yet have one so this shouldn't apply).
- `chore`: for other changes that don't match previous types. This doesn't appear
in the changelog.
- `scope`: section of the codebase that the commit makes changes to. If it makes changes to
many sections, or if no section in particular is modified, leave blank without the parentheses.
Examples:
- Commit that changes the `git` plugin:
```
feat(git): add alias for `git commit`
```
- Commit that changes many plugins:
```
style: fix inline declaration of arrays
```
For changes to plugins or themes, the scope should be the plugin or theme name:
- ✅ `fix(agnoster): commit subject`
- ❌ `fix(theme/agnoster): commit subject`
- `!`: this goes after the `scope` (or the `type` if scope is empty), to indicate that the commit
introduces breaking changes.
Optionally, you can specify a message that the changelog tool will display to the user to indicate
what's changed and what they can do to deal with it. You can use multiple lines to type this message;
the changelog parser will keep reading until the end of the commit message or until it finds an empty
line.
Example (made up):
```
style(agnoster)!: change dirty git repo glyph
BREAKING CHANGE: the glyph to indicate when a git repository is dirty has
changed from a Powerline character to a standard UTF-8 emoji. You can
change it back by setting `ZSH_THEME_DIRTY_GLYPH`.
Fixes #420
Co-authored-by: Username <email>
```
- `subject`: a brief description of the changes. This will be displayed in the changelog. If you need
to specify other details, you can use the commit body, but it won't be visible.
Formatting tricks: the commit subject may contain:
- Links to related issues or PRs by writing `#issue`. This will be highlighted by the changelog tool:
```
feat(archlinux): add support for aura AUR helper (#9467)
```
- Formatted inline code by using backticks: the text between backticks will also be highlighted by
the changelog tool:
```
feat(shell-proxy): enable unexported `DEFAULT_PROXY` setting (#9774)
```
### Style
Try to keep the first commit line short. It's harder to do using this commit style but try to be
concise, and if you need more space, you can use the commit body. Try to make sure that the commit
subject is clear and precise enough that users will know what changed by just looking at the changelog.
----
## Volunteer
Very nice!! :)
Please have a look at the [Volunteer](https://github.com/ohmyzsh/ohmyzsh/wiki/Volunteers)
page for instructions on where to start and more.

21
dot_oh-my-zsh/LICENSE.txt Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2009-2022 Robby Russell and contributors (https://github.com/ohmyzsh/ohmyzsh/contributors)
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

473
dot_oh-my-zsh/README.md Normal file
View File

@ -0,0 +1,473 @@
<p align="center"><img src="https://ohmyzsh.s3.amazonaws.com/omz-ansi-github.png" alt="Oh My Zsh"></p>
Oh My Zsh is an open source, community-driven framework for managing your [zsh](https://www.zsh.org/) configuration.
Sounds boring. Let's try again.
**Oh My Zsh will not make you a 10x developer...but you may feel like one.**
Once installed, your terminal shell will become the talk of the town _or your money back!_ With each keystroke in your command prompt, you'll take advantage of the hundreds of powerful plugins and beautiful themes. Strangers will come up to you in cafés and ask you, _"that is amazing! are you some sort of genius?"_
Finally, you'll begin to get the sort of attention that you have always felt you deserved. ...or maybe you'll use the time that you're saving to start flossing more often. 😬
To learn more, visit [ohmyz.sh](https://ohmyz.sh), follow [@ohmyzsh](https://twitter.com/ohmyzsh) on Twitter, and join us on [Discord](https://discord.gg/ohmyzsh).
[![CI](https://github.com/ohmyzsh/ohmyzsh/workflows/CI/badge.svg)](https://github.com/ohmyzsh/ohmyzsh/actions?query=workflow%3ACI)
[![X (formerly Twitter) Follow](https://img.shields.io/twitter/follow/ohmyzsh?label=%40ohmyzsh&logo=x&style=flat)](https://twitter.com/intent/follow?screen_name=ohmyzsh)
[![Mastodon Follow](https://img.shields.io/mastodon/follow/111169632522566717?label=%40ohmyzsh&domain=https%3A%2F%2Fmstdn.social&logo=mastodon&style=flat)](https://mstdn.social/@ohmyzsh)
[![Discord server](https://img.shields.io/discord/642496866407284746)](https://discord.gg/ohmyzsh)
[![Gitpod ready](https://img.shields.io/badge/Gitpod-ready-blue?logo=gitpod)](https://gitpod.io/#https://github.com/ohmyzsh/ohmyzsh)
<details>
<summary>Table of Contents</summary>
- [Getting Started](#getting-started)
- [Operating System Compatibility](#operating-system-compatibility)
- [Prerequisites](#prerequisites)
- [Basic Installation](#basic-installation)
- [Manual Inspection](#manual-inspection)
- [Using Oh My Zsh](#using-oh-my-zsh)
- [Plugins](#plugins)
- [Enabling Plugins](#enabling-plugins)
- [Using Plugins](#using-plugins)
- [Themes](#themes)
- [Selecting A Theme](#selecting-a-theme)
- [FAQ](#faq)
- [Advanced Topics](#advanced-topics)
- [Advanced Installation](#advanced-installation)
- [Custom Directory](#custom-directory)
- [Unattended Install](#unattended-install)
- [Installing From A Forked Repository](#installing-from-a-forked-repository)
- [Manual Installation](#manual-installation)
- [Installation Problems](#installation-problems)
- [Custom Plugins And Themes](#custom-plugins-and-themes)
- [Enable GNU ls In macOS And freeBSD Systems](#enable-gnu-ls-in-macos-and-freebsd-systems)
- [Skip Aliases](#skip-aliases)
- [Getting Updates](#getting-updates)
- [Updates Verbosity](#updates-verbosity)
- [Manual Updates](#manual-updates)
- [Uninstalling Oh My Zsh](#uninstalling-oh-my-zsh)
- [How Do I Contribute To Oh My Zsh?](#how-do-i-contribute-to-oh-my-zsh)
- [Do Not Send Us Themes](#do-not-send-us-themes)
- [Contributors](#contributors)
- [Follow Us](#follow-us)
- [Merchandise](#merchandise)
- [License](#license)
- [About Planet Argon](#about-planet-argon)
</details>
## Getting Started
### Operating System Compatibility
| O/S | Status |
| :------------- | :-----: |
| Android | ✅ |
| freeBSD | ✅ |
| LCARS | 🛸 |
| Linux | ✅ |
| macOS | ✅ |
| OS/2 Warp | ❌ |
| Windows (WSL2) | ✅ |
### Prerequisites
- [Zsh](https://www.zsh.org) should be installed (v4.3.9 or more recent is fine but we prefer 5.0.8 and newer). If not pre-installed (run `zsh --version` to confirm), check the following wiki instructions here: [Installing ZSH](https://github.com/ohmyzsh/ohmyzsh/wiki/Installing-ZSH)
- `curl` or `wget` should be installed
- `git` should be installed (recommended v2.4.11 or higher)
### Basic Installation
Oh My Zsh is installed by running one of the following commands in your terminal. You can install this via the command-line with either `curl`, `wget` or another similar tool.
| Method | Command |
| :-------- | :------------------------------------------------------------------------------------------------ |
| **curl** | `sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
| **wget** | `sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
| **fetch** | `sh -c "$(fetch -o - https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"` |
Alternatively, the installer is also mirrored outside GitHub. Using this URL instead may be required if you're in a country like India or China, that blocks `raw.githubusercontent.com`:
| Method | Command |
| :-------- | :------------------------------------------------------------------------------------------------ |
| **curl** | `sh -c "$(curl -fsSL https://install.ohmyz.sh/)"` |
| **wget** | `sh -c "$(wget -O- https://install.ohmyz.sh/)"` |
| **fetch** | `sh -c "$(fetch -o - https://install.ohmyz.sh/)"` |
_Note that any previous `.zshrc` will be renamed to `.zshrc.pre-oh-my-zsh`. After installation, you can move the configuration you want to preserve into the new `.zshrc`._
#### Manual Inspection
It's a good idea to inspect the install script from projects you don't yet know. You can do
that by downloading the install script first, looking through it so everything looks normal,
then running it:
```sh
wget https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
sh install.sh
```
If the above URL times out or otherwise fails, you may have to substitute the URL for `https://install.ohmyz.sh` to be able to get the script.
## Using Oh My Zsh
### Plugins
Oh My Zsh comes with a shitload of plugins for you to take advantage of. You can take a look in the [plugins](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins) directory and/or the [wiki](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins) to see what's currently available.
#### Enabling Plugins
Once you spot a plugin (or several) that you'd like to use with Oh My Zsh, you'll need to enable them in the `.zshrc` file. You'll find the zshrc file in your `$HOME` directory. Open it with your favorite text editor and you'll see a spot to list all the plugins you want to load.
```sh
vi ~/.zshrc
```
For example, this might begin to look like this:
```sh
plugins=(
git
bundler
dotenv
macos
rake
rbenv
ruby
)
```
_Note that the plugins are separated by whitespace (spaces, tabs, new lines...). **Do not** use commas between them or it will break._
#### Using Plugins
Each built-in plugin includes a **README**, documenting it. This README should show the aliases (if the plugin adds any) and extra goodies that are included in that particular plugin.
### Themes
We'll admit it. Early in the Oh My Zsh world, we may have gotten a bit too theme happy. We have over one hundred and fifty themes now bundled. Most of them have [screenshots](https://github.com/ohmyzsh/ohmyzsh/wiki/Themes) on the wiki (We are working on updating this!). Check them out!
#### Selecting A Theme
_Robby's theme is the default one. It's not the fanciest one. It's not the simplest one. It's just the right one (for him)._
Once you find a theme that you'd like to use, you will need to edit the `~/.zshrc` file. You'll see an environment variable (all caps) in there that looks like:
```sh
ZSH_THEME="robbyrussell"
```
To use a different theme, simply change the value to match the name of your desired theme. For example:
```sh
ZSH_THEME="agnoster" # (this is one of the fancy ones)
# see https://github.com/ohmyzsh/ohmyzsh/wiki/Themes#agnoster
```
_Note: many themes require installing a [Powerline Font](https://github.com/powerline/fonts) or a [Nerd Font](https://github.com/ryanoasis/nerd-fonts) in order to render properly. Without them, these themes will render [weird prompt symbols](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ#i-have-a-weird-character-in-my-prompt)_
Open up a new terminal window and your prompt should look something like this:
![Agnoster theme](https://cloud.githubusercontent.com/assets/2618447/6316862/70f58fb6-ba03-11e4-82c9-c083bf9a6574.png)
In case you did not find a suitable theme for your needs, please have a look at the wiki for [more of them](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes).
If you're feeling feisty, you can let the computer select one randomly for you each time you open a new terminal window.
```sh
ZSH_THEME="random" # (...please let it be pie... please be some pie..)
```
And if you want to pick random theme from a list of your favorite themes:
```sh
ZSH_THEME_RANDOM_CANDIDATES=(
"robbyrussell"
"agnoster"
)
```
If you only know which themes you don't like, you can add them similarly to an ignored list:
```sh
ZSH_THEME_RANDOM_IGNORED=(pygmalion tjkirch_mod)
```
### FAQ
If you have some more questions or issues, you might find a solution in our [FAQ](https://github.com/ohmyzsh/ohmyzsh/wiki/FAQ).
## Advanced Topics
If you're the type that likes to get their hands dirty, these sections might resonate.
### Advanced Installation
Some users may want to manually install Oh My Zsh, or change the default path or other settings that
the installer accepts (these settings are also documented at the top of the install script).
#### Custom Directory
The default location is `~/.oh-my-zsh` (hidden in your home directory, you can access it with `cd ~/.oh-my-zsh`)
If you'd like to change the install directory with the `ZSH` environment variable, either by running
`export ZSH=/your/path` before installing, or by setting it before the end of the install pipeline
like this:
```sh
ZSH="$HOME/.dotfiles/oh-my-zsh" sh install.sh
```
#### Unattended Install
If you're running the Oh My Zsh install script as part of an automated install, you can pass the `--unattended`
flag to the `install.sh` script. This will have the effect of not trying to change
the default shell, and it also won't run `zsh` when the installation has finished.
```sh
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" "" --unattended
```
If you're in China, India, or another country that blocks `raw.githubusercontent.com`, you may have to substitute the URL for `https://install.ohmyz.sh` for it to install.
#### Installing From A Forked Repository
The install script also accepts these variables to allow installation of a different repository:
- `REPO` (default: `ohmyzsh/ohmyzsh`): this takes the form of `owner/repository`. If you set
this variable, the installer will look for a repository at `https://github.com/{owner}/{repository}`.
- `REMOTE` (default: `https://github.com/${REPO}.git`): this is the full URL of the git repository
clone. You can use this setting if you want to install from a fork that is not on GitHub (GitLab,
Bitbucket...) or if you want to clone with SSH instead of HTTPS (`git@github.com:user/project.git`).
_NOTE: it's incompatible with setting the `REPO` variable. This setting will take precedence._
- `BRANCH` (default: `master`): you can use this setting if you want to change the default branch to be
checked out when cloning the repository. This might be useful for testing a Pull Request, or if you
want to use a branch other than `master`.
For example:
```sh
REPO=apjanke/oh-my-zsh BRANCH=edge sh install.sh
```
#### Manual Installation
##### 1. Clone The Repository <!-- omit in toc -->
```sh
git clone https://github.com/ohmyzsh/ohmyzsh.git ~/.oh-my-zsh
```
##### 2. _Optionally_, Backup Your Existing `~/.zshrc` File <!-- omit in toc -->
```sh
cp ~/.zshrc ~/.zshrc.orig
```
##### 3. Create A New Zsh Configuration File <!-- omit in toc -->
You can create a new zsh config file by copying the template that we have included for you.
```sh
cp ~/.oh-my-zsh/templates/zshrc.zsh-template ~/.zshrc
```
##### 4. Change Your Default Shell <!-- omit in toc -->
```sh
chsh -s $(which zsh)
```
You must log out from your user session and log back in to see this change.
##### 5. Initialize Your New Zsh Configuration <!-- omit in toc -->
Once you open up a new terminal window, it should load zsh with Oh My Zsh's configuration.
### Installation Problems
If you have any hiccups installing, here are a few common fixes.
- You _might_ need to modify your `PATH` in `~/.zshrc` if you're not able to find some commands after switching to `oh-my-zsh`.
- If you installed manually or changed the install location, check the `ZSH` environment variable in `~/.zshrc`.
### Custom Plugins And Themes
If you want to override any of the default behaviors, just add a new file (ending in `.zsh`) in the `custom/` directory.
If you have many functions that go well together, you can put them as a `XYZ.plugin.zsh` file in the `custom/plugins/` directory and then enable this plugin.
If you would like to override the functionality of a plugin distributed with Oh My Zsh, create a plugin of the same name in the `custom/plugins/` directory and it will be loaded instead of the one in `plugins/`.
### Enable GNU ls In macOS And freeBSD Systems
<a name="enable-gnu-ls"></a>
The default behaviour in Oh My Zsh is to use BSD `ls` in macOS and freeBSD systems. If GNU `ls` is installed
(as `gls` command), you can choose to use it instead. To do it, you can use zstyle-based config before
sourcing `oh-my-zsh.sh`:
```zsh
zstyle ':omz:lib:theme-and-appearance' gnu-ls yes
```
_Note: this is not compatible with `DISABLE_LS_COLORS=true`_
### Skip Aliases
<a name="remove-directories-aliases"></a>
If you want to skip default Oh My Zsh aliases (those defined in `lib/*` files) or plugin aliases,
you can use the settings below in your `~/.zshrc` file, **before Oh My Zsh is loaded**. Note that
there are many different ways to skip aliases, depending on your needs.
```sh
# Skip all aliases, in lib files and enabled plugins
zstyle ':omz:*' aliases no
# Skip all aliases in lib files
zstyle ':omz:lib:*' aliases no
# Skip only aliases defined in the directories.zsh lib file
zstyle ':omz:lib:directories' aliases no
# Skip all plugin aliases
zstyle ':omz:plugins:*' aliases no
# Skip only the aliases from the git plugin
zstyle ':omz:plugins:git' aliases no
```
You can combine these in other ways taking into account that more specific scopes takes precedence:
```sh
# Skip all plugin aliases, except for the git plugin
zstyle ':omz:plugins:*' aliases no
zstyle ':omz:plugins:git' aliases yes
```
A previous version of this feature was using the setting below, which has been removed:
```sh
zstyle ':omz:directories' aliases no
```
Instead, you can now use the following:
```sh
zstyle ':omz:lib:directories' aliases no
```
#### Notice <!-- omit in toc -->
> This feature is currently in a testing phase and it may be subject to change in the future.
> It is also not currently compatible with plugin managers such as zpm or zinit, which don't
> source the init script (`oh-my-zsh.sh`) where this feature is implemented in.
> It is also not currently aware of "aliases" that are defined as functions. Example of such
> are `gccd`, `ggf`, or `ggl` functions from the git plugin.
## Getting Updates
By default, you will be prompted to check for updates every 2 weeks. You can choose other update modes by adding a line to your `~/.zshrc` file, **before Oh My Zsh is loaded**:
1. Automatic update without confirmation prompt:
```sh
zstyle ':omz:update' mode auto
```
2. Just offer a reminder every few days, if there are updates available:
```sh
zstyle ':omz:update' mode reminder
```
3. To disable automatic updates entirely:
```sh
zstyle ':omz:update' mode disabled
```
NOTE: you can control how often Oh My Zsh checks for updates with the following setting:
```sh
# This will check for updates every 7 days
zstyle ':omz:update' frequency 7
# This will check for updates every time you open the terminal (not recommended)
zstyle ':omz:update' frequency 0
```
### Updates Verbosity
You can also limit the update verbosity with the following settings:
```sh
zstyle ':omz:update' verbose default # default update prompt
zstyle ':omz:update' verbose minimal # only few lines
zstyle ':omz:update' verbose silent # only errors
```
### Manual Updates
If you'd like to update at any point in time (maybe someone just released a new plugin and you don't want to wait a week?) you just need to run:
```sh
omz update
```
Magic! 🎉
## Uninstalling Oh My Zsh
Oh My Zsh isn't for everyone. We'll miss you, but we want to make this an easy breakup.
If you want to uninstall `oh-my-zsh`, just run `uninstall_oh_my_zsh` from the command-line. It will remove itself and revert your previous `bash` or `zsh` configuration.
## How Do I Contribute To Oh My Zsh?
Before you participate in our delightful community, please read the [code of conduct](CODE_OF_CONDUCT.md).
I'm far from being a [Zsh](https://www.zsh.org/) expert and suspect there are many ways to improve if you have ideas on how to make the configuration easier to maintain (and faster), don't hesitate to fork and send pull requests!
We also need people to test out pull requests. So take a look through [the open issues](https://github.com/ohmyzsh/ohmyzsh/issues) and help where you can.
See [Contributing](CONTRIBUTING.md) for more details.
### Do Not Send Us Themes
We have (more than) enough themes for the time being. Please add your theme to the [external themes](https://github.com/ohmyzsh/ohmyzsh/wiki/External-themes) wiki page.
## Contributors
Oh My Zsh has a vibrant community of happy users and delightful contributors. Without all the time and help from our contributors, it wouldn't be so awesome.
Thank you so much!
## Follow Us
We're on social media:
- [@ohmyzsh](https://twitter.com/ohmyzsh) on Twitter. You should follow it.
- [Facebook](https://www.facebook.com/Oh-My-Zsh-296616263819290/) poke us.
- [Instagram](https://www.instagram.com/_ohmyzsh/) tag us in your post showing Oh My Zsh!
- [Discord](https://discord.gg/ohmyzsh) to chat with us!
## Merchandise
We have [stickers, shirts, and coffee mugs available](https://shop.planetargon.com/collections/oh-my-zsh?utm_source=github) for you to show off your love of Oh My Zsh. Again, you will become the talk of the town!
## License
Oh My Zsh is released under the [MIT license](LICENSE.txt).
## About Planet Argon
![Planet Argon](https://pa-github-assets.s3.amazonaws.com/PARGON_logo_digital_COL-small.jpg)
Oh My Zsh was started by the team at [Planet Argon](https://www.planetargon.com/?utm_source=github), a [Ruby on Rails development agency](http://www.planetargon.com/services/ruby-on-rails-development?utm_source=github). Check out our [other open source projects](https://www.planetargon.com/open-source?utm_source=github).

23
dot_oh-my-zsh/SECURITY.md Normal file
View File

@ -0,0 +1,23 @@
# Security Policy
## Supported Versions
At the moment Oh My Zsh only considers the very latest commit to be supported.
We combine that with our fast response to incidents and the automated updates
to minimize the time between vulnerability publication and patch release.
| Version | Supported |
|:-------------- |:------------------ |
| master | :white_check_mark: |
| other commits | :x: |
In the near future we will introduce versioning, so expect this section to change.
## Reporting a Vulnerability
**Do not submit an issue or pull request**: this might reveal the vulnerability.
Instead, you should email the maintainers directly at: [**security@ohmyz.sh**](mailto:security@ohmyz.sh),
or using the link to [privately report a vulnerability with GitHub](https://github.com/ohmyzsh/ohmyzsh/security/advisories/new).
We will deal with the vulnerability privately and submit a patch as soon as possible.

0
dot_oh-my-zsh/cache/completions/.keep vendored Normal file
View File

1
dot_oh-my-zsh/cache/dot_zsh-update vendored Normal file
View File

@ -0,0 +1 @@
LAST_EPOCH=19783

0
dot_oh-my-zsh/cache/empty_dot_gitkeep vendored Normal file
View File

3
dot_oh-my-zsh/cache/grep-alias vendored Normal file
View File

@ -0,0 +1,3 @@
alias grep='grep --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}'
alias egrep='grep -E --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}'
alias fgrep='grep -F --color=auto --exclude-dir={.bzr,CVS,.git,.hg,.svn,.idea,.tox}'

View File

@ -0,0 +1,12 @@
# Put files in this folder to add your own custom functionality.
# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization
#
# Files in the custom/ directory will be:
# - loaded automatically by the init script, in alphabetical order
# - loaded last, after all built-ins in the lib/ directory, to override them
# - ignored by git by default
#
# Example: add custom/shortcuts.zsh for shortcuts to your local projects
#
# brainstormr=~/Projects/development/planetargon/brainstormr
# cd $brainstormr

View File

@ -0,0 +1,3 @@
# Add your own custom plugins in the custom/plugins directory. Plugins placed
# here will override ones with the same name in the main plugins directory.
# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-plugins

View File

@ -0,0 +1,6 @@
# Put your custom themes in this folder.
# See: https://github.com/ohmyzsh/ohmyzsh/wiki/Customization#overriding-and-adding-themes
#
# Example:
PROMPT="%{$fg[red]%}%n%{$reset_color%}@%{$fg[blue]%}%m %{$fg[yellow]%}%~ %{$reset_color%}%% "

View File

@ -0,0 +1,8 @@
root = true
[*]
end_of_line = lf
insert_final_newline = true
charset = utf-8
indent_size = 2
indent_style = space

View File

@ -0,0 +1 @@
9730915910c6cc7640f8af6063ffb93becf0414a branch 'master' of https://github.com/ohmyzsh/ohmyzsh

View File

@ -0,0 +1 @@
ref: refs/heads/master

View File

@ -0,0 +1 @@
872b5cd4086a5547dbf788dda4e96ab3868cf59b

View File

View File

@ -0,0 +1,23 @@
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
eol = lf
autocrlf = false
[fsck]
zeroPaddedFilemode = ignore
[fetch "fsck"]
zeroPaddedFilemode = ignore
[receive "fsck"]
zeroPaddedFilemode = ignore
[oh-my-zsh]
remote = origin
branch = master
lastVersion = 872b5cd4086a5547dbf788dda4e96ab3868cf59b
[remote "origin"]
url = https://github.com/ohmyzsh/ohmyzsh.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master

View File

@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.

View File

@ -0,0 +1,15 @@
#!/bin/sh
#
# An example hook script to check the commit log message taken by
# applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit. The hook is
# allowed to edit the commit message file.
#
# To enable this hook, rename this file to "applypatch-msg".
. git-sh-setup
commitmsg="$(git rev-parse --git-path hooks/commit-msg)"
test -x "$commitmsg" && exec "$commitmsg" ${1+"$@"}
:

View File

@ -0,0 +1,24 @@
#!/bin/sh
#
# An example hook script to check the commit log message.
# Called by "git commit" with one argument, the name of the file
# that has the commit message. The hook should exit with non-zero
# status after issuing an appropriate message if it wants to stop the
# commit. The hook is allowed to edit the commit message file.
#
# To enable this hook, rename this file to "commit-msg".
# Uncomment the below to add a Signed-off-by line to the message.
# Doing this in a hook is a bad idea in general, but the prepare-commit-msg
# hook is more suited to it.
#
# SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1"
# This example catches duplicate Signed-off-by lines.
test "" = "$(grep '^Signed-off-by: ' "$1" |
sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || {
echo >&2 Duplicate Signed-off-by lines.
exit 1
}

View File

@ -0,0 +1,174 @@
#!/usr/bin/perl
use strict;
use warnings;
use IPC::Open2;
# An example hook script to integrate Watchman
# (https://facebook.github.io/watchman/) with git to speed up detecting
# new and modified files.
#
# The hook is passed a version (currently 2) and last update token
# formatted as a string and outputs to stdout a new update token and
# all files that have been modified since the update token. Paths must
# be relative to the root of the working tree and separated by a single NUL.
#
# To enable this hook, rename this file to "query-watchman" and set
# 'git config core.fsmonitor .git/hooks/query-watchman'
#
my ($version, $last_update_token) = @ARGV;
# Uncomment for debugging
# print STDERR "$0 $version $last_update_token\n";
# Check the hook interface version
if ($version ne 2) {
die "Unsupported query-fsmonitor hook version '$version'.\n" .
"Falling back to scanning...\n";
}
my $git_work_tree = get_working_dir();
my $retry = 1;
my $json_pkg;
eval {
require JSON::XS;
$json_pkg = "JSON::XS";
1;
} or do {
require JSON::PP;
$json_pkg = "JSON::PP";
};
launch_watchman();
sub launch_watchman {
my $o = watchman_query();
if (is_work_tree_watched($o)) {
output_result($o->{clock}, @{$o->{files}});
}
}
sub output_result {
my ($clockid, @files) = @_;
# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# binmode $fh, ":utf8";
# print $fh "$clockid\n@files\n";
# close $fh;
binmode STDOUT, ":utf8";
print $clockid;
print "\0";
local $, = "\0";
print @files;
}
sub watchman_clock {
my $response = qx/watchman clock "$git_work_tree"/;
die "Failed to get clock id on '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;
return $json_pkg->new->utf8->decode($response);
}
sub watchman_query {
my $pid = open2(\*CHLD_OUT, \*CHLD_IN, 'watchman -j --no-pretty')
or die "open2() failed: $!\n" .
"Falling back to scanning...\n";
# In the query expression below we're asking for names of files that
# changed since $last_update_token but not from the .git folder.
#
# To accomplish this, we're using the "since" generator to use the
# recency index to select candidate nodes and "fields" to limit the
# output to file names only. Then we're using the "expression" term to
# further constrain the results.
my $last_update_line = "";
if (substr($last_update_token, 0, 1) eq "c") {
$last_update_token = "\"$last_update_token\"";
$last_update_line = qq[\n"since": $last_update_token,];
}
my $query = <<" END";
["query", "$git_work_tree", {$last_update_line
"fields": ["name"],
"expression": ["not", ["dirname", ".git"]]
}]
END
# Uncomment for debugging the watchman query
# open (my $fh, ">", ".git/watchman-query.json");
# print $fh $query;
# close $fh;
print CHLD_IN $query;
close CHLD_IN;
my $response = do {local $/; <CHLD_OUT>};
# Uncomment for debugging the watch response
# open ($fh, ">", ".git/watchman-response.json");
# print $fh $response;
# close $fh;
die "Watchman: command returned no output.\n" .
"Falling back to scanning...\n" if $response eq "";
die "Watchman: command returned invalid output: $response\n" .
"Falling back to scanning...\n" unless $response =~ /^\{/;
return $json_pkg->new->utf8->decode($response);
}
sub is_work_tree_watched {
my ($output) = @_;
my $error = $output->{error};
if ($retry > 0 and $error and $error =~ m/unable to resolve root .* directory (.*) is not watched/) {
$retry--;
my $response = qx/watchman watch "$git_work_tree"/;
die "Failed to make watchman watch '$git_work_tree'.\n" .
"Falling back to scanning...\n" if $? != 0;
$output = $json_pkg->new->utf8->decode($response);
$error = $output->{error};
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
# Uncomment for debugging watchman output
# open (my $fh, ">", ".git/watchman-output.out");
# close $fh;
# Watchman will always return all files on the first query so
# return the fast "everything is dirty" flag to git and do the
# Watchman query just to get it over with now so we won't pay
# the cost in git to look up each individual file.
my $o = watchman_clock();
$error = $output->{error};
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
output_result($o->{clock}, ("/"));
$last_update_token = $o->{clock};
eval { launch_watchman() };
return 0;
}
die "Watchman: $error.\n" .
"Falling back to scanning...\n" if $error;
return 1;
}
sub get_working_dir {
my $working_dir;
if ($^O =~ 'msys' || $^O =~ 'cygwin') {
$working_dir = Win32::GetCwd();
$working_dir =~ tr/\\/\//;
} else {
require Cwd;
$working_dir = Cwd::cwd();
}
return $working_dir;
}

View File

@ -0,0 +1,8 @@
#!/bin/sh
#
# An example hook script to prepare a packed repository for use over
# dumb transports.
#
# To enable this hook, rename this file to "post-update".
exec git update-server-info

View File

@ -0,0 +1,14 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed
# by applypatch from an e-mail message.
#
# The hook should exit with non-zero status after issuing an
# appropriate message if it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-applypatch".
. git-sh-setup
precommit="$(git rev-parse --git-path hooks/pre-commit)"
test -x "$precommit" && exec "$precommit" ${1+"$@"}
:

View File

@ -0,0 +1,49 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git commit" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message if
# it wants to stop the commit.
#
# To enable this hook, rename this file to "pre-commit".
if git rev-parse --verify HEAD >/dev/null 2>&1
then
against=HEAD
else
# Initial commit: diff against an empty tree object
against=$(git hash-object -t tree /dev/null)
fi
# If you want to allow non-ASCII filenames set this variable to true.
allownonascii=$(git config --type=bool hooks.allownonascii)
# Redirect output to stderr.
exec 1>&2
# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
# Note that the use of brackets around a tr range is ok here, (it's
# even required, for portability to Solaris 10's /usr/bin/tr), since
# the square bracket bytes happen to fall in the designated range.
test $(git diff --cached --name-only --diff-filter=A -z $against |
LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0
then
cat <<\EOF
Error: Attempt to add a non-ASCII file name.
This can cause problems if you want to work with people on other platforms.
To be portable it is advisable to rename the file.
If you know what you are doing you can disable this check using:
git config hooks.allownonascii true
EOF
exit 1
fi
# If there are whitespace errors, print the offending file names and fail.
exec git diff-index --check --cached $against --

View File

@ -0,0 +1,13 @@
#!/bin/sh
#
# An example hook script to verify what is about to be committed.
# Called by "git merge" with no arguments. The hook should
# exit with non-zero status after issuing an appropriate message to
# stderr if it wants to stop the merge commit.
#
# To enable this hook, rename this file to "pre-merge-commit".
. git-sh-setup
test -x "$GIT_DIR/hooks/pre-commit" &&
exec "$GIT_DIR/hooks/pre-commit"
:

View File

@ -0,0 +1,53 @@
#!/bin/sh
# An example hook script to verify what is about to be pushed. Called by "git
# push" after it has checked the remote status, but before anything has been
# pushed. If this script exits with a non-zero status nothing will be pushed.
#
# This hook is called with the following parameters:
#
# $1 -- Name of the remote to which the push is being done
# $2 -- URL to which the push is being done
#
# If pushing without using a named remote those arguments will be equal.
#
# Information about the commits which are being pushed is supplied as lines to
# the standard input in the form:
#
# <local ref> <local oid> <remote ref> <remote oid>
#
# This sample shows how to prevent push of commits where the log message starts
# with "WIP" (work in progress).
remote="$1"
url="$2"
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
while read local_ref local_oid remote_ref remote_oid
do
if test "$local_oid" = "$zero"
then
# Handle delete
:
else
if test "$remote_oid" = "$zero"
then
# New branch, examine all commits
range="$local_oid"
else
# Update to existing branch, examine new commits
range="$remote_oid..$local_oid"
fi
# Check for WIP commit
commit=$(git rev-list -n 1 --grep '^WIP' "$range")
if test -n "$commit"
then
echo >&2 "Found WIP commit in $local_ref, not pushing"
exit 1
fi
fi
done
exit 0

View File

@ -0,0 +1,169 @@
#!/bin/sh
#
# Copyright (c) 2006, 2008 Junio C Hamano
#
# The "pre-rebase" hook is run just before "git rebase" starts doing
# its job, and can prevent the command from running by exiting with
# non-zero status.
#
# The hook is called with the following parameters:
#
# $1 -- the upstream the series was forked from.
# $2 -- the branch being rebased (or empty when rebasing the current branch).
#
# This sample shows how to prevent topic branches that are already
# merged to 'next' branch from getting rebased, because allowing it
# would result in rebasing already published history.
publish=next
basebranch="$1"
if test "$#" = 2
then
topic="refs/heads/$2"
else
topic=`git symbolic-ref HEAD` ||
exit 0 ;# we do not interrupt rebasing detached HEAD
fi
case "$topic" in
refs/heads/??/*)
;;
*)
exit 0 ;# we do not interrupt others.
;;
esac
# Now we are dealing with a topic branch being rebased
# on top of master. Is it OK to rebase it?
# Does the topic really exist?
git show-ref -q "$topic" || {
echo >&2 "No such branch $topic"
exit 1
}
# Is topic fully merged to master?
not_in_master=`git rev-list --pretty=oneline ^master "$topic"`
if test -z "$not_in_master"
then
echo >&2 "$topic is fully merged to master; better remove it."
exit 1 ;# we could allow it, but there is no point.
fi
# Is topic ever merged to next? If so you should not be rebasing it.
only_next_1=`git rev-list ^master "^$topic" ${publish} | sort`
only_next_2=`git rev-list ^master ${publish} | sort`
if test "$only_next_1" = "$only_next_2"
then
not_in_topic=`git rev-list "^$topic" master`
if test -z "$not_in_topic"
then
echo >&2 "$topic is already up to date with master"
exit 1 ;# we could allow it, but there is no point.
else
exit 0
fi
else
not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"`
/usr/bin/perl -e '
my $topic = $ARGV[0];
my $msg = "* $topic has commits already merged to public branch:\n";
my (%not_in_next) = map {
/^([0-9a-f]+) /;
($1 => 1);
} split(/\n/, $ARGV[1]);
for my $elem (map {
/^([0-9a-f]+) (.*)$/;
[$1 => $2];
} split(/\n/, $ARGV[2])) {
if (!exists $not_in_next{$elem->[0]}) {
if ($msg) {
print STDERR $msg;
undef $msg;
}
print STDERR " $elem->[1]\n";
}
}
' "$topic" "$not_in_next" "$not_in_master"
exit 1
fi
<<\DOC_END
This sample hook safeguards topic branches that have been
published from being rewound.
The workflow assumed here is:
* Once a topic branch forks from "master", "master" is never
merged into it again (either directly or indirectly).
* Once a topic branch is fully cooked and merged into "master",
it is deleted. If you need to build on top of it to correct
earlier mistakes, a new topic branch is created by forking at
the tip of the "master". This is not strictly necessary, but
it makes it easier to keep your history simple.
* Whenever you need to test or publish your changes to topic
branches, merge them into "next" branch.
The script, being an example, hardcodes the publish branch name
to be "next", but it is trivial to make it configurable via
$GIT_DIR/config mechanism.
With this workflow, you would want to know:
(1) ... if a topic branch has ever been merged to "next". Young
topic branches can have stupid mistakes you would rather
clean up before publishing, and things that have not been
merged into other branches can be easily rebased without
affecting other people. But once it is published, you would
not want to rewind it.
(2) ... if a topic branch has been fully merged to "master".
Then you can delete it. More importantly, you should not
build on top of it -- other people may already want to
change things related to the topic as patches against your
"master", so if you need further changes, it is better to
fork the topic (perhaps with the same name) afresh from the
tip of "master".
Let's look at this example:
o---o---o---o---o---o---o---o---o---o "next"
/ / / /
/ a---a---b A / /
/ / / /
/ / c---c---c---c B /
/ / / \ /
/ / / b---b C \ /
/ / / / \ /
---o---o---o---o---o---o---o---o---o---o---o "master"
A, B and C are topic branches.
* A has one fix since it was merged up to "next".
* B has finished. It has been fully merged up to "master" and "next",
and is ready to be deleted.
* C has not merged to "next" at all.
We would want to allow C to be rebased, refuse A, and encourage
B to be deleted.
To compute (1):
git rev-list ^master ^topic next
git rev-list ^master next
if these match, topic has not merged in next at all.
To compute (2):
git rev-list master..topic
if this is empty, it is fully merged to "master".
DOC_END

View File

@ -0,0 +1,24 @@
#!/bin/sh
#
# An example hook script to make use of push options.
# The example simply echoes all push options that start with 'echoback='
# and rejects all pushes when the "reject" push option is used.
#
# To enable this hook, rename this file to "pre-receive".
if test -n "$GIT_PUSH_OPTION_COUNT"
then
i=0
while test "$i" -lt "$GIT_PUSH_OPTION_COUNT"
do
eval "value=\$GIT_PUSH_OPTION_$i"
case "$value" in
echoback=*)
echo "echo from the pre-receive-hook: ${value#*=}" >&2
;;
reject)
exit 1
esac
i=$((i + 1))
done
fi

View File

@ -0,0 +1,42 @@
#!/bin/sh
#
# An example hook script to prepare the commit log message.
# Called by "git commit" with the name of the file that has the
# commit message, followed by the description of the commit
# message's source. The hook's purpose is to edit the commit
# message file. If the hook fails with a non-zero status,
# the commit is aborted.
#
# To enable this hook, rename this file to "prepare-commit-msg".
# This hook includes three examples. The first one removes the
# "# Please enter the commit message..." help message.
#
# The second includes the output of "git diff --name-status -r"
# into the message, just before the "git status" output. It is
# commented because it doesn't cope with --amend or with squashed
# commits.
#
# The third example adds a Signed-off-by line to the message, that can
# still be edited. This is rarely a good idea.
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
SHA1=$3
/usr/bin/perl -i.bak -ne 'print unless(m/^. Please enter the commit message/..m/^#$/)' "$COMMIT_MSG_FILE"
# case "$COMMIT_SOURCE,$SHA1" in
# ,|template,)
# /usr/bin/perl -i.bak -pe '
# print "\n" . `git diff --cached --name-status -r`
# if /^#/ && $first++ == 0' "$COMMIT_MSG_FILE" ;;
# *) ;;
# esac
# SOB=$(git var GIT_COMMITTER_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p')
# git interpret-trailers --in-place --trailer "$SOB" "$COMMIT_MSG_FILE"
# if test -z "$COMMIT_SOURCE"
# then
# /usr/bin/perl -i.bak -pe 'print "\n" if !$first_line++' "$COMMIT_MSG_FILE"
# fi

View File

@ -0,0 +1,78 @@
#!/bin/sh
# An example hook script to update a checked-out tree on a git push.
#
# This hook is invoked by git-receive-pack(1) when it reacts to git
# push and updates reference(s) in its repository, and when the push
# tries to update the branch that is currently checked out and the
# receive.denyCurrentBranch configuration variable is set to
# updateInstead.
#
# By default, such a push is refused if the working tree and the index
# of the remote repository has any difference from the currently
# checked out commit; when both the working tree and the index match
# the current commit, they are updated to match the newly pushed tip
# of the branch. This hook is to be used to override the default
# behaviour; however the code below reimplements the default behaviour
# as a starting point for convenient modification.
#
# The hook receives the commit with which the tip of the current
# branch is going to be updated:
commit=$1
# It can exit with a non-zero status to refuse the push (when it does
# so, it must not modify the index or the working tree).
die () {
echo >&2 "$*"
exit 1
}
# Or it can make any necessary changes to the working tree and to the
# index to bring them to the desired state when the tip of the current
# branch is updated to the new commit, and exit with a zero status.
#
# For example, the hook can simply run git read-tree -u -m HEAD "$1"
# in order to emulate git fetch that is run in the reverse direction
# with git push, as the two-tree form of git read-tree -u -m is
# essentially the same as git switch or git checkout that switches
# branches while keeping the local changes in the working tree that do
# not interfere with the difference between the branches.
# The below is a more-or-less exact translation to shell of the C code
# for the default behaviour for git's push-to-checkout hook defined in
# the push_to_deploy() function in builtin/receive-pack.c.
#
# Note that the hook will be executed from the repository directory,
# not from the working tree, so if you want to perform operations on
# the working tree, you will have to adapt your code accordingly, e.g.
# by adding "cd .." or using relative paths.
if ! git update-index -q --ignore-submodules --refresh
then
die "Up-to-date check failed"
fi
if ! git diff-files --quiet --ignore-submodules --
then
die "Working directory has unstaged changes"
fi
# This is a rough translation of:
#
# head_has_history() ? "HEAD" : EMPTY_TREE_SHA1_HEX
if git cat-file -e HEAD 2>/dev/null
then
head=HEAD
else
head=$(git hash-object -t tree --stdin </dev/null)
fi
if ! git diff-index --quiet --cached --ignore-submodules $head --
then
die "Working directory has staged changes"
fi
if ! git read-tree -u -m "$commit"
then
die "Could not update working tree to new HEAD"
fi

View File

@ -0,0 +1,128 @@
#!/bin/sh
#
# An example hook script to block unannotated tags from entering.
# Called by "git receive-pack" with arguments: refname sha1-old sha1-new
#
# To enable this hook, rename this file to "update".
#
# Config
# ------
# hooks.allowunannotated
# This boolean sets whether unannotated tags will be allowed into the
# repository. By default they won't be.
# hooks.allowdeletetag
# This boolean sets whether deleting tags will be allowed in the
# repository. By default they won't be.
# hooks.allowmodifytag
# This boolean sets whether a tag may be modified after creation. By default
# it won't be.
# hooks.allowdeletebranch
# This boolean sets whether deleting branches will be allowed in the
# repository. By default they won't be.
# hooks.denycreatebranch
# This boolean sets whether remotely creating branches will be denied
# in the repository. By default this is allowed.
#
# --- Command line
refname="$1"
oldrev="$2"
newrev="$3"
# --- Safety check
if [ -z "$GIT_DIR" ]; then
echo "Don't run this script from the command line." >&2
echo " (if you want, you could supply GIT_DIR then run" >&2
echo " $0 <ref> <oldrev> <newrev>)" >&2
exit 1
fi
if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then
echo "usage: $0 <ref> <oldrev> <newrev>" >&2
exit 1
fi
# --- Config
allowunannotated=$(git config --type=bool hooks.allowunannotated)
allowdeletebranch=$(git config --type=bool hooks.allowdeletebranch)
denycreatebranch=$(git config --type=bool hooks.denycreatebranch)
allowdeletetag=$(git config --type=bool hooks.allowdeletetag)
allowmodifytag=$(git config --type=bool hooks.allowmodifytag)
# check for no description
projectdesc=$(sed -e '1q' "$GIT_DIR/description")
case "$projectdesc" in
"Unnamed repository"* | "")
echo "*** Project description file hasn't been set" >&2
exit 1
;;
esac
# --- Check types
# if $newrev is 0000...0000, it's a commit to delete a ref.
zero=$(git hash-object --stdin </dev/null | tr '[0-9a-f]' '0')
if [ "$newrev" = "$zero" ]; then
newrev_type=delete
else
newrev_type=$(git cat-file -t $newrev)
fi
case "$refname","$newrev_type" in
refs/tags/*,commit)
# un-annotated tag
short_refname=${refname##refs/tags/}
if [ "$allowunannotated" != "true" ]; then
echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
exit 1
fi
;;
refs/tags/*,delete)
# delete tag
if [ "$allowdeletetag" != "true" ]; then
echo "*** Deleting a tag is not allowed in this repository" >&2
exit 1
fi
;;
refs/tags/*,tag)
# annotated tag
if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
then
echo "*** Tag '$refname' already exists." >&2
echo "*** Modifying a tag is not allowed in this repository." >&2
exit 1
fi
;;
refs/heads/*,commit)
# branch
if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
echo "*** Creating a branch is not allowed in this repository" >&2
exit 1
fi
;;
refs/heads/*,delete)
# delete branch
if [ "$allowdeletebranch" != "true" ]; then
echo "*** Deleting a branch is not allowed in this repository" >&2
exit 1
fi
;;
refs/remotes/*,commit)
# tracking branch
;;
refs/remotes/*,delete)
# delete tracking branch
if [ "$allowdeletebranch" != "true" ]; then
echo "*** Deleting a tracking branch is not allowed in this repository" >&2
exit 1
fi
;;
*)
# Anything else (is there anything else?)
echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
exit 1
;;
esac
# --- Finished
exit 0

BIN
dot_oh-my-zsh/dot_git/index Normal file

Binary file not shown.

View File

@ -0,0 +1,6 @@
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~

View File

@ -0,0 +1,52 @@
0000000000000000000000000000000000000000 5d3e86e2a48adf7a308773f8f1b725d187c7c5ef Philipp <philipp@boehm.sh> 1682402090 +0200 checkout: moving from main to master
5d3e86e2a48adf7a308773f8f1b725d187c7c5ef 5d3e86e2a48adf7a308773f8f1b725d187c7c5ef Philipp <philipp@boehm.sh> 1683537790 +0200 checkout: moving from master to master
5d3e86e2a48adf7a308773f8f1b725d187c7c5ef 017e288560ef7bdfb8835516d6b3b77bbdcdde6c Philipp <philipp@boehm.sh> 1683537791 +0200 pull --quiet --rebase origin master: Fast-forward
017e288560ef7bdfb8835516d6b3b77bbdcdde6c 017e288560ef7bdfb8835516d6b3b77bbdcdde6c Philipp <philipp@boehm.sh> 1683537791 +0200 checkout: moving from master to master
017e288560ef7bdfb8835516d6b3b77bbdcdde6c 017e288560ef7bdfb8835516d6b3b77bbdcdde6c Philipp <philipp@boehm.sh> 1684686515 +0200 checkout: moving from master to master
017e288560ef7bdfb8835516d6b3b77bbdcdde6c bfeeda1491b5366aa5798a86cf6f3621536b171c Philipp <philipp@boehm.sh> 1684686515 +0200 pull --quiet --rebase origin master: Fast-forward
bfeeda1491b5366aa5798a86cf6f3621536b171c bfeeda1491b5366aa5798a86cf6f3621536b171c Philipp <philipp@boehm.sh> 1684686515 +0200 checkout: moving from master to master
bfeeda1491b5366aa5798a86cf6f3621536b171c bfeeda1491b5366aa5798a86cf6f3621536b171c Philipp <philipp@boehm.sh> 1685969105 +0200 checkout: moving from master to master
bfeeda1491b5366aa5798a86cf6f3621536b171c 115cee17015e4b5665e16dc4fd15c53e06a22f9a Philipp <philipp@boehm.sh> 1685969106 +0200 pull --quiet --rebase origin master: Fast-forward
115cee17015e4b5665e16dc4fd15c53e06a22f9a 115cee17015e4b5665e16dc4fd15c53e06a22f9a Philipp <philipp@boehm.sh> 1685969106 +0200 checkout: moving from master to master
115cee17015e4b5665e16dc4fd15c53e06a22f9a 115cee17015e4b5665e16dc4fd15c53e06a22f9a Philipp <philipp@boehm.sh> 1687084181 +0200 checkout: moving from master to master
115cee17015e4b5665e16dc4fd15c53e06a22f9a f5cb9a6c978693c9570206f4267ba2589bef1b4c Philipp <philipp@boehm.sh> 1687084181 +0200 pull --quiet --rebase origin master: Fast-forward
f5cb9a6c978693c9570206f4267ba2589bef1b4c f5cb9a6c978693c9570206f4267ba2589bef1b4c Philipp <philipp@boehm.sh> 1687084181 +0200 checkout: moving from master to master
f5cb9a6c978693c9570206f4267ba2589bef1b4c f5cb9a6c978693c9570206f4267ba2589bef1b4c Philipp <philipp@boehm.sh> 1688415260 +0200 checkout: moving from master to master
f5cb9a6c978693c9570206f4267ba2589bef1b4c fe4b5659863c388786986d70fa6d1bb66b00afb6 Philipp <philipp@boehm.sh> 1688415261 +0200 pull --quiet --rebase origin master: Fast-forward
fe4b5659863c388786986d70fa6d1bb66b00afb6 fe4b5659863c388786986d70fa6d1bb66b00afb6 Philipp <philipp@boehm.sh> 1688415261 +0200 checkout: moving from master to master
fe4b5659863c388786986d70fa6d1bb66b00afb6 fe4b5659863c388786986d70fa6d1bb66b00afb6 Philipp <philipp@boehm.sh> 1689508660 +0200 checkout: moving from master to master
fe4b5659863c388786986d70fa6d1bb66b00afb6 8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd Philipp <philipp@boehm.sh> 1689508661 +0200 pull --quiet --rebase origin master: Fast-forward
8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd 8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd Philipp <philipp@boehm.sh> 1689508661 +0200 checkout: moving from master to master
8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd 8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd Philipp <philipp@boehm.sh> 1691764455 +0200 checkout: moving from master to master
8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd fd219a94ab585fa699a0e842335a9f33dcbb613b Philipp <philipp@boehm.sh> 1691764455 +0200 pull --quiet --rebase origin master: Fast-forward
fd219a94ab585fa699a0e842335a9f33dcbb613b fd219a94ab585fa699a0e842335a9f33dcbb613b Philipp <philipp@boehm.sh> 1691764456 +0200 checkout: moving from master to master
fd219a94ab585fa699a0e842335a9f33dcbb613b fd219a94ab585fa699a0e842335a9f33dcbb613b Philipp <philipp@boehm.sh> 1692888590 +0200 checkout: moving from master to master
fd219a94ab585fa699a0e842335a9f33dcbb613b c92af18c36c84cef0c785e1ae9cabc49a61a5c3a Philipp <philipp@boehm.sh> 1692888591 +0200 pull --quiet --rebase origin master: Fast-forward
c92af18c36c84cef0c785e1ae9cabc49a61a5c3a c92af18c36c84cef0c785e1ae9cabc49a61a5c3a Philipp <philipp@boehm.sh> 1692888591 +0200 checkout: moving from master to master
c92af18c36c84cef0c785e1ae9cabc49a61a5c3a c92af18c36c84cef0c785e1ae9cabc49a61a5c3a Philipp <philipp@boehm.sh> 1693988516 +0200 checkout: moving from master to master
c92af18c36c84cef0c785e1ae9cabc49a61a5c3a bae577d6b2eb621fedc994d6309b6f819855c2f8 Philipp <philipp@boehm.sh> 1693988519 +0200 pull --quiet --rebase origin master: Fast-forward
bae577d6b2eb621fedc994d6309b6f819855c2f8 bae577d6b2eb621fedc994d6309b6f819855c2f8 Philipp <philipp@boehm.sh> 1693988519 +0200 checkout: moving from master to master
bae577d6b2eb621fedc994d6309b6f819855c2f8 bae577d6b2eb621fedc994d6309b6f819855c2f8 Philipp <philipp@boehm.sh> 1696762698 +0200 checkout: moving from master to master
bae577d6b2eb621fedc994d6309b6f819855c2f8 f36c6db0eac17b022eee87411e6996a5f5fc8457 Philipp <philipp@boehm.sh> 1696762699 +0200 pull --quiet --rebase origin master: Fast-forward
f36c6db0eac17b022eee87411e6996a5f5fc8457 f36c6db0eac17b022eee87411e6996a5f5fc8457 Philipp <philipp@boehm.sh> 1696762699 +0200 checkout: moving from master to master
f36c6db0eac17b022eee87411e6996a5f5fc8457 f36c6db0eac17b022eee87411e6996a5f5fc8457 Philipp <philipp@boehm.sh> 1698486251 +0200 checkout: moving from master to master
f36c6db0eac17b022eee87411e6996a5f5fc8457 cb86d378f287f1731cc6ad907f6248e35b52dc25 Philipp <philipp@boehm.sh> 1698486252 +0200 pull --quiet --rebase origin master: Fast-forward
cb86d378f287f1731cc6ad907f6248e35b52dc25 cb86d378f287f1731cc6ad907f6248e35b52dc25 Philipp <philipp@boehm.sh> 1698486252 +0200 checkout: moving from master to master
cb86d378f287f1731cc6ad907f6248e35b52dc25 cb86d378f287f1731cc6ad907f6248e35b52dc25 Philipp <philipp@boehm.sh> 1699741555 +0100 checkout: moving from master to master
cb86d378f287f1731cc6ad907f6248e35b52dc25 b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 Philipp <philipp@boehm.sh> 1699741556 +0100 pull --quiet --rebase origin master: Fast-forward
b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 Philipp <philipp@boehm.sh> 1699741556 +0100 checkout: moving from master to master
b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 Philipp <philipp@boehm.sh> 1702044508 +0100 checkout: moving from master to master
b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d Philipp <philipp@boehm.sh> 1702044508 +0100 pull --quiet --rebase origin master: Fast-forward
48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d 48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d Philipp <philipp@boehm.sh> 1702044508 +0100 checkout: moving from master to master
48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d 48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d Philipp <philipp@boehm.sh> 1705357637 +0100 checkout: moving from master to master
48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d 8be4789bbbef06fe5eed581dc8c58df51e3cd9fd Philipp <philipp@boehm.sh> 1705357637 +0100 pull --quiet --rebase origin master: Fast-forward
8be4789bbbef06fe5eed581dc8c58df51e3cd9fd 8be4789bbbef06fe5eed581dc8c58df51e3cd9fd Philipp <philipp@boehm.sh> 1705357638 +0100 checkout: moving from master to master
8be4789bbbef06fe5eed581dc8c58df51e3cd9fd 8be4789bbbef06fe5eed581dc8c58df51e3cd9fd Philipp <philipp@boehm.sh> 1706568347 +0100 checkout: moving from master to master
8be4789bbbef06fe5eed581dc8c58df51e3cd9fd 80c114cb3a64044ea50b623f96a35bc022db5e8d Philipp <philipp@boehm.sh> 1706568347 +0100 pull --quiet --rebase origin master: Fast-forward
80c114cb3a64044ea50b623f96a35bc022db5e8d 80c114cb3a64044ea50b623f96a35bc022db5e8d Philipp <philipp@boehm.sh> 1706568347 +0100 checkout: moving from master to master
80c114cb3a64044ea50b623f96a35bc022db5e8d 80c114cb3a64044ea50b623f96a35bc022db5e8d Philipp <philipp@boehm.sh> 1708188627 +0100 checkout: moving from master to master
80c114cb3a64044ea50b623f96a35bc022db5e8d 872b5cd4086a5547dbf788dda4e96ab3868cf59b Philipp <philipp@boehm.sh> 1708188628 +0100 pull --quiet --rebase origin master: Fast-forward
872b5cd4086a5547dbf788dda4e96ab3868cf59b 872b5cd4086a5547dbf788dda4e96ab3868cf59b Philipp <philipp@boehm.sh> 1708188628 +0100 checkout: moving from master to master
872b5cd4086a5547dbf788dda4e96ab3868cf59b 872b5cd4086a5547dbf788dda4e96ab3868cf59b Philipp <philipp@boehm.sh> 1709283654 +0100 checkout: moving from master to master
872b5cd4086a5547dbf788dda4e96ab3868cf59b 9730915910c6cc7640f8af6063ffb93becf0414a Philipp <philipp@boehm.sh> 1709283655 +0100 pull --quiet --rebase origin master: Fast-forward
9730915910c6cc7640f8af6063ffb93becf0414a 9730915910c6cc7640f8af6063ffb93becf0414a Philipp <philipp@boehm.sh> 1709283655 +0100 checkout: moving from master to master

View File

@ -0,0 +1,18 @@
0000000000000000000000000000000000000000 5d3e86e2a48adf7a308773f8f1b725d187c7c5ef Philipp <philipp@boehm.sh> 1682402090 +0200 branch: Created from origin/master
5d3e86e2a48adf7a308773f8f1b725d187c7c5ef 017e288560ef7bdfb8835516d6b3b77bbdcdde6c Philipp <philipp@boehm.sh> 1683537791 +0200 pull --quiet --rebase origin master: Fast-forward
017e288560ef7bdfb8835516d6b3b77bbdcdde6c bfeeda1491b5366aa5798a86cf6f3621536b171c Philipp <philipp@boehm.sh> 1684686515 +0200 pull --quiet --rebase origin master: Fast-forward
bfeeda1491b5366aa5798a86cf6f3621536b171c 115cee17015e4b5665e16dc4fd15c53e06a22f9a Philipp <philipp@boehm.sh> 1685969106 +0200 pull --quiet --rebase origin master: Fast-forward
115cee17015e4b5665e16dc4fd15c53e06a22f9a f5cb9a6c978693c9570206f4267ba2589bef1b4c Philipp <philipp@boehm.sh> 1687084181 +0200 pull --quiet --rebase origin master: Fast-forward
f5cb9a6c978693c9570206f4267ba2589bef1b4c fe4b5659863c388786986d70fa6d1bb66b00afb6 Philipp <philipp@boehm.sh> 1688415261 +0200 pull --quiet --rebase origin master: Fast-forward
fe4b5659863c388786986d70fa6d1bb66b00afb6 8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd Philipp <philipp@boehm.sh> 1689508661 +0200 pull --quiet --rebase origin master: Fast-forward
8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd fd219a94ab585fa699a0e842335a9f33dcbb613b Philipp <philipp@boehm.sh> 1691764455 +0200 pull --quiet --rebase origin master: Fast-forward
fd219a94ab585fa699a0e842335a9f33dcbb613b c92af18c36c84cef0c785e1ae9cabc49a61a5c3a Philipp <philipp@boehm.sh> 1692888591 +0200 pull --quiet --rebase origin master: Fast-forward
c92af18c36c84cef0c785e1ae9cabc49a61a5c3a bae577d6b2eb621fedc994d6309b6f819855c2f8 Philipp <philipp@boehm.sh> 1693988519 +0200 pull --quiet --rebase origin master: Fast-forward
bae577d6b2eb621fedc994d6309b6f819855c2f8 f36c6db0eac17b022eee87411e6996a5f5fc8457 Philipp <philipp@boehm.sh> 1696762699 +0200 pull --quiet --rebase origin master: Fast-forward
f36c6db0eac17b022eee87411e6996a5f5fc8457 cb86d378f287f1731cc6ad907f6248e35b52dc25 Philipp <philipp@boehm.sh> 1698486252 +0200 pull --quiet --rebase origin master: Fast-forward
cb86d378f287f1731cc6ad907f6248e35b52dc25 b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 Philipp <philipp@boehm.sh> 1699741556 +0100 pull --quiet --rebase origin master: Fast-forward
b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d Philipp <philipp@boehm.sh> 1702044508 +0100 pull --quiet --rebase origin master: Fast-forward
48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d 8be4789bbbef06fe5eed581dc8c58df51e3cd9fd Philipp <philipp@boehm.sh> 1705357637 +0100 pull --quiet --rebase origin master: Fast-forward
8be4789bbbef06fe5eed581dc8c58df51e3cd9fd 80c114cb3a64044ea50b623f96a35bc022db5e8d Philipp <philipp@boehm.sh> 1706568347 +0100 pull --quiet --rebase origin master: Fast-forward
80c114cb3a64044ea50b623f96a35bc022db5e8d 872b5cd4086a5547dbf788dda4e96ab3868cf59b Philipp <philipp@boehm.sh> 1708188628 +0100 pull --quiet --rebase origin master: Fast-forward
872b5cd4086a5547dbf788dda4e96ab3868cf59b 9730915910c6cc7640f8af6063ffb93becf0414a Philipp <philipp@boehm.sh> 1709283655 +0100 pull --quiet --rebase origin master: Fast-forward

View File

@ -0,0 +1,18 @@
0000000000000000000000000000000000000000 5d3e86e2a48adf7a308773f8f1b725d187c7c5ef Philipp <philipp@boehm.sh> 1682402090 +0200 fetch --depth=1 origin: storing head
5d3e86e2a48adf7a308773f8f1b725d187c7c5ef 017e288560ef7bdfb8835516d6b3b77bbdcdde6c Philipp <philipp@boehm.sh> 1683537791 +0200 pull --quiet --rebase origin master: fast-forward
017e288560ef7bdfb8835516d6b3b77bbdcdde6c bfeeda1491b5366aa5798a86cf6f3621536b171c Philipp <philipp@boehm.sh> 1684686515 +0200 pull --quiet --rebase origin master: fast-forward
bfeeda1491b5366aa5798a86cf6f3621536b171c 115cee17015e4b5665e16dc4fd15c53e06a22f9a Philipp <philipp@boehm.sh> 1685969106 +0200 pull --quiet --rebase origin master: fast-forward
115cee17015e4b5665e16dc4fd15c53e06a22f9a f5cb9a6c978693c9570206f4267ba2589bef1b4c Philipp <philipp@boehm.sh> 1687084181 +0200 pull --quiet --rebase origin master: fast-forward
f5cb9a6c978693c9570206f4267ba2589bef1b4c fe4b5659863c388786986d70fa6d1bb66b00afb6 Philipp <philipp@boehm.sh> 1688415261 +0200 pull --quiet --rebase origin master: fast-forward
fe4b5659863c388786986d70fa6d1bb66b00afb6 8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd Philipp <philipp@boehm.sh> 1689508661 +0200 pull --quiet --rebase origin master: fast-forward
8bdb5c959c9a5c74d3b59c05a3a0bca5e602c3cd fd219a94ab585fa699a0e842335a9f33dcbb613b Philipp <philipp@boehm.sh> 1691764455 +0200 pull --quiet --rebase origin master: fast-forward
fd219a94ab585fa699a0e842335a9f33dcbb613b c92af18c36c84cef0c785e1ae9cabc49a61a5c3a Philipp <philipp@boehm.sh> 1692888591 +0200 pull --quiet --rebase origin master: fast-forward
c92af18c36c84cef0c785e1ae9cabc49a61a5c3a bae577d6b2eb621fedc994d6309b6f819855c2f8 Philipp <philipp@boehm.sh> 1693988519 +0200 pull --quiet --rebase origin master: fast-forward
bae577d6b2eb621fedc994d6309b6f819855c2f8 f36c6db0eac17b022eee87411e6996a5f5fc8457 Philipp <philipp@boehm.sh> 1696762699 +0200 pull --quiet --rebase origin master: fast-forward
f36c6db0eac17b022eee87411e6996a5f5fc8457 cb86d378f287f1731cc6ad907f6248e35b52dc25 Philipp <philipp@boehm.sh> 1698486252 +0200 pull --quiet --rebase origin master: fast-forward
cb86d378f287f1731cc6ad907f6248e35b52dc25 b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 Philipp <philipp@boehm.sh> 1699741556 +0100 pull --quiet --rebase origin master: fast-forward
b6bb133f230847ed0b3f9f4e25f2ceb874ca6c91 48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d Philipp <philipp@boehm.sh> 1702044508 +0100 pull --quiet --rebase origin master: fast-forward
48ccc7b36de8efb2bd7beb9bd6e0a6f6fe03b95d 8be4789bbbef06fe5eed581dc8c58df51e3cd9fd Philipp <philipp@boehm.sh> 1705357637 +0100 pull --quiet --rebase origin master: fast-forward
8be4789bbbef06fe5eed581dc8c58df51e3cd9fd 80c114cb3a64044ea50b623f96a35bc022db5e8d Philipp <philipp@boehm.sh> 1706568347 +0100 pull --quiet --rebase origin master: fast-forward
80c114cb3a64044ea50b623f96a35bc022db5e8d 872b5cd4086a5547dbf788dda4e96ab3868cf59b Philipp <philipp@boehm.sh> 1708188628 +0100 pull --quiet --rebase origin master: fast-forward
872b5cd4086a5547dbf788dda4e96ab3868cf59b 9730915910c6cc7640f8af6063ffb93becf0414a Philipp <philipp@boehm.sh> 1709283655 +0100 pull --quiet --rebase origin master: fast-forward

View File

@ -0,0 +1 @@
xmPMK1ѕМПтA=ДаюBСKС<4B>ЎB+^ќ8)в<>nвn <20>ЌЩ<D08C>Вўz<D19E>mе<><D0AE>їЕбv<D0B1>Ћљќb<D19C>ЩЗ<D0A9><D097>ёxВ<78> Ё|\ЁгaЇL<D087>Н<07>Еm;-YY<59>­uрFт§?<3F><>qУмљEQь7a<37>ЧЧтїАјЄfЕV<D095><ЊX/Ёx<D081>DPЖи3фѕPН _Оq5ЖJЫE<D0AB>UUчьxy=Юѓ<07><49>VzЫ<><18>ЄyщЃ<D189>б%е<><Јф/'љ}эTI<>@,<2C>л<>XеЄu<D084>а b)АoЄIGgщP[RLуJеM<02>УЯpЃС39<33> ЙKз*CВ <0A>иКдXь}p<>|ФЂq,b<>ъђэeЙ.oЪх§њnѕ\ќ9іХњЇй<10>й7J Зы

View File

@ -0,0 +1,3 @@
x-ÎAÂ0ŕ=÷W R°EcĹŁWDđ ËŠHÚĽn"Iž<49>TÜŠ˙}#îqřfjË5fÓهiQČG ;'˝
‡žďFŃeą@Ôä3€nŇb<C587>ď
Ć›!§<>?ľ·_ëĺęôąYž¶űŐn—Â\ôOôA—<41>Śl ĐhĆđŔZ¸_š#ţ)Ď-w^Ťq±$%<Di-ŇD{eă%Ě«ęÇDÝŐ“tłg˘¨w˝¬ŢÎ0kMö¶qEÜ

View File

@ -0,0 +1 @@
x+)JMU01e040031QHュHフ-ネIユォ*ホミ-ノHヘMe<4D>e壅<65>饂K忘ッr」恰レワsッブ\

View File

@ -0,0 +1 @@
x<01><>AOÂ@…=÷W<<3C>(<28>.x2šÔjÆÄ ñbÓ”ÅNí&Ë.v±„ï¶ôèmgßÌ{ßÌB™ÆãË“.Â5w³\)bi4rS Âñm)¤¶˜™Lh<4C>èqŠþgóö‡žÌÑïã½ :³q«%ðý«ÚA{@I¼.µ—KÏëbš7Ƴ¤"d†¬>gз´ŒŠx€ Ae`áè”$Ã¥8…ÔMåÄy9âÉii€Ú_j×¾_¡JYå¢49Á ;þ G§÷ö2I£0šÜ§wÓçÑ/ ¥mBIr\Š«YbB¤u»u»×-ösî»Õǹ>õIZïxü­-p³ûÑÙÎûv£—

View File

@ -0,0 +1 @@
x•ÐÍŠÂ0àYç)a *­g×àBp[¨µIk$MBs;]8¾û40#âBp{Îw¹'ëOøÚl>ÚÑ5d¼CgK\ÑŒƒEÞî&ˆÒ œ‰B,¤œ¦iM>Pm×<6D>ï¥ÒßÚú ‡(;C¦s~вFòÏëâRdÅr{ã¸1VÝÛÆW<C386>¦jÞîk§*k"%<25>á<EFBFBD>Œíîm-…à4€g¼tœ=™ø7|¢&ä{ˆU&:Wj¥<6A> Ž/=¦Ø´ tÇÉùkì²Ïp

View File

@ -0,0 +1 @@
x∙▌QJе0EЩн*ЭQИ$И4оEL╖⌠ВM#yВБф,Ь6ЮвЕ8p╔√▓;ь─7╫╘бк■&К4X"ыaQq6j@┘Ц<r0÷эtК0'у┘яG°GGд<N1p I■Y<Д▄┼А╞~╝ >╦ ╪у╤И╨Ч|цСЫьЗоПётРHаSд8< vлa▐≈]Ъу▐Щ╣7)Оw╨ВфрО÷Ю ╦,╧аф%o'░╨╔5K©С·w╫ю-"yk~╢<[═

View File

@ -0,0 +1,7 @@
x}TÛNÛ@í³¿bbTrÌ¥-*•„‹å‚ )2kg[l¼ÑzHˆ÷¾‚Úø<>J}éCû9þÎÚ¤
—TJb{gΙsfÆqw`nþÝÜ«ð<C3B0>2èÓò—È7¤OûTÓf Q8 ¤ºDœCÜÓžàqØ_kqÉp9ã$ý $ì5v) %xx: »)¦È2´h$ixÈFøõ&Â\¥ü¶¬Šñ\BD%Œx,ÀåýAŒ $}
A¨®Ì²ÃÏ<C383>ôÈ °Jà©l8Ãâ)Í*‚Ÿa"qŒFï+<ã¾ÑèW=÷i´Œµœ@<40>ôFplj8Š(cÚ UYÄÁùÇš2ùRMÝ _F­¦ÃxÏ´*s³b™XžKA†¤‡ÊT9c€ÒÔ4/]`<><E280A0>1a4ÚAèq¸ÐP t ¿Vß[¯Úëµ<C3AB>j{§e×öàfg<66>º>‡\ñy¸¹1ô`»ÑjWwž€
ʼnC"šö-?sR(AA»œ•É´]ŸˆA8;p ]>š]:4Ø1°&îÇÚ
Éý}rÿ« Ä
*c¦²RÝ…äÛ×Ç•p<E280A2>v*HùfÜ% û|¾Ë_4·ê<C2B7>½Uo¶<C2B6>¼º\*<>Þ£ 8NÛ<C39B>Š&C%Èú•¿À„å^dꦮ#šÝoÔw÷[+¹äöGrs­_ä76;•…ʱ~©‡ø$pO¤<4F>®¸~ YØš<C5A1>a"§„+óóÎÇžJSò2šàÅ*ÙÛäñŽÃY÷Xi²¬%¥éê)Ùç|‡b?ŒJíN <09>DìŒ<1E><>¾èo´äö'úÄ”'§PóVk¤}jnÙ­­ÚnÍÞÜnÙY§ðRÛØ>\É=jÑ…×ëX(;÷2U³½R=õ4%}÷ùh%‡Ùª ‰“»ïÙg
dm§VÝC²±&w7“É<E2809C>öêÑ­Åþƒ<Ô\P“…äú÷4†±£äúÏsSÄš

View File

@ -0,0 +1,8 @@
xŤ—]Ű8†÷Úżâ”\ěĆΰĂ0¶…˛°,{Ő²”R+¶ś¨cK®$'Mɏߣ/ŰR23ńEIÇŹŢs,ËŻ7­ŘŔýýăÝO čöúvŘ2žewtÖ†^Š=«©‚Žđ#|m†<48>˘ęóÍÂ˙[Qp -)¨D×·T3Áˇ2ÓHüôľ'ž˙!{Ę?ßě´îŐzµęLł v¬r»ZšnJTU.<>“MK<4D><1C>Ô5ă[°<> ¸“®€HIŽŔ8Ĺ á‡ÚÉ
ÖŇu•e‰íĚGľ˝)ŠÂdą4Y¶XŔ{—‘Ëß……,m9p*ÍŔ+›–Ţ i[e•J¸±YÚôŕ_IúžĘ)Í-Ó»aS`j+Mž<4D>d.ńüŕ—ËŚ5<C59A>ßĎ
ë5đú„´‰™űę!py`ŠbENN.$Ç ~óĹKžmž˛Ó:żt<Ó})Ô÷!ĘÖâM™Ěćş!oŕW)„~·ęEW|ďÚ4nş, Č6‰ń("q)écO×[Ę©$š&qç¨ Îy”ę%.§Ü ŻĺŔŁ<C594>‰b˙UßjşŹâ<ęŰ@äÓ Öép1Í€Ş"Ž°%„ŞĄäE-âŽU—ˇËĚPPÓľÇ$"Žź©JË9W´jYŻčÚj[ľ7Ě0ŞbˇÇOˇWźˇ$ÄG†Ó„Jd]B=§ÇÁ&Źu%(¦nk?’ů‚ {žPęâşrŐń Bţ»zbýGŞ´*#ŚiĚQb>ś¨˛µšŁ ĎEÓ´ŚŹBG”čć i]áĆŚűa<†.#Ş/ăŃHnÜOdű
pDĹ•šT™Ő«“LOlZ#*~ÔžJÖ\˝Ú÷ÉĽQ5ŻúŤAUýL­®zú\˛#JTńRńŞEyMyu\KŞD»§¨­j‰R¬aTľýJö¤v_QiYĎQZŇďa@ťyTŘ]ŔĄ˙TÓ%˛<
ű×h: ÇŰ
¨ŻTëčn{”ímWwÜ€Jo`Ř<>ŻZç1*ľ}8ćU)öÂëĘ!ÂoPĄdň˘đ¨ŮbPčx*z6g ŤÎYU=ꪧĎŃ‚*ť<>
jŃUäŐ·©eM¨Çr”jţUőxÍ= ¨|čk4S%<
d…†_ĎLő-9ćSńŇKNÖ˘÷Ę+ѢÍţ2Î,uĆ»©3—†6Ń^„ogčÄ űAđźĐ0r@mś,šTTQŃL4áü¬÷zü‰<06>~'ĆFŻ1ViJjŔPćvĘ[K2m§Ňő˘7üŔx…~Ű9Ńű⡸|č™ÝĆ­B­lĐJR܆ÍąŔę;ݵË4»lgÍ=Ö„˘›Ř-(ăÁ:×ૠż6Đ˙KÚ‰=F7Rtç¬5ę\ éţ›‹‡Í°U¦Č`đÄ4á€^×ÖÉÂÔ]8XŽß#]ŻŤQ¦«<>ő˝…/´Ř_Ě…¦Ćčé˛ňM,ŕĹâ,î~™Ę2łçb×ńCaÎL©<4C>Ş•‰ÇO˙W%”:

View File

@ -0,0 +1,3 @@
xUMMkƒ@íÙ_1ÄìÑJNB!r •¶·RŠº£;dw'ìG-ö·W#
æ}ðÞÔškxÜmR(c€ž£ƒ&úÀÈNŒ<´¬%ºMÂ+b*„‹/ò¼£ b½iØä¬L?xõw¯t¦üp£¡
Ä6å/tŽ$Ù.«¬Ì*y§Ë§iyÂñV™Æ"IÊ—çSùö´ßë¶{w(?Ä(ì¤z Ÿ kvbÜ/q­#ι<C38E>E÷¨5_gçgvþU„€Uò !ÊUk

View File

@ -0,0 +1 @@
x<01>Ž±à D;ç+,ö5K%þ†À5A¡€0$Êß—4:tª'ëÎÏw£<77># ÷ÛeEfƒ¢¡«ÉêVQOIEOèa"ï\ðT4¹2ױצ4€Ûu¦Ä¼+o<E28099>Í [=Ž'ǸP<C2B8>‰ Xü.>†Õ<E280A0>\C[íg¢H.<2E>ÀW<C380><57>׳‰Üb^>n,-E0|yhSW4

View File

@ -0,0 +1,4 @@
x•’ËŽ›@E³î¯()D£Ä€¡<E282AC>(…—à·g×@Ó`Ó0`Mþ%?&e•MjSÒ©ºªî<E28099>xžg5ºþ¦®(-Ñ”˜ªòPÅŠ)Et¨KD<4B>b<EFBFBD>P¬i‰De=ÒŒ(Ĩ$-jPq¤Kª„ãX
†1Y2ô!‰qdàؤ¥ZLiê”W0'U¯
z¹üüŸÓ¾ó¯yôJÈLjç_@ÆVTÅP4x<34>IB=í¿¬éÿéMYù£g%ƒ/e{ãéü±ëéxam¶+ï7G€ ¼»mY¶Ã¬x”yÞÕ{»W¼½%D““ÀêVÇC_ [Œ¬|íØ9³vþËô“Ý”1ël“p´ÜºK|Nm1;í-î¥jÔ©¤Vu>Ýjò앃‰q$læz[9výÝ<08>¬ž5AöÎ|5¸Ë¸(nÌ;%,™ÒøãÁ„l×ùédf£gòà«YjêâþÄwô-
ŒõÒG0sN]ótjóÎbÁ“> Þ`¶¸•m:%kLáKná?-Ókavs üät©Íû77IÙ\¦>9¡WCǦ×mº¹ÞÎs¿˜IJÆrrPÝéæÎËçIVîgó•5ädu¼Ü¤%Cµ6f°šûÄIîö~n<>šÝ=ž¼á“ôÔûuÓŠýÑŒÆó-+ëÖõ¨î®ƺÖ0Eźݘ»|;pŠ(o³.ÅòP$n¼ªÇG<04>æ†LÑ««ÞÂý—§(ɺw}nrÑ”%¯ê÷Ÿ 'P¶1Tô@Ò‡ò;/¿Px÷Võ¡ô¡MJÿÒyV<79> ˆ”·H´ªzU@ݯ¥\Ô<> (+þœÅ4†¬xáh¹v@A¯ -"ú¡QÖQ¯'Ð/Ão

View File

@ -0,0 +1,3 @@
x<01>SMoÔ0åœ_1*•
+œmÅ¥ª„ÔS%NpTåc˜:c<>é¦ÝþwÆÎîj ¢"—xÆÏÏï½IC \œŸxeë +¸¾)ÈVÆÜzü1pªxv%€rh±Ë;© ³mGOV?`î5¾Æñ<C386>©Œ>S‡qáù'¨hɶÑ{´íœ ƒ§è*8}|„Aó›òžü]oèžžÔQ{ĺÙ=l·{¤<>öVwžVD¡QÚ*çiðBì#…C?é4ÙìQîg´,Û^á50A<30>ÜŽÐR‡ð¦n9A×b±½£Èoâ5ù(Kb»œL?G ¹™ƒ9AIÆÙÌT³×Â"@÷ÕA7:
šÉÏpug4NóC×»÷Y& ìkÆ!g”f´ðí‡@bàkl¢å¨Œ ¿LKaW}ß± ;šì¢ú 2D—ÄH{%ž.ŠAF ¦ðñ×ûBÁÂrc×Æ€(?œM%>OÞ>i7£D.„ØÔŽÕ<C5BD>…t¢þòySÿŽ¿õ:M%}\o×fÖí¡èÉC¯ ¶PJ®jš•è,Ãߎ`IÑþ)×F7ëU)°0ÎÄAÄ­W\Öÿ}àvõ/<2F>8¡Ð&6•Kèè™Ô$LY89MÆNÒ_ࣷpqëÈbñZh&Ó

View File

@ -0,0 +1,3 @@
xUQËNĂ0䜯©Z©$—r©Ä
Rą!ŕBÍ6v±%ÇŽĽ¶Şđő¬C%Úă>fvfvď«ŰŐŐ ŮăĹĺoë«ęÝXĆ0y@úÁéd<C3A9>Ç!D|Ęţ×ܤ4đşiöŮ×lµ@2kŘ´)…V&-R@2úÄČ i„őCŽřa;¬ÓëŞjŰVęęď6ßÍ뺆P,ĘŕR—
šáCšÎ<EFBFBD>k ł} čJ'!g^¸vŻ ž)§ĐS˛97ŠkEI+ŤöwU] ĄŐRF¶3Ą9O<39>iW|<7C>ĹT#x}Dұ·žĄKVɤŞ°ôä%IáíőÇŰv·ąßlźvŹĎŻÍżbnvČ®={<7B>€'Ő/–űź{

View File

@ -0,0 +1,3 @@
x<01>TÑjÛ0ݳ¿â.,¡8bÐm°Ò‡‡²§l˱ˆ"IfMKÿ}÷*qÇnÑ<C391>uîñѽç(U&…<>Ÿ¾\¿‹/YQ «L™:‡JÕ+©¡0L™l¶É“+¡ÅXõ­ö¥±_á'×0-…ã
F+éË:<3A>dfÃ$×Yø:>P`Õ%+Šdó9$O0>Oïgîî~-Ì~Àbq¾:pÛ¬\*“q/<2F>v·#üXDP¶2f¥DΚ¸|=Øm²ÚYF%Š¹’[ñ¸)wkkðŒç”Lq/œï|o~e*ÏJ³©ÙÅ,$øm©Nóª#eµµBûFL”)y
Íi‡¬!Ùï¾~Ag>ïSSÝÙC§{»±(™ŠGõ²Œ#œ"9vçá%Îõ0@3Ï=q¹ ƒß{*'Oõ·<>E6jïöµªÀ €æëð^H|äF |ÔÚ ß±iŸöËÈö£ Ÿ¯Z¿~<7E>ñø`ùfZmÁ™Úfs `Õ>ÐÒé¸B-ùŒ¦œ@Å}‰RvÜïax…aÝp<C39D>»ù®jqJp½¢=FL¼#&Rg­R·öŠ:<3A>mW;DçˆáÞ˜u(ʪ” C!• aæ²(Y8Â!ž&OÀe€4q?»#Ø‘ê(—46+†\¼Vš«#è„«¡?iýœ1ðÊ')w"?¥ÂqµMºyÐݵڱy'  émgÐÔKñXëÛ¶%[ýmÜò

View File

@ -0,0 +1,2 @@
x<01><>нJ1<10>НЮS xг"<22>Iv<49>нHЁ<>рevђg<D192>Л<EFBFBD><D09B>ЄЕњєFёМ; ч||cгВФ
]/яjі<1E>5({1<>Юh9і}<7D>оqбЁ dЄVVtІ'nvІьз6-r<12> > г<1A><>оztJн<07>Ъp<D0AA>gtЉЇ<D089>с@yN№B3Соўфвтлѓ9Ї<39>ж<EFBFBD>тМГiyЎє8ШYЛ6ЯъџEа<45><D0B0>zј#Аo<>З}<7D>Kё0m6АнNзR=9HІу^_'ЦОЪ Ў><3E><>жч<1C>vM wИSАP~џmюзKѓl} в(W<>Ѓ<EFBFBD>ђЙVК1vhљї\ и7з<37>

View File

@ -0,0 +1 @@
x<>MJ1F]ηnARΥωkζ<08> T<E28099> έ<>&“ΖqNo/ΰξρ-ήϋRYΧΉ}Χ<>dς2Dkc"C&΄βPσd2fNF“φ£υjη*[ƒΑ Ι§IΒΞYτ³#Ω‰ΙQktP|΄ΟRαΔu)πΑ ΓkϊεKΗσϋ^K+ΫΚσς<CF83>ΚϊθΩ@δ <υΆV}ν?όΛΰΠΫ0ώΤ4_ψvTy|<7C><>·ω&ΠΛ»Τεy;®±Κ—R§~K.p<>θ<EFBFBD>Q?HZ8

View File

@ -0,0 +1,5 @@
xŤVMŹä4ĺÜż˘ÔŚ¦w˝­.4jBZ!4 .+4JâęLÇŽlg>Äî§l'v9=<3D>¸uç=W•ź«ž]K]Ă×ďżůö‹/ÁTť´Đča¨”€GSŤ#šÍyRŤë´»€ß-ř›·đĎ ;ĂGŘ#lëN¬j{Ľ-üý¸{TÄX<>}FY,~eY¬j˝Ŕ6¦ÝK©ĚT?‡/Í E󀦬“/žSZ ;X¶ÍĘ9wĎM%»ĘFíN»RŁÝ†VŤĎ+íN!Čfă%ďń?ďń Ţcą®7eX«çaźúrQ((ÓÝó<C39D>POJH„ëďá đá &)áú>Ćs˙‡s')Ô§OˇZě;SSč˘b |Â&nú5u—jKq{ Úf5
iógR¶G/ěÝB8´ó QéR·§ťŁ.‡ýčŹßJ=¨Ü;úż›©ŁŃâ‚ë?Na8ŐˇuT˙1¨őĐ­|°č\§ÚĄ¤} ·7?ťv·?ţúᏻ›ßţ:±béwNĘ•ś?9Ç—°óB܆ˇ.Ą0Íiű¸ŃĘj‰KÓŘű˝%7¨őSâ<53>…"(‡ŃϨ”RÔÇĆ`ĺrR#ÖGaô<61>#9âqčZS,řş=
ý¨ŘzsŕhPhFI[¦Ę–(ÖUn˛Śäxý3 h<>×ůŘH­Řv†é…¤Ű/Ęh)ëŞés.Ă 2H=“1YDÁÉ’Úć‡ę(uĹĹ^ŞŰŤ,D ŚÇĘä­µ¨
ýÄâ8ÚtV Q'ş;R™2ÉHCCşaeŹsčÎ#Ďśň*M•Ą5©âQNm—ó$…Ťž8?w~¨˝©S©ĄÄ\‰!·‰óXř4Ň0Á YÉŠÓZ©2“š Ĺ<>ÔdY„tń"J+mŁPŤä×ů mjű„ ¬§¶e;°I<C2B0>ĵɍd]ÎN­žuË®üů§\Ĺ?+)”·9)ę<>ŕ9?kCí§V|%=ĎM<>Ż'8yţĘ úč\ÚEý"b…]ô"ô`Dć!M…„+ĐŇ.<2E>§¤vA” \IYŮ‘â°¬WěČAĂ{dvŃ VÔ…]Ę
*í˘ <C49B>ŕ1éKvŃ ľ…ŕĄÍ!4Y k»čă¸ărÚűt/L{ĆťÖ•ÓŢĎmK€W<wmÚ–>Ç®Ą¦ŘV ˝Ýt>Ď·şőŢÇ«+*Ś<15>W·ŰNsµž=ëŤ<C3AB>ĹYÜpiÄ0š /ťËúłf¨™§*ľ2íz±±I<C2B1>˝&ôľąď”żµ˝@°=řżô.§?[/Z<>ąô¤§1%;ĄfxĚ/úĂdÍÁżQ=€µ÷pő¶o pő•÷ńňć•<C487>ź$đvKŻâŹh6:

View File

@ -0,0 +1,3 @@
xm“=oÛ0†;óW¼€‡$†%<25> t,Ð,õ<> Š¢¢¤“Å„"~Duÿö)9¶<39>nîã½{îU­m<C2AD>ÇÇÏŸV8¨PПà¤â¥W£Že0:û®Zòhì0j
Ê´Ô)£Ò£Gg¼¶Cè)¥ Ò´~N¢õ?/ÍÝ÷!Œ~·Ýò·>Ö%çoÃkz[ä6˜zÕô¢<0F>Úl<E28098>¨ Êø µ¦¶ä -¢çOaÙ¶¨.å‚̓Ìó{Hçäq´Ñá¯ï]ƒNiÚ QU¿‹%óË}YWR\ˆÕ
Ïâce8yÉ……ÇdÝ[ZRÆÃ@&(sÈòÕož©º¦¶<C2A6>ÌDnU"ƒ¶FsîÅLæê/>*æf4Âuó<75>8Ë'ñ¤»O]Z½|'ÔfAðaΉg˜œhˆ/ÅàùFðÑËÈEë£ p"{ÄQC-™†ø&+&µÆ|c;ÔŽ¦™›ëõ÷ýË×ÝzÍMÙXÆB[s ·,͆j¢sÌîRÙ*œªãì1¶oWâtÚY"ƒ:ëÜ®°ØdÙ3'Vyšs€[¡(RÀÆP\líù {¶°›”§Í\ç±rRZç­¯fó1Ðz²æ.ÀSâvk<76>ôÜØóüƒ”§“ø^À><3E>

View File

@ -0,0 +1,3 @@
xeŽ=
Ã0 F;ç̉¡´K¶Ò zDZ¨mÿ4$§¯Ü.]¤<>‡xŸFË#œ/×S 7­*ÇÄfÈC2X©øRMUâ°ö𨇳•
Á€°<EFBFBD>µÀo <0C>4%s¸¢t~Uîd ÿêâz"`Ršã ÄT;ÁÆ­[4¿½ÐÄýøœ6™ˆ}[ËÉO<C389>ôº“Zﱶ4i\2

View File

@ -0,0 +1,6 @@
xu“I¯£V„³æW\)n¡4óu¢f~ØLƒ1;à^3šÁ6þõyÝÊ2©]•t¤£ÒWÅØ÷Í
(R"[g„€@/1 Wp"ÓLΗ°,$†ä2A xD3ŒÀSYŽMÙŒ†”Rž—<É
9Õ%I¢ŒD <20>RY¢Œ+ ˜—mk=ÎÀ˜DsÓ *ð½ü×~<>ªÏšî[1öJ ‰”hV8I$ö™~~º¢˜Íú±åàû0ÎhêöU³Ö[þ?gÕT-Mþø)E7-ø¦BËtåsè¿r `ๅ"ËŠ*Ë'åtèÞGUV•ÊN¶qQÝɲl¬ãI6Bjf†Ž#*¡ÐUnx§ˆ1'ÅÖO¥ŒùVòSI”»È½R#¨î`Ì¡ƒxŽ¢Z¨§fÕ7$÷L$µ§ö7çDÖ²;ä<>‡ç›Ú¥šØË"e…Vy¡<79>#tMO&ƒûì¶^u¤l:ïI¡«äœî7á êE<C3AA><45>`<12>wS3æYT¡®Å<C2AE>Ñl
.íã!šõ?Ëþôâ~}^XQòuÒ3ïžú¼Ø&dÓÐG/üÚem[/ÓŠ\´<>œ@y9ß±$åjRsün-×Þù Ý"¶yæGÔW–Ö©{*b‡åÆ@êÄMhòàÃ×t9ã¤7lQødÊÔʬc[œ>
\Bù<42>Aã#`2AúFnŒ£<C592>ÖÛy<C39B>ÙÝ.5Ì{•<>í“&Ƚ¦ÊÆœŒH£|oîSHâôŒ<C3B4>¥m/œ¹Ð³Ç³spÛÝ´£ÑÈ®ýÆ­2ƒ«§F[gÆ ž>l\b‡vY#¥ÀÃ1\5í8Kó#‹Ô[sDMº4IF<><18>(^
ík¯øeXÞ«w÷[¸šÜIÿ³I­Ôáèu‰¯ÚLϪQ<C2AA>SÕ3ÕùòÌz!÷<=àÓ>ÜÖhôûj\ýOTG˜œzIuÓÌK ì£å ®Á¾bš9×hó,¡½<C2A1>¥¯MSç˜}._^ŒŽ8tÒÕ¾X‡šÐ×"J0`<60>ªvë}¯Ú{¨(S½òþRYòØ_ìë®ößÀàX,_Ú-GÅúúú'È ÷m\ÎvA6ÏÙZ´/àËïMSüW ûÚ¸T‰

View File

@ -0,0 +1,4 @@
x+)JMU020b040031QÐKÏ,ÉLÏË/JeØ÷b™wåÊ©®³8<16>¡òû;TU<54>«£¯«^n
C𶾲Rv©
¦_w[Á³ãTQbNfbqj±^ANizfž^UqC½ô
ë¶ä«÷.Hº#Q¶—GrTurFjbIqFjj‰^A%Câþø©IbŸ¯nê;·bSáòðÐOP…%©E¹Éù9ùE u»â&D?·hq¯=·-£g^˃”u¿«ÀTf

View File

@ -0,0 +1,4 @@
x<01>S]o1äù~ŶD$½F <20><>P+U©}BñB¥ÎÝ^²ÂgTýñ8_¶sÜowžñÎììz!õÞ}üðéU0Á Þº®…*ÝÔèÒÌ`<þ ¼B•Xäƪ¬¢,{ <0A>Õî<ßHdÒ
*¥F§† ¸!Ç°E¾5B,<2C>5ˆ†µÔ¢bð*¾ÌÔþσOɧkøæ+Û59¼Ú×'åékV¢EÒ¢(·^J¡÷ ø:óþ§Sï?¯àrðëÇÃüþîþáëüËã÷I4è&óƒÂ%Ìf¡)Þ<74>/!¿ƒùŽî|¯ÁiþóŽ÷üñ?…ssv<6A>¼¿…I‰íD5ÞþíËÿÙ{óeBp`òfx¬¼hHÃP<>
 Rh<52>”3XpdI×Ã.%ˆ^ä¹<C3A4>2ðhXT%¹¢Ü5B‰C<E28098>Ä™¦sÝ4nµmÝ<6D>mAî`,”:€1#©—±U†B^kû
¿^Œ¡†*bÐ<62>¢•JcVe©$çEÏy1¦S©nP* êÄI¢RI'8IÃô5l´<6C>DmüN†6mÈ!&eqŠAŸ1ü¢<C3BC>b´¢`ò¯3Ï™·ñVœ\r)Lohl}1ìS®}¡JÛ"ÎÁõé;Io¶oÙ-ž“ü_ ýÓò84àØvì`w/Püw ¤çmv«eSã?¯³Mf}¤$£n<C2A3>ÏCé#a´7q}£;Ü`0z·ãôOî/þ¢!i

View File

@ -0,0 +1,3 @@
x<01>PMKÃ@õœ_ñ¬E[LZÁƒ(Ô*´'ÁâÅRÒM3k¶»!;±Fúã<C3BA><C3A3>P=zYfgÞ¼<C39E>)¬/p}usr†¹ÆCã`œgh߸2EéÝË Þj
¯»:ljSqb4œ¢¹ñ»<C3B1>reX<16>[a8¼<38>0—@¶¸©]¢Mt"IÀ•%6ÞAK"@!
ѧ8ÅžàˆJ°‡jØ[¯J†HMa\÷“áZôÖ#< m½7<C2BD>ÒŽÜ8Áî<C381>µØª²5©²<C2A9>qH|)EçË¥8Ï4zý·Å,ŸN¦³§üqþ2þuƹÐ÷°Zãp[Q FöŽl<bƒ¤<zÌ^¿—¤÷3ìr×µâ dô'~Àýáúç‡äõþ‹â

View File

@ -0,0 +1,2 @@
x-█╠
б0С\за'Qprэt║iM Ж┘╪D╗_ol;╬Шн=╥Стa╩ъ╜ж╦╕≤иqЁ▌|~╧!ргУ├║И╪I▌<)"Y┐{)╦`p╨°∙M)П║ixйdа⌡·4/ВF{Wк╒&d6p ╙О1ЁH4ИФE├┼Q█(ш#Е┬/ш╗Яtч■zш╤²b+ТXI)й≈Fл

View File

@ -0,0 +1,2 @@
x+)JMU042c040031QrutρuΥΛMaπΩ<CF80>rω•γ±<CEB3>ϋΕcΕ ΜΜ <E280BA>σRStsσt ΣSυ
rJΣ3στ<EFBFBD><EFBFBD>3Β<CE92>ήz8Ζ-8<>wω²Ωμ<>]ο<>ϊΜMMς<>ςΣ<CF82>Ό†^<5E>ά®SΘΖWΌφΟΡμ°ςu¦K2η1·

View File

@ -0,0 +1 @@
x]<5D>ÍjÃ0„{öS Ž 6ÅÒC!<21>BŸÃ1AVÖŽˆ,i•&$~÷*ý#éqwfg>¶Ó¶ÃËëò‰ÏybTªwBGOÛQL“2CôÁHVÖü)“³ãÄ[ez[”¸$@Q {v…Ùùæ;A·(K\¯pÄÁ™$Ú´•BCçÈð6¬³âÇ iM¯†_±Š#Ó‰±|C½£cmÖå-£iP¤Ù]JŠ¶},Z xÂQè@PÂ{+•`u$çĪ‡bÐIyö1tË{r*^õBktBÀq{#ûB1b¤è%¹·±ÿòïOÍæ<C38D>i“¶«*»ÜQ®_çužÏsšÌÉ'ß%

View File

@ -0,0 +1,3 @@
xEÍA
B1 P×9Eo "nz™Òj
Á|RTñöú密7³˜ÆÒÒõ~;y9õʆð$Ň‹Z†”Í-¯Êô1}÷¹,Fos ÑcØ N¦<>bº@¯Ä¥W ¬³Ê,Ÿ¢d¯ï¿z£61Œ <0B> 9p

View File

@ -0,0 +1,3 @@
xu“É£V³æ+ž”M·¬4ðl¦¨5Ìdcf0»ÇŒ fÆà¯<C3A0>ÓÉ2¹ËJ:[IÛ4ÕHå~™†,Üžãh†äÍ$•±4Ap,Éx‰üC`Æ2X‡†ì9<C3AC>”¦)6çP¾‡dF“âb6ÎhŽÎ)꣑û$¥cÒš§²À <0A>yJÇhÎð½ù ¾•ÿ‚õÜTO4LYR~KÚæO@2ÍÔ<>bÀŽ ûÐÏæé#ËÕ¤Ì1øþl‡¬«·E5•sü?ZÑcU€ßþ>AU˜² U6x׳¥Ÿx<>§DàyáÈó`iõÌÞí£}$ÅÌ3å•5Ïó¡âY¼`¿­©½¿ çâù•œE£*+øN‰Æ«ÉËÔÊ>âæ°Œ;ÖãhC vß(¯š¶Ûå:XnõïD.(|E` ì°ðN̈Á0ìÐÕÝè˜Û鵪󜔵,±g¹<67>iójÀºóÄûŠfdüæþ8,j|ÐG†XNbé³uÓ¦ÒûC¿z«ÿ2uÁG§V€·Úé.¡gÓ>ûoœö´üg7ÔÚÍOn¯ñш‰a¶þZܶ°9;«¨Æ%¹<>™eæ<65>$à«x#Œ|…nÔ®=ËÆ=ªðšT,DçqåfF¿Ç†*)ËaÑ¡ìäKج|È~–Å;iÕË¢Å<C2A2>ÜTkïJ\Ì<>î„®-¹×sWt%8©œÛÅFü~϶ó¤$ÙÊhìσ H0öF£Ò¡‰®éuaï¸*­d<C2AD>|£½ø)èiÊ-*®Þ+ùè¼'š¸¼‡à¦+YV÷òÚŒ<59>TSò(î<>Š'ÕÍ€*-; 22ø ¤u¸h3¢@¼†¦ç_?MàÙ2E˜‰¶®öŸßÝ/?MвÀœõux܌˳0`rJ{^F$‡+¯ù¤<_×ÆÔ§x­<i˜Å]"£èpš
¸a A‡h¢Æ Õ|0­û3'´Y;žOâ{ÄCæ¹M‰oÀëí@(¼²pëA­<41>G«\ó½6¼1PK!«uŠñÂåÊ®æy3Û3þØf7ÂþiB2Äÿ.Ë34})Ñ;«¿þ±m2€ê
<EFBFBD>Ù¾üJB!¾bØ_hVZB

View File

@ -0,0 +1,2 @@
xuKo@…»æWŒÔM"Ô”UR Ælã'1;`ó0`ˆ}݇ºjÏîé“®t¾¤©ª¼XÆŸ:F)€ $¦"%CUš¬E˜
)™J8ˆ†Uî1Zw %j&E±¬Êi¤hZ$PUB¢(GZ*Š$‰cŠ1õ]Ö0àä5˜d´9ƒg¬(CQã㼄÷¼ö-eíSÝ0z9<<3C>ò.ë㧤©¾¨hªŠ¨ª€4AàîíýíŽ2`çݬ<C39D>Áóìõ¿ºc§Ë©ÍOàËÏ=_ßöÁvn/õÝ~cýê9À<39>¡5C×<43>‰®¯<C2AE>µSŠ^²Ÿl g…´zÙ|ÐuÕæúÔÞ±>ð^é˜h˜rà* u˜¾WV…45¥¦Kð$ôëBÈÌÙ»æZ¢·á|µ0#ÛJ¬ÙB-ÖH6®4“¤…çq v[×®ËÛ´O3Õ æîÎa~:nœ ƒ°”Û±9æ4¡ÙµZ™ÍŽ¯·å8Ƕ¶…‘vko.ÈÀ½{¬Í-!: +^Uö>rÛXåeï ¡ip ÕOn¡zn><biG¿åw³xdÈmk§Höy‡/·[}p¤B¹­Óõ:õλ!à8:33â¦ÚuÑWÖ,ùx̬>Y2YXq .û*$ýtÒÈèxfí<<3C>òÃ<C3B2>r ìho§ÞíHȳóùØš×qe9©Å‡Ì‡¥²¨Ký…/̽:Üïͬ¥ùFÝÃÝ¥ «¿<>ˆð÷ïw³ò¦ÖT—<|†w³åGŽû‚í(

View File

@ -0,0 +1,4 @@
xm“I£F„sæW´”ËŒ¬ 7D“h0«7Œm0Ëih066[c_'¹NÝ^I%=©êKªç³ €ƒ2÷m HÄDH9$ÈY&g² !9a™$)—ñ©Œ ÿ9ÈŠcjÜYA$Ä¢˜’Œ¤ˆÇs'K"‰BÌ­ÄŒ‡ĘÁ=½U-¸äTÃÛâ ¾ßû×Ôã×·ù†_ù<5F>[EŸ¸(ÿHªç߀C!-, !óq?oRÒ³ Vƒï¯ª%u9ýÈ zëã_ĸO,¯ó®ÈÁ·µÖÍ<C396> Ó<>i+®wÖÿóÀ€¡3µ¢¬UE9­OÛrJë­zV9|B}/z·RQ”óX<C3B3>5ò²Ëâ
”NÃ{éÌïrviÌ€ÇL:i놅ÜS;[;çÌîƒæ{?¼ä]œMŒòàÁ+Møp‘䛓Z©™Dd>¦ àÍGòªµ=Û½¶%Ј<0E>_ˆc éi_DÓåÞ@ß÷_ŽÖœü@<40>Â$6¸M¥uõ†eÀ%<>¸Fôêž4¬ñbºlîýæ<C3BD>ψ<C38F>^—êH”j0<7F>Å ©åkIt§”°lÊ7<C38A>ú¨ô ã~ÅÑîô²p%¼­ìÂ¥¿'ûhѤÛV;ÃÆpØ62{ÖWXUÓcbQ×2¹|2 ~Gf䱟Ø'™‚¨
¾&žU[Œ<>ôúZÛ«HT¥»ê_ôwöp¸Ž¦7Ϻ9ÃÐO @C#<23>Å<IcºßgsCI<43>,ªáó\(j~ÔÆ!¼%…X9<>NXøO㸷<C2B8>®œ-¨¯ÝÕ¤k³ÞÙ¬°§¸t0Ÿ 6!1vB¡çÌÊôÎê §ª~¯ÇAì<41>ÚÈów-§*\jÍ+y¹sÆꈦUrʹ³|=)ŠO<C5A0>»6¦7<C2A6>£åÒu[v¶ ²p†(µN­ŸáV©“}ùf€÷VñŽÊÒ¿¡µáhE§õVP‡á]¦Õ1ÖGTn 5¨k³S©·0vMNKï|8˜"f´ŽKã>‡š˜}ºˆª¦ék±Xš<58>õšÉ¹ÕºƒÎº=Ü&׸yî§]rÐãzÜ8´Ÿ6s8
dˆ¥ÔñöÞÛåg©3ÿ3¡ÛÚ¯‰`2é—¸×?NSÐõu]µÜ?ÿ|ô1ùVwÜOP·Õ³¦àËïÒR@_æJYÆ

View File

@ -0,0 +1,2 @@
x<01>Mo@†{φWΜΙH<>Υ<1E>τl†e‰ΐέΥD<CEA5>_Xό ­/$συΞΌ2…Ψχ^2j¨Ξ¨ζιdΠ”ϋΌ¨υ,/<2F>@mϊ€ΆF& ¨,β}Ια²jJ2…¬mC<6D>°ζΫ<04>n„”MHι®<CEB9>Α<9ψ®g³<67>Τ†Λζ<CE9B>ΐ·<CE90>4¨
%ΰχΙmυΦΈ#Q”<04>«εΫzεb&90Rϊ¤aHχ<48>ιι<14>8<>τµM·΄S8ϋoη7<CEB7> 00ίΙw³nΤiνζa<>-<2D>ΰUd<55>qdΜc<CE9C>Όxω΅Ο½΄<C2BD>v<>Qτ€ΗΩΛΙm•]-\SλεΗΧςέ­²Aπ1α³β¦;Ό½<CE8C> αfppξ²ξΖό/<04>UΪQΫ<51>γ¶ΠF<CEA0>££χ©6<C2A9>¨sG<13>ξ­Ψc–½Φ^wοΕ<CEBF>Ό7a<6E> χH,²<17>qψ†©<E280A0>! x(0<>Ιsbδω"0=Ε½Ώμή=#Ώ'<27>Οv?΅8ω›ή&¨

View File

@ -0,0 +1,3 @@
x¥K<E28099>£F…³FšÿPR63Bnƒ)Ê0ê‰ܼl·_4~EYEc`ŠÂØþõãéd)Q6¹«£#<23>«#<23><>Ôçs.€©j¿N) ªT3cHQ˜6V) 4¡b¦hP§±¦°nH æ´ <20><>š£8<C2A3>ˆ!¦03AHAšŒR<C592>˜¨š„;‘ÕÔÙùvo³ßãZüžuh#46å¿Û/]KyûTÕœ6åí)ÍEÖÅO¤>ÿÔ±¢k¦©<C2A6>M +ª¢H÷Q_P¼\ø] žÿŠ½üg,mÒ6OÁàçÙŽ,ÀÊ[<5B>Ö{´q>| H omb[=±¬µ½žMÅ“<C385>=g\^4ôEiX3÷þ=/¯ÅÊÃE„œøzίÂLÉnÕÇÆt¯»¤/Œ¹7¥»î'ûY˜s=-¨÷æýÛ6ºÊŽ®åìK ¢lYÿ*Ÿ<><C5B8>Û¥Ö]d¬Êþ-<2D>U€_GòîæNÙR3rõNns¿z~ %ÜI寽9n…˜;Ò¼ûõÕMB_¸¥ï̲ÅÆYããž9»ª[Md}“…«]x
·¦¯Jà²XNó¢¯FyÇ,ŸÇwÏVÞNCr8«Ÿ2snÙl‡ÖdÍÞÜ.ÜʧÔØ'<27>ôÚ£Ã{u¤û¡·ÐìgÇ{·G­^TʶÛö”8Jª5ÓÀ‡€ÁÖˆÖóH—<48>õé|Ñ…ëoø¶<C3B8>àG•<47>mœÅë¿/&1ŠÅç,oEÍoƒ¶[Áó*´s
º&Á‚QƒË²¼®€‘$Š3>ÿªŽT4þ"I“zð'®4Ä·¯ÿÚOÿx7Á¼¬AˆK žÉOÝ>dúÒðZÔÕçå쟤Ž %]

View File

@ -0,0 +1,2 @@
x…’?<3F>Ô0Å©ý)FºâšM¶AH@…t+ XNBHˆ«Î&±µŽ'òØÏÎØHìUÐEŽç½y¿gÉÀ·¯_©a”º»ƒGçžØÃCàƒ©%P/T<>•úîu<C3AE><75>*茉.!Í G‰6|¾gȸj{Ñs»Aüd?xQ¤¼\M“NóÀ¨³õ tÇó,äjD‰ƒCU<Þ4Á½XhTêü¬«¡^šºIeÌ|ü—ݬ¸„‰jr é>†ò© ¢|)+¿;çP|5£¥¥Ký_T:]1ïÅw$†®òÍÀh;AùÔ`iÝ<1B>Œr8:þ !оž><œO`jÃifXô.Á§ 3p ³/q‡ÍcRÒ½”P¹ùu§?ÐÆ>'Xu.ÁÖ¨ó¡WæHjª½Š8Ãw0!¹n6Qî«É¹2Ž¶$MgÚ¸ÙeÆ8I5ðüë8
àlŸß÷ë­¸5VI##Èr&O¢iÉÐ?ä¹´\BŒ°éT^ØkçBÃ#Á¢®aàm˜½í&odÁÔîÊþºñÕoóøò

View File

@ -0,0 +1,2 @@
xuR]oÓ0å9¿â,´*<2A>˜¢o´ÚƪµÀ´ªŠ<ÙN7Ôߎ;ÖÄC<C384>ò<EFBFBD>èž<C3A8>{ÎUç³<C2A7>oD£©—Fⶦª}!µ0ƒ!6 ðÌh Ò(ŸáÁØ{WÊ!5JSq0i{¹DÚýüšâdŒ?X­°ÝÂrßXýäEKNï!Å^æ¹µD[íµ šAHÅÁ¥óîŸWÎð®£<C2AE>ž"·Ñ`ÄõZZ£+¾XÔÊP¢ºœã´7øòŠv˜>§¥ Ù7·óóbq>¹œi1»¾ºœ-Âk2½¸É—»Þ¦-þù—õGý~˜“Ì¿O÷Õ.MvIŸxÍ­ ×>rêCè¶qñÌ ñÐ<C3B1>ë0÷-yþÌÅ%' ¹ÆûðM<1B>pÅ,<¹À‡á“ÕÑ®?&×ó«oG:·[_ëþŸÅË$DIâÂO6ÎZìh
R×êw‡Ñ£F;£x‡²eÜyk"m¼ ¢ò<C2A2>NÆ:©e2<>¯¬c°VDwëZ‡¾Œø<C592>ô/*…%¿

View File

@ -0,0 +1,2 @@
x╔∙ас0├9Ш)FЙ╔∙H╡к U─╢b%д│ p╚V┼⌡Lk;╡²╡Ayxфqр╙4,^╟тж╠Г÷ofБzЖRОАммМшW+Юй┼╫Dhew┼╠у
>+gtыNhZЬ^#Д≈V9П╡╢`Я┬├KЮRp▀*m═ЁXuv⌠Юa];взm√∙╨╟И╢ ╨и╕y&╧CК2║J|Jkвх пvцХ▀\ВКу4ш╓∙Ж(Н╣▐Е`N┐ё┬C:Дач┐╝═в²│÷╤6TBБ√╠<оыdЖ~²╕И\┼м╦Ц qх▄ П1└c─{╢┘╜╞_└Щ╡ию├m?^dЭG╥=∙2║≈k)┐2Zё┤Э*пуЗгXОи(ЦЫ╛eK┼l└┘Z[wЕ.═FKL└чЫ)(чЮ┤┌Як9п╩0Холх╫⌡▌ОWoл-╢h`^Шд%Й│╒P%7Е9@╞S╨0:? С≥<∙'Zzv2eZhUE╘╞║┴в┼C■zФ├LI╖Z├Z*o°>`T╗c°hJZTN⌡>н┐гh+y©вЗЯ╞╨h╢жЦбP╨щРyЕыъh╢ЖЛ8@\Ч3■╢Тъ┬⌠Oэ╘╪²▄ё.dзфjоТЬy'Изxиф6Ь ЕХ┐ф?╝`w▐ьrУь5э°ШзA╦╨ш▐Вoo6юьnН{ Ш≥╝⌠╕O╗eн f]g²A;╥д$t╔g▒>6Л╨bУБ

View File

@ -0,0 +1,4 @@
xmI<E28098>@FsæW´”ËDÈ1«<31>h&šö^0/Ø·¦iVc04ÆæׇLrKêTz¥W*ՇˢH)P$õ ­ r$Ld!B$5ÄG<C384> qZ©|Èó\ˆÕ 'a¬LĈ©PM®ˆ2EYQ8 a‡š"
ˆ—1 ¼Â1¨¥IYƒ
jÒƒu™ ¢ !x-È;ýdÅ_ô—ÅO0(²¨)š*ƒ§r3ÐáPJj`¤Ôlðz-kR]žïqJ“6øGc9~Ðâ*nÒŒ~×T7,8†<Ë°ánïꟜ èš)žB8ý€p;Ý..U®$ît©$™´¹µÕA8?u4Ûç bߦåÅZ=©cÜ?|TK}Q <20>1K±ª…IÕ<49>Èö0ž™ÏXÉ5Kå[aÑŒÎa€Øªc·±”Èqâ, Î²îÏm¿™ ·v<+ï{R…¾?
VoüyìsrlXhgÖêêÌæ.;!<21>g¬XÔ<58>Ç€gæ<67>N7xÞìøåÁ2W™usýç=TM̦>½#Û;¹^F°¿¬d_w6»pýã1¢ Ìo  ·5d•ÞóÎqU"áHõë¤r½vó¼7™Ù?ü<c¯½íœZ9Ž&<26>‰ëuqÛÚí¡091g@P°vœÉçéίwsƒÄxø¥$]ôø¸Åk Y{ワŽ—ÂÙp÷ä~YÝ¢3ûè è‡G÷Æ€·ù.Ș?™éöìÿ‰1Aô%IZÖÏQÓ ­Ók<jªqòíQh9tÃŒ ¼|å~"}c˜_{3íÃ

View File

@ -0,0 +1 @@
xЌђAO1…=пЇx"Q€bў'Ј A8™hјH6KqgЭ&ҐЭґѓл~јСcg^Яыж-­_въкжДихое»_­ґЛг<r0ҐичoБ%№Дла’В$ЙfЕn СWШx‡ВXBо }™Иh€Ё Ћ({и5{лuГђ±Y·ЙrСF.†xзPЅїq"ЇЌµ(х'AЫ@:o$К0h&В ї*РйѕЅLіЙx2}МЈ_А8КЪ„Тфx7EbЁЁ1Іќ<К­GRхєБП?·ыC9w‡Е®Цыo!JЕ„zK(UГ¤Ш«И№_3о·яc=Я&Яu#Ћ:

View File

@ -0,0 +1 @@
x+)JMU°0c040031QrutсuХЛMaё$УxjNXю'±ЫS КзlЇи°‡**OMТ-NM,JОР+И)MПМУ«*О`8Жф ЙPкфҐЅЏЭ[н„jЮ“•іb&

View File

@ -0,0 +1,2 @@
xuÉŽ@E³æ+Jʦ[VÚT(ˆÒQƒÁ€ic<0F>w Åàp1ûëCÒY&wy¤óôžî«Ë¥hæÑ—–œqB NH(BCb%I(A1%bšàˆÌ8Ndê<64>²—ˆ âf0âØ̱(â1;Qä°($/2a×æ´ÊB<1A>Äò3 “OðÖ5„6/eEI}¾¿dEwÑK\]~(ˆœ4ƒ<'€ ;†é¸rK(ÐÖèÆaµ·ÿjhÔ²:kŠ EÓM|S·åÍÖÓþp0àÖ(±"ËÊ\]Å]ž¢Ì çžbáüÈ­û5o²|ª]S^h-¤‡¡——`]-=Y3ŒHX1ÀÚÖé~UwçÆWgò˜MiékÅâWª¤úY­®uÓ7Å̉+È•V4­<tHì¯{ú`À1ÛøAå7h&)<29>{çìgá1>h‡Ìp#ý¨Zƒ3Y®‡rʪxä—È8Ë×ù{°BÖzÁ€4Ô†!FzU4¾(<28>>ë]¢yefø±°±:Ū‰DcµàÝ Ñl7èÎû¹©Ï»J~kç^¤ -[ø:rÙ,Ç=tÕÕïn^?†;±IWíØ,‰ééîó<>=<3D>ûÒü;Í’G¥]ΣBíÍæÑçÓ|€
ÚßNÎnõHeO<65>™7@^×m}±M`÷7Á4»â$¿2àÕöýŽùìL³Õ7ƤÅðu”„ÝówPÓª&ô|I1ÞÁø iÃ&E™Vàé+„Âg†ùáŠì?

View File

@ -0,0 +1,3 @@
x­“ÁjÜ0†ű(Bˇ<42>е%ym<79>ĺS!=´P(ä.Ű­VkIYoöé;rnşlˇ”â<E2809D>=Ň?ßü3<C3BC>[ëZÄKţ®űvv
Ź1Îw„,Ë’/ŰÜů<C39C>”R
ü,ą;X3ý¸$dśs˛Ţb´<62>ß–ŤĘ c¸ ¸©!WIďeoÔ‘én\L1zŁô=čBt3rZ™p•â¬sÖy<C396>ŻÚ7ËÎÄ'<27>s†ÉY»¬!ż[hęΚů«ŚăjFBmŻşř‡<06>?ĽĹH<6B>Ö:•%Ż<>¦PúÎfŕ üčíő•ĽdŠ_“ŞŞÂúţB ľ/č'zL<7A>·"E«ľ„á%]ÁAXUIXđsĺZŁ˝9 ÉŃł(ŞCĚäÔŤi<C5A4>;Ó÷VA7nŠ™;caŐwůđ<C5AF>ľÉ)l”ďĺ$7÷jR{ą pĺŤ~É ć¨`e,m6L‡Ąö€Ă*XŰKiĘŇóf§ťÁ Ł¦v~'pč¤U×9<C397>^ëłš†4DĆ<44>~ cMŇé…:%ÔůwĚşŤ˙h·„¶2ßćŚ}8·ü«ÖßYľ„Ť˘:ýŤÍO0%\

View File

@ -0,0 +1,4 @@
x}Tкnз@Мз_1umEB┼╨╘╛$╢$ ┘┤▄AMaуаFЦG└░#Vщv⌠(_Q╘⌡.зоЯ≈tЛЯд▐NбНэ{н╧В·+,ЛY═}vЖА ЖVK 
б∙╥F╨╛6н[-У╗lЛ9AК╚Г ЫЧ⌡╬Дё─Va▐╗qS√8Т│[о(╢ё6чV╟y`└\Jу uW╖*Ъ╟Ё<╛k)у╩√ртr²UHr╦vH╕■uhА╔-ч┐:╘,Е╦hЕC▀,щуVв■├МpO╪щ>─▌╩Я JckW┴v░└ж!╔ъб╒╧Q·HК"┤А▐LC⌠° ≤о│╛В8╢в÷_,bХВZХЩчok`╠Ь┌-r%@?l╣i╡DоB©MW┌╟▐^*т╓█#I_'=hЖ╨┐.4f86F┐╠ GcЁ?Ntы╟И┼ь╩.'▐?⌠┤⌠r|63V▌╔┘сО┐Ч,6 е╢4*uKиЦ/J╙vrZfl╛Zтo┐ ╖ырЫя,МХЩ╨oРчгFВ╙Ъ┘Z÷@{wтЗДТG&с╚ ░°Ч
╝C╗Я╧o≤╥\┌]РТё╕Ь┌э╖⌡НЕ░c÷ш╚Lс╩╝ёш`ё√u
$÷J▄dY12N л▓b\>≤≈%+Cснm}L╤а|║UцйЕ|6╠c%≈gт╖ИЕ Лgb)Ч┤S╩Нб·йы%√6" ЧъдW}²┌╩ЫKUА©

View File

View File

@ -0,0 +1 @@
9730915910c6cc7640f8af6063ffb93becf0414a

View File

@ -0,0 +1 @@
9730915910c6cc7640f8af6063ffb93becf0414a

View File

View File

@ -0,0 +1 @@
5d3e86e2a48adf7a308773f8f1b725d187c7c5ef

View File

@ -0,0 +1,14 @@
# Plugin owners
plugins/archlinux/ @ratijas
plugins/dbt/ @msempere
plugins/eza/ @pepoluan
plugins/genpass/ @atoponce
plugins/git-lfs/ @hellovietduc
plugins/gitfast/ @felipec
plugins/react-native @esthor
plugins/sdk/ @rgoldberg
plugins/shell-proxy/ @septs
plugins/starship/ @axieax
plugins/universalarchive/ @Konfekt
plugins/wp-cli/ @joshmedeski
plugins/zoxide/ @ajeetdsouza

View File

@ -0,0 +1,2 @@
github: [ohmyzsh, robbyrussell, mcornella, larson-carter, carlosala]
open_collective: ohmyzsh

View File

@ -0,0 +1,68 @@
name: Report a bug
description: Report a bug that isn't caused by Oh My Zsh. If unsure, use this form
body:
- type: markdown
attributes:
value: |
## Self Check
- Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
- Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help.
- type: textarea
validations:
required: true
attributes:
label: Describe the bug
description: A clear description of what the bug is.
- type: textarea
validations:
required: true
attributes:
label: Steps to reproduce
description: |
Steps to reproduce the problem.
placeholder: |
For example:
1. Enable plugin '...'
2. Run command '...' or try to complete command '...'
3. See error
- type: textarea
validations:
required: true
attributes:
label: Expected behavior
description: A brief description of what should happen.
- type: textarea
attributes:
label: Screenshots and recordings
description: |
If applicable, add screenshots to help explain your problem. You can also record an asciinema session: https://asciinema.org/
- type: input
validations:
required: true
attributes:
label: OS / Linux distribution
placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15...
- type: input
validations:
required: true
attributes:
label: Zsh version
description: Run `echo $ZSH_VERSION` to check.
placeholder: "5.6"
- type: input
validations:
required: true
attributes:
label: Terminal emulator
placeholder: iTerm2, GNOME Terminal, Terminal.app...
- type: dropdown
attributes:
label: If using WSL on Windows, which version of WSL
description: Run `wsl -l -v` to check.
options:
- WSL1
- WSL2
- type: textarea
attributes:
label: Additional context
description: Add any other context about the problem here. This can be themes, plugins, custom settings...

View File

@ -0,0 +1,77 @@
name: Report a bug in Oh My Zsh
description: Create a report to help us improve Oh My Zsh
labels: ['Bug']
body:
- type: markdown
attributes:
value: |
## Self Check
- **Make sure this bug only happens with Oh My Zsh enabled**.
- Look for similar errors in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
- Try reaching out on the [Discord server](https://discord.gg/ohmyzsh) for help.
- type: textarea
validations:
required: true
attributes:
label: Describe the bug
description: A clear description of what the bug is.
- type: textarea
validations:
required: true
attributes:
label: Steps to reproduce
description: |
Steps to reproduce the problem.
placeholder: |
For example:
1. Enable plugin '...'
2. Run command '...' or try to complete command '...'
3. See error
- type: textarea
validations:
required: true
attributes:
label: Expected behavior
description: A brief description of what should happen.
- type: textarea
attributes:
label: Screenshots and recordings
description: |
If applicable, add screenshots to help explain your problem. You can also record an asciinema session: https://asciinema.org/
- type: input
validations:
required: true
attributes:
label: OS / Linux distribution
placeholder: Windows 10, Ubuntu 20.04, Arch Linux, macOS 10.15...
- type: input
validations:
required: true
attributes:
label: Zsh version
description: Run `echo $ZSH_VERSION` to check.
placeholder: "5.6"
- type: input
validations:
required: true
attributes:
label: Oh My Zsh version
description: Run `omz version` to check.
placeholder: master (bf303965)
- type: input
validations:
required: true
attributes:
label: Terminal emulator
placeholder: iTerm2, GNOME Terminal, Terminal.app...
- type: dropdown
attributes:
label: If using WSL on Windows, which version of WSL
description: Run `wsl -l -v` to check.
options:
- WSL1
- WSL2
- type: textarea
attributes:
label: Additional context
description: Add any other context about the problem here. This can be themes, plugins, custom settings...

View File

@ -0,0 +1,8 @@
blank_issues_enabled: true
contact_links:
- name: Support
url: https://github.com/ohmyzsh/ohmyzsh/discussions
about: Ask the community for support
- name: Get help on Discord
url: https://discord.gg/ohmyzsh
about: Have a quick question? Join the Discord server and ask on the appropriate channel.

View File

@ -0,0 +1,37 @@
name: Feature request
description: Suggest a feature for Oh My Zsh
labels: ["Feature"]
body:
- type: markdown
attributes:
value: |
## Self Check
- Look for similar features in existing [GitHub Issues](https://github.com/ohmyzsh/ohmyzsh/issues?q=is%3Aissue) (open or closed).
- type: input
attributes:
label: If the feature request is for a plugin or theme, specify it here.
description: The name of the plugin or theme that you would like us to improve.
placeholder: e.g. Git plugin, Agnoster theme
- type: textarea
attributes:
label: If the feature solves a problem you have, specify it here.
description: A description of what the problem is.
placeholder: Ex. I'm always frustrated when...
- type: textarea
attributes:
label: Describe the proposed feature.
description: A description of what you want to happen. Be as specific as possible.
validations:
required: true
- type: textarea
attributes:
label: Describe alternatives you've considered
description: A description of any alternative solutions or features you've considered. This can also include other plugins or themes.
- type: textarea
attributes:
label: Additional context
description: Add any other context, screenshots or Discord conversations about the feature request here. Also if you have any PRs related to this issue that are already open that you would like us to look at.
- type: textarea
attributes:
label: Related Issues
description: Is there any open or closed issues that is related to this feature request? If so please link them below!

View File

@ -0,0 +1,20 @@
## Standards checklist:
<!-- Fill with an x the ones that apply. Example: [x] -->
- [ ] The PR title is descriptive.
- [ ] The PR doesn't replicate another PR which is already open.
- [ ] I have read the contribution guide and followed all the instructions.
- [ ] The code follows the code style guide detailed in the wiki.
- [ ] The code is mine or it's from somewhere with an MIT-compatible license.
- [ ] The code is efficient, to the best of my ability, and does not waste computer resources.
- [ ] The code is stable and I have tested it myself, to the best of my abilities.
- [ ] If the code introduces new aliases, I provide a valid use case for all plugin users down below.
## Changes:
- [...]
## Other comments:
...

View File

@ -0,0 +1,12 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: "weekly"
day: "sunday"
- package-ecosystem: "pip"
directory: "/.github/workflows/dependencies"
schedule:
interval: "weekly"
day: "sunday"

View File

@ -0,0 +1,31 @@
dependencies:
plugins/gitfast:
repo: felipec/git-completion
branch: master
version: tag:v2.0
postcopy: |
set -e
rm -rf git-completion.plugin.zsh Makefile README.adoc t tools
test -e git-completion.zsh && mv -f git-completion.zsh _git
plugins/z:
branch: master
repo: agkozak/zsh-z
version: afaf2965b41fdc6ca66066e09382726aa0b6aa04
precopy: |
set -e
test -e README.md && mv -f README.md MANUAL.md
postcopy: |
set -e
test -e _zshz && mv -f _zshz _z
test -e zsh-z.plugin.zsh && mv -f zsh-z.plugin.zsh z.plugin.zsh
plugins/history-substring-search:
repo: zsh-users/zsh-history-substring-search
branch: master
version: 8dd05bfcc12b0cd1ee9ea64be725b3d9f713cf64
precopy: |
set -e
rm -f zsh-history-substring-search.plugin.zsh
test -e zsh-history-substring-search.zsh && mv zsh-history-substring-search.zsh history-substring-search.zsh
postcopy: |
set -e
test -e dependencies/OMZ-README.md && cat dependencies/OMZ-README.md >> README.md

View File

@ -0,0 +1,29 @@
name: Update dependencies
on:
workflow_dispatch: {}
# schedule:
# - cron: '34 3 * * */8'
jobs:
check:
name: Check for updates
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Authenticate as @ohmyzsh
id: generate_token
uses: ohmyzsh/github-app-token@v2
with:
app_id: ${{ secrets.OHMYZSH_APP_ID }}
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Process dependencies
env:
GH_TOKEN: ${{ steps.generate_token.outputs.token }}
GIT_APP_NAME: ohmyzsh[bot]
GIT_APP_EMAIL: 54982679+ohmyzsh[bot]@users.noreply.github.com
TMP_DIR: ${{ runner.temp }}
run: |
pip install -r .github/workflows/dependencies/requirements.txt
python3 .github/workflows/dependencies/updater.py

View File

@ -0,0 +1,2 @@
PyYAML~=6.0.1
requests~=2.31.0

View File

@ -0,0 +1,450 @@
import os
import subprocess
import sys
import requests
import shutil
import yaml
from copy import deepcopy
from typing import Optional, TypedDict
# Get TMP_DIR variable from environment
TMP_DIR = os.path.join(os.environ.get("TMP_DIR", "/tmp"), "ohmyzsh")
# Relative path to dependencies.yml file
DEPS_YAML_FILE = ".github/dependencies.yml"
# Dry run flag
DRY_RUN = os.environ.get("DRY_RUN", "0") == "1"
import timeit
class CodeTimer:
def __init__(self, name=None):
self.name = " '" + name + "'" if name else ''
def __enter__(self):
self.start = timeit.default_timer()
def __exit__(self, exc_type, exc_value, traceback):
self.took = (timeit.default_timer() - self.start) * 1000.0
print('Code block' + self.name + ' took: ' + str(self.took) + ' ms')
### YAML representation
def str_presenter(dumper, data):
"""
Configures yaml for dumping multiline strings
Ref: https://stackoverflow.com/a/33300001
"""
if len(data.splitlines()) > 1: # check for multiline string
return dumper.represent_scalar('tag:yaml.org,2002:str', data, style='|')
return dumper.represent_scalar('tag:yaml.org,2002:str', data)
yaml.add_representer(str, str_presenter)
yaml.representer.SafeRepresenter.add_representer(str, str_presenter)
# Types
class DependencyDict(TypedDict):
repo: str
branch: str
version: str
precopy: Optional[str]
postcopy: Optional[str]
class DependencyYAML(TypedDict):
dependencies: dict[str, DependencyDict]
class UpdateStatus(TypedDict):
has_updates: bool
version: Optional[str]
compare_url: Optional[str]
head_ref: Optional[str]
head_url: Optional[str]
class CommandRunner:
class Exception(Exception):
def __init__(self, message, returncode, stage, stdout, stderr):
super().__init__(message)
self.returncode = returncode
self.stage = stage
self.stdout = stdout
self.stderr = stderr
@staticmethod
def run_or_fail(command: list[str], stage: str, *args, **kwargs):
if DRY_RUN and command[0] == "gh":
command.insert(0, "echo")
result = subprocess.run(command, *args, capture_output=True, **kwargs)
if result.returncode != 0:
raise CommandRunner.Exception(
f"{stage} command failed with exit code {result.returncode}", returncode=result.returncode,
stage=stage,
stdout=result.stdout.decode("utf-8"),
stderr=result.stderr.decode("utf-8")
)
return result
class DependencyStore:
store: DependencyYAML = {
"dependencies": {}
}
@staticmethod
def set(data: DependencyYAML):
DependencyStore.store = data
@staticmethod
def update_dependency_version(path: str, version: str) -> DependencyYAML:
with CodeTimer(f"store deepcopy: {path}"):
store_copy = deepcopy(DependencyStore.store)
dependency = store_copy["dependencies"].get(path, {})
dependency["version"] = version
store_copy["dependencies"][path] = dependency
return store_copy
@staticmethod
def write_store(file: str, data: DependencyYAML):
with open(file, "w") as yaml_file:
yaml.safe_dump(data, yaml_file, sort_keys=False)
class Dependency:
def __init__(self, path: str, values: DependencyDict):
self.path = path
self.values = values
self.name: str = ""
self.desc: str = ""
self.kind: str = ""
match path.split("/"):
case ["plugins", name]:
self.name = name
self.kind = "plugin"
self.desc = f"{name} plugin"
case ["themes", name]:
self.name = name.replace(".zsh-theme", "")
self.kind = "theme"
self.desc = f"{self.name} theme"
case _:
self.name = self.desc = path
def __str__(self):
output: str = ""
for key in DependencyDict.__dict__['__annotations__'].keys():
if key not in self.values:
output += f"{key}: None\n"
continue
value = self.values[key]
if "\n" not in value:
output += f"{key}: {value}\n"
else:
output += f"{key}:\n "
output += value.replace("\n", "\n ", value.count("\n") - 1)
return output
def update_or_notify(self):
# Print dependency settings
print(f"Processing {self.desc}...", file=sys.stderr)
print(self, file=sys.stderr)
# Check for updates
repo = self.values["repo"]
remote_branch = self.values["branch"]
version = self.values["version"]
is_tag = version.startswith("tag:")
try:
with CodeTimer(f"update check: {repo}"):
if is_tag:
status = GitHub.check_newer_tag(repo, version.replace("tag:", ""))
else:
status = GitHub.check_updates(repo, remote_branch, version)
if status["has_updates"]:
short_sha = status["head_ref"][:8]
new_version = status["version"] if is_tag else short_sha
try:
# Create new branch
branch = Git.create_branch(self.path, new_version)
# Update dependencies.yml file
self.__update_yaml(f"tag:{new_version}" if is_tag else status["version"])
# Update dependency files
self.__apply_upstream_changes()
# Add all changes and commit
Git.add_and_commit(self.name, short_sha)
# Push changes to remote
Git.push(branch)
# Create GitHub PR
GitHub.create_pr(
branch,
f"feat({self.name}): update to version {new_version}",
f"""## Description
Update for **{self.desc}**: update to version [{new_version}]({status['head_url']}).
Check out the [list of changes]({status['compare_url']}).
"""
)
# Clean up repository
Git.clean_repo()
except (CommandRunner.Exception, shutil.Error) as e:
# Handle exception on automatic update
match type(e):
case CommandRunner.Exception:
# Print error message
print(f"Error running {e.stage} command: {e.returncode}", file=sys.stderr)
print(e.stderr, file=sys.stderr)
case shutil.Error:
print(f"Error copying files: {e}", file=sys.stderr)
try:
Git.clean_repo()
except CommandRunner.Exception as e:
print(f"Error reverting repository to clean state: {e}", file=sys.stderr)
sys.exit(1)
# Create a GitHub issue to notify maintainer
title = f"{self.path}: update to {new_version}"
body = (
f"""## Description
There is a new version of `{self.name}` {self.kind} available.
New version: [{new_version}]({status['head_url']})
Check out the [list of changes]({status['compare_url']}).
"""
)
print(f"Creating GitHub issue", file=sys.stderr)
print(f"{title}\n\n{body}", file=sys.stderr)
GitHub.create_issue(title, body)
except Exception as e:
print(e, file=sys.stderr)
def __update_yaml(self, new_version: str) -> None:
dep_yaml = DependencyStore.update_dependency_version(self.path, new_version)
DependencyStore.write_store(DEPS_YAML_FILE, dep_yaml)
def __apply_upstream_changes(self) -> None:
# Patterns to ignore in copying files from upstream repo
GLOBAL_IGNORE = [
".git",
".github",
".gitignore"
]
path = os.path.abspath(self.path)
precopy = self.values.get("precopy")
postcopy = self.values.get("postcopy")
repo = self.values["repo"]
branch = self.values["branch"]
remote_url = f"https://github.com/{repo}.git"
repo_dir = os.path.join(TMP_DIR, repo)
# Clone repository
Git.clone(remote_url, branch, repo_dir, reclone=True)
# Run precopy on tmp repo
if precopy is not None:
print("Running precopy script:", end="\n ", file=sys.stderr)
print(precopy.replace("\n", "\n ", precopy.count("\n") - 1), file=sys.stderr)
CommandRunner.run_or_fail(["bash", "-c", precopy], cwd=repo_dir, stage="Precopy")
# Copy files from upstream repo
print(f"Copying files from {repo_dir} to {path}", file=sys.stderr)
shutil.copytree(repo_dir, path, dirs_exist_ok=True, ignore=shutil.ignore_patterns(*GLOBAL_IGNORE))
# Run postcopy on our repository
if postcopy is not None:
print("Running postcopy script:", end="\n ", file=sys.stderr)
print(postcopy.replace("\n", "\n ", postcopy.count("\n") - 1), file=sys.stderr)
CommandRunner.run_or_fail(["bash", "-c", postcopy], cwd=path, stage="Postcopy")
class Git:
default_branch = "master"
@staticmethod
def clone(remote_url: str, branch: str, repo_dir: str, reclone=False):
# If repo needs to be fresh
if reclone and os.path.exists(repo_dir):
shutil.rmtree(repo_dir)
# Clone repo in tmp directory and checkout branch
if not os.path.exists(repo_dir):
print(f"Cloning {remote_url} to {repo_dir} and checking out {branch}", file=sys.stderr)
CommandRunner.run_or_fail(["git", "clone", "--depth=1", "-b", branch, remote_url, repo_dir], stage="Clone")
@staticmethod
def create_branch(path: str, version: str):
# Get current branch name
result = CommandRunner.run_or_fail(["git", "rev-parse", "--abbrev-ref", "HEAD"], stage="GetDefaultBranch")
Git.default_branch = result.stdout.decode("utf-8").strip()
# Create new branch and return created branch name
branch_name = f"update/{path}/{version}"
CommandRunner.run_or_fail(["git", "checkout", "-b", branch_name], stage="CreateBranch")
return branch_name
@staticmethod
def add_and_commit(scope: str, version: str):
user_name = os.environ.get("GIT_APP_NAME")
user_email = os.environ.get("GIT_APP_EMAIL")
# Add all files to git staging
CommandRunner.run_or_fail(["git", "add", "-A", "-v"], stage="AddFiles")
# Reset environment and git config
clean_env = os.environ.copy()
clean_env["LANG"]="C.UTF-8"
clean_env["GIT_CONFIG_GLOBAL"]="/dev/null"
clean_env["GIT_CONFIG_NOSYSTEM"]="1"
# Commit with settings above
CommandRunner.run_or_fail([
"git",
"-c", f"user.name={user_name}",
"-c", f"user.email={user_email}",
"commit",
"-m", f"feat({scope}): update to {version}"
], stage="CreateCommit", env=clean_env)
@staticmethod
def push(branch: str):
CommandRunner.run_or_fail(["git", "push", "-u", "origin", branch], stage="PushBranch")
@staticmethod
def clean_repo():
CommandRunner.run_or_fail(["git", "reset", "--hard", "HEAD"], stage="ResetRepository")
CommandRunner.run_or_fail(["git", "checkout", Git.default_branch], stage="CheckoutDefaultBranch")
class GitHub:
@staticmethod
def check_newer_tag(repo, current_tag) -> UpdateStatus:
# GET /repos/:owner/:repo/git/refs/tags
url = f"https://api.github.com/repos/{repo}/git/refs/tags"
# Send a GET request to the GitHub API
response = requests.get(url)
# If the request was successful
if response.status_code == 200:
# Parse the JSON response
data = response.json()
if len(data) == 0:
return {
"has_updates": False,
}
latest_ref = data[-1]
latest_tag = latest_ref["ref"].replace("refs/tags/", "")
if latest_tag == current_tag:
return {
"has_updates": False,
}
return {
"has_updates": True,
"version": latest_tag,
"compare_url": f"https://github.com/{repo}/compare/{current_tag}...{latest_tag}",
"head_ref": latest_ref["object"]["sha"],
"head_url": f"https://github.com/{repo}/releases/tag/{latest_tag}",
}
else:
# If the request was not successful, raise an exception
raise Exception(f"GitHub API request failed with status code {response.status_code}: {response.json()}")
@staticmethod
def check_updates(repo, branch, version) -> UpdateStatus:
# TODO: add support for semver updating (based on tags)
# Check if upstream github repo has a new version
# GitHub API URL for comparing two commits
url = f"https://api.github.com/repos/{repo}/compare/{version}...{branch}"
# Send a GET request to the GitHub API
response = requests.get(url)
# If the request was successful
if response.status_code == 200:
# Parse the JSON response
data = response.json()
# If the base is behind the head, there is a newer version
has_updates = data["status"] != "identical"
if not has_updates:
return {
"has_updates": False,
}
return {
"has_updates": data["status"] != "identical",
"version": data["commits"][-1]["sha"],
"compare_url": data["permalink_url"],
"head_ref": data["commits"][-1]["sha"],
"head_url": data["commits"][-1]["html_url"]
}
else:
# If the request was not successful, raise an exception
raise Exception(f"GitHub API request failed with status code {response.status_code}: {response.json()}")
@staticmethod
def create_issue(title: str, body: str) -> None:
cmd = [
"gh",
"issue",
"create",
"-t", title,
"-b", body
]
CommandRunner.run_or_fail(cmd, stage="CreateIssue")
@staticmethod
def create_pr(branch: str, title: str, body: str) -> None:
cmd = [
"gh",
"pr",
"create",
"-B", Git.default_branch,
"-H", branch,
"-t", title,
"-b", body
]
CommandRunner.run_or_fail(cmd, stage="CreatePullRequest")
def main():
# Load the YAML file
with open(DEPS_YAML_FILE, "r") as yaml_file:
data: DependencyYAML = yaml.safe_load(yaml_file)
if "dependencies" not in data:
raise Exception(f"dependencies.yml not properly formatted")
# Cache YAML version
DependencyStore.set(data)
dependencies = data["dependencies"]
for path in dependencies:
dependency = Dependency(path, dependencies[path])
dependency.update_or_notify()
if __name__ == "__main__":
main()

View File

@ -0,0 +1,56 @@
name: Test and Deploy installer
on:
workflow_dispatch: {}
push:
paths:
- 'tools/install.sh'
- '.github/workflows/installer/**'
- '.github/workflows/installer.yml'
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: false
permissions:
contents: read # to checkout
jobs:
test:
name: Test installer
if: github.repository == 'ohmyzsh/ohmyzsh'
runs-on: ${{ matrix.os }}
strategy:
matrix:
os:
- ubuntu-latest
- macos-latest
steps:
- name: Set up git repository
uses: actions/checkout@v4
- name: Install zsh
if: runner.os == 'Linux'
run: sudo apt-get update; sudo apt-get install zsh
- name: Test installer
run: sh ./tools/install.sh
deploy:
name: Deploy installer in install.ohmyz.sh
if: github.ref == 'refs/heads/master'
runs-on: ubuntu-latest
environment: vercel
needs:
- test
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Vercel CLI
run: npm install -g vercel
- name: Setup project and deploy
env:
VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }}
VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }}
VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }}
run: |
cp tools/install.sh .github/workflows/installer/install.sh
cd .github/workflows/installer
vc deploy --prod -t "$VERCEL_TOKEN"

View File

@ -0,0 +1 @@
install.sh

View File

@ -0,0 +1,2 @@
/*
!/install.sh

View File

@ -0,0 +1,23 @@
{
"headers": [
{
"source": "/((?!favicon.ico).*)",
"headers": [
{
"key": "Content-Type",
"value": "text/plain"
},
{
"key": "Content-Disposition",
"value": "inline; filename=\"install.sh\""
}
]
}
],
"rewrites": [
{
"source": "/((?!favicon.ico|install.sh).*)",
"destination": "/install.sh"
}
]
}

View File

@ -0,0 +1,38 @@
name: CI
on:
pull_request:
types:
- opened
- synchronize
branches:
- master
push:
branches:
- master
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
tests:
name: Run tests
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
steps:
- name: Set up git repository
uses: actions/checkout@v4
- name: Install zsh
run: sudo apt-get update; sudo apt-get install zsh
- name: Check syntax
run: |
for file in ./oh-my-zsh.sh \
./lib/*.zsh \
./plugins/*/*.plugin.zsh \
./plugins/*/_* \
./themes/*.zsh-theme; do
zsh -n "$file" || return 1
done

View File

@ -0,0 +1,146 @@
name: Project tracking
on:
issues:
types: [opened, reopened]
pull_request_target:
types: [opened, reopened, synchronize]
concurrency:
group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}
cancel-in-progress: true
permissions: {}
jobs:
add-to-project:
name: Add to project
runs-on: ubuntu-latest
if: github.repository == 'ohmyzsh/ohmyzsh'
steps:
- name: Authenticate as @ohmyzsh
id: generate_token
uses: ohmyzsh/github-app-token@v2
with:
app_id: ${{ secrets.OHMYZSH_APP_ID }}
private_key: ${{ secrets.OHMYZSH_APP_PRIVATE_KEY }}
- name: Store app token
run: echo "GH_TOKEN=${{ steps.generate_token.outputs.token }}" >> "$GITHUB_ENV"
- name: Read project data
env:
ORGANIZATION: ohmyzsh
PROJECT_NUMBER: "1"
run: |
# Get Project data
gh api graphql -f query='
query($org: String!, $number: Int!) {
organization(login: $org){
projectV2(number: $number) {
id
fields(first:20) {
nodes {
... on ProjectV2Field {
id
name
}
}
}
}
}
}' -f org=$ORGANIZATION -F number=$PROJECT_NUMBER > project_data.json
# Parse project data
cat >> $GITHUB_ENV <<EOF
PROJECT_ID=$(jq '.data.organization.projectV2.id' project_data.json)
PLUGIN_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Plugin") | .id' project_data.json)
THEME_FIELD_ID=$(jq '.data.organization.projectV2.fields.nodes[] | select(.name == "Theme") | .id' project_data.json)
EOF
- name: Add to project
env:
ISSUE_OR_PR_ID: ${{ github.event.issue.node_id || github.event.pull_request.node_id }}
run: |
item_id="$(gh api graphql -f query='
mutation($project: ID!, $content: ID!) {
addProjectV2ItemById(input: {projectId: $project, contentId: $content}) {
item {
id
}
}
}
' -f project=$PROJECT_ID -f content=$ISSUE_OR_PR_ID --jq '.data.addProjectV2ItemById.item.id')"
echo "ITEM_ID=$item_id" >> $GITHUB_ENV
- name: Classify Pull Request
if: github.event_name == 'pull_request_target'
run: |
touch plugins.list themes.list
gh pr view ${{ github.event.pull_request.number }} \
--repo ${{ github.repository }} \
--json files --jq '.files.[].path' | awk -F/ '
/^plugins\// {
plugins[$2] = 1
}
/^themes\// {
gsub(/\.zsh-theme$/, "", $2)
themes[$2] = 1
}
END {
for (plugin in plugins) {
print plugin >> "plugins.list"
}
for (theme in themes) {
print theme >> "themes.list"
}
}
'
# If only one plugin is modified, add it to the plugin field
if [[ $(wc -l < plugins.list) = 1 ]]; then
echo "PLUGIN=$(cat plugins.list)" >> $GITHUB_ENV
fi
# If only one theme is modified, add it to the theme field
if [[ $(wc -l < themes.list) = 1 ]]; then
echo "THEME=$(cat themes.list)" >> $GITHUB_ENV
fi
- name: Fill Pull Request fields in project
if: github.event_name == 'pull_request_target'
run: |
gh api graphql -f query='
mutation (
$project: ID!
$item: ID!
$plugin_field: ID!
$plugin_value: String!
$theme_field: ID!
$theme_value: String!
) {
set_plugin: updateProjectV2ItemFieldValue(input: {
projectId: $project
itemId: $item
fieldId: $plugin_field
value: {
text: $plugin_value
}
}) {
projectV2Item {
id
}
}
set_theme: updateProjectV2ItemFieldValue(input: {
projectId: $project
itemId: $item
fieldId: $theme_field
value: {
text: $theme_value
}
}) {
projectV2Item {
id
}
}
}
' -f project=$PROJECT_ID -f item=$ITEM_ID \
-f plugin_field=$PLUGIN_FIELD_ID -f plugin_value=$PLUGIN \
-f theme_field=$THEME_FIELD_ID -f theme_value=$THEME \
--silent

View File

@ -0,0 +1,12 @@
# custom files
custom/
# temp files directories
cache/
log/
*.swp
.DS_Store
# editor configs
.vscode
.idea

View File

@ -0,0 +1,5 @@
FROM gitpod/workspace-full
RUN sudo apt-get update && \
sudo apt-get install -y zsh && \
sudo rm -rf /var/lib/apt/lists/*

View File

@ -0,0 +1,9 @@
image:
file: .gitpod.Dockerfile
tasks:
- init: |
export EDITOR="command gp open -w" VISUAL="command gp open -w"
cp -f /workspace/ohmyzsh/templates/zshrc.zsh-template ~/.zshrc
ln -sf /workspace/ohmyzsh ~/.oh-my-zsh
command: exec zsh

View File

@ -0,0 +1,4 @@
{
"printWidth": 110,
"proseWrap": "always"
}

10
dot_oh-my-zsh/lib/bzr.zsh Normal file
View File

@ -0,0 +1,10 @@
## Bazaar integration
## Just works with the GIT integration just add $(bzr_prompt_info) to the PROMPT
function bzr_prompt_info() {
BZR_CB=`bzr nick 2> /dev/null | grep -v "ERROR" | cut -d ":" -f2 | awk -F / '{print "bzr::"$1}'`
if [ -n "$BZR_CB" ]; then
BZR_DIRTY=""
[[ -n `bzr status` ]] && BZR_DIRTY=" %{$fg[red]%} * %{$fg[green]%}"
echo "$ZSH_THEME_SCM_PROMPT_PREFIX$BZR_CB$BZR_DIRTY$ZSH_THEME_GIT_PROMPT_SUFFIX"
fi
}

821
dot_oh-my-zsh/lib/cli.zsh Normal file
View File

@ -0,0 +1,821 @@
#!/usr/bin/env zsh
function omz {
[[ $# -gt 0 ]] || {
_omz::help
return 1
}
local command="$1"
shift
# Subcommand functions start with _ so that they don't
# appear as completion entries when looking for `omz`
(( ${+functions[_omz::$command]} )) || {
_omz::help
return 1
}
_omz::$command "$@"
}
function _omz {
local -a cmds subcmds
cmds=(
'changelog:Print the changelog'
'help:Usage information'
'plugin:Manage plugins'
'pr:Manage Oh My Zsh Pull Requests'
'reload:Reload the current zsh session'
'theme:Manage themes'
'update:Update Oh My Zsh'
'version:Show the version'
)
if (( CURRENT == 2 )); then
_describe 'command' cmds
elif (( CURRENT == 3 )); then
case "$words[2]" in
changelog) local -a refs
refs=("${(@f)$(builtin cd -q "$ZSH"; command git for-each-ref --format="%(refname:short):%(subject)" refs/heads refs/tags)}")
_describe 'command' refs ;;
plugin) subcmds=(
'disable:Disable plugin(s)'
'enable:Enable plugin(s)'
'info:Get plugin information'
'list:List plugins'
'load:Load plugin(s)'
)
_describe 'command' subcmds ;;
pr) subcmds=('clean:Delete all Pull Request branches' 'test:Test a Pull Request')
_describe 'command' subcmds ;;
theme) subcmds=('list:List themes' 'set:Set a theme in your .zshrc file' 'use:Load a theme')
_describe 'command' subcmds ;;
esac
elif (( CURRENT == 4 )); then
case "${words[2]}::${words[3]}" in
plugin::(disable|enable|load))
local -aU valid_plugins
if [[ "${words[3]}" = disable ]]; then
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
_describe 'plugin' valid_plugins ;;
plugin::info)
local -aU plugins
plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
_describe 'plugin' plugins ;;
theme::(set|use))
local -aU themes
themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r) "$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
_describe 'theme' themes ;;
esac
elif (( CURRENT > 4 )); then
case "${words[2]}::${words[3]}" in
plugin::(enable|disable|load))
local -aU valid_plugins
if [[ "${words[3]}" = disable ]]; then
# if command is "disable", only offer already enabled plugins
valid_plugins=($plugins)
else
valid_plugins=("$ZSH"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t) "$ZSH_CUSTOM"/plugins/*/{_*,*.plugin.zsh}(-.N:h:t))
# if command is "enable", remove already enabled plugins
[[ "${words[3]}" = enable ]] && valid_plugins=(${valid_plugins:|plugins})
fi
# Remove plugins already passed as arguments
# NOTE: $(( CURRENT - 1 )) is the last plugin argument completely passed, i.e. that which
# has a space after them. This is to avoid removing plugins partially passed, which makes
# the completion not add a space after the completed plugin.
local -a args
args=(${words[4,$(( CURRENT - 1))]})
valid_plugins=(${valid_plugins:|args})
_describe 'plugin' valid_plugins ;;
esac
fi
return 0
}
# If run from a script, do not set the completion function
if (( ${+functions[compdef]} )); then
compdef _omz omz
fi
## Utility functions
function _omz::confirm {
# If question supplied, ask it before reading the answer
# NOTE: uses the logname of the caller function
if [[ -n "$1" ]]; then
_omz::log prompt "$1" "${${functrace[1]#_}%:*}"
fi
# Read one character
read -r -k 1
# If no newline entered, add a newline
if [[ "$REPLY" != $'\n' ]]; then
echo
fi
}
function _omz::log {
# if promptsubst is set, a message with `` or $()
# will be run even if quoted due to `print -P`
setopt localoptions nopromptsubst
# $1 = info|warn|error|debug
# $2 = text
# $3 = (optional) name of the logger
local logtype=$1
local logname=${3:-${${functrace[1]#_}%:*}}
# Don't print anything if debug is not active
if [[ $logtype = debug && -z $_OMZ_DEBUG ]]; then
return
fi
# Choose coloring based on log type
case "$logtype" in
prompt) print -Pn "%S%F{blue}$logname%f%s: $2" ;;
debug) print -P "%F{white}$logname%f: $2" ;;
info) print -P "%F{green}$logname%f: $2" ;;
warn) print -P "%S%F{yellow}$logname%f%s: $2" ;;
error) print -P "%S%F{red}$logname%f%s: $2" ;;
esac >&2
}
## User-facing commands
function _omz::help {
cat >&2 <<EOF
Usage: omz <command> [options]
Available commands:
help Print this help message
changelog Print the changelog
plugin <command> Manage plugins
pr <command> Manage Oh My Zsh Pull Requests
reload Reload the current zsh session
theme <command> Manage themes
update Update Oh My Zsh
version Show the version
EOF
}
function _omz::changelog {
local version=${1:-HEAD} format=${3:-"--text"}
if (
builtin cd -q "$ZSH"
! command git show-ref --verify refs/heads/$version && \
! command git show-ref --verify refs/tags/$version && \
! command git rev-parse --verify "${version}^{commit}"
) &>/dev/null; then
cat >&2 <<EOF
Usage: ${(j: :)${(s.::.)0#_}} [version]
NOTE: <version> must be a valid branch, tag or commit.
EOF
return 1
fi
"$ZSH/tools/changelog.sh" "$version" "${2:-}" "$format"
}
function _omz::plugin {
(( $# > 0 && $+functions[$0::$1] )) || {
cat >&2 <<EOF
Usage: ${(j: :)${(s.::.)0#_}} <command> [options]
Available commands:
disable <plugin> Disable plugin(s)
enable <plugin> Enable plugin(s)
info <plugin> Get information of a plugin
list List all available Oh My Zsh plugins
load <plugin> Load plugin(s)
EOF
return 1
}
local command="$1"
shift
$0::$command "$@"
}
function _omz::plugin::disable {
if [[ -z "$1" ]]; then
echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]"
return 1
fi
# Check that plugin is in $plugins
local -a dis_plugins
for plugin in "$@"; do
if [[ ${plugins[(Ie)$plugin]} -eq 0 ]]; then
_omz::log warn "plugin '$plugin' is not enabled."
continue
fi
dis_plugins+=("$plugin")
done
# Exit if there are no enabled plugins to disable
if [[ ${#dis_plugins} -eq 0 ]]; then
return 1
fi
# Remove plugins substitution awk script
local awk_subst_plugins="\
gsub(/[ \t]+(${(j:|:)dis_plugins})/, \"\") # with spaces before
gsub(/(${(j:|:)dis_plugins})[ \t]+/, \"\") # with spaces after
gsub(/\((${(j:|:)dis_plugins})\)/, \"\") # without spaces (only plugin)
"
# Disable plugins awk script
local awk_script="
# if plugins=() is in oneline form, substitute disabled plugins and go to next line
/^[ \t]*plugins=\([^#]+\).*\$/ {
$awk_subst_plugins
print \$0
next
}
# if plugins=() is in multiline form, enable multi flag and disable plugins if they're there
/^[ \t]*plugins=\(/ {
multi=1
$awk_subst_plugins
print \$0
next
}
# if multi flag is enabled and we find a valid closing parenthesis, remove plugins and disable multi flag
multi == 1 && /^[^#]*\)/ {
multi=0
$awk_subst_plugins
print \$0
next
}
multi == 1 && length(\$0) > 0 {
$awk_subst_plugins
if (length(\$0) > 0) print \$0
next
}
{ print \$0 }
"
local zdot="${ZDOTDIR:-$HOME}"
local zshrc="${${:-"${zdot}/.zshrc"}:A}"
awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \
&& command cp -f "$zshrc" "$zdot/.zshrc.bck" \
&& command mv -f "$zdot/.zshrc.new" "$zshrc"
# Exit if the new .zshrc file wasn't created correctly
[[ $? -eq 0 ]] || {
local ret=$?
_omz::log error "error disabling plugins."
return $ret
}
# Exit if the new .zshrc file has syntax errors
if ! command zsh -n "$zdot/.zshrc"; then
_omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
command mv -f "$zdot/.zshrc.bck" "$zshrc"
return 1
fi
# Restart the zsh session if there were no errors
_omz::log info "plugins disabled: ${(j:, :)dis_plugins}."
# Only reload zsh if run in an interactive session
[[ ! -o interactive ]] || _omz::reload
}
function _omz::plugin::enable {
if [[ -z "$1" ]]; then
echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]"
return 1
fi
# Check that plugin is not in $plugins
local -a add_plugins
for plugin in "$@"; do
if [[ ${plugins[(Ie)$plugin]} -ne 0 ]]; then
_omz::log warn "plugin '$plugin' is already enabled."
continue
fi
add_plugins+=("$plugin")
done
# Exit if there are no plugins to enable
if [[ ${#add_plugins} -eq 0 ]]; then
return 1
fi
# Enable plugins awk script
local awk_script="
# if plugins=() is in oneline form, substitute ) with new plugins and go to the next line
/^[ \t]*plugins=\([^#]+\).*\$/ {
sub(/\)/, \" $add_plugins&\")
print \$0
next
}
# if plugins=() is in multiline form, enable multi flag
/^[ \t]*plugins=\(/ {
multi=1
}
# if multi flag is enabled and we find a valid closing parenthesis,
# add new plugins and disable multi flag
multi == 1 && /^[^#]*\)/ {
multi=0
sub(/\)/, \" $add_plugins&\")
print \$0
next
}
{ print \$0 }
"
local zdot="${ZDOTDIR:-$HOME}"
local zshrc="${${:-"${zdot}/.zshrc"}:A}"
awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \
&& command cp -f "$zshrc" "$zdot/.zshrc.bck" \
&& command mv -f "$zdot/.zshrc.new" "$zshrc"
# Exit if the new .zshrc file wasn't created correctly
[[ $? -eq 0 ]] || {
local ret=$?
_omz::log error "error enabling plugins."
return $ret
}
# Exit if the new .zshrc file has syntax errors
if ! command zsh -n "$zdot/.zshrc"; then
_omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
command mv -f "$zdot/.zshrc.bck" "$zshrc"
return 1
fi
# Restart the zsh session if there were no errors
_omz::log info "plugins enabled: ${(j:, :)add_plugins}."
# Only reload zsh if run in an interactive session
[[ ! -o interactive ]] || _omz::reload
}
function _omz::plugin::info {
if [[ -z "$1" ]]; then
echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin>"
return 1
fi
local readme
for readme in "$ZSH_CUSTOM/plugins/$1/README.md" "$ZSH/plugins/$1/README.md"; do
if [[ -f "$readme" ]]; then
(( ${+commands[less]} )) && less "$readme" || cat "$readme"
return 0
fi
done
if [[ -d "$ZSH_CUSTOM/plugins/$1" || -d "$ZSH/plugins/$1" ]]; then
_omz::log error "the '$1' plugin doesn't have a README file"
else
_omz::log error "'$1' plugin not found"
fi
return 1
}
function _omz::plugin::list {
local -a custom_plugins builtin_plugins
custom_plugins=("$ZSH_CUSTOM"/plugins/*(-/N:t))
builtin_plugins=("$ZSH"/plugins/*(-/N:t))
# If the command is being piped, print all found line by line
if [[ ! -t 1 ]]; then
print -l ${(q-)custom_plugins} ${(q-)builtin_plugins}
return
fi
if (( ${#custom_plugins} )); then
print -P "%U%BCustom plugins%b%u:"
print -lac ${(q-)custom_plugins}
fi
if (( ${#builtin_plugins} )); then
(( ${#custom_plugins} )) && echo # add a line of separation
print -P "%U%BBuilt-in plugins%b%u:"
print -lac ${(q-)builtin_plugins}
fi
}
function _omz::plugin::load {
if [[ -z "$1" ]]; then
echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <plugin> [...]"
return 1
fi
local plugin base has_completion=0
for plugin in "$@"; do
if [[ -d "$ZSH_CUSTOM/plugins/$plugin" ]]; then
base="$ZSH_CUSTOM/plugins/$plugin"
elif [[ -d "$ZSH/plugins/$plugin" ]]; then
base="$ZSH/plugins/$plugin"
else
_omz::log warn "plugin '$plugin' not found"
continue
fi
# Check if its a valid plugin
if [[ ! -f "$base/_$plugin" && ! -f "$base/$plugin.plugin.zsh" ]]; then
_omz::log warn "'$plugin' is not a valid plugin"
continue
# It it is a valid plugin, add its directory to $fpath unless it is already there
elif (( ! ${fpath[(Ie)$base]} )); then
fpath=("$base" $fpath)
fi
# Check if it has completion to reload compinit
local -a comp_files
comp_files=($base/_*(N))
has_completion=$(( $#comp_files > 0 ))
# Load the plugin
if [[ -f "$base/$plugin.plugin.zsh" ]]; then
source "$base/$plugin.plugin.zsh"
fi
done
# If we have completion, we need to reload the completion
# We pass -D to avoid generating a new dump file, which would overwrite our
# current one for the next session (and we don't want that because we're not
# actually enabling the plugins for the next session).
# Note that we still have to pass -d "$_comp_dumpfile", so that compinit
# doesn't use the default zcompdump location (${ZDOTDIR:-$HOME}/.zcompdump).
if (( has_completion )); then
compinit -D -d "$_comp_dumpfile"
fi
}
function _omz::pr {
(( $# > 0 && $+functions[$0::$1] )) || {
cat >&2 <<EOF
Usage: ${(j: :)${(s.::.)0#_}} <command> [options]
Available commands:
clean Delete all PR branches (ohmyzsh/pull-*)
test <PR_number_or_URL> Fetch PR #NUMBER and rebase against master
EOF
return 1
}
local command="$1"
shift
$0::$command "$@"
}
function _omz::pr::clean {
(
set -e
builtin cd -q "$ZSH"
# Check if there are PR branches
local fmt branches
fmt="%(color:bold blue)%(align:18,right)%(refname:short)%(end)%(color:reset) %(color:dim bold red)%(objectname:short)%(color:reset) %(color:yellow)%(contents:subject)"
branches="$(command git for-each-ref --sort=-committerdate --color --format="$fmt" "refs/heads/ohmyzsh/pull-*")"
# Exit if there are no PR branches
if [[ -z "$branches" ]]; then
_omz::log info "there are no Pull Request branches to remove."
return
fi
# Print found PR branches
echo "$branches\n"
# Confirm before removing the branches
_omz::confirm "do you want remove these Pull Request branches? [Y/n] "
# Only proceed if the answer is a valid yes option
[[ "$REPLY" != [yY$'\n'] ]] && return
_omz::log info "removing all Oh My Zsh Pull Request branches..."
command git branch --list 'ohmyzsh/pull-*' | while read branch; do
command git branch -D "$branch"
done
)
}
function _omz::pr::test {
# Allow $1 to be a URL to the pull request
if [[ "$1" = https://* ]]; then
1="${1:t}"
fi
# Check the input
if ! [[ -n "$1" && "$1" =~ ^[[:digit:]]+$ ]]; then
echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <PR_NUMBER_or_URL>"
return 1
fi
# Save current git HEAD
local branch
branch=$(builtin cd -q "$ZSH"; git symbolic-ref --short HEAD) || {
_omz::log error "error when getting the current git branch. Aborting..."
return 1
}
# Fetch PR onto ohmyzsh/pull-<PR_NUMBER> branch and rebase against master
# If any of these operations fail, undo the changes made
(
set -e
builtin cd -q "$ZSH"
# Get the ohmyzsh git remote
command git remote -v | while read remote url _; do
case "$url" in
https://github.com/ohmyzsh/ohmyzsh(|.git)) found=1; break ;;
git@github.com:ohmyzsh/ohmyzsh(|.git)) found=1; break ;;
esac
done
(( $found )) || {
_omz::log error "could not found the ohmyzsh git remote. Aborting..."
return 1
}
# Fetch pull request head
_omz::log info "fetching PR #$1 to ohmyzsh/pull-$1..."
command git fetch -f "$remote" refs/pull/$1/head:ohmyzsh/pull-$1 || {
_omz::log error "error when trying to fetch PR #$1."
return 1
}
# Rebase pull request branch against the current master
_omz::log info "rebasing PR #$1..."
local ret gpgsign
{
# Back up commit.gpgsign setting: use --local to get the current repository
# setting, not the global one. If --local is not a known option, it will
# exit with a 129 status code.
gpgsign=$(command git config --local commit.gpgsign 2>/dev/null) || ret=$?
[[ $ret -ne 129 ]] || gpgsign=$(command git config commit.gpgsign 2>/dev/null)
command git config commit.gpgsign false
command git rebase master ohmyzsh/pull-$1 || {
command git rebase --abort &>/dev/null
_omz::log warn "could not rebase PR #$1 on top of master."
_omz::log warn "you might not see the latest stable changes."
_omz::log info "run \`zsh\` to test the changes."
return 1
}
} always {
case "$gpgsign" in
"") command git config --unset commit.gpgsign ;;
*) command git config commit.gpgsign "$gpgsign" ;;
esac
}
_omz::log info "fetch of PR #${1} successful."
)
# If there was an error, abort running zsh to test the PR
[[ $? -eq 0 ]] || return 1
# Run zsh to test the changes
_omz::log info "running \`zsh\` to test the changes. Run \`exit\` to go back."
command zsh -l
# After testing, go back to the previous HEAD if the user wants
_omz::confirm "do you want to go back to the previous branch? [Y/n] "
# Only proceed if the answer is a valid yes option
[[ "$REPLY" != [yY$'\n'] ]] && return
(
set -e
builtin cd -q "$ZSH"
command git checkout "$branch" -- || {
_omz::log error "could not go back to the previous branch ('$branch')."
return 1
}
)
}
function _omz::reload {
# Delete current completion cache
command rm -f $_comp_dumpfile $ZSH_COMPDUMP
# Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# Check whether to run a login shell
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
}
function _omz::theme {
(( $# > 0 && $+functions[$0::$1] )) || {
cat >&2 <<EOF
Usage: ${(j: :)${(s.::.)0#_}} <command> [options]
Available commands:
list List all available Oh My Zsh themes
set <theme> Set a theme in your .zshrc file
use <theme> Load a theme
EOF
return 1
}
local command="$1"
shift
$0::$command "$@"
}
function _omz::theme::list {
local -a custom_themes builtin_themes
custom_themes=("$ZSH_CUSTOM"/**/*.zsh-theme(-.N:r:gs:"$ZSH_CUSTOM"/themes/:::gs:"$ZSH_CUSTOM"/:::))
builtin_themes=("$ZSH"/themes/*.zsh-theme(-.N:t:r))
# If the command is being piped, print all found line by line
if [[ ! -t 1 ]]; then
print -l ${(q-)custom_themes} ${(q-)builtin_themes}
return
fi
# Print theme in use
if [[ -n "$ZSH_THEME" ]]; then
print -Pn "%U%BCurrent theme%b%u: "
[[ $ZSH_THEME = random ]] && echo "$RANDOM_THEME (via random)" || echo "$ZSH_THEME"
echo
fi
# Print custom themes if there are any
if (( ${#custom_themes} )); then
print -P "%U%BCustom themes%b%u:"
print -lac ${(q-)custom_themes}
echo
fi
# Print built-in themes
print -P "%U%BBuilt-in themes%b%u:"
print -lac ${(q-)builtin_themes}
}
function _omz::theme::set {
if [[ -z "$1" ]]; then
echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <theme>"
return 1
fi
# Check that theme exists
if [[ ! -f "$ZSH_CUSTOM/$1.zsh-theme" ]] \
&& [[ ! -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]] \
&& [[ ! -f "$ZSH/themes/$1.zsh-theme" ]]; then
_omz::log error "%B$1%b theme not found"
return 1
fi
# Enable theme in .zshrc
local awk_script='
!set && /^[ \t]*ZSH_THEME=[^#]+.*$/ {
set=1
sub(/^[ \t]*ZSH_THEME=[^#]+.*$/, "ZSH_THEME=\"'$1'\" # set by `omz`")
print $0
next
}
{ print $0 }
END {
# If no ZSH_THEME= line was found, return an error
if (!set) exit 1
}
'
local zdot="${ZDOTDIR:-$HOME}"
local zshrc="${${:-"${zdot}/.zshrc"}:A}"
awk "$awk_script" "$zshrc" > "$zdot/.zshrc.new" \
|| {
# Prepend ZSH_THEME= line to .zshrc if it doesn't exist
cat <<EOF
ZSH_THEME="$1" # set by \`omz\`
EOF
cat "$zdot/.zshrc"
} > "$zdot/.zshrc.new" \
&& command cp -f "$zshrc" "$zdot/.zshrc.bck" \
&& command mv -f "$zdot/.zshrc.new" "$zshrc"
# Exit if the new .zshrc file wasn't created correctly
[[ $? -eq 0 ]] || {
local ret=$?
_omz::log error "error setting theme."
return $ret
}
# Exit if the new .zshrc file has syntax errors
if ! command zsh -n "$zdot/.zshrc"; then
_omz::log error "broken syntax in '"${zdot/#$HOME/\~}/.zshrc"'. Rolling back changes..."
command mv -f "$zdot/.zshrc.bck" "$zshrc"
return 1
fi
# Restart the zsh session if there were no errors
_omz::log info "'$1' theme set correctly."
# Only reload zsh if run in an interactive session
[[ ! -o interactive ]] || _omz::reload
}
function _omz::theme::use {
if [[ -z "$1" ]]; then
echo >&2 "Usage: ${(j: :)${(s.::.)0#_}} <theme>"
return 1
fi
# Respect compatibility with old lookup order
if [[ -f "$ZSH_CUSTOM/$1.zsh-theme" ]]; then
source "$ZSH_CUSTOM/$1.zsh-theme"
elif [[ -f "$ZSH_CUSTOM/themes/$1.zsh-theme" ]]; then
source "$ZSH_CUSTOM/themes/$1.zsh-theme"
elif [[ -f "$ZSH/themes/$1.zsh-theme" ]]; then
source "$ZSH/themes/$1.zsh-theme"
else
_omz::log error "%B$1%b theme not found"
return 1
fi
# Update theme settings
ZSH_THEME="$1"
[[ $1 = random ]] || unset RANDOM_THEME
}
function _omz::update {
local last_commit=$(builtin cd -q "$ZSH"; git rev-parse HEAD)
# Run update script
zstyle -s ':omz:update' verbose verbose_mode || verbose_mode=default
if [[ "$1" != --unattended ]]; then
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -i -v $verbose_mode || return $?
else
ZSH="$ZSH" command zsh -f "$ZSH/tools/upgrade.sh" -v $verbose_mode || return $?
fi
# Update last updated file
zmodload zsh/datetime
echo "LAST_EPOCH=$(( EPOCHSECONDS / 60 / 60 / 24 ))" >! "${ZSH_CACHE_DIR}/.zsh-update"
# Remove update lock if it exists
command rm -rf "$ZSH/log/update.lock"
# Restart the zsh session if there were changes
if [[ "$1" != --unattended && "$(builtin cd -q "$ZSH"; git rev-parse HEAD)" != "$last_commit" ]]; then
# Old zsh versions don't have ZSH_ARGZERO
local zsh="${ZSH_ARGZERO:-${functrace[-1]%:*}}"
# Check whether to run a login shell
[[ "$zsh" = -* || -o login ]] && exec -l "${zsh#-}" || exec "$zsh"
fi
}
function _omz::version {
(
builtin cd -q "$ZSH"
# Get the version name:
# 1) try tag-like version
# 2) try branch name
# 3) try name-rev (tag~<rev> or branch~<rev>)
local version
version=$(command git describe --tags HEAD 2>/dev/null) \
|| version=$(command git symbolic-ref --quiet --short HEAD 2>/dev/null) \
|| version=$(command git name-rev --no-undefined --name-only --exclude="remotes/*" HEAD 2>/dev/null) \
|| version="<detached>"
# Get short hash for the current HEAD
local commit=$(command git rev-parse --short HEAD 2>/dev/null)
# Show version and commit hash
printf "%s (%s)\n" "$version" "$commit"
)
}

View File

@ -0,0 +1,107 @@
# System clipboard integration
#
# This file has support for doing system clipboard copy and paste operations
# from the command line in a generic cross-platform fashion.
#
# This is uses essentially the same heuristic as neovim, with the additional
# special support for Cygwin.
# See: https://github.com/neovim/neovim/blob/e682d799fa3cf2e80a02d00c6ea874599d58f0e7/runtime/autoload/provider/clipboard.vim#L55-L121
#
# - pbcopy, pbpaste (macOS)
# - cygwin (Windows running Cygwin)
# - wl-copy, wl-paste (if $WAYLAND_DISPLAY is set)
# - xsel (if $DISPLAY is set)
# - xclip (if $DISPLAY is set)
# - lemonade (for SSH) https://github.com/pocke/lemonade
# - doitclient (for SSH) http://www.chiark.greenend.org.uk/~sgtatham/doit/
# - win32yank (Windows)
# - tmux (if $TMUX is set)
#
# Defines two functions, clipcopy and clippaste, based on the detected platform.
##
#
# clipcopy - Copy data to clipboard
#
# Usage:
#
# <command> | clipcopy - copies stdin to clipboard
#
# clipcopy <file> - copies a file's contents to clipboard
#
##
#
# clippaste - "Paste" data from clipboard to stdout
#
# Usage:
#
# clippaste - writes clipboard's contents to stdout
#
# clippaste | <command> - pastes contents and pipes it to another process
#
# clippaste > <file> - paste contents to a file
#
# Examples:
#
# # Pipe to another process
# clippaste | grep foo
#
# # Paste to a file
# clippaste > file.txt
#
function detect-clipboard() {
emulate -L zsh
if [[ "${OSTYPE}" == darwin* ]] && (( ${+commands[pbcopy]} )) && (( ${+commands[pbpaste]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | pbcopy; }
function clippaste() { pbpaste; }
elif [[ "${OSTYPE}" == (cygwin|msys)* ]]; then
function clipcopy() { cat "${1:-/dev/stdin}" > /dev/clipboard; }
function clippaste() { cat /dev/clipboard; }
elif (( $+commands[clip.exe] )) && (( $+commands[powershell.exe] )); then
function clipcopy() { cat "${1:-/dev/stdin}" | clip.exe; }
function clippaste() { powershell.exe -noprofile -command Get-Clipboard; }
elif [ -n "${WAYLAND_DISPLAY:-}" ] && (( ${+commands[wl-copy]} )) && (( ${+commands[wl-paste]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | wl-copy &>/dev/null &|; }
function clippaste() { wl-paste --no-newline; }
elif [ -n "${DISPLAY:-}" ] && (( ${+commands[xsel]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | xsel --clipboard --input; }
function clippaste() { xsel --clipboard --output; }
elif [ -n "${DISPLAY:-}" ] && (( ${+commands[xclip]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | xclip -selection clipboard -in &>/dev/null &|; }
function clippaste() { xclip -out -selection clipboard; }
elif (( ${+commands[lemonade]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | lemonade copy; }
function clippaste() { lemonade paste; }
elif (( ${+commands[doitclient]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | doitclient wclip; }
function clippaste() { doitclient wclip -r; }
elif (( ${+commands[win32yank]} )); then
function clipcopy() { cat "${1:-/dev/stdin}" | win32yank -i; }
function clippaste() { win32yank -o; }
elif [[ $OSTYPE == linux-android* ]] && (( $+commands[termux-clipboard-set] )); then
function clipcopy() { cat "${1:-/dev/stdin}" | termux-clipboard-set; }
function clippaste() { termux-clipboard-get; }
elif [ -n "${TMUX:-}" ] && (( ${+commands[tmux]} )); then
function clipcopy() { tmux load-buffer "${1:--}"; }
function clippaste() { tmux save-buffer -; }
else
function _retry_clipboard_detection_or_fail() {
local clipcmd="${1}"; shift
if detect-clipboard; then
"${clipcmd}" "$@"
else
print "${clipcmd}: Platform $OSTYPE not supported or xclip/xsel not installed" >&2
return 1
fi
}
function clipcopy() { _retry_clipboard_detection_or_fail clipcopy "$@"; }
function clippaste() { _retry_clipboard_detection_or_fail clippaste "$@"; }
return 1
fi
}
function clipcopy clippaste {
unfunction clipcopy clippaste
detect-clipboard || true # let one retry
"$0" "$@"
}

View File

@ -0,0 +1,44 @@
# Handle completions insecurities (i.e., completion-dependent directories with
# insecure ownership or permissions) by:
#
# * Human-readably notifying the user of these insecurities.
function handle_completion_insecurities() {
# List of the absolute paths of all unique insecure directories, split on
# newline from compaudit()'s output resembling:
#
# There are insecure directories:
# /usr/share/zsh/site-functions
# /usr/share/zsh/5.0.6/functions
# /usr/share/zsh
# /usr/share/zsh/5.0.6
#
# Since the ignorable first line is printed to stderr and thus not captured,
# stderr is squelched to prevent this output from leaking to the user.
local -aU insecure_dirs
insecure_dirs=( ${(f@):-"$(compaudit 2>/dev/null)"} )
# If no such directories exist, get us out of here.
[[ -z "${insecure_dirs}" ]] && return
# List ownership and permissions of all insecure directories.
print "[oh-my-zsh] Insecure completion-dependent directories detected:"
ls -ld "${(@)insecure_dirs}"
cat <<EOD
[oh-my-zsh] For safety, we will not load completions from these directories until
[oh-my-zsh] you fix their permissions and ownership and restart zsh.
[oh-my-zsh] See the above list for directories with group or other writability.
[oh-my-zsh] To fix your permissions you can do so by disabling
[oh-my-zsh] the write permission of "group" and "others" and making sure that the
[oh-my-zsh] owner of these directories is either root or your current user.
[oh-my-zsh] The following command may help:
[oh-my-zsh] compaudit | xargs chmod g-w,o-w
[oh-my-zsh] If the above didn't help or you want to skip the verification of
[oh-my-zsh] insecure directories you can set the variable ZSH_DISABLE_COMPFIX to
[oh-my-zsh] "true" before oh-my-zsh is sourced in your zshrc file.
EOD
}

View File

@ -0,0 +1,78 @@
# fixme - the load process here seems a bit bizarre
zmodload -i zsh/complist
WORDCHARS=''
unsetopt menu_complete # do not autoselect the first completion entry
unsetopt flowcontrol
setopt auto_menu # show completion menu on successive tab press
setopt complete_in_word
setopt always_to_end
# should this be in keybindings?
bindkey -M menuselect '^o' accept-and-infer-next-history
zstyle ':completion:*:*:*:*:*' menu select
# case insensitive (all), partial-word and substring completion
if [[ "$CASE_SENSITIVE" = true ]]; then
zstyle ':completion:*' matcher-list 'r:|=*' 'l:|=* r:|=*'
else
if [[ "$HYPHEN_INSENSITIVE" = true ]]; then
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]-_}={[:upper:][:lower:]_-}' 'r:|=*' 'l:|=* r:|=*'
else
zstyle ':completion:*' matcher-list 'm:{[:lower:][:upper:]}={[:upper:][:lower:]}' 'r:|=*' 'l:|=* r:|=*'
fi
fi
unset CASE_SENSITIVE HYPHEN_INSENSITIVE
# Complete . and .. special directories
zstyle ':completion:*' special-dirs true
zstyle ':completion:*' list-colors ''
zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01'
if [[ "$OSTYPE" = solaris* ]]; then
zstyle ':completion:*:*:*:*:processes' command "ps -u $USERNAME -o pid,user,comm"
else
zstyle ':completion:*:*:*:*:processes' command "ps -u $USERNAME -o pid,user,comm -w -w"
fi
# disable named-directories autocompletion
zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories
# Use caching so that commands like apt and dpkg complete are useable
zstyle ':completion:*' use-cache yes
zstyle ':completion:*' cache-path $ZSH_CACHE_DIR
# Don't complete uninteresting users
zstyle ':completion:*:*:*:users' ignored-patterns \
adm amanda apache at avahi avahi-autoipd beaglidx bin cacti canna \
clamav daemon dbus distcache dnsmasq dovecot fax ftp games gdm \
gkrellmd gopher hacluster haldaemon halt hsqldb ident junkbust kdm \
ldap lp mail mailman mailnull man messagebus mldonkey mysql nagios \
named netdump news nfsnobody nobody nscd ntp nut nx obsrun openvpn \
operator pcap polkitd postfix postgres privoxy pulse pvm quagga radvd \
rpc rpcuser rpm rtkit scard shutdown squid sshd statd svn sync tftp \
usbmux uucp vcsa wwwrun xfs '_*'
# ... unless we really want to.
zstyle '*' single-ignored show
if [[ ${COMPLETION_WAITING_DOTS:-false} != false ]]; then
expand-or-complete-with-dots() {
# use $COMPLETION_WAITING_DOTS either as toggle or as the sequence to show
[[ $COMPLETION_WAITING_DOTS = true ]] && COMPLETION_WAITING_DOTS="%F{red}…%f"
# turn off line wrapping and print prompt-expanded "dot" sequence
printf '\e[?7l%s\e[?7h' "${(%)COMPLETION_WAITING_DOTS}"
zle expand-or-complete
zle redisplay
}
zle -N expand-or-complete-with-dots
# Set the function as the default tab completion widget
bindkey -M emacs "^I" expand-or-complete-with-dots
bindkey -M viins "^I" expand-or-complete-with-dots
bindkey -M vicmd "^I" expand-or-complete-with-dots
fi
# automatically load bash completion functions
autoload -U +X bashcompinit && bashcompinit

View File

@ -0,0 +1,10 @@
if [[ "$ENABLE_CORRECTION" == "true" ]]; then
alias cp='nocorrect cp'
alias man='nocorrect man'
alias mkdir='nocorrect mkdir'
alias mv='nocorrect mv'
alias sudo='nocorrect sudo'
alias su='nocorrect su'
setopt correct_all
fi

View File

@ -0,0 +1,353 @@
# diagnostics.zsh
#
# Diagnostic and debugging support for oh-my-zsh
# omz_diagnostic_dump()
#
# Author: Andrew Janke <andrew@apjanke.net>
#
# Usage:
#
# omz_diagnostic_dump [-v] [-V] [file]
#
# NOTE: This is a work in progress. Its interface and behavior are going to change,
# and probably in non-back-compatible ways.
#
# Outputs a bunch of information about the state and configuration of
# oh-my-zsh, zsh, and the user's system. This is intended to provide a
# bunch of context for diagnosing your own or a third party's problems, and to
# be suitable for posting to public bug reports.
#
# The output is human-readable and its format may change over time. It is not
# suitable for parsing. All the output is in one single file so it can be posted
# as a gist or bug comment on GitHub. GitHub doesn't support attaching tarballs
# or other files to bugs; otherwise, this would probably have an option to produce
# tarballs that contain copies of the config and customization files instead of
# catting them all in to one file.
#
# This is intended to be widely portable, and run anywhere that oh-my-zsh does.
# Feel free to report any portability issues as bugs.
#
# This is written in a defensive style so it still works (and can detect) cases when
# basic functionality like echo and which have been redefined. In particular, almost
# everything is invoked with "builtin" or "command", to work in the face of user
# redefinitions.
#
# OPTIONS
#
# [file] Specifies the output file. If not given, a file in the current directory
# is selected automatically.
#
# -v Increase the verbosity of the dump output. May be specified multiple times.
# Verbosity levels:
# 0 - Basic info, shell state, omz configuration, git state
# 1 - (default) Adds key binding info and configuration file contents
# 2 - Adds zcompdump file contents
#
# -V Reduce the verbosity of the dump output. May be specified multiple times.
#
# TODO:
# * Multi-file capture
# * Add automatic gist uploading
# * Consider whether to move default output file location to TMPDIR. More robust
# but less user friendly.
#
autoload -Uz is-at-least
function omz_diagnostic_dump() {
emulate -L zsh
builtin echo "Generating diagnostic dump; please be patient..."
local thisfcn=omz_diagnostic_dump
local -A opts
local opt_verbose opt_noverbose opt_outfile
local timestamp=$(date +%Y%m%d-%H%M%S)
local outfile=omz_diagdump_$timestamp.txt
builtin zparseopts -A opts -D -- "v+=opt_verbose" "V+=opt_noverbose"
local verbose n_verbose=${#opt_verbose} n_noverbose=${#opt_noverbose}
(( verbose = 1 + n_verbose - n_noverbose ))
if [[ ${#*} > 0 ]]; then
opt_outfile=$1
fi
if [[ ${#*} > 1 ]]; then
builtin echo "$thisfcn: error: too many arguments" >&2
return 1
fi
if [[ -n "$opt_outfile" ]]; then
outfile="$opt_outfile"
fi
# Always write directly to a file so terminal escape sequences are
# captured cleanly
_omz_diag_dump_one_big_text &> "$outfile"
if [[ $? != 0 ]]; then
builtin echo "$thisfcn: error while creating diagnostic dump; see $outfile for details"
fi
builtin echo
builtin echo Diagnostic dump file created at: "$outfile"
builtin echo
builtin echo To share this with OMZ developers, post it as a gist on GitHub
builtin echo at "https://gist.github.com" and share the link to the gist.
builtin echo
builtin echo "WARNING: This dump file contains all your zsh and omz configuration files,"
builtin echo "so don't share it publicly if there's sensitive information in them."
builtin echo
}
function _omz_diag_dump_one_big_text() {
local program programs progfile md5
builtin echo oh-my-zsh diagnostic dump
builtin echo
builtin echo $outfile
builtin echo
# Basic system and zsh information
command date
command uname -a
builtin echo OSTYPE=$OSTYPE
builtin echo ZSH_VERSION=$ZSH_VERSION
builtin echo User: $USERNAME
builtin echo umask: $(umask)
builtin echo
_omz_diag_dump_os_specific_version
builtin echo
# Installed programs
programs=(sh zsh ksh bash sed cat grep ls find git posh)
local progfile="" extra_str="" sha_str=""
for program in $programs; do
extra_str="" sha_str=""
progfile=$(builtin which $program)
if [[ $? == 0 ]]; then
if [[ -e $progfile ]]; then
if builtin whence shasum &>/dev/null; then
sha_str=($(command shasum $progfile))
sha_str=$sha_str[1]
extra_str+=" SHA $sha_str"
fi
if [[ -h "$progfile" ]]; then
extra_str+=" ( -> ${progfile:A} )"
fi
fi
builtin printf '%-9s %-20s %s\n' "$program is" "$progfile" "$extra_str"
else
builtin echo "$program: not found"
fi
done
builtin echo
builtin echo Command Versions:
builtin echo "zsh: $(zsh --version)"
builtin echo "this zsh session: $ZSH_VERSION"
builtin echo "bash: $(bash --version | command grep bash)"
builtin echo "git: $(git --version)"
builtin echo "grep: $(grep --version)"
builtin echo
# Core command definitions
_omz_diag_dump_check_core_commands || return 1
builtin echo
# ZSH Process state
builtin echo Process state:
builtin echo pwd: $PWD
if builtin whence pstree &>/dev/null; then
builtin echo Process tree for this shell:
pstree -p $$
else
ps -fT
fi
builtin set | command grep -a '^\(ZSH\|plugins\|TERM\|LC_\|LANG\|precmd\|chpwd\|preexec\|FPATH\|TTY\|DISPLAY\|PATH\)\|OMZ'
builtin echo
#TODO: Should this include `env` instead of or in addition to `export`?
builtin echo Exported:
builtin echo $(builtin export | command sed 's/=.*//')
builtin echo
builtin echo Locale:
command locale
builtin echo
# Zsh installation and configuration
builtin echo Zsh configuration:
builtin echo setopt: $(builtin setopt)
builtin echo
builtin echo zstyle:
builtin zstyle
builtin echo
builtin echo 'compaudit output:'
compaudit
builtin echo
builtin echo '$fpath directories:'
command ls -lad $fpath
builtin echo
# Oh-my-zsh installation
builtin echo oh-my-zsh installation:
command ls -ld ~/.z*
command ls -ld ~/.oh*
builtin echo
builtin echo oh-my-zsh git state:
(builtin cd $ZSH && builtin echo "HEAD: $(git rev-parse HEAD)" && git remote -v && git status | command grep "[^[:space:]]")
if [[ $verbose -ge 1 ]]; then
(builtin cd $ZSH && git reflog --date=default | command grep pull)
fi
builtin echo
if [[ -e $ZSH_CUSTOM ]]; then
local custom_dir=$ZSH_CUSTOM
if [[ -h $custom_dir ]]; then
custom_dir=$(builtin cd $custom_dir && pwd -P)
fi
builtin echo "oh-my-zsh custom dir:"
builtin echo " $ZSH_CUSTOM ($custom_dir)"
(builtin cd ${custom_dir:h} && command find ${custom_dir:t} -name .git -prune -o -print)
builtin echo
fi
# Key binding and terminal info
if [[ $verbose -ge 1 ]]; then
builtin echo "bindkey:"
builtin bindkey
builtin echo
builtin echo "infocmp:"
command infocmp -L
builtin echo
fi
# Configuration file info
local zdotdir=${ZDOTDIR:-$HOME}
builtin echo "Zsh configuration files:"
local cfgfile cfgfiles
# Some files for bash that zsh does not use are intentionally included
# to help with diagnosing behavior differences between bash and zsh
cfgfiles=( /etc/zshenv /etc/zprofile /etc/zshrc /etc/zlogin /etc/zlogout
$zdotdir/.zshenv $zdotdir/.zprofile $zdotdir/.zshrc $zdotdir/.zlogin $zdotdir/.zlogout
~/.zsh.pre-oh-my-zsh
/etc/bashrc /etc/profile ~/.bashrc ~/.profile ~/.bash_profile ~/.bash_logout )
command ls -lad $cfgfiles 2>&1
builtin echo
if [[ $verbose -ge 1 ]]; then
for cfgfile in $cfgfiles; do
_omz_diag_dump_echo_file_w_header $cfgfile
done
fi
builtin echo
builtin echo "Zsh compdump files:"
local dumpfile dumpfiles
command ls -lad $zdotdir/.zcompdump*
dumpfiles=( $zdotdir/.zcompdump*(N) )
if [[ $verbose -ge 2 ]]; then
for dumpfile in $dumpfiles; do
_omz_diag_dump_echo_file_w_header $dumpfile
done
fi
}
function _omz_diag_dump_check_core_commands() {
builtin echo "Core command check:"
local redefined name builtins externals reserved_words
redefined=()
# All the zsh non-module builtin commands
# These are taken from the zsh reference manual for 5.0.2
# Commands from modules should not be included.
# (For back-compatibility, if any of these are newish, they should be removed,
# or at least made conditional on the version of the current running zsh.)
# "history" is also excluded because OMZ is known to redefine that
reserved_words=( do done esac then elif else fi for case if while function
repeat time until select coproc nocorrect foreach end '!' '[[' '{' '}'
)
builtins=( alias autoload bg bindkey break builtin bye cd chdir command
comparguments compcall compctl compdescribe compfiles compgroups compquote comptags
comptry compvalues continue dirs disable disown echo echotc echoti emulate
enable eval exec exit false fc fg functions getln getopts hash
jobs kill let limit log logout noglob popd print printf
pushd pushln pwd r read rehash return sched set setopt shift
source suspend test times trap true ttyctl type ulimit umask unalias
unfunction unhash unlimit unset unsetopt vared wait whence where which zcompile
zle zmodload zparseopts zregexparse zstyle )
if is-at-least 5.1; then
reserved_word+=( declare export integer float local readonly typeset )
else
builtins+=( declare export integer float local readonly typeset )
fi
builtins_fatal=( builtin command local )
externals=( zsh )
for name in $reserved_words; do
if [[ $(builtin whence -w $name) != "$name: reserved" ]]; then
builtin echo "reserved word '$name' has been redefined"
builtin which $name
redefined+=$name
fi
done
for name in $builtins; do
if [[ $(builtin whence -w $name) != "$name: builtin" ]]; then
builtin echo "builtin '$name' has been redefined"
builtin which $name
redefined+=$name
fi
done
for name in $externals; do
if [[ $(builtin whence -w $name) != "$name: command" ]]; then
builtin echo "command '$name' has been redefined"
builtin which $name
redefined+=$name
fi
done
if [[ -n "$redefined" ]]; then
builtin echo "SOME CORE COMMANDS HAVE BEEN REDEFINED: $redefined"
else
builtin echo "All core commands are defined normally"
fi
}
function _omz_diag_dump_echo_file_w_header() {
local file=$1
if [[ ( -f $file || -h $file ) ]]; then
builtin echo "========== $file =========="
if [[ -h $file ]]; then
builtin echo "========== ( => ${file:A} ) =========="
fi
command cat $file
builtin echo "========== end $file =========="
builtin echo
elif [[ -d $file ]]; then
builtin echo "File '$file' is a directory"
elif [[ ! -e $file ]]; then
builtin echo "File '$file' does not exist"
else
command ls -lad "$file"
fi
}
function _omz_diag_dump_os_specific_version() {
local osname osver version_file version_files
case "$OSTYPE" in
darwin*)
osname=$(command sw_vers -productName)
osver=$(command sw_vers -productVersion)
builtin echo "OS Version: $osname $osver build $(sw_vers -buildVersion)"
;;
cygwin)
command systeminfo | command head -n 4 | command tail -n 2
;;
esac
if builtin which lsb_release >/dev/null; then
builtin echo "OS Release: $(command lsb_release -s -d)"
fi
version_files=( /etc/*-release(N) /etc/*-version(N) /etc/*_version(N) )
for version_file in $version_files; do
builtin echo "$version_file:"
command cat "$version_file"
builtin echo
done
}

View File

@ -0,0 +1,40 @@
# Changing/making/removing directory
setopt auto_cd
setopt auto_pushd
setopt pushd_ignore_dups
setopt pushdminus
alias -g ...='../..'
alias -g ....='../../..'
alias -g .....='../../../..'
alias -g ......='../../../../..'
alias -- -='cd -'
alias 1='cd -1'
alias 2='cd -2'
alias 3='cd -3'
alias 4='cd -4'
alias 5='cd -5'
alias 6='cd -6'
alias 7='cd -7'
alias 8='cd -8'
alias 9='cd -9'
alias md='mkdir -p'
alias rd=rmdir
function d () {
if [[ -n $1 ]]; then
dirs "$@"
else
dirs -v | head -n 10
fi
}
compdef _dirs d
# List directory contents
alias lsa='ls -lah'
alias l='ls -lah'
alias ll='ls -lh'
alias la='ls -lAh'

View File

@ -0,0 +1,267 @@
function zsh_stats() {
fc -l 1 \
| awk '{ CMD[$2]++; count++; } END { for (a in CMD) print CMD[a] " " CMD[a]*100/count "% " a }' \
| grep -v "./" | sort -nr | head -n 20 | column -c3 -s " " -t | nl
}
function uninstall_oh_my_zsh() {
command env ZSH="$ZSH" sh "$ZSH/tools/uninstall.sh"
}
function upgrade_oh_my_zsh() {
echo >&2 "${fg[yellow]}Note: \`$0\` is deprecated. Use \`omz update\` instead.$reset_color"
omz update
}
function open_command() {
local open_cmd
# define the open command
case "$OSTYPE" in
darwin*) open_cmd='open' ;;
cygwin*) open_cmd='cygstart' ;;
linux*) [[ "$(uname -r)" != *icrosoft* ]] && open_cmd='nohup xdg-open' || {
open_cmd='cmd.exe /c start ""'
[[ -e "$1" ]] && { 1="$(wslpath -w "${1:a}")" || return 1 }
} ;;
msys*) open_cmd='start ""' ;;
*) echo "Platform $OSTYPE not supported"
return 1
;;
esac
# If a URL is passed, $BROWSER might be set to a local browser within SSH.
# See https://github.com/ohmyzsh/ohmyzsh/issues/11098
if [[ -n "$BROWSER" && "$1" = (http|https)://* ]]; then
"$BROWSER" "$@"
return
fi
${=open_cmd} "$@" &>/dev/null
}
# take functions
# mkcd is equivalent to takedir
function mkcd takedir() {
mkdir -p $@ && cd ${@:$#}
}
function takeurl() {
local data thedir
data="$(mktemp)"
curl -L "$1" > "$data"
tar xf "$data"
thedir="$(tar tf "$data" | head -n 1)"
rm "$data"
cd "$thedir"
}
function takegit() {
git clone "$1"
cd "$(basename ${1%%.git})"
}
function take() {
if [[ $1 =~ ^(https?|ftp).*\.(tar\.(gz|bz2|xz)|tgz)$ ]]; then
takeurl "$1"
elif [[ $1 =~ ^([A-Za-z0-9]\+@|https?|git|ssh|ftps?|rsync).*\.git/?$ ]]; then
takegit "$1"
else
takedir "$@"
fi
}
#
# Get the value of an alias.
#
# Arguments:
# 1. alias - The alias to get its value from
# STDOUT:
# The value of alias $1 (if it has one).
# Return value:
# 0 if the alias was found,
# 1 if it does not exist
#
function alias_value() {
(( $+aliases[$1] )) && echo $aliases[$1]
}
#
# Try to get the value of an alias,
# otherwise return the input.
#
# Arguments:
# 1. alias - The alias to get its value from
# STDOUT:
# The value of alias $1, or $1 if there is no alias $1.
# Return value:
# Always 0
#
function try_alias_value() {
alias_value "$1" || echo "$1"
}
#
# Set variable "$1" to default value "$2" if "$1" is not yet defined.
#
# Arguments:
# 1. name - The variable to set
# 2. val - The default value
# Return value:
# 0 if the variable exists, 3 if it was set
#
function default() {
(( $+parameters[$1] )) && return 0
typeset -g "$1"="$2" && return 3
}
#
# Set environment variable "$1" to default value "$2" if "$1" is not yet defined.
#
# Arguments:
# 1. name - The env variable to set
# 2. val - The default value
# Return value:
# 0 if the env variable exists, 3 if it was set
#
function env_default() {
[[ ${parameters[$1]} = *-export* ]] && return 0
export "$1=$2" && return 3
}
# Required for $langinfo
zmodload zsh/langinfo
# URL-encode a string
#
# Encodes a string using RFC 2396 URL-encoding (%-escaped).
# See: https://www.ietf.org/rfc/rfc2396.txt
#
# By default, reserved characters and unreserved "mark" characters are
# not escaped by this function. This allows the common usage of passing
# an entire URL in, and encoding just special characters in it, with
# the expectation that reserved and mark characters are used appropriately.
# The -r and -m options turn on escaping of the reserved and mark characters,
# respectively, which allows arbitrary strings to be fully escaped for
# embedding inside URLs, where reserved characters might be misinterpreted.
#
# Prints the encoded string on stdout.
# Returns nonzero if encoding failed.
#
# Usage:
# omz_urlencode [-r] [-m] [-P] <string> [<string> ...]
#
# -r causes reserved characters (;/?:@&=+$,) to be escaped
#
# -m causes "mark" characters (_.!~*''()-) to be escaped
#
# -P causes spaces to be encoded as '%20' instead of '+'
function omz_urlencode() {
emulate -L zsh
local -a opts
zparseopts -D -E -a opts r m P
local in_str="$@"
local url_str=""
local spaces_as_plus
if [[ -z $opts[(r)-P] ]]; then spaces_as_plus=1; fi
local str="$in_str"
# URLs must use UTF-8 encoding; convert str to UTF-8 if required
local encoding=$langinfo[CODESET]
local safe_encodings
safe_encodings=(UTF-8 utf8 US-ASCII)
if [[ -z ${safe_encodings[(r)$encoding]} ]]; then
str=$(echo -E "$str" | iconv -f $encoding -t UTF-8)
if [[ $? != 0 ]]; then
echo "Error converting string from $encoding to UTF-8" >&2
return 1
fi
fi
# Use LC_CTYPE=C to process text byte-by-byte
# Note that this doesn't work in Termux, as it only has UTF-8 locale.
# Characters will be processed as UTF-8, which is fine for URLs.
local i byte ord LC_ALL=C
export LC_ALL
local reserved=';/?:@&=+$,'
local mark='_.!~*''()-'
local dont_escape="[A-Za-z0-9"
if [[ -z $opts[(r)-r] ]]; then
dont_escape+=$reserved
fi
# $mark must be last because of the "-"
if [[ -z $opts[(r)-m] ]]; then
dont_escape+=$mark
fi
dont_escape+="]"
# Implemented to use a single printf call and avoid subshells in the loop,
# for performance (primarily on Windows).
local url_str=""
for (( i = 1; i <= ${#str}; ++i )); do
byte="$str[i]"
if [[ "$byte" =~ "$dont_escape" ]]; then
url_str+="$byte"
else
if [[ "$byte" == " " && -n $spaces_as_plus ]]; then
url_str+="+"
elif [[ "$PREFIX" = *com.termux* ]]; then
# Termux does not have non-UTF8 locales, so just send the UTF-8 character directly
url_str+="$byte"
else
ord=$(( [##16] #byte ))
url_str+="%$ord"
fi
fi
done
echo -E "$url_str"
}
# URL-decode a string
#
# Decodes a RFC 2396 URL-encoded (%-escaped) string.
# This decodes the '+' and '%' escapes in the input string, and leaves
# other characters unchanged. Does not enforce that the input is a
# valid URL-encoded string. This is a convenience to allow callers to
# pass in a full URL or similar strings and decode them for human
# presentation.
#
# Outputs the encoded string on stdout.
# Returns nonzero if encoding failed.
#
# Usage:
# omz_urldecode <urlstring> - prints decoded string followed by a newline
function omz_urldecode {
emulate -L zsh
local encoded_url=$1
# Work bytewise, since URLs escape UTF-8 octets
local caller_encoding=$langinfo[CODESET]
local LC_ALL=C
export LC_ALL
# Change + back to ' '
local tmp=${encoded_url:gs/+/ /}
# Protect other escapes to pass through the printf unchanged
tmp=${tmp:gs/\\/\\\\/}
# Handle %-escapes by turning them into `\xXX` printf escapes
tmp=${tmp:gs/%/\\x/}
local decoded="$(printf -- "$tmp")"
# Now we have a UTF-8 encoded string in the variable. We need to re-encode
# it if caller is in a non-UTF-8 locale.
local -a safe_encodings
safe_encodings=(UTF-8 utf8 US-ASCII)
if [[ -z ${safe_encodings[(r)$caller_encoding]} ]]; then
decoded=$(echo -E "$decoded" | iconv -f UTF-8 -t $caller_encoding)
if [[ $? != 0 ]]; then
echo "Error converting string from UTF-8 to $caller_encoding" >&2
return 1
fi
fi
echo -E "$decoded"
}

282
dot_oh-my-zsh/lib/git.zsh Normal file
View File

@ -0,0 +1,282 @@
# The git prompt's git commands are read-only and should not interfere with
# other processes. This environment variable is equivalent to running with `git
# --no-optional-locks`, but falls back gracefully for older versions of git.
# See git(1) for and git-status(1) for a description of that flag.
#
# We wrap in a local function instead of exporting the variable directly in
# order to avoid interfering with manually-run git commands by the user.
function __git_prompt_git() {
GIT_OPTIONAL_LOCKS=0 command git "$@"
}
function git_prompt_info() {
# If we are on a folder not tracked by git, get out.
# Otherwise, check for hide-info at global and local repository level
if ! __git_prompt_git rev-parse --git-dir &> /dev/null \
|| [[ "$(__git_prompt_git config --get oh-my-zsh.hide-info 2>/dev/null)" == 1 ]]; then
return 0
fi
local ref
ref=$(__git_prompt_git symbolic-ref --short HEAD 2> /dev/null) \
|| ref=$(__git_prompt_git describe --tags --exact-match HEAD 2> /dev/null) \
|| ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) \
|| return 0
# Use global ZSH_THEME_GIT_SHOW_UPSTREAM=1 for including upstream remote info
local upstream
if (( ${+ZSH_THEME_GIT_SHOW_UPSTREAM} )); then
upstream=$(__git_prompt_git rev-parse --abbrev-ref --symbolic-full-name "@{upstream}" 2>/dev/null) \
&& upstream=" -> ${upstream}"
fi
echo "${ZSH_THEME_GIT_PROMPT_PREFIX}${ref:gs/%/%%}${upstream:gs/%/%%}$(parse_git_dirty)${ZSH_THEME_GIT_PROMPT_SUFFIX}"
}
# Checks if working tree is dirty
function parse_git_dirty() {
local STATUS
local -a FLAGS
FLAGS=('--porcelain')
if [[ "$(__git_prompt_git config --get oh-my-zsh.hide-dirty)" != "1" ]]; then
if [[ "${DISABLE_UNTRACKED_FILES_DIRTY:-}" == "true" ]]; then
FLAGS+='--untracked-files=no'
fi
case "${GIT_STATUS_IGNORE_SUBMODULES:-}" in
git)
# let git decide (this respects per-repo config in .gitmodules)
;;
*)
# if unset: ignore dirty submodules
# other values are passed to --ignore-submodules
FLAGS+="--ignore-submodules=${GIT_STATUS_IGNORE_SUBMODULES:-dirty}"
;;
esac
STATUS=$(__git_prompt_git status ${FLAGS} 2> /dev/null | tail -n 1)
fi
if [[ -n $STATUS ]]; then
echo "$ZSH_THEME_GIT_PROMPT_DIRTY"
else
echo "$ZSH_THEME_GIT_PROMPT_CLEAN"
fi
}
# Gets the difference between the local and remote branches
function git_remote_status() {
local remote ahead behind git_remote_status git_remote_status_detailed
remote=${$(__git_prompt_git rev-parse --verify ${hook_com[branch]}@{upstream} --symbolic-full-name 2>/dev/null)/refs\/remotes\/}
if [[ -n ${remote} ]]; then
ahead=$(__git_prompt_git rev-list ${hook_com[branch]}@{upstream}..HEAD 2>/dev/null | wc -l)
behind=$(__git_prompt_git rev-list HEAD..${hook_com[branch]}@{upstream} 2>/dev/null | wc -l)
if [[ $ahead -eq 0 ]] && [[ $behind -eq 0 ]]; then
git_remote_status="$ZSH_THEME_GIT_PROMPT_EQUAL_REMOTE"
elif [[ $ahead -gt 0 ]] && [[ $behind -eq 0 ]]; then
git_remote_status="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE"
git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}"
elif [[ $behind -gt 0 ]] && [[ $ahead -eq 0 ]]; then
git_remote_status="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE"
git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}"
elif [[ $ahead -gt 0 ]] && [[ $behind -gt 0 ]]; then
git_remote_status="$ZSH_THEME_GIT_PROMPT_DIVERGED_REMOTE"
git_remote_status_detailed="$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_AHEAD_REMOTE$((ahead))%{$reset_color%}$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE_COLOR$ZSH_THEME_GIT_PROMPT_BEHIND_REMOTE$((behind))%{$reset_color%}"
fi
if [[ -n $ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_DETAILED ]]; then
git_remote_status="$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_PREFIX${remote:gs/%/%%}$git_remote_status_detailed$ZSH_THEME_GIT_PROMPT_REMOTE_STATUS_SUFFIX"
fi
echo $git_remote_status
fi
}
# Outputs the name of the current branch
# Usage example: git pull origin $(git_current_branch)
# Using '--quiet' with 'symbolic-ref' will not cause a fatal error (128) if
# it's not a symbolic ref, but in a Git repo.
function git_current_branch() {
local ref
ref=$(__git_prompt_git symbolic-ref --quiet HEAD 2> /dev/null)
local ret=$?
if [[ $ret != 0 ]]; then
[[ $ret == 128 ]] && return # no git repo.
ref=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) || return
fi
echo ${ref#refs/heads/}
}
# Gets the number of commits ahead from remote
function git_commits_ahead() {
if __git_prompt_git rev-parse --git-dir &>/dev/null; then
local commits="$(__git_prompt_git rev-list --count @{upstream}..HEAD 2>/dev/null)"
if [[ -n "$commits" && "$commits" != 0 ]]; then
echo "$ZSH_THEME_GIT_COMMITS_AHEAD_PREFIX$commits$ZSH_THEME_GIT_COMMITS_AHEAD_SUFFIX"
fi
fi
}
# Gets the number of commits behind remote
function git_commits_behind() {
if __git_prompt_git rev-parse --git-dir &>/dev/null; then
local commits="$(__git_prompt_git rev-list --count HEAD..@{upstream} 2>/dev/null)"
if [[ -n "$commits" && "$commits" != 0 ]]; then
echo "$ZSH_THEME_GIT_COMMITS_BEHIND_PREFIX$commits$ZSH_THEME_GIT_COMMITS_BEHIND_SUFFIX"
fi
fi
}
# Outputs if current branch is ahead of remote
function git_prompt_ahead() {
if [[ -n "$(__git_prompt_git rev-list origin/$(git_current_branch)..HEAD 2> /dev/null)" ]]; then
echo "$ZSH_THEME_GIT_PROMPT_AHEAD"
fi
}
# Outputs if current branch is behind remote
function git_prompt_behind() {
if [[ -n "$(__git_prompt_git rev-list HEAD..origin/$(git_current_branch) 2> /dev/null)" ]]; then
echo "$ZSH_THEME_GIT_PROMPT_BEHIND"
fi
}
# Outputs if current branch exists on remote or not
function git_prompt_remote() {
if [[ -n "$(__git_prompt_git show-ref origin/$(git_current_branch) 2> /dev/null)" ]]; then
echo "$ZSH_THEME_GIT_PROMPT_REMOTE_EXISTS"
else
echo "$ZSH_THEME_GIT_PROMPT_REMOTE_MISSING"
fi
}
# Formats prompt string for current git commit short SHA
function git_prompt_short_sha() {
local SHA
SHA=$(__git_prompt_git rev-parse --short HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
}
# Formats prompt string for current git commit long SHA
function git_prompt_long_sha() {
local SHA
SHA=$(__git_prompt_git rev-parse HEAD 2> /dev/null) && echo "$ZSH_THEME_GIT_PROMPT_SHA_BEFORE$SHA$ZSH_THEME_GIT_PROMPT_SHA_AFTER"
}
function git_prompt_status() {
[[ "$(__git_prompt_git config --get oh-my-zsh.hide-status 2>/dev/null)" = 1 ]] && return
# Maps a git status prefix to an internal constant
# This cannot use the prompt constants, as they may be empty
local -A prefix_constant_map
prefix_constant_map=(
'\?\? ' 'UNTRACKED'
'A ' 'ADDED'
'M ' 'ADDED'
'MM ' 'MODIFIED'
' M ' 'MODIFIED'
'AM ' 'MODIFIED'
' T ' 'MODIFIED'
'R ' 'RENAMED'
' D ' 'DELETED'
'D ' 'DELETED'
'UU ' 'UNMERGED'
'ahead' 'AHEAD'
'behind' 'BEHIND'
'diverged' 'DIVERGED'
'stashed' 'STASHED'
)
# Maps the internal constant to the prompt theme
local -A constant_prompt_map
constant_prompt_map=(
'UNTRACKED' "$ZSH_THEME_GIT_PROMPT_UNTRACKED"
'ADDED' "$ZSH_THEME_GIT_PROMPT_ADDED"
'MODIFIED' "$ZSH_THEME_GIT_PROMPT_MODIFIED"
'RENAMED' "$ZSH_THEME_GIT_PROMPT_RENAMED"
'DELETED' "$ZSH_THEME_GIT_PROMPT_DELETED"
'UNMERGED' "$ZSH_THEME_GIT_PROMPT_UNMERGED"
'AHEAD' "$ZSH_THEME_GIT_PROMPT_AHEAD"
'BEHIND' "$ZSH_THEME_GIT_PROMPT_BEHIND"
'DIVERGED' "$ZSH_THEME_GIT_PROMPT_DIVERGED"
'STASHED' "$ZSH_THEME_GIT_PROMPT_STASHED"
)
# The order that the prompt displays should be added to the prompt
local status_constants
status_constants=(
UNTRACKED ADDED MODIFIED RENAMED DELETED
STASHED UNMERGED AHEAD BEHIND DIVERGED
)
local status_text
status_text="$(__git_prompt_git status --porcelain -b 2> /dev/null)"
# Don't continue on a catastrophic failure
if [[ $? -eq 128 ]]; then
return 1
fi
# A lookup table of each git status encountered
local -A statuses_seen
if __git_prompt_git rev-parse --verify refs/stash &>/dev/null; then
statuses_seen[STASHED]=1
fi
local status_lines
status_lines=("${(@f)${status_text}}")
# If the tracking line exists, get and parse it
if [[ "$status_lines[1]" =~ "^## [^ ]+ \[(.*)\]" ]]; then
local branch_statuses
branch_statuses=("${(@s/,/)match}")
for branch_status in $branch_statuses; do
if [[ ! $branch_status =~ "(behind|diverged|ahead) ([0-9]+)?" ]]; then
continue
fi
local last_parsed_status=$prefix_constant_map[$match[1]]
statuses_seen[$last_parsed_status]=$match[2]
done
fi
# For each status prefix, do a regex comparison
for status_prefix in ${(k)prefix_constant_map}; do
local status_constant="${prefix_constant_map[$status_prefix]}"
local status_regex=$'(^|\n)'"$status_prefix"
if [[ "$status_text" =~ $status_regex ]]; then
statuses_seen[$status_constant]=1
fi
done
# Display the seen statuses in the order specified
local status_prompt
for status_constant in $status_constants; do
if (( ${+statuses_seen[$status_constant]} )); then
local next_display=$constant_prompt_map[$status_constant]
status_prompt="$next_display$status_prompt"
fi
done
echo $status_prompt
}
# Outputs the name of the current user
# Usage example: $(git_current_user_name)
function git_current_user_name() {
__git_prompt_git config user.name 2>/dev/null
}
# Outputs the email of the current user
# Usage example: $(git_current_user_email)
function git_current_user_email() {
__git_prompt_git config user.email 2>/dev/null
}
# Output the name of the root directory of the git repository
# Usage example: $(git_repo_name)
function git_repo_name() {
local repo_path
if repo_path="$(__git_prompt_git rev-parse --show-toplevel 2>/dev/null)" && [[ -n "$repo_path" ]]; then
echo ${repo_path:t}
fi
}

View File

@ -0,0 +1,41 @@
__GREP_CACHE_FILE="$ZSH_CACHE_DIR"/grep-alias
# See if there's a cache file modified in the last day
__GREP_ALIAS_CACHES=("$__GREP_CACHE_FILE"(Nm-1))
if [[ -n "$__GREP_ALIAS_CACHES" ]]; then
source "$__GREP_CACHE_FILE"
else
grep-flags-available() {
command grep "$@" "" &>/dev/null <<< ""
}
# Ignore these folders (if the necessary grep flags are available)
EXC_FOLDERS="{.bzr,CVS,.git,.hg,.svn,.idea,.tox}"
# Check for --exclude-dir, otherwise check for --exclude. If --exclude
# isn't available, --color won't be either (they were released at the same
# time (v2.5): https://git.savannah.gnu.org/cgit/grep.git/tree/NEWS?id=1236f007
if grep-flags-available --color=auto --exclude-dir=.cvs; then
GREP_OPTIONS="--color=auto --exclude-dir=$EXC_FOLDERS"
elif grep-flags-available --color=auto --exclude=.cvs; then
GREP_OPTIONS="--color=auto --exclude=$EXC_FOLDERS"
fi
if [[ -n "$GREP_OPTIONS" ]]; then
# export grep, egrep and fgrep settings
alias grep="grep $GREP_OPTIONS"
alias egrep="grep -E $GREP_OPTIONS"
alias fgrep="grep -F $GREP_OPTIONS"
# write to cache file if cache directory is writable
if [[ -w "$ZSH_CACHE_DIR" ]]; then
alias -L grep egrep fgrep >| "$__GREP_CACHE_FILE"
fi
fi
# Clean up
unset GREP_OPTIONS EXC_FOLDERS
unfunction grep-flags-available
fi
unset __GREP_CACHE_FILE __GREP_ALIAS_CACHES

View File

@ -0,0 +1,40 @@
## History wrapper
function omz_history {
local clear list
zparseopts -E c=clear l=list
if [[ -n "$clear" ]]; then
# if -c provided, clobber the history file
echo -n >| "$HISTFILE"
fc -p "$HISTFILE"
echo >&2 History file deleted.
elif [[ -n "$list" ]]; then
# if -l provided, run as if calling `fc' directly
builtin fc "$@"
else
# unless a number is provided, show all history events (starting from 1)
[[ ${@[-1]-} = *[0-9]* ]] && builtin fc -l "$@" || builtin fc -l "$@" 1
fi
}
# Timestamp format
case ${HIST_STAMPS-} in
"mm/dd/yyyy") alias history='omz_history -f' ;;
"dd.mm.yyyy") alias history='omz_history -E' ;;
"yyyy-mm-dd") alias history='omz_history -i' ;;
"") alias history='omz_history' ;;
*) alias history="omz_history -t '$HIST_STAMPS'" ;;
esac
## History file configuration
[ -z "$HISTFILE" ] && HISTFILE="$HOME/.zsh_history"
[ "$HISTSIZE" -lt 50000 ] && HISTSIZE=50000
[ "$SAVEHIST" -lt 10000 ] && SAVEHIST=10000
## History command configuration
setopt extended_history # record timestamp of command in HISTFILE
setopt hist_expire_dups_first # delete duplicates first when HISTFILE size exceeds HISTSIZE
setopt hist_ignore_dups # ignore duplicated commands history list
setopt hist_ignore_space # ignore commands that start with space
setopt hist_verify # show command with history expansion to user before running it
setopt share_history # share command history data

View File

@ -0,0 +1,145 @@
# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html
# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Zle-Builtins
# http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Standard-Widgets
# Make sure that the terminal is in application mode when zle is active, since
# only then values from $terminfo are valid
if (( ${+terminfo[smkx]} )) && (( ${+terminfo[rmkx]} )); then
function zle-line-init() {
echoti smkx
}
function zle-line-finish() {
echoti rmkx
}
zle -N zle-line-init
zle -N zle-line-finish
fi
# Use emacs key bindings
bindkey -e
# [PageUp] - Up a line of history
if [[ -n "${terminfo[kpp]}" ]]; then
bindkey -M emacs "${terminfo[kpp]}" up-line-or-history
bindkey -M viins "${terminfo[kpp]}" up-line-or-history
bindkey -M vicmd "${terminfo[kpp]}" up-line-or-history
fi
# [PageDown] - Down a line of history
if [[ -n "${terminfo[knp]}" ]]; then
bindkey -M emacs "${terminfo[knp]}" down-line-or-history
bindkey -M viins "${terminfo[knp]}" down-line-or-history
bindkey -M vicmd "${terminfo[knp]}" down-line-or-history
fi
# Start typing + [Up-Arrow] - fuzzy find history forward
autoload -U up-line-or-beginning-search
zle -N up-line-or-beginning-search
bindkey -M emacs "^[[A" up-line-or-beginning-search
bindkey -M viins "^[[A" up-line-or-beginning-search
bindkey -M vicmd "^[[A" up-line-or-beginning-search
if [[ -n "${terminfo[kcuu1]}" ]]; then
bindkey -M emacs "${terminfo[kcuu1]}" up-line-or-beginning-search
bindkey -M viins "${terminfo[kcuu1]}" up-line-or-beginning-search
bindkey -M vicmd "${terminfo[kcuu1]}" up-line-or-beginning-search
fi
# Start typing + [Down-Arrow] - fuzzy find history backward
autoload -U down-line-or-beginning-search
zle -N down-line-or-beginning-search
bindkey -M emacs "^[[B" down-line-or-beginning-search
bindkey -M viins "^[[B" down-line-or-beginning-search
bindkey -M vicmd "^[[B" down-line-or-beginning-search
if [[ -n "${terminfo[kcud1]}" ]]; then
bindkey -M emacs "${terminfo[kcud1]}" down-line-or-beginning-search
bindkey -M viins "${terminfo[kcud1]}" down-line-or-beginning-search
bindkey -M vicmd "${terminfo[kcud1]}" down-line-or-beginning-search
fi
# [Home] - Go to beginning of line
if [[ -n "${terminfo[khome]}" ]]; then
bindkey -M emacs "${terminfo[khome]}" beginning-of-line
bindkey -M viins "${terminfo[khome]}" beginning-of-line
bindkey -M vicmd "${terminfo[khome]}" beginning-of-line
fi
# [End] - Go to end of line
if [[ -n "${terminfo[kend]}" ]]; then
bindkey -M emacs "${terminfo[kend]}" end-of-line
bindkey -M viins "${terminfo[kend]}" end-of-line
bindkey -M vicmd "${terminfo[kend]}" end-of-line
fi
# [Shift-Tab] - move through the completion menu backwards
if [[ -n "${terminfo[kcbt]}" ]]; then
bindkey -M emacs "${terminfo[kcbt]}" reverse-menu-complete
bindkey -M viins "${terminfo[kcbt]}" reverse-menu-complete
bindkey -M vicmd "${terminfo[kcbt]}" reverse-menu-complete
fi
# [Backspace] - delete backward
bindkey -M emacs '^?' backward-delete-char
bindkey -M viins '^?' backward-delete-char
bindkey -M vicmd '^?' backward-delete-char
# [Delete] - delete forward
if [[ -n "${terminfo[kdch1]}" ]]; then
bindkey -M emacs "${terminfo[kdch1]}" delete-char
bindkey -M viins "${terminfo[kdch1]}" delete-char
bindkey -M vicmd "${terminfo[kdch1]}" delete-char
else
bindkey -M emacs "^[[3~" delete-char
bindkey -M viins "^[[3~" delete-char
bindkey -M vicmd "^[[3~" delete-char
bindkey -M emacs "^[3;5~" delete-char
bindkey -M viins "^[3;5~" delete-char
bindkey -M vicmd "^[3;5~" delete-char
fi
# [Ctrl-Delete] - delete whole forward-word
bindkey -M emacs '^[[3;5~' kill-word
bindkey -M viins '^[[3;5~' kill-word
bindkey -M vicmd '^[[3;5~' kill-word
# [Ctrl-RightArrow] - move forward one word
bindkey -M emacs '^[[1;5C' forward-word
bindkey -M viins '^[[1;5C' forward-word
bindkey -M vicmd '^[[1;5C' forward-word
# [Ctrl-LeftArrow] - move backward one word
bindkey -M emacs '^[[1;5D' backward-word
bindkey -M viins '^[[1;5D' backward-word
bindkey -M vicmd '^[[1;5D' backward-word
bindkey '\ew' kill-region # [Esc-w] - Kill from the cursor to the mark
bindkey -s '\el' 'ls\n' # [Esc-l] - run command: ls
bindkey '^r' history-incremental-search-backward # [Ctrl-r] - Search backward incrementally for a specified string. The string may begin with ^ to anchor the search to the beginning of the line.
bindkey ' ' magic-space # [Space] - don't do history expansion
# Edit the current command line in $EDITOR
autoload -U edit-command-line
zle -N edit-command-line
bindkey '\C-x\C-e' edit-command-line
# file rename magick
bindkey "^[m" copy-prev-shell-word
# consider emacs keybindings:
#bindkey -e ## emacs key bindings
#
#bindkey '^[[A' up-line-or-search
#bindkey '^[[B' down-line-or-search
#bindkey '^[^[[C' emacs-forward-word
#bindkey '^[^[[D' emacs-backward-word
#
#bindkey -s '^X^Z' '%-^M'
#bindkey '^[e' expand-cmd-path
#bindkey '^[^I' reverse-menu-complete
#bindkey '^X^N' accept-and-infer-next-history
#bindkey '^W' kill-region
#bindkey '^I' complete-word
## Fix weird sequence that rxvt produces
#bindkey -s '^[[Z' '\t'
#

View File

@ -0,0 +1,38 @@
autoload -Uz is-at-least
# *-magic is known buggy in some versions; disable if so
if [[ $DISABLE_MAGIC_FUNCTIONS != true ]]; then
for d in $fpath; do
if [[ -e "$d/url-quote-magic" ]]; then
if is-at-least 5.1; then
autoload -Uz bracketed-paste-magic
zle -N bracketed-paste bracketed-paste-magic
fi
autoload -Uz url-quote-magic
zle -N self-insert url-quote-magic
break
fi
done
fi
setopt multios # enable redirect to multiple streams: echo >file1 >file2
setopt long_list_jobs # show long list format job notifications
setopt interactivecomments # recognize comments
# define pager dependant on what is available (less or more)
if (( ${+commands[less]} )); then
env_default 'PAGER' 'less'
env_default 'LESS' '-R'
elif (( ${+commands[more]} )); then
env_default 'PAGER' 'more'
fi
## super user alias
alias _='sudo '
## more intelligent acking for ubuntu users and no alias for users without ack
if (( $+commands[ack-grep] )); then
alias afind='ack-grep -il'
elif (( $+commands[ack] )); then
alias afind='ack -il'
fi

View File

@ -0,0 +1,6 @@
# get the nvm-controlled node.js version
function nvm_prompt_info() {
which nvm &>/dev/null || return
local nvm_prompt=${$(nvm current)#v}
echo "${ZSH_THEME_NVM_PROMPT_PREFIX}${nvm_prompt:gs/%/%%}${ZSH_THEME_NVM_PROMPT_SUFFIX}"
}

View File

@ -0,0 +1,44 @@
# *_prompt_info functions for usage in your prompt
#
# Plugin creators, please add your *_prompt_info function to the list
# of dummy implementations to help theme creators not receiving errors
# without the need of implementing conditional clauses.
#
# See also lib/bzr.zsh, lib/git.zsh and lib/nvm.zsh for
# git_prompt_info, bzr_prompt_info and nvm_prompt_info
# Dummy implementations that return false to prevent command_not_found
# errors with themes, that implement these functions
# Real implementations will be used when the respective plugins are loaded
function chruby_prompt_info \
rbenv_prompt_info \
hg_prompt_info \
pyenv_prompt_info \
svn_prompt_info \
vi_mode_prompt_info \
virtualenv_prompt_info \
jenv_prompt_info \
azure_prompt_info \
tf_prompt_info \
{
return 1
}
# oh-my-zsh supports an rvm prompt by default
# get the name of the rvm ruby version
function rvm_prompt_info() {
[ -f $HOME/.rvm/bin/rvm-prompt ] || return 1
local rvm_prompt
rvm_prompt=$($HOME/.rvm/bin/rvm-prompt ${=ZSH_THEME_RVM_PROMPT_OPTIONS} 2>/dev/null)
[[ -z "${rvm_prompt}" ]] && return 1
echo "${ZSH_THEME_RUBY_PROMPT_PREFIX}${rvm_prompt:gs/%/%%}${ZSH_THEME_RUBY_PROMPT_SUFFIX}"
}
ZSH_THEME_RVM_PROMPT_OPTIONS="i v g"
# use this to enable users to see their ruby version, no matter which
# version management system they use
function ruby_prompt_info() {
echo "$(rvm_prompt_info || rbenv_prompt_info || chruby_prompt_info)"
}

View File

@ -0,0 +1,38 @@
# A script to make using 256 colors in zsh less painful.
# P.C. Shyamshankar <sykora@lucentbeing.com>
# Copied from https://github.com/sykora/etc/blob/master/zsh/functions/spectrum/
typeset -AHg FX FG BG
FX=(
reset "%{%}"
bold "%{%}" no-bold "%{%}"
dim "%{%}" no-dim "%{%}"
italic "%{%}" no-italic "%{%}"
underline "%{%}" no-underline "%{%}"
blink "%{%}" no-blink "%{%}"
reverse "%{%}" no-reverse "%{%}"
)
for color in {000..255}; do
FG[$color]="%{[38;5;${color}m%}"
BG[$color]="%{[48;5;${color}m%}"
done
# Show all 256 colors with color number
function spectrum_ls() {
setopt localoptions nopromptsubst
local ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris}
for code in {000..255}; do
print -P -- "$code: ${FG[$code]}${ZSH_SPECTRUM_TEXT}%{$reset_color%}"
done
}
# Show all 256 colors where the background is set to specific color
function spectrum_bls() {
setopt localoptions nopromptsubst
local ZSH_SPECTRUM_TEXT=${ZSH_SPECTRUM_TEXT:-Arma virumque cano Troiae qui primus ab oris}
for code in {000..255}; do
print -P -- "$code: ${BG[$code]}${ZSH_SPECTRUM_TEXT}%{$reset_color%}"
done
}

View File

@ -0,0 +1,163 @@
# Set terminal window and tab/icon title
#
# usage: title short_tab_title [long_window_title]
#
# See: http://www.faqs.org/docs/Linux-mini/Xterm-Title.html#ss3.1
# Fully supports screen, iterm, and probably most modern xterm and rxvt
# (In screen, only short_tab_title is used)
# Limited support for Apple Terminal (Terminal can't set window and tab separately)
function title {
setopt localoptions nopromptsubst
# Don't set the title if inside emacs, unless using vterm
[[ -n "${INSIDE_EMACS:-}" && "$INSIDE_EMACS" != vterm ]] && return
# if $2 is unset use $1 as default
# if it is set and empty, leave it as is
: ${2=$1}
case "$TERM" in
cygwin|xterm*|putty*|rxvt*|konsole*|ansi|mlterm*|alacritty|st*|foot*|contour*)
print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name
;;
screen*|tmux*)
print -Pn "\ek${1:q}\e\\" # set screen hardstatus
;;
*)
if [[ "$TERM_PROGRAM" == "iTerm.app" ]]; then
print -Pn "\e]2;${2:q}\a" # set window name
print -Pn "\e]1;${1:q}\a" # set tab name
else
# Try to use terminfo to set the title if the feature is available
if (( ${+terminfo[fsl]} && ${+terminfo[tsl]} )); then
print -Pn "${terminfo[tsl]}$1${terminfo[fsl]}"
fi
fi
;;
esac
}
ZSH_THEME_TERM_TAB_TITLE_IDLE="%15<..<%~%<<" #15 char left truncated PWD
ZSH_THEME_TERM_TITLE_IDLE="%n@%m:%~"
# Avoid duplication of directory in terminals with independent dir display
if [[ "$TERM_PROGRAM" == Apple_Terminal ]]; then
ZSH_THEME_TERM_TITLE_IDLE="%n@%m"
fi
# Runs before showing the prompt
function omz_termsupport_precmd {
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return
title "$ZSH_THEME_TERM_TAB_TITLE_IDLE" "$ZSH_THEME_TERM_TITLE_IDLE"
}
# Runs before executing the command
function omz_termsupport_preexec {
[[ "${DISABLE_AUTO_TITLE:-}" != true ]] || return
emulate -L zsh
setopt extended_glob
# split command into array of arguments
local -a cmdargs
cmdargs=("${(z)2}")
# if running fg, extract the command from the job description
if [[ "${cmdargs[1]}" = fg ]]; then
# get the job id from the first argument passed to the fg command
local job_id jobspec="${cmdargs[2]#%}"
# logic based on jobs arguments:
# http://zsh.sourceforge.net/Doc/Release/Jobs-_0026-Signals.html#Jobs
# https://www.zsh.org/mla/users/2007/msg00704.html
case "$jobspec" in
<->) # %number argument:
# use the same <number> passed as an argument
job_id=${jobspec} ;;
""|%|+) # empty, %% or %+ argument:
# use the current job, which appears with a + in $jobstates:
# suspended:+:5071=suspended (tty output)
job_id=${(k)jobstates[(r)*:+:*]} ;;
-) # %- argument:
# use the previous job, which appears with a - in $jobstates:
# suspended:-:6493=suspended (signal)
job_id=${(k)jobstates[(r)*:-:*]} ;;
[?]*) # %?string argument:
# use $jobtexts to match for a job whose command *contains* <string>
job_id=${(k)jobtexts[(r)*${(Q)jobspec}*]} ;;
*) # %string argument:
# use $jobtexts to match for a job whose command *starts with* <string>
job_id=${(k)jobtexts[(r)${(Q)jobspec}*]} ;;
esac
# override preexec function arguments with job command
if [[ -n "${jobtexts[$job_id]}" ]]; then
1="${jobtexts[$job_id]}"
2="${jobtexts[$job_id]}"
fi
fi
# cmd name only, or if this is sudo or ssh, the next cmd
local CMD="${1[(wr)^(*=*|sudo|ssh|mosh|rake|-*)]:gs/%/%%}"
local LINE="${2:gs/%/%%}"
title "$CMD" "%100>...>${LINE}%<<"
}
autoload -Uz add-zsh-hook
if [[ -z "$INSIDE_EMACS" || "$INSIDE_EMACS" = vterm ]]; then
add-zsh-hook precmd omz_termsupport_precmd
add-zsh-hook preexec omz_termsupport_preexec
fi
# Keep terminal emulator's current working directory correct,
# even if the current working directory path contains symbolic links
#
# References:
# - Apple's Terminal.app: https://superuser.com/a/315029
# - iTerm2: https://iterm2.com/documentation-escape-codes.html (iTerm2 Extension / CurrentDir+RemoteHost)
# - Konsole: https://bugs.kde.org/show_bug.cgi?id=327720#c1
# - libvte (gnome-terminal, mate-terminal, …): https://bugzilla.gnome.org/show_bug.cgi?id=675987#c14
# Apparently it had a bug before ~2012 were it would display the unknown OSC 7 code
#
# As of May 2021 mlterm, PuTTY, rxvt, screen, termux & xterm simply ignore the unknown OSC.
# Don't define the function if we're inside Emacs or in an SSH session (#11696)
if [[ -n "$INSIDE_EMACS" || -n "$SSH_CLIENT" || -n "$SSH_TTY" ]]; then
return
fi
# Don't define the function if we're in an unsupported terminal
case "$TERM" in
# all of these either process OSC 7 correctly or ignore entirely
xterm*|putty*|rxvt*|konsole*|mlterm*|alacritty|screen*|tmux*) ;;
contour*|foot*) ;;
*)
# Terminal.app and iTerm2 process OSC 7 correctly
case "$TERM_PROGRAM" in
Apple_Terminal|iTerm.app) ;;
*) return ;;
esac ;;
esac
# Emits the control sequence to notify many terminal emulators
# of the cwd
#
# Identifies the directory using a file: URI scheme, including
# the host name to disambiguate local vs. remote paths.
function omz_termsupport_cwd {
# Percent-encode the host and path names.
local URL_HOST URL_PATH
URL_HOST="$(omz_urlencode -P $HOST)" || return 1
URL_PATH="$(omz_urlencode -P $PWD)" || return 1
# Konsole errors if the HOST is provided
[[ -z "$KONSOLE_PROFILE_NAME" && -z "$KONSOLE_DBUS_SESSION" ]] || URL_HOST=""
# common control sequence (OSC 7) to set current host and path
printf "\e]7;file://%s%s\e\\" "${URL_HOST}" "${URL_PATH}"
}
# Use a precmd hook instead of a chpwd hook to avoid contaminating output
# i.e. when a script or function changes directory without `cd -q`, chpwd
# will be called the output may be swallowed by the script or function.
add-zsh-hook precmd omz_termsupport_cwd

View File

@ -0,0 +1,81 @@
# Sets color variable such as $fg, $bg, $color and $reset_color
autoload -U colors && colors
# Expand variables and commands in PROMPT variables
setopt prompt_subst
# Prompt function theming defaults
ZSH_THEME_GIT_PROMPT_PREFIX="git:(" # Beginning of the git prompt, before the branch name
ZSH_THEME_GIT_PROMPT_SUFFIX=")" # End of the git prompt
ZSH_THEME_GIT_PROMPT_DIRTY="*" # Text to display if the branch is dirty
ZSH_THEME_GIT_PROMPT_CLEAN="" # Text to display if the branch is clean
ZSH_THEME_RUBY_PROMPT_PREFIX="("
ZSH_THEME_RUBY_PROMPT_SUFFIX=")"
# Use diff --color if available
if command diff --color /dev/null{,} &>/dev/null; then
function diff {
command diff --color "$@"
}
fi
# Don't set ls coloring if disabled
[[ "$DISABLE_LS_COLORS" != true ]] || return 0
# Default coloring for BSD-based ls
export LSCOLORS="Gxfxcxdxbxegedabagacad"
# Default coloring for GNU-based ls
if [[ -z "$LS_COLORS" ]]; then
# Define LS_COLORS via dircolors if available. Otherwise, set a default
# equivalent to LSCOLORS (generated via https://geoff.greer.fm/lscolors)
if (( $+commands[dircolors] )); then
[[ -f "$HOME/.dircolors" ]] \
&& source <(dircolors -b "$HOME/.dircolors") \
|| source <(dircolors -b)
else
export LS_COLORS="di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43"
fi
fi
function test-ls-args {
local cmd="$1" # ls, gls, colorls, ...
local args="${@[2,-1]}" # arguments except the first one
command "$cmd" "$args" /dev/null &>/dev/null
}
# Find the option for using colors in ls, depending on the version
case "$OSTYPE" in
netbsd*)
# On NetBSD, test if `gls` (GNU ls) is installed (this one supports colors);
# otherwise, leave ls as is, because NetBSD's ls doesn't support -G
test-ls-args gls --color && alias ls='gls --color=tty'
;;
openbsd*)
# On OpenBSD, `gls` (ls from GNU coreutils) and `colorls` (ls from base,
# with color and multibyte support) are available from ports.
# `colorls` will be installed on purpose and can't be pulled in by installing
# coreutils (which might be installed for ), so prefer it to `gls`.
test-ls-args gls --color && alias ls='gls --color=tty'
test-ls-args colorls -G && alias ls='colorls -G'
;;
(darwin|freebsd)*)
# This alias works by default just using $LSCOLORS
test-ls-args ls -G && alias ls='ls -G'
# Only use GNU ls if installed and there are user defaults for $LS_COLORS,
# as the default coloring scheme is not very pretty
zstyle -t ':omz:lib:theme-and-appearance' gnu-ls \
&& test-ls-args gls --color \
&& alias ls='gls --color=tty'
;;
*)
if test-ls-args ls --color; then
alias ls='ls --color=tty'
elif test-ls-args ls -G; then
alias ls='ls -G'
fi
;;
esac
unfunction test-ls-args

View File

@ -0,0 +1,53 @@
# Don't skip this file until a Zsh release does the necessary quoting.
# This is because even though 5.8.1 undid recursive prompt_subst inside
# prompt sequences, % characters in relevant fields will still be rendered
# incorrectly in vcs_info, on all Zsh releases up to writing this.
#
# There is no release yet that does this right, since it requires changing
# how what vcs_info hooks expect to receive. Even so, I'd rather be correct
# and break custom vcs_info hooks than have a broken prompt.
# Quote necessary $hook_com[<field>] items just before they are used
# in the line "VCS_INFO_hook 'post-backend'" of the VCS_INFO_formats
# function, where <field> is:
#
# base: the full path of the repository's root directory.
# base-name: the name of the repository's root directory.
# branch: the name of the currently checked out branch.
# misc: a string that may contain anything the vcs_info backend wants.
# revision: an identifier of the currently checked out revision.
# subdir: the path of the current directory relative to the
# repository's root directory.
#
# This patch %-quotes these fields previous to their use in vcs_info hooks and
# the zformat call and, eventually, when they get expanded in the prompt.
# It's important to quote these here, and not later after hooks have modified the
# fields, because then we could be quoting % characters from valid prompt sequences,
# like %F{color}, %B, etc.
#
# 32 │ hook_com[subdir]="$(VCS_INFO_reposub ${hook_com[base]})"
# 33 │ hook_com[subdir_orig]="${hook_com[subdir]}"
# 34 │
# 35 + │ for tmp in base base-name branch misc revision subdir; do
# 36 + │ hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"
# 37 + │ done
# 38 + │
# 39 │ VCS_INFO_hook 'post-backend'
#
# This is especially important so that no command substitution is performed
# due to malicious input as a consequence of CVE-2021-45444, which affects
# zsh versions from 5.0.3 to 5.8.
#
autoload -Uz +X regexp-replace VCS_INFO_formats 2>/dev/null || return 0
# We use $tmp here because it's already a local variable in VCS_INFO_formats
typeset PATCH='for tmp (base base-name branch misc revision subdir) hook_com[$tmp]="${hook_com[$tmp]//\%/%%}"'
# Unique string to avoid reapplying the patch if this code gets called twice
typeset PATCH_ID=vcs_info-patch-9b9840f2-91e5-4471-af84-9e9a0dc68c1b
# Only patch the VCS_INFO_formats function if not already patched
if [[ "$functions[VCS_INFO_formats]" != *$PATCH_ID* ]]; then
regexp-replace 'functions[VCS_INFO_formats]' \
"VCS_INFO_hook 'post-backend'" \
': ${PATCH_ID}; ${PATCH}; ${MATCH}'
fi
unset PATCH PATCH_ID

View File

238
dot_oh-my-zsh/oh-my-zsh.sh Normal file
View File

@ -0,0 +1,238 @@
# ANSI formatting function (\033[<code>m)
# 0: reset, 1: bold, 4: underline, 22: no bold, 24: no underline, 31: red, 33: yellow
omz_f() {
[ $# -gt 0 ] || return
IFS=";" printf "\033[%sm" $*
}
# If stdout is not a terminal ignore all formatting
[ -t 1 ] || omz_f() { :; }
# Protect against non-zsh execution of Oh My Zsh (use POSIX syntax here)
[ -n "$ZSH_VERSION" ] || {
omz_ptree() {
# Get process tree of the current process
pid=$$; pids="$pid"
while [ ${pid-0} -ne 1 ] && ppid=$(ps -e -o pid,ppid | awk "\$1 == $pid { print \$2 }"); do
pids="$pids $pid"; pid=$ppid
done
# Show process tree
case "$(uname)" in
Linux) ps -o ppid,pid,command -f -p $pids 2>/dev/null ;;
Darwin|*) ps -o ppid,pid,command -p $pids 2>/dev/null ;;
esac
# If ps command failed, try Busybox ps
[ $? -eq 0 ] || ps -o ppid,pid,comm | awk "NR == 1 || index(\"$pids\", \$2) != 0"
}
{
shell=$(ps -o pid,comm | awk "\$1 == $$ { print \$2 }")
printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded from: $(omz_f 1)${shell}$(omz_f 22). "
printf "You need to run $(omz_f 1)zsh$(omz_f 22) instead.$(omz_f 0)\n"
printf "$(omz_f 33)Here's the process tree:$(omz_f 22)\n\n"
omz_ptree
printf "$(omz_f 0)\n"
} >&2
return 1
}
# Check if in emulation mode, if so early return
# https://github.com/ohmyzsh/ohmyzsh/issues/11686
[[ "$(emulate)" = zsh ]] || {
printf "$(omz_f 1 31)Error:$(omz_f 22) Oh My Zsh can't be loaded in \`$(emulate)\` emulation mode.$(omz_f 0)\n" >&2
return 1
}
unset -f omz_f
# If ZSH is not defined, use the current script's directory.
[[ -z "$ZSH" ]] && export ZSH="${${(%):-%x}:a:h}"
# Set ZSH_CACHE_DIR to the path where cache files should be created
# or else we will use the default cache/
if [[ -z "$ZSH_CACHE_DIR" ]]; then
ZSH_CACHE_DIR="$ZSH/cache"
fi
# Make sure $ZSH_CACHE_DIR is writable, otherwise use a directory in $HOME
if [[ ! -w "$ZSH_CACHE_DIR" ]]; then
ZSH_CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/oh-my-zsh"
fi
# Create cache and completions dir and add to $fpath
mkdir -p "$ZSH_CACHE_DIR/completions"
(( ${fpath[(Ie)"$ZSH_CACHE_DIR/completions"]} )) || fpath=("$ZSH_CACHE_DIR/completions" $fpath)
# Check for updates on initial load...
source "$ZSH/tools/check_for_upgrade.sh"
# Initializes Oh My Zsh
# add a function path
fpath=("$ZSH/functions" "$ZSH/completions" $fpath)
# Load all stock functions (from $fpath files) called below.
autoload -U compaudit compinit zrecompile
# Set ZSH_CUSTOM to the path where your custom config files
# and plugins exists, or else we will use the default custom/
if [[ -z "$ZSH_CUSTOM" ]]; then
ZSH_CUSTOM="$ZSH/custom"
fi
is_plugin() {
local base_dir=$1
local name=$2
builtin test -f $base_dir/plugins/$name/$name.plugin.zsh \
|| builtin test -f $base_dir/plugins/$name/_$name
}
# Add all defined plugins to fpath. This must be done
# before running compinit.
for plugin ($plugins); do
if is_plugin "$ZSH_CUSTOM" "$plugin"; then
fpath=("$ZSH_CUSTOM/plugins/$plugin" $fpath)
elif is_plugin "$ZSH" "$plugin"; then
fpath=("$ZSH/plugins/$plugin" $fpath)
else
echo "[oh-my-zsh] plugin '$plugin' not found"
fi
done
# Figure out the SHORT hostname
if [[ "$OSTYPE" = darwin* ]]; then
# macOS's $HOST changes with dhcp, etc. Use ComputerName if possible.
SHORT_HOST=$(scutil --get ComputerName 2>/dev/null) || SHORT_HOST="${HOST/.*/}"
else
SHORT_HOST="${HOST/.*/}"
fi
# Save the location of the current completion dump file.
if [[ -z "$ZSH_COMPDUMP" ]]; then
ZSH_COMPDUMP="${ZDOTDIR:-$HOME}/.zcompdump-${SHORT_HOST}-${ZSH_VERSION}"
fi
# Construct zcompdump OMZ metadata
zcompdump_revision="#omz revision: $(builtin cd -q "$ZSH"; git rev-parse HEAD 2>/dev/null)"
zcompdump_fpath="#omz fpath: $fpath"
# Delete the zcompdump file if OMZ zcompdump metadata changed
if ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null \
|| ! command grep -q -Fx "$zcompdump_fpath" "$ZSH_COMPDUMP" 2>/dev/null; then
command rm -f "$ZSH_COMPDUMP"
zcompdump_refresh=1
fi
if [[ "$ZSH_DISABLE_COMPFIX" != true ]]; then
source "$ZSH/lib/compfix.zsh"
# Load only from secure directories
compinit -i -d "$ZSH_COMPDUMP"
# If completion insecurities exist, warn the user
handle_completion_insecurities &|
else
# If the user wants it, load from all found directories
compinit -u -d "$ZSH_COMPDUMP"
fi
# Append zcompdump metadata if missing
if (( $zcompdump_refresh )) \
|| ! command grep -q -Fx "$zcompdump_revision" "$ZSH_COMPDUMP" 2>/dev/null; then
# Use `tee` in case the $ZSH_COMPDUMP filename is invalid, to silence the error
# See https://github.com/ohmyzsh/ohmyzsh/commit/dd1a7269#commitcomment-39003489
tee -a "$ZSH_COMPDUMP" &>/dev/null <<EOF
$zcompdump_revision
$zcompdump_fpath
EOF
fi
unset zcompdump_revision zcompdump_fpath zcompdump_refresh
# zcompile the completion dump file if the .zwc is older or missing.
if command mkdir "${ZSH_COMPDUMP}.lock" 2>/dev/null; then
zrecompile -q -p "$ZSH_COMPDUMP"
command rm -rf "$ZSH_COMPDUMP.zwc.old" "${ZSH_COMPDUMP}.lock"
fi
_omz_source() {
local context filepath="$1"
# Construct zstyle context based on path
case "$filepath" in
lib/*) context="lib:${filepath:t:r}" ;; # :t = lib_name.zsh, :r = lib_name
plugins/*) context="plugins:${filepath:h:t}" ;; # :h = plugins/plugin_name, :t = plugin_name
esac
local disable_aliases=0
zstyle -T ":omz:${context}" aliases || disable_aliases=1
# Back up alias names prior to sourcing
local -A aliases_pre galiases_pre
if (( disable_aliases )); then
aliases_pre=("${(@kv)aliases}")
galiases_pre=("${(@kv)galiases}")
fi
# Source file from $ZSH_CUSTOM if it exists, otherwise from $ZSH
if [[ -f "$ZSH_CUSTOM/$filepath" ]]; then
source "$ZSH_CUSTOM/$filepath"
elif [[ -f "$ZSH/$filepath" ]]; then
source "$ZSH/$filepath"
fi
# Unset all aliases that don't appear in the backed up list of aliases
if (( disable_aliases )); then
if (( #aliases_pre )); then
aliases=("${(@kv)aliases_pre}")
else
(( #aliases )) && unalias "${(@k)aliases}"
fi
if (( #galiases_pre )); then
galiases=("${(@kv)galiases_pre}")
else
(( #galiases )) && unalias "${(@k)galiases}"
fi
fi
}
# Load all of the lib files in ~/oh-my-zsh/lib that end in .zsh
# TIP: Add files you don't want in git to .gitignore
for lib_file ("$ZSH"/lib/*.zsh); do
_omz_source "lib/${lib_file:t}"
done
unset lib_file
# Load all of the plugins that were defined in ~/.zshrc
for plugin ($plugins); do
_omz_source "plugins/$plugin/$plugin.plugin.zsh"
done
unset plugin
# Load all of your custom configurations from custom/
for config_file ("$ZSH_CUSTOM"/*.zsh(N)); do
source "$config_file"
done
unset config_file
# Load the theme
is_theme() {
local base_dir=$1
local name=$2
builtin test -f $base_dir/$name.zsh-theme
}
if [[ -n "$ZSH_THEME" ]]; then
if is_theme "$ZSH_CUSTOM" "$ZSH_THEME"; then
source "$ZSH_CUSTOM/$ZSH_THEME.zsh-theme"
elif is_theme "$ZSH_CUSTOM/themes" "$ZSH_THEME"; then
source "$ZSH_CUSTOM/themes/$ZSH_THEME.zsh-theme"
elif is_theme "$ZSH/themes" "$ZSH_THEME"; then
source "$ZSH/themes/$ZSH_THEME.zsh-theme"
else
echo "[oh-my-zsh] theme '$ZSH_THEME' not found"
fi
fi
# set completion colors to be the same as `ls`, after theme has been loaded
[[ -z "$LS_COLORS" ]] || zstyle ':completion:*' list-colors "${(s.:.)LS_COLORS}"

View File

@ -0,0 +1,9 @@
# Do nothing if op is not installed
(( ${+commands[op]} )) || return
# Load op completion
eval "$(op completion zsh)"
compdef _op op
# Load opswd function
autoload -Uz opswd

View File

@ -0,0 +1,40 @@
# 1Password
This plugin adds 1Password functionality to oh-my-zsh.
To use, add `1password` to the list of plugins in your `.zshrc` file:
```zsh
plugins=(... 1password)
```
Then, you can use the command `opswd` to copy passwords for services into your
clipboard.
## `opswd`
The `opswd` command is a wrapper around the `op` command. It takes a service
name as an argument and copies the username, then the password for that service
to the clipboard, after confirmation on the user part.
If the service also contains a TOTP, it is copied to the clipboard after confirmation
on the user part. Finally, after 20 seconds, the clipboard is cleared.
For example, `opswd github.com` will put your GitHub username into your clipboard. Then,
it will ask for confirmation to continue, and copy the password to your clipboard. Finally,
if a TOTP is available, it will be copied to the clipboard after your confirmation.
This function has completion support, so you can use tab completion to select which
service you want to get.
> NOTE: you need to be signed in for `opswd` to work. If you are using biometric unlock,
> 1Password CLI will automatically prompt you to sign in. See:
>
> - [Get started with 1Password CLI 2: Sign in](https://developer.1password.com/docs/cli/get-started#sign-in)
> - [Sign in to your 1Password account manually](https://developer.1password.com/docs/cli/sign-in-manually)
## Requirements
- [1Password CLI 2](https://developer.1password.com/docs/cli/get-started#install)
> NOTE: if you're using 1Password CLI 1, [see how to upgrade to CLI 2](https://developer.1password.com/docs/cli/upgrade).

View File

@ -0,0 +1,19 @@
#compdef opswd
function _opswd() {
local -a services
services=("${(@f)$(op item list --categories Login --cache 2>/dev/null | awk 'NR != 1 { print $2 }')}")
[[ -z "$services" ]] || compadd -a -- services
}
# TODO: 2022-03-26: Remove support for op CLI 1
autoload -Uz is-at-least
is-at-least 2.0.0 $(op --version) || {
function _opswd() {
local -a services
services=("${(@f)$(op list items --categories Login 2>/dev/null | op get item - --fields title 2>/dev/null)}")
[[ -z "$services" ]] || compadd -a -- services
}
}
_opswd "$@"

View File

@ -0,0 +1,90 @@
#autoload
# opswd puts the password of the named service into the clipboard. If there's a
# one time password, it will be copied into the clipboard after 10 seconds. The
# clipboard is cleared after another 20 seconds.
function opswd() {
if [[ $# -lt 1 ]]; then
echo "Usage: opswd <service>"
return 1
fi
local service=$1
# If not logged in, print error and return
op user list > /dev/null || return
local username
# Copy the username to the clipboard
if ! username=$(op item get "$service" --fields username 2>/dev/null); then
echo "error: could not obtain username for $service"
return 1
fi
echo -n "$username" | clipcopy
echo "✔ username for service $service copied to the clipboard. Press Enter to continue"
read
local password
# Copy the password to the clipboard
if ! password=$(op item get "$service" --fields password 2>/dev/null); then
echo "error: could not obtain password for $service"
return 1
fi
echo -n "$password" | clipcopy
echo "✔ password for $service copied to clipboard. Press Enter to continue"
read
# If there's a one time password, copy it to the clipboard
local totp
if totp=$(op item get --otp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then
echo -n "$totp" | clipcopy
echo "✔ TOTP for $service copied to clipboard"
fi
(sleep 20 && clipcopy </dev/null 2>/dev/null) &!
}
# TODO: 2022-03-26: Remove support for op CLI 1
autoload -Uz is-at-least
is-at-least 2.0.0 $(op --version) || {
print -ru2 ${(%):-"%F{yellow}opswd: usage with op version $(op --version) is deprecated. Upgrade to CLI 2 and reload zsh.
For instructions, see https://developer.1password.com/docs/cli/upgrade.%f"}
# opswd puts the password of the named service into the clipboard. If there's a
# one time password, it will be copied into the clipboard after 10 seconds. The
# clipboard is cleared after another 20 seconds.
function opswd() {
if [[ $# -lt 1 ]]; then
echo "Usage: opswd <service>"
return 1
fi
local service=$1
# If not logged in, print error and return
op list users > /dev/null || return
local password
# Copy the password to the clipboard
if ! password=$(op get item "$service" --fields password 2>/dev/null); then
echo "error: could not obtain password for $service"
return 1
fi
echo -n "$password" | clipcopy
echo "✔ password for $service copied to clipboard"
# If there's a one time password, copy it to the clipboard after 5 seconds
local totp
if totp=$(op get totp "$service" 2>/dev/null) && [[ -n "$totp" ]]; then
sleep 10 && echo -n "$totp" | clipcopy
echo "✔ TOTP for $service copied to clipboard"
fi
(sleep 20 && clipcopy </dev/null 2>/dev/null) &!
}
}
opswd "$@"

View File

@ -0,0 +1,8 @@
# adb autocomplete plugin
* Adds autocomplete options for all adb commands.
* Add autocomplete for `adb -s`
## Requirements
In order to make this work, you will need to have the Android adb tools set up in your path.

View File

@ -0,0 +1,67 @@
#compdef adb
#autoload
# in order to make this work, you will need to have the android adb tools
# adb zsh completion, based on homebrew completion
local -a _1st_arguments
_1st_arguments=(
'bugreport:return all information from the device that should be included in a bug report.'
'connect:connect to a device via TCP/IP Port 5555 is default.'
'devices:list all connected devices'
'disconnect:disconnect from a TCP/IP device. Port 5555 is default.'
'emu:run emulator console command'
'forward:forward socket connections'
'get-devpath:print the device path'
'get-serialno:print the serial number of the device'
'get-state:print the current state of the device: offline | bootloader | device'
'help:show the help message'
'install:push this package file to the device and install it'
'jdwp:list PIDs of processes hosting a JDWP transport'
'keygen:generate adb public/private key'
'kill-server:kill the server if it is running'
'logcat:view device log'
'pull:copy file/dir from device'
'push:copy file/dir to device'
'reboot:reboots the device, optionally into the bootloader or recovery program'
'reboot-bootloader:reboots the device into the bootloader'
'remount:remounts the partitions on the device read-write'
'root:restarts the adbd daemon with root permissions'
'sideload:push a ZIP to device and install it'
'shell:run remote shell interactively'
'sync:copy host->device only if changed (-l means list but dont copy)'
'start-server:ensure that there is a server running'
'tcpip:restart host adb in tcpip mode'
'uninstall:remove this app package from the device'
'usb:restart the adbd daemon listing on USB'
'version:show version num'
'wait-for-device:block until device is online'
)
local expl
local -a pkgs installed_pkgs
_arguments \
'-s[devices]:specify device:->specify_device' \
'*:: :->subcmds' && return 0
case "$state" in
specify_device)
_values -C 'devices' ${$(adb devices -l|awk 'NR>1&& $1 \
{sub(/ +/," ",$0); \
gsub(":","\\:",$1); \
for(i=1;i<=NF;i++) {
if($i ~ /model:/) { split($i,m,":") } \
else if($i ~ /product:/) { split($i,p,":") } } \
printf "%s[%s(%s)] ",$1, p[2], m[2]}'):-""}
return
;;
esac
if (( CURRENT == 1 )); then
_describe -t commands "adb subcommand" _1st_arguments
return
fi
_files

View File

@ -0,0 +1,13 @@
# The Silver Searcher
This plugin provides completion support for [`ag`](https://github.com/ggreer/the_silver_searcher).
To use it, add ag to the plugins array in your zshrc file.
```zsh
plugins=(... ag)
```
## INSTALLATION NOTES
Besides oh-my-zsh, `ag` needs to be installed by following these steps: https://github.com/ggreer/the_silver_searcher#installing.

View File

@ -0,0 +1,66 @@
#compdef ag
#autoload
typeset -A opt_args
# Took the liberty of not listing every option… specially aliases and -D
_ag () {
local -a _1st_arguments
_1st_arguments=(
'--ackmate:Print results in AckMate-parseable format'
{'-A','--after'}':[LINES] Print lines after match (Default: 2)'
{'-B','--before'}':[LINES] Print lines before match (Default: 2)'
'--break:Print newlines between matches in different files'
'--nobreak:Do not print newlines between matches in different files'
{'-c','--count'}':Only print the number of matches in each file'
'--color:Print color codes in results (Default: On)'
'--nocolor:Do not print color codes in results'
'--color-line-number:Color codes for line numbers (Default: 1;33)'
'--color-match:Color codes for result match numbers (Default: 30;43)'
'--color-path:Color codes for path names (Default: 1;32)'
'--column:Print column numbers in results'
{'-H','--heading'}':Print file names (On unless searching a single file)'
'--noheading:Do not print file names (On unless searching a single file)'
'--line-numbers:Print line numbers even for streams'
{'-C','--context'}':[LINES] Print lines before and after matches (Default: 2)'
'-g:[PATTERN] Print filenames matching PATTERN'
{'-l','--files-with-matches'}':Only print filenames that contain matches'
{'-L','--files-without-matches'}':Only print filenames that do not contain matches'
'--no-numbers:Do not print line numbers'
{'-o','--only-matching'}':Prints only the matching part of the lines'
'--print-long-lines:Print matches on very long lines (Default: 2k characters)'
'--passthrough:When searching a stream, print all lines even if they do not match'
'--silent:Suppress all log messages, including errors'
'--stats:Print stats (files scanned, time taken, etc.)'
'--vimgrep:Print results like vim :vimgrep /pattern/g would'
{'-0','--null'}':Separate filenames with null (for "xargs -0")'
{'-a','--all-types'}':Search all files (does not include hidden files / .gitignore)'
'--depth:[NUM] Search up to NUM directories deep (Default: 25)'
{'-f','--follow'}':Follow symlinks'
{'-G','--file-search-regex'}':[PATTERN] Limit search to filenames matching PATTERN'
'--hidden:Search hidden files (obeys .*ignore files)'
{'-i','--ignore-case'}':Match case insensitively'
'--ignore:[PATTERN] Ignore files/directories matching PATTERN'
{'-m','--max-count'}':[NUM] Skip the rest of a file after NUM matches (Default: 10k)'
{'-p','--path-to-agignore'}':[PATH] Use .agignore file at PATH'
{'-Q','--literal'}':Do not parse PATTERN as a regular expression'
{'-s','--case-sensitive'}':Match case'
{'-S','--smart-case'}':Insensitive match unless PATTERN has uppercase (Default: On)'
'--search-binary:Search binary files for matches'
{'-t','--all-text'}':Search all text files (Hidden files not included)'
{'-u','--unrestricted'}':Search all files (ignore .agignore and _all_)'
{'-U','--skip-vcs-ignores'}':Ignore VCS files (stil obey .agignore)'
{'-v','--invert-match'}':Invert match'
{'-w','--word-regexp'}':Only match whole words'
{'-z','--search-zip'}':Search contents of compressed (e.g., gzip) files'
'--list-file-types:list of supported file types'
)
if [[ $words[-1] =~ "^-" ]]; then
_describe -t commands "ag options" _1st_arguments && ret=0
else
_files && ret=0
fi
}

View File

@ -0,0 +1,33 @@
# alias-finder plugin
This plugin searches the defined aliases and outputs any that match the command inputted. This makes learning new aliases easier.
## Usage
To use it, add `alias-finder` to the `plugins` array of your zshrc file:
```
plugins=(... alias-finder)
```
To enable it for every single command, set zstyle in your `~/.zshrc`.
```zsh
# ~/.zshrc
zstyle ':omz:plugins:alias-finder' autoload yes # disabled by default
zstyle ':omz:plugins:alias-finder' longer yes # disabled by default
zstyle ':omz:plugins:alias-finder' exact yes # disabled by default
zstyle ':omz:plugins:alias-finder' cheaper yes # disabled by default
```
As you can see, options are also available with zstyle.
### Options
> In order to clarify, let's say `alias a=abc` has source 'abc' and destination 'a'.
- Use `--longer` or `-l` to include aliases where the source is longer than the input (in other words, the source could contain the whole input).
- Use `--exact` or `-e` to avoid aliases where the source is shorter than the input (in other words, the source must be the same with the input).
- Use `--cheaper` or `-c` to avoid aliases where the destination is longer than the input (in other words, the destination must be the shorter than the input).

View File

@ -0,0 +1,62 @@
alias-finder() {
local cmd=" " exact="" longer="" cheaper="" wordEnd="'{0,1}$" finder="" filter=""
# build command and options
for c in "$@"; do
case $c in
# TODO: Remove backward compatibility (other than zstyle form)
# set options if exist
-e|--exact) exact=true;;
-l|--longer) longer=true;;
-c|--cheaper) cheaper=true;;
# concatenate cmd
*) cmd="$cmd$c " ;;
esac
done
zstyle -t ':omz:plugins:alias-finder' longer && longer=true
zstyle -t ':omz:plugins:alias-finder' exact && exact=true
zstyle -t ':omz:plugins:alias-finder' cheaper && cheaper=true
# format cmd for grep
## - replace newlines with spaces
## - trim both ends
## - replace multiple spaces with one space
## - add escaping character to special characters
cmd=$(echo -n "$cmd" | tr '\n' ' ' | xargs | tr -s '[:space:]' | sed 's/[].\|$(){}?+*^[]/\\&/g')
if [[ $longer == true ]]; then
wordEnd="" # remove wordEnd to find longer aliases
fi
# find with alias and grep, removing last word each time until no more words
while [[ $cmd != "" ]]; do
finder="'{0,1}$cmd$wordEnd"
# make filter to find only shorter results than current cmd
if [[ $cheaper == true ]]; then
cmdLen=$(echo -n "$cmd" | wc -c)
filter="^'{0,1}.{0,$((cmdLen - 1))}="
fi
alias | grep -E "$filter" | grep -E "=$finder"
if [[ $exact == true ]]; then
break # because exact case is only one
elif [[ $longer = true ]]; then
break # because above grep command already found every longer aliases during first cycle
fi
cmd=$(sed -E 's/ {0,}[^ ]*$//' <<< "$cmd") # remove last word
done
}
preexec_alias-finder() {
# TODO: Remove backward compatibility (other than zstyle form)
zstyle -t ':omz:plugins:alias-finder' autoload && alias-finder $1 || if [[ $ZSH_ALIAS_FINDER_AUTOMATIC = true ]]; then
alias-finder $1
fi
}
autoload -U add-zsh-hook
add-zsh-hook preexec preexec_alias-finder

View File

@ -0,0 +1,9 @@
tap: false
directories:
tests: tests
output: tests/_output
support: tests/_support
time_limit: 0
fail_fast: false
allow_risky: false
verbose: true

View File

@ -0,0 +1,2 @@
#!/usr/bin/env zsh
# Write your bootstrap code here

View File

@ -0,0 +1,107 @@
#!/usr/bin/env zunit
@setup {
load ../alias-finder.plugin.zsh
set_git_aliases() {
unalias -a # all
alias g="git"
alias gc="git commit"
alias gcv="git commit -v"
alias gcvs="git commit -v -S"
}
}
@test 'find aliases that contain input' {
set_git_aliases
run alias-finder "git"
assert "${#lines[@]}" equals 1
assert "${lines[1]}" same_as "g=git"
}
@test 'find aliases that contain input with whitespaces at ends' {
set_git_aliases
run alias-finder " git "
assert "${#lines[@]}" equals 1
assert "${lines[1]}" same_as "g=git"
}
@test 'find aliases that contain multiple words' {
set_git_aliases
run alias-finder "git commit -v"
assert "${#lines[@]}" equals 3
assert "${lines[1]}" same_as "gcv='git commit -v'"
assert "${lines[2]}" same_as "gc='git commit'"
assert "${lines[3]}" same_as "g=git"
}
@test 'find alias that is the same with input when --exact option is set' {
set_git_aliases
run alias-finder -e "git"
assert "${#lines[@]}" equals 1
assert "${lines[1]}" same_as "g=git"
}
@test 'find alias that is the same with multiple words input when --exact option is set' {
set_git_aliases
run alias-finder -e "git commit -v"
assert "${#lines[@]}" equals 1
assert "${lines[1]}" same_as "gcv='git commit -v'"
}
@test 'find alias that is the same with or longer than input when --longer option is set' {
set_git_aliases
run alias-finder -l "git"
assert "${#lines[@]}" equals 4
assert "${lines[1]}" same_as "g=git"
assert "${lines[2]}" same_as "gc='git commit'"
assert "${lines[3]}" same_as "gcv='git commit -v'"
assert "${lines[4]}" same_as "gcvs='git commit -v -S'"
}
@test 'find alias that is the same with or longer than multiple words input when --longer option is set' {
set_git_aliases
run alias-finder -l "git commit -v"
assert "${#lines[@]}" equals 2
assert "${lines[1]}" same_as "gcv='git commit -v'"
assert "${lines[2]}" same_as "gcvs='git commit -v -S'"
}
@test 'find aliases including expensive (longer) than input' {
set_git_aliases
alias expensiveCommands="git commit"
run alias-finder "git commit -v"
assert "${#lines[@]}" equals 4
assert "${lines[1]}" same_as "gcv='git commit -v'"
assert "${lines[2]}" same_as "expensiveCommands='git commit'"
assert "${lines[3]}" same_as "gc='git commit'"
assert "${lines[4]}" same_as "g=git"
}
@test 'find aliases excluding expensive (longer) than input when --cheap option is set' {
set_git_aliases
alias expensiveCommands="git commit"
run alias-finder -c "git commit -v"
assert "${#lines[@]}" equals 3
assert "${lines[1]}" same_as "gcv='git commit -v'"
assert "${lines[2]}" same_as "gc='git commit'"
assert "${lines[3]}" same_as "g=git"
}

View File

@ -0,0 +1,28 @@
# Aliases cheatsheet
**Maintainer:** [@hqingyi](https://github.com/hqingyi)
With lots of 3rd-party amazing aliases installed, this plugin helps list the shortcuts
that are currently available based on the plugins you have enabled.
To use it, add `aliases` to the plugins array in your zshrc file:
```zsh
plugins=(aliases)
```
Requirements: Python needs to be installed.
## Usage
- `als`: show all aliases by group
- `als -h/--help`: print help message
- `als <keyword(s)>`: filter and highlight aliases by `<keyword>`
- `als -g <group>/--group <group>`: show only aliases for group `<group>`. Multiple uses of the flag show all groups
- `als --groups`: show only group names
![screenshot](https://github.com/ohmyzsh/ohmyzsh/assets/66907184/5bfa00ea-5fc3-4e97-8b22-2f74f6b948c7)

View File

@ -0,0 +1,14 @@
# Handle $0 according to the standard:
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
eval '
function als(){
(( $+commands[python3] )) || {
echo "[error] No python executable detected"
return
}
alias | python3 "'"${0:h}"'/cheatsheet.py" "$@"
}
'

View File

@ -0,0 +1,69 @@
#!/usr/bin/env python3
import sys
import itertools
import termcolor
import argparse
def parse(line):
left = line[0:line.find('=')].strip()
right = line[line.find('=')+1:].strip('\'"\n ')
try:
cmd = next(part for part in right.split() if len([char for char in '=<>' if char in part])==0)
except StopIteration:
cmd = right
return (left, right, cmd)
def cheatsheet(lines):
exps = [ parse(line) for line in lines ]
exps.sort(key=lambda exp:exp[2])
cheatsheet = {'_default': []}
for key, group in itertools.groupby(exps, lambda exp:exp[2]):
group_list = [ item for item in group ]
if len(group_list)==1:
target_aliases = cheatsheet['_default']
else:
if key not in cheatsheet:
cheatsheet[key] = []
target_aliases = cheatsheet[key]
target_aliases.extend(group_list)
return cheatsheet
def pretty_print_group(key, aliases, highlight=None, only_groupname=False):
if len(aliases) == 0:
return
group_hl_formatter = lambda g, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'red') for part in ('[%s]' % g).split(hl)])
alias_hl_formatter = lambda alias, hl: termcolor.colored(hl, 'yellow').join([termcolor.colored(part, 'green') for part in ('\t%s = %s' % alias[0:2]).split(hl)])
group_formatter = lambda g: termcolor.colored('[%s]' % g, 'red')
alias_formatter = lambda alias: termcolor.colored('\t%s = %s' % alias[0:2], 'green')
if highlight and len(highlight)>0:
print (group_hl_formatter(key, highlight))
if not only_groupname:
print ('\n'.join([alias_hl_formatter(alias, highlight) for alias in aliases]))
else:
print (group_formatter(key))
if not only_groupname:
print ('\n'.join([alias_formatter(alias) for alias in aliases]))
print ('')
def pretty_print(cheatsheet, wfilter, group_list=None, groups_only=False):
sorted_key = sorted(cheatsheet.keys())
for key in sorted_key:
if group_list and key not in group_list:
continue
aliases = cheatsheet.get(key)
if not wfilter:
pretty_print_group(key, aliases, wfilter, groups_only)
else:
pretty_print_group(key, [ alias for alias in aliases if alias[0].find(wfilter)>-1 or alias[1].find(wfilter)>-1], wfilter)
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="Pretty print aliases.", prog="als")
parser.add_argument('filter', nargs="*", metavar="<keyword>", help="search aliases matching keywords")
parser.add_argument('-g', '--group', dest="group_list", action='append', help="only print aliases in given groups")
parser.add_argument('--groups', dest='groups_only', action='store_true', help="only print alias groups")
args = parser.parse_args()
lines = sys.stdin.readlines()
group_list = args.group_list or None
wfilter = " ".join(args.filter) or None
pretty_print(cheatsheet(lines), wfilter, group_list, args.groups_only)

View File

@ -0,0 +1 @@
__pycache__

View File

@ -0,0 +1,168 @@
# coding: utf-8
# Copyright (c) 2008-2011 Volvox Development Team
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
# THE SOFTWARE.
#
# Author: Konstantin Lepa <konstantin.lepa@gmail.com>
"""ANSI Color formatting for output in terminal."""
from __future__ import print_function
import os
__ALL__ = [ 'colored', 'cprint' ]
VERSION = (1, 1, 0)
ATTRIBUTES = dict(
list(zip([
'bold',
'dark',
'',
'underline',
'blink',
'',
'reverse',
'concealed'
],
list(range(1, 9))
))
)
del ATTRIBUTES['']
HIGHLIGHTS = dict(
list(zip([
'on_grey',
'on_red',
'on_green',
'on_yellow',
'on_blue',
'on_magenta',
'on_cyan',
'on_white'
],
list(range(40, 48))
))
)
COLORS = dict(
list(zip([
'grey',
'red',
'green',
'yellow',
'blue',
'magenta',
'cyan',
'white',
],
list(range(30, 38))
))
)
RESET = '\033[0m'
def colored(text, color=None, on_color=None, attrs=None):
"""Colorize text.
Available text colors:
red, green, yellow, blue, magenta, cyan, white.
Available text highlights:
on_red, on_green, on_yellow, on_blue, on_magenta, on_cyan, on_white.
Available attributes:
bold, dark, underline, blink, reverse, concealed.
Example:
colored('Hello, World!', 'red', 'on_grey', ['blue', 'blink'])
colored('Hello, World!', 'green')
"""
if os.getenv('ANSI_COLORS_DISABLED') is None:
fmt_str = '\033[%dm%s'
if color is not None:
text = fmt_str % (COLORS[color], text)
if on_color is not None:
text = fmt_str % (HIGHLIGHTS[on_color], text)
if attrs is not None:
for attr in attrs:
text = fmt_str % (ATTRIBUTES[attr], text)
text += RESET
return text
def cprint(text, color=None, on_color=None, attrs=None, **kwargs):
"""Print colorize text.
It accepts arguments of print function.
"""
print((colored(text, color, on_color, attrs)), **kwargs)
if __name__ == '__main__':
print('Current terminal type: %s' % os.getenv('TERM'))
print('Test basic colors:')
cprint('Grey color', 'grey')
cprint('Red color', 'red')
cprint('Green color', 'green')
cprint('Yellow color', 'yellow')
cprint('Blue color', 'blue')
cprint('Magenta color', 'magenta')
cprint('Cyan color', 'cyan')
cprint('White color', 'white')
print(('-' * 78))
print('Test highlights:')
cprint('On grey color', on_color='on_grey')
cprint('On red color', on_color='on_red')
cprint('On green color', on_color='on_green')
cprint('On yellow color', on_color='on_yellow')
cprint('On blue color', on_color='on_blue')
cprint('On magenta color', on_color='on_magenta')
cprint('On cyan color', on_color='on_cyan')
cprint('On white color', color='grey', on_color='on_white')
print('-' * 78)
print('Test attributes:')
cprint('Bold grey color', 'grey', attrs=['bold'])
cprint('Dark red color', 'red', attrs=['dark'])
cprint('Underline green color', 'green', attrs=['underline'])
cprint('Blink yellow color', 'yellow', attrs=['blink'])
cprint('Reversed blue color', 'blue', attrs=['reverse'])
cprint('Concealed Magenta color', 'magenta', attrs=['concealed'])
cprint('Bold underline reverse cyan color', 'cyan',
attrs=['bold', 'underline', 'reverse'])
cprint('Dark blink concealed white color', 'white',
attrs=['dark', 'blink', 'concealed'])
print(('-' * 78))
print('Test mixing:')
cprint('Underline red on grey color', 'red', 'on_grey',
['underline'])
cprint('Reversed green on red color', 'green', 'on_red', ['reverse'])

View File

@ -0,0 +1,33 @@
# ansible plugin
## Introduction
The `ansible plugin` adds several aliases for useful [ansible](https://docs.ansible.com/ansible/latest/index.html) commands and [aliases](#aliases).
To use it, add `ansible` to the plugins array of your zshrc file:
```
plugins=(... ansible)
```
## Aliases
| Command | Description |
|:-------------------------------------------|:--------------------------------------------------------------------|
| `ansible-version` / `aver` | Show the version on ansible installed in this host |
| `ansible-role-init <role name>` / `arinit` | Creates the Ansible Role as per Ansible Galaxy standard |
| `a` | command `ansible` |
| `aconf` | command `ansible-config` |
| `acon` | command `ansible-console` |
| `ainv` | command `ansible-inventory` |
| `aplaybook` | command `ansible-playbook` |
| `adoc` | command `ansible-doc` |
| `agal` | command `ansible-galaxy` |
| `apull` | command `ansible-pull` |
| `aval` | command `ansible-vault` |
## Maintainer
### [Deepankumar](https://github.com/deepan10)
[https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin](https://github.com/deepan10/oh-my-zsh/tree/features/ansible-plugin)

View File

@ -0,0 +1,28 @@
# Functions
function ansible-version(){
ansible --version
}
function ansible-role-init(){
if ! [ -z $1 ] ; then
echo "Ansible Role : $1 Creating...."
ansible-galaxy init $1
tree $1
else
echo "Usage : ansible-role-init <role name>"
echo "Example : ansible-role-init role1"
fi
}
# Alias
alias a='ansible '
alias aconf='ansible-config '
alias acon='ansible-console '
alias aver='ansible-version'
alias arinit='ansible-role-init'
alias aplaybook='ansible-playbook '
alias ainv='ansible-inventory '
alias adoc='ansible-doc '
alias agal='ansible-galaxy '
alias apull='ansible-pull '
alias aval='ansible-vault'

View File

@ -0,0 +1,12 @@
# Ant
This plugin provides completion for [Ant](https://ant.apache.org/).
To use it, add `ant` to the plugins array in your zshrc file:
```zsh
plugins=(... ant)
```
It caches ant targets in a file named `.ant_targets`, you might want to add that to
your `.gitignore` file.

View File

@ -0,0 +1,22 @@
#compdef ant
_ant_does_target_list_need_generating () {
[[ ! -f .ant_targets ]] && return 0
[[ build.xml -nt .ant_targets ]] && return 0
return 1
}
_ant () {
if [[ ! -f build.xml ]]; then
return
fi
if ! _ant_does_target_list_need_generating; then
return
fi
ant -p | awk -F " " 'NR > 5 { print lastTarget } { lastTarget = $1 }' >| .ant_targets
compadd -- "$(cat .ant_targets)"
}
_ant "$@"

View File

@ -0,0 +1,2 @@
# Default to colored output
export ANT_ARGS='-logger org.apache.tools.ant.listener.AnsiColorLogger'

View File

@ -0,0 +1,21 @@
# apache2-macports plugin
Enables aliases to control a local Apache2 installed via [MacPorts](https://www.macports.org/).
To use it, add `apache2-macports` to the plugins array in your zshrc file:
```zsh
plugins=(... apache2-macports)
```
## Aliases
| Alias | Function | Description |
|----------------|-----------------------------------------|-----------------------|
| apache2restart | `sudo /path/to/apache2.wrapper restart` | Restart apache daemon |
| apache2start | `sudo /path/to/apache2.wrapper start` | Start apache daemon |
| apache2stop | `sudo /path/to/apache2.wrapper stop` | Stop apache daemon |
## Contributors
- Alexander Rinass (alex@rinass.net)

View File

@ -0,0 +1,6 @@
# commands to control local apache2 server installation
# paths are for osx installation via macports
alias apache2start='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper start'
alias apache2stop='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper stop'
alias apache2restart='sudo /opt/local/etc/LaunchDaemons/org.macports.apache2/apache2.wrapper restart'

View File

@ -0,0 +1,43 @@
## arcanist
This plugin adds many useful aliases for [arcanist](https://github.com/phacility/arcanist).
To use it, add `arcanist` to the plugins array of your zshrc file:
```zsh
plugins=(... arcanist)
```
## Aliases
| Alias | Command |
| ------- | ---------------------------------- |
| ara | `arc amend` |
| arb | `arc branch` |
| arbl | `arc bland` |
| arco | `arc cover` |
| arci | `arc commit` |
| ard | `arc diff` |
| ardc | `arc diff --create` |
| ardp | `arc diff --preview` |
| ardnu | `arc diff --nounit` |
| ardnupc | `arc diff --nounit --plan-changes` |
| ardpc | `arc diff --plan-changes` |
| are | `arc export` |
| arh | `arc help` |
| arho | `arc hotfix` |
| arl | `arc land` |
| arli | `arc lint` |
| arls | `arc list` |
| arpa | `arc patch` |
## Functions
The following functions make copy pasting revision ids from the URL bar of your browser
easier, as they allow for copy pasting the whole URL. For example: `ardu` accepts
both `https://arcanist-url.com/<REVISION>` as well as `<REVISION>`.
| Function | Command |
| ------------------------- | --------------------------------- |
| ardu [URL or revision_id] | `arc diff --update` [revision_id] |
| arpa [URL or revision_id] | `arc patch` [revision_id] |

View File

@ -0,0 +1,39 @@
#
# Aliases
# (sorted alphabetically)
#
alias ara='arc amend'
alias arb='arc branch'
alias arbl='arc bland'
alias arco='arc cover'
alias arci='arc commit'
alias ard='arc diff'
alias ardc='arc diff --create'
alias ardnu='arc diff --nounit'
alias ardnupc='arc diff --nounit --plan-changes'
alias ardpc='arc diff --plan-changes'
alias ardp='arc diff --preview' # creates a new diff in the phab interface
alias are='arc export'
alias arh='arc help'
alias arho='arc hotfix'
alias arl='arc land'
alias arli='arc lint'
alias arls='arc list'
#
# Functions
# (sorted alphabetically)
#
ardu() {
# Both `ardu https://arcanist-url.com/<REVISION>`, and `ardu <REVISION>` work.
arc diff --update "${1:t}"
}
arpa() {
# Both `arpa https://arcanist-url.com/<REVISION>`, and `arpa <REVISION>` work.
arc patch "${1:t}"
}

View File

@ -0,0 +1,184 @@
# Arch Linux plugin
This plugin adds some aliases and functions to work with Arch Linux.
To use it, add `archlinux` to the plugins array in your zshrc file:
```zsh
plugins=(... archlinux)
```
## Features
### Pacman
| Alias | Command | Description |
|--------------|----------------------------------------|------------------------------------------------------------------|
| pacin | `sudo pacman -S` | Install packages from the repositories |
| pacins | `sudo pacman -U` | Install a package from a local file |
| pacinsd | `sudo pacman -S --asdeps` | Install packages as dependencies of another package |
| paclean | `sudo pacman -Sc` | Clean out old and unused caches and packages |
| pacloc | `pacman -Qi` | Display information about a package in the local database |
| paclocs | `pacman -Qs` | Search for packages in the local database |
| paclr | `sudo pacman -Scc` | Remove all files from the cache |
| paclsorphans | `sudo pacman -Qdt` | List all orphaned packages |
| pacmir | `sudo pacman -Syy` | Force refresh of all package lists after updating mirrorlist |
| pacre | `sudo pacman -R` | Remove packages, keeping its settings and dependencies |
| pacrem | `sudo pacman -Rns` | Remove packages, including its settings and dependencies |
| pacrep | `pacman -Si` | Display information about a package in the repositories |
| pacreps | `pacman -Ss` | Search for packages in the repositories |
| pacrmorphans | `sudo pacman -Rs $(pacman -Qtdq)` | Delete all orphaned packages |
| pacupd | `sudo pacman -Sy` | Update and refresh local package, ABS and AUR databases |
| pacupg | `sudo pacman -Syu` | Sync with repositories before upgrading packages |
| pacfileupg | `sudo pacman -Fy` | Download fresh package databases from the server |
| pacfiles | `pacman -F` | Search package file names for matching strings |
| pacls | `pacman -Ql` | List files in a package |
| pacown | `pacman -Qo` | Show which package owns a file |
| upgrade[¹](#f1) | `sudo pacman -Syu` | Sync with repositories before upgrading packages |
| Function | Description |
|----------------|-----------------------------------------------------------|
| pacdisowned | List all disowned files in your system |
| paclist | List all explicitly installed packages with a description |
| pacmanallkeys | Get all keys for developers and trusted users |
| pacmansignkeys | Locally trust all keys passed as parameters |
| pacweb | Open the website of an ArchLinux package |
Note: paclist used to print packages with a description which are (1) explicitly installed
and (2) available for upgrade. Due to flawed scripting, it also printed all packages if no
upgrades were available. Use `pacman -Que` instead.
### AUR helpers
#### Aura
| Alias | Command | Description |
|---------|-------------------------------------------------|-------------------------------------------------------------------------|
| auclean | `sudo aura -Sc` | Clean out old and unused caches and packages |
| auclr | `sudo aura -Scc` | Remove all files from the cache |
| auin | `sudo aura -S` | Install packages from the repositories |
| aurin | `sudo aura -A` | Install packages from the repositories |
| auins | `sudo aura -U` | Install a package from a local file |
| auinsd | `sudo aura -S --asdeps` | Install packages as dependencies of another package (repositories only) |
| aurinsd | `sudo aura -A --asdeps` | Install packages as dependencies of another package (AUR only) |
| auloc | `aura -Qi` | Display information about a package in the local database |
| aulocs | `aura -Qs` | Search for packages in the local database |
| auls | `aura -Qql` | List all files owned by a given package |
| aulst | `aura -Qe` | List installed packages including from AUR (tagged as "local") |
| aumir | `sudo aura -Syy` | Force refresh of all package lists after updating mirrorlist |
| aurph | `sudo aura -Oj` | Remove orphans using aura |
| auown | `aura -Qqo` | Search for packages that own the specified file(s) |
| aure | `sudo aura -R` | Remove packages, keeping its settings and dependencies |
| aurem | `sudo aura -Rns` | Remove packages, including its settings and unneeded dependencies |
| aurep | `aura -Si` | Display information about a package in the repositories |
| aurrep | `aura -Ai` | Display information about a package from AUR |
| aureps | `aura -As --both` | Search for packages in the repositories and AUR |
| auras | `aura -As --both` | Same as above |
| auupd | `sudo aura -Sy` | Update and refresh local package, ABS and AUR databases |
| auupg | `sudo sh -c "aura -Syu && aura -Au"` | Sync with repositories before upgrading all packages (from AUR too) |
| ausu | `sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"` | Same as `auupg`, but without confirmation |
| upgrade[¹](#f1) | `sudo aura -Syu` | Sync with repositories before upgrading packages |
| Function | Description |
|-----------------|---------------------------------------------------------------------|
| auownloc _file_ | Display information about a package that owns the specified file(s) |
| auownls _file_ | List all files owned by a package that owns the specified file(s) |
#### Pacaur
| Alias | Command | Description |
|---------|-----------------------------------|---------------------------------------------------------------------|
| pacclean| `pacaur -Sc` | Clean out old and unused caches and packages |
| pacclr | `pacaur -Scc` | Remove all files from the cache |
| pain | `pacaur -S` | Install packages from the repositories |
| pains | `pacaur -U` | Install a package from a local file |
| painsd | `pacaur -S --asdeps` | Install packages as dependencies of another package |
| paloc | `pacaur -Qi` | Display information about a package in the local database |
| palocs | `pacaur -Qs` | Search for packages in the local database |
| palst | `pacaur -Qe` | List installed packages including from AUR (tagged as "local") |
| pamir | `pacaur -Syy` | Force refresh of all package lists after updating mirrorlist |
| paorph | `pacaur -Qtd` | Remove orphans using pacaur |
| pare | `pacaur -R` | Remove packages, keeping its settings and dependencies |
| parem | `pacaur -Rns` | Remove packages, including its settings and unneeded dependencies |
| parep | `pacaur -Si` | Display information about a package in the repositories |
| pareps | `pacaur -Ss` | Search for packages in the repositories |
| paupd | `pacaur -Sy` | Update and refresh local package, ABS and AUR databases |
| paupg | `pacaur -Syua` | Sync with repositories before upgrading all packages (from AUR too) |
| pasu | `pacaur -Syua --no-confirm` | Same as `paupg`, but without confirmation |
| upgrade[¹](#f1) | `pacaur -Syu` | Sync with repositories before upgrading packages |
#### Trizen
| Alias | Command | Description |
|---------|-----------------------------------|---------------------------------------------------------------------|
| trconf | `trizen -C` | Fix all configuration files with vimdiff |
| trclean | `trizen -Sc` | Clean out old and unused caches and packages |
| trclr | `trizen -Scc` | Remove all files from the cache |
| trin | `trizen -S` | Install packages from the repositories |
| trins | `trizen -U` | Install a package from a local file |
| trinsd | `trizen -S --asdeps` | Install packages as dependencies of another package |
| trloc | `trizen -Qi` | Display information about a package in the local database |
| trlocs | `trizen -Qs` | Search for packages in the local database |
| trlst | `trizen -Qe` | List installed packages including from AUR (tagged as "local") |
| trmir | `trizen -Syy` | Force refresh of all package lists after updating mirrorlist |
| trorph | `trizen -Qtd` | Remove orphans using yaourt |
| trre | `trizen -R` | Remove packages, keeping its settings and dependencies |
| trrem | `trizen -Rns` | Remove packages, including its settings and unneeded dependencies |
| trrep | `trizen -Si` | Display information about a package in the repositories |
| trreps | `trizen -Ss` | Search for packages in the repositories |
| trupd | `trizen -Sy` | Update and refresh local package, ABS and AUR databases |
| trupg | `trizen -Syua` | Sync with repositories before upgrading all packages (from AUR too) |
| trsu | `trizen -Syua --no-confirm` | Same as `trupg`, but without confirmation |
| upgrade[¹](#f1) | `trizen -Syu` | Sync with repositories before upgrading packages |
#### Yay
| Alias | Command | Description |
|---------|--------------------------------|-------------------------------------------------------------------|
| yaconf | `yay -Pg` | Print current configuration |
| yaclean | `yay -Sc` | Clean out old and unused caches and packages |
| yaclr | `yay -Scc` | Remove all files from the cache |
| yain | `yay -S` | Install packages from the repositories |
| yains | `yay -U` | Install a package from a local file |
| yainsd | `yay -S --asdeps` | Install packages as dependencies of another package |
| yaloc | `yay -Qi` | Display information about a package in the local database |
| yalocs | `yay -Qs` | Search for packages in the local database |
| yalst | `yay -Qe` | List installed packages including from AUR (tagged as "local") |
| yamir | `yay -Syy` | Force refresh of all package lists after updating mirrorlist |
| yaorph | `yay -Qtd` | Remove orphans using yay |
| yare | `yay -R` | Remove packages, keeping its settings and dependencies |
| yarem | `yay -Rns` | Remove packages, including its settings and unneeded dependencies |
| yarep | `yay -Si` | Display information about a package in the repositories |
| yareps | `yay -Ss` | Search for packages in the repositories |
| yaupd | `yay -Sy` | Update and refresh local package, ABS and AUR databases |
| yaupg | `yay -Syu` | Sync with repositories before upgrading packages |
| yasu | `yay -Syu --no-confirm` | Same as `yaupg`, but without confirmation |
| upgrade[¹](#f1) | `yay -Syu` | Sync with repositories before upgrading packages |
---
<span id="f1">¹</span>
The `upgrade` alias is set for all package managers. Its value will depend on
whether the package manager is installed, checked in the following order:
1. `yay`
2. `trizen`
3. `pacaur`
4. `aura`
5. `pacman`
## Contributors
- Benjamin Boudreau - dreurmail@gmail.com
- Celso Miranda - contacto@celsomiranda.net
- ratijas (ivan tkachenko) - me@ratijas.tk
- Juraj Fiala - doctorjellyface@riseup.net
- KhasMek - Boushh@gmail.com
- Majora320 (Moses Miller) - Majora320@gmail.com
- Martin Putniorz - mputniorz@gmail.com
- MatthR3D - matthr3d@gmail.com
- ornicar - thibault.duplessis@gmail.com
- Ybalrid (Arthur Brainville) - ybalrid@ybalrid.info
- Jeff M. Hubbard - jeffmhubbard@gmail.com
- K. Harishankar(harishnkr) - hari2menon1234@gmail.com
- WH-2099 - wh2099@outlook.com

View File

@ -0,0 +1,203 @@
#######################################
# Pacman #
#######################################
# Pacman - https://wiki.archlinux.org/index.php/Pacman_Tips
alias pacupg='sudo pacman -Syu'
alias pacin='sudo pacman -S'
alias paclean='sudo pacman -Sc'
alias pacins='sudo pacman -U'
alias paclr='sudo pacman -Scc'
alias pacre='sudo pacman -R'
alias pacrem='sudo pacman -Rns'
alias pacrep='pacman -Si'
alias pacreps='pacman -Ss'
alias pacloc='pacman -Qi'
alias paclocs='pacman -Qs'
alias pacinsd='sudo pacman -S --asdeps'
alias pacmir='sudo pacman -Syy'
alias paclsorphans='sudo pacman -Qdt'
alias pacrmorphans='sudo pacman -Rs $(pacman -Qtdq)'
alias pacfileupg='sudo pacman -Fy'
alias pacfiles='pacman -F'
alias pacls='pacman -Ql'
alias pacown='pacman -Qo'
alias pacupd="sudo pacman -Sy"
function paclist() {
pacman -Qqe | xargs -I{} -P0 --no-run-if-empty pacman -Qs --color=auto "^{}\$"
}
function pacdisowned() {
local tmp_dir db fs
tmp_dir=$(mktemp --directory)
db=$tmp_dir/db
fs=$tmp_dir/fs
trap "rm -rf $tmp_dir" EXIT
pacman -Qlq | sort -u > "$db"
find /etc /usr ! -name lost+found \
\( -type d -printf '%p/\n' -o -print \) | sort > "$fs"
comm -23 "$fs" "$db"
rm -rf $tmp_dir
}
alias pacmanallkeys='sudo pacman-key --refresh-keys'
function pacmansignkeys() {
local key
for key in $@; do
sudo pacman-key --recv-keys $key
sudo pacman-key --lsign-key $key
printf 'trust\n3\n' | sudo gpg --homedir /etc/pacman.d/gnupg \
--no-permission-warning --command-fd 0 --edit-key $key
done
}
if (( $+commands[xdg-open] )); then
function pacweb() {
if [[ $# = 0 || "$1" =~ '--help|-h' ]]; then
local underline_color="\e[${color[underline]}m"
echo "$0 - open the website of an ArchLinux package"
echo
echo "Usage:"
echo " $bold_color$0$reset_color ${underline_color}target${reset_color}"
return 1
fi
local pkg="$1"
local infos="$(LANG=C pacman -Si "$pkg")"
if [[ -z "$infos" ]]; then
return
fi
local repo="$(grep -m 1 '^Repo' <<< "$infos" | grep -oP '[^ ]+$')"
local arch="$(grep -m 1 '^Arch' <<< "$infos" | grep -oP '[^ ]+$')"
xdg-open "https://www.archlinux.org/packages/$repo/$arch/$pkg/" &>/dev/null
}
fi
#######################################
# AUR helpers #
#######################################
if (( $+commands[aura] )); then
alias auin='sudo aura -S'
alias aurin='sudo aura -A'
alias auclean='sudo aura -Sc'
alias auclr='sudo aura -Scc'
alias auins='sudo aura -U'
alias auinsd='sudo aura -S --asdeps'
alias aurinsd='sudo aura -A --asdeps'
alias auloc='aura -Qi'
alias aulocs='aura -Qs'
alias aulst='aura -Qe'
alias aumir='sudo aura -Syy'
alias aurph='sudo aura -Oj'
alias aure='sudo aura -R'
alias aurem='sudo aura -Rns'
alias aurep='aura -Si'
alias aurrep='aura -Ai'
alias aureps='aura -As --both'
alias auras='aura -As --both'
alias auupd="sudo aura -Sy"
alias auupg='sudo sh -c "aura -Syu && aura -Au"'
alias ausu='sudo sh -c "aura -Syu --no-confirm && aura -Au --no-confirm"'
# extra bonus specially for aura
alias auown="aura -Qqo"
alias auls="aura -Qql"
function auownloc() { aura -Qi $(aura -Qqo $@); }
function auownls () { aura -Qql $(aura -Qqo $@); }
fi
if (( $+commands[pacaur] )); then
alias pacclean='pacaur -Sc'
alias pacclr='pacaur -Scc'
alias paupg='pacaur -Syu'
alias pasu='pacaur -Syu --noconfirm'
alias pain='pacaur -S'
alias pains='pacaur -U'
alias pare='pacaur -R'
alias parem='pacaur -Rns'
alias parep='pacaur -Si'
alias pareps='pacaur -Ss'
alias paloc='pacaur -Qi'
alias palocs='pacaur -Qs'
alias palst='pacaur -Qe'
alias paorph='pacaur -Qtd'
alias painsd='pacaur -S --asdeps'
alias pamir='pacaur -Syy'
alias paupd="pacaur -Sy"
fi
if (( $+commands[trizen] )); then
alias trconf='trizen -C'
alias trupg='trizen -Syua'
alias trsu='trizen -Syua --noconfirm'
alias trin='trizen -S'
alias trclean='trizen -Sc'
alias trclr='trizen -Scc'
alias trins='trizen -U'
alias trre='trizen -R'
alias trrem='trizen -Rns'
alias trrep='trizen -Si'
alias trreps='trizen -Ss'
alias trloc='trizen -Qi'
alias trlocs='trizen -Qs'
alias trlst='trizen -Qe'
alias trorph='trizen -Qtd'
alias trinsd='trizen -S --asdeps'
alias trmir='trizen -Syy'
alias trupd="trizen -Sy"
fi
if (( $+commands[yay] )); then
alias yaconf='yay -Pg'
alias yaclean='yay -Sc'
alias yaclr='yay -Scc'
alias yaupg='yay -Syu'
alias yasu='yay -Syu --noconfirm'
alias yain='yay -S'
alias yains='yay -U'
alias yare='yay -R'
alias yarem='yay -Rns'
alias yarep='yay -Si'
alias yareps='yay -Ss'
alias yaloc='yay -Qi'
alias yalocs='yay -Qs'
alias yalst='yay -Qe'
alias yaorph='yay -Qtd'
alias yainsd='yay -S --asdeps'
alias yamir='yay -Syy'
alias yaupd="yay -Sy"
fi
# Check Arch Linux PGP Keyring before System Upgrade to prevent failure.
function upgrade() {
echo ":: Checking Arch Linux PGP Keyring..."
local installedver="$(sudo pacman -Qi archlinux-keyring | grep -Po '(?<=Version : ).*')"
local currentver="$(sudo pacman -Si archlinux-keyring | grep -Po '(?<=Version : ).*')"
if [ $installedver != $currentver ]; then
echo " Arch Linux PGP Keyring is out of date."
echo " Updating before full system upgrade."
sudo pacman -Sy --needed --noconfirm archlinux-keyring
else
echo " Arch Linux PGP Keyring is up to date."
echo " Proceeding with full system upgrade."
fi
if (( $+commands[yay] )); then
yay -Syu
elif (( $+commands[trizen] )); then
trizen -Syu
elif (( $+commands[pacaur] )); then
pacaur -Syu
elif (( $+commands[aura] )); then
sudo aura -Syu
else
sudo pacman -Syu
fi
}

View File

@ -0,0 +1,20 @@
# Argo CD plugin
This plugin adds completion for the [Argo CD](https://argoproj.github.io/cd/) CLI.
To use it, add `argocd` to the plugins array in your zshrc file:
```zsh
plugins=(... argocd)
```
This plugin does not add any aliases.
## Cache
This plugin caches the completion script and is automatically updated asynchronously when the plugin is
loaded, which is usually when you start up a new terminal emulator.
The cache is stored at:
- `$ZSH_CACHE/completions/_argocd` completions script

View File

@ -0,0 +1,14 @@
# Autocompletion for argocd.
if (( ! $+commands[argocd] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `argocd`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_argocd" ]]; then
typeset -g -A _comps
autoload -Uz _argocd
_comps[argocd]=_argocd
fi
argocd completion zsh >| "$ZSH_CACHE_DIR/completions/_argocd" &|

View File

@ -0,0 +1,30 @@
## asdf
**Maintainer:** [@RobLoach](https://github.com/RobLoach)
Adds integration with [asdf](https://github.com/asdf-vm/asdf), the extendable version manager, with support for Ruby, Node.js, Elixir, Erlang and more.
### Installation
1. [Download asdf](https://asdf-vm.com/guide/getting-started.html#_2-download-asdf) by running the following:
```
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
```
2. [Enable asdf](https://asdf-vm.com/guide/getting-started.html#_3-install-asdf) by adding it to your `plugins` definition in `~/.zshrc`.
```
plugins=(asdf)
```
### Usage
See the [asdf documentation](https://asdf-vm.com/guide/getting-started.html#_4-install-a-plugin) for information on how to use asdf:
```
asdf plugin add nodejs https://github.com/asdf-vm/asdf-nodejs.git
asdf install nodejs latest
asdf global nodejs latest
asdf local nodejs latest
```

View File

@ -0,0 +1,30 @@
# Find where asdf should be installed
ASDF_DIR="${ASDF_DIR:-$HOME/.asdf}"
ASDF_COMPLETIONS="$ASDF_DIR/completions"
if [[ ! -f "$ASDF_DIR/asdf.sh" || ! -f "$ASDF_COMPLETIONS/_asdf" ]]; then
# If not found, check for archlinux/AUR package (/opt/asdf-vm/)
if [[ -f "/opt/asdf-vm/asdf.sh" ]]; then
ASDF_DIR="/opt/asdf-vm"
ASDF_COMPLETIONS="$ASDF_DIR"
# If not found, check for Homebrew package
elif (( $+commands[brew] )); then
_ASDF_PREFIX="$(brew --prefix asdf)"
ASDF_DIR="${_ASDF_PREFIX}/libexec"
ASDF_COMPLETIONS="${_ASDF_PREFIX}/share/zsh/site-functions"
unset _ASDF_PREFIX
else
return
fi
fi
# Load command
if [[ -f "$ASDF_DIR/asdf.sh" ]]; then
source "$ASDF_DIR/asdf.sh"
# Load completions
if [[ -f "$ASDF_COMPLETIONS/_asdf" ]]; then
fpath+=("$ASDF_COMPLETIONS")
autoload -Uz _asdf
compdef _asdf asdf # compdef is already loaded before loading plugins
fi
fi

View File

@ -0,0 +1,20 @@
# Autoenv plugin
This plugin loads the [Autoenv](https://github.com/inishchith/autoenv).
To use it, add `autoenv` to the plugins array in your zshrc file:
```zsh
plugins=(... autoenv)
```
## Functions
* `use_env()`: creates and/or activates a virtualenv. For use in `.env` files.
See the source code for details.
## Requirements
In order to make this work, you will need to have the autoenv installed.
More info on the usage and install at [the project's homepage](https://github.com/inishchith/autoenv).

View File

@ -0,0 +1,80 @@
# Initialization: activate autoenv or report its absence
() {
local d autoenv_dir install_locations
if ! type autoenv_init >/dev/null; then
# Check if activate.sh is in $PATH
if (( $+commands[activate.sh] )); then
autoenv_dir="${commands[activate.sh]:h}"
fi
# Locate autoenv installation
if [[ -z $autoenv_dir ]]; then
install_locations=(
~/.autoenv
~/.local/bin
/usr/local/opt/autoenv
/opt/homebrew/opt/autoenv
/usr/local/bin
/usr/share/autoenv-git
~/Library/Python/bin
.venv/bin
venv/bin
env/bin
.env/bin
)
for d ( $install_locations ); do
if [[ -e $d/activate || -e $d/activate.sh ]]; then
autoenv_dir=$d
break
fi
done
fi
# Look for Homebrew path as a last resort
if [[ -z "$autoenv_dir" ]] && (( $+commands[brew] )); then
d=$(brew --prefix)/opt/autoenv
if [[ -e $d/activate || -e $d/activate.sh ]]; then
autoenv_dir=$d
fi
fi
# Complain if autoenv is not installed
if [[ -z $autoenv_dir ]]; then
cat <<END >&2
-------- AUTOENV ---------
Could not locate autoenv installation.
Please check if autoenv is correctly installed.
In the meantime the autoenv plugin is DISABLED.
--------------------------
END
return 1
fi
# Load autoenv
if [[ -e $autoenv_dir/activate ]]; then
source $autoenv_dir/activate
else
source $autoenv_dir/activate.sh
fi
fi
}
[[ $? != 0 ]] && return $?
# The use_env call below is a reusable command to activate/create a new Python
# virtualenv, requiring only a single declarative line of code in your .env files.
# It only performs an action if the requested virtualenv is not the current one.
use_env() {
local venv
venv="$1"
if [[ "${VIRTUAL_ENV:t}" != "$venv" ]]; then
if workon | grep -q "$venv"; then
workon "$venv"
else
echo -n "Create virtualenv $venv now? (Yn) "
read answer
if [[ "$answer" == "Y" ]]; then
mkvirtualenv "$venv"
fi
fi
fi
}

View File

@ -0,0 +1,11 @@
# Autojump plugin
This plugin loads the [autojump navigation tool](https://github.com/wting/autojump).
To use it, add `autojump` to the plugins array in your zshrc file:
```zsh
plugins=(... autojump)
```
**Note:** you have to [install autojump](https://github.com/wting/autojump#installation) first.

View File

@ -0,0 +1,38 @@
declare -a autojump_paths
autojump_paths=(
$HOME/.autojump/etc/profile.d/autojump.zsh # manual installation
$HOME/.autojump/share/autojump/autojump.zsh # manual installation
$HOME/.nix-profile/etc/profile.d/autojump.sh # NixOS installation
/run/current-system/sw/share/autojump/autojump.zsh # NixOS installation
/etc/profiles/per-user/$USER/share/autojump/autojump.zsh # Home Manager, NixOS with user-scoped packages
/usr/share/autojump/autojump.zsh # Debian and Ubuntu package
/etc/profile.d/autojump.zsh # manual installation
/etc/profile.d/autojump.sh # Gentoo installation
/usr/local/share/autojump/autojump.zsh # FreeBSD installation
/usr/pkg/share/autojump/autojump.zsh # NetBSD installation
/opt/local/etc/profile.d/autojump.sh # macOS with MacPorts
/usr/local/etc/profile.d/autojump.sh # macOS with Homebrew (default)
/opt/homebrew/etc/profile.d/autojump.sh # macOS with Homebrew (default on M1 macs)
/etc/profiles/per-user/$USER/etc/profile.d/autojump.sh # macOS Nix, Home Manager and flakes
)
for file in $autojump_paths; do
if [[ -f "$file" ]]; then
source "$file"
found=1
break
fi
done
# if no path found, try Homebrew
if (( ! found && $+commands[brew] )); then
file=$(brew --prefix)/etc/profile.d/autojump.sh
if [[ -f "$file" ]]; then
source "$file"
found=1
fi
fi
(( ! found )) && echo '[oh-my-zsh] autojump not found. Please install it first.'
unset autojump_paths file found

View File

@ -0,0 +1,8 @@
# autopep8 plugin
This plugin adds completion for [autopep8](https://pypi.org/project/autopep8/), a tool that automatically formats Python code to conform to the [PEP 8](http://www.python.org/dev/peps/pep-0008/) style guide.
To use it, add autopep8 to the plugins array of your zshrc file:
```
plugins=(... autopep8)
```

View File

@ -0,0 +1,32 @@
#compdef autopep8
#
# this is zsh completion function file.
# generated by genzshcomp(ver: 0.5.1)
#
typeset -A opt_args
local context state line
_arguments -s -S \
"--help[show this help message and exit]:" \
"-h[show this help message and exit]:" \
"--version[show program's version number and exit]:" \
"--verbose[print verbose messages; multiple -v result in more verbose messages]" \
"-v[print verbose messages; multiple -v result in more verbose messages]" \
"--diff[print the diff for the fixed source]" \
"-d[print the diff for the fixed source]" \
"--in-place[make changes to files in place]" \
"-i[make changes to files in place]" \
"--recursive[run recursively; must be used with --in-place or --diff]" \
"-r[run recursively; must be used with --in-place or --diff]" \
"--jobs[number of parallel jobs; match CPU count if value is less than 1]::n number of parallel jobs; match CPU count if value is:_files" \
"-j[number of parallel jobs; match CPU count if value is less than 1]::n number of parallel jobs; match CPU count if value is:_files" \
"--pep8-passes[maximum number of additional pep8 passes (default: 100)]::n:_files" \
"-p[maximum number of additional pep8 passes (default: 100)]::n:_files" \
"-a[-a result in more aggressive changes]::result:_files" \
"--exclude[exclude files/directories that match these comma- separated globs]::globs:_files" \
"--list-fixes[list codes for fixes; used by --ignore and --select]" \
"--ignore[do not fix these errors/warnings (default E226,E24)]::errors:_files" \
"--select[fix only these errors/warnings (e.g. E4,W)]::errors:_files" \
"--max-line-length[set maximum allowed line length (default: 79)]::n:_files" \
"*::args:_files"

View File

@ -0,0 +1,98 @@
# aws
This plugin provides completion support for [awscli v2](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/index.html)
and a few utilities to manage AWS profiles/regions and display them in the prompt.
[awscli v1](https://docs.aws.amazon.com/cli/latest/userguide/cliv2-migration.html) is no longer supported.
To use it, add `aws` to the plugins array in your zshrc file.
```zsh
plugins=(... aws)
```
## Plugin commands
* `asp [<profile>]`: sets `$AWS_PROFILE` and `$AWS_DEFAULT_PROFILE` (legacy) to `<profile>`.
It also sets `$AWS_EB_PROFILE` to `<profile>` for the Elastic Beanstalk CLI. It sets `$AWS_PROFILE_REGION` for display in `aws_prompt_info`.
Run `asp` without arguments to clear the profile.
* `asp [<profile>] login`: If AWS SSO has been configured in your aws profile, it will run the `aws sso login` command following profile selection.
* `asp [<profile>] login [<sso_session>]`: In addition to `asp [<profile>] login`, if SSO session has been configured in your aws profile, it will run the `aws sso login --sso-session <sso_session>` command following profile selection.
* `asp [<profile>] logout`: If AWS SSO has been configured in your aws profile, it will run the `aws sso logout` command following profile selection.
* `asr [<region>]`: sets `$AWS_REGION` and `$AWS_DEFAULT_REGION` (legacy) to `<region>`.
Run `asr` without arguments to clear the profile.
* `acp [<profile>] [<mfa_token>]`: in addition to `asp` functionality, it actually changes
the profile by assuming the role specified in the `<profile>` configuration. It supports
MFA and sets `$AWS_ACCESS_KEY_ID`, `$AWS_SECRET_ACCESS_KEY` and `$AWS_SESSION_TOKEN`, if
obtained. It requires the roles to be configured as per the
[official guide](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-role.html).
Run `acp` without arguments to clear the profile.
* `agp`: gets the current value of `$AWS_PROFILE`.
* `agr`: gets the current value of `$AWS_REGION`.
* `aws_change_access_key`: changes the AWS access key of a profile.
* `aws_profiles`: lists the available profiles in the `$AWS_CONFIG_FILE` (default: `~/.aws/config`).
Used to provide completion for the `asp` function.
* `aws_regions`: lists the available regions.
Used to provide completion for the `asr` function.
## Plugin options
* Set `SHOW_AWS_PROMPT=false` in your zshrc file if you want to prevent the plugin from modifying your RPROMPT.
Some themes might overwrite the value of RPROMPT instead of appending to it, so they'll need to be fixed to
see the AWS profile/region prompt.
* Set `AWS_PROFILE_STATE_ENABLED=true` in your zshrc file if you want the aws profile to persist between shell sessions.
This option might slow down your shell startup time.
By default the state file path is `/tmp/.aws_current_profile`. This means that the state won't survive a reboot or otherwise GC.
You can control the state file path using the `AWS_STATE_FILE` environment variable.
## Theme
The plugin creates an `aws_prompt_info` function that you can use in your theme, which displays
the current `$AWS_PROFILE` and `$AWS_REGION`. It uses four variables to control how that is shown:
* ZSH_THEME_AWS_PROFILE_PREFIX: sets the prefix of the AWS_PROFILE. Defaults to `<aws:`.
* ZSH_THEME_AWS_PROFILE_SUFFIX: sets the suffix of the AWS_PROFILE. Defaults to `>`.
* ZSH_THEME_AWS_REGION_PREFIX: sets the prefix of the AWS_REGION. Defaults to `<region:`.
* ZSH_THEME_AWS_REGION_SUFFIX: sets the suffix of the AWS_REGION. Defaults to `>`.
* ZSH_THEME_AWS_DIVIDER: sets the divider between ZSH_THEME_AWS_PROFILE_SUFFIX and ZSH_THEME_AWS_REGION_PREFIX. Defaults to ` ` (single space).
## Configuration
[Configuration and credential file settings](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) by AWS
### Scenario: IAM roles with a source profile and MFA authentication
Source profile credentials in `~/.aws/credentials`:
```ini
[source-profile-name]
aws_access_key_id = ...
aws_secret_access_key = ...
```
Role configuration in `~/.aws/config`:
```ini
[profile source-profile-name]
mfa_serial = arn:aws:iam::111111111111:mfa/myuser
region = us-east-1
output = json
[profile profile-with-role]
role_arn = arn:aws:iam::9999999999999:role/myrole
mfa_serial = arn:aws:iam::111111111111:mfa/myuser
source_profile = source-profile-name
region = us-east-1
output = json
```

View File

@ -0,0 +1,338 @@
function agp() {
echo $AWS_PROFILE
}
function agr() {
echo $AWS_REGION
}
# Update state file if enabled
function _aws_update_state() {
if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
test -d $(dirname ${AWS_STATE_FILE}) || exit 1
echo "${AWS_PROFILE} ${AWS_REGION}" > "${AWS_STATE_FILE}"
fi
}
function _aws_clear_state() {
if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
test -d $(dirname ${AWS_STATE_FILE}) || exit 1
echo -n > "${AWS_STATE_FILE}"
fi
}
# AWS profile selection
function asp() {
if [[ -z "$1" ]]; then
unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE AWS_PROFILE_REGION
_aws_clear_state
echo AWS profile cleared.
return
fi
local -a available_profiles
available_profiles=($(aws_profiles))
if [[ -z "${available_profiles[(r)$1]}" ]]; then
echo "${fg[red]}Profile '$1' not found in '${AWS_CONFIG_FILE:-$HOME/.aws/config}'" >&2
echo "Available profiles: ${(j:, :)available_profiles:-no profiles found}${reset_color}" >&2
return 1
fi
export AWS_DEFAULT_PROFILE=$1
export AWS_PROFILE=$1
export AWS_EB_PROFILE=$1
export AWS_PROFILE_REGION=$(aws configure get region)
_aws_update_state
if [[ "$2" == "login" ]]; then
if [[ -n "$3" ]]; then
aws sso login --sso-session $3
else
aws sso login
fi
elif [[ "$2" == "logout" ]]; then
aws sso logout
fi
}
# AWS region selection
function asr() {
if [[ -z "$1" ]]; then
unset AWS_DEFAULT_REGION AWS_REGION
_aws_update_state
echo AWS region cleared.
return
fi
local -a available_regions
available_regions=($(aws_regions))
if [[ -z "${available_regions[(r)$1]}" ]]; then
echo "${fg[red]}Available regions: \n$(aws_regions)"
return 1
fi
export AWS_REGION=$1
export AWS_DEFAULT_REGION=$1
_aws_update_state
}
# AWS profile switch
function acp() {
if [[ -z "$1" ]]; then
unset AWS_DEFAULT_PROFILE AWS_PROFILE AWS_EB_PROFILE
unset AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_SESSION_TOKEN
echo AWS profile cleared.
return
fi
local -a available_profiles
available_profiles=($(aws_profiles))
if [[ -z "${available_profiles[(r)$1]}" ]]; then
echo "${fg[red]}Profile '$1' not found in '${AWS_CONFIG_FILE:-$HOME/.aws/config}'" >&2
echo "Available profiles: ${(j:, :)available_profiles:-no profiles found}${reset_color}" >&2
return 1
fi
local profile="$1"
local mfa_token="$2"
# Get fallback credentials for if the aws command fails or no command is run
local aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)"
local aws_secret_access_key="$(aws configure get aws_secret_access_key --profile $profile)"
local aws_session_token="$(aws configure get aws_session_token --profile $profile)"
# First, if the profile has MFA configured, lets get the token and session duration
local mfa_serial="$(aws configure get mfa_serial --profile $profile)"
local sess_duration="$(aws configure get duration_seconds --profile $profile)"
if [[ -n "$mfa_serial" ]]; then
local -a mfa_opt
if [[ -z "$mfa_token" ]]; then
echo -n "Please enter your MFA token for $mfa_serial: "
read -r mfa_token
fi
if [[ -z "$sess_duration" ]]; then
echo -n "Please enter the session duration in seconds (900-43200; default: 3600, which is the default maximum for a role): "
read -r sess_duration
fi
mfa_opt=(--serial-number "$mfa_serial" --token-code "$mfa_token" --duration-seconds "${sess_duration:-3600}")
fi
# Now see whether we need to just MFA for the current role, or assume a different one
local role_arn="$(aws configure get role_arn --profile $profile)"
local sess_name="$(aws configure get role_session_name --profile $profile)"
if [[ -n "$role_arn" ]]; then
# Means we need to assume a specified role
aws_command=(aws sts assume-role --role-arn "$role_arn" "${mfa_opt[@]}")
# Check whether external_id is configured to use while assuming the role
local external_id="$(aws configure get external_id --profile $profile)"
if [[ -n "$external_id" ]]; then
aws_command+=(--external-id "$external_id")
fi
# Get source profile to use to assume role
local source_profile="$(aws configure get source_profile --profile $profile)"
if [[ -z "$sess_name" ]]; then
sess_name="${source_profile:-profile}"
fi
aws_command+=(--profile="${source_profile:-profile}" --role-session-name "${sess_name}")
echo "Assuming role $role_arn using profile ${source_profile:-profile}"
else
# Means we only need to do MFA
aws_command=(aws sts get-session-token --profile="$profile" "${mfa_opt[@]}")
echo "Obtaining session token for profile $profile"
fi
# Format output of aws command for easier processing
aws_command+=(--query '[Credentials.AccessKeyId,Credentials.SecretAccessKey,Credentials.SessionToken]' --output text)
# Run the aws command to obtain credentials
local -a credentials
credentials=(${(ps:\t:)"$(${aws_command[@]})"})
if [[ -n "$credentials" ]]; then
aws_access_key_id="${credentials[1]}"
aws_secret_access_key="${credentials[2]}"
aws_session_token="${credentials[3]}"
fi
# Switch to AWS profile
if [[ -n "${aws_access_key_id}" && -n "$aws_secret_access_key" ]]; then
export AWS_DEFAULT_PROFILE="$profile"
export AWS_PROFILE="$profile"
export AWS_EB_PROFILE="$profile"
export AWS_ACCESS_KEY_ID="$aws_access_key_id"
export AWS_SECRET_ACCESS_KEY="$aws_secret_access_key"
if [[ -n "$aws_session_token" ]]; then
export AWS_SESSION_TOKEN="$aws_session_token"
else
unset AWS_SESSION_TOKEN
fi
echo "Switched to AWS Profile: $profile"
fi
}
function aws_change_access_key() {
if [[ -z "$1" ]]; then
echo "usage: $0 <profile>"
return 1
fi
local profile="$1"
# Get current access key
local original_aws_access_key_id="$(aws configure get aws_access_key_id --profile $profile)"
asp "$profile" || return 1
echo "Generating a new access key pair for you now."
if aws --no-cli-pager iam create-access-key; then
echo "Insert the newly generated credentials when asked."
aws --no-cli-pager configure --profile $profile
else
echo "Current access keys:"
aws --no-cli-pager iam list-access-keys
echo "Profile \"${profile}\" is currently using the $original_aws_access_key_id key. You can delete an old access key by running \`aws --profile $profile iam delete-access-key --access-key-id AccessKeyId\`"
return 1
fi
read -q "yn?Would you like to disable your previous access key (${original_aws_access_key_id}) now? "
case $yn in
[Yy]*)
echo -n "\nDisabling access key ${original_aws_access_key_id}..."
if aws --no-cli-pager iam update-access-key --access-key-id ${original_aws_access_key_id} --status Inactive; then
echo "done."
else
echo "\nFailed to disable ${original_aws_access_key_id} key."
fi
;;
*)
echo ""
;;
esac
echo "You can now safely delete the old access key by running \`aws --profile $profile iam delete-access-key --access-key-id ${original_aws_access_key_id}\`"
echo "Your current keys are:"
aws --no-cli-pager iam list-access-keys
}
function aws_regions() {
local region
if [[ $AWS_DEFAULT_REGION ]];then
region="$AWS_DEFAULT_REGION"
elif [[ $AWS_REGION ]];then
region="$AWS_REGION"
else
region="us-west-1"
fi
if [[ $AWS_DEFAULT_PROFILE || $AWS_PROFILE ]];then
aws ec2 describe-regions --region $region |grep RegionName | awk -F ':' '{gsub(/"/, "", $2);gsub(/,/, "", $2);gsub(/ /, "", $2); print $2}'
else
echo "You must specify a AWS profile."
fi
}
function aws_profiles() {
aws --no-cli-pager configure list-profiles 2> /dev/null && return
[[ -r "${AWS_CONFIG_FILE:-$HOME/.aws/config}" ]] || return 1
grep --color=never -Eo '\[.*\]' "${AWS_CONFIG_FILE:-$HOME/.aws/config}" | sed -E 's/^[[:space:]]*\[(profile)?[[:space:]]*([^[:space:]]+)\][[:space:]]*$/\2/g'
}
function _aws_regions() {
reply=($(aws_regions))
}
compctl -K _aws_regions asr
function _aws_profiles() {
reply=($(aws_profiles))
}
compctl -K _aws_profiles asp acp aws_change_access_key
# AWS prompt
function aws_prompt_info() {
local _aws_to_show
local region="${AWS_REGION:-${AWS_DEFAULT_REGION:-$AWS_PROFILE_REGION}}"
if [[ -n "$AWS_PROFILE" ]];then
_aws_to_show+="${ZSH_THEME_AWS_PROFILE_PREFIX="<aws:"}${AWS_PROFILE}${ZSH_THEME_AWS_PROFILE_SUFFIX=">"}"
fi
if [[ -n "$region" ]]; then
[[ -n "$_aws_to_show" ]] && _aws_to_show+="${ZSH_THEME_AWS_DIVIDER=" "}"
_aws_to_show+="${ZSH_THEME_AWS_REGION_PREFIX="<region:"}${region}${ZSH_THEME_AWS_REGION_SUFFIX=">"}"
fi
echo "$_aws_to_show"
}
if [[ "$SHOW_AWS_PROMPT" != false && "$RPROMPT" != *'$(aws_prompt_info)'* ]]; then
RPROMPT='$(aws_prompt_info)'"$RPROMPT"
fi
if [[ "$AWS_PROFILE_STATE_ENABLED" == true ]]; then
AWS_STATE_FILE="${AWS_STATE_FILE:-/tmp/.aws_current_profile}"
test -s "${AWS_STATE_FILE}" || return
aws_state=($(cat $AWS_STATE_FILE))
export AWS_DEFAULT_PROFILE="${aws_state[1]}"
export AWS_PROFILE="$AWS_DEFAULT_PROFILE"
export AWS_EB_PROFILE="$AWS_DEFAULT_PROFILE"
test -z "${aws_state[2]}" && AWS_REGION=$(aws configure get region)
export AWS_REGION=${AWS_REGION:-$aws_state[2]}
export AWS_DEFAULT_REGION="$AWS_REGION"
fi
# Load awscli completions
# AWS CLI v2 comes with its own autocompletion. Check if that is there, otherwise fall back
if command -v aws_completer &> /dev/null; then
autoload -Uz bashcompinit && bashcompinit
complete -C aws_completer aws
else
function _awscli-homebrew-installed() {
# check if Homebrew is installed
(( $+commands[brew] )) || return 1
# speculatively check default brew prefix
if [ -h /usr/local/opt/awscli ]; then
_brew_prefix=/usr/local/opt/awscli
else
# ok, it is not in the default prefix
# this call to brew is expensive (about 400 ms), so at least let's make it only once
_brew_prefix=$(brew --prefix awscli)
fi
}
# get aws_zsh_completer.sh location from $PATH
_aws_zsh_completer_path="$commands[aws_zsh_completer.sh]"
# otherwise check common locations
if [[ -z $_aws_zsh_completer_path ]]; then
# Homebrew
if _awscli-homebrew-installed; then
_aws_zsh_completer_path=$_brew_prefix/libexec/bin/aws_zsh_completer.sh
# Ubuntu
elif [[ -e /usr/share/zsh/vendor-completions/_awscli ]]; then
_aws_zsh_completer_path=/usr/share/zsh/vendor-completions/_awscli
# NixOS
elif [[ -e "${commands[aws]:P:h:h}/share/zsh/site-functions/aws_zsh_completer.sh" ]]; then
_aws_zsh_completer_path="${commands[aws]:P:h:h}/share/zsh/site-functions/aws_zsh_completer.sh"
# RPM
else
_aws_zsh_completer_path=/usr/share/zsh/site-functions/aws_zsh_completer.sh
fi
fi
[[ -r $_aws_zsh_completer_path ]] && source $_aws_zsh_completer_path
unset _aws_zsh_completer_path _brew_prefix
fi

View File

@ -0,0 +1,49 @@
# azure
This plugin provides completion support for [azure cli](https://docs.microsoft.com/en-us/cli/azure/)
and a few utilities to manage azure subscriptions and display them in the prompt.
To use it, add `azure` to the plugins array in your zshrc file.
```zsh
plugins=(... azure)
```
## Plugin commands
* `az_subscriptions`: lists the available subscriptions in the `AZURE_CONFIG_DIR` (default: `~/.azure/`).
Used to provide completion for the `azss` function.
* `azgs`: gets the current value of `$azure_subscription`.
* `azss [<subscription>]`: sets the `$azure_subscription`.
NOTE : because azure keeps the state of active subscription in ${AZURE_CONFIG_DIR:-$HOME/.azure/azureProfile.json}, the prompt command requires `jq` to be enabled to parse the file. If jq is not in the path the prompt will show nothing
## Theme
The plugin creates an `azure_prompt_info` function that you can use in your theme, which displays
the current `$azure_subscription`. It uses two variables to control how that is shown:
- ZSH_THEME_AZURE_PREFIX: sets the prefix of the azure_subscription. Defaults to `<az:`.
- ZSH_THEME_azure_SUFFIX: sets the suffix of the azure_subscription. Defaults to `>`.
```
RPROMPT='$(azure_prompt_info)'
```
## Develop
On ubuntu get a working environment with :
` docker run -it -v $(pwd):/mnt -w /mnt ubuntu bash`
```
apt install -y curl jq zsh git vim
sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
curl -sL https://aka.ms/InstallAzureCLIDeb | bash
```

View File

@ -0,0 +1,60 @@
# AZ Get Subscriptions
function azgs() {
az account show --output tsv --query 'name' 2>/dev/null
}
# AZ Subscription Selection
alias azss="az account set --subscription"
function az_subscriptions() {
az account list --all --output tsv --query '[*].name' 2> /dev/null
}
function _az_subscriptions() {
reply=($(az_subscriptions))
}
compctl -K _az_subscriptions azss
# Azure prompt
function azure_prompt_info() {
[[ ! -f "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json" ]] && return
# azgs is too expensive, if we have jq, we enable the prompt
(( $+commands[jq] )) || return 1
azgs=$(jq -r '.subscriptions[] | select(.isDefault==true) .name' "${AZURE_CONFIG_DIR:-$HOME/.azure}/azureProfile.json")
echo "${ZSH_THEME_AZURE_PREFIX:=<az:}${azgs}${ZSH_THEME_AZURE_SUFFIX:=>}"
}
# Load az completions
function _az-homebrew-installed() {
# check if Homebrew is installed
(( $+commands[brew] )) || return 1
# if so, we assume it's default way to install brew
if [[ ${commands[brew]:t2} == bin/brew ]]; then
_brew_prefix="${commands[brew]:h:h}" # remove trailing /bin/brew
else
# ok, it is not in the default prefix
# this call to brew is expensive (about 400 ms), so at least let's make it only once
_brew_prefix=$(brew --prefix)
fi
}
# get az.completion.sh location from $PATH
_az_zsh_completer_path="$commands[az_zsh_completer.sh]"
# otherwise check common locations
if [[ -z $_az_zsh_completer_path ]]; then
# Homebrew
if _az-homebrew-installed; then
_az_zsh_completer_path=$_brew_prefix/etc/bash_completion.d/az
# Linux
else
_az_zsh_completer_path=/etc/bash_completion.d/azure-cli
fi
fi
[[ -r $_az_zsh_completer_path ]] && autoload -U +X bashcompinit && bashcompinit && source $_az_zsh_completer_path
unset _az_zsh_completer_path _brew_prefix

View File

@ -0,0 +1,29 @@
# Battery Plugin
This plugin adds some functions you can use to display battery information in your custom theme.
To use, add `battery` to the list of plugins in your `.zshrc` file:
`plugins=(... battery)`
Then, add the `battery_pct_prompt` function to your custom theme. For example:
```zsh
RPROMPT='$(battery_pct_prompt) ...'
```
## Requirements
- On Linux, you must have the `acpi` or `acpitool` commands installed on your operating system.
On Debian/Ubuntu, you can do that with `sudo apt install acpi` or `sudo apt install acpitool`.
- On Android (via [Termux](https://play.google.com/store/apps/details?id=com.termux)), you must have:
1. The `Termux:API` addon app installed:
[Google Play](https://play.google.com/store/apps/details?id=com.termux.api) | [F-Droid](https://f-droid.org/packages/com.termux.api/)
2. The `termux-api` package installed within termux:
```sh
pkg install termux-api
```

View File

@ -0,0 +1,306 @@
###########################################
# Battery plugin for oh-my-zsh #
# Original Author: Peter hoeg (peterhoeg) #
# Email: peter@speartail.com #
###########################################
# Author: Sean Jones (neuralsandwich) #
# Email: neuralsandwich@gmail.com #
# Modified to add support for Apple Mac #
###########################################
# Author: J (927589452) #
# Modified to add support for FreeBSD #
###########################################
# Author: Avneet Singh (kalsi-avneet) #
# Modified to add support for Android #
###########################################
# Author: Not Pua (im-notpua) #
# Modified to add support for OpenBSD #
###########################################
if [[ "$OSTYPE" = darwin* ]]; then
function battery_is_charging() {
ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ Yes'
}
function battery_pct() {
pmset -g batt | grep -Eo "\d+%" | cut -d% -f1
}
function battery_pct_remaining() {
if battery_is_charging; then
echo "External Power"
else
battery_pct
fi
}
function battery_time_remaining() {
local smart_battery_status="$(ioreg -rc "AppleSmartBattery")"
if [[ $(echo $smart_battery_status | command grep -c '^.*"ExternalConnected"\ =\ No') -eq 1 ]]; then
timeremaining=$(echo $smart_battery_status | command grep '^.*"AvgTimeToEmpty"\ =\ ' | sed -e 's/^.*"AvgTimeToEmpty"\ =\ //')
if [ $timeremaining -gt 720 ]; then
echo "::"
else
echo "~$((timeremaining / 60)):$((timeremaining % 60))"
fi
else
echo "∞"
fi
}
function battery_pct_prompt () {
local battery_pct color
if ioreg -rc AppleSmartBattery | command grep -q '^.*"ExternalConnected"\ =\ No'; then
battery_pct=$(battery_pct_remaining)
if [[ $battery_pct -gt 50 ]]; then
color='green'
elif [[ $battery_pct -gt 20 ]]; then
color='yellow'
else
color='red'
fi
echo "%{$fg[$color]%}[${battery_pct}%%]%{$reset_color%}"
else
echo "∞"
fi
}
elif [[ "$OSTYPE" = freebsd* ]]; then
function battery_is_charging() {
[[ $(sysctl -n hw.acpi.battery.state) -eq 2 ]]
}
function battery_pct() {
if (( $+commands[sysctl] )); then
sysctl -n hw.acpi.battery.life
fi
}
function battery_pct_remaining() {
if ! battery_is_charging; then
battery_pct
else
echo "External Power"
fi
}
function battery_time_remaining() {
local remaining_time
remaining_time=$(sysctl -n hw.acpi.battery.time)
if [[ $remaining_time -ge 0 ]]; then
((hour = $remaining_time / 60 ))
((minute = $remaining_time % 60 ))
printf %02d:%02d $hour $minute
fi
}
function battery_pct_prompt() {
local battery_pct color
battery_pct=$(battery_pct_remaining)
if battery_is_charging; then
echo "∞"
else
if [[ $battery_pct -gt 50 ]]; then
color='green'
elif [[ $battery_pct -gt 20 ]]; then
color='yellow'
else
color='red'
fi
echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
fi
}
elif [[ "$OSTYPE" = linux-android ]] && (( ${+commands[termux-battery-status]} )); then
function battery_is_charging() {
termux-battery-status 2>/dev/null | command awk '/status/ { exit ($0 ~ /DISCHARGING/) }'
}
function battery_pct() {
# Sample output:
# {
# "health": "GOOD",
# "percentage": 93,
# "plugged": "UNPLUGGED",
# "status": "DISCHARGING",
# "temperature": 29.0,
# "current": 361816
# }
termux-battery-status 2>/dev/null | command awk '/percentage/ { gsub(/[,]/,""); print $2}'
}
function battery_pct_remaining() {
if ! battery_is_charging; then
battery_pct
else
echo "External Power"
fi
}
function battery_time_remaining() { } # Not available on android
function battery_pct_prompt() {
local battery_pct color
battery_pct=$(battery_pct_remaining)
if battery_is_charging; then
echo "∞"
else
if [[ $battery_pct -gt 50 ]]; then
color='green'
elif [[ $battery_pct -gt 20 ]]; then
color='yellow'
else
color='red'
fi
echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
fi
}
elif [[ "$OSTYPE" = openbsd* ]]; then
function battery_is_charging() {
[[ $(apm -b) -eq 3 ]]
}
function battery_pct() {
apm -l
}
function battery_pct_remaining() {
if ! battery_is_charging; then
battery_pct
else
echo "External Power"
fi
}
function battery_time_remaining() {
local remaining_time
remaining_time=$(apm -m)
if [[ $remaining_time -ge 0 ]]; then
((hour = $remaining_time / 60 ))
((minute = $remaining_time % 60 ))
printf %02d:%02d $hour $minute
fi
}
function battery_pct_prompt() {
local battery_pct color
battery_pct=$(battery_pct_remaining)
if battery_is_charging; then
echo "∞"
else
if [[ $battery_pct -gt 50 ]]; then
color='green'
elif [[ $battery_pct -gt 20 ]]; then
color='yellow'
else
color='red'
fi
echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
fi
}
elif [[ "$OSTYPE" = linux* ]]; then
function battery_is_charging() {
if (( $+commands[acpitool] )); then
! acpitool 2>/dev/null | command grep -qE '^\s+Battery.*Discharging'
elif (( $+commands[acpi] )); then
! acpi 2>/dev/null | command grep -v "rate information unavailable" | command grep -q '^Battery.*Discharging'
fi
}
function battery_pct() {
if (( $+commands[acpitool] )); then
# Sample output:
# Battery #1 : Unknown, 99.55%
# Battery #2 : Discharging, 49.58%, 01:12:05
# All batteries : 62.60%, 02:03:03
local -i pct=$(acpitool 2>/dev/null | command awk -F, '
/^\s+All batteries/ {
gsub(/[^0-9.]/, "", $1)
pct=$1
exit
}
!pct && /^\s+Battery/ {
gsub(/[^0-9.]/, "", $2)
pct=$2
}
END { print pct }
')
echo $pct
elif (( $+commands[acpi] )); then
# Sample output:
# Battery 0: Discharging, 0%, rate information unavailable
# Battery 1: Full, 100%
acpi 2>/dev/null | command awk -F, '
/rate information unavailable/ { next }
/^Battery.*: /{ gsub(/[^0-9]/, "", $2); print $2; exit }
'
fi
}
function battery_pct_remaining() {
if ! battery_is_charging; then
battery_pct
else
echo "External Power"
fi
}
function battery_time_remaining() {
if ! battery_is_charging; then
acpi 2>/dev/null | command grep -v "rate information unavailable" | cut -f3 -d ','
fi
}
function battery_pct_prompt() {
local battery_pct color
battery_pct=$(battery_pct_remaining)
if battery_is_charging; then
echo "∞"
else
if [[ $battery_pct -gt 50 ]]; then
color='green'
elif [[ $battery_pct -gt 20 ]]; then
color='yellow'
else
color='red'
fi
echo "%{$fg[$color]%}${battery_pct}%%%{$reset_color%}"
fi
}
else
# Empty functions so we don't cause errors in prompts
function battery_is_charging { false }
function battery_pct \
battery_pct_remaining \
battery_time_remaining \
battery_pct_prompt { }
fi
function battery_level_gauge() {
local gauge_slots=${BATTERY_GAUGE_SLOTS:-10}
local green_threshold=${BATTERY_GREEN_THRESHOLD:-$(( gauge_slots * 0.6 ))}
local yellow_threshold=${BATTERY_YELLOW_THRESHOLD:-$(( gauge_slots * 0.4 ))}
local color_green=${BATTERY_COLOR_GREEN:-%F{green}}
local color_yellow=${BATTERY_COLOR_YELLOW:-%F{yellow}}
local color_red=${BATTERY_COLOR_RED:-%F{red}}
local color_reset=${BATTERY_COLOR_RESET:-%{%f%k%b%}}
local battery_prefix=${BATTERY_GAUGE_PREFIX:-'['}
local battery_suffix=${BATTERY_GAUGE_SUFFIX:-']'}
local filled_symbol=${BATTERY_GAUGE_FILLED_SYMBOL:-'▶'}
local empty_symbol=${BATTERY_GAUGE_EMPTY_SYMBOL:-'▷'}
local charging_color=${BATTERY_CHARGING_COLOR:-$color_yellow}
local charging_symbol=${BATTERY_CHARGING_SYMBOL:-'⚡'}
local -i battery_remaining_percentage=$(battery_pct)
local filled empty gauge_color
if [[ $battery_remaining_percentage =~ [0-9]+ ]]; then
filled=$(( ($battery_remaining_percentage * $gauge_slots) / 100 ))
empty=$(( $gauge_slots - $filled ))
if [[ $filled -gt $green_threshold ]]; then
gauge_color=$color_green
elif [[ $filled -gt $yellow_threshold ]]; then
gauge_color=$color_yellow
else
gauge_color=$color_red
fi
else
filled=$gauge_slots
empty=0
filled_symbol=${BATTERY_UNKNOWN_SYMBOL:-'.'}
fi
local charging=' '
battery_is_charging && charging=$charging_symbol
# Charging status and prefix
print -n ${charging_color}${charging}${color_reset}${battery_prefix}${gauge_color}
# Filled slots
[[ $filled -gt 0 ]] && printf ${filled_symbol//\%/\%\%}'%.0s' {1..$filled}
# Empty slots
[[ $filled -lt $gauge_slots ]] && printf ${empty_symbol//\%/\%\%}'%.0s' {1..$empty}
# Suffix
print -n ${color_reset}${battery_suffix}${color_reset}
}

View File

@ -0,0 +1,22 @@
# Bazel plugin
This plugin adds completion and aliases for [bazel](https://bazel.build), an open-source build and test tool that scalably supports multi-language and multi-platform projects.
To use it, add `bazel` to the plugins array in your zshrc file:
```zsh
plugins=(... bazel)
```
The plugin has a copy of [the completion script from the git repository][1].
[1]: https://github.com/bazelbuild/bazel/blob/master/scripts/zsh_completion/_bazel
## Aliases
| Alias | Command | Description |
| ------- | -------------------------------------- | ------------------------------------------------------ |
| bzb | `bazel build` | The `bazel build` command |
| bzt | `bazel test` | The `bazel test` command |
| bzr | `bazel run` | The `bazel run` command |
| bzq | `bazel query` | The `bazel query` command |

View File

@ -0,0 +1,341 @@
#compdef bazel bazelisk
# Copyright 2015 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# Installation
# ------------
#
# 1. Add this script to a directory on your $fpath:
# fpath[1,0]=~/.zsh/completion/
# mkdir -p ~/.zsh/completion/
# cp scripts/zsh_completion/_bazel ~/.zsh/completion
#
# 2. Optionally, add the following to your .zshrc.
# zstyle ':completion:*' use-cache on
# zstyle ':completion:*' cache-path ~/.zsh/cache
#
# This way, the completion script does not have to parse Bazel's options
# repeatedly. The directory in cache-path must be created manually.
#
# 3. Restart the shell
#
# Options
# -------
# completion:init:bazel:* cache-lifetime
# Lifetime for the completion cache (if turned on, default: 1 week)
local curcontext="$curcontext" state line
: ${BAZEL_COMPLETION_PACKAGE_PATH:=%workspace%}
: ${BAZEL:=bazel}
_bazel_b() { ${BAZEL} --noblock_for_lock "$@" 2>/dev/null; }
# Default cache lifetime is 1 week
zstyle -s ":completion:${curcontext}:" cache-lifetime lifetime
if [[ -z "${lifetime}" ]]; then
lifetime=$((60*60*24*7))
fi
_bazel_cache_policy() {
local -a oldp
oldp=( "$1"(Nms+${lifetime}) )
(( $#oldp ))
}
_set_cache_policy() {
zstyle -s ":completion:*:$curcontext*" cache-policy update_policy
if [[ -z "$update_policy" ]]; then
zstyle ":completion:$curcontext*" cache-policy _bazel_cache_policy
fi
}
# Skips over all global arguments. After invocation, OFFSET contains the
# position of the bazel command in $words.
_adapt_subcommand_offset() {
OFFSET=2
for w in ${words[2,-1]}; do
if [[ $w == (#b)-* ]]; then
(( OFFSET++ ))
else
return
fi
done
}
# Retrieve the cache but also check that the value is not empty.
_bazel_safe_retrieve_cache() {
_retrieve_cache $1 && [[ ${(P)#2} -gt 0 ]]
}
# Puts the name of the variable that contains the options for the bazel
# subcommand handed in as the first argument into the global variable
# _bazel_cmd_options.
_bazel_get_options() {
local lcmd=$1
_bazel_cmd_options=_bazel_${lcmd}_options
_bazel_cmd_args=_bazel_${lcmd}_args
if [[ ${(P)#_bazel_cmd_options} != 0 ]]; then
return
fi
if _cache_invalid BAZEL_${lcmd}_options || _cache_invalid BAZEL_${lcmd}_args \
|| ! _bazel_safe_retrieve_cache BAZEL_${lcmd}_options ${_bazel_cmd_options} \
|| ! _retrieve_cache BAZEL_${lcmd}_args ${_bazel_cmd_args}; then
if ! eval "$(_bazel_b help completion)"; then
return
fi
local opts_var
if [[ $lcmd == "startup_options" ]]; then
opts_var="BAZEL_STARTUP_OPTIONS"
else
opts_var="BAZEL_COMMAND_${lcmd:u}_FLAGS"
fi
local -a raw_options
if ! eval "raw_options=(\${(@f)$opts_var})"; then
return
fi
local -a option_list
for opt in $raw_options; do
case $opt in
--*"={"*)
local lst="${${opt##*"={"}%"}"}"
local opt="${opt%%=*}="
option_list+=("${opt}:string:_values '' ${lst//,/ }") ;;
--*=path)
option_list+=("${opt%path}:path:_files") ;;
--*=label)
option_list+=("${opt%label}:target:_bazel_complete_target") ;;
--*=*)
option_list+=("${opt}:string:") ;;
*)
option_list+=("$opt") ;;
esac
done
local -a cmd_args
local cmd_type
if eval "cmd_type=\${BAZEL_COMMAND_${lcmd:u}_ARGUMENT}" && [[ -n $cmd_type ]]; then
case $cmd_type in
label|label-*)
cmd_args+=("*::${cmd_type}:_bazel_complete_target_${cmd_type//-/_}") ;;
info-key)
cmd_args+=('1::key:_bazel_info_key') ;;
path)
cmd_args+=('1::profile:_path_files') ;;
"command|{"*"}")
local lst=${${cmd_type#"command|{"}%"}"}
cmd_args+=("1::topic:_bazel_help_topic -- ${lst//,/ }") ;;
esac
fi
typeset -g "${_bazel_cmd_options}"="${(pj:|:)option_list[*]}"
_store_cache BAZEL_${lcmd}_options ${_bazel_cmd_options}
typeset -g "${_bazel_cmd_args}"="${(pj:|:)cmd_args[*]}"
_store_cache BAZEL_${lcmd}_args ${_bazel_cmd_args}
fi
}
_get_build_targets() {
local pkg=$1
local rule_re
typeset -a completions
case $target_type in
test)
rule_re=".*_test"
;;
build)
rule_re=".*"
;;
bin)
rule_re=".*_test|.*_binary"
;;
esac
completions=(${$(_bazel_b query "kind(\"${rule_re}\", ${pkg}:all)" 2>/dev/null)##*:})
if ( (( ${#completions} > 0 )) && [[ $target_type != bin ]] ); then
completions+=(all)
fi
echo ${completions[*]}
}
# Returns all packages that match $PREFIX. PREFIX may start with //, in which
# case the workspace roots are searched. Otherwise, they are completed based on
# PWD.
_get_build_packages() {
local workspace pfx
typeset -a package_roots paths final_paths
workspace=$PWD
package_roots=(${(ps.:.)BAZEL_COMPLETION_PACKAGE_PATH})
package_roots=(${^package_roots//\%workspace\%/$workspace})
if [[ "${(e)PREFIX}" == //* ]]; then
pfx=${(e)PREFIX[2,-1]}
else
pfx=${(e)PREFIX}
fi
paths=(${^package_roots}/${pfx}*(/))
for p in ${paths[*]}; do
if [[ -f ${p}/BUILD || -f ${p}/BUILD.bazel ]]; then
final_paths+=(${p##*/}:)
fi
final_paths+=(${p##*/}/)
done
echo ${final_paths[*]}
}
_package_remove_slash() {
if [[ $KEYS == ':' && $LBUFFER == */ ]]; then
LBUFFER=${LBUFFER[1,-2]}
fi
}
# Completion function for BUILD targets, called by the completion system.
_bazel_complete_target() {
local expl
typeset -a packages targets
if [[ "${(e)PREFIX}" != *:* ]]; then
# There is no : in the prefix, completion can be either
# a package or a target, if the cwd is a package itself.
if [[ -f $PWD/BUILD || -f $PWD/BUILD.bazel ]]; then
targets=($(_get_build_targets ""))
_description build_target expl "BUILD target"
compadd "${expl[@]}" -a targets
fi
packages=($(_get_build_packages))
_description build_package expl "BUILD package"
# Chop of the leading path segments from the prefix for display.
compset -P '*/'
compadd -R _package_remove_slash -S '' "${expl[@]}" -a packages
else
targets=($(_get_build_targets "${${(e)PREFIX}%:*}"))
_description build_target expl "BUILD target"
# Ignore the current prefix for the upcoming completion, since we only list
# the names of the targets, not the full path.
compset -P '*:'
compadd "${expl[@]}" -a targets
fi
}
_bazel_complete_target_label() {
typeset -g target_type=build
_bazel_complete_target
}
_bazel_complete_target_label_test() {
typeset -g target_type=test
_bazel_complete_target
}
_bazel_complete_target_label_bin() {
typeset -g target_type=bin
_bazel_complete_target
}
### Actual completion commands
_bazel() {
_adapt_subcommand_offset
if (( CURRENT - OFFSET > 0 )); then
# Remember the subcommand name, stored globally so we can access it
# from any subsequent function
cmd=${words[OFFSET]//-/_}
# Set the context for the subcommand.
curcontext="${curcontext%:*:*}:bazel-$cmd:"
_set_cache_policy
# Narrow the range of words we are looking at to exclude cmd
# name and any leading options
(( CURRENT = CURRENT - OFFSET + 1 ))
shift $((OFFSET - 1)) words
# Run the completion for the subcommand
_bazel_get_options $cmd
_arguments : \
${(Pps:|:)_bazel_cmd_options} \
${(Pps:|:)_bazel_cmd_args}
else
_set_cache_policy
# Start special handling for global options,
# which can be retrieved by calling
# $ bazel help startup_options
_bazel_get_options startup_options
_arguments : \
${(Pps:|:)_bazel_cmd_options} \
"*:commands:_bazel_commands"
fi
return
}
_get_commands() {
# bazel_cmd_list is a global (g) array (a)
typeset -ga _bazel_cmd_list
# Use `bazel help` instead of `bazel help completion` to get command
# descriptions.
if _bazel_cmd_list=("${(@f)$(_bazel_b help | awk '
/Available commands/ { command=1; }
/ [-a-z]+[ \t]+.+/ { if (command) { printf "%s:", $1; for (i=2; i<=NF; i++) printf "%s ", $i; print "" } }
/^$/ { command=0; }')}"); then
_store_cache BAZEL_commands _bazel_cmd_list
fi
}
# Completion function for bazel subcommands, called by the completion system.
_bazel_commands() {
if [[ ${#_bazel_cmd_list} == 0 ]]; then
if _cache_invalid BAZEL_commands \
|| ! _bazel_safe_retrieve_cache BAZEL_commands _bazel_cmd_list; then
_get_commands
fi
fi
_describe -t bazel-commands 'Bazel command' _bazel_cmd_list
}
# Completion function for bazel help options, called by the completion system.
_bazel_help_topic() {
if [[ ${#_bazel_cmd_list} == 0 ]]; then
if _cache_invalid BAZEL_commands \
|| ! _bazel_safe_retrieve_cache BAZEL_commands _bazel_cmd_list; then
_get_commands
fi
fi
while [[ $# -gt 0 ]]; do
if [[ $1 == -- ]]; then
shift
break
fi
shift
done
_bazel_help_list=($@)
_bazel_help_list+=($_bazel_cmd_list)
_describe -t bazel-help 'Help topic' _bazel_help_list
}
# Completion function for bazel info keys, called by the completion system.
_bazel_info_key() {
if [[ ${#_bazel_info_keys_list} == 0 ]]; then
if _cache_invalid BAZEL_info_keys \
|| ! _bazel_safe_retrieve_cache BAZEL_info_keys _bazel_info_keys_list; then
typeset -ga _bazel_info_keys_list
# Use `bazel help` instead of `bazel help completion` to get info-key
# descriptions.
if _bazel_info_keys_list=("${(@f)$(_bazel_b help info-keys | awk '
{ printf "%s:", $1; for (i=2; i<=NF; i++) printf "%s ", $i; print "" }')}"); then
_store_cache BAZEL_info_keys _bazel_info_keys_list
fi
fi
fi
_describe -t bazel-info 'Key' _bazel_info_keys_list
}

View File

@ -0,0 +1,5 @@
# Aliases for bazel
alias bzb='bazel build'
alias bzt='bazel test'
alias bzr='bazel run'
alias bzq='bazel query'

View File

@ -0,0 +1,20 @@
## bbedit
Plugin for BBEdit, an HTML and text editor for Mac OS X
### Requirements
* [BBEdit](https://www.barebones.com/products/bbedit/)
* [BBEdit Command-Line Tools](https://www.barebones.com/support/bbedit/cmd-line-tools.html)
### Usage
* If the `bb` command is called without an argument, launch BBEdit
* If `bb` is passed a directory, cd to it and open it in BBEdit
* If `bb` is passed a file, open it in BBEdit
* If `bbpb` create a new BBEdit document with the contents of the clipboard
* If `bbd` alias for BBEdit diff tool

View File

@ -0,0 +1,21 @@
alias bbpb='pbpaste | bbedit --clean --view-top'
alias bbd=bbdiff
#
# If the bb command is called without an argument, launch BBEdit
# If bb is passed a directory, cd to it and open it in BBEdit
# If bb is passed a file, open it in BBEdit
#
function bb() {
if [[ -z "$1" ]]
then
bbedit --launch
else
bbedit "$1"
if [[ -d "$1" ]]
then
cd "$1"
fi
fi
}

View File

@ -0,0 +1,5 @@
# Bedtools plugin
This plugin adds support for the [bedtools suite](http://bedtools.readthedocs.org/en/latest/):
* Adds autocomplete options for all bedtools sub commands.

View File

@ -0,0 +1,64 @@
#compdef bedtools
#autoload
local curcontext="$curcontext" state line ret=1
local -a _files
_arguments -C \
'1: :->cmds' \
'2:: :->args' && ret=0
case $state in
cmds)
_values "bedtools command" \
"--contact[Feature requests, bugs, mailing lists, etc.]" \
"--help[Print this help menu.]" \
"--version[What version of bedtools are you using?.]" \
"annotate[Annotate coverage of features from multiple files.]" \
"bamtobed[Convert BAM alignments to BED (& other) formats.]" \
"bamtofastq[Convert BAM records to FASTQ records.]" \
"bed12tobed6[Breaks BED12 intervals into discrete BED6 intervals.]" \
"bedpetobam[Convert BEDPE intervals to BAM records.]" \
"bedtobam[Convert intervals to BAM records.]" \
"closest[Find the closest, potentially non-overlapping interval.]" \
"cluster[Cluster (but don't merge) overlapping/nearby intervals.]" \
"complement[Extract intervals _not_ represented by an interval file.]" \
"coverage[Compute the coverage over defined intervals.]" \
"expand[Replicate lines based on lists of values in columns.]" \
"fisher[Calculate Fisher statistic b/w two feature files.]" \
"flank[Create new intervals from the flanks of existing intervals.]" \
"genomecov[Compute the coverage over an entire genome.]" \
"getfasta[Use intervals to extract sequences from a FASTA file.]" \
"groupby[Group by common cols. & summarize oth. cols. (~ SQL "groupBy")]" \
"igv[Create an IGV snapshot batch script.]" \
"intersect[Find overlapping intervals in various ways.]" \
"jaccard[Calculate the Jaccard statistic b/w two sets of intervals.]" \
"links[Create a HTML page of links to UCSC locations.]" \
"makewindows[Make interval "windows" across a genome.]" \
"map[Apply a function to a column for each overlapping interval.]" \
"maskfasta[Use intervals to mask sequences from a FASTA file.]" \
"merge[Combine overlapping/nearby intervals into a single interval.]" \
"multicov[Counts coverage from multiple BAMs at specific intervals.]" \
"multiinter[Identifies common intervals among multiple interval files.]" \
"nuc[Profile the nucleotide content of intervals in a FASTA file.]" \
"overlap[Computes the amount of overlap from two intervals.]" \
"pairtobed[Find pairs that overlap intervals in various ways.]" \
"pairtopair[Find pairs that overlap other pairs in various ways.]" \
"random[Generate random intervals in a genome.]" \
"reldist[Calculate the distribution of relative distances b/w two files.]" \
"sample[Sample random records from file using reservoir sampling.]" \
"shuffle[Randomly redistrubute intervals in a genome.]" \
"slop[Adjust the size of intervals.]" \
"sort[Order the intervals in a file.]" \
"subtract[Remove intervals based on overlaps b/w two files.]" \
"tag[Tag BAM alignments based on overlaps with interval files.]" \
"unionbedg[Combines coverage intervals from multiple BEDGRAPH files.]" \
"window[Find overlapping intervals within a window around an interval.]" \
ret=0
;;
*)
_files
;;
esac
return ret

View File

@ -0,0 +1,63 @@
# bgnotify zsh plugin
cross-platform background notifications for long running commands! Supports OSX and Linux.
Standalone homepage: [t413/zsh-background-notify](https://github.com/t413/zsh-background-notify)
---
## How to use
Just add bgnotify to your plugins list in your `.zshrc`
- On OS X you'll need [terminal-notifier](https://github.com/alloy/terminal-notifier)
* `brew install terminal-notifier` (or `gem install terminal-notifier`)
- On Linux, make sure you have `notify-send` or `kdialog` installed. If you're using Ubuntu you should already be all set!
- On Windows you can use [notifu](https://www.paralint.com/projects/notifu/) or the Cygwin Ports libnotify package
## Screenshots
**Linux**
![screenshot from 2014-11-07 15 58 36](https://cloud.githubusercontent.com/assets/326829/4962187/256b465c-66da-11e4-927d-cc2fc105e31f.png)
**OS X**
![screenshot 2014-11-08 14 15 12](https://cloud.githubusercontent.com/assets/326829/4965780/19fa3eac-6795-11e4-8ed6-0355711123a9.png)
**Windows**
![screenshot from 2014-11-07 15 55 00](https://cloud.githubusercontent.com/assets/326829/4962159/a2625ca0-66d9-11e4-9e91-c5834913190e.png)
## Configuration
One can configure a few things:
- `bgnotify_bell` enabled or disables the terminal bell (default true)
- `bgnotify_threshold` sets the notification threshold time (default 6 seconds)
- `function bgnotify_formatted` lets you change the notification. You can for instance customize the message and pass in an icon.
Use these by adding a function definition before the your call to source. Example:
```sh
bgnotify_bell=false ## disable terminal bell
bgnotify_threshold=4 ## set your own notification threshold
function bgnotify_formatted {
## $1=exit_status, $2=command, $3=elapsed_time
# Humanly readable elapsed time
local elapsed="$(( $3 % 60 ))s"
(( $3 < 60 )) || elapsed="$((( $3 % 3600) / 60 ))m $elapsed"
(( $3 < 3600 )) || elapsed="$(( $3 / 3600 ))h $elapsed"
[ $1 -eq 0 ] && title="Holy Smokes Batman" || title="Holy Graf Zeppelin"
[ $1 -eq 0 ] && icon="$HOME/icons/success.png" || icon="$HOME/icons/fail.png"
bgnotify "$title - took ${elapsed}" "$2" "$icon"
}
plugins=(git bgnotify) ## add to plugins list
source $ZSH/oh-my-zsh.sh ## existing source call
```

View File

@ -0,0 +1,141 @@
#!/usr/bin/env zsh
## Setup
[[ -o interactive ]] || return # don't load on non-interactive shells
[[ -z "$SSH_CLIENT" && -z "$SSH_TTY" ]] || return # don't load on a SSH connection
zmodload zsh/datetime # faster than `date`
## Zsh Hooks
function bgnotify_begin {
bgnotify_timestamp=$EPOCHSECONDS
bgnotify_lastcmd="${1:-$2}"
}
function bgnotify_end {
{
local exit_status=$?
local elapsed=$(( EPOCHSECONDS - bgnotify_timestamp ))
# check time elapsed
[[ $bgnotify_timestamp -gt 0 ]] || return 0
[[ $elapsed -ge $bgnotify_threshold ]] || return 0
# check if Terminal app is not active
[[ $(bgnotify_appid) != "$bgnotify_termid" ]] || return 0
bgnotify_formatted "$exit_status" "$bgnotify_lastcmd" "$elapsed"
} always {
bgnotify_timestamp=0
}
}
autoload -Uz add-zsh-hook
add-zsh-hook preexec bgnotify_begin
add-zsh-hook precmd bgnotify_end
## Functions
# allow custom function override
(( ${+functions[bgnotify_formatted]} )) || \
function bgnotify_formatted {
local exit_status=$1
local cmd="$2"
# humanly readable elapsed time
local elapsed="$(( $3 % 60 ))s"
(( $3 < 60 )) || elapsed="$((( $3 % 3600) / 60 ))m $elapsed"
(( $3 < 3600 )) || elapsed="$(( $3 / 3600 ))h $elapsed"
[[ $bgnotify_bell = true ]] && printf '\a' # beep sound
if [[ $exit_status -eq 0 ]]; then
bgnotify "#win (took $elapsed)" "$cmd"
else
bgnotify "#fail (took $elapsed)" "$cmd"
fi
}
function bgnotify_appid {
if (( ${+commands[osascript]} )); then
osascript -e "tell application id \"$(bgnotify_programid)\" to get the {id, frontmost, id of front window, visible of front window}" 2>/dev/null
elif [[ -n $WAYLAND_DISPLAY ]] && (( ${+commands[swaymsg]} )); then # wayland+sway
local app_id=$(bgnotify_find_sway_appid)
[[ -n "$app_id" ]] && echo "$app_id" || echo $EPOCHSECONDS
elif [[ -z $WAYLAND_DISPLAY ]] && [[ -n $DISPLAY ]] && (( ${+commands[xprop]} )); then
xprop -root _NET_ACTIVE_WINDOW 2>/dev/null | cut -d' ' -f5
else
echo $EPOCHSECONDS
fi
}
function bgnotify_find_sway_appid {
# output is "app_id,container_id", for example "Alacritty,1694"
# see example swaymsg output: https://github.com/ohmyzsh/ohmyzsh/files/13463939/output.json
if (( ${+commands[jq]} )); then
swaymsg -t get_tree | jq '.. | select(.type?) | select(.focused==true) | {app_id, id} | join(",")'
else
swaymsg -t get_tree | awk '
BEGIN { Id = ""; Appid = ""; FocusNesting = -1; Nesting = 0 }
{
# Enter a block
if ($0 ~ /.*{$/) Nesting++
# Exit a block. If Nesting is now less than FocusNesting, we have the data we are looking for
if ($0 ~ /^[[:blank:]]*}.*/) { Nesting--; if (FocusNesting > 0 && Nesting < FocusNesting) exit 0 }
# Save the Id, it is potentially what we are looking for
if ($0 ~ /^[[:blank:]]*"id": [0-9]*,?$/) { sub(/^[[:blank:]]*"id": /, ""); sub(/,$/, ""); Id = $0 }
# Save the Appid, it is potentially what we are looking for
if ($0 ~ /^[[:blank:]]*"app_id": ".*",?$/) { sub(/^[[:blank:]]*"app_id": "/, ""); sub(/",$/, ""); Appid = $0 }
# Window is focused, this nesting block contains the Id and Appid we want!
if ($0 ~ /^[[:blank:]]*"focused": true,?$/) { FocusNesting = Nesting }
}
END {
if (Appid != "" && Id != "" && FocusNesting != -1) print Appid "," Id
else print ""
}'
fi
}
function bgnotify_programid {
case "$TERM_PROGRAM" in
iTerm.app) echo 'com.googlecode.iterm2' ;;
Apple_Terminal) echo 'com.apple.terminal' ;;
esac
}
function bgnotify {
local title="$1"
local message="$2"
local icon="$3"
if (( ${+commands[terminal-notifier]} )); then # macOS
local term_id=$(bgnotify_programid)
terminal-notifier -message "$message" -title "$title" ${=icon:+-appIcon "$icon"} ${=term_id:+-activate "$term_id" -sender "$term_id"} &>/dev/null
elif (( ${+commands[growlnotify]} )); then # macOS growl
growlnotify -m "$title" "$message"
elif (( ${+commands[notify-send]} )); then
notify-send "$title" "$message" ${=icon:+--icon "$icon"}
elif (( ${+commands[kdialog]} )); then # KDE
kdialog --title "$title" --passivepopup "$message" 5
elif (( ${+commands[notifu]} )); then # cygwin
notifu /m "$message" /p "$title" ${=icon:+/i "$icon"}
fi
}
## Defaults
# enable terminal bell on notify by default
bgnotify_bell=${bgnotify_bell:-true}
# notify if command took longer than 5s by default
bgnotify_threshold=${bgnotify_threshold:-5}
# bgnotify_appid is slow in macOS and the terminal ID won't change, so cache it at startup
bgnotify_termid="$(bgnotify_appid)"

View File

@ -0,0 +1,17 @@
# Bower plugin
This plugin adds completion for [Bower](https://bower.io/) and a few useful aliases for common Bower commands.
To use it, add `bower` to the plugins array in your zshrc file:
```zsh
plugins=(... bower)
```
## Aliases
| Alias | Command | Description |
|-------|-----------------|--------------------------------------------------------|
| bi | `bower install` | Installs the project dependencies listed in bower.json |
| bl | `bower list` | List local packages and possible updates |
| bs | `bower search` | Finds all packages or a specific package. |

View File

@ -0,0 +1,58 @@
# Credits to npm's awesome completion utility.
#
# Bower completion script, based on npm completion script.
###-begin-bower-completion-###
#
# Installation: bower completion >> ~/.bashrc (or ~/.zshrc)
# Or, maybe: bower completion > /usr/local/etc/bash_completion.d/bower
#
COMP_WORDBREAKS=${COMP_WORDBREAKS/=/}
COMP_WORDBREAKS=${COMP_WORDBREAKS/@/}
export COMP_WORDBREAKS
if type complete &>/dev/null; then
_bower_completion () {
local si="$IFS"
IFS=$'\n' COMPREPLY=($(COMP_CWORD="$COMP_CWORD" \
COMP_LINE="$COMP_LINE" \
COMP_POINT="$COMP_POINT" \
bower completion -- "${COMP_WORDS[@]}" \
2>/dev/null)) || return $?
IFS="$si"
}
complete -F _bower_completion bower
elif type compdef &>/dev/null; then
_bower_completion() {
si=$IFS
compadd -- $(COMP_CWORD=$((CURRENT-1)) \
COMP_LINE=$BUFFER \
COMP_POINT=0 \
bower completion -- "${words[@]}" \
2>/dev/null)
IFS=$si
}
compdef _bower_completion bower
elif type compctl &>/dev/null; then
_bower_completion () {
local cword line point words si
read -Ac words
read -cn cword
let cword-=1
read -l line
read -ln point
si="$IFS"
IFS=$'\n' reply=($(COMP_CWORD="$cword" \
COMP_LINE="$line" \
COMP_POINT="$point" \
bower completion -- "${words[@]}" \
2>/dev/null)) || return $?
IFS="$si"
}
compctl -K _bower_completion bower
fi
###-end-bower-completion-###

View File

@ -0,0 +1,84 @@
alias bi="bower install"
alias bisd="bower install --save-dev"
alias bis="bower install --save"
alias bl="bower list"
alias bs="bower search"
_bower_installed_packages () {
bower_package_list=$(bower ls --no-color 2>/dev/null| awk 'NR>3{print p}{p=$0}'| cut -d ' ' -f 2|sed 's/#.*//')
}
_bower ()
{
local -a _1st_arguments _no_color _dopts _save_dev _force_latest _production
local expl
typeset -A opt_args
_no_color=('--no-color[Do not print colors (available in all commands)]')
_dopts=(
'(--save)--save[Save installed packages into the project"s bower.json dependencies]'
'(--force)--force[Force fetching remote resources even if a local copy exists on disk]'
)
_save_dev=('(--save-dev)--save-dev[Save installed packages into the project"s bower.json devDependencies]')
_force_latest=('(--force-latest)--force-latest[Force latest version on conflict]')
_production=('(--production)--production[Do not install project devDependencies]')
_1st_arguments=(
'cache-clean:Clean the Bower cache, or the specified package caches' \
'help:Display help information about Bower' \
'info:Version info and description of a particular package' \
'init:Interactively create a bower.json file' \
'install:Install a package locally' \
'link:Symlink a package folder' \
'lookup:Look up a package URL by name' \
'register:Register a package' \
'search:Search for a package by name' \
'uninstall:Remove a package' \
'update:Update a package' \
{ls,list}:'[List all installed packages]'
)
_arguments \
$_no_color \
'*:: :->subcmds' && return 0
if (( CURRENT == 1 )); then
_describe -t commands "bower subcommand" _1st_arguments
return
fi
case "$words[1]" in
install)
_arguments \
$_dopts \
$_save_dev \
$_force_latest \
$_no_color \
$_production
;;
update)
_arguments \
$_dopts \
$_no_color \
$_force_latest
_bower_installed_packages
compadd "$@" $(echo $bower_package_list)
;;
uninstall)
_arguments \
$_no_color \
$_dopts
_bower_installed_packages
compadd "$@" $(echo $bower_package_list)
;;
*)
_arguments \
$_no_color \
;;
esac
}
compdef _bower bower

View File

@ -0,0 +1,49 @@
# Branch plugin
This plugin displays the current Git or Mercurial branch, fast. If in a Mercurial repository,
also display the current bookmark, if present.
To use it, add `branch` to the plugins array in your zshrc file:
```zsh
plugins=(... branch)
```
## Speed test
- `hg branch`:
```console
$ time hg branch
0.11s user 0.14s system 70% cpu 0.355 total
```
- branch plugin:
```console
$ time zsh /tmp/branch_prompt_info_test.zsh
0.00s user 0.01s system 78% cpu 0.014 total
```
## Usage
Copy your theme to `$ZSH_CUSTOM/themes/` and modify it to add `$(branch_prompt_info)` in your prompt.
This example is for the `robbyrussell` theme:
```diff
diff --git a/themes/robbyrussell.zsh-theme b/themes/robbyrussell.zsh-theme
index 2fd5f2cd..9d89a464 100644
--- a/themes/robbyrussell.zsh-theme
+++ b/themes/robbyrussell.zsh-theme
@@ -1,5 +1,5 @@
PROMPT="%(?:%{$fg_bold[green]%}➜ :%{$fg_bold[red]%}➜ )"
-PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
+PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(branch_prompt_info)'
ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
```
## Maintainer
Victor Torres (<vpaivatorres@gmail.com>)

View File

@ -0,0 +1,35 @@
# Branch: displays the current Git or Mercurial branch fast.
# Victor Torres <vpaivatorres@gmail.com>
# Oct 2, 2015
function branch_prompt_info() {
# Start checking in current working directory
local branch="" dir="$PWD"
while [[ "$dir" != '/' ]]; do
# Found .git directory
if [[ -d "${dir}/.git" ]]; then
branch="${"$(<"${dir}/.git/HEAD")"##*/}"
echo '±' "${branch:gs/%/%%}"
return
fi
# Found .hg directory
if [[ -d "${dir}/.hg" ]]; then
if [[ -f "${dir}/.hg/branch" ]]; then
branch="$(<"${dir}/.hg/branch")"
else
branch="default"
fi
if [[ -f "${dir}/.hg/bookmarks.current" ]]; then
branch="${branch}/$(<"${dir}/.hg/bookmarks.current")"
fi
echo '☿' "${branch:gs/%/%%}"
return
fi
# Check parent directory
dir="${dir:h}"
done
}

View File

@ -0,0 +1,43 @@
# brew plugin
The plugin adds several aliases for common [brew](https://brew.sh) commands.
To use it, add `brew` to the plugins array of your zshrc file:
```zsh
plugins=(... brew)
```
## Shellenv
If `brew` is not found in the PATH, this plugin will attempt to find it in common locations, and execute
`brew shellenv` to set the environment appropriately. This plugin will also export
`HOMEBREW_PREFIX="$(brew --prefix)"` if not previously defined for convenience.
In case you installed `brew` in a non-common location, you can still set `BREW_LOCATION` variable pointing to
the `brew` binary before sourcing `oh-my-zsh.sh` and it'll set up the environment.
## Aliases
| Alias | Command | Description |
| -------- | --------------------------------------- | ------------------------------------------------------------------- |
| `bcubc` | `brew upgrade --cask && brew cleanup` | Update outdated casks, then run cleanup. |
| `bcubo` | `brew update && brew outdated --cask` | Update Homebrew data, then list outdated casks. |
| `brewp` | `brew pin` | Pin a specified formula so that it's not upgraded. |
| `brews` | `brew list -1` | List installed formulae or the installed files for a given formula. |
| `brewsp` | `brew list --pinned` | List pinned formulae, or show the version of a given formula. |
| `bubc` | `brew upgrade && brew cleanup` | Upgrade outdated formulae and casks, then run cleanup. |
| `bugbc` | `brew upgrade --greedy && brew cleanup` | Upgrade outdated formulae and casks (greedy), then run cleanup. |
| `bubo` | `brew update && brew outdated` | Update Homebrew data, then list outdated formulae and casks. |
| `bubu` | `bubo && bubc` | Do the last two operations above. |
| `bfu` | `brew upgrade --formula` | Upgrade only formulas (not casks). |
| `buz` | `brew uninstall --zap` | Remove all files associated with a cask. |
## Completion
This plugin configures paths with Homebrew's completion functions automatically, so you don't need to do it
manually. See: https://docs.brew.sh/Shell-Completion#configuring-completions-in-zsh.
With the release of Homebrew 1.0, they decided to bundle the zsh completion as part of the brew installation,
so we no longer ship it with the brew plugin; now it only has brew aliases. If you find that brew completion
no longer works, make sure you have your Homebrew installation fully up to date.

View File

@ -0,0 +1,60 @@
if (( ! $+commands[brew] )); then
if [[ -n "$BREW_LOCATION" ]]; then
if [[ ! -x "$BREW_LOCATION" ]]; then
echo "[oh-my-zsh] $BREW_LOCATION is not executable"
return
fi
elif [[ -x /opt/homebrew/bin/brew ]]; then
BREW_LOCATION="/opt/homebrew/bin/brew"
elif [[ -x /usr/local/bin/brew ]]; then
BREW_LOCATION="/usr/local/bin/brew"
elif [[ -x /home/linuxbrew/.linuxbrew/bin/brew ]]; then
BREW_LOCATION="/home/linuxbrew/.linuxbrew/bin/brew"
elif [[ -x "$HOME/.linuxbrew/bin/brew" ]]; then
BREW_LOCATION="$HOME/.linuxbrew/bin/brew"
else
return
fi
# Only add Homebrew installation to PATH, MANPATH, and INFOPATH if brew is
# not already on the path, to prevent duplicate entries. This aligns with
# the behavior of the brew installer.sh post-install steps.
eval "$("$BREW_LOCATION" shellenv)"
unset BREW_LOCATION
fi
if [[ -z "$HOMEBREW_PREFIX" ]]; then
# Maintain compatability with potential custom user profiles, where we had
# previously relied on always sourcing shellenv. OMZ plugins should not rely
# on this to be defined due to out of order processing.
export HOMEBREW_PREFIX="$(brew --prefix)"
fi
if [[ -d "$HOMEBREW_PREFIX/share/zsh/site-functions" ]]; then
fpath+=("$HOMEBREW_PREFIX/share/zsh/site-functions")
fi
alias bcubc='brew upgrade --cask && brew cleanup'
alias bcubo='brew update && brew outdated --cask'
alias brewp='brew pin'
alias brewsp='brew list --pinned'
alias bubc='brew upgrade && brew cleanup'
alias bugbc='brew upgrade --greedy && brew cleanup'
alias bubo='brew update && brew outdated'
alias bubu='bubo && bubc'
alias bubug='bubo && bugbc'
alias bfu='brew upgrade --formula'
alias buz='brew uninstall --zap'
function brews() {
local formulae="$(brew leaves | xargs brew deps --installed --for-each)"
local casks="$(brew list --cask 2>/dev/null)"
local blue="$(tput setaf 4)"
local bold="$(tput bold)"
local off="$(tput sgr0)"
echo "${blue}==>${off} ${bold}Formulae${off}"
echo "${formulae}" | sed "s/^\(.*\):\(.*\)$/\1${blue}\2${off}/"
echo "\n${blue}==>${off} ${bold}Casks${off}\n${casks}"
}

View File

@ -0,0 +1,26 @@
# Bridgetown plugin
This plugin adds some aliases and autocompletion for common [Bridgetown](https://bridgetownrb.com/) commands.
To use it, add `bridgetown` to the plugins array in your zshrc file:
```zsh
plugins=(... bridgetown)
```
## Aliases
| Alias | Command |
|-------|----------------------------|
| br | `bridgetown` |
| bra | `bin/bridgetown apply` |
| brb | `bin/bridgetown build` |
| brc | `bin/bridgetown console` |
| brclean | `bin/bridgetown clean` |
| brd | `bin/bridgetown deploy` |
| brdoc | `bin/bridgetown doctor` |
| brh | `bin/bridgetown help` |
| brn | `bridgetown new` |
| brp | `bridgetown plugins` |
| brpl | `bridgetown plugins list` |
| brs | `bin/bridgetown start` |

View File

@ -0,0 +1,12 @@
alias br='bridgetown'
alias bra='bin/bridgetown apply'
alias brb='bin/bridgetown build'
alias brc='bin/bridgetown console'
alias brclean='bin/bridgetown clean'
alias brd='bin/bridgetown deploy'
alias brdoc='bin/bridgetown doctor'
alias brh='bin/bridgetown help'
alias brn='bridgetown new'
alias brp='bridgetown plugins'
alias brpl='bridgetown plugins list'
alias brs='bin/bridgetown start'

View File

@ -0,0 +1,20 @@
# Bun Plugin
This plugin sets up completion for [Bun](https://bun.sh).
To use it, add `bun` to the plugins array in your zshrc file:
```zsh
plugins=(... bun)
```
This plugin does not add any aliases.
## Cache
This plugin caches the completion script and is automatically updated when the
plugin is loaded, which is usually when you start up a new terminal emulator.
The cache is stored at:
- `$ZSH_CACHE_DIR/completions/_bun_` completions script

View File

@ -0,0 +1,14 @@
# If Bun is not found, don't do the rest of the script
if (( ! $+commands[bun] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `bun`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_bun" ]]; then
typeset -g -A _comps
autoload -Uz _bun
_comps[bun]=_bun
fi
bun completions >| "$ZSH_CACHE_DIR/completions/_bun" &|

View File

@ -0,0 +1,74 @@
# Bundler
This plugin adds completion for basic bundler commands, as well as aliases and helper functions for
an easier experience with bundler.
To use it, add `bundler` to the plugins array in your zshrc file:
```zsh
plugins=(... bundler)
```
## Aliases
| Alias | Command | Description |
|--------|--------------------------------------|------------------------------------------------------------------------------------------|
| `ba` | `bundle add` | Add gem to the Gemfile and run bundle install |
| `bck` | `bundle check` | Verifies if dependencies are satisfied by installed gems |
| `bcn` | `bundle clean` | Cleans up unused gems in your bundler directory |
| `be` | `bundle exec` | Execute a command in the context of the bundle |
| `bi` | `bundle install --jobs=<core_count>` | Install the dependencies specified in your Gemfile (using all cores in bundler >= 1.4.0) |
| `bl` | `bundle list` | List all the gems in the bundle |
| `bo` | `bundle open` | Opens the source directory for a gem in your bundle |
| `bout` | `bundle outdated` | List installed gems with newer versions available |
| `bp` | `bundle package` | Package your needed .gem files into your application |
| `bu` | `bundle update` | Update your gems to the latest available versions |
## Gem wrapper
The plugin adds a wrapper for common gems, which:
- Looks for a binstub under `./bin/` and executes it if present.
- Calls `bundle exec <gem>` otherwise.
Common gems wrapped by default (by name of the executable):
`annotate`, `cap`, `capify`, `cucumber`, `foodcritic`, `guard`, `hanami`, `irb`, `jekyll`, `kitchen`, `knife`, `middleman`, `nanoc`, `pry`, `puma`, `rackup`, `rainbows`, `rake`, `rspec`, `rubocop`, `shotgun`, `sidekiq`, `spec`, `spork`, `spring`, `strainer`, `tailor`, `taps`, `thin`, `thor`, `unicorn` and `unicorn_rails`.
### Settings
You can add or remove gems from the list of wrapped commands.
Please **use the exact name of the executable** and not the gem name.
#### Include gems to be wrapped (`BUNDLED_COMMANDS`)
Add this before the plugin list in your `.zshrc`:
```sh
BUNDLED_COMMANDS=(rubocop)
plugins=(... bundler ...)
```
This will add the wrapper for the `rubocop` gem (i.e. the executable).
#### Exclude gems from being wrapped (`UNBUNDLED_COMMANDS`)
Add this before the plugin list in your `.zshrc`:
```sh
UNBUNDLED_COMMANDS=(foreman spin)
plugins=(... bundler ...)
```
This will exclude the `foreman` and `spin` gems (i.e. their executable) from being wrapped.
### Excluded gems
These gems should not be called with `bundle exec`. Please see [issue #2923](https://github.com/ohmyzsh/ohmyzsh/pull/2923) on GitHub for clarification:
- `berks`
- `foreman`
- `mailcatcher`
- `rails`
- `ruby`
- `spin`

View File

@ -0,0 +1,105 @@
#compdef bundle
local curcontext="$curcontext" state line _gems _opts ret=1
_arguments -C -A "-v" -A "--version" \
'(- 1 *)'{-v,--version}'[display version information]' \
'1: :->cmds' \
'*:: :->args' && ret=0
case $state in
cmds)
_values "bundle command" \
"install[Install the gems specified by the Gemfile or Gemfile.lock]" \
"update[Update dependencies to their latest versions]" \
"package[Package the .gem files required by your application]" \
"exec[Execute a script in the context of the current bundle]" \
"config[Specify and read configuration options for bundler]" \
"check[Determine whether the requirements for your application are installed]" \
"list[Show all of the gems in the current bundle]" \
"show[Show the source location of a particular gem in the bundle]" \
"info[Show details of a particular gem in the bundle]" \
"outdated[Show all of the outdated gems in the current bundle]" \
"console[Start an IRB session in the context of the current bundle]" \
"open[Open an installed gem in the editor]" \
"viz[Generate a visual representation of your dependencies]" \
"init[Generate a simple Gemfile, placed in the current directory]" \
"gem[Create a simple gem, suitable for development with bundler]" \
"platform[Displays platform compatibility information]" \
"clean[Cleans up unused gems in your bundler directory]" \
"help[Describe available tasks or one specific task]"
ret=0
;;
args)
case $line[1] in
help)
_values 'commands' \
'install' \
'update' \
'package' \
'exec' \
'config' \
'check' \
'list' \
'show' \
'outdated' \
'console' \
'open' \
'viz' \
'init' \
'gem' \
'platform' \
'help' && ret=0
;;
install)
_arguments \
'(--no-color)--no-color[disable colorization in output]' \
'(--local)--local[do not attempt to connect to rubygems.org]' \
'(--quiet)--quiet[only output warnings and errors]' \
'(--gemfile)--gemfile=-[use the specified gemfile instead of Gemfile]:gemfile' \
'(--system)--system[install to the system location]' \
'(--deployment)--deployment[install using defaults tuned for deployment environments]' \
'(--frozen)--frozen[do not allow the Gemfile.lock to be updated after this install]' \
'(--path)--path=-[specify a different path than the system default]:path:_files' \
'(--binstubs)--binstubs=-[generate bin stubs for bundled gems to ./bin]:directory:_files' \
'(--without)--without=-[exclude gems that are part of the specified named group]:groups'
ret=0
;;
exec)
_normal && ret=0
;;
clean)
_arguments \
'(--force)--force[forces clean even if --path is not set]' \
'(--dry-run)--dry-run[only print out changes, do not actually clean gems]' \
'(--no-color)--no-color[Disable colorization in output]' \
'(--verbose)--verbose[Enable verbose output mode]'
ret=0
;;
outdated)
_arguments \
'(--pre)--pre[Check for newer pre-release gems]' \
'(--source)--source[Check against a specific source]' \
'(--local)--local[Do not attempt to fetch gems remotely and use the gem cache instead]' \
'(--no-color)--no-color[Disable colorization in output]' \
'(--verbose)--verbose[Enable verbose output mode]'
ret=0
;;
(open|show|info)
_gems=( $(bundle show 2> /dev/null | sed -e '/^ \*/!d; s/^ \* \([^ ]*\) .*/\1/') )
if [[ $_gems != "" ]]; then
_values 'gems' $_gems && ret=0
fi
;;
*)
_opts=( $(bundle help $line[1] | sed -e '/^ \[-/!d; s/^ \[\(-[^=]*\)=.*/\1/') )
_opts+=( $(bundle help $line[1] | sed -e '/^ -/!d; s/^ \(-.\), \[\(-[^=]*\)=.*/\1 \2/') )
if [[ $_opts != "" ]]; then
_values 'options' $_opts && ret=0
fi
;;
esac
;;
esac
return ret

View File

@ -0,0 +1,127 @@
## Aliases
alias ba="bundle add"
alias bck="bundle check"
alias bcn="bundle clean"
alias be="bundle exec"
alias bi="bundle_install"
alias bl="bundle list"
alias bo="bundle open"
alias bout="bundle outdated"
alias bp="bundle package"
alias bu="bundle update"
## Functions
bundle_install() {
# Bail out if bundler is not installed
if (( ! $+commands[bundle] )); then
echo "Bundler is not installed"
return 1
fi
# Bail out if not in a bundled project
if ! _within-bundled-project; then
echo "Can't 'bundle install' outside a bundled project"
return 1
fi
# Check the bundler version is at least 1.4.0
autoload -Uz is-at-least
local bundler_version=$(bundle version | cut -d' ' -f3)
if ! is-at-least 1.4.0 "$bundler_version"; then
bundle install "$@"
return $?
fi
# If bundler is at least 1.4.0, use all the CPU cores to bundle install
if [[ "$OSTYPE" = (darwin|freebsd)* ]]; then
local cores_num="$(sysctl -n hw.ncpu)"
else
local cores_num="$(nproc)"
fi
BUNDLE_JOBS="$cores_num" bundle install "$@"
}
## Gem wrapper
bundled_commands=(
annotate
cap
capify
cucumber
foodcritic
guard
hanami
irb
jekyll
kitchen
knife
middleman
nanoc
pry
puma
rackup
rainbows
rake
rspec
rubocop
shotgun
sidekiq
spec
spork
spring
strainer
tailor
taps
thin
thor
unicorn
unicorn_rails
)
# Remove $UNBUNDLED_COMMANDS from the bundled_commands list
bundled_commands=(${bundled_commands:|UNBUNDLED_COMMANDS})
unset UNBUNDLED_COMMANDS
# Add $BUNDLED_COMMANDS to the bundled_commands list
bundled_commands+=($BUNDLED_COMMANDS)
unset BUNDLED_COMMANDS
# Check if in the root or a subdirectory of a bundled project
_within-bundled-project() {
local check_dir="$PWD"
while [[ "$check_dir" != "/" ]]; do
if [[ -f "$check_dir/Gemfile" || -f "$check_dir/gems.rb" ]]; then
return 0
fi
check_dir="${check_dir:h}"
done
return 1
}
_run-with-bundler() {
if (( ! $+commands[bundle] )) || ! _within-bundled-project; then
"$@"
return $?
fi
if [[ -f "./bin/${1}" ]]; then
./bin/${^^@}
else
bundle exec "$@"
fi
}
for cmd in $bundled_commands; do
# Create wrappers for bundled and unbundled execution
eval "function unbundled_$cmd () { \"$cmd\" \"\$@\"; }"
eval "function bundled_$cmd () { _run-with-bundler \"$cmd\" \"\$@\"; }"
alias "$cmd"="bundled_$cmd"
# Bind completion function to wrapped gem if available
if (( $+functions[_$cmd] )); then
compdef "_$cmd" "bundled_$cmd"="$cmd"
fi
done
unset cmd bundled_commands

View File

@ -0,0 +1,9 @@
# Cabal
This plugin provides completion for [Cabal](https://www.haskell.org/cabal/), a build tool for Haskell. It
also provides a function `cabal_sandbox_info` that prints whether the current working directory is in a sandbox.
To use it, add cabal to the plugins array of your zshrc file:
```
plugins=(... cabal)
```

View File

@ -0,0 +1,93 @@
function cabal_sandbox_info() {
cabal_files=(*.cabal(N))
if [ $#cabal_files -gt 0 ]; then
if [ -f cabal.sandbox.config ]; then
echo "%{$fg[green]%}sandboxed%{$reset_color%}"
else
echo "%{$fg[red]%}not sandboxed%{$reset_color%}"
fi
fi
}
function _cabal_commands() {
local ret=1 state
_arguments ':subcommand:->subcommand' && ret=0
case $state in
subcommand)
subcommands=(
"bench:Run the benchmark, if any (configure with UserHooks)"
"build:Compile all targets or specific target."
"check:Check the package for common mistakes"
"clean:Clean up after a build"
"copy:Copy the files into the install locations"
"configure:Prepare to build the package"
"exec:Run a command with the cabal environment"
"fetch:Downloads packages for later installation"
"freeze:Freeze dependencies."
"get:Gets a package's source code"
"haddock:Generate Haddock HTML documentation"
"help:Help about commands"
"hscolour:Generate HsColour colourised code, in HTML format"
"info:Display detailed information about a particular package"
"init:Interactively create a .cabal file"
"install:Installs a list of packages"
"list:List packages matching a search string"
"register:Register this package with the compiler"
"repl:Open an interpreter session for the given target"
"report:Upload build reports to a remote server"
"run:Runs the compiled executable"
"sandbox:Create/modify/delete a sandbox"
"sdist:Generate a source distribution file (.tar.gz)"
"test:Run the test suite, if any (configure with UserHooks)"
"unpack:Unpacks packages for user inspection"
"update:Updates list of known packages"
"upload:Uploads source packages to Hackage"
)
_describe -t subcommands 'cabal subcommands' subcommands && ret=0
esac
return ret
}
compdef _cabal_commands cabal
function _cab_commands() {
local ret=1 state
_arguments ':subcommand:->subcommand' && ret=0
case $state in
subcommand)
subcommands=(
"sync:Fetch the latest package index"
"install:Install packages"
"uninstall:Uninstall packages"
"installed:List installed packages"
"configure:Configure a cabal package"
"build:Build a cabal package"
"clean:Clean up a build directory"
"outdated:Display outdated packages"
"info:Display information of a package"
"sdist:Make tar.gz for source distribution"
"upload:Uploading tar.gz to HackageDB"
"get:Untar a package in the current directory"
"deps:Show dependencies of this package"
"revdeps:Show reverse dependencies of this package"
"check:Check consistency of packages"
"genpaths:Generate Paths_<pkg>.hs"
"search:Search available packages by package name"
"add:Add a source directory"
"test:Run tests"
"bench:Run benchmarks"
"doc:Generate manuals"
"ghci:Run GHCi (with a sandbox)"
"init:Initialize a sandbox"
"help:Display the help message of the command"
)
_describe -t subcommands 'cab subcommands' subcommands && ret=0
esac
return ret
}
command -v cab >/dev/null 2>&1 && { compdef _cab_commands cab }

View File

@ -0,0 +1,15 @@
# Cake
This plugin provides completion for [CakePHP](https://cakephp.org/).
To use it add cake to the plugins array in your zshrc file.
```bash
plugins=(... cake)
```
## Note
This plugin generates a cache file of the cake tasks found, named `.cake_task_cache`, in the current working directory.
It is regenerated when the Cakefile is newer than the cache file. It is advised that you add the cake file to your
`.gitignore` files.

View File

@ -0,0 +1,33 @@
# Set this to 1 if you want to cache the tasks
_cake_cache_task_list=1
# Cache filename
_cake_task_cache_file='.cake_task_cache'
_cake_get_target_list () {
cake | grep '^cake ' | sed -e "s/cake \([^ ]*\) .*/\1/" | grep -v '^$'
}
_cake_does_target_list_need_generating () {
if [ ${_cake_cache_task_list} -eq 0 ]; then
return 1;
fi
[ ! -f ${_cake_task_cache_file} ] && return 0;
[ Cakefile -nt ${_cake_task_cache_file} ] && return 0;
return 1;
}
_cake () {
if [ -f Cakefile ]; then
if _cake_does_target_list_need_generating; then
_cake_get_target_list > ${_cake_task_cache_file}
compadd `cat ${_cake_task_cache_file}`
else
compadd `_cake_get_target_list`
fi
fi
}
compdef _cake cake

View File

@ -0,0 +1,16 @@
# cakephp3 plugin
The plugin adds aliases and autocompletion for [cakephp3](https://book.cakephp.org/3.0/en/index.html).
To use it, add `cakephp3` to the plugins array of your zshrc file:
```
plugins=(... cakephp3)
```
## Aliases
| Alias | Command |
|-----------|-------------------------------|
| c3 | `bin/cake` |
| c3cache | `bin/cake orm_cache clear` |
| c3migrate | `bin/cake migrations migrate` |

View File

@ -0,0 +1,38 @@
# CakePHP 3 basic command completion
_cakephp3_get_command_list () {
bin/cake completion commands
}
_cakephp3_get_sub_command_list () {
bin/cake completion subcommands ${words[2]}
}
_cakephp3_get_3rd_argument () {
bin/cake ${words[2]} ${words[3]} | \grep '\-\ '| \awk '{print $2}'
}
_cakephp3 () {
local -a has3rdargument
has3rdargument=("all" "controller" "fixture" "model" "template")
if [ -f bin/cake ]; then
if (( CURRENT == 2 )); then
compadd $(_cakephp3_get_command_list)
fi
if (( CURRENT == 3 )); then
compadd $(_cakephp3_get_sub_command_list)
fi
if (( CURRENT == 4 )); then
if [[ ${has3rdargument[(i)${words[3]}]} -le ${#has3rdargument} ]]; then
compadd $(_cakephp3_get_3rd_argument)
fi
fi
fi
}
compdef _cakephp3 bin/cake
compdef _cakephp3 cake
#Alias
alias c3='bin/cake'
alias c3cache='bin/cake schema_cache clear'
alias c3migrate='bin/cake migrations migrate'

View File

@ -0,0 +1,14 @@
# Capistrano
This plugin provides completion for [Capistrano](https://capistranorb.com/).
To use it add capistrano to the plugins array in your zshrc file.
```bash
plugins=(... capistrano)
```
For a working completion use the `capit` command instead of `cap`, because cap is a
[reserved word in zsh](http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module).
`capit` automatically runs cap with bundler if a Gemfile is found.

View File

@ -0,0 +1,49 @@
#compdef capit
#autoload
# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work.
# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
local curcontext="$curcontext" state line ret=1
local -a _configs
_arguments -C \
'1: :->cmds' \
'2:: :->args' && ret=0
_cap_tasks() {
if [[ -f config/deploy.rb || -f Capfile ]]; then
if [[ ! -f .cap_tasks~ ]]; then
capit --tasks | sed 's/\(\[\)\(.*\)\(\]\)/\2:/' | awk '{command=$2; $1=$2=$3=""; gsub(/^[ \t\r\n]+/, "", $0); gsub(":", "\\:", command); print command"["$0"]"}' > .cap_tasks~
fi
OLD_IFS=$IFS
IFS=$'\n'
_values 'cap commands' $(< .cap_tasks~)
IFS=$OLD_IFS
# zmodload zsh/mapfile
# _values ${(f)mapfile[.cap_tasks~]}
fi
}
_cap_stages() {
compadd $(find config/deploy -name \*.rb | cut -d/ -f3 | sed s:.rb::g)
}
case $state in
cmds)
# check if it uses multistage
if [[ -d config/deploy ]]; then
_cap_stages
else
_cap_tasks
fi
ret=0
;;
args)
_cap_tasks
ret=0
;;
esac
return ret

View File

@ -0,0 +1,11 @@
# Added `capit` because `cap` is a reserved word. `cap` completion doesn't work.
# http://zsh.sourceforge.net/Doc/Release/Zsh-Modules.html#The-zsh_002fcap-Module
function capit() {
if [ -f Gemfile ]
then
bundle exec cap $*
else
cap $*
fi
}

View File

@ -0,0 +1,15 @@
# Cask plugin
[Cask](https://github.com/cask/cask) is a project management tool for Emacs that helps
automate the package development cycle; development, dependencies, testing, building,
packaging and more.
This plugin loads `cask` completion from non-standard locations, such as if installed
via Homebrew or others. To enable it, add `cask` to your plugins array:
```zsh
plugins=(... cask)
```
Make sure you have the `cask` directory in your `$PATH` before loading Oh My Zsh,
otherwise you'll get a "command not found" error.

View File

@ -0,0 +1,26 @@
() {
emulate -L zsh
if ! (( $+commands[cask] )); then
print "zsh cask plugin: cask command not found" >&2
return
fi
cask_base=${commands[cask]:h:h}
# Plain cask installation location (for Cask 0.7.2 and earlier)
comp_files=($cask_base/etc/cask_completion.zsh)
# Mac Homebrew installs the completion in a different location
if (( $+commands[brew] )); then
comp_files+=($(brew --prefix)/share/zsh/site-functions/cask_completion.zsh)
fi
# Load first found file
for f in $comp_files; do
if [[ -f "$f" ]]; then
source "$f"
break
fi
done
}

View File

@ -0,0 +1,23 @@
# catimg
Plugin for displaying images on the terminal using the the `catimg.sh` script provided by [posva](https://github.com/posva/catimg)
To use it, add `catimg` to the plugins array in your zshrc file:
```zsh
plugins=(... catimg)
```
## Requirements
- `convert` (ImageMagick)
## Functions
| Function | Description |
| -------- | ---------------------------------------- |
| `catimg` | Displays the given image on the terminal |
## Usage examples
[![asciicast](https://asciinema.org/a/204702.png)](https://asciinema.org/a/204702)

View File

@ -0,0 +1,17 @@
################################################################################
# catimg script by Eduardo San Martin Morote aka Posva #
# https://posva.net #
# #
# Output the content of an image to the stdout using the 256 colors of the #
# terminal. #
# GitHub: https://github.com/posva/catimg #
################################################################################
function catimg() {
if [[ -x `which convert` ]]; then
zsh $ZSH/plugins/catimg/catimg.sh $@
else
echo "catimg need convert (ImageMagick) to work)"
fi
}

View File

@ -0,0 +1,88 @@
################################################################################
# catimg script by Eduardo San Martin Morote aka Posva #
# https://posva.net #
# #
# Output the content of an image to the stdout using the 256 colors of the #
# terminal. #
# GitHub: https://github.com/posva/catimg #
################################################################################
function help() {
echo "Usage catimg [-h] [-w width] [-c char] img"
echo "By default char is \" \" and w is the terminal width"
}
# VARIABLES
COLOR_FILE=$(dirname $0)/colors.png
CHAR=" "
WIDTH=""
IMG=""
while getopts qw:c:h opt; do
case "$opt" in
w) WIDTH="$OPTARG" ;;
c) CHAR="$OPTARG" ;;
h) help; exit ;;
*) help ; exit 1;;
esac
done
while [ "$1" ]; do
IMG="$1"
shift
done
if [ "$IMG" = "" -o ! -f "$IMG" ]; then
help
exit 1
fi
if [ ! "$WIDTH" ]; then
COLS=$(expr $(tput cols) "/" $(echo -n "$CHAR" | wc -c))
else
COLS=$(expr $WIDTH "/" $(echo -n "$CHAR" | wc -c))
fi
WIDTH=$(convert "$IMG" -print "%w\n" /dev/null)
if [ "$WIDTH" -gt "$COLS" ]; then
WIDTH=$COLS
fi
REMAP=""
if convert "$IMG" -resize $COLS\> +dither -remap $COLOR_FILE /dev/null ; then
REMAP="-remap $COLOR_FILE"
else
echo "The version of convert is too old, don't expect good results :(" >&2
#convert "$IMG" -colors 256 PNG8:tmp.png
#IMG="tmp.png"
fi
# Display the image
I=0
convert "$IMG" -resize $COLS\> +dither `echo $REMAP` txt:- 2>/dev/null |
sed -e 's/.*none.*/NO NO NO/g' -e '1d;s/^.*(\(.*\)[,)].*$/\1/g;y/,/ /' |
while read R G B f; do
if [ ! "$R" = "NO" ]; then
if [ "$R" -eq "$G" -a "$G" -eq "$B" ]; then
((
I++,
IDX = 232 + R * 23 / 255
))
else
((
I++,
IDX = 16
+ R * 5 / 255 * 36
+ G * 5 / 255 * 6
+ B * 5 / 255
))
fi
#echo "$R,$G,$B: $IDX"
echo -ne "\e[48;5;${IDX}m${CHAR}"
else
(( I++ ))
echo -ne "\e[0m${CHAR}"
fi
# New lines
(( $I % $WIDTH )) || echo -e "\e[0m"
done

Binary file not shown.

After

Width:  |  Height:  |  Size: 353 B

View File

@ -0,0 +1,9 @@
# Celery
This plugin provides completion for [Celery](http://www.celeryproject.org/).
To use it add celery to the plugins array in your zshrc file.
```bash
plugins=(... celery)
```

View File

@ -0,0 +1,129 @@
#compdef celery
#autoload
#celery zsh completion
_celery () {
local -a _1st_arguments ifargs dopts controlargs
typeset -A opt_args
_1st_arguments=('worker' 'events' 'beat' 'shell' 'multi' 'amqp' 'status' 'inspect' \
'control' 'purge' 'list' 'migrate' 'call' 'result' 'report')
ifargs=('--app=' '--broker=' '--loader=' '--config=' '--version')
dopts=('--detach' '--umask=' '--gid=' '--uid=' '--pidfile=' '--logfile=' '--loglevel=')
controlargs=('--timeout' '--destination')
_arguments \
'(-A --app=)'{-A,--app}'[app instance to use (e.g. module.attr_name):APP]' \
'(-b --broker=)'{-b,--broker}'[url to broker. default is "amqp://guest@localhost//":BROKER]' \
'(--loader)--loader[name of custom loader class to use.:LOADER]' \
'(--config)--config[Name of the configuration module:CONFIG]' \
'(--workdir)--workdir[Optional directory to change to after detaching.:WORKING_DIRECTORY]' \
'(-q --quiet)'{-q,--quiet}'[Don"t show as much output.]' \
'(-C --no-color)'{-C,--no-color}'[Don"t display colors.]' \
'(--version)--version[show program"s version number and exit]' \
'(- : *)'{-h,--help}'[show this help message and exit]' \
'*:: :->subcmds' && return 0
if (( CURRENT == 1 )); then
_describe -t commands "celery subcommand" _1st_arguments
return
fi
case "$words[1]" in
worker)
_arguments \
'(-C --concurrency=)'{-C,--concurrency=}'[Number of child processes processing the queue. The default is the number of CPUs.]' \
'(--pool)--pool=:::(processes eventlet gevent threads solo)' \
'(--purge --discard)'{--discard,--purge}'[Purges all waiting tasks before the daemon is started.]' \
'(-f --logfile=)'{-f,--logfile=}'[Path to log file. If no logfile is specified, stderr is used.]' \
'(--loglevel=)--loglevel=:::(critical error warning info debug)' \
'(-N --hostname=)'{-N,--hostname=}'[Set custom hostname, e.g. "foo.example.com".]' \
'(-B --beat)'{-B,--beat}'[Also run the celerybeat periodic task scheduler.]' \
'(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database if running with the -B option. Defaults to celerybeat-schedule.]' \
'(-S --statedb=)'{-S,--statedb=}'[Path to the state database.Default: None]' \
'(-E --events)'{-E,--events}'[Send events that can be captured by monitors like celeryev, celerymon, and others.]' \
'(--time-limit=)--time-limit=[nables a hard time limit (in seconds int/float) for tasks]' \
'(--soft-time-limit=)--soft-time-limit=[Enables a soft time limit (in seconds int/float) for tasks]' \
'(--maxtasksperchild=)--maxtasksperchild=[Maximum number of tasks a pool worker can execute before it"s terminated and replaced by a new worker.]' \
'(-Q --queues=)'{-Q,--queues=}'[List of queues to enable for this worker, separated by comma. By default all configured queues are enabled.]' \
'(-I --include=)'{-I,--include=}'[Comma separated list of additional modules to import.]' \
'(--pidfile=)--pidfile=[Optional file used to store the process pid.]' \
'(--autoscale=)--autoscale=[Enable autoscaling by providing max_concurrency, min_concurrency.]' \
'(--autoreload)--autoreload[Enable autoreloading.]' \
'(--no-execv)--no-execv[Don"t do execv after multiprocessing child fork.]'
compadd -a ifargs
;;
inspect)
_values -s \
'active[dump active tasks (being processed)]' \
'active_queues[dump queues being consumed from]' \
'ping[ping worker(s)]' \
'registered[dump of registered tasks]' \
'report[get bugreport info]' \
'reserved[dump reserved tasks (waiting to be processed)]' \
'revoked[dump of revoked task ids]' \
'scheduled[dump scheduled tasks (eta/countdown/retry)]' \
'stats[dump worker statistics]'
compadd -a controlargs ifargs
;;
control)
_values -s \
'add_consumer[tell worker(s) to start consuming a queue]' \
'autoscale[change autoscale settings]' \
'cancel_consumer[tell worker(s) to stop consuming a queue]' \
'disable_events[tell worker(s) to disable events]' \
'enable_events[tell worker(s) to enable events]' \
'pool_grow[start more pool processes]' \
'pool_shrink[use less pool processes]' \
'rate_limit[tell worker(s) to modify the rate limit for a task type]' \
'time_limit[tell worker(s) to modify the time limit for a task type.]'
compadd -a controlargs ifargs
;;
multi)
_values -s \
'--nosplash[Don"t display program info.]' \
'--verbose[Show more output.]' \
'--no-color[Don"t display colors.]' \
'--quiet[Don"t show as much output.]' \
'start' 'restart' 'stopwait' 'stop' 'show' \
'names' 'expand' 'get' 'kill'
compadd -a ifargs
;;
amqp)
_values -s \
'queue.declare' 'queue.purge' 'exchange.delete' 'basic.publish' \
'exchange.declare' 'queue.delete' 'queue.bind' 'basic.get'
;;
list)
_values -s, 'bindings'
;;
shell)
_values -s \
'--ipython[force iPython.]' \
'--bpython[force bpython.]' \
'--python[force default Python shell.]' \
'--without-tasks[don"t add tasks to locals.]' \
'--eventlet[use eventlet.]' \
'--gevent[use gevent.]'
compadd -a ifargs
;;
beat)
_arguments \
'(-s --schedule=)'{-s,--schedule=}'[Path to the schedule database. Defaults to celerybeat-schedule.]' \
'(-S --scheduler=)'{-S,--scheduler=}'[Scheduler class to use. Default is celery.beat.PersistentScheduler.]' \
'(--max-interval)--max-interval[]'
compadd -a dopts fargs
;;
events)
_arguments \
'(-d --dump)'{-d,--dump}'[Dump events to stdout.]' \
'(-c --camera=)'{-c,--camera=}'[Take snapshots of events using this camera.]' \
'(-F --frequency=)'{-F,--frequency=}'[Camera: Shutter frequency. Default is every 1.0 seconds.]' \
'(-r --maxrate=)'{-r,--maxrate=}'[Camera: Optional shutter rate limit (e.g. 10/m).]'
compadd -a dopts fargs
;;
*)
;;
esac
}

View File

@ -0,0 +1,9 @@
# Charm plugin
This plugin adds completion for the [charm](https://github.com/charmbracelet/charm) CLI.
To use it, add `charm` to the plugins array in your zshrc file:
```zsh
plugins=(... charm)
```

View File

@ -0,0 +1,14 @@
# Autocompletion for the Charm CLI (charm).
if (( ! $+commands[charm] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `charm`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_charm" ]]; then
typeset -g -A _comps
autoload -Uz _charm
_comps[charm]=_charm
fi
charm completion zsh >| "$ZSH_CACHE_DIR/completions/_charm" &|

View File

@ -0,0 +1,21 @@
# chruby plugin
This plugin loads [chruby](https://github.com/postmodern/chruby), a tool that changes the
current Ruby version, and completion and a prompt function to display the Ruby version.
Supports brew and manual installation of chruby.
To use it, add `chruby` to the plugins array in your zshrc file:
```zsh
plugins=(... chruby)
```
## Usage
If you'd prefer to specify an explicit path to load chruby from
you can set variables like so:
```zsh
zstyle :omz:plugins:chruby path /local/path/to/chruby.sh
zstyle :omz:plugins:chruby auto /local/path/to/auto.sh
```

View File

@ -0,0 +1,94 @@
## load chruby from different locations
_source-from-omz-settings() {
local _chruby_path _chruby_auto
zstyle -s :omz:plugins:chruby path _chruby_path || return 1
zstyle -s :omz:plugins:chruby auto _chruby_auto || return 1
if [[ -r ${_chruby_path} ]]; then
source ${_chruby_path}
fi
if [[ -r ${_chruby_auto} ]]; then
source ${_chruby_auto}
fi
}
_source-from-homebrew() {
(( $+commands[brew] )) || return 1
local _brew_prefix
# check default brew prefix
if [[ -h /usr/local/opt/chruby ]];then
_brew_prefix="/usr/local/opt/chruby"
else
# ok , it is not default prefix
# this call to brew is expensive ( about 400 ms ), so at least let's make it only once
_brew_prefix=$(brew --prefix chruby)
fi
[[ -r "$_brew_prefix" ]] || return 1
source $_brew_prefix/share/chruby/chruby.sh
source $_brew_prefix/share/chruby/auto.sh
}
_load-chruby-dirs() {
local dir
for dir in "$HOME/.rubies" "$PREFIX/opt/rubies"; do
if [[ -d "$dir" ]]; then
RUBIES+=("$dir")
fi
done
}
# Load chruby
if _source-from-omz-settings; then
_load-chruby-dirs
elif [[ -r "/usr/local/share/chruby/chruby.sh" ]] ; then
source /usr/local/share/chruby/chruby.sh
source /usr/local/share/chruby/auto.sh
_load-chruby-dirs
elif _source-from-homebrew; then
_load-chruby-dirs
fi
unfunction _source-from-homebrew _source-from-omz-settings _load-chruby-dirs
## chruby utility functions and aliases
# rvm and rbenv plugins also provide this alias
alias rubies='chruby'
function current_ruby() {
local ruby
ruby="$(chruby | grep \* | tr -d '* ')"
if [[ $(chruby | grep -c \*) -eq 1 ]]; then
echo ${ruby}
else
echo "system"
fi
}
function chruby_prompt_info() {
echo "${$(current_ruby):gs/%/%%}"
}
# Complete chruby command with installed rubies
_chruby() {
compadd $(chruby | tr -d '* ')
if PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin" command ruby &>/dev/null; then
compadd system
fi
}
compdef _chruby chruby
# Simple definition completer for ruby-build
if command ruby-build &> /dev/null; then
_ruby-build() { compadd $(ruby-build --definitions) }
compdef _ruby-build ruby-build
fi

View File

@ -0,0 +1,38 @@
# chucknorris
Chuck Norris fortunes plugin for Oh My Zsh. Perfectly suitable as MOTD.
To use it add `chucknorris` to the plugins array in you zshrc file.
```zsh
plugins=(... chucknorris)
```
## Usage
| Command | Description |
| ----------- | ------------------------------- |
| `chuck` | Print random Chuck Norris quote |
| `chuck_cow` | Print quote in cowthink |
Example: output of `chuck_cow`:
```
Last login: Fri Jan 30 23:12:26 on ttys001
______________________________________
( When Chuck Norris plays Monopoly, it )
( affects the actual world economy. )
--------------------------------------
o ^__^
o (oo)\_______
(__)\ )\/\
||----w |
|| ||
```
## Requirements
- `fortune`
- `cowsay` if using `chuck_cow`
Available via homebrew, apt, ...

View File

@ -0,0 +1,24 @@
() {
# %x: name of file containing code being executed
local fortunes_dir="${${(%):-%x}:h}/fortunes"
# Aliases
alias chuck="fortune -a $fortunes_dir"
alias chuck_cow="chuck | cowthink"
# Automatically generate or update Chuck's compiled fortune data file
if [[ "$fortunes_dir/chucknorris" -ot "$fortunes_dir/chucknorris.dat" ]]; then
return
fi
# For some reason, Cygwin puts strfile in /usr/sbin, which is not on the path by default
local strfile="${commands[strfile]:-/usr/sbin/strfile}"
if [[ ! -x "$strfile" ]]; then
echo "[oh-my-zsh] chucknorris depends on strfile, which is not installed" >&2
echo "[oh-my-zsh] strfile is often provided as part of the 'fortune' package" >&2
return
fi
# Generate the compiled fortune data file
$strfile "$fortunes_dir/chucknorris" "$fortunes_dir/chucknorris.dat" >/dev/null
}

View File

@ -0,0 +1 @@
fortunes/chucknorris.dat

View File

@ -0,0 +1,568 @@
King Kong climbed the Empire State building in fear of Chuck Norris who was downstairs at the time.
%
"2012" is code for, Chuck Norris when he is pissed.
%
"The Big Chuck Norris Roundhouse-Kick Theory"
%
"The wind cries Chuck Norris"
%
"Walker Texas Ranger: The Movie 3-D" was considered by Warner Brothers; however the technology to create the visual effects will never be possible.
%
A Handicapped parking sign does not signify that this spot is for handicapped people. It is actually in fact a warning, that the spot belongs to Chuck Norris and that you will be handicapped if you park there.
%
Abraham Lincoln didn't die because he was shot, Chuck Norris roundhouse-kicked so fast his foot went back in time and killed Abraham Lincoln.
%
Achievement Unlocked: Chuck Norris of Death
%
After Chuck counted to infinity the first time, he vowed to count to infinity a second time....by counting the bodies of those previously roundhoused.
%
Aliens fear that Chuck Norris might abduct them.
%
An angry glare from Chuck Norris is known to kill on the spot.
%
Behind every successful man is Chuck Norris.
%
Beware of dogs... Dogs, beware of Chuck Norris.
%
Bruce Lee didn't defeat Chuck Norris. Chuck hit Bruce with a Delayed roundhouse kick that was so fast that Lee only felt the impact a year later!
%
CNN was originally created as the "Chuck Norris Network" to update Americans with on-the-spot ass kicking in real-time.
%
Casinos pay Chuck Norris not to play at anything or wish anyone good luck.
%
Chuck Norris - the new standard.
%
Chuck Norris CAN balance the light-switch between ON and OFF.
%
Chuck Norris CAN believe it's not butter.
%
Chuck Norris CAN spell with an I before E even after C.
%
Chuck Norris can play the theme from the Twilight Zone with his beard.
%
Chuck Norris can power solar panels. At night.
%
Chuck Norris watches "the Nat.Geo. Specials" on Discovery Channel.
%
Chuck Norris bowled a 301 after constructing another pin out of his beard hair.
%
Chuck Norris burnt a fire proof vest, UNDERWATER!
%
Chuck Norris can French kiss his elbow.
%
Chuck Norris can bake in a freezer.
%
Chuck Norris can defuse a bomb by cutting the wrong wire.
%
Chuck Norris can dig a hole in air.
%
Chuck Norris can divide by zero.
%
Chuck Norris can do a regime change with a roundhouse kick.
%
Chuck Norris can fit 10 gallons of water in a 5 gallon bucket.
%
Chuck Norris can grill a popsicle.
%
Chuck Norris can lead a horse to water AND make it drink.
%
Chuck Norris can make his own megazord "The Chuck Norris Roundhouse Kickers Ultimate Super Awesome Megazord".
%
Chuck Norris can milk an alligator.
%
Chuck Norris can play the death waltz with his chin.
%
Chuck Norris can roundhouse kick someone through a window without breaking the glass.
%
Chuck Norris can roundhouse-kick round houses into squares.
%
Chuck Norris can rub two fires together and make a stick!
%
Chuck Norris can see in 3D with just one eye.
%
Chuck Norris can slam a revolving door.
%
Chuck Norris can terminate a repeating decimal.
%
Chuck Norris can turn toast back into bread.
%
Chuck Norris can win a game of Connect Four in only three moves.
%
Chuck Norris can win in a top spinning tournament with a cube.
%
Chuck Norris can't perform Hadoukens, he IS a Hadouken.
%
Chuck Norris checks under his bed for Fedor Emelianenko because he takes Fedor to the vet regularly.
%
Chuck Norris counted to infinity - twice.
%
Chuck Norris created Heavy Metal when he was upset.
%
Chuck Norris does not get frostbite. Chuck Norris bites frost.
%
Chuck Norris does not have a cell phone because he hears everything.
%
Chuck Norris does not sleep. He waits.
%
Chuck Norris doesn't bowl strikes, he just knocks down one pin and the other nine faint.
%
Chuck Norris doesn't call the wrong number, you just answer the wrong phone.
%
Chuck Norris doesn't cheat death, he beats it fair and square.
%
Chuck Norris doesn't churn butter. He roundhouse kicks the cows and the butter comes straight out.
%
Chuck Norris doesn't eat, he just sucks the energy out of food by staring at it.
%
Chuck Norris doesn't exhale. The air runs desperately scared out of his lungs.
%
Chuck Norris doesn't go hunting.... CHUCK NORRIS GOES KILLING.
%
Chuck Norris doesn't let it go.
%
Chuck Norris doesn't like Mudkipz.
%
Chuck Norris doesn't look for fun. The fun looks for Chuck Norris.
%
Chuck Norris doesn't need a bulletproof vest. He catches them with his bare hands.
%
Chuck Norris doesn't need air, he is air.
%
Chuck Norris doesn't need sunglasses, the sun needs Chuck Norris glasses.
%
Chuck Norris doesn't need to brush his teeth, his spit acts as a bleach.
%
Chuck Norris doesn't read books. He stares them down until he gets the information he wants.
%
Chuck Norris doesn't throw up if he drinks too much. Chuck Norris throws down!
%
Chuck Norris doesn't eat salad, he eats vegetarians.
%
Chuck Norris doesn't wash his clothes, he disembowels them.
%
Chuck Norris doesn't wear a watch. HE decides what time it is.
%
Chuck Norris doesn't carry a list. He always knows what to do.
%
Chuck Norris drives an ice cream truck covered in human skulls.
%
Chuck Norris drowned a man ON LAND.
%
Chuck Norris fed the Hunger Games.
%
Chuck Norris found the hay in the needle stack.
%
Chuck Norris found the last digit of pi.
%
Chuck Norris had a knife thrown at him. The knife didn't impale him; he impaled the knife.
%
Chuck Norris has a battle cruiser AND a car.
%
Chuck Norris has killed the Dead Sea.
%
Chuck Norris has made a 148 break at snooker.
%
Chuck Norris invented Kentucky Fried Chicken's famous secret recipe, with eleven herbs and spices. But nobody ever mentions the twelfth ingredient: Fear.
%
Chuck Norris is allowed two carry-ons.
%
Chuck Norris is currently suing NBC, claiming Law and Order are trademarked names for his left and right legs.
%
Chuck Norris is currently suing any broadway theater that plays "The Nutcracker". He claims its an infringement on his "other" roundhouse kick.
%
Chuck Norris is entitled to his own facts.
%
Chuck Norris is my Homeboy.
%
Chuck Norris is so fast, he can run around the world and punch himself in the back of the head.
%
Chuck Norris is so hard, he uses diamonds as stress balls.
%
Chuck Norris is so scary, he makes sharks swim backwards away from him.
%
Chuck Norris is ten feet tall, weighs two-tons, breathes fire, and could eat a hammer and take a shotgun blast standing.
%
Chuck Norris is the ghost in paranormal activity.
%
Chuck Norris is the life of parties he doesn't attend.
%
Chuck Norris is the meaning of life. Too bad he's also the meaning of death.
%
Chuck Norris is the only man to ever defeat a brick wall in a game of tennis.
%
Chuck Norris is the only one who can tear a facebook page!
%
Chuck Norris is the reason that the world will end in 2012. He was getting bored with the Earth.
%
Chuck Norris is the reason tumbleweeds tumble.
%
Chuck Norris is the reason why Waldo is hiding.
%
Chuck Norris is waiting for Mt. St. Helens to erupt again. He's hoping the lava is hot enough to soften his beard so he can shave for the first time.
%
Chuck Norris isn't allowed at the zoo, because when he's there the animals are too terrified to come out of their cages.
%
Chuck Norris made a statue bleed.
%
Chuck Norris made the big bang just by clicking his fingers.
%
Chuck Norris never trains, because he's Chuck Norris.
%
Chuck Norris once cried just to see what it was like. The end result was the creation of life.
%
Chuck Norris once cut a knife with a stick of butter.
%
Chuck Norris once got a 200 yard punt return.
%
Chuck Norris once had a pet monkey named KING KONG.
%
Chuck Norris once had a street named after him. The name removed at once, because nobody crosses Chuck Norris, and lives.
%
Chuck Norris once had a weak moment, just to know what it felt like.
%
Chuck Norris once played Duck Duck Goose with a group of Kindergarteners. Only one kid made it to first grade.
%
Chuck Norris once proved p^~p by induction on his beard hairs.
%
Chuck Norris once punched the ground to stop an earthquake. The resulting aftershock caused the BP oil spill.
%
Chuck Norris once round-house kicked a salesman. Over the phone.
%
Chuck Norris once roundhouse kicked a football. The astronomical society now considers it a planet.
%
Chuck Norris once thought he was wrong. He was, however, mistaken.
%
Chuck Norris once walked down a street with his fists in his pockets. He was then arrested for concealing two deadly weapons.
%
Chuck Norris once won the Tour de France riding a "big wheel".
%
Chuck Norris originally appeared in the "Street Fighter II" video game, but was removed by Beta Testers because every button caused him to do a roundhouse kick. When asked bout this "glitch," Norris replied, "That's no glitch."
%
Chuck Norris owns all number 1 pencils.
%
Chuck Norris pees Adamantium.
%
Chuck Norris plays Texas Hold'Em with Zeus, every second Wednesday of the month.
%
Chuck Norris played "Got your Nose" with Voldemort and won.
%
Chuck Norris played the game of thrones and won.
%
Chuck Norris protects his bodyguards.
%
Chuck Norris rolled a 20 on a 6 sided die.
%
Chuck Norris roundhouse kicks people in the face first and asks questions later.
%
Chuck Norris sent a BBM to an iPhone.
%
Chuck Norris shops at Sam's Club, but leaves without having his receipt checked.
%
Chuck Norris splattered tiger blood and Adonis' DNA on Charlie Sheen with 1 roundhouse kick!
%
Chuck Norris started Chuck Norris.
%
Chuck Norris starts his day with 6 live chickens, two cows, three pigs, and a boiling hot cup of pure fury.
%
Chuck Norris told me to put this here.
%
Chuck Norris uses a real mouse to move the cursor, type on the keyboard, write e-mails, code entire websites, and make coffee.
%
Chuck Norris uses pepper spray to spice up his steaks.
%
Chuck Norris was heard in a soundproof room!
%
Chuck Norris was once turned down for American Idol. When Simon was questioned about it, he replied "I'm retiring after this season". I wonder why?
%
Chuck Norris was originally in Mortal Kombat, but that version was deleted because no one can beat Chuck Norris in a fight.
%
Chuck Norris was the image used for Papa Smurf.
%
Chuck Norris was the reason why the Great Wall of China was constructed. It failed miserably.
%
Chuck Norris was what Willis was talking about.
%
Chuck Norris wasn't born on his birthday.
%
Chuck Norris watched the first steps on the moon... from his summer home on Mars.
%
Chuck Norris went up the creek without a paddle... or a canoe.
%
Chuck Norris will attain statehood in 2009. His state flower will be the Magnolia.
%
Chuck Norris wins NASCAR races with all right turns.
%
Chuck Norris won a stepdance contest by standing on his hands.
%
Chuck Norris yells at drill Sergeants.
%
Chuck Norris' dog picks up after him.
%
Chuck Norris' films are factual documentaries.
%
Chuck Norris' first job was as a paperboy. There were no survivors.
%
Chuck Norris' glass is never half full or half empty. It stays full even after he takes a drink.
%
Chuck Norris' hand is the only hand that can beat a Royal Flush.
%
Chuck Norris' personal airplane is called Air Force Chuck.
%
Chuck Norris. Enough said.
%
Chuck Norris: even Naruto can't believe it.
%
Chuck Norris can make sour milk turn fresh.
%
Contrary to popular belief, Rome WAS built in a day, by Chuck Norris.
%
Contrary to popular belief, America is not a democracy, it is a Chucktatorship.
%
Contrary to popular belief, Chuck Norris, not the box jellyfish of northern Australia, is the most venomous creature on Earth.
%
Cops don't need badges in their wallets, but only a picture of Chuck Norris.
%
Crop circles are Chuck Norris' way of telling the world that sometimes corn needs to lie down.
%
Did you hear about the boy who cried Chuck Norris?
%
Dog the Bounty Hunter can't track Chuck Norris down.
%
Don't get Chuck Norris angry. Last time somebody did that, Chuck Norris made the Grand Canyon.
%
Earth's rotation is purely governed by the direction that Chuck Norris is walking.
%
Ever wonder what really happened to the dinosaurs? They all dug their own graves when they heard Chuck Norris was coming.
%
Every line in a Chuck Norris haiku is "A roundhouse kick to the face." And they all have the correct number of syllables.
%
Every phobia known to man has a phobia of Chuck Norris.
%
Every time there's an earthquake, you know Chuck Norris is hungry. The earthquake is caused by his stomach growling.
%
Evolution's driving mechanism is nature's desperate attempt to escape Chuck Norris.
%
Fear of spiders is arachnophobia. Fear of tight spaces is claustrophobia. Fear of Chuck Norris is called Logic.
%
Fool me once, shame on you. Fool Chuck Norris once and he will roundhouse you in the face.
%
Ghosts can see Chuck Norris.
%
Guns don't kill people. Chuck Norris kills people.
%
How much wood could a woodchuck chuck if a woodchuck could chuck wood? No woodchuck could chuck Chuck's wood!
%
If Chuck Norris were a calendar, every month would be named Chucktober, and every day he'd kick your ass.
%
If Chuck Norris were to get into a fight with another Chuck Norris, Chuck Norris would win.
%
If God doesn't know, Chuck does.
%
If Goliath listened to Chuck Norris, he would have won.
%
If at first you don't succeed, you're not Chuck Norris.
%
If you ask Chuck Norris what time it is, he always says, "Two seconds 'til." After you ask, "Two seconds 'til what?" he roundhouse kicks you in the face.
%
If you put in the correct cheat code in Halo 2, you can have Master Chief play without his helmet, revealing himself to be Chuck Norris.
%
If you see a man in the street who looks like Chuck Norris, but isn't, run: you don't want to be caught in the resulting roundhouse kick to his face.
%
If you spell Chuck Norris in Scrabble, you win. Forever.
%
In 1945 The US army asked if they could clone Chuck Norris. Instead he said he could sort out the Japanese.
%
In Texas, there are five sizes for fountain drinks: small, medium, large, Texas sized, and Chuck Norris sized. It is a cup made of a human skull.
%
In a rain storm Chuck Norris stays dry. Rain drops are scared to hit him.
%
In the back of the book of world records, it says "All records are held by Chuck Norris. The ones listed are in second place."
%
James Bond has a license to kill. He got it from Chuck Norris.
%
Jedis are now taught to use the "Chuck".
%
MacGyver immediately tried to make a bomb out of some Q-Tips and Gatorade, but Chuck Norris roundhouse-kicked him in the solar plexus. MacGyver promptly threw up his own heart.
%
Machiavelli said it is better to be feared than loved because he was inspired by Chuck Norris.
%
May the Force be with Chuck Norris... for its own good.
%
Merlin was Chuck Norris' assistant.
%
Most people have 23 pairs of chromosomes. Chuck Norris has 72... and they're all poisonous.
%
Note to self: Don't be the cashier to tell Chuck Norris his coupons have expired.
%
Chuck Norris' keyboard has no control key. Chuck Norris is always in control.
%
Once upon a time, Chuck Norris found himself in a town called Shit Creek. He opened a Paddle Store.
%
One glance from Chuck Norris and snow turns itself yellow.
%
One time a test cheated on Chuck Norris.
%
Only Chuck Norris can win the mind game, 'cause he never minds.
%
Only Chuck Norris is stronger than an Altoid.
%
Outer space exists because it's afraid to be on the same planet with Chuck Norris.
%
Ozzy Osbourne once accidentally bit the head off a live bat - Chuck Norris once deliberately bit the head off a live pterodactyl.
%
Pluto is actually an orbiting group of British soldiers from the American Revolution who entered space after the Chuck gave them a roundhouse kick to the face.
%
Police label anyone attacking Chuck Norris as a Code 45-11.... a suicide.
%
Remember the Soviet Union? They decided to quit after watching a DeltaForce marathon on Satellite TV.
%
Simon doesn't say... Chuck Norris says.
%
Some boots were made for walking. Some boots may walk all over you, but Chuck Norris' boots walk THROUGH you.
%
Some kids pee their name in snow. Chuck Norris pees his name in concrete.
%
Some people ask for a Kleenex when they sneeze, Chuck Norris asks for a body bag.
%
Someone once videotaped Chuck Norris getting pissed off. It was called Walker: Texas Chain Saw Massacre.
%
Staring at Chuck Norris for extended periods of time without proper eye protection will cause blindness, and possibly foot sized bruises on the face.
%
Taking Karate Lessons = $100, Buying MMA DVD's = $150, Subscribing to a UFC event = $50, Getting a Roundhouse Kick from Chuck Norris = PRICELESS.
%
That's not an eclipse. That's the sun hiding from Chuck Norris.
%
The Beatles are on iTunes because Chuck Norris bought a Mac.
%
The Earth is made up of two-thirds water and one-third Chuck Norris.
%
The Earth was almost destroyed by a 50 km wide asteroid in 1984, but Chuck Norris roundhouse kicked it into the Sun.
%
The Great Wall of China was originally created to keep Chuck Norris out. It failed miserably.
%
The Joneses are trying to keep up with Chuck Norris.
%
The Matrix Trilogy would have ended on the first movie had Keanu Reeves said, “I know Chuck Norris.”
%
The answer to life, the universe and everything isn't 42. It's Chuck Norris.
%
The apple falls far from the tree, when Chuck's roundhouse kick is taken to the trunk.
%
The best part of waking up is not Folgers in your cup. it's knowing that Chuck Norris let you live.
%
The chief export of Chuck Norris is pain.
%
The dictionary references Chuck Norris several times, he is mentioned under Fear, Law, Order and Chucktatorship.
%
The leading causes of death in the United States are: 1. Heart Disease 2. Chuck Norris 3. Cancer.
%
The letters in Chuck Norris cannot be unscrambled.
%
The only place where the Starship Enterprise refuses to boldly go is Chuck Norris' planet... which is all of them.
%
The only reason that USA lost the 2011 world cup to Japan is because Chuck Norris wasn't there.
%
The only sure things are Death and Taxes, and when Chuck Norris goes to work for the IRS, they'll be the same thing.
%
The only way sharks will come near CN underwater is when CN is inside of a cage.
%
The only word that rhymes with orange is Chuck Norris.
%
The producers of the movie "The Last Airbender" are now in talks with Chuck Norris in Order to star him in their next sequel "The Last Skull Bender".
%
The quickest way to a man's heart is with Chuck Norris' fist.
%
The reason why Batman only comes out at night is because he's afraid he might encounter Chuck Norris in the morning and afternoon.
%
The red phone in the oval office rings directly to Chuck Norris' cell phone.
%
The show Survivor had the original premise of putting people on an island with Chuck Norris. There were no survivors, and nobody is brave enough to go to the island to retrieve the footage.
%
The square root of Chuck Norris is pain. Do not try to square Chuck Norris. The result is death.
%
The sun only rises every morning because Chuck Norris allows it to.
%
The truth hurts, doesn't it? Chuck Norris' truth kills.
%
There is no chin behind Chuck Norris' beard. There is only another fist.
%
There is no limbo, only a world that doesn't know of Chuck Norris.
%
There is no such thing as global warming. Chuck Norris was cold, so he turned the sun up.
%
There is no theory of evolution, just a list of creatures Chuck Norris has allowed to live.
%
This one time at band camp... BAM! Chuck Norris.
%
Those who ignore history, are doomed by Chuck Norris.
%
Trick me once, shame on you, trick Chuck Norris.. rest in peace.
%
Unlike Jack Bauer, Chuck Norris doesn't need bullets. A quick roundhouse to the face kills twice as fast.
%
Walker: Texas Ranger went into syndication before the first episode was shot.
%
What was going through the minds of all of Chuck Norris' victims before they died? His shoe.
%
Whatever Chuck Norris wants, it will instantly appear.
%
When Betty White gets angry, she turns into the Hulk. When Valerie Bertinelli gets mad, she turns into Chuck Norris.
%
When Chuck Norris creates a login, it tells him "password not strong enough." He types in his name and it tells him "password too strong."
%
When Chuck Norris does a pushup, he isn't lifting himself up, he's pushing the Earth down.
%
When Chuck Norris drinks water, the water automatically pasteurized.
%
When Chuck Norris goes to Vegas, he doesn't have to gamble. The casinos just give him stacks of money.
%
When Chuck Norris goes to rodeos, bulls ride him.
%
When Chuck Norris goes to the library, he looks for the Guinness book of records in the comedy section.
%
When Chuck Norris inhales helium, his voice doesn't change.
%
When Chuck Norris performs a roundhouse kick, he's actually measuring the circumference of the universe.
%
When Chuck Norris played the card game War with a friend, France surrendered.
%
When Chuck Norris pokes the Pillsbury Doughboy, it's not a laughing matter.
%
When Chuck Norris roundhouse-kicks you, he decides when you will feel the impact.
%
When Chuck Norris sends in his taxes, he sends blank forms and includes only a picture of himself, crouched and ready to attack. Chuck Norris has not had to pay taxes, ever.
%
When Chuck Norris tosses a coin, it lands on both heads and tails.
%
When God said "Let there be light!", Chuck Norris said "Only for half the day."
%
When Presidents speak, their nation listens. When Chuck Norris blinks, the whole world listens.
%
When Steven Seagal kills a ninja, he only takes its hide. When Chuck Norris kills a ninja, he uses every part.
%
When chuck Norris was in school, he made his PE teacher run laps.
%
When does Chuck Norris run out of shotgun bullets? whenever he wants to.
%
When taking the SAT, write "Chuck Norris" for every answer. You will score over 8000.
%
When the Boogeyman goes to sleep every night, he checks his closet for Chuck Norris.
%
When things go bump in the night, it's Chuck Norris
%
While visiting the Hexagon, Chuck Norris was asked to demonstrate his famous roundhouse kick. Henceforth, it has been known as the Pentagon.
%
Why didn't the chicken cross the road? Because Chuck Norris got to it first.
%
You know Chuck Norris' pet lizard, right? Last I heard, he was in the movie "Godzilla". Oh, and his pet turtle starred in "Gamera" as well.
%
http://chucknorrisfacts.com/ is built in Drupal because Chuck Norris knows a good CMS when he sees one.
%
Chuck Norris made the first Giraffe by uppercutting a horse.
%
Chuck Norris can hear sign language.
%
Chuck Norris make onions cry.
%
Chuck Norris doesn't shake hands, he makes them tremble.
%

View File

@ -0,0 +1,58 @@
# Cloudfoundry Plugin
This plugin is intended to offer a few simple aliases for regular users of the [Cloud Foundry Cli][1]. Most are just simple aliases that will save a bit of typing. Others include mini functions and or accept parameters. Take a look at the table below for details.
| Alias | Command | Description |
|----------|-----------------------------|--------------------------------------------------------------------------|
| cfl | `cf login` | Login to Cloud Foundry |
| cft | `cf target` | Target the cli at a specific Org/Space in Cloud Foundry |
| cfa | `cf apps` | List all applications in the current Org/Space |
| cfs | `cf services` | List all services in the current Org/Space |
| cfm | `cf marketplace` | List the services available in the Marketplace |
| cfp | `cf push` | Push your application code to Cloud Foundry |
| cfcs | `cf create-service` | Create a service based on a Marketplace offering |
| cfbs | `cf bind-service` | Bind an application to a service you created |
| cfus | `cf unbind-service` | Unbind a service from an application |
| cfds | `cf delete-service` | Delete a service you no longer have bound |
| cfup | `cf cups` | Create a "user-provided-service" |
| cflg | `cf logs` | Tail the logs of an application (requires <APP_NAME>) |
| cfr | `cf routes` | List all the routes in the current Space |
| cfe | `cf env` | Show the environment variables for an application (requires <APP_NAME>) |
| cfsh | `cf ssh` | Attach to a running container (requires an <APP_NAME> etc.) |
| cfsc | `cf scale` | Scale an application (requires an <APP_NAME> etc.) |
| cfev | `cf events` | Show the application events (requires <APP_NAME>) |
| cfdor | `cf delete-orphaned-routes` | Delete routes that are no longer bound to applications |
| cfbpk | `cf buildpacks` | List the available buildpacks |
| cfdm | `cf domains` | List the domains associates with this Cloud Foundry foundation |
| cfsp | `cf spaces` | List all the Spaces in the current Org |
| cfap | `cf app` | Show the details of a deployed application (requires <APP_NAME>) |
| cfh. | `export CF_HOME=$PWD/.cf` | Set the current directory as CF_HOME |
| cfh~ | `export CF_HOME=~/.cf` | Set the user's root directory as CF_HOME |
| cfhu | `unset CF_HOME` | Unsets CF_HOME |
| cfpm | `cf push -f` | Push an application using a manifest (requires <MANIFEST_FILE> location) |
| cflr | `cf logs --recent` | Show the recent logs (requires <APP_NAME>) |
| cfsrt | `cf start` | Start an application (requires <APP_NAME>) |
| cfstp | `cf stop` | Stop an application (requires <APP_NAME>) |
| cfstg | `cf restage` | Restage an application (requires <APP_NAME>) |
| cfdel | `cf delete` | Delete an application (requires <APP_NAME>) |
| cfsrtall | - | Start all apps that are currently in the "Stopped" state |
| cfstpall | - | Stop all apps that are currently in the "Started" state |
For help and advice on what any of the commands does, consult the built in `cf` help functions as follows:-
```bash
cf help # List the most popular and commonly used commands
cf help -a # Complete list of all possible commands
cf <COMMAND_NAME> --help # Help on a specific command including arguments and examples
```
Alternatively, seek out the [online documentation][3]. And don't forget, there are loads of great [community plugins for the cf-cli][4] command line tool that can greatly extend its power and usefulness.
## Contributors
Contributed to `oh_my_zsh` by [benwilcock][2].
[1]: https://docs.cloudfoundry.org/cf-cli/install-go-cli.html
[2]: https://github.com/benwilcock
[3]: https://docs.cloudfoundry.org/cf-cli/getting-started.html
[4]: https://plugins.cloudfoundry.org/

View File

@ -0,0 +1,34 @@
# Some Useful CloudFoundry Aliases & Functions
alias cfl="cf login"
alias cft="cf target"
alias cfa="cf apps"
alias cfs="cf services"
alias cfm="cf marketplace"
alias cfp="cf push"
alias cfcs="cf create-service"
alias cfbs="cf bind-service"
alias cfus="cf unbind-service"
alias cfds="cf delete-service"
alias cfup="cf cups"
alias cflg="cf logs"
alias cfr="cf routes"
alias cfe="cf env"
alias cfsh="cf ssh"
alias cfsc="cf scale"
alias cfev="cf events"
alias cfdor="cf delete-orphaned-routes"
alias cfbpk="cf buildpacks"
alias cfdm="cf domains"
alias cfsp="cf spaces"
function cfap() { cf app $1 }
function cfh.() { export CF_HOME=$PWD/.cf }
function cfh~() { export CF_HOME=~/.cf }
function cfhu() { unset CF_HOME }
function cfpm() { cf push -f $1 }
function cflr() { cf logs $1 --recent }
function cfsrt() { cf start $1 }
function cfstp() { cf stop $1 }
function cfstg() { cf restage $1 }
function cfdel() { cf delete $1 }
function cfsrtall() {cf apps | awk '/stopped/ { system("cf start " $1)}'}
function cfstpall() {cf apps | awk '/started/ { system("cf stop " $1)}'}

View File

@ -0,0 +1,8 @@
# codeclimate plugin
This plugin adds autocompletion for the [`codeclimate` CLI](https://github.com/codeclimate/codeclimate).
To use it, add `codeclimate` to the plugins array in your zshrc file:
```zsh
plugins=(... codeclimate)
```

View File

@ -0,0 +1,82 @@
#compdef codeclimate
_codeclimate_all_engines() {
engines_all=(`codeclimate engines:list | tail -n +2 | gawk '{ print $2 }' | gawk -F: '{ print $1 }'`)
}
_codeclimate_installed_engines() {
_codeclimate_all_engines
engines_installed=()
if [ -e .codeclimate.yml ]
then
for engine in $engines_all
do
if grep -q $engine ".codeclimate.yml"
then
engines_installed+=$engine
fi
done
fi
}
_codeclimate_not_installed_engines() {
_codeclimate_all_engines
engines_not_installed=()
if [ -e .codeclimate.yml ]
then
for engine in $engines_all
do
if ! grep -q $engine ".codeclimate.yml"
then
engines_not_installed+=$engine
fi
done
fi
}
local curcontext="$curcontext" state line ret=1
local expl
local -a engines_all engines_installed engines_not_installed
_arguments \
'1: :->cmds' \
'*:: :->args' && ret=0
case $state in
cmds)
_values "bundle command" \
"analyze[Analyze all relevant files in the current working directory]" \
"console[Start an interactive session providing access to the classes within the CLI]" \
"engines\:disable[Prevents the engine from being used in this project]" \
"engines\:enable[This engine will be run the next time your project is analyzed]" \
"engines\:install[Compares the list of engines in your .codeclimate.yml file to those that are currently installed, then installs any missing engines]" \
"engines\:list[Lists all available engines in the Code Climate Docker Hub]" \
"engines\:remove[Removes an engine from your .codeclimate.yml file]" \
"help[Displays a list of commands that can be passed to the Code Climate CLI]" \
"init[Generates a new .codeclimate.yml file in the current working directory]" \
"validate-config[Validates the .codeclimate.yml file in the current working directory]" \
"version[Displays the current version of the Code Climate CLI]"
ret=0
;;
args)
case $line[1] in
engines:enable)
_codeclimate_not_installed_engines
_wanted engines_not_installed expl 'not installed engines' compadd -a engines_not_installed ;;
engines:disable|engines:remove)
_codeclimate_installed_engines
_wanted engines_installed expl 'installed engines' compadd -a engines_installed ;;
analyze)
_arguments \
'-f:Output Format:(text json)'
ret=0
;;
esac
;;
esac
return ret

View File

@ -0,0 +1,31 @@
# Coffeescript Plugin
This plugin provides aliases for quickly compiling and previewing your
coffeescript code.
When writing Coffeescript it's very common to want to preview the output of a
certain snippet of code, either because you want to test the output or because
you'd like to execute it in a browser console which doesn't accept Coffeescript.
Preview the compiled result of your coffeescript with `cf "code"` as per the
following:
```zsh
$ cf 'if a then b else c'
if (a) {
b;
} else {
c;
}
```
Also provides the following aliases:
* **cfc:** Copies the compiled JS to your clipboard. Very useful when you want
to run the code in a JS console.
* **cfp:** Compiles from your currently copied clipboard. Useful when you want
to compile large/multi-line snippets
* **cfpc:** Paste coffeescript from clipboard, compile to JS, then copy the
the result back to clipboard.

View File

@ -0,0 +1,81 @@
#compdef coffee
# ------------------------------------------------------------------------------
# Copyright (c) 2011 GitHub zsh-users - https://github.com/zsh-users
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the zsh-users nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# ------------------------------------------------------------------------------
# Description
# -----------
#
# Completion script for Coffee.js v0.6.11 (https://coffeescript.org)
#
# ------------------------------------------------------------------------------
# Authors
# -------
#
# * Mario Fernandez (https://github.com/sirech)
# * Dong Weiming (https://github.com/dongweiming)
#
# ------------------------------------------------------------------------------
local curcontext="$curcontext" state line ret=1 version
local -a opts
typeset -A opt_args
version=(${(f)"$(_call_program version $words[1] --version)"}) || return ret
version=${${(z)${version[1]}}[3]}
autoload -Uz is-at-least
if ! is-at-least 1.6.3 "$version"; then
opts+=('(-l --lint)'{-l,--lint}'[pipe the compiled JavaScript through JavaScript Lint]'
'(-r --require)'{-r,--require}'[require a library before executing your script]:library')
fi
_arguments -C \
'(- *)'{-h,--help}'[display this help message]' \
'(- *)'{-v,--version}'[display the version number]' \
$opts \
'(-b --bare)'{-b,--bare}'[compile without a top-level function wrapper]' \
'(-e --eval)'{-e,--eval}'[pass a string from the command line as input]:Inline Script' \
'(-i --interactive)'{-i,--interactive}'[run an interactive CoffeeScript REPL]' \
'(-j --join)'{-j,--join}'[concatenate the source CoffeeScript before compiling]:Destination JS file:_files -g "*.js"' \
'(--nodejs)--nodejs[pass options directly to the "node" binary]' \
'(-c --compile)'{-c,--compile}'[compile to JavaScript and save as .js files]' \
'(-o --output)'{-o,--output}'[set the output directory for compiled JavaScript]:Output Directory:_files -/' \
'(-n -t -p)'{-n,--nodes}'[print out the parse tree that the parser produces]' \
'(-n -t -p)'{-p,--print}'[print out the compiled JavaScript]' \
'(-n -t -p)'{-t,--tokens}'[print out the tokens that the lexer/rewriter produce]' \
'(-s --stdio)'{-s,--stdio}'[listen for and compile scripts over stdio]' \
'(-w --watch)'{-w,--watch}'[watch scripts for changes and rerun commands]' \
'*:script or directory:_files' && ret=0
return ret
# Local Variables:
# mode: Shell-Script
# sh-indentation: 2
# indent-tabs-mode: nil
# sh-basic-offset: 2
# End:
# vim: ft=zsh sw=2 ts=2 et

View File

@ -0,0 +1,16 @@
#!/bin/zsh
# compile a string of coffeescript and print to output
cf () {
coffee -peb "$1"
}
# compile & copy to clipboard
cfc () {
cf "$1" | clipcopy
}
# compile from clipboard & print
alias cfp='cf "$(clippaste)"'
# compile from clipboard and copy to clipboard
alias cfpc='cfp | clipcopy'

View File

@ -0,0 +1,48 @@
# Colemak plugin
This plugin remaps keys in `zsh`'s [`vi`-style navigation mode](http://zsh.sourceforge.net/Doc/Release/Zsh-Line-Editor.html#Keymaps)
for a [Colemak](https://colemak.com/) keyboard layout, to match the QWERTY position:
![Colemak layout on a US keyboard](https://colemak.com/wiki/images/6/6c/Colemak2.png)
To use it, add it to the plugins array in your `~/.zshrc` file:
```
plugins=(... colemak)
```
You will also need to enable `vi` mode, so add another line to `~/.zshrc`:
```
bindkey -v
```
Restart your shell and hit the `<ESC>` key to activate `vicmd` (navigation) mode,
and start navigating `zsh` with your new keybindings!
## Key bindings for vicmd
| Old | New | Binding | Description |
|------------|------------|---------------------------|----------------------------------------------------|
| `CTRL`+`j` | `CTRL`+`n` | accept-line | Insert new line |
| `j` | `n` | down-line-or-history | Move one line down or command history forwards |
| `k` | `e` | up-line-or-history | Move one line up or command history backwards |
| `l` | `i` | vi-forward-char | Move one character to the right |
| `n` | `k` | vi-repeat-search | Repeat command search forwards |
| `N` | `K` | vi-rev-repeat-search | Repeat command search backwards |
| `i` | `u` | vi-insert | Enter insert mode |
| `I` | `U` | vi-insert-bol | Move to first non-blank char and enter insert mode |
| `<none>` | `l` | vi-undo-change | Undo change |
| `J` | `N` | vi-join | Join the current line with the next one |
| `e` | `j` | vi-forward-word-end | Move to the end of the next word |
| `E` | `J` | vi-forward-blank-word-end | Move to end of the current or next word |
## Key bindings for less
| Keyboard shortcut | `less` key binding |
|-------------------|--------------------|
| `n` | forw-line |
| `e` | back-line |
| `k` | repeat-search |
| `ESC`+`k` | repeat-search-all |
| `K` | reverse-search |
| `ESC`+`K` | reverse-search-all |

View File

@ -0,0 +1,6 @@
n forw-line
e back-line
k repeat-search
\ek repeat-search-all
K reverse-search
\eK reverse-search-all

View File

@ -0,0 +1,38 @@
# ctrl-j newline
bindkey '^n' accept-line
bindkey -a '^n' accept-line
# another rotation to match qwerty
bindkey -a 'n' down-line-or-history
bindkey -a 'e' up-line-or-history
bindkey -a 'i' vi-forward-char
# make qwerty
bindkey -a 'k' vi-repeat-search
bindkey -a 'K' vi-rev-repeat-search
bindkey -a 'u' vi-insert
bindkey -a 'U' vi-insert-bol
bindkey -a 'l' vi-undo-change
bindkey -a 'N' vi-join
# spare
bindkey -a 'j' vi-forward-word-end
bindkey -a 'J' vi-forward-blank-word-end
# Handle $0 according to the standard:
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
# New less versions will read this file directly
export LESSKEYIN="${0:h:A}/colemak-less"
# Only run lesskey if less version is older than v582
less_ver=$(less --version | awk '{print $2;exit}')
autoload -Uz is-at-least
if ! is-at-least 582 $less_ver; then
# Old less versions will read this transformed file
export LESSKEY="${0:h:A}/.less"
lesskey -o "$LESSKEY" "$LESSKEYIN" 2>/dev/null
fi
unset less_ver

View File

@ -0,0 +1 @@
.less

View File

@ -0,0 +1,32 @@
# Colored man pages plugin
This plugin adds colors to man pages.
To use it, add `colored-man-pages` to the plugins array in your zshrc file:
```zsh
plugins=(... colored-man-pages)
```
It will also automatically colorize man pages displayed by `dman` or `debman`,
from [`debian-goodies`](https://packages.debian.org/stable/debian-goodies).
You can also try to color other pages by prefixing the respective command with `colored`:
```zsh
colored git help clone
```
## Customization
The plugin declares global associative array `less_termcap`, which maps termcap capabilities to escape
sequences for the `less` pager. This mapping can be further customized by the user after the plugin is
loaded. Check out sources for more.
For example: `less_termcap[md]` maps to `LESS_TERMCAP_md` which is the escape sequence that tells `less`
how to print something in bold. It's currently shown in bold red, but if you want to change it, you
can redefine `less_termcap[md]` in your zshrc file, after OMZ is sourced:
```zsh
less_termcap[md]="${fg_bold[blue]}" # this tells less to print bold text in bold blue
```

View File

@ -0,0 +1,54 @@
# Requires colors autoload.
# See termcap(5).
# Set up once, and then reuse. This way it supports user overrides after the
# plugin is loaded.
typeset -AHg less_termcap
# bold & blinking mode
less_termcap[mb]="${fg_bold[red]}"
less_termcap[md]="${fg_bold[red]}"
less_termcap[me]="${reset_color}"
# standout mode
less_termcap[so]="${fg_bold[yellow]}${bg[blue]}"
less_termcap[se]="${reset_color}"
# underlining
less_termcap[us]="${fg_bold[green]}"
less_termcap[ue]="${reset_color}"
# Handle $0 according to the standard:
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
# Absolute path to this file's directory.
typeset -g __colored_man_pages_dir="${0:A:h}"
function colored() {
local -a environment
# Convert associative array to plain array of NAME=VALUE items.
local k v
for k v in "${(@kv)less_termcap}"; do
environment+=( "LESS_TERMCAP_${k}=${v}" )
done
# Prefer `less` whenever available, since we specifically configured
# environment for it.
environment+=( PAGER="${commands[less]:-$PAGER}" )
environment+=( GROFF_NO_SGR=1 )
# See ./nroff script.
if [[ "$OSTYPE" = solaris* ]]; then
environment+=( PATH="${__colored_man_pages_dir}:$PATH" )
fi
command env $environment "$@"
}
# Colorize man and dman/debman (from debian-goodies)
function man \
dman \
debman {
colored $0 "$@"
}

View File

@ -0,0 +1,12 @@
#!/bin/sh
# The whole point of this wrapper is to replace emboldening factor -u0 with
# -u1 under certain circumstances on Solaris.
if [ "$1,$2,$3" = "-u0,-Tlp,-man" ]; then
shift
exec /usr/bin/nroff -u1 "$@"
else
# Some other invocation of nroff
exec /usr/bin/nroff "$@"
fi

View File

@ -0,0 +1,56 @@
# colorize
With this plugin you can syntax-highlight file contents of over 300 supported languages and other text formats.
Colorize will highlight the content based on the filename extension. If it can't find a syntax-highlighting
method for a given extension, it will try to find one by looking at the file contents. If no highlight method
is found it will just cat the file normally, without syntax highlighting.
## Setup
To use it, add colorize to the plugins array of your `~/.zshrc` file:
```
plugins=(... colorize)
```
## Configuration
### Requirements
This plugin requires that at least one of the following tools is installed:
* [Chroma](https://github.com/alecthomas/chroma)
* [Pygments](https://pygments.org/download/)
### Colorize tool
Colorize supports `pygmentize` and `chroma` as syntax highlighter. By default colorize uses `pygmentize` unless it's not installed and `chroma` is. This can be overridden by the `ZSH_COLORIZE_TOOL` environment variable:
```
ZSH_COLORIZE_TOOL=chroma
```
### Styles
Pygments offers multiple styles. By default, the `default` style is used, but you can choose another theme by setting the `ZSH_COLORIZE_STYLE` environment variable:
```
ZSH_COLORIZE_STYLE="colorful"
```
### Chroma Formatter Settings
Chroma supports terminal output in 8 color, 256 color, and true-color. If you need to change the default terminal output style from the standard 8 color output, set the `ZSH_COLORIZE_CHROMA_FORMATTER` environment variable:
```
ZSH_COLORIZE_CHROMA_FORMATTER=terminal256
```
## Usage
* `ccat <file> [files]`: colorize the contents of the file (or files, if more than one are provided).
If no files are passed it will colorize the standard input.
* `cless [less-options] <file> [files]`: colorize the contents of the file (or files, if more than one are provided) and open less.
If no files are passed it will colorize the standard input.
The LESSOPEN and LESSCLOSE will be overwritten for this to work, but only in a local scope.

View File

@ -0,0 +1,114 @@
# Easier alias to use the plugin
alias ccat="colorize_cat"
alias cless="colorize_less"
# '$0:A' gets the absolute path of this file
ZSH_COLORIZE_PLUGIN_PATH=$0:A
colorize_check_requirements() {
local -a available_tools
available_tools=("chroma" "pygmentize")
if [ -z "$ZSH_COLORIZE_TOOL" ]; then
if (( $+commands[pygmentize] )); then
ZSH_COLORIZE_TOOL="pygmentize"
elif (( $+commands[chroma] )); then
ZSH_COLORIZE_TOOL="chroma"
else
echo "Neither 'pygments' nor 'chroma' is installed!" >&2
return 1
fi
fi
if [[ ${available_tools[(Ie)$ZSH_COLORIZE_TOOL]} -eq 0 ]]; then
echo "ZSH_COLORIZE_TOOL '$ZSH_COLORIZE_TOOL' not recognized. Available options are 'pygmentize' and 'chroma'." >&2
return 1
elif ! (( $+commands[$ZSH_COLORIZE_TOOL] )); then
echo "Package '$ZSH_COLORIZE_TOOL' is not installed!" >&2
return 1
fi
}
colorize_cat() {
if ! colorize_check_requirements; then
return 1
fi
# If the environment variable ZSH_COLORIZE_STYLE
# is set, use that theme instead. Otherwise,
# use the default.
if [ -z "$ZSH_COLORIZE_STYLE" ]; then
# Both pygmentize & chroma support 'emacs'
ZSH_COLORIZE_STYLE="emacs"
fi
# Use stdin if no arguments have been passed.
if [ $# -eq 0 ]; then
if [[ "$ZSH_COLORIZE_TOOL" == "pygmentize" ]]; then
pygmentize -O style="$ZSH_COLORIZE_STYLE" -g
else
chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}"
fi
return $?
fi
# Guess lexer from file extension, or guess it from file contents if unsuccessful.
local FNAME lexer
for FNAME in "$@"; do
if [[ "$ZSH_COLORIZE_TOOL" == "pygmentize" ]]; then
lexer=$(pygmentize -N "$FNAME")
if [[ $lexer != text ]]; then
pygmentize -O style="$ZSH_COLORIZE_STYLE" -l "$lexer" "$FNAME"
else
pygmentize -O style="$ZSH_COLORIZE_STYLE" -g "$FNAME"
fi
else
chroma --style="$ZSH_COLORIZE_STYLE" --formatter="${ZSH_COLORIZE_CHROMA_FORMATTER:-terminal}" "$FNAME"
fi
done
}
# The less option 'F - Forward forever; like "tail -f".' will not work in this implementation
# caused by the lack of the ability to follow the file within pygmentize.
colorize_less() {
if ! colorize_check_requirements; then
return 1
fi
_cless() {
# LESS="-R $LESS" enables raw ANSI colors, while maintain already set options.
local LESS="-R $LESS"
# This variable tells less to pipe every file through the specified command
# (see the man page of less INPUT PREPROCESSOR).
# 'zsh -ic "colorize_cat %s 2> /dev/null"' would not work for huge files like
# the ~/.zsh_history. For such files the tty of the preprocessor will be suspended.
# Therefore we must source this file to make colorize_cat available in the
# preprocessor without the interactive mode.
# `2>/dev/null` will suppress the error for large files 'broken pipe' of the python
# script pygmentize, which will show up if less has not fully "loaded the file"
# (e.g. when not scrolled to the bottom) while already the next file will be displayed.
local LESSOPEN="| zsh -c 'source \"$ZSH_COLORIZE_PLUGIN_PATH\"; \
ZSH_COLORIZE_TOOL=$ZSH_COLORIZE_TOOL ZSH_COLORIZE_STYLE=$ZSH_COLORIZE_STYLE \
colorize_cat %s 2> /dev/null'"
# LESSCLOSE will be set to prevent any errors by executing a user script
# which assumes that his LESSOPEN has been executed.
local LESSCLOSE=""
LESS="$LESS" LESSOPEN="$LESSOPEN" LESSCLOSE="$LESSCLOSE" command less "$@"
}
if [ -t 0 ]; then
_cless "$@"
else
# The input is not associated with a terminal, therefore colorize_cat will
# colorize this input and pass it to less.
# Less has now to decide what to use. If any files have been provided, less
# will ignore the input by default, otherwise the colorized input will be used.
# If files have been supplied and the input has been redirected, this will
# lead to unnecessary overhead, but retains the ability to use the less options
# without checking for them inside this script.
colorize_cat | _cless "$@"
fi
}

View File

@ -0,0 +1,34 @@
# command-not-found plugin
This plugin uses the command-not-found package for zsh to provide suggested packages to be installed if a command cannot be found.
To use it, add `command-not-found` to the plugins array of your zshrc file:
```zsh
plugins=(... command-not-found)
```
An example of how this plugin works in Ubuntu:
```
$ mutt
The program 'mutt' can be found in the following packages:
* mutt
* mutt-kz
* mutt-patched
Try: sudo apt install <selected package>
```
### Supported platforms
It works out of the box with the command-not-found packages for:
- [Ubuntu](https://www.porcheron.info/command-not-found-for-zsh/)
- [Debian](https://packages.debian.org/search?keywords=command-not-found)
- [Arch Linux](https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found)
- [macOS (Homebrew)](https://github.com/Homebrew/homebrew-command-not-found)
- [Fedora](https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound)
- [NixOS](https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found)
- [Termux](https://github.com/termux/command-not-found)
- [SUSE](https://www.unix.com/man-page/suse/1/command-not-found/)
You can add support for other platforms by submitting a Pull Request.

View File

@ -0,0 +1,70 @@
## Platforms with a built-in command-not-found handler init file
for file (
# Arch Linux. Must have pkgfile installed: https://wiki.archlinux.org/index.php/Pkgfile#Command_not_found
/usr/share/doc/pkgfile/command-not-found.zsh
# Homebrew: https://github.com/Homebrew/homebrew-command-not-found
/opt/homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
/usr/local/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
/home/linuxbrew/.linuxbrew/Homebrew/Library/Taps/homebrew/homebrew-command-not-found/handler.sh
); do
if [[ -r "$file" ]]; then
source "$file"
unset file
return 0
fi
done
unset file
## Platforms with manual command_not_found_handler() setup
# Debian and derivatives: https://launchpad.net/ubuntu/+source/command-not-found
if [[ -x /usr/lib/command-not-found || -x /usr/share/command-not-found/command-not-found ]]; then
command_not_found_handler() {
if [[ -x /usr/lib/command-not-found ]]; then
/usr/lib/command-not-found -- "$1"
return $?
elif [[ -x /usr/share/command-not-found/command-not-found ]]; then
/usr/share/command-not-found/command-not-found -- "$1"
return $?
else
printf "zsh: command not found: %s\n" "$1" >&2
return 127
fi
}
fi
# Fedora: https://fedoraproject.org/wiki/Features/PackageKitCommandNotFound
if [[ -x /usr/libexec/pk-command-not-found ]]; then
command_not_found_handler() {
if [[ -S /var/run/dbus/system_bus_socket && -x /usr/libexec/packagekitd ]]; then
/usr/libexec/pk-command-not-found "$@"
return $?
fi
printf "zsh: command not found: %s\n" "$1" >&2
return 127
}
fi
# NixOS: https://github.com/NixOS/nixpkgs/tree/master/nixos/modules/programs/command-not-found
if [[ -x /run/current-system/sw/bin/command-not-found ]]; then
command_not_found_handler() {
/run/current-system/sw/bin/command-not-found "$@"
}
fi
# Termux: https://github.com/termux/command-not-found
if [[ -x /data/data/com.termux/files/usr/libexec/termux/command-not-found ]]; then
command_not_found_handler() {
/data/data/com.termux/files/usr/libexec/termux/command-not-found "$1"
}
fi
# SUSE and derivates: https://www.unix.com/man-page/suse/1/command-not-found/
if [[ -x /usr/bin/command-not-found ]]; then
command_not_found_handler() {
/usr/bin/command-not-found "$1"
}
fi

View File

@ -0,0 +1,130 @@
# Common Aliases Plugin
This plugin creates helpful shortcut aliases for many commonly used commands.
To use it add `common-aliases` to the plugins array in your zshrc file:
```zsh
plugins=(... common-aliases)
```
## Aliases
### ls command
| Alias | Command | Description |
| ----- | ------------ | --------------------------------------------------------------------------- |
| l | `ls -lFh` | List files as a long list, show size, type, human-readable |
| la | `ls -lAFh` | List almost all files as a long list show size, type, human-readable |
| lr | `ls -tRFh` | List files recursively sorted by date, show type, human-readable |
| lt | `ls -ltFh` | List files as a long list sorted by date, show type, human-readable |
| ll | `ls -l` | List files as a long list |
| ldot | `ls -ld .*` | List dot files as a long list |
| lS | `ls -1FSsh` | List files showing only size and name sorted by size |
| lart | `ls -1Fcart` | List all files sorted in reverse of create/modification time (oldest first) |
| lrt | `ls -1Fcrt` | List files sorted in reverse of create/modification time(oldest first) |
| lsr | `ls -lARFh` | List all files and directories recursively |
| lsn | `ls -1` | List files and directories in a single column |
### File handling
| Alias | Command | Description |
| ----- | --------------------- | ------------------------------------------------------------------------------- |
| rm | `rm -i` | Remove a file |
| cp | `cp -i` | Copy a file |
| mv | `mv -i` | Move a file |
| zshrc | `${=EDITOR} ~/.zshrc` | Quickly access the ~/.zshrc file |
| dud | `du -d 1 -h` | Display the size of files at depth 1 in current location in human-readable form |
| duf\* | `du -sh` | Display the size of files in current location in human-readable form |
| t | `tail -f` | Shorthand for tail which outputs the last part of a file |
\* Only if the [`duf`](https://github.com/muesli/duf) command isn't installed.
### find and grep
| Alias | Command | Description |
| ----- | -------------------------------------------------- | ------------------------------------ |
| fd\* | `find . -type d -name` | Find a directory with the given name |
| ff | `find . -type f -name` | Find a file with the given name |
| grep | `grep --color` | Searches for a query string |
| sgrep | `grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS}` | Useful for searching within files |
\* Only if the [`fd`](https://github.com/sharkdp/fd) command isn't installed.
### Other Aliases
| Alias | Command | Description |
| -------- | ------------------ | ----------------------------------------------------------- |
| h | `history` | Lists all recently used commands |
| hgrep | `fc -El 0 \| grep` | Searches for a word in the list of previously used commands |
| help | `man` | Opens up the man page for a command |
| p | `ps -f` | Displays currently executing processes |
| sortnr | `sort -n -r` | Used to sort the lines of a text file |
| unexport | `unset` | Used to unset an environment variable |
## Global aliases
These aliases are expanded in any position in the command line, meaning you can use them even at the
end of the command you've typed. Examples:
Quickly pipe to less:
```zsh
$ ls -l /var/log L
# will run
$ ls -l /var/log | less
```
Silences stderr output:
```zsh
$ find . -type f NE
# will run
$ find . -type f 2>/dev/null
```
| Alias | Command | Description |
| ----- | --------------------------- | ----------------------------------------------------------- |
| H | `\| head` | Pipes output to head which outputs the first part of a file |
| T | `\| tail` | Pipes output to tail which outputs the last part of a file |
| G | `\| grep` | Pipes output to grep to search for some word |
| L | `\| less` | Pipes output to less, useful for paging |
| M | `\| most` | Pipes output to more, useful for paging |
| LL | `2>&1 \| less` | Writes stderr to stdout and passes it to less |
| CA | `2>&1 \| cat -A` | Writes stderr to stdout and passes it to cat |
| NE | `2 > /dev/null` | Silences stderr |
| NUL | `> /dev/null 2>&1` | Silences both stdout and stderr |
| P | `2>&1\| pygmentize -l pytb` | Writes stderr to stdout and passes it to pygmentize |
## File extension aliases
These are special aliases that are triggered when a file name is passed as the command. For example,
if the pdf file extension is aliased to `acroread` (a popular Linux pdf reader), when running `file.pdf`
that file will be open with `acroread`.
### Reading Docs
| Alias | Command | Description |
| ----- | ---------- | ---------------------------------- |
| pdf | `acroread` | Opens up a document using acroread |
| ps | `gv` | Opens up a .ps file using gv |
| dvi | `xdvi` | Opens up a .dvi file using xdvi |
| chm | `xchm` | Opens up a .chm file using xchm |
| djvu | `djview` | Opens up a .djvu file using djview |
### Listing files inside a packed file
| Alias | Command | Description |
| ------ | ---------- | --------------------------------- |
| zip | `unzip -l` | Lists files inside a .zip file |
| rar | `unrar l` | Lists files inside a .rar file |
| tar | `tar tf` | Lists files inside a .tar file |
| tar.gz | `echo` | Lists files inside a .tar.gz file |
| ace | `unace l` | Lists files inside a .ace file |
### Some other features
- Opens urls in terminal using browser specified by the variable `$BROWSER`
- Opens C, C++, Tex and text files using editor specified by the variable `$EDITOR`
- Opens images using image viewer specified by the variable `$XIVIEWER`
- Opens videos and other media using mplayer

View File

@ -0,0 +1,90 @@
# Advanced Aliases.
# Use with caution
#
# ls, the common ones I use a lot shortened for rapid fire usage
alias l='ls -lFh' #size,show type,human readable
alias la='ls -lAFh' #long list,show almost all,show type,human readable
alias lr='ls -tRFh' #sorted by date,recursive,show type,human readable
alias lt='ls -ltFh' #long list,sorted by date,show type,human readable
alias ll='ls -l' #long list
alias ldot='ls -ld .*'
alias lS='ls -1FSsh'
alias lart='ls -1Fcart'
alias lrt='ls -1Fcrt'
alias lsr='ls -lARFh' #Recursive list of files and directories
alias lsn='ls -1' #A column contains name of files and directories
alias zshrc='${=EDITOR} ${ZDOTDIR:-$HOME}/.zshrc' # Quick access to the .zshrc file
alias grep='grep --color'
alias sgrep='grep -R -n -H -C 5 --exclude-dir={.git,.svn,CVS} '
alias t='tail -f'
# Command line head / tail shortcuts
alias -g H='| head'
alias -g T='| tail'
alias -g G='| grep'
alias -g L="| less"
alias -g M="| most"
alias -g LL="2>&1 | less"
alias -g CA="2>&1 | cat -A"
alias -g NE="2> /dev/null"
alias -g NUL="> /dev/null 2>&1"
alias -g P="2>&1| pygmentize -l pytb"
alias dud='du -d 1 -h'
(( $+commands[duf] )) || alias duf='du -sh *'
(( $+commands[fd] )) || alias fd='find . -type d -name'
alias ff='find . -type f -name'
alias h='history'
alias hgrep="fc -El 0 | grep"
alias help='man'
alias p='ps -f'
alias sortnr='sort -n -r'
alias unexport='unset'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
# zsh is able to auto-do some kungfoo
# depends on the SUFFIX :)
autoload -Uz is-at-least
if is-at-least 4.2.0; then
# open browser on urls
if [[ -n "$BROWSER" ]]; then
_browser_fts=(htm html de org net com at cx nl se dk)
for ft in $_browser_fts; do alias -s $ft='$BROWSER'; done
fi
_editor_fts=(cpp cxx cc c hh h inl asc txt TXT tex)
for ft in $_editor_fts; do alias -s $ft='$EDITOR'; done
if [[ -n "$XIVIEWER" ]]; then
_image_fts=(jpg jpeg png gif mng tiff tif xpm)
for ft in $_image_fts; do alias -s $ft='$XIVIEWER'; done
fi
_media_fts=(ape avi flv m4a mkv mov mp3 mpeg mpg ogg ogm rm wav webm)
for ft in $_media_fts; do alias -s $ft=mplayer; done
#read documents
alias -s pdf=acroread
alias -s ps=gv
alias -s dvi=xdvi
alias -s chm=xchm
alias -s djvu=djview
#list whats inside packed file
alias -s zip="unzip -l"
alias -s rar="unrar l"
alias -s tar="tar tf"
alias -s tar.gz="echo "
alias -s ace="unace l"
fi
# Make zsh know about hosts already accessed by SSH
zstyle -e ':completion:*:(ssh|scp|sftp|rsh|rsync):hosts' hosts 'reply=(${=${${(f)"$(cat {/etc/ssh_,~/.ssh/known_}hosts(|2)(N) /dev/null)"}%%[# ]*}//,/ })'

View File

@ -0,0 +1,9 @@
# compleat plugin
This plugin looks for [compleat](https://github.com/mbrubeck/compleat) and loads its completion.
To use it, add compleat to the plugins array in your zshrc file:
```zsh
plugins=(... compleat)
```

View File

@ -0,0 +1,20 @@
# ------------------------------------------------------------------------------
# FILE: compleat.plugin.zsh
# DESCRIPTION: oh-my-zsh plugin file.
# AUTHOR: Sorin Ionescu (sorin.ionescu@gmail.com)
# VERSION: 1.0.0
# ------------------------------------------------------------------------------
if (( ${+commands[compleat]} )); then
local prefix="${commands[compleat]:h:h}"
local setup="${prefix}/share/compleat-1.0/compleat_setup"
if [[ -f "$setup" ]]; then
if ! bashcompinit >/dev/null 2>&1; then
autoload -U bashcompinit
bashcompinit -i
fi
source "$setup"
fi
fi

View File

@ -0,0 +1,35 @@
# composer
This plugin provides completion for [composer](https://getcomposer.org/), as well as aliases
for frequent composer commands. It also adds Composer's global binaries to the PATH, using
Composer if available.
To use it add `composer` to the plugins array in your zshrc file.
```zsh
plugins=(... composer)
```
Original author: Daniel Gomes <me@danielcsgomes.com>
## Aliases
| Alias | Command | Description |
| ------ | ---------------------------------- | --------------------------------------------------------------------------------------- |
| `c` | `composer` | Starts composer |
| `ccp` | `composer create-project` | Create new project from an existing package |
| `cdo` | `composer dump-autoload -o` | Converts PSR-0/4 autoloading to classmap for a faster autoloader (good for production) |
| `cdu` | `composer dump-autoload` | Updates the autoloader |
| `cget` | `curl -s <installer> \| php` | Installs composer in the current directory |
| `cgr` | `composer global require` | Allows require command to run on COMPOSER_HOME directory |
| `cgrm` | `composer global remove` | Allows remove command to run on COMPOSER_HOME directory |
| `cgu` | `composer global update` | Allows update command to run on COMPOSER_HOME directory |
| `ci` | `composer install` | Resolves and installs dependencies from `composer.json` |
| `co` | `composer outdated` | Shows a list of installed packages with available updates |
| `cod` | `composer outdated --direct` | Shows a list of installed packages with available updates which are direct dependencies |
| `cr` | `composer require` | Adds new packages to `composer.json` |
| `crm` | `composer remove` | Removes packages from `composer.json` |
| `cs` | `composer show` | Lists available packages, with optional filtering |
| `csu` | `composer self-update` | Updates composer to the latest version |
| `cu` | `composer update` | Updates composer dependencies and `composer.lock` file |
| `cuh` | `composer update -d <config-home>` | Updates globally installed packages |

View File

@ -0,0 +1,76 @@
## Basic Composer command completion
# Since Zsh 5.7, an improved composer command completion is provided
if ! is-at-least 5.7; then
_composer () {
local curcontext="$curcontext" state line
typeset -A opt_args
_arguments '*:: :->subcmds'
if (( CURRENT == 1 )) || ( (( CURRENT == 2 )) && [[ "$words[1]" = "global" ]] ); then
# Command list
local -a subcmds
subcmds=("${(@f)"$($_comp_command1 --no-ansi 2>/dev/null | awk '
/Available commands/{ r=1 }
r == 1 && /^[ \t]*[a-z]+/{
gsub(/^[ \t]+/, "")
gsub(/ +/, ":")
print $0
}
')"}")
_describe -t commands 'composer command' subcmds
else
# Required list
compadd $($_comp_command1 show -s --no-ansi 2>/dev/null \
| sed '1,/requires/d' \
| awk 'NF > 0 && !/^requires \(dev\)/{ print $1 }')
fi
}
compdef _composer composer
compdef _composer composer.phar
fi
## Aliases
alias c='composer'
alias ccp='composer create-project'
alias cdo='composer dump-autoload -o'
alias cdu='composer dump-autoload'
alias cget='curl -s https://getcomposer.org/installer | php'
alias cgr='composer global require'
alias cgrm='composer global remove'
alias cgu='composer global update'
alias ci='composer install'
alias co='composer outdated'
alias cod='composer outdated --direct'
alias cr='composer require'
alias crm='composer remove'
alias cs='composer show'
alias csu='composer self-update'
alias cu='composer update'
alias cuh='composer update --working-dir=$(composer config -g home)'
## If Composer not found, try to add known directories to $PATH
if (( ! $+commands[composer] )); then
[[ -d "$HOME/.composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.composer/vendor/bin"
[[ -d "$HOME/.config/composer/vendor/bin" ]] && export PATH="$PATH:$HOME/.config/composer/vendor/bin"
# If still not found, don't do the rest of the script
(( $+commands[composer] )) || return 0
fi
## Add Composer's global binaries to PATH
autoload -Uz _store_cache _retrieve_cache _cache_invalid
_retrieve_cache composer
if [[ -z $__composer_bin_dir ]]; then
__composer_bin_dir=$(composer global config bin-dir --absolute 2>/dev/null)
_store_cache composer __composer_bin_dir
fi
# Add Composer's global binaries to PATH
export PATH="$PATH:$__composer_bin_dir"
unset __composer_bin_dir

View File

@ -0,0 +1,11 @@
# `copybuffer` plugin
This plugin adds the <kbd>ctrl-o</kbd> keyboard shortcut to copy the current text
in the command line to the system clipboard.
This is useful if you type a command - and before you hit enter to execute it - want
to copy it maybe so you can paste it into a script, gist or whatnot.
```zsh
plugins=(... copybuffer)
```

View File

@ -0,0 +1,16 @@
# copy the active line from the command line buffer
# onto the system clipboard
copybuffer () {
if which clipcopy &>/dev/null; then
printf "%s" "$BUFFER" | clipcopy
else
zle -M "clipcopy not found. Please make sure you have Oh My Zsh installed correctly."
fi
}
zle -N copybuffer
bindkey -M emacs "^O" copybuffer
bindkey -M viins "^O" copybuffer
bindkey -M vicmd "^O" copybuffer

View File

@ -0,0 +1,11 @@
# copyfile plugin
Puts the contents of a file in your system clipboard so you can paste it anywhere.
To use, add `copyfile` to your plugins array:
```zsh
plugins=(... copyfile)
```
Then you can run the command `copyfile <filename>` to copy the file named `filename`.

View File

@ -0,0 +1,7 @@
# Copies the contents of a given file to the system or X Windows clipboard
#
# copyfile <file>
function copyfile {
emulate -L zsh
clipcopy $1
}

View File

@ -0,0 +1,15 @@
# copypath plugin
Copies the path of given directory or file to the system clipboard.
To use it, add `copypath` to the plugins array in your zshrc file:
```zsh
plugins=(... copypath)
```
## Usage
- `copypath`: copies the absolute path of the current directory.
- `copypath <file_or_directory>`: copies the absolute path of the given file.

View File

@ -0,0 +1,15 @@
# Copies the path of given directory or file to the system or X Windows clipboard.
# Copy current directory if no parameter.
function copypath {
# If no argument passed, use current directory
local file="${1:-.}"
# If argument is not an absolute path, prepend $PWD
[[ $file = /* ]] || file="$PWD/$file"
# Copy the absolute path without resolving symlinks
# If clipcopy fails, exit the function with an error
print -n "${file:a}" | clipcopy || return 1
echo ${(%):-"%B${file:a}%b copied to clipboard."}
}

View File

@ -0,0 +1,32 @@
# cp plugin
This plugin defines a `cpv` function that uses `rsync` so that you
get the features and security of this command.
To enable, add `cp` to your `plugins` array in your zshrc file:
```zsh
plugins=(... cp)
```
## Description
The enabled options for rsync are:
- `-p`: preserves permissions.
- `-o`: preserves owner.
* `-g`: preserves group.
* `-b`: make a backup of the original file instead of overwriting it, if it exists.
* `-r`: recurse directories.
* `-hhh`: outputs numbers in human-readable format, in units of 1024 (K, M, G, T).
* `--backup-dir="/tmp/rsync-$USERNAME"`: move backup copies to "/tmp/rsync-$USERNAME".
* `-e /dev/null`: only work on local files (disable remote shells).
* `--progress`: display progress.

View File

@ -0,0 +1,4 @@
cpv() {
rsync -pogbr -hhh --backup-dir="/tmp/rsync-${USERNAME}" -e /dev/null --progress "$@"
}
compdef _files cpv

View File

@ -0,0 +1,9 @@
# Cpanm
This plugin provides completion for [Cpanm](https://github.com/miyagawa/cpanminus) ([docs](https://metacpan.org/pod/App::cpanminus)).
To use it add cpanm to the plugins array in your zshrc file.
```zsh
plugins=(... cpanm)
```

View File

@ -0,0 +1,64 @@
#compdef cpanm
##
# cpanminus Z Shell completion script
##
#
# Current supported cpanm version: 1.4000 (Tue Mar 8 01:00:49 PST 2011)
#
local arguments curcontext="$curcontext"
typeset -A opt_args
arguments=(
# Commands
# '(--install -i)'{--install,-i}'[Installs the modules]'
'(- :)--self-upgrade[Upgrades itself]'
'(- :)--info[Displays distribution info on CPAN]'
'(--installdeps)--installdeps[Only install dependencies]'
'(--look)--look[Download/unpack the distribution and then open the directory with your shell]'
'(- :)'{--help,-h}'[Displays help information]'
'(- :)'{--version,-V}'[Displays software version]'
# Options
{--force,-f}'[Force install]'
{--notest,-n}'[Do not run unit tests]'
{--sudo,-S}'[sudo to run install commands]'
'(-v --verbose --quiet -q)'{--verbose,-v}'[Turns on chatty output]'
'(-q --quiet --verbose -v)'{--quiet,-q}'[Turns off all output]'
{--local-lib,-l}'[Specify the install base to install modules]'
{--local-lib-contained,-L}'[Specify the install base to install all non-core modules]'
'--mirror[Specify the base URL for the mirror (e.g. http://cpan.cpantesters.org/)]:URLs:_urls'
'--mirror-only[Use the mirror\''s index file instead of the CPAN Meta DB]'
'--prompt[Prompt when configure/build/test fails]'
'--reinstall[Reinstall the distribution even if you already have the latest version installed]'
'--interactive[Turn on interactive configure]'
'--scandeps[Scan the dependencies of given modules and output the tree in a text format]'
'--format[Specify what format to display the scanned dependency tree]:scandeps format:(tree json yaml dists)'
'--save-dists[Specify the optional directory path to copy downloaded tarballs]'
# '--uninst-shadows[Uninstalls the shadow files of the distribution that you\''re installing]'
'--auto-cleanup[Number of days that cpanm\''s work directories expire in. Defaults to 7]'
'(--no-man-pages)--man-pages[Generates man pages for executables (man1) and libraries (man3)]'
'(--man-pages)--no-man-pages[Do not generate man pages]'
# Note: Normally with "--lwp", "--wget" and "--curl" options set to true (which is the default) cpanm tries LWP,
# Wget, cURL and HTTP::Tiny (in that order) and uses the first one available.
# (So that the exclusions are not enabled here for the completion)
'(--lwp)--lwp[Use LWP module to download stuff]'
'(--wget)--wget[Use GNU Wget (if available) to download stuff]'
'(--curl)--curl[Use cURL (if available) to download stuff]'
# Other completions
'*:Local directory or archive:_files -/ -g "*.(tar.gz|tgz|tar.bz2|zip)(-.)"'
# '*::args: _normal' # this looks for default files (any files)
)
_arguments -s $arguments \
&& return 0
return 1

View File

@ -0,0 +1,28 @@
# Dash plugin
This plugin adds command line functionality for [Dash](https://kapeli.com/dash),
an API Documentation Browser for macOS. This plugin requires Dash to be installed
to work.
To use it, add `dash` to the plugins array in your zshrc file:
```zsh
plugins=(... dash)
```
## Usage
- Open and switch to the dash application.
```
dash
```
- Query for something in dash app: `dash query`
```
dash golang
```
- You can optionally provide a keyword: `dash [keyword:]query`
```
dash python:tuple
```

View File

@ -0,0 +1,84 @@
# Usage: dash [keyword:]query
dash() { open -a Dash.app dash://"$*" }
compdef _dash dash
_dash() {
# No sense doing this for anything except the 2nd position and if we haven't
# specified which docset to query against
if [[ $CURRENT -ne 2 || "$words[2]" =~ ":" ]]; then
return
fi
local -aU docsets
docsets=()
# Use defaults to get the array of docsets from preferences
# Have to smash it into one big line so that each docset is an element of our docsets array
# Only output docsets that are actually enabled
local -a enabled_docsets
enabled_docsets=("${(@f)$(defaults read com.kapeli.dashdoc docsets \
| tr -d '\n' | grep -oE '\{.*?\}' | grep -E 'isEnabled = 1;')}")
local docset name keyword
# Now get each docset and output each on their own line
for docset in "$enabled_docsets[@]"; do
keyword=''
# Order of preference as explained to me by @kapeli via email
for locator in keyword suggestedKeyword platform; do
# Echo the docset, try to find the appropriate keyword
# Strip doublequotes and colon from any keyword so that everything has the
# same format when output (we'll add the colon in the completion)
if [[ "$docset" =~ "$locator = ([^;]*);" ]]; then
keyword="${match[1]//[\":]}"
fi
if [[ -z "$keyword" ]]; then
continue
fi
# if we fall back to platform, we should do some checking per @kapeli
if [[ "$locator" == "platform" ]]; then
# Since these are the only special cases right now, let's not do the
# expensive processing unless we have to
if [[ "$keyword" = (python|java|qt|cocos2d) ]]; then
if [[ "$docset" =~ "docsetName = ([^;]*);" ]]; then
name="${match[1]//[\":]}"
case "$keyword" in
python)
case "$name" in
"Python 2") keyword="python2" ;;
"Python 3") keyword="python3" ;;
esac ;;
java)
case "$name" in
"Java SE7") keyword="java7" ;;
"Java SE6") keyword="java6" ;;
"Java SE8") keyword="java8" ;;
esac ;;
qt)
case "$name" in
"Qt 5") keyword="qt5" ;;
"Qt 4"|Qt) keyword="qt4" ;;
esac ;;
cocos2d)
case "$name" in
Cocos3D) keyword="cocos3d" ;;
esac ;;
esac
fi
fi
fi
# Bail once we have a match
break
done
# If we have a keyword, add it to the list!
if [[ -n "$keyword" ]]; then
docsets+=($keyword)
fi
done
# special thanks to [arx] on #zsh for getting me sorted on this piece
compadd -qS: -- "$docsets[@]"
}

View File

@ -0,0 +1,29 @@
# dbt plugin
## Introduction
The `dbt plugin` adds several aliases for useful [dbt](https://docs.getdbt.com/) commands and
[aliases](#aliases).
To use it, add `dbt` to the plugins array of your zshrc file:
```
plugins=(... dbt)
```
## Aliases
| Alias | Command | Description |
| ------ | ------------------------------------------------ | ---------------------------------------------------- |
| dbtlm | `dbt ls -s state:modified` | List modified models only |
| dbtrm | `dbt run -s state:modified` | Run modified models only |
| dbttm | `dbt test -m state:modified` | Test modified models only |
| dbtrtm | `dbtrm && dbttm` | Run and test modified models only |
| dbtrs | `dbt clean; dbt deps; dbt seed` | Re-seed data |
| dbtfrt | `dbtrs; dbt run --full-refresh; dbt test` | Perform a full fresh run with tests |
| dbtcds | `dbt docs generate; dbt docs serve` | Generate docs without compiling |
| dbtds | `dbt docs generate --no-compile; dbt docs serve` | Generate and serve docs skipping doc. re-compilation |
## Maintainer
### [msempere](https://github.com/msempere)

View File

@ -0,0 +1,23 @@
# list modified models only
alias dbtlm="dbt ls -s state:modified"
# run modified models only
alias dbtrm="dbt run -s state:modified"
# test modified models only
alias dbttm="dbt test -m state:modified"
# run and test modified models only
alias dbtrtm="dbtrm && dbttm"
# re-seed data
alias dbtrs="dbt clean; dbt deps; dbt seed"
# perform a full fresh run with tests
alias dbtfrt="dbtrs; dbt run --full-refresh; dbt test"
# generate and serve docs
alias dbtcds="dbt docs generate; dbt docs serve"
# generate and serve docs skipping doc. re-compilation
alias dbtds="dbt docs generate --no-compile; dbt docs serve"

View File

@ -0,0 +1,92 @@
# debian
This plugin provides Debian-related aliases and functions for zsh.
To use it add `debian` to the plugins array in your zshrc file.
```zsh
plugins=(... debian)
```
## Settings
- `$apt_pref`: use aptitude or apt if installed, fallback is apt-get.
- `$apt_upgr`: use upgrade or safe-upgrade (for aptitude).
Set **both** `$apt_pref` and `$apt_upgr` to whatever command you want (before sourcing Oh My Zsh) to override this behavior, e.g.:
```sh
apt_pref='apt'
apt_upgr='full-upgrade'
```
## Common Aliases
| Alias | Command | Description |
| ------ | ---------------------------------------------------------------------- | ---------------------------------------------------------- |
| `age` | `apt-get` | Command line tool for handling packages |
| `api` | `aptitude` | Same functionality as `apt-get`, provides extra options |
| `acs` | `apt-cache search` | Command line tool for searching apt software package cache |
| `aps` | `aptitude search` | Searches installed packages using aptitude |
| `as` | `aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search` | Print searched packages using a custom format |
| `afs` | `apt-file search --regexp` | Search file in packages |
| `asrc` | `apt-get source` | Fetch source packages through `apt-get` |
| `app` | `apt-cache policy` | Displays priority of package sources |
## Superuser Operations Aliases
| Alias | Command | Description |
| -------- | ------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |
| `aac` | `sudo $apt_pref autoclean` | Clears out the local repository of retrieved package files |
| `aar` | `sudo $apt_pref autoremove` | Removes packages installed automatically that are no longer needed |
| `abd` | `sudo $apt_pref build-dep` | Installs all dependencies for building packages |
| `ac` | `sudo $apt_pref clean` | Clears out the local repository of retrieved package files except lock files |
| `ad` | `sudo $apt_pref update` | Updates the package lists for upgrades for packages |
| `adg` | `sudo $apt_pref update && sudo $apt_pref $apt_upgr` | Update and upgrade packages |
| `ads` | `sudo apt-get dselect-upgrade` | Installs packages from list and removes all not in the list |
| `adu` | `sudo $apt_pref update && sudo $apt_pref dist-upgrade` | Smart upgrade that handles dependencies |
| `afu` | `sudo apt-file update` | Update the files in packages |
| `ai` | `sudo $apt_pref install` | Command-line tool to install package |
| `ail` | `sed -e 's/ */ /g' -e 's/ *//' \| cut -s -d ' ' -f 1 \| xargs sudo $apt_pref install` | Install all packages given on the command line while using only the first word of each line |
| `alu` | `sudo apt update && apt list -u && sudo apt upgrade` | Update, list and upgrade packages |
| `ap` | `sudo $apt_pref purge` | Removes packages along with configuration files |
| `au` | `sudo $apt_pref $apt_upgr` | Install package upgrades |
| `di` | `sudo dpkg -i` | Install all .deb files in the current directory |
| `dia` | `sudo dpkg -i ./*.deb` | Install all .deb files in the current directory |
| `kclean` | `sudo aptitude remove -P ?and(~i~nlinux-(ima\|hea) ?not(~n$(uname -r)))` | Remove ALL kernel images and headers EXCEPT the one in use |
## Aliases - Commands using `su`
| Alias | Command |
| ----- | --------------------------------------------------------- |
| `aac` | `su -ls "$apt_pref autoclean" root` |
| `aar` | `su -ls "$apt_pref autoremove" root` |
| `ac` | `su -ls "$apt_pref clean" root` |
| `ad` | `su -lc "$apt_pref update" root` |
| `adg` | `su -lc "$apt_pref update && aptitude $apt_upgr" root` |
| `adu` | `su -lc "$apt_pref update && aptitude dist-upgrade" root` |
| `afu` | `su -lc "apt-file update"` |
| `au` | `su -lc "$apt_pref $apt_upgr" root` |
| `dia` | `su -lc "dpkg -i ./*.deb" root` |
## Miscellaneous Aliases
| Alias | Command | Description |
| --------- | ---------------------------------------------- | ------------------------------ |
| `allpkgs` | `aptitude search -F "%p" --disable-columns ~i` | Display all installed packages |
| `mydeb` | `time dpkg-buildpackage -rfakeroot -us -uc` | Create a basic .deb package |
## Functions
| Function | Description |
| ------------------- | --------------------------------------------------------------- |
| `apt-copy` | Create a simple script that can be used to 'duplicate' a system |
| `apt-history` | Displays apt history for a command |
| `apt-list-packages` | List packages by size |
| `kerndeb` | Builds kernel packages |
## Authors
- [@AlexBio](https://github.com/AlexBio)
- [@dbb](https://github.com/dbb)
- [@Mappleconfusers](https://github.com/Mappleconfusers)

View File

@ -0,0 +1,227 @@
# Use aptitude or apt if installed, fallback is apt-get
# You can just set apt_pref='apt-get' to override it.
if [[ -z $apt_pref || -z $apt_upgr ]]; then
if [[ -e $commands[aptitude] ]]; then
apt_pref='aptitude'
apt_upgr='safe-upgrade'
elif [[ -e $commands[apt] ]]; then
apt_pref='apt'
apt_upgr='upgrade'
else
apt_pref='apt-get'
apt_upgr='upgrade'
fi
fi
# Use sudo by default if it's installed
if [[ -e $commands[sudo] ]]; then
use_sudo=1
fi
# Aliases ###################################################################
# These are for more obscure uses of apt-get and aptitude that aren't covered
# below.
alias age='apt-get'
alias api='aptitude'
# Some self-explanatory aliases
alias acs="apt-cache search"
alias aps='aptitude search'
alias as="aptitude -F '* %p -> %d \n(%v/%V)' --no-gui --disable-columns search"
# apt-file
alias afs='apt-file search --regexp'
# These are apt-get only
alias asrc='apt-get source'
alias app='apt-cache policy'
# superuser operations ######################################################
if [[ $use_sudo -eq 1 ]]; then
# commands using sudo #######
alias aac="sudo $apt_pref autoclean"
alias abd="sudo $apt_pref build-dep"
alias ac="sudo $apt_pref clean"
alias ad="sudo $apt_pref update"
alias adg="sudo $apt_pref update && sudo $apt_pref $apt_upgr"
alias adu="sudo $apt_pref update && sudo $apt_pref dist-upgrade"
alias afu="sudo apt-file update"
alias au="sudo $apt_pref $apt_upgr"
alias ai="sudo $apt_pref install"
# Install all packages given on the command line while using only the first word of each line:
# acse ... | ail
alias ail="sed -e 's/ */ /g' -e 's/ *//' | cut -s -d ' ' -f 1 | xargs sudo $apt_pref install"
alias ap="sudo $apt_pref purge"
alias aar="sudo $apt_pref autoremove"
# apt-get only
alias ads="sudo apt-get dselect-upgrade"
# apt only
alias alu="sudo apt update && apt list -u && sudo apt upgrade"
# Install all .deb files in the current directory.
# Warning: you will need to put the glob in single quotes if you use:
# glob_subst
alias dia="sudo dpkg -i ./*.deb"
alias di="sudo dpkg -i"
# Remove ALL kernel images and headers EXCEPT the one in use
alias kclean='sudo aptitude remove -P "?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))"'
# commands using su #########
else
alias aac="su -ls '$apt_pref autoclean' root"
function abd() {
cmd="su -lc '$apt_pref build-dep $@' root"
print "$cmd"
eval "$cmd"
}
alias ac="su -ls '$apt_pref clean' root"
alias ad="su -lc '$apt_pref update' root"
alias adg="su -lc '$apt_pref update && aptitude $apt_upgr' root"
alias adu="su -lc '$apt_pref update && aptitude dist-upgrade' root"
alias afu="su -lc '$apt-file update'"
alias au="su -lc '$apt_pref $apt_upgr' root"
function ai() {
cmd="su -lc '$apt_pref install $@' root"
print "$cmd"
eval "$cmd"
}
function ap() {
cmd="su -lc '$apt_pref purge $@' root"
print "$cmd"
eval "$cmd"
}
function aar() {
cmd="su -lc '$apt_pref autoremove $@' root"
print "$cmd"
eval "$cmd"
}
# Install all .deb files in the current directory
# Assumes glob_subst is off
alias dia='su -lc "dpkg -i ./*.deb" root'
alias di='su -lc "dpkg -i" root'
# Remove ALL kernel images and headers EXCEPT the one in use
alias kclean='su -lc "aptitude remove -P \"?and(~i~nlinux-(ima|hea) ?not(~n$(uname -r)))\"" root'
fi
# Completion ################################################################
#
# Registers a compdef for $1 that calls $apt_pref with the commands $2
# To do that it creates a new completion function called _apt_pref_$2
#
function apt_pref_compdef() {
local f fb
f="_apt_pref_${2}"
eval "function ${f}() {
shift words;
service=\"\$apt_pref\";
words=(\"\$apt_pref\" '$2' \$words);
((CURRENT++))
test \"\${apt_pref}\" = 'aptitude' && _aptitude || _apt
}"
compdef "$f" "$1"
}
apt_pref_compdef aac "autoclean"
apt_pref_compdef abd "build-dep"
apt_pref_compdef ac "clean"
apt_pref_compdef ad "update"
apt_pref_compdef afu "update"
apt_pref_compdef au "$apt_upgr"
apt_pref_compdef ai "install"
apt_pref_compdef ail "install"
apt_pref_compdef ap "purge"
apt_pref_compdef aar "autoremove"
apt_pref_compdef ads "dselect-upgrade"
# Misc. #####################################################################
# print all installed packages
alias allpkgs='aptitude search -F "%p" --disable-columns ~i'
# Create a basic .deb package
alias mydeb='time dpkg-buildpackage -rfakeroot -us -uc'
# Functions #################################################################
# create a simple script that can be used to 'duplicate' a system
function apt-copy() {
print '#!/bin/sh'"\n" > apt-copy.sh
cmd='$apt_pref install'
for p in ${(f)"$(aptitude search -F "%p" --disable-columns \~i)"}; {
cmd="${cmd} ${p}"
}
print $cmd "\n" >> apt-copy.sh
chmod +x apt-copy.sh
}
# Prints apt history
# Usage:
# apt-history install
# apt-history upgrade
# apt-history remove
# apt-history rollback
# apt-history list
# Based On: https://linuxcommando.blogspot.com/2008/08/how-to-show-apt-log-history.html
function apt-history() {
case "$1" in
install)
zgrep --no-filename 'install ' $(ls -rt /var/log/dpkg*)
;;
upgrade|remove)
zgrep --no-filename $1 $(ls -rt /var/log/dpkg*)
;;
rollback)
zgrep --no-filename upgrade $(ls -rt /var/log/dpkg*) | \
grep "$2" -A10000000 | \
grep "$3" -B10000000 | \
awk '{print $4"="$5}'
;;
list)
zgrep --no-filename '' $(ls -rt /var/log/dpkg*)
;;
*)
echo "Parameters:"
echo " install - Lists all packages that have been installed."
echo " upgrade - Lists all packages that have been upgraded."
echo " remove - Lists all packages that have been removed."
echo " rollback - Lists rollback information."
echo " list - Lists all contains of dpkg logs."
;;
esac
}
# Kernel-package building shortcut
function kerndeb() {
# temporarily unset MAKEFLAGS ( '-j3' will fail )
MAKEFLAGS=$( print - $MAKEFLAGS | perl -pe 's/-j\s*[\d]+//g' )
print '$MAKEFLAGS set to '"'$MAKEFLAGS'"
appendage='-custom' # this shows up in $(uname -r )
revision=$(date +"%Y%m%d") # this shows up in the .deb file name
make-kpkg clean
time fakeroot make-kpkg --append-to-version "$appendage" --revision \
"$revision" kernel_image kernel_headers
}
# List packages by size
function apt-list-packages() {
dpkg-query -W --showformat='${Installed-Size} ${Package} ${Status}\n' | \
grep -v deinstall | \
sort -n | \
awk '{print $1" "$2}'
}

View File

@ -0,0 +1,20 @@
# Deno Plugin
This plugin sets up completion and aliases for [Deno](https://deno.land).
## Aliases
| Alias | Full command |
| ----- | ------------------- |
| db | deno bundle |
| dc | deno compile |
| dca | deno cache |
| dfmt | deno fmt |
| dh | deno help |
| dli | deno lint |
| drn | deno run |
| drA | deno run -A |
| drw | deno run --watch |
| dru | deno run --unstable |
| dts | deno test |
| dup | deno upgrade |

View File

@ -0,0 +1,28 @@
# ALIASES
alias db='deno bundle'
alias dc='deno compile'
alias dca='deno cache'
alias dfmt='deno fmt'
alias dh='deno help'
alias dli='deno lint'
alias drn='deno run'
alias drA='deno run -A'
alias drw='deno run --watch'
alias dru='deno run --unstable'
alias dts='deno test'
alias dup='deno upgrade'
# COMPLETION FUNCTION
if (( ! $+commands[deno] )); then
return
fi
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `deno`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_deno" ]]; then
typeset -g -A _comps
autoload -Uz _deno
_comps[deno]=_deno
fi
deno completions zsh >| "$ZSH_CACHE_DIR/completions/_deno" &|

View File

@ -0,0 +1,78 @@
# dircycle
Plugin for cycling through the directory stack
This plugin enables directory navigation similar to using back and forward on browsers or common file explorers like Finder or Nautilus. It uses a small zle trick that lets you cycle through your directory stack left or right using <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> / <kbd>Right</kbd> . This is useful when moving back and forth between directories in development environments, and can be thought of as kind of a nondestructive pushd/popd.
## Enabling the plugin
1. Open your `.zshrc` file and add `dircycle` in the plugins section:
```zsh
plugins=(
# all your enabled plugins
dircycle
)
```
2. Restart the shell or restart your Terminal session:
```console
$ exec zsh
$
```
## Usage Examples
Say you opened these directories on the terminal:
```console
~$ cd Projects
~/Projects$ cd Hacktoberfest
~/Projects/Hacktoberfest$ cd oh-my-zsh
~/Projects/Hacktoberfest/oh-my-zsh$ dirs -v
0 ~/Projects/Hacktoberfest/oh-my-zsh
1 ~/Projects/Hacktoberfest
2 ~/Projects
3 ~
```
By pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd>, the current working directory or `$CWD` will be from `oh-my-zsh` to `Hacktoberfest`. Press it again and it will be at `Projects`.
And by pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd>, the `$CWD` will be from `Projects` to `Hacktoberfest`. Press it again and it will be at `oh-my-zsh`.
Here's a example history table with the same accessed directories like above:
| Current `$CWD` | Key press | New `$CWD` |
| --------------- | ----------------------------------------------------- | --------------- |
| `oh-my-zsh` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `Hacktoberfest` |
| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `Projects` |
| `Projects` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> | `~` |
| `~` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Projects` |
| `Projects` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `Hacktoberfest` |
| `Hacktoberfest` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `oh-my-zsh` |
| `oh-my-zsh` | <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> | `~` |
Note the last traversal, when pressing <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> on a last known `$CWD`, it will change back to the first known `$CWD`, which in the example is `~`.
Here's an asciinema cast demonstrating the example above:
[![asciicast](https://asciinema.org/a/204406.png)](https://asciinema.org/a/204406)
## Functions
| Function | Description |
| -------------------- | --------------------------------------------------------------------------------------------------------- |
| `insert-cycledleft` | Change `$CWD` to the previous known stack, binded on <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> |
| `insert-cycledright` | Change `$CWD` to the next known stack, binded on <kbd>Ctrl</kbd> + <kbd>Shift</kbd> + <kbd>Right</kbd> |
## Rebinding keys
You can bind these functions to other key sequences, as long as you know the bindkey sequence. For example, these commands bind to <kbd>Alt</kbd> + <kbd>Shift</kbd> + <kbd>Left</kbd> / <kbd>Right</kbd> in `xterm-256color`:
```zsh
bindkey '^[[1;4D' insert-cycledleft
bindkey '^[[1;4C' insert-cycledright
```
You can get the bindkey sequence by pressing <kbd>Ctrl</kbd> + <kbd>V</kbd>, then pressing the keyboard shortcut you want to use.

View File

@ -0,0 +1,54 @@
# enables cycling through the directory stack using
# Ctrl+Shift+Left/Right
#
# left/right direction follows the order in which directories
# were visited, like left/right arrows do in a browser
# NO_PUSHD_MINUS syntax:
# pushd +N: start counting from left of `dirs' output
# pushd -N: start counting from right of `dirs' output
switch-to-dir () {
setopt localoptions nopushdminus
[[ ${#dirstack} -eq 0 ]] && return 1
while ! builtin pushd -q $1 &>/dev/null; do
# We found a missing directory: pop it out of the dir stack
builtin popd -q $1
# Stop trying if there are no more directories in the dir stack
[[ ${#dirstack} -eq 0 ]] && return 1
done
}
insert-cycledleft () {
switch-to-dir +1 || return
local fn
for fn (chpwd $chpwd_functions precmd $precmd_functions); do
(( $+functions[$fn] )) && $fn
done
zle reset-prompt
}
zle -N insert-cycledleft
insert-cycledright () {
switch-to-dir -0 || return
local fn
for fn (chpwd $chpwd_functions precmd $precmd_functions); do
(( $+functions[$fn] )) && $fn
done
zle reset-prompt
}
zle -N insert-cycledright
# These sequences work for xterm, Apple Terminal.app, and probably others.
# Not for rxvt-unicode, but it doesn't seem differentiate Ctrl-Shift-Arrow
# from plain Shift-Arrow, at least by default.
# iTerm2 does not have these key combinations defined by default; you will need
# to add them under "Keys" in your profile if you want to use this. You can do
# this conveniently by loading the "xterm with Numeric Keypad" preset.
bindkey "\e[1;6D" insert-cycledleft
bindkey "\e[1;6C" insert-cycledright

View File

@ -0,0 +1,15 @@
# direnv plugin
This plugin creates the [Direnv](https://direnv.net/) hook.
To use it, add `direnv` to the plugins array in your zshrc file:
```zsh
plugins=(... direnv)
```
## Requirements
In order to make this work, you will need to have the direnv installed.
More info on the usage and install: https://github.com/direnv/direnv

View File

@ -0,0 +1,16 @@
# Don't continue if direnv is not found
command -v direnv &>/dev/null || return
_direnv_hook() {
trap -- '' SIGINT;
eval "$(direnv export zsh)";
trap - SIGINT;
}
typeset -ag precmd_functions;
if [[ -z "${precmd_functions[(r)_direnv_hook]+1}" ]]; then
precmd_functions=( _direnv_hook ${precmd_functions[@]} )
fi
typeset -ag chpwd_functions;
if [[ -z "${chpwd_functions[(r)_direnv_hook]+1}" ]]; then
chpwd_functions=( _direnv_hook ${chpwd_functions[@]} )
fi

View File

@ -0,0 +1,62 @@
# Dirhistory plugin
This plugin adds keyboard shortcuts for navigating directory history and hierarchy.
To use it, add `dirhistory` to the plugins array in your zshrc file:
```zsh
plugins=(... dirhistory)
```
## Keyboard Shortcuts
| Shortcut | Description |
|-----------------------------------|-----------------------------------------------------------|
| <kbd>Alt</kbd> + <kbd>Left</kbd> | Go to previous directory |
| <kbd>Alt</kbd> + <kbd>Right</kbd> | Go to next directory |
| <kbd>Alt</kbd> + <kbd>Up</kbd> | Move into the parent directory |
| <kbd>Alt</kbd> + <kbd>Down</kbd> | Move into the first child directory by alphabetical order |
**For macOS: use the Option key (<kbd></kbd>) instead of <kbd>Alt</kbd>**.
> NOTE: some terminals might override the <kbd>Alt</kbd> + Arrows key bindings (e.g. Windows Terminal).
> If these don't work check your terminal settings and change them to a different keyboard shortcut.
## Usage
This plugin allows you to navigate the history of previous working directories using <kbd>Alt</kbd> + <kbd>Left</kbd>
and <kbd>Alt</kbd> + <kbd>Right</kbd>. <kbd>Alt</kbd> + <kbd>Left</kbd> moves to past directories, and
<kbd>Alt</kbd> + <kbd>Right</kbd> goes back to recent directories.
**NOTE: the maximum directory history size is 30.**
You can also navigate **directory hierarchies** using <kbd>Alt</kbd> + <kbd>Up</kbd> and <kbd>Alt</kbd> + <kbd>Down</kbd>.
<kbd>Alt</kbd> + <kbd>Up</kbd> moves to the parent directory, while <kbd>Alt</kbd> + <kbd>Down</kbd> moves into the first
child directory found in alphabetical order (useful to navigate long empty directories, e.g. Java packages).
For example, if the shell was started, and the following commands were entered:
```shell
cd ~
cd /usr
cd share
cd doc
```
the directory stack (`dirs -v`) would look like this:
```console
$ dirs -v
0 /usr/share/doc
1 /usr/share
2 /usr
3 ~
```
then entering <kbd>Alt</kbd> + <kbd>Left</kbd> at the prompt would change directory from `/usr/share/doc` to `/usr/share`,
then if pressed again to `/usr`, then `~`. If <kbd>Alt</kbd> + <kbd>Right</kbd> were pressed the directory would be changed
to `/usr` again.
After that, <kbd>Alt</kbd> + <kbd>Down</kbd> will probably go to `/usr/bin` if `bin` is the first directory in alphabetical
order (depends on your `/usr` folder structure). <kbd>Alt</kbd> + <kbd>Up</kbd> will return to `/usr`, and once more will get
you to the root folder (`/`).

View File

@ -0,0 +1,225 @@
##
# Navigate directory history using ALT-LEFT and ALT-RIGHT. ALT-LEFT moves back to directories
# that the user has changed to in the past, and ALT-RIGHT undoes ALT-LEFT.
#
# Navigate directory hierarchy using ALT-UP and ALT-DOWN.
# ALT-UP moves to higher hierarchy (cd ..)
# ALT-DOWN moves into the first directory found in alphabetical order
#
dirhistory_past=($PWD)
dirhistory_future=()
export dirhistory_past
export dirhistory_future
export DIRHISTORY_SIZE=30
# Pop the last element of dirhistory_past.
# Pass the name of the variable to return the result in.
# Returns the element if the array was not empty,
# otherwise returns empty string.
function pop_past() {
setopt localoptions no_ksh_arrays
if [[ $#dirhistory_past -gt 0 ]]; then
typeset -g $1="${dirhistory_past[$#dirhistory_past]}"
dirhistory_past[$#dirhistory_past]=()
fi
}
function pop_future() {
setopt localoptions no_ksh_arrays
if [[ $#dirhistory_future -gt 0 ]]; then
typeset -g $1="${dirhistory_future[$#dirhistory_future]}"
dirhistory_future[$#dirhistory_future]=()
fi
}
# Push a new element onto the end of dirhistory_past. If the size of the array
# is >= DIRHISTORY_SIZE, the array is shifted
function push_past() {
setopt localoptions no_ksh_arrays
if [[ $#dirhistory_past -ge $DIRHISTORY_SIZE ]]; then
shift dirhistory_past
fi
if [[ $#dirhistory_past -eq 0 || $dirhistory_past[$#dirhistory_past] != "$1" ]]; then
dirhistory_past+=($1)
fi
}
function push_future() {
setopt localoptions no_ksh_arrays
if [[ $#dirhistory_future -ge $DIRHISTORY_SIZE ]]; then
shift dirhistory_future
fi
if [[ $#dirhistory_future -eq 0 || $dirhistory_futuret[$#dirhistory_future] != "$1" ]]; then
dirhistory_future+=($1)
fi
}
# Called by zsh when directory changes
autoload -U add-zsh-hook
add-zsh-hook chpwd chpwd_dirhistory
function chpwd_dirhistory() {
push_past $PWD
# If DIRHISTORY_CD is not set...
if [[ -z "${DIRHISTORY_CD+x}" ]]; then
# ... clear future.
dirhistory_future=()
fi
}
function dirhistory_cd(){
DIRHISTORY_CD="1"
cd $1
unset DIRHISTORY_CD
}
# Move backward in directory history
function dirhistory_back() {
local cw=""
local d=""
# Last element in dirhistory_past is the cwd.
pop_past cw
if [[ "" == "$cw" ]]; then
# Someone overwrote our variable. Recover it.
dirhistory_past=($PWD)
return
fi
pop_past d
if [[ "" != "$d" ]]; then
dirhistory_cd $d
push_future $cw
else
push_past $cw
fi
}
# Move forward in directory history
function dirhistory_forward() {
local d=""
pop_future d
if [[ "" != "$d" ]]; then
dirhistory_cd $d
push_past $d
fi
}
# Bind keys to history navigation
function dirhistory_zle_dirhistory_back() {
# Erase current line in buffer
zle .kill-buffer
dirhistory_back
zle .accept-line
}
function dirhistory_zle_dirhistory_future() {
# Erase current line in buffer
zle .kill-buffer
dirhistory_forward
zle .accept-line
}
zle -N dirhistory_zle_dirhistory_back
zle -N dirhistory_zle_dirhistory_future
for keymap in emacs vicmd viins; do
# dirhistory_back
bindkey -M $keymap "\e[3D" dirhistory_zle_dirhistory_back # xterm in normal mode
bindkey -M $keymap "\e[1;3D" dirhistory_zle_dirhistory_back # xterm in normal mode
bindkey -M $keymap "\e\e[D" dirhistory_zle_dirhistory_back # Putty
bindkey -M $keymap "\eO3D" dirhistory_zle_dirhistory_back # GNU screen
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[b" dirhistory_zle_dirhistory_back ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[D" dirhistory_zle_dirhistory_back ;; # iTerm2
esac
if (( ${+terminfo[kcub1]} )); then
bindkey -M $keymap "^[${terminfo[kcub1]}" dirhistory_zle_dirhistory_back # urxvt
fi
# dirhistory_future
bindkey -M $keymap "\e[3C" dirhistory_zle_dirhistory_future # xterm in normal mode
bindkey -M $keymap "\e[1;3C" dirhistory_zle_dirhistory_future # xterm in normal mode
bindkey -M $keymap "\e\e[C" dirhistory_zle_dirhistory_future # Putty
bindkey -M $keymap "\eO3C" dirhistory_zle_dirhistory_future # GNU screen
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[f" dirhistory_zle_dirhistory_future ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[C" dirhistory_zle_dirhistory_future ;; # iTerm2
esac
if (( ${+terminfo[kcuf1]} )); then
bindkey -M $keymap "^[${terminfo[kcuf1]}" dirhistory_zle_dirhistory_future # urxvt
fi
done
#
# HIERARCHY Implemented in this section, in case someone wants to split it to another plugin if it clashes bindings
#
# Move up in hierarchy
function dirhistory_up() {
cd .. || return 1
}
# Move down in hierarchy
function dirhistory_down() {
cd "$(find . -mindepth 1 -maxdepth 1 -type d | sort -n | head -n 1)" || return 1
}
# Bind keys to hierarchy navigation
function dirhistory_zle_dirhistory_up() {
zle .kill-buffer # Erase current line in buffer
dirhistory_up
zle .accept-line
}
function dirhistory_zle_dirhistory_down() {
zle .kill-buffer # Erase current line in buffer
dirhistory_down
zle .accept-line
}
zle -N dirhistory_zle_dirhistory_up
zle -N dirhistory_zle_dirhistory_down
for keymap in emacs vicmd viins; do
# dirhistory_up
bindkey -M $keymap "\e[3A" dirhistory_zle_dirhistory_up # xterm in normal mode
bindkey -M $keymap "\e[1;3A" dirhistory_zle_dirhistory_up # xterm in normal mode
bindkey -M $keymap "\e\e[A" dirhistory_zle_dirhistory_up # Putty
bindkey -M $keymap "\eO3A" dirhistory_zle_dirhistory_up # GNU screen
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[[A" dirhistory_zle_dirhistory_up ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[A" dirhistory_zle_dirhistory_up ;; # iTerm2
esac
if (( ${+terminfo[kcuu1]} )); then
bindkey -M $keymap "^[${terminfo[kcuu1]}" dirhistory_zle_dirhistory_up # urxvt
fi
# dirhistory_down
bindkey -M $keymap "\e[3B" dirhistory_zle_dirhistory_down # xterm in normal mode
bindkey -M $keymap "\e[1;3B" dirhistory_zle_dirhistory_down # xterm in normal mode
bindkey -M $keymap "\e\e[B" dirhistory_zle_dirhistory_down # Putty
bindkey -M $keymap "\eO3B" dirhistory_zle_dirhistory_down # GNU screen
case "$TERM_PROGRAM" in
Apple_Terminal) bindkey -M $keymap "^[[B" dirhistory_zle_dirhistory_down ;; # Terminal.app
iTerm.app) bindkey -M $keymap "^[^[[B" dirhistory_zle_dirhistory_down ;; # iTerm2
esac
if (( ${+terminfo[kcud1]} )); then
bindkey -M $keymap "^[${terminfo[kcud1]}" dirhistory_zle_dirhistory_down # urxvt
fi
done
unset keymap

View File

@ -0,0 +1,10 @@
# Dirpersist plugin
This plugin keeps a running tally of the previous 20 unique directories in the `$HOME/.zdirs` file.
When you cd to a new directory, it is prepended to the beginning of the file.
To use it, add `dirpersist` to the plugins array in your zshrc file:
```zsh
plugins=(... dirpersist)
```

View File

@ -0,0 +1,21 @@
# Save dirstack history to .zdirs
# adapted from:
# github.com/grml/grml-etc-core/blob/master/etc/zsh/zshrc#L1547
DIRSTACKSIZE=${DIRSTACKSIZE:-20}
dirstack_file=${dirstack_file:-${HOME}/.zdirs}
if [[ -f ${dirstack_file} ]] && [[ ${#dirstack[*]} -eq 0 ]] ; then
dirstack=( ${(f)"$(< $dirstack_file)"} )
# "cd -" won't work after login by just setting $OLDPWD, so
[[ -d $dirstack[1] ]] && cd $dirstack[1] && cd $OLDPWD
fi
autoload -U add-zsh-hook
add-zsh-hook chpwd chpwd_dirpersist
chpwd_dirpersist() {
if (( $DIRSTACKSIZE <= 0 )) || [[ -z $dirstack_file ]]; then return; fi
local -ax my_stack
my_stack=( ${PWD} ${dirstack} )
builtin print -l ${(u)my_stack} >! ${dirstack_file}
}

View File

@ -0,0 +1,32 @@
# dnf plugin
This plugin makes `dnf` usage easier by adding aliases for the most common commands.
`dnf` is the new package manager for RPM-based distributions, which replaces `yum`.
To use it, add `dnf` to the plugins array in your zshrc file:
```zsh
plugins=(... dnf)
```
Classic `dnf` is getting superseded by `dnf5`; this plugin detects the presence
of `dnf5` and uses it as drop-in alternative to the slower `dnf`.
## Aliases
| Alias | Command | Description |
|-------|-------------------------|--------------------------|
| dnfl | `dnf list` | List packages |
| dnfli | `dnf list installed` | List installed packages |
| dnfgl | `dnf grouplist` | List package groups |
| dnfmc | `dnf makecache` | Generate metadata cache |
| dnfp | `dnf info` | Show package information |
| dnfs | `dnf search` | Search package |
| **Use `sudo`** |
| dnfu | `sudo dnf upgrade` | Upgrade package |
| dnfi | `sudo dnf install` | Install package |
| dnfgi | `sudo dnf groupinstall` | Install package group |
| dnfr | `sudo dnf remove` | Remove package |
| dnfgr | `sudo dnf groupremove` | Remove package group |
| dnfc | `sudo dnf clean all` | Clean cache |

View File

@ -0,0 +1,19 @@
## Aliases
local dnfprog="dnf"
# Prefer dnf5 if installed
command -v dnf5 > /dev/null && dnfprog=dnf5
alias dnfl="${dnfprog} list" # List packages
alias dnfli="${dnfprog} list installed" # List installed packages
alias dnfgl="${dnfprog} grouplist" # List package groups
alias dnfmc="${dnfprog} makecache" # Generate metadata cache
alias dnfp="${dnfprog} info" # Show package information
alias dnfs="${dnfprog} search" # Search package
alias dnfu="sudo ${dnfprog} upgrade" # Upgrade package
alias dnfi="sudo ${dnfprog} install" # Install package
alias dnfgi="sudo ${dnfprog} groupinstall" # Install package group
alias dnfr="sudo ${dnfprog} remove" # Remove package
alias dnfgr="sudo ${dnfprog} groupremove" # Remove package group
alias dnfc="sudo ${dnfprog} clean all" # Clean cache

View File

@ -0,0 +1,51 @@
# Dnote Plugin
This plugin adds auto-completion for [Dnote](https://www.getdnote.com/), a simple command line notebook.
To use it, add `dnote` to the plugins array in your zshrc file:
```zsh
plugins=(dnote)
```
## Usage
At the basic level, this plugin completes all Dnote commands.
```zsh
$ dnote a(press <TAB> here)
```
would result in:
```zsh
$ dnote add
```
For some commands, this plugin dynamically suggests matching book names.
For instance, if you have three books that begin with 'j': 'javascript', 'job', 'js',
```zsh
$ dnote view j(press <TAB> here)
```
would result in:
```zsh
$ dnote v j
javascript job js
```
As another example,
```zsh
$ dnote edit ja(press <TAB> here)
```
would result in:
```zsh
$ dnote v javascript
``````

View File

@ -0,0 +1,39 @@
#compdef dnote
local -a _1st_arguments
_1st_arguments=(
'add:add a new note'
'view:list books, notes, or view a content'
'edit:edit a note or a book'
'remove:remove a note or a book'
'find:find notes by keywords'
'sync:sync data with the server'
'login:login to the dnote server'
'logout:logout from the dnote server'
'version:print the current version'
'help:get help about any command'
)
get_booknames() {
local names=$(dnote view --name-only)
local -a ret
while read -r line; do
ret+=("${line}")
done <<< "$names"
echo "$ret"
}
if (( CURRENT == 2 )); then
_describe -t commands "dnote subcommand" _1st_arguments
return
elif (( CURRENT == 3 )); then
case "$words[2]" in
v|view|a|add)
_alternative \
"names:book names:($(get_booknames))"
esac
fi

View File

@ -0,0 +1,34 @@
# Docker-compose
This plugin provides completion for [docker-compose](https://docs.docker.com/compose/) as well as some
aliases for frequent docker-compose commands.
To use it, add docker-compose to the plugins array of your zshrc file:
```zsh
plugins=(... docker-compose)
```
## Aliases
| Alias | Command | Description |
|-----------|----------------------------------|----------------------------------------------------------------------------------|
| dco | `docker-compose` | Docker-compose main command |
| dcb | `docker-compose build` | Build containers |
| dce | `docker-compose exec` | Execute command inside a container |
| dcps | `docker-compose ps` | List containers |
| dcrestart | `docker-compose restart` | Restart container |
| dcrm | `docker-compose rm` | Remove container |
| dcr | `docker-compose run` | Run a command in container |
| dcstop | `docker-compose stop` | Stop a container |
| dcup | `docker-compose up` | Build, (re)create, start, and attach to containers for a service |
| dcupb | `docker-compose up --build` | Same as `dcup`, but build images before starting containers |
| dcupd | `docker-compose up -d` | Same as `dcup`, but starts as daemon |
| dcupdb | `docker-compose up -d --build` | Same as `dcup`, but build images before starting containers and starts as daemon |
| dcdn | `docker-compose down` | Stop and remove containers |
| dcl | `docker-compose logs` | Show logs of container |
| dclf | `docker-compose logs -f` | Show logs and follow output |
| dclF | `docker-compose logs -f --tail0` | Just follow recent logs |
| dcpull | `docker-compose pull` | Pull image of a service |
| dcstart | `docker-compose start` | Start a container |
| dck | `docker-compose kill` | Kills containers |

View File

@ -0,0 +1,421 @@
#compdef docker-compose
# Description
# -----------
# zsh completion for docker-compose
# -------------------------------------------------------------------------
# Authors
# -------
# * Steve Durrheimer <s.durrheimer@gmail.com>
# -------------------------------------------------------------------------
# Inspiration
# -----------
# * @albers docker-compose bash completion script
# * @felixr docker zsh completion script : https://github.com/felixr/docker-zsh-completion
# -------------------------------------------------------------------------
__docker-compose_q() {
docker-compose 2>/dev/null $compose_options "$@"
}
# All services defined in docker-compose.yml
__docker-compose_all_services_in_compose_file() {
local already_selected
local -a services
already_selected=$(echo $words | tr " " "|")
__docker-compose_q ps --services "$@" \
| grep -Ev "^(${already_selected})$"
}
# All services, even those without an existing container
__docker-compose_services_all() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
services=$(__docker-compose_all_services_in_compose_file "$@")
_alternative "args:services:($services)" && ret=0
return ret
}
# All services that are defined by a Dockerfile reference
__docker-compose_services_from_build() {
[[ $PREFIX = -* ]] && return 1
__docker-compose_services_all --filter source=build
}
# All services that are defined by an image
__docker-compose_services_from_image() {
[[ $PREFIX = -* ]] && return 1
__docker-compose_services_all --filter source=image
}
__docker-compose_pausedservices() {
[[ $PREFIX = -* ]] && return 1
__docker-compose_services_all --filter status=paused
}
__docker-compose_stoppedservices() {
[[ $PREFIX = -* ]] && return 1
__docker-compose_services_all --filter status=stopped
}
__docker-compose_runningservices() {
[[ $PREFIX = -* ]] && return 1
__docker-compose_services_all --filter status=running
}
__docker-compose_services() {
[[ $PREFIX = -* ]] && return 1
__docker-compose_services_all
}
__docker-compose_caching_policy() {
oldp=( "$1"(Nmh+1) ) # 1 hour
(( $#oldp ))
}
__docker-compose_commands() {
local cache_policy
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
if [[ -z "$cache_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy __docker-compose_caching_policy
fi
if ( [[ ${+_docker_compose_subcommands} -eq 0 ]] || _cache_invalid docker_compose_subcommands) \
&& ! _retrieve_cache docker_compose_subcommands;
then
local -a lines
lines=(${(f)"$(_call_program commands docker-compose 2>&1)"})
_docker_compose_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/ ##/:})
(( $#_docker_compose_subcommands > 0 )) && _store_cache docker_compose_subcommands _docker_compose_subcommands
fi
_describe -t docker-compose-commands "docker-compose command" _docker_compose_subcommands
}
__docker-compose_subcommand() {
local opts_help opts_force_recreate opts_no_recreate opts_no_build opts_remove_orphans opts_timeout opts_no_color opts_no_deps
opts_help='(: -)--help[Print usage]'
opts_force_recreate="(--no-recreate)--force-recreate[Recreate containers even if their configuration and image haven't changed. Incompatible with --no-recreate.]"
opts_no_recreate="(--force-recreate)--no-recreate[If containers already exist, don't recreate them. Incompatible with --force-recreate.]"
opts_no_build="(--build)--no-build[Don't build an image, even if it's missing.]"
opts_remove_orphans="--remove-orphans[Remove containers for services not defined in the Compose file]"
opts_timeout=('(-t --timeout)'{-t,--timeout}"[Specify a shutdown timeout in seconds. (default: 10)]:seconds: ")
opts_no_color='--no-color[Produce monochrome output.]'
opts_no_deps="--no-deps[Don't start linked services.]"
integer ret=1
case "$words[1]" in
(build)
_arguments \
$opts_help \
"*--build-arg=[Set build-time variables for one service.]:<varname>=<value>: " \
'--force-rm[Always remove intermediate containers.]' \
'(--quiet -q)'{--quiet,-q}'[Curb build output]' \
'(--memory -m)'{--memory,-m}'[Memory limit for the build container.]' \
'--no-cache[Do not use cache when building the image.]' \
'--pull[Always attempt to pull a newer version of the image.]' \
'--compress[Compress the build context using gzip.]' \
'--parallel[Build images in parallel.]' \
'*:services:__docker-compose_services_from_build' && ret=0
;;
(config)
_arguments \
$opts_help \
'(--quiet -q)'{--quiet,-q}"[Only validate the configuration, don't print anything.]" \
'--resolve-image-digests[Pin image tags to digests.]' \
'--services[Print the service names, one per line.]' \
'--volumes[Print the volume names, one per line.]' \
'--hash[Print the service config hash, one per line. Set "service1,service2" for a list of specified services.]' \ && ret=0
;;
(create)
_arguments \
$opts_help \
$opts_force_recreate \
$opts_no_recreate \
$opts_no_build \
"(--no-build)--build[Build images before creating containers.]" \
'*:services:__docker-compose_services' && ret=0
;;
(down)
_arguments \
$opts_help \
$opts_timeout \
"--rmi[Remove images. Type must be one of: 'all': Remove all images used by any service. 'local': Remove only images that don't have a custom tag set by the \`image\` field.]:type:(all local)" \
'(-v --volumes)'{-v,--volumes}"[Remove named volumes declared in the \`volumes\` section of the Compose file and anonymous volumes attached to containers.]" \
$opts_remove_orphans && ret=0
;;
(events)
_arguments \
$opts_help \
'--json[Output events as a stream of json objects]' \
'*:services:__docker-compose_services' && ret=0
;;
(exec)
_arguments \
$opts_help \
'-d[Detached mode: Run command in the background.]' \
'--privileged[Give extended privileges to the process.]' \
'(-u --user)'{-u,--user=}'[Run the command as this user.]:username:_users' \
'-T[Disable pseudo-tty allocation. By default `docker-compose exec` allocates a TTY.]' \
'--index=[Index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \
'*'{-e,--env}'[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \
'(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \
'(-):running services:__docker-compose_runningservices' \
'(-):command: _command_names -e' \
'*::arguments: _normal' && ret=0
;;
(help)
_arguments ':subcommand:__docker-compose_commands' && ret=0
;;
(images)
_arguments \
$opts_help \
'-q[Only display IDs]' \
'*:services:__docker-compose_services' && ret=0
;;
(kill)
_arguments \
$opts_help \
'-s[SIGNAL to send to the container. Default signal is SIGKILL.]:signal:_signals' \
'*:running services:__docker-compose_runningservices' && ret=0
;;
(logs)
_arguments \
$opts_help \
'(-f --follow)'{-f,--follow}'[Follow log output]' \
$opts_no_color \
'--tail=[Number of lines to show from the end of the logs for each container.]:number of lines: ' \
'(-t --timestamps)'{-t,--timestamps}'[Show timestamps]' \
'*:services:__docker-compose_services' && ret=0
;;
(pause)
_arguments \
$opts_help \
'*:running services:__docker-compose_runningservices' && ret=0
;;
(port)
_arguments \
$opts_help \
'--protocol=[tcp or udp \[default: tcp\]]:protocol:(tcp udp)' \
'--index=[index of the container if there are multiple instances of a service \[default: 1\]]:index: ' \
'1:running services:__docker-compose_runningservices' \
'2:port:_ports' && ret=0
;;
(ps)
_arguments \
$opts_help \
'-q[Only display IDs]' \
'--filter KEY=VAL[Filter services by a property]:<filtername>=<value>:' \
'*:services:__docker-compose_services' && ret=0
;;
(pull)
_arguments \
$opts_help \
'--ignore-pull-failures[Pull what it can and ignores images with pull failures.]' \
'--no-parallel[Disable parallel pulling]' \
'(-q --quiet)'{-q,--quiet}'[Pull without printing progress information]' \
'--include-deps[Also pull services declared as dependencies]' \
'*:services:__docker-compose_services_from_image' && ret=0
;;
(push)
_arguments \
$opts_help \
'--ignore-push-failures[Push what it can and ignores images with push failures.]' \
'*:services:__docker-compose_services' && ret=0
;;
(rm)
_arguments \
$opts_help \
'(-f --force)'{-f,--force}"[Don't ask to confirm removal]" \
'-v[Remove any anonymous volumes attached to containers]' \
'*:stopped services:__docker-compose_stoppedservices' && ret=0
;;
(run)
_arguments \
$opts_help \
$opts_no_deps \
'-d[Detached mode: Run container in the background, print new container name.]' \
'*-e[KEY=VAL Set an environment variable (can be used multiple times)]:environment variable KEY=VAL: ' \
'*'{-l,--label}'[KEY=VAL Add or override a label (can be used multiple times)]:label KEY=VAL: ' \
'--entrypoint[Overwrite the entrypoint of the image.]:entry point: ' \
'--name=[Assign a name to the container]:name: ' \
'(-p --publish)'{-p,--publish=}"[Publish a container's port(s) to the host]" \
'--rm[Remove container after run. Ignored in detached mode.]' \
"--service-ports[Run command with the service's ports enabled and mapped to the host.]" \
'-T[Disable pseudo-tty allocation. By default `docker-compose run` allocates a TTY.]' \
'(-u --user)'{-u,--user=}'[Run as specified username or uid]:username or uid:_users' \
'(-v --volume)*'{-v,--volume=}'[Bind mount a volume]:volume: ' \
'(-w --workdir)'{-w,--workdir=}'[Working directory inside the container]:workdir: ' \
"--use-aliases[Use the services network aliases in the network(s) the container connects to]" \
'(-):services:__docker-compose_services' \
'(-):command: _command_names -e' \
'*::arguments: _normal' && ret=0
;;
(scale)
_arguments \
$opts_help \
$opts_timeout \
'*:running services:__docker-compose_runningservices' && ret=0
;;
(start)
_arguments \
$opts_help \
'*:stopped services:__docker-compose_stoppedservices' && ret=0
;;
(stop|restart)
_arguments \
$opts_help \
$opts_timeout \
'*:running services:__docker-compose_runningservices' && ret=0
;;
(top)
_arguments \
$opts_help \
'*:running services:__docker-compose_runningservices' && ret=0
;;
(unpause)
_arguments \
$opts_help \
'*:paused services:__docker-compose_pausedservices' && ret=0
;;
(up)
_arguments \
$opts_help \
'(--abort-on-container-exit)-d[Detached mode: Run containers in the background, print new container names. Incompatible with --abort-on-container-exit and --attach-dependencies.]' \
$opts_no_color \
$opts_no_deps \
$opts_force_recreate \
$opts_no_recreate \
$opts_no_build \
"(--no-build)--build[Build images before starting containers.]" \
"(-d)--abort-on-container-exit[Stops all containers if any container was stopped. Incompatible with -d.]" \
"(-d)--attach-dependencies[Attach to dependent containers. Incompatible with -d.]" \
'(-t --timeout)'{-t,--timeout}"[Use this timeout in seconds for container shutdown when attached or when containers are already running. (default: 10)]:seconds: " \
'--scale[SERVICE=NUM Scale SERVICE to NUM instances. Overrides the `scale` setting in the Compose file if present.]:service scale SERVICE=NUM: ' \
'--exit-code-from=[Return the exit code of the selected service container. Implies --abort-on-container-exit]:service:__docker-compose_services' \
$opts_remove_orphans \
'*:services:__docker-compose_services' && ret=0
;;
(version)
_arguments \
$opts_help \
"--short[Shows only Compose's version number.]" && ret=0
;;
(*)
_message 'Unknown sub command' && ret=1
;;
esac
return ret
}
_docker-compose() {
# Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`.
# Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
if [[ $service != docker-compose ]]; then
_call_function - _$service
return
fi
local curcontext="$curcontext" state line
integer ret=1
typeset -A opt_args
local file_description
if [[ -n ${words[(r)-f]} || -n ${words[(r)--file]} ]] ; then
file_description="Specify an override docker-compose file (default: docker-compose.override.yml)"
else
file_description="Specify an alternate docker-compose file (default: docker-compose.yml)"
fi
_arguments -C \
'(- :)'{-h,--help}'[Get help]' \
'*'{-f,--file}"[${file_description}]:file:_files -g '*.yml'" \
'(-p --project-name)'{-p,--project-name}'[Specify an alternate project name (default: directory name)]:project name:' \
'--env-file[Specify an alternate environment file (default: .env)]:env-file:_files' \
"--compatibility[If set, Compose will attempt to convert keys in v3 files to their non-Swarm equivalent]" \
'(- :)'{-v,--version}'[Print version and exit]' \
'--verbose[Show more output]' \
'--log-level=[Set log level]:level:(DEBUG INFO WARNING ERROR CRITICAL)' \
'--no-ansi[Do not print ANSI control characters]' \
'--ansi=[Control when to print ANSI control characters]:when:(never always auto)' \
'(-H --host)'{-H,--host}'[Daemon socket to connect to]:host:' \
'--tls[Use TLS; implied by --tlsverify]' \
'--tlscacert=[Trust certs signed only by this CA]:ca path:' \
'--tlscert=[Path to TLS certificate file]:client cert path:' \
'--tlskey=[Path to TLS key file]:tls key path:' \
'--tlsverify[Use TLS and verify the remote]' \
"--skip-hostname-check[Don't check the daemon's hostname against the name specified in the client certificate (for example if your docker host is an IP address)]" \
'(-): :->command' \
'(-)*:: :->option-or-argument' && ret=0
local -a relevant_compose_flags relevant_compose_repeatable_flags relevant_docker_flags compose_options docker_options
relevant_compose_flags=(
"--env-file"
"--file" "-f"
"--host" "-H"
"--project-name" "-p"
"--tls"
"--tlscacert"
"--tlscert"
"--tlskey"
"--tlsverify"
"--skip-hostname-check"
)
relevant_compose_repeatable_flags=(
"--file" "-f"
)
relevant_docker_flags=(
"--host" "-H"
"--tls"
"--tlscacert"
"--tlscert"
"--tlskey"
"--tlsverify"
)
for k in "${(@k)opt_args}"; do
if [[ -n "${relevant_docker_flags[(r)$k]}" ]]; then
docker_options+=$k
if [[ -n "$opt_args[$k]" ]]; then
docker_options+=$opt_args[$k]
fi
fi
if [[ -n "${relevant_compose_flags[(r)$k]}" ]]; then
if [[ -n "${relevant_compose_repeatable_flags[(r)$k]}" ]]; then
values=("${(@s/:/)opt_args[$k]}")
for value in $values
do
compose_options+=$k
compose_options+=$value
done
else
compose_options+=$k
if [[ -n "$opt_args[$k]" ]]; then
compose_options+=$opt_args[$k]
fi
fi
fi
done
case $state in
(command)
__docker-compose_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-compose-$words[1]:
__docker-compose_subcommand && ret=0
;;
esac
return ret
}
_docker-compose "$@"

View File

@ -0,0 +1,24 @@
# support Compose v2 as docker CLI plugin
(( ${+commands[docker-compose]} )) && dccmd='docker-compose' || dccmd='docker compose'
alias dco="$dccmd"
alias dcb="$dccmd build"
alias dce="$dccmd exec"
alias dcps="$dccmd ps"
alias dcrestart="$dccmd restart"
alias dcrm="$dccmd rm"
alias dcr="$dccmd run"
alias dcstop="$dccmd stop"
alias dcup="$dccmd up"
alias dcupb="$dccmd up --build"
alias dcupd="$dccmd up -d"
alias dcupdb="$dccmd up -d --build"
alias dcdn="$dccmd down"
alias dcl="$dccmd logs"
alias dclf="$dccmd logs -f"
alias dclF="$dccmd logs -f --tail 0"
alias dcpull="$dccmd pull"
alias dcstart="$dccmd start"
alias dck="$dccmd kill"
unset dccmd

View File

@ -0,0 +1,19 @@
# docker-machine plugin for oh my zsh
### Usage
#### docker-vm
Will create a docker-machine with the name "dev" (required only once)
To create a second machine call "docker-vm foobar" or pass any other name
#### docker-up
This will start your "dev" docker-machine (if necessary) and set it as the active one
To start a named machine use "docker-up foobar"
#### docker-switch dev
Use this to activate a running docker-machine (or to switch between multiple machines)
You need to call either this or docker-up when opening a new terminal
#### docker-stop
This will stop your "dev" docker-machine
To stop a named machine use "docker-stop foobar"

View File

@ -0,0 +1,359 @@
#compdef docker-machine
# Description
# -----------
# zsh completion for docker-machine
# https://github.com/leonhartX/docker-machine-zsh-completion
# -------------------------------------------------------------------------
# Version
# -------
# 0.1.1
# -------------------------------------------------------------------------
# Authors
# -------
# * Ke Xu <leonhartx.k@gmail.com>
# -------------------------------------------------------------------------
# Inspiration
# -----------
# * @sdurrheimer docker-compose-zsh-completion https://github.com/sdurrheimer/docker-compose-zsh-completion
# * @ilkka _docker-machine
__docker-machine_get_hosts() {
[[ $PREFIX = -* ]] && return 1
local state
declare -a hosts
state=$1; shift
if [[ $state != all ]]; then
hosts=(${(f)"$(_call_program commands docker-machine ls -q --filter state=$state)"})
else
hosts=(${(f)"$(_call_program commands docker-machine ls -q)"})
fi
_describe 'host' hosts "$@" && ret=0
return ret
}
__docker-machine_hosts_with_state() {
declare -a hosts
hosts=(${(f)"$(_call_program commands docker-machine ls -f '{{.Name}}\:{{.DriverName}}\({{.State}}\)\ {{.URL}}')"})
_describe 'host' hosts
}
__docker-machine_hosts_all() {
__docker-machine_get_hosts all "$@"
}
__docker-machine_hosts_running() {
__docker-machine_get_hosts Running "$@"
}
__docker-machine_get_swarm() {
declare -a swarms
swarms=(${(f)"$(_call_program commands docker-machine ls -f {{.Swarm}} | awk '{print $1}')"})
_describe 'swarm' swarms
}
__docker-machine_hosts_and_files() {
_alternative "hosts:host:__docker-machine_hosts_all -qS ':'" 'files:files:_path_files'
}
__docker-machine_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(driver)
_describe -t driver-filter-opts "driver filter" opts_driver && ret=0
;;
(swarm)
__docker-machine_get_swarm && ret=0
;;
(state)
opts_state=('Running' 'Paused' 'Saved' 'Stopped' 'Stopping' 'Starting' 'Error')
_describe -t state-filter-opts "state filter" opts_state && ret=0
;;
(name)
__docker-machine_hosts_all && ret=0
;;
(label)
_message 'label' && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('driver' 'swarm' 'state' 'name' 'label')
_describe -t filter-opts "filter" opts -qS "=" && ret=0
fi
return ret
}
__get_swarm_discovery() {
declare -a masters services
local service
services=()
masters=($(docker-machine ls -f {{.Swarm}} |grep '(master)' |awk '{print $1}'))
for master in $masters; do
service=${${${(f)"$(_call_program commands docker-machine inspect -f '{{.HostOptions.SwarmOptions.Discovery}}:{{.Name}}' $master)"}/:/\\:}}
services=($services $service)
done
_describe -t services "swarm service" services && ret=0
return ret
}
__get_create_argument() {
typeset -g docker_machine_driver
if [[ CURRENT -le 2 ]]; then
docker_machine_driver="none"
elif [[ CURRENT > 2 && $words[CURRENT-2] = '-d' || $words[CURRENT-2] = '--driver' ]]; then
docker_machine_driver=$words[CURRENT-1]
elif [[ $words[CURRENT-1] =~ '^(-d|--driver)=' ]]; then
docker_machine_driver=${${words[CURRENT-1]}/*=/}
fi
local driver_opt_cmd
local -a opts_provider opts_common opts_read_argument
opts_read_argument=(
": :->argument"
)
opts_common=(
$opts_help \
'(--driver -d)'{--driver=,-d=}'[Driver to create machine with]:dirver:->driver-option' \
'--engine-install-url=[Custom URL to use for engine installation]:url' \
'*--engine-opt=[Specify arbitrary flags to include with the created engine in the form flag=value]:flag' \
'*--engine-insecure-registry=[Specify insecure registries to allow with the created engine]:registry' \
'*--engine-registry-mirror=[Specify registry mirrors to use]:mirror' \
'*--engine-label=[Specify labels for the created engine]:label' \
'--engine-storage-driver=[Specify a storage driver to use with the engine]:storage-driver:->storage-driver-option' \
'*--engine-env=[Specify environment variables to set in the engine]:environment' \
'--swarm[Configure Machine with Swarm]' \
'--swarm-image=[Specify Docker image to use for Swarm]:image' \
'--swarm-master[Configure Machine to be a Swarm master]' \
'--swarm-discovery=[Discovery service to use with Swarm]:service:->swarm-service' \
'--swarm-strategy=[Define a default scheduling strategy for Swarm]:strategy:(spread binpack random)' \
'*--swarm-opt=[Define arbitrary flags for swarm]:flag' \
'*--swarm-join-opt=[Define arbitrary flags for Swarm join]:flag' \
'--swarm-host=[ip/socket to listen on for Swarm master]:host' \
'--swarm-addr=[addr to advertise for Swarm (default: detect and use the machine IP)]:address' \
'--swarm-experimental[Enable Swarm experimental features]' \
'*--tls-san=[Support extra SANs for TLS certs]:option'
)
driver_opt_cmd="docker-machine create -d $docker_machine_driver | grep $docker_machine_driver | sed -e 's/\(--.*\)\ *\[\1[^]]*\]/*\1/g' -e 's/\(\[[^]]*\)/\\\\\\1\\\\/g' -e 's/\".*\"\(.*\)/\1/g' | awk '{printf \"%s[\", \$1; for(i=2;i<=NF;i++) {printf \"%s \", \$i}; print \"]\"}'"
if [[ $docker_machine_driver != "none" ]]; then
opts_provider=(${(f)"$(_call_program commands $driver_opt_cmd)"})
_arguments \
$opts_provider \
$opts_read_argument \
$opts_common && ret=0
else
_arguments $opts_common && ret=0
fi
case $state in
(driver-option)
_describe -t driver-option "driver" opts_driver && ret=0
;;
(storage-driver-option)
_describe -t storage-driver-option "storage driver" opts_storage_driver && ret=0
;;
(swarm-service)
__get_swarm_discovery && ret=0
;;
(argument)
ret=0
;;
esac
return ret
}
__docker-machine_subcommand() {
local -a opts_help
opts_help=("(- :)--help[Print usage]")
local -a opts_only_host opts_driver opts_storage_driver opts_state
opts_only_host=(
"$opts_help"
"*:host:__docker-machine_hosts_all"
)
opts_driver=('amazonec2' 'azure' 'digitalocean' 'exoscale' 'generic' 'google' 'hyperv' 'none' 'openstack' 'rackspace' 'softlayer' 'virtualbox' 'vmwarefusion' 'vmwarevcloudair' 'vmwarevsphere')
opts_storage_driver=('overlay' 'aufs' 'btrfs' 'devicemapper' 'vfs' 'zfs')
integer ret=1
case "$words[1]" in
(active)
_arguments \
$opts_help \
'(--timeout -t)'{--timeout=,-t=}'[Timeout in seconds, default to 10s]:seconds' && ret=0
;;
(config)
_arguments \
$opts_help \
'--swarm[Display the Swarm config instead of the Docker daemon]' \
"*:host:__docker-machine_hosts_all" && ret=0
;;
(create)
__get_create_argument
;;
(env)
_arguments \
$opts_help \
'--swarm[Display the Swarm config instead of the Docker daemon]' \
'--shell=[Force environment to be configured for a specified shell: \[fish, cmd, powershell\], default is auto-detect]:shell' \
'(--unset -u)'{--unset,-u}'[Unset variables instead of setting them]' \
'--no-proxy[Add machine IP to NO_PROXY environment variable]' \
'*:host:__docker-machine_hosts_running' && ret=0
;;
(help)
_arguments ':subcommand:__docker-machine_commands' && ret=0
;;
(inspect)
_arguments \
$opts_help \
'(--format -f)'{--format=,-f=}'[Format the output using the given go template]:template' \
'*:host:__docker-machine_hosts_all' && ret=0
;;
(ip)
_arguments \
$opts_help \
'*:host:__docker-machine_hosts_running' && ret=0
;;
(kill)
_arguments \
$opts_help \
'*:host:__docker-machine_hosts_with_state' && ret=0
;;
(ls)
_arguments \
$opts_help \
'(--quiet -q)'{--quiet,-q}'[Enable quiet mode]' \
'*--filter=[Filter output based on conditions provided]:filter:->filter-options' \
'(--timeout -t)'{--timeout=,-t=}'[Timeout in seconds, default to 10s]:seconds' \
'(--format -f)'{--format=,-f=}'[Pretty-print machines using a Go template]:template' && ret=0
case $state in
(filter-options)
__docker-machine_filters && ret=0
;;
esac
;;
(provision)
_arguments $opts_only_host && ret=0
;;
(regenerate-certs)
_arguments \
$opts_help \
'(--force -f)'{--force,-f}'[Force rebuild and do not prompt]' \
'*:host:__docker-machine_hosts_all' && ret=0
;;
(restart)
_arguments \
$opts_help \
'*:host:__docker-machine_hosts_with_state' && ret=0
;;
(rm)
_arguments \
$opts_help \
'(--force -f)'{--force,-f}'[Remove local configuration even if machine cannot be removed, also implies an automatic yes (`-y`)]' \
'-y[Assumes automatic yes to proceed with remove, without prompting further user confirmation]' \
'*:host:__docker-machine_hosts_with_state' && ret=0
;;
(scp)
_arguments \
$opts_help \
'(--recursive -r)'{--recursive,-r}'[Copy files recursively (required to copy directories))]' \
'*:files:__docker-machine_hosts_and_files' && ret=0
;;
(ssh)
_arguments \
$opts_help \
'*:host:__docker-machine_hosts_running' && ret=0
;;
(start)
_arguments \
$opts_help \
'*:host:__docker-machine_hosts_with_state' && ret=0
;;
(status)
_arguments $opts_only_host && ret=0
;;
(stop)
_arguments \
$opts_help \
'*:host:__docker-machine_hosts_with_state' && ret=0
;;
(upgrade)
_arguments $opts_only_host && ret=0
;;
(url)
_arguments \
$opts_help \
'*:host:__docker-machine_hosts_running' && ret=0
;;
esac
return ret
}
__docker-machine_commands() {
local cache_policy
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
if [[ -z "$cache_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy __docker-machine_caching_policy
fi
if ( [[ ${+_docker_machine_subcommands} -eq 0 ]] || _cache_invalid docker_machine_subcommands) \
&& ! _retrieve_cache docker_machine_subcommands;
then
local -a lines
lines=(${(f)"$(_call_program commands docker-machine 2>&1)"})
_docker_machine_subcommands=(${${${lines[$((${lines[(i)Commands:]} + 1)),${lines[(I) *]}]}## #}/$'\t'##/:})
(( $#_docker_machine_subcommands > 0 )) && _store_cache docker_machine_subcommands _docker_machine_subcommands
fi
_describe -t docker-machine-commands "docker-machine command" _docker_machine_subcommands
}
__docker-machine_caching_policy() {
oldp=( "$1"(Nmh+1) )
(( $#oldp ))
}
_docker-machine() {
if [[ $service != docker-machine ]]; then
_call_function - _$service
return
fi
local curcontext="$curcontext" state line
integer ret=1
typeset -A opt_args
_arguments -C \
"(- :)"{-h,--help}"[Show help]" \
"(-D --debug)"{-D,--debug}"[Enable debug mode]" \
'(-s --storage-path)'{-s,--storage-path}'[Configures storage path]:file:_files' \
'--tls-ca-cert[CA to verify remotes against]:file:_files' \
'--tls-ca-key[Private key to generate certificates]:file:_files' \
'--tls-client-cert[Client cert to use for TLS]:file:_files' \
'--tls-client-key[Private key used in client TLS auth]:file:_files' \
'--github-api-token[Token to use for requests to the GitHub API]' \
'--native-ssh[Use the native (Go-based) SSH implementation.]' \
'--bugsnag-api-token[Bugsnag API token for crash reporting]' \
'(- :)'{-v,--version}'[Print the version]' \
"(-): :->command" \
"(-)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker-machine_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-machine-$words[1]:
__docker-machine_subcommand && ret=0
ret=0
;;
esac
return ret
}
_docker-machine "$@"

View File

@ -0,0 +1,33 @@
DEFAULT_MACHINE="default"
docker-up() {
if [ -z "$1" ]
then
docker-machine start "${DEFAULT_MACHINE}"
eval $(docker-machine env "${DEFAULT_MACHINE}")
else
docker-machine start $1
eval $(docker-machine env $1)
fi
echo $DOCKER_HOST
}
docker-stop() {
if [ -z "$1" ]
then
docker-machine stop "${DEFAULT_MACHINE}"
else
docker-machine stop $1
fi
}
docker-switch() {
eval $(docker-machine env $1)
echo $DOCKER_HOST
}
docker-vm() {
if [ -z "$1" ]
then
docker-machine create -d virtualbox --virtualbox-disk-size 20000 --virtualbox-memory 4096 --virtualbox-cpu-count 2 "${DEFAULT_MACHINE}"
else
docker-machine create -d virtualbox --virtualbox-disk-size 20000 --virtualbox-memory 4096 --virtualbox-cpu-count 2 $1
fi
}

View File

@ -0,0 +1,78 @@
# Docker plugin
This plugin adds auto-completion and aliases for [docker](https://www.docker.com/).
To use it add `docker` to the plugins array in your zshrc file.
```zsh
plugins=(... docker)
```
A copy of the completion script from the docker/cli git repo:
https://github.com/docker/cli/blob/master/contrib/completion/zsh/_docker
## Settings
By default, the completion doesn't allow option-stacking, meaning if you try to complete
`docker run -it <TAB>` it won't work, because you're _stacking_ the `-i` and `-t` options.
[You can enable it](https://github.com/docker/cli/commit/b10fb43048) by **adding the lines below to your zshrc
file**, but be aware of the side effects:
> This enables Zsh to understand commands like `docker run -it ubuntu`. However, by enabling this, this also
> makes Zsh complete `docker run -u<tab>` with `docker run -uapprox` which is not valid. The users have to put
> the space or the equal sign themselves before trying to complete.
>
> Therefore, this behavior is disabled by default. To enable it:
>
> ```sh
> zstyle ':completion:*:*:docker:*' option-stacking yes
> zstyle ':completion:*:*:docker-*:*' option-stacking yes
> ```
### Use old-style completion
If the current completion does not work well for you, you can enable legacy completion instead with the
following setting. See https://github.com/ohmyzsh/ohmyzsh/issues/11789 for more information.
```zsh
zstyle ':omz:plugins:docker' legacy-completion yes
```
## Aliases
| Alias | Command | Description |
| :------ | :---------------------------- | :--------------------------------------------------------------------------------------- |
| dbl | `docker build` | Build an image from a Dockerfile |
| dcin | `docker container inspect` | Display detailed information on one or more containers |
| dcls | `docker container ls` | List all the running docker containers |
| dclsa | `docker container ls -a` | List all running and stopped containers |
| dib | `docker image build` | Build an image from a Dockerfile (same as docker build) |
| dii | `docker image inspect` | Display detailed information on one or more images |
| dils | `docker image ls` | List docker images |
| dipu | `docker image push` | Push an image or repository to a remote registry |
| dirm | `docker image rm` | Remove one or more images |
| dit | `docker image tag` | Add a name and tag to a particular image |
| dlo | `docker container logs` | Fetch the logs of a docker container |
| dnc | `docker network create` | Create a new network |
| dncn | `docker network connect` | Connect a container to a network |
| dndcn | `docker network disconnect` | Disconnect a container from a network |
| dni | `docker network inspect` | Return information about one or more networks |
| dnls | `docker network ls` | List all networks the engine daemon knows about, including those spanning multiple hosts |
| dnrm | `docker network rm` | Remove one or more networks |
| dpo | `docker container port` | List port mappings or a specific mapping for the container |
| dpu | `docker pull` | Pull an image or a repository from a registry |
| dr | `docker container run` | Create a new container and start it using the specified command |
| drit | `docker container run -it` | Create a new container and start it in an interactive shell |
| drm | `docker container rm` | Remove the specified container(s) |
| drm! | `docker container rm -f` | Force the removal of a running container (uses SIGKILL) |
| dst | `docker container start` | Start one or more stopped containers |
| drs | `docker container restart` | Restart one or more containers |
| dsta | `docker stop $(docker ps -q)` | Stop all running containers |
| dstp | `docker container stop` | Stop one or more running containers |
| dtop | `docker top` | Display the running processes of a container |
| dvi | `docker volume inspect` | Display detailed information about one or more volumes |
| dvls | `docker volume ls` | List all the volumes known to docker |
| dvprune | `docker volume prune` | Cleanup dangling volumes |
| dxc | `docker container exec` | Run a new command in a running container |
| dxcit | `docker container exec -it` | Run a new command in a running container in an interactive shell |

View File

@ -0,0 +1,3126 @@
#compdef docker dockerd
#
# zsh completion for docker (http://docker.com)
#
# version: 0.3.0
# github: https://github.com/felixr/docker-zsh-completion
#
# contributors:
# - Felix Riedel
# - Steve Durrheimer
# - Vincent Bernat
# - Rohan Verma
#
# license:
#
# Copyright (c) 2013, Felix Riedel
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
# * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
# * Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
# * Neither the name of the <organization> nor the
# names of its contributors may be used to endorse or promote products
# derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
# Short-option stacking can be enabled with:
# zstyle ':completion:*:*:docker:*' option-stacking yes
# zstyle ':completion:*:*:docker-*:*' option-stacking yes
__docker_arguments() {
if zstyle -t ":completion:${curcontext}:" option-stacking; then
print -- -s
fi
}
__docker_get_containers() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local kind type line s
declare -a running stopped lines args names
kind=$1; shift
type=$1; shift
[[ $kind = (stopped|all) ]] && args=($args -a)
lines=(${(f)${:-"$(_call_program commands docker $docker_options ps --format 'table' --no-trunc $args)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1 # Last column, should go to the end of the line
lines=(${lines[2,-1]})
# Container ID
if [[ $type = (ids|all) ]]; then
for line in $lines; do
s="${${line[${begin[CONTAINER ID]},${end[CONTAINER ID]}]%% ##}[0,12]}"
s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}"
if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then
stopped=($stopped $s)
else
running=($running $s)
fi
done
fi
# Names: we only display the one without slash. All other names
# are generated and may clutter the completion. However, with
# Swarm, all names may be prefixed by the swarm node name.
if [[ $type = (names|all) ]]; then
for line in $lines; do
names=(${(ps:,:)${${line[${begin[NAMES]},${end[NAMES]}]}%% *}})
# First step: find a common prefix and strip it (swarm node case)
(( ${#${(u)names%%/*}} == 1 )) && names=${names#${names[1]%%/*}/}
# Second step: only keep the first name without a /
s=${${names:#*/*}[1]}
# If no name, well give up.
(( $#s != 0 )) || continue
s="$s:${(l:15:: :::)${${line[${begin[CREATED]},${end[CREATED]}]/ ago/}%% ##}}"
s="$s, ${${${line[${begin[IMAGE]},${end[IMAGE]}]}/:/\\:}%% ##}"
if [[ ${line[${begin[STATUS]},${end[STATUS]}]} = (Exit*|Created*) ]]; then
stopped=($stopped $s)
else
running=($running $s)
fi
done
fi
[[ $kind = (running|all) ]] && _describe -t containers-running "running containers" running "$@" && ret=0
[[ $kind = (stopped|all) ]] && _describe -t containers-stopped "stopped containers" stopped "$@" && ret=0
return ret
}
__docker_complete_stopped_containers() {
[[ $PREFIX = -* ]] && return 1
__docker_get_containers stopped all "$@"
}
__docker_complete_running_containers() {
[[ $PREFIX = -* ]] && return 1
__docker_get_containers running all "$@"
}
__docker_complete_containers() {
[[ $PREFIX = -* ]] && return 1
__docker_get_containers all all "$@"
}
__docker_complete_containers_ids() {
[[ $PREFIX = -* ]] && return 1
__docker_get_containers all ids "$@"
}
__docker_complete_containers_names() {
[[ $PREFIX = -* ]] && return 1
__docker_get_containers all names "$@"
}
__docker_complete_info_plugins() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
emulate -L zsh
setopt extendedglob
local -a plugins
plugins=(${(ps: :)${(M)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Plugins:}%%$'\n'^ *}}:# $1: *}## $1: })
_describe -t plugins "$1 plugins" plugins && ret=0
return ret
}
__docker_complete_images() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a images
images=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/(#b)([^ ]##) ##([^ ]##) ##([^ ]##)*/${match[3]}:${(r:15:: :::)match[2]} in ${match[1]}})
_describe -t docker-images "images" images && ret=0
__docker_complete_repositories_with_tags && ret=0
return ret
}
__docker_complete_repositories() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a repos
repos=(${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}%% *}[2,-1]})
repos=(${repos#<none>})
_describe -t docker-repos "repositories" repos && ret=0
return ret
}
__docker_complete_repositories_with_tags() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a repos onlyrepos matched
declare m
repos=(${${${${(f)${:-"$(_call_program commands docker $docker_options images)"$'\n'}}[2,-1]}/ ##/:::}%% *})
repos=(${${repos%:::<none>}#<none>})
# Check if we have a prefix-match for the current prefix.
onlyrepos=(${repos%::*})
for m in $onlyrepos; do
[[ ${PREFIX##${~~m}} != ${PREFIX} ]] && {
# Yes, complete with tags
repos=(${${repos/:::/:}/:/\\:})
_describe -t docker-repos-with-tags "repositories with tags" repos && ret=0
return ret
}
done
# No, only complete repositories
onlyrepos=(${${repos%:::*}/:/\\:})
_describe -t docker-repos "repositories" onlyrepos -qS : && ret=0
return ret
}
__docker_search() {
[[ $PREFIX = -* ]] && return 1
local cache_policy
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
if [[ -z "$cache_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy
fi
local searchterm cachename
searchterm="${words[$CURRENT]%/}"
cachename=_docker-search-$searchterm
local expl
local -a result
if ( [[ ${(P)+cachename} -eq 0 ]] || _cache_invalid ${cachename#_} ) \
&& ! _retrieve_cache ${cachename#_}; then
_message "Searching for ${searchterm}..."
result=(${${${(f)${:-"$(_call_program commands docker $docker_options search $searchterm)"$'\n'}}%% *}[2,-1]})
_store_cache ${cachename#_} result
fi
_wanted dockersearch expl 'available images' compadd -a result
}
__docker_get_log_options() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local log_driver=${opt_args[--log-driver]:-"all"}
local -a common_options common_options2 awslogs_options fluentd_options gelf_options journald_options json_file_options logentries_options syslog_options splunk_options
common_options=("max-buffer-size" "mode")
common_options2=("env" "env-regex" "labels")
awslogs_options=($common_options "awslogs-create-group" "awslogs-datetime-format" "awslogs-group" "awslogs-multiline-pattern" "awslogs-region" "awslogs-stream" "tag")
fluentd_options=($common_options $common_options2 "fluentd-address" "fluentd-async-connect" "fluentd-buffer-limit" "fluentd-retry-wait" "fluentd-max-retries" "fluentd-sub-second-precision" "tag")
gcplogs_options=($common_options $common_options2 "gcp-log-cmd" "gcp-meta-id" "gcp-meta-name" "gcp-meta-zone" "gcp-project")
gelf_options=($common_options $common_options2 "gelf-address" "gelf-compression-level" "gelf-compression-type" "tag")
journald_options=($common_options $common_options2 "tag")
json_file_options=($common_options $common_options2 "max-file" "max-size")
logentries_options=($common_options $common_options2 "logentries-token" "tag")
syslog_options=($common_options $common_options2 "syslog-address" "syslog-facility" "syslog-format" "syslog-tls-ca-cert" "syslog-tls-cert" "syslog-tls-key" "syslog-tls-skip-verify" "tag")
splunk_options=($common_options $common_options2 "splunk-caname" "splunk-capath" "splunk-format" "splunk-gzip" "splunk-gzip-level" "splunk-index" "splunk-insecureskipverify" "splunk-source" "splunk-sourcetype" "splunk-token" "splunk-url" "splunk-verify-connection" "tag")
[[ $log_driver = (awslogs|all) ]] && _describe -t awslogs-options "awslogs options" awslogs_options "$@" && ret=0
[[ $log_driver = (fluentd|all) ]] && _describe -t fluentd-options "fluentd options" fluentd_options "$@" && ret=0
[[ $log_driver = (gcplogs|all) ]] && _describe -t gcplogs-options "gcplogs options" gcplogs_options "$@" && ret=0
[[ $log_driver = (gelf|all) ]] && _describe -t gelf-options "gelf options" gelf_options "$@" && ret=0
[[ $log_driver = (journald|all) ]] && _describe -t journald-options "journald options" journald_options "$@" && ret=0
[[ $log_driver = (json-file|all) ]] && _describe -t json-file-options "json-file options" json_file_options "$@" && ret=0
[[ $log_driver = (logentries|all) ]] && _describe -t logentries-options "logentries options" logentries_options "$@" && ret=0
[[ $log_driver = (syslog|all) ]] && _describe -t syslog-options "syslog options" syslog_options "$@" && ret=0
[[ $log_driver = (splunk|all) ]] && _describe -t splunk-options "splunk options" splunk_options "$@" && ret=0
return ret
}
__docker_complete_log_drivers() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
drivers=(awslogs etwlogs fluentd gcplogs gelf journald json-file none splunk syslog)
_describe -t log-drivers "log drivers" drivers && ret=0
return ret
}
__docker_complete_log_options() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(syslog-format)
local opts=('rfc3164' 'rfc5424' 'rfc5424micro')
_describe -t syslog-format-opts "syslog format options" opts && ret=0
;;
(mode)
local opts=('blocking' 'non-blocking')
_describe -t mode-opts "mode options" opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
__docker_get_log_options -qS "=" && ret=0
fi
return ret
}
__docker_complete_detach_keys() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
compset -P "*,"
keys=(${:-{a-z}})
ctrl_keys=(${:-ctrl-{{a-z},{@,'[','\\','^',']',_}}})
_describe -t detach_keys "[a-z]" keys -qS "," && ret=0
_describe -t detach_keys-ctrl "'ctrl-' + 'a-z @ [ \\\\ ] ^ _'" ctrl_keys -qS "," && ret=0
}
__docker_complete_pid() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local -a opts vopts
opts=('host')
vopts=('container')
if compset -P '*:'; then
case "${${words[-1]%:*}#*=}" in
(container)
__docker_complete_running_containers && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
_describe -t pid-value-opts "PID Options with value" vopts -qS ":" && ret=0
_describe -t pid-opts "PID Options" opts && ret=0
fi
return ret
}
__docker_complete_runtimes() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
emulate -L zsh
setopt extendedglob
local -a runtimes_opts
runtimes_opts=(${(ps: :)${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Runtimes: }%%$'\n'^ *}}})
_describe -t runtimes-opts "runtimes options" runtimes_opts && ret=0
}
__docker_complete_ps_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(ancestor)
__docker_complete_images && ret=0
;;
(before|since)
__docker_complete_containers && ret=0
;;
(health)
health_opts=('healthy' 'none' 'starting' 'unhealthy')
_describe -t health-filter-opts "health filter options" health_opts && ret=0
;;
(id)
__docker_complete_containers_ids && ret=0
;;
(is-task)
_describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
;;
(name)
__docker_complete_containers_names && ret=0
;;
(network)
__docker_complete_networks && ret=0
;;
(status)
status_opts=('created' 'dead' 'exited' 'paused' 'restarting' 'running' 'removing')
_describe -t status-filter-opts "status filter options" status_opts && ret=0
;;
(volume)
__docker_complete_volumes && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('ancestor' 'before' 'exited' 'expose' 'health' 'id' 'label' 'name' 'network' 'publish' 'since' 'status' 'volume')
_describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
fi
return ret
}
__docker_complete_search_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a boolean_opts opts
boolean_opts=('true' 'false')
opts=('is-automated' 'is-official' 'stars')
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(is-automated|is-official)
_describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_complete_images_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a boolean_opts opts
boolean_opts=('true' 'false')
opts=('before' 'dangling' 'label' 'reference' 'since')
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(before|reference|since)
__docker_complete_images && ret=0
;;
(dangling)
_describe -t boolean-filter-opts "filter options" boolean_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
_describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
fi
return ret
}
__docker_complete_events_filter() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a opts
opts=('container' 'daemon' 'event' 'image' 'label' 'network' 'scope' 'type' 'volume')
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(container)
__docker_complete_containers && ret=0
;;
(daemon)
emulate -L zsh
setopt extendedglob
local -a daemon_opts
daemon_opts=(
${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'Name: }%%$'\n'^ *}}
${${(f)${${"$(_call_program commands docker $docker_options info)"##*$'\n'ID: }%%$'\n'^ *}}//:/\\:}
)
_describe -t daemon-filter-opts "daemon filter options" daemon_opts && ret=0
;;
(event)
local -a event_opts
event_opts=('attach' 'commit' 'connect' 'copy' 'create' 'delete' 'destroy' 'detach' 'die' 'disable' 'disconnect' 'enable' 'exec_create' 'exec_detach'
'exec_start' 'export' 'health_status' 'import' 'install' 'kill' 'load' 'mount' 'oom' 'pause' 'pull' 'push' 'reload' 'remove' 'rename' 'resize'
'restart' 'save' 'start' 'stop' 'tag' 'top' 'unmount' 'unpause' 'untag' 'update')
_describe -t event-filter-opts "event filter options" event_opts && ret=0
;;
(image)
__docker_complete_images && ret=0
;;
(network)
__docker_complete_networks && ret=0
;;
(scope)
local -a scope_opts
scope_opts=('local' 'swarm')
_describe -t scope-filter-opts "scope filter options" scope_opts && ret=0
;;
(type)
local -a type_opts
type_opts=('container' 'daemon' 'image' 'network' 'volume')
_describe -t type-filter-opts "type filter options" type_opts && ret=0
;;
(volume)
__docker_complete_volumes && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_complete_prune_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a opts
opts=('until')
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
*)
_message 'value' && ret=0
;;
esac
else
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
# BO checkpoint
__docker_checkpoint_commands() {
local -a _docker_checkpoint_subcommands
_docker_checkpoint_subcommands=(
"create:Create a checkpoint from a running container"
"ls:List checkpoints for a container"
"rm:Remove a checkpoint"
)
_describe -t docker-checkpoint-commands "docker checkpoint command" _docker_checkpoint_subcommands
}
__docker_checkpoint_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(create)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
"($help)--leave-running[Leave the container running after checkpoint]" \
"($help -)1:container:__docker_complete_running_containers" \
"($help -)2:checkpoint: " && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
"($help -)1:container:__docker_complete_containers" && ret=0
;;
(rm|remove)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--checkpoint-dir=[Use a custom checkpoint storage directory]:dir:_directories" \
"($help -)1:container:__docker_complete_containers" \
"($help -)2:checkpoint: " && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_checkpoint_commands" && ret=0
;;
esac
return ret
}
# EO checkpoint
# BO container
__docker_container_commands() {
local -a _docker_container_subcommands
_docker_container_subcommands=(
"attach:Attach to a running container"
"commit:Create a new image from a container's changes"
"cp:Copy files/folders between a container and the local filesystem"
"create:Create a new container"
"diff:Inspect changes on a container's filesystem"
"exec:Execute a command in a running container"
"export:Export a container's filesystem as a tar archive"
"inspect:Display detailed information on one or more containers"
"kill:Kill one or more running containers"
"logs:Fetch the logs of a container"
"ls:List containers"
"pause:Pause all processes within one or more containers"
"port:List port mappings or a specific mapping for the container"
"prune:Remove all stopped containers"
"rename:Rename a container"
"restart:Restart one or more containers"
"rm:Remove one or more containers"
"run:Create and run a new container from an image"
"start:Start one or more stopped containers"
"stats:Display a live stream of container(s) resource usage statistics"
"stop:Stop one or more running containers"
"top:Display the running processes of a container"
"unpause:Unpause all processes within one or more containers"
"update:Update configuration of one or more containers"
"wait:Block until one or more containers stop, then print their exit codes"
)
_describe -t docker-container-commands "docker container command" _docker_container_subcommands
}
__docker_container_subcommand() {
local -a _command_args opts_help opts_attach_exec_run_start opts_create_run opts_create_run_update
local expl help="--help"
integer ret=1
opts_attach_exec_run_start=(
"($help)--detach-keys=[Escape key sequence used to detach a container]:sequence:__docker_complete_detach_keys"
)
opts_create_run=(
"($help -a --attach)"{-a=,--attach=}"[Attach to stdin, stdout or stderr]:device:(STDIN STDOUT STDERR)"
"($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: "
"($help)*--annotation=[Add an annotation to the container (passed through to the OCI runtime)]:annotations: "
"($help)*--blkio-weight-device=[Block IO (relative device weight)]:device:Block IO weight: "
"($help)*--cap-add=[Add Linux capabilities]:capability: "
"($help)*--cap-drop=[Drop Linux capabilities]:capability: "
"($help)--cgroupns=[Cgroup namespace mode to use]:cgroup namespace mode: "
"($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: "
"($help)--cidfile=[Write the container ID to the file]:CID file:_files"
"($help)--cpus=[Number of CPUs (default 0.000)]:cpus: "
"($help)*--device=[Add a host device to the container]:device:_files"
"($help)*--device-cgroup-rule=[Add a rule to the cgroup allowed devices list]:device:cgroup: "
"($help)*--device-read-bps=[Limit the read rate (bytes per second) from a device]:device:IO rate: "
"($help)*--device-read-iops=[Limit the read rate (IO per second) from a device]:device:IO rate: "
"($help)*--device-write-bps=[Limit the write rate (bytes per second) to a device]:device:IO rate: "
"($help)*--device-write-iops=[Limit the write rate (IO per second) to a device]:device:IO rate: "
"($help)--disable-content-trust[Skip image verification]"
"($help)*--dns=[Custom DNS servers]:DNS server: "
"($help)*--dns-option=[Custom DNS options]:DNS option: "
"($help)*--dns-search=[Custom DNS search domains]:DNS domains: "
"($help)*--domainname=[Container NIS domain name]:domainname:_hosts"
"($help)*"{-e=,--env=}"[Environment variables]:environment variable: "
"($help)--entrypoint=[Overwrite the default entrypoint of the image]:entry point: "
"($help)*--env-file=[Read environment variables from a file]:environment file:_files"
"($help)*--expose=[Expose a port from the container without publishing it]: "
"($help)*--gpus=[GPU devices to add to the container ('all' to pass all GPUs)]:device: "
"($help)*--group-add=[Set one or more supplementary user groups for the container]:group:_groups"
"($help -h --hostname)"{-h=,--hostname=}"[Container host name]:hostname:_hosts"
"($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]"
"($help)--init[Run an init inside the container that forwards signals and reaps processes]"
"($help)--ip=[IPv4 address]:IPv4: "
"($help)--ip6=[IPv6 address]:IPv6: "
"($help)--ipc=[IPC namespace to use]:IPC namespace: "
"($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)"
"($help)*--link=[Add link to another container]:link:->link"
"($help)*--link-local-ip=[Container IPv4/IPv6 link-local addresses]:IPv4/IPv6: "
"($help)*"{-l=,--label=}"[Container metadata]:label: "
"($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers"
"($help)*--log-opt=[Log driver specific options]:log driver options:__docker_complete_log_options"
"($help)--mac-address=[Container MAC address]:MAC address: "
"($help)*--mount=[Attach a filesystem mount to the container]:mount: "
"($help)--name=[Container name]:name: "
"($help)--network=[Connect a container to a network]:network mode:(bridge none container host)"
"($help)*--network-alias=[Add network-scoped alias for the container]:alias: "
"($help)--oom-kill-disable[Disable OOM Killer]"
"($help)--oom-score-adj[Tune the host's OOM preferences for containers (accepts -1000 to 1000)]"
"($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]"
"($help -P --publish-all)"{-P,--publish-all}"[Publish all exposed ports]"
"($help)*"{-p=,--publish=}"[Expose a container's port to the host]:port:_ports"
"($help)--pid=[PID namespace to use]:PID namespace:__docker_complete_pid"
"($help)--privileged[Give extended privileges to this container]"
"($help -q --quiet)"{-q,--quiet}"[Suppress the pull output]"
"($help)--read-only[Mount the container's root filesystem as read only]"
"($help)*--security-opt=[Security options]:security option: "
"($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: "
"($help)--stop-signal=[Signal to kill a container]:signal:_signals"
"($help)--stop-timeout=[Timeout (in seconds) to stop a container]:time: "
"($help)*--sysctl=-[sysctl options]:sysctl: "
"($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]"
"($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
"($help)*--ulimit=[ulimit options]:ulimit: "
"($help)--userns=[Container user namespace]:user namespace:(host)"
"($help)--tmpfs[mount tmpfs]"
"($help)*-v[Bind mount a volume]:volume:_directories -W / -P '/' -S '\:' -r '/ '"
"($help)--volume-driver=[Optional volume driver for the container]:volume driver:(local)"
"($help)*--volumes-from=[Mount volumes from the specified container]:volume: "
"($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
)
opts_create_run_update=(
"($help)--blkio-weight=[Block IO (relative weight), between 10 and 1000]:Block IO weight:(10 100 500 1000)"
"($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)"
"($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: "
"($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: "
"($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: "
"($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: "
"($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: "
"($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: "
"($help)--kernel-memory=[Kernel memory limit in bytes]:Memory limit: "
"($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: "
"($help)--memory-reservation=[Memory soft limit]:Memory limit: "
"($help)--memory-swap=[Total memory limit with swap]:Memory limit: "
"($help)--pids-limit[Tune container pids limit (set -1 for unlimited)]"
"($help)--restart=[Restart policy]:restart policy:(no on-failure always unless-stopped)"
)
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(attach)
_arguments $(__docker_arguments) \
$opts_help \
$opts_attach_exec_run_start \
"($help)--no-stdin[Do not attach stdin]" \
"($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \
"($help -):containers:__docker_complete_running_containers" && ret=0
;;
(commit)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --author)"{-a=,--author=}"[Author]:author: " \
"($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \
"($help -m --message)"{-m=,--message=}"[Commit message]:message: " \
"($help -p --pause)"{-p,--pause}"[Pause container during commit]" \
"($help -):container:__docker_complete_containers" \
"($help -): :__docker_complete_repositories_with_tags" && ret=0
;;
(cp)
local state
_arguments $(__docker_arguments) \
$opts_help \
"($help -L --follow-link)"{-L,--follow-link}"[Always follow symbol link]" \
"($help -)1:container:->container" \
"($help -)2:hostpath:_files" && ret=0
case $state in
(container)
if compset -P "*:"; then
_files && ret=0
else
__docker_complete_containers -qS ":" && ret=0
fi
;;
esac
;;
(create)
local state
_arguments $(__docker_arguments) \
$opts_help \
$opts_create_run \
$opts_create_run_update \
"($help -): :__docker_complete_images" \
"($help -):command: _command_names -e" \
"($help -)*::arguments: _normal" && ret=0
case $state in
(link)
if compset -P "*:"; then
_wanted alias expl "Alias" compadd -E "" && ret=0
else
__docker_complete_running_containers -qS ":" && ret=0
fi
;;
esac
;;
(diff)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:containers:__docker_complete_containers" && ret=0
;;
(exec)
local state
_arguments $(__docker_arguments) \
$opts_help \
$opts_attach_exec_run_start \
"($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \
"($help)*"{-e=,--env=}"[Set environment variables]:environment variable: " \
"($help)*--env-file=[Read environment variables from a file]:environment file:_files" \
"($help -i --interactive)"{-i,--interactive}"[Keep stdin open even if not attached]" \
"($help)--privileged[Give extended Linux capabilities to the command]" \
"($help -t --tty)"{-t,--tty}"[Allocate a pseudo-tty]" \
"($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users" \
"($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories" \
"($help -):containers:__docker_complete_running_containers" \
"($help -)*::command:->anycommand" && ret=0
case $state in
(anycommand)
shift 1 words
(( CURRENT-- ))
_normal && ret=0
;;
esac
;;
(export)
_arguments $(__docker_arguments) \
$opts_help \
"($help -o --output)"{-o=,--output=}"[Write to a file, instead of stdout]:output file:_files" \
"($help -)*:containers:__docker_complete_containers" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help -s --size)"{-s,--size}"[Display total file sizes]" \
"($help -)*:containers:__docker_complete_containers" && ret=0
;;
(kill)
_arguments $(__docker_arguments) \
$opts_help \
"($help -s --signal)"{-s=,--signal=}"[Signal to send]:signal:_signals" \
"($help -)*:containers:__docker_complete_running_containers" && ret=0
;;
(logs)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--details[Show extra details provided to logs]" \
"($help -f --follow)"{-f,--follow}"[Follow log output]" \
"($help -s --since)"{-s=,--since=}"[Show logs since this timestamp]:timestamp: " \
"($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \
"($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \
"($help -)*:containers:__docker_complete_containers" && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Show all containers]" \
"($help)--before=[Show only container created before...]:containers:__docker_complete_containers" \
"($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_ps_filters" \
"($help)--format=[Format the output using the given Go template]:template: " \
"($help -l --latest)"{-l,--latest}"[Show only the latest created container]" \
"($help -n --last)"{-n=,--last=}"[Show n last created containers (includes all states)]:n:(1 5 10 25 50)" \
"($help)--no-trunc[Do not truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only show container IDs]" \
"($help -s --size)"{-s,--size}"[Display total file sizes]" \
"($help)--since=[Show only containers created since...]:containers:__docker_complete_containers" && ret=0
;;
(pause|unpause)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:containers:__docker_complete_running_containers" && ret=0
;;
(port)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)1:containers:__docker_complete_running_containers" \
"($help -)2:port:_ports" && ret=0
;;
(prune)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
"($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
;;
(rename)
_arguments $(__docker_arguments) \
$opts_help \
"($help -):old name:__docker_complete_containers" \
"($help -):new name: " && ret=0
;;
(restart)
_arguments $(__docker_arguments) \
$opts_help \
"($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \
"($help -)*:containers:__docker_complete_containers" && ret=0
;;
(rm)
local state
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --force)"{-f,--force}"[Force removal]" \
"($help -l --link)"{-l,--link}"[Remove the specified link and not the underlying container]" \
"($help -v --volumes)"{-v,--volumes}"[Remove the volumes associated to the container]" \
"($help -)*:containers:->values" && ret=0
case $state in
(values)
if [[ ${words[(r)-f]} == -f || ${words[(r)--force]} == --force ]]; then
__docker_complete_containers && ret=0
else
__docker_complete_stopped_containers && ret=0
fi
;;
esac
;;
(run)
local state
_arguments $(__docker_arguments) \
$opts_help \
$opts_create_run \
$opts_create_run_update \
$opts_attach_exec_run_start \
"($help -d --detach)"{-d,--detach}"[Detached mode: leave the container running in the background]" \
"($help)--health-cmd=[Command to run to check health]:command: " \
"($help)--health-interval=[Time between running the check]:time: " \
"($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)" \
"($help)--health-timeout=[Maximum time to allow one check to run]:time: " \
"($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]" \
"($help)--rm[Remove intermediate containers when it exits]" \
"($help)--runtime=[Name of the runtime to be used for that container]:runtime:__docker_complete_runtimes" \
"($help)--sig-proxy[Proxy all received signals to the process (non-TTY mode only)]" \
"($help)--storage-opt=[Storage driver options for the container]:storage options:->storage-opt" \
"($help -): :__docker_complete_images" \
"($help -):command: _command_names -e" \
"($help -)*::arguments: _normal" && ret=0
case $state in
(link)
if compset -P "*:"; then
_wanted alias expl "Alias" compadd -E "" && ret=0
else
__docker_complete_running_containers -qS ":" && ret=0
fi
;;
(storage-opt)
if compset -P "*="; then
_message "value" && ret=0
else
opts=('size')
_describe -t filter-opts "storage options" opts -qS "=" && ret=0
fi
;;
esac
;;
(start)
_arguments $(__docker_arguments) \
$opts_help \
$opts_attach_exec_run_start \
"($help -a --attach)"{-a,--attach}"[Attach container's stdout/stderr and forward all signals]" \
"($help -i --interactive)"{-i,--interactive}"[Attach container's stdin]" \
"($help -)*:containers:__docker_complete_stopped_containers" && ret=0
;;
(stats)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Show all containers (default shows just running)]" \
"($help)--format=[Format the output using the given Go template]:template: " \
"($help)--no-stream[Disable streaming stats and only pull the first result]" \
"($help)--no-trunc[Do not truncate output]" \
"($help -)*:containers:__docker_complete_running_containers" && ret=0
;;
(stop)
_arguments $(__docker_arguments) \
$opts_help \
"($help -t --time)"{-t=,--time=}"[Number of seconds to try to stop for before killing the container]:seconds to before killing:(1 5 10 30 60)" \
"($help -)*:containers:__docker_complete_running_containers" && ret=0
;;
(top)
local state
_arguments $(__docker_arguments) \
$opts_help \
"($help -)1:containers:__docker_complete_running_containers" \
"($help -)*:: :->ps-arguments" && ret=0
case $state in
(ps-arguments)
_ps && ret=0
;;
esac
;;
(update)
local state
_arguments $(__docker_arguments) \
$opts_help \
$opts_create_run_update \
"($help -)*: :->values" && ret=0
case $state in
(values)
if [[ ${words[(r)--kernel-memory*]} = (--kernel-memory*) ]]; then
__docker_complete_stopped_containers && ret=0
else
__docker_complete_containers && ret=0
fi
;;
esac
;;
(wait)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:containers:__docker_complete_running_containers" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0
;;
esac
return ret
}
# EO container
# BO image
__docker_image_commands() {
local -a _docker_image_subcommands
_docker_image_subcommands=(
"build:Build an image from a Dockerfile"
"history:Show the history of an image"
"import:Import the contents from a tarball to create a filesystem image"
"inspect:Display detailed information on one or more images"
"load:Load an image from a tar archive or STDIN"
"ls:List images"
"prune:Remove unused images"
"pull:Download an image from a registry"
"push:Upload an image to a registry"
"rm:Remove one or more images"
"save:Save one or more images to a tar archive (streamed to STDOUT by default)"
"tag:Tag an image into a repository"
)
_describe -t docker-image-commands "docker image command" _docker_image_subcommands
}
__docker_image_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(build)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*--add-host=[Add a custom host-to-IP mapping]:host\:ip mapping: " \
"($help)*--build-arg=[Build-time variables]:<varname>=<value>: " \
"($help)*--cache-from=[Images to consider as cache sources]: :__docker_complete_repositories_with_tags" \
"($help -c --cpu-shares)"{-c=,--cpu-shares=}"[CPU shares (relative weight)]:CPU shares:(0 10 100 200 500 800 1000)" \
"($help)--cgroup-parent=[Parent cgroup for the container]:cgroup: " \
"($help)--compress[Compress the build context using gzip]" \
"($help)--cpu-period=[Limit the CPU CFS (Completely Fair Scheduler) period]:CPU period: " \
"($help)--cpu-quota=[Limit the CPU CFS (Completely Fair Scheduler) quota]:CPU quota: " \
"($help)--cpu-rt-period=[Limit the CPU real-time period]:CPU real-time period in microseconds: " \
"($help)--cpu-rt-runtime=[Limit the CPU real-time runtime]:CPU real-time runtime in microseconds: " \
"($help)--cpuset-cpus=[CPUs in which to allow execution]:CPUs: " \
"($help)--cpuset-mems=[MEMs in which to allow execution]:MEMs: " \
"($help)--disable-content-trust[Skip image verification]" \
"($help -f --file)"{-f=,--file=}"[Name of the Dockerfile]:Dockerfile:_files" \
"($help)--force-rm[Always remove intermediate containers]" \
"($help)--isolation=[Container isolation technology]:isolation:(default hyperv process)" \
"($help)*--label=[Set metadata for an image]:label=value: " \
"($help -m --memory)"{-m=,--memory=}"[Memory limit]:Memory limit: " \
"($help)--memory-swap=[Total memory limit with swap]:Memory limit: " \
"($help)--network=[Connect a container to a network]:network mode:(bridge none container host)" \
"($help)--no-cache[Do not use cache when building the image]" \
"($help)--pull[Attempt to pull a newer version of the image]" \
"($help -q --quiet)"{-q,--quiet}"[Suppress verbose build output]" \
"($help)--rm[Remove intermediate containers after a successful build]" \
"($help)*--shm-size=[Size of '/dev/shm' (format is '<number><unit>')]:shm size: " \
"($help)--squash[Squash newly built layers into a single new layer]" \
"($help -t --tag)*"{-t=,--tag=}"[Repository, name and tag for the image]: :__docker_complete_repositories_with_tags" \
"($help)--target=[Set the target build stage to build.]" \
"($help)*--ulimit=[ulimit options]:ulimit: " \
"($help)--userns=[Container user namespace]:user namespace:(host)" \
"($help -):path or URL:_directories" && ret=0
;;
(history)
_arguments $(__docker_arguments) \
$opts_help \
"($help -H --human)"{-H,--human}"[Print sizes and dates in human readable format]" \
"($help)--no-trunc[Do not truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \
"($help -)*: :__docker_complete_images" && ret=0
;;
(import)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-c=,--change=}"[Apply Dockerfile instruction to the created image]:Dockerfile:_files" \
"($help -m --message)"{-m=,--message=}"[Commit message for imported image]:message: " \
"($help -):URL:(- http:// file://)" \
"($help -): :__docker_complete_repositories_with_tags" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help -)*:images:__docker_complete_images" && ret=0
;;
(load)
_arguments $(__docker_arguments) \
$opts_help \
"($help -i --input)"{-i=,--input=}"[Read from tar archive file]:archive file:_files -g \"*.((tar|TAR)(.gz|.GZ|.Z|.bz2|.lzma|.xz|)|(tbz|tgz|txz))(-.)\"" \
"($help -q --quiet)"{-q,--quiet}"[Suppress the load output]" && ret=0
;;
(ls|list)
local state
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Show all images]" \
"($help)--digests[Show digests]" \
"($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_images_filters" \
"($help)--format=[Format the output using the given Go template]:template: " \
"($help)--no-trunc[Do not truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only show image IDs]" \
"($help -): :__docker_complete_repositories" && ret=0
;;
(prune)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Remove all unused images, not just dangling ones]" \
"($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
"($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
;;
(pull)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all-tags)"{-a,--all-tags}"[Download all tagged images]" \
"($help)--disable-content-trust[Skip image verification]" \
"($help -):name:__docker_search" && ret=0
;;
(push)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all-tags)"{-a,--all-tags}"[Push all tags of an image to the repository]" \
"($help)--disable-content-trust[Skip image signing]" \
"($help -): :__docker_complete_images" && ret=0
;;
(rm)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --force)"{-f,--force}"[Force removal]" \
"($help)--no-prune[Do not delete untagged parents]" \
"($help -)*: :__docker_complete_images" && ret=0
;;
(save)
_arguments $(__docker_arguments) \
$opts_help \
"($help -o --output)"{-o=,--output=}"[Write to file]:file:_files" \
"($help -)*: :__docker_complete_images" && ret=0
;;
(tag)
_arguments $(__docker_arguments) \
$opts_help \
"($help -):source:__docker_complete_images"\
"($help -):destination:__docker_complete_repositories_with_tags" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_container_commands" && ret=0
;;
esac
return ret
}
# EO image
# BO network
__docker_network_complete_ls_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(driver)
__docker_complete_info_plugins Network && ret=0
;;
(id)
__docker_complete_networks_ids && ret=0
;;
(name)
__docker_complete_networks_names && ret=0
;;
(scope)
opts=('global' 'local' 'swarm')
_describe -t scope-filter-opts "Scope filter options" opts && ret=0
;;
(type)
opts=('builtin' 'custom')
_describe -t type-filter-opts "Type filter options" opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('driver' 'id' 'label' 'name' 'scope' 'type')
_describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
fi
return ret
}
__docker_get_networks() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local line s
declare -a lines networks
type=$1; shift
lines=(${(f)${:-"$(_call_program commands docker $docker_options network ls)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# Network ID
if [[ $type = (ids|all) ]]; then
for line in $lines; do
s="${line[${begin[NETWORK ID]},${end[NETWORK ID]}]%% ##}"
s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}"
networks=($networks $s)
done
fi
# Names
if [[ $type = (names|all) ]]; then
for line in $lines; do
s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
s="$s, ${${line[${begin[SCOPE]},${end[SCOPE]}]}%% ##}"
networks=($networks $s)
done
fi
_describe -t networks-list "networks" networks "$@" && ret=0
return ret
}
__docker_complete_networks() {
[[ $PREFIX = -* ]] && return 1
__docker_get_networks all "$@"
}
__docker_complete_networks_ids() {
[[ $PREFIX = -* ]] && return 1
__docker_get_networks ids "$@"
}
__docker_complete_networks_names() {
[[ $PREFIX = -* ]] && return 1
__docker_get_networks names "$@"
}
__docker_network_commands() {
local -a _docker_network_subcommands
_docker_network_subcommands=(
"connect:Connect a container to a network"
"create:Creates a new network with a name specified by the user"
"disconnect:Disconnects a container from a network"
"inspect:Displays detailed information on a network"
"ls:Lists all the networks created by the user"
"prune:Remove all unused networks"
"rm:Deletes one or more networks"
)
_describe -t docker-network-commands "docker network command" _docker_network_subcommands
}
__docker_network_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(connect)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*--alias=[Add network-scoped alias for the container]:alias: " \
"($help)--ip=[IPv4 address]:IPv4: " \
"($help)--ip6=[IPv6 address]:IPv6: " \
"($help)*--link=[Add a link to another container]:link:->link" \
"($help)*--link-local-ip=[Add a link-local address for the container]:IPv4/IPv6: " \
"($help -)1:network:__docker_complete_networks" \
"($help -)2:containers:__docker_complete_containers" && ret=0
case $state in
(link)
if compset -P "*:"; then
_wanted alias expl "Alias" compadd -E "" && ret=0
else
__docker_complete_running_containers -qS ":" && ret=0
fi
;;
esac
;;
(create)
_arguments $(__docker_arguments) -A '-*' \
$opts_help \
"($help)--attachable[Enable manual container attachment]" \
"($help)*--aux-address[Auxiliary IPv4 or IPv6 addresses used by network driver]:key=IP: " \
"($help -d --driver)"{-d=,--driver=}"[Driver to manage the Network]:driver:(null host bridge overlay)" \
"($help)*--gateway=[IPv4 or IPv6 Gateway for the master subnet]:IP: " \
"($help)--internal[Restricts external access to the network]" \
"($help)*--ip-range=[Allocate container ip from a sub-range]:IP/mask: " \
"($help)--ipam-driver=[IP Address Management Driver]:driver:(default)" \
"($help)*--ipam-opt=[Custom IPAM plugin options]:opt=value: " \
"($help)--ipv6[Enable IPv6 networking]" \
"($help)*--label=[Set metadata on a network]:label=value: " \
"($help)*"{-o=,--opt=}"[Driver specific options]:opt=value: " \
"($help)*--subnet=[Subnet in CIDR format that represents a network segment]:IP/mask: " \
"($help -)1:Network Name: " && ret=0
;;
(disconnect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)1:network:__docker_complete_networks" \
"($help -)2:containers:__docker_complete_containers" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help)--verbose[Show detailed information]" \
"($help -)*:network:__docker_complete_networks" && ret=0
;;
(ls)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--no-trunc[Do not truncate the output]" \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_network_complete_ls_filters" \
"($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display network IDs]" && ret=0
;;
(prune)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
"($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
;;
(rm)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:network:__docker_complete_networks" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0
;;
esac
return ret
}
# EO network
# BO node
__docker_node_complete_ls_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(id)
__docker_complete_nodes_ids && ret=0
;;
(membership)
membership_opts=('accepted' 'pending' 'rejected')
_describe -t membership-opts "membership options" membership_opts && ret=0
;;
(name)
__docker_complete_nodes_names && ret=0
;;
(role)
role_opts=('manager' 'worker')
_describe -t role-opts "role options" role_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('id' 'label' 'membership' 'name' 'node.label' 'role')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_node_complete_ps_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(desired-state)
state_opts=('accepted' 'running' 'shutdown')
_describe -t state-opts "desired state options" state_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('desired-state' 'id' 'label' 'name')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_nodes() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local line s
declare -a lines nodes args
type=$1; shift
filter=$1; shift
[[ $filter != "none" ]] && args=("-f $filter")
lines=(${(f)${:-"$(_call_program commands docker $docker_options node ls $args)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# Node ID
if [[ $type = (ids|all) ]]; then
for line in $lines; do
s="${line[${begin[ID]},${end[ID]}]%% ##}"
nodes=($nodes $s)
done
fi
# Names
if [[ $type = (names|all) ]]; then
for line in $lines; do
s="${line[${begin[HOSTNAME]},${end[HOSTNAME]}]%% ##}"
nodes=($nodes $s)
done
fi
_describe -t nodes-list "nodes" nodes "$@" && ret=0
return ret
}
__docker_complete_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all none "$@"
}
__docker_complete_nodes_ids() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes ids none "$@"
}
__docker_complete_nodes_names() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes names none "$@"
}
__docker_complete_pending_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all "membership=pending" "$@"
}
__docker_complete_manager_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all "role=manager" "$@"
}
__docker_complete_worker_nodes() {
[[ $PREFIX = -* ]] && return 1
__docker_nodes all "role=worker" "$@"
}
__docker_node_commands() {
local -a _docker_node_subcommands
_docker_node_subcommands=(
"demote:Demote a node as manager in the swarm"
"inspect:Display detailed information on one or more nodes"
"ls:List nodes in the swarm"
"promote:Promote a node as manager in the swarm"
"rm:Remove one or more nodes from the swarm"
"ps:List tasks running on one or more nodes, defaults to current node"
"update:Update a node"
)
_describe -t docker-node-commands "docker node command" _docker_node_subcommands
}
__docker_node_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(rm|remove)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --force)"{-f,--force}"[Force remove a node from the swarm]" \
"($help -)*:node:__docker_complete_pending_nodes" && ret=0
;;
(demote)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:node:__docker_complete_manager_nodes" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help)--pretty[Print the information in a human friendly format]" \
"($help -)*:node:__docker_complete_nodes" && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ls_filters" \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
;;
(promote)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:node:__docker_complete_worker_nodes" && ret=0
;;
(ps)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Display all instances]" \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_node_complete_ps_filters" \
"($help)--format=[Format the output using the given go template]:template: " \
"($help)--no-resolve[Do not map IDs to Names]" \
"($help)--no-trunc[Do not truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \
"($help -)*:node:__docker_complete_nodes" && ret=0
;;
(update)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--availability=[Availability of the node]:availability:(active pause drain)" \
"($help)*--label-add=[Add or update a node label]:key=value: " \
"($help)*--label-rm=[Remove a node label if exists]:label: " \
"($help)--role=[Role of the node]:role:(manager worker)" \
"($help -)1:node:__docker_complete_nodes" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_node_commands" && ret=0
;;
esac
return ret
}
# EO node
# BO plugin
__docker_plugin_complete_ls_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(capability)
opts=('authz' 'ipamdriver' 'logdriver' 'metricscollector' 'networkdriver' 'volumedriver')
_describe -t capability-opts "capability options" opts && ret=0
;;
(enabled)
opts=('false' 'true')
_describe -t enabled-opts "enabled options" opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('capability' 'enabled')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_plugins() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local line s
declare -a lines plugins args
filter=$1; shift
[[ $filter != "none" ]] && args=("-f $filter")
lines=(${(f)${:-"$(_call_program commands docker $docker_options plugin ls $args)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# Name
for line in $lines; do
s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
s="$s:${(l:7:: :::)${${line[${begin[TAG]},${end[TAG]}]}%% ##}}"
plugins=($plugins $s)
done
_describe -t plugins-list "plugins" plugins "$@" && ret=0
return ret
}
__docker_complete_plugins() {
[[ $PREFIX = -* ]] && return 1
__docker_plugins none "$@"
}
__docker_complete_enabled_plugins() {
[[ $PREFIX = -* ]] && return 1
__docker_plugins enabled=true "$@"
}
__docker_complete_disabled_plugins() {
[[ $PREFIX = -* ]] && return 1
__docker_plugins enabled=false "$@"
}
__docker_plugin_commands() {
local -a _docker_plugin_subcommands
_docker_plugin_subcommands=(
"disable:Disable a plugin"
"enable:Enable a plugin"
"inspect:Return low-level information about a plugin"
"install:Install a plugin"
"ls:List plugins"
"push:Push a plugin"
"rm:Remove a plugin"
"set:Change settings for a plugin"
"upgrade:Upgrade an existing plugin"
)
_describe -t docker-plugin-commands "docker plugin command" _docker_plugin_subcommands
}
__docker_plugin_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(disable)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --force)"{-f,--force}"[Force the disable of an active plugin]" \
"($help -)1:plugin:__docker_complete_enabled_plugins" && ret=0
;;
(enable)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--timeout=[HTTP client timeout (in seconds)]:timeout: " \
"($help -)1:plugin:__docker_complete_disabled_plugins" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \
"($help -)*:plugin:__docker_complete_plugins" && ret=0
;;
(install)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--alias=[Local name for plugin]:alias: " \
"($help)--disable[Do not enable the plugin on install]" \
"($help)--disable-content-trust[Skip image verification (default true)]" \
"($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \
"($help -)1:plugin:__docker_complete_plugins" \
"($help -)*:key=value: " && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_plugin_complete_ls_filters" \
"($help --format)--format=[Format the output using the given Go template]:template: " \
"($help)--no-trunc[Don't truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
;;
(push)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--disable-content-trust[Skip image verification (default true)]" \
"($help -)1:plugin:__docker_complete_plugins" && ret=0
;;
(rm|remove)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --force)"{-f,--force}"[Force the removal of an active plugin]" \
"($help -)*:plugin:__docker_complete_plugins" && ret=0
;;
(set)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)1:plugin:__docker_complete_plugins" \
"($help -)*:key=value: " && ret=0
;;
(upgrade)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--disable-content-trust[Skip image verification (default true)]" \
"($help)--grant-all-permissions[Grant all permissions necessary to run the plugin]" \
"($help)--skip-remote-check[Do not check if specified remote plugin matches existing plugin image]" \
"($help -)1:plugin:__docker_complete_plugins" \
"($help -):remote: " && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_plugin_commands" && ret=0
;;
esac
return ret
}
# EO plugin
# BO secret
__docker_secrets() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local line s
declare -a lines secrets
type=$1; shift
lines=(${(f)${:-"$(_call_program commands docker $docker_options secret ls)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# ID
if [[ $type = (ids|all) ]]; then
for line in $lines; do
s="${line[${begin[ID]},${end[ID]}]%% ##}"
secrets=($secrets $s)
done
fi
# Names
if [[ $type = (names|all) ]]; then
for line in $lines; do
s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
secrets=($secrets $s)
done
fi
_describe -t secrets-list "secrets" secrets "$@" && ret=0
return ret
}
__docker_complete_secrets() {
[[ $PREFIX = -* ]] && return 1
__docker_secrets all "$@"
}
__docker_secret_commands() {
local -a _docker_secret_subcommands
_docker_secret_subcommands=(
"create:Create a secret using stdin as content"
"inspect:Display detailed information on one or more secrets"
"ls:List secrets"
"rm:Remove one or more secrets"
)
_describe -t docker-secret-commands "docker secret command" _docker_secret_subcommands
}
__docker_secret_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(create)
_arguments $(__docker_arguments) -A '-*' \
$opts_help \
"($help)*"{-l=,--label=}"[Secret labels]:label: " \
"($help -):secret: " && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given Go template]:template: " \
"($help -)*:secret:__docker_complete_secrets" && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--format=[Format the output using the given go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
;;
(rm|remove)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:secret:__docker_complete_secrets" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_secret_commands" && ret=0
;;
esac
return ret
}
# EO secret
# BO service
__docker_service_complete_ls_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(id)
__docker_complete_services_ids && ret=0
;;
(mode)
opts=('global' 'replicated')
_describe -t mode-opts "mode options" opts && ret=0
;;
(name)
__docker_complete_services_names && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('id' 'label' 'mode' 'name')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_service_complete_ps_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(desired-state)
state_opts=('accepted' 'running' 'shutdown')
_describe -t state-opts "desired state options" state_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('desired-state' 'id' 'label' 'name')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_service_complete_placement_pref() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(spread)
opts=('engine.labels' 'node.labels')
_describe -t spread-opts "spread options" opts -qS "." && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('spread')
_describe -t pref-opts "placement pref options" opts -qS "=" && ret=0
fi
return ret
}
__docker_services() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local line s
declare -a lines services
type=$1; shift
lines=(${(f)${:-"$(_call_program commands docker $docker_options service ls)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# Service ID
if [[ $type = (ids|all) ]]; then
for line in $lines; do
s="${line[${begin[ID]},${end[ID]}]%% ##}"
s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
services=($services $s)
done
fi
# Names
if [[ $type = (names|all) ]]; then
for line in $lines; do
s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
s="$s:${(l:7:: :::)${${line[${begin[IMAGE]},${end[IMAGE]}]}%% ##}}"
services=($services $s)
done
fi
_describe -t services-list "services" services "$@" && ret=0
return ret
}
__docker_complete_services() {
[[ $PREFIX = -* ]] && return 1
__docker_services all "$@"
}
__docker_complete_services_ids() {
[[ $PREFIX = -* ]] && return 1
__docker_services ids "$@"
}
__docker_complete_services_names() {
[[ $PREFIX = -* ]] && return 1
__docker_services names "$@"
}
__docker_service_commands() {
local -a _docker_service_subcommands
_docker_service_subcommands=(
"create:Create a new service"
"inspect:Display detailed information on one or more services"
"logs:Fetch the logs of a service or task"
"ls:List services"
"rm:Remove one or more services"
"rollback:Revert changes to a service's configuration"
"scale:Scale one or multiple replicated services"
"ps:List the tasks of a service"
"update:Update a service"
)
_describe -t docker-service-commands "docker service command" _docker_service_subcommands
}
__docker_service_subcommand() {
local -a _command_args opts_help opts_create_update
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
opts_create_update=(
"($help)*--cap-add=[Add Linux capabilities]:capability: "
"($help)*--cap-drop=[Drop Linux capabilities]:capability: "
"($help)*--constraint=[Placement constraints]:constraint: "
"($help)--endpoint-mode=[Placement constraints]:mode:(dnsrr vip)"
"($help)*"{-e=,--env=}"[Set environment variables]:env: "
"($help)--health-cmd=[Command to run to check health]:command: "
"($help)--health-interval=[Time between running the check]:time: "
"($help)--health-retries=[Consecutive failures needed to report unhealthy]:retries:(1 2 3 4 5)"
"($help)--health-timeout=[Maximum time to allow one check to run]:time: "
"($help)--hostname=[Service container hostname]:hostname: " \
"($help)--isolation=[Service container isolation mode]:isolation:(default process hyperv)" \
"($help)*--label=[Service labels]:label: "
"($help)--limit-cpu=[Limit CPUs]:value: "
"($help)--limit-memory=[Limit Memory]:value: "
"($help)--limit-pids[Limit maximum number of processes (default 0 = unlimited)]"
"($help)--log-driver=[Logging driver for service]:logging driver:__docker_complete_log_drivers"
"($help)*--log-opt=[Logging driver options]:log driver options:__docker_complete_log_options"
"($help)*--mount=[Attach a filesystem mount to the service]:mount: "
"($help)*--network=[Network attachments]:network: "
"($help)--no-healthcheck[Disable any container-specified HEALTHCHECK]"
"($help)--read-only[Mount the container's root filesystem as read only]"
"($help)--replicas=[Number of tasks]:replicas: "
"($help)--reserve-cpu=[Reserve CPUs]:value: "
"($help)--reserve-memory=[Reserve Memory]:value: "
"($help)--restart-condition=[Restart when condition is met]:mode:(any none on-failure)"
"($help)--restart-delay=[Delay between restart attempts]:delay: "
"($help)--restart-max-attempts=[Maximum number of restarts before giving up]:max-attempts: "
"($help)--restart-window=[Window used to evaluate the restart policy]:duration: "
"($help)--rollback-delay=[Delay between task rollbacks]:duration: "
"($help)--rollback-failure-action=[Action on rollback failure]:action:(continue pause)"
"($help)--rollback-max-failure-ratio=[Failure rate to tolerate during a rollback]:failure rate: "
"($help)--rollback-monitor=[Duration after each task rollback to monitor for failure]:duration: "
"($help)--rollback-parallelism=[Maximum number of tasks rolled back simultaneously]:number: "
"($help)*--secret=[Specify secrets to expose to the service]:secret:__docker_complete_secrets"
"($help)--stop-grace-period=[Time to wait before force killing a container]:grace period: "
"($help)--stop-signal=[Signal to stop the container]:signal:_signals"
"($help -t --tty)"{-t,--tty}"[Allocate a pseudo-TTY]"
"($help)--update-delay=[Delay between updates]:delay: "
"($help)--update-failure-action=[Action on update failure]:mode:(continue pause rollback)"
"($help)--update-max-failure-ratio=[Failure rate to tolerate during an update]:fraction: "
"($help)--update-monitor=[Duration after each task update to monitor for failure]:window: "
"($help)--update-parallelism=[Maximum number of tasks updated simultaneously]:number: "
"($help -u --user)"{-u=,--user=}"[Username or UID]:user:_users"
"($help)--with-registry-auth[Send registry authentication details to swarm agents]"
"($help -w --workdir)"{-w=,--workdir=}"[Working directory inside the container]:directory:_directories"
)
case "$words[1]" in
(create)
_arguments $(__docker_arguments) \
$opts_help \
$opts_create_update \
"($help)*--container-label=[Container labels]:label: " \
"($help)*--dns=[Set custom DNS servers]:DNS: " \
"($help)*--dns-option=[Set DNS options]:DNS option: " \
"($help)*--dns-search=[Set custom DNS search domains]:DNS search: " \
"($help)*--env-file=[Read environment variables from a file]:environment file:_files" \
"($help)*--group=[Set one or more supplementary user groups for the container]:group: _groups " \
"($help)--mode=[Service Mode]:mode:(global replicated)" \
"($help)--name=[Service name]:name: " \
"($help)*--placement-pref=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \
"($help)*"{-p=,--publish=}"[Publish a port as a node port]:port: " \
"($help -): :__docker_complete_images" \
"($help -):command: _command_names -e" \
"($help -)*::arguments: _normal" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help)--pretty[Print the information in a human friendly format]" \
"($help -)*:service:__docker_complete_services" && ret=0
;;
(logs)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --follow)"{-f,--follow}"[Follow log output]" \
"($help)--no-resolve[Do not map IDs to Names]" \
"($help)--no-task-ids[Do not include task IDs]" \
"($help)--no-trunc[Do not truncate output]" \
"($help)--since=[Show logs since timestamp]:timestamp: " \
"($help -n --tail)"{-n=,--tail=}"[Number of lines to show from the end of the logs]:lines:(1 10 20 50 all)" \
"($help -t --timestamps)"{-t,--timestamps}"[Show timestamps]" \
"($help -)1:service:__docker_complete_services" && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_service_complete_ls_filters" \
"($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" && ret=0
;;
(rm|remove)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)*:service:__docker_complete_services" && ret=0
;;
(rollback)
_arguments $(__docker_arguments) \
$opts_help \
"($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \
"($help -q --quiet)"{-q,--quiet}"[Suppress progress output]" \
"($help -)*:service:__docker_complete_services" && ret=0
;;
(scale)
_arguments $(__docker_arguments) \
$opts_help \
"($help -d --detach)"{-d=false,--detach=false}"[Disable detached mode]" \
"($help -)*:service:->values" && ret=0
case $state in
(values)
if compset -P '*='; then
_message 'replicas' && ret=0
else
__docker_complete_services -qS "="
fi
;;
esac
;;
(ps)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_service_complete_ps_filters" \
"($help)--format=[Format the output using the given go template]:template: " \
"($help)--no-resolve[Do not map IDs to Names]" \
"($help)--no-trunc[Do not truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \
"($help -)*:service:__docker_complete_services" && ret=0
;;
(update)
_arguments $(__docker_arguments) \
$opts_help \
$opts_create_update \
"($help)--arg=[Service command args]:arguments: _normal" \
"($help)*--container-label-add=[Add or update container labels]:label: " \
"($help)*--container-label-rm=[Remove a container label by its key]:label: " \
"($help)*--dns-add=[Add or update custom DNS servers]:DNS: " \
"($help)*--dns-rm=[Remove custom DNS servers]:DNS: " \
"($help)*--dns-option-add=[Add or update DNS options]:DNS option: " \
"($help)*--dns-option-rm=[Remove DNS options]:DNS option: " \
"($help)*--dns-search-add=[Add or update custom DNS search domains]:DNS search: " \
"($help)*--dns-search-rm=[Remove DNS search domains]:DNS search: " \
"($help)--force[Force update]" \
"($help)*--group-add=[Add additional supplementary user groups to the container]:group:_groups" \
"($help)*--group-rm=[Remove previously added supplementary user groups from the container]:group:_groups" \
"($help)--image=[Service image tag]:image:__docker_complete_repositories" \
"($help)*--placement-pref-add=[Add a placement preference]:pref:__docker_service_complete_placement_pref" \
"($help)*--placement-pref-rm=[Remove a placement preference]:pref:__docker_service_complete_placement_pref" \
"($help)*--publish-add=[Add or update a port]:port: " \
"($help)*--publish-rm=[Remove a port(target-port mandatory)]:port: " \
"($help)--rollback[Rollback to previous specification]" \
"($help -)1:service:__docker_complete_services" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_service_commands" && ret=0
;;
esac
return ret
}
# EO service
# BO stack
__docker_stack_complete_ps_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(desired-state)
state_opts=('accepted' 'running' 'shutdown')
_describe -t state-opts "desired state options" state_opts && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('desired-state' 'id' 'name')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_stack_complete_services_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
*)
_message 'value' && ret=0
;;
esac
else
opts=('id' 'label' 'name')
_describe -t filter-opts "filter options" opts -qS "=" && ret=0
fi
return ret
}
__docker_stacks() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
local line s
declare -a lines stacks
lines=(${(f)${:-"$(_call_program commands docker $docker_options stack ls)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# Service NAME
for line in $lines; do
s="${line[${begin[NAME]},${end[NAME]}]%% ##}"
stacks=($stacks $s)
done
_describe -t stacks-list "stacks" stacks "$@" && ret=0
return ret
}
__docker_complete_stacks() {
[[ $PREFIX = -* ]] && return 1
__docker_stacks "$@"
}
__docker_stack_commands() {
local -a _docker_stack_subcommands
_docker_stack_subcommands=(
"deploy:Deploy a new stack or update an existing stack"
"ls:List stacks"
"ps:List the tasks in the stack"
"rm:Remove the stack"
"services:List the services in the stack"
)
_describe -t docker-stack-commands "docker stack command" _docker_stack_subcommands
}
__docker_stack_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(deploy|up)
_arguments $(__docker_arguments) \
$opts_help \
"($help -c --compose-file)"{-c=,--compose-file=}"[Path to a Compose file, or '-' to read from stdin]:compose file:_files -g \"*.(yml|yaml)\"" \
"($help)--with-registry-auth[Send registry authentication details to Swarm agents]" \
"($help -):stack:__docker_complete_stacks" && ret=0
;;
(ls|list)
_arguments $(__docker_arguments) \
$opts_help && ret=0
;;
(ps)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Display all tasks]" \
"($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_ps_filters" \
"($help)--format=[Format the output using the given go template]:template: " \
"($help)--no-resolve[Do not map IDs to Names]" \
"($help)--no-trunc[Do not truncate output]" \
"($help -q --quiet)"{-q,--quiet}"[Only display task IDs]" \
"($help -):stack:__docker_complete_stacks" && ret=0
;;
(rm|remove|down)
_arguments $(__docker_arguments) \
$opts_help \
"($help -):stack:__docker_complete_stacks" && ret=0
;;
(services)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Filter output based on conditions provided]:filter:__docker_stack_complete_services_filters" \
"($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display IDs]" \
"($help -):stack:__docker_complete_stacks" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_stack_commands" && ret=0
;;
esac
return ret
}
# EO stack
# BO swarm
__docker_swarm_commands() {
local -a _docker_swarm_subcommands
_docker_swarm_subcommands=(
"init:Initialize a swarm"
"join:Join a swarm as a node and/or manager"
"join-token:Manage join tokens"
"leave:Leave a swarm"
"unlock:Unlock swarm"
"unlock-key:Manage the unlock key"
"update:Update the swarm"
)
_describe -t docker-swarm-commands "docker swarm command" _docker_swarm_subcommands
}
__docker_swarm_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(init)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--advertise-addr=[Advertised address]:ip\:port: " \
"($help)--data-path-addr=[Data path IP or interface]:ip " \
"($help)--data-path-port=[Data Path Port]:port " \
"($help)--default-addr-pool=[Default address pool]" \
"($help)--default-addr-pool-mask-length=[Default address pool subnet mask length]" \
"($help)--autolock[Enable manager autolocking]" \
"($help)--availability=[Availability of the node]:availability:(active drain pause)" \
"($help)--cert-expiry=[Validity period for node certificates]:duration: " \
"($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \
"($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \
"($help)--force-new-cluster[Force create a new cluster from current state]" \
"($help)--listen-addr=[Listen address]:ip\:port: " \
"($help)--max-snapshots[Number of additional Raft snapshots to retain]" \
"($help)--snapshot-interval[Number of log entries between Raft snapshots]" \
"($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0
;;
(join)
_arguments $(__docker_arguments) -A '-*' \
$opts_help \
"($help)--advertise-addr=[Advertised address]:ip\:port: " \
"($help)--data-path-addr=[Data path IP or interface]:ip " \
"($help)--availability=[Availability of the node]:availability:(active drain pause)" \
"($help)--listen-addr=[Listen address]:ip\:port: " \
"($help)--token=[Token for entry into the swarm]:secret: " \
"($help -):host\:port: " && ret=0
;;
(join-token)
_arguments $(__docker_arguments) \
$opts_help \
"($help -q --quiet)"{-q,--quiet}"[Only display token]" \
"($help)--rotate[Rotate join token]" \
"($help -):role:(manager worker)" && ret=0
;;
(leave)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --force)"{-f,--force}"[Force this node to leave the swarm, ignoring warnings]" && ret=0
;;
(unlock)
_arguments $(__docker_arguments) \
$opts_help && ret=0
;;
(unlock-key)
_arguments $(__docker_arguments) \
$opts_help \
"($help -q --quiet)"{-q,--quiet}"[Only display token]" \
"($help)--rotate[Rotate unlock token]" && ret=0
;;
(update)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--autolock[Enable manager autolocking]" \
"($help)--cert-expiry=[Validity period for node certificates]:duration: " \
"($help)--dispatcher-heartbeat=[Dispatcher heartbeat period]:duration: " \
"($help)*--external-ca=[Specifications of one or more certificate signing endpoints]:endpoint: " \
"($help)--max-snapshots[Number of additional Raft snapshots to retain]" \
"($help)--snapshot-interval[Number of log entries between Raft snapshots]" \
"($help)--task-history-limit=[Task history retention limit]:limit: " && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_network_commands" && ret=0
;;
esac
return ret
}
# EO swarm
# BO system
__docker_system_commands() {
local -a _docker_system_subcommands
_docker_system_subcommands=(
"df:Show docker filesystem usage"
"events:Get real time events from the server"
"info:Display system-wide information"
"prune:Remove unused data"
)
_describe -t docker-system-commands "docker system command" _docker_system_subcommands
}
__docker_system_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(df)
_arguments $(__docker_arguments) \
$opts_help \
"($help -v --verbose)"{-v,--verbose}"[Show detailed information on space usage]" && ret=0
;;
(events)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_events_filter" \
"($help)--since=[Events created since this timestamp]:timestamp: " \
"($help)--until=[Events created until this timestamp]:timestamp: " \
"($help)--format=[Format the output using the given go template]:template: " && ret=0
;;
(info)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0
;;
(prune)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Remove all unused data, not just dangling ones]" \
"($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
"($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" \
"($help)--volumes=[Remove all unused volumes]" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0
;;
esac
return ret
}
# EO system
# BO volume
__docker_volume_complete_ls_filters() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
if compset -P '*='; then
case "${${words[-1]%=*}#*=}" in
(dangling)
dangling_opts=('true' 'false')
_describe -t dangling-filter-opts "Dangling Filter Options" dangling_opts && ret=0
;;
(driver)
__docker_complete_info_plugins Volume && ret=0
;;
(name)
__docker_complete_volumes && ret=0
;;
*)
_message 'value' && ret=0
;;
esac
else
opts=('dangling' 'driver' 'label' 'name')
_describe -t filter-opts "Filter Options" opts -qS "=" && ret=0
fi
return ret
}
__docker_complete_volumes() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a lines volumes
lines=(${(f)${:-"$(_call_program commands docker $docker_options volume ls)"$'\n'}})
# Parse header line to find columns
local i=1 j=1 k header=${lines[1]}
declare -A begin end
while (( j < ${#header} - 1 )); do
i=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 1 ))
j=$(( i + ${${header[$i,-1]}[(i) ]} - 1 ))
k=$(( j + ${${header[$j,-1]}[(i)[^ ]]} - 2 ))
begin[${header[$i,$((j-1))]}]=$i
end[${header[$i,$((j-1))]}]=$k
done
end[${header[$i,$((j-1))]}]=-1
lines=(${lines[2,-1]})
# Names
local line s
for line in $lines; do
s="${line[${begin[VOLUME NAME]},${end[VOLUME NAME]}]%% ##}"
s="$s:${(l:7:: :::)${${line[${begin[DRIVER]},${end[DRIVER]}]}%% ##}}"
volumes=($volumes $s)
done
_describe -t volumes-list "volumes" volumes && ret=0
return ret
}
__docker_volume_commands() {
local -a _docker_volume_subcommands
_docker_volume_subcommands=(
"create:Create a volume"
"inspect:Display detailed information on one or more volumes"
"ls:List volumes"
"prune:Remove all unused volumes"
"rm:Remove one or more volumes"
)
_describe -t docker-volume-commands "docker volume command" _docker_volume_subcommands
}
__docker_volume_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(create)
_arguments $(__docker_arguments) -A '-*' \
$opts_help \
"($help -d --driver)"{-d=,--driver=}"[Volume driver name]:Driver name:(local)" \
"($help)*--label=[Set metadata for a volume]:label=value: " \
"($help)*"{-o=,--opt=}"[Driver specific options]:Driver option: " \
"($help -)1:Volume name: " && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help -)1:volume:__docker_complete_volumes" && ret=0
;;
(ls)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*"{-f=,--filter=}"[Provide filter values]:filter:__docker_volume_complete_ls_filters" \
"($help)--format=[Format the output using the given Go template]:template: " \
"($help -q --quiet)"{-q,--quiet}"[Only display volume names]" && ret=0
;;
(prune)
_arguments $(__docker_arguments) \
$opts_help \
"($help -a --all)"{-a,--all}"[Remove all unused local volumes, not just anonymous ones]" \
"($help)*--filter=[Filter values]:filter:__docker_complete_prune_filters" \
"($help -f --force)"{-f,--force}"[Do not prompt for confirmation]" && ret=0
;;
(rm)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --force)"{-f,--force}"[Force the removal of one or more volumes]" \
"($help -):volume:__docker_complete_volumes" && ret=0
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_volume_commands" && ret=0
;;
esac
return ret
}
# EO volume
# BO context
__docker_complete_contexts() {
[[ $PREFIX = -* ]] && return 1
integer ret=1
declare -a contexts
contexts=(${(f)${:-"$(_call_program commands docker $docker_options context ls -q)"$'\n'}})
_describe -t context-list "context" contexts && ret=0
return ret
}
__docker_context_commands() {
local -a _docker_context_subcommands
_docker_context_subcommands=(
"create:Create new context"
"inspect:Display detailed information on one or more contexts"
"list:List available contexts"
"rm:Remove one or more contexts"
"show:Print the current context"
"update:Update a context"
"use:Set the default context"
)
_describe -t docker-context-commands "docker context command" _docker_context_subcommands
}
__docker_context_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(create)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--description=[Description of the context]:description:" \
"($help)--docker=[Set the docker endpoint]:docker:" \
"($help)--from=[Create context from a named context]:from:__docker_complete_contexts" \
"($help -):name: " && ret=0
;;
(use)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)1:context:__docker_complete_contexts" && ret=0
;;
(inspect)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)1:context:__docker_complete_contexts" && ret=0
;;
(rm)
_arguments $(__docker_arguments) \
$opts_help \
"($help -)1:context:__docker_complete_contexts" && ret=0
;;
(update)
_arguments $(__docker_arguments) \
$opts_help \
"($help)--description=[Description of the context]:description:" \
"($help)--docker=[Set the docker endpoint]:docker:" \
"($help -):name:" && ret=0
;;
esac
return ret
}
# EO context
__docker_caching_policy() {
oldp=( "$1"(Nmh+1) ) # 1 hour
(( $#oldp ))
}
__docker_commands() {
local cache_policy
integer force_invalidation=0
zstyle -s ":completion:${curcontext}:" cache-policy cache_policy
if [[ -z "$cache_policy" ]]; then
zstyle ":completion:${curcontext}:" cache-policy __docker_caching_policy
fi
if ( (( ! ${+_docker_hide_legacy_commands} )) || _cache_invalid docker_hide_legacy_commands ) \
&& ! _retrieve_cache docker_hide_legacy_commands;
then
_docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}"
_store_cache docker_hide_legacy_commands _docker_hide_legacy_commands
fi
if [[ "${_docker_hide_legacy_commands}" != "${DOCKER_HIDE_LEGACY_COMMANDS}" ]]; then
force_invalidation=1
_docker_hide_legacy_commands="${DOCKER_HIDE_LEGACY_COMMANDS}"
_store_cache docker_hide_legacy_commands _docker_hide_legacy_commands
fi
if ( [[ ${+_docker_subcommands} -eq 0 ]] || _cache_invalid docker_subcommands ) \
&& ! _retrieve_cache docker_subcommands || [[ ${force_invalidation} -eq 1 ]];
then
local -a lines
lines=(${(f)"$(_call_program commands docker 2>&1)"})
_docker_subcommands=(${${${(M)${lines[$((${lines[(i)*Commands:]} + 1)),-1]}:# *}## #}/\*# ##/:})
_docker_subcommands=($_docker_subcommands 'daemon:Enable daemon mode' 'help:Show help for a command')
(( $#_docker_subcommands > 2 )) && _store_cache docker_subcommands _docker_subcommands
fi
_describe -t docker-commands "docker command" _docker_subcommands
}
__docker_subcommand() {
local -a _command_args opts_help
local expl help="--help"
integer ret=1
opts_help=("(: -)--help[Print usage]")
case "$words[1]" in
(attach|commit|cp|create|diff|exec|export|kill|logs|pause|unpause|port|rename|restart|rm|run|start|stats|stop|top|update|wait)
__docker_container_subcommand && ret=0
;;
(build|history|import|load|pull|push|save|tag)
__docker_image_subcommand && ret=0
;;
(checkpoint)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_checkpoint_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_checkpoint_subcommand && ret=0
;;
esac
;;
(container)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_container_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_container_subcommand && ret=0
;;
esac
;;
(context)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_context_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_context_subcommand && ret=0
;;
esac
;;
(daemon)
_arguments $(__docker_arguments) \
$opts_help \
"($help)*--add-runtime=[Register an additional OCI compatible runtime]:runtime:__docker_complete_runtimes" \
"($help)*--allow-nondistributable-artifacts=[Push nondistributable artifacts to specified registries]:registry: " \
"($help)--api-cors-header=[CORS headers in the Engine API]:CORS headers: " \
"($help)*--authorization-plugin=[Authorization plugins to load]" \
"($help -b --bridge)"{-b=,--bridge=}"[Attach containers to a network bridge]:bridge:_net_interfaces" \
"($help)--bip=[Network bridge IP]:IP address: " \
"($help)--cgroup-parent=[Parent cgroup for all containers]:cgroup: " \
"($help)--config-file=[Path to daemon configuration file]:Config File:_files" \
"($help)--containerd=[Path to containerd socket]:socket:_files -g \"*.sock\"" \
"($help)--containerd-namespace=[Containerd namespace to use]:containerd namespace:" \
"($help)--containerd-plugins-namespace=[Containerd namespace to use for plugins]:containerd namespace:" \
"($help)--data-root=[Root directory of persisted Docker data]:path:_directories" \
"($help -D --debug)"{-D,--debug}"[Enable debug mode]" \
"($help)--default-gateway[Container default gateway IPv4 address]:IPv4 address: " \
"($help)--default-gateway-v6[Container default gateway IPv6 address]:IPv6 address: " \
"($help)--default-shm-size=[Default shm size for containers]:size:" \
"($help)*--default-ulimit=[Default ulimits for containers]:ulimit: " \
"($help)*--dns=[DNS server to use]:DNS: " \
"($help)*--dns-opt=[DNS options to use]:DNS option: " \
"($help)*--dns-search=[DNS search domains to use]:DNS search: " \
"($help)*--exec-opt=[Runtime execution options]:runtime execution options: " \
"($help)--exec-root=[Root directory for execution state files]:path:_directories" \
"($help)--experimental[Enable experimental features]" \
"($help)--fixed-cidr=[IPv4 subnet for fixed IPs]:IPv4 subnet: " \
"($help)--fixed-cidr-v6=[IPv6 subnet for fixed IPs]:IPv6 subnet: " \
"($help -G --group)"{-G=,--group=}"[Group for the unix socket]:group:_groups" \
"($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \
"($help)--icc[Enable inter-container communication]" \
"($help)--init[Run an init inside containers to forward signals and reap processes]" \
"($help)--init-path=[Path to the docker-init binary]:docker-init binary:_files" \
"($help)*--insecure-registry=[Enable insecure registry communication]:registry: " \
"($help)--ip=[Default IP when binding container ports]" \
"($help)--ip-forward[Enable net.ipv4.ip_forward]" \
"($help)--ip-masq[Enable IP masquerading]" \
"($help)--iptables[Enable addition of iptables rules]" \
"($help)--ipv6[Enable IPv6 networking]" \
"($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \
"($help)*--label=[Key=value labels]:label: " \
"($help)--live-restore[Enable live restore of docker when containers are still running]" \
"($help)--log-driver=[Default driver for container logs]:logging driver:__docker_complete_log_drivers" \
"($help)*--log-opt=[Default log driver options for containers]:log driver options:__docker_complete_log_options" \
"($help)--max-concurrent-downloads[Set the max concurrent downloads]" \
"($help)--max-concurrent-uploads[Set the max concurrent uploads]" \
"($help)--max-download-attempts[Set the max download attempts for each pull]" \
"($help)--mtu=[Network MTU]:mtu:(0 576 1420 1500 9000)" \
"($help)--oom-score-adjust=[Set the oom_score_adj for the daemon]:oom-score:(-500)" \
"($help -p --pidfile)"{-p=,--pidfile=}"[Path to use for daemon PID file]:PID file:_files" \
"($help)--raw-logs[Full timestamps without ANSI coloring]" \
"($help)*--registry-mirror=[Preferred registry mirror]:registry mirror: " \
"($help)--seccomp-profile=[Path to seccomp profile]:path:_files -g \"*.json\"" \
"($help -s --storage-driver)"{-s=,--storage-driver=}"[Storage driver to use]:driver:(btrfs devicemapper overlay2 vfs zfs)" \
"($help)--selinux-enabled[Enable selinux support]" \
"($help)--shutdown-timeout=[Set the shutdown timeout value in seconds]:time: " \
"($help)*--storage-opt=[Storage driver options]:storage driver options: " \
"($help)--tls[Use TLS]" \
"($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g \"*.(pem|crt)\"" \
"($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g \"*.(pem|crt)\"" \
"($help)--tlskey=[Path to TLS key file]:Key file:_files -g \"*.(pem|key)\"" \
"($help)--tlsverify[Use TLS and verify the remote]" \
"($help)--userns-remap=[User/Group setting for user namespaces]:user\:group:->users-groups" \
"($help)--userland-proxy[Use userland proxy for loopback traffic]" \
"($help)--userland-proxy-path=[Path to the userland proxy binary]:binary:_files" \
"($help)--validate[Validate daemon configuration and exit]" && ret=0
case $state in
(users-groups)
if compset -P '*:'; then
_groups && ret=0
else
_describe -t userns-default "default Docker user management" '(default)' && ret=0
_users && ret=0
fi
;;
esac
;;
(events|info)
__docker_system_subcommand && ret=0
;;
(image)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_image_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_image_subcommand && ret=0
;;
esac
;;
(images)
words[1]='ls'
__docker_image_subcommand && ret=0
;;
(inspect)
local state
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " \
"($help -s --size)"{-s,--size}"[Display total file sizes if the type is container]" \
"($help)--type=[Return JSON for specified type]:type:(container image network node plugin service volume)" \
"($help -)*: :->values" && ret=0
case $state in
(values)
if [[ ${words[(r)--type=container]} == --type=container ]]; then
__docker_complete_containers && ret=0
elif [[ ${words[(r)--type=image]} == --type=image ]]; then
__docker_complete_images && ret=0
elif [[ ${words[(r)--type=network]} == --type=network ]]; then
__docker_complete_networks && ret=0
elif [[ ${words[(r)--type=node]} == --type=node ]]; then
__docker_complete_nodes && ret=0
elif [[ ${words[(r)--type=plugin]} == --type=plugin ]]; then
__docker_complete_plugins && ret=0
elif [[ ${words[(r)--type=service]} == --type=secrets ]]; then
__docker_complete_secrets && ret=0
elif [[ ${words[(r)--type=service]} == --type=service ]]; then
__docker_complete_services && ret=0
elif [[ ${words[(r)--type=volume]} == --type=volume ]]; then
__docker_complete_volumes && ret=0
else
__docker_complete_containers
__docker_complete_images
__docker_complete_networks
__docker_complete_nodes
__docker_complete_plugins
__docker_complete_secrets
__docker_complete_services
__docker_complete_volumes && ret=0
fi
;;
esac
;;
(login)
_arguments $(__docker_arguments) -A '-*' \
$opts_help \
"($help -p --password)"{-p=,--password=}"[Password]:password: " \
"($help)--password-stdin[Read password from stdin]" \
"($help -u --username)"{-u=,--username=}"[Username]:username: " \
"($help -)1:server: " && ret=0
;;
(logout)
_arguments $(__docker_arguments) -A '-*' \
$opts_help \
"($help -)1:server: " && ret=0
;;
(network)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_network_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_network_subcommand && ret=0
;;
esac
;;
(node)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_node_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_node_subcommand && ret=0
;;
esac
;;
(plugin)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_plugin_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_plugin_subcommand && ret=0
;;
esac
;;
(ps)
words[1]='ls'
__docker_container_subcommand && ret=0
;;
(rmi)
words[1]='rm'
__docker_image_subcommand && ret=0
;;
(search)
_arguments $(__docker_arguments) -A '-*' \
$opts_help \
"($help)*"{-f=,--filter=}"[Filter values]:filter:__docker_complete_search_filters" \
"($help)--limit=[Maximum returned search results]:limit:(1 5 10 25 50)" \
"($help)--no-trunc[Do not truncate output]" \
"($help -):term: " && ret=0
;;
(secret)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_secret_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_secret_subcommand && ret=0
;;
esac
;;
(service)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_service_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_service_subcommand && ret=0
;;
esac
;;
(stack)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_stack_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_stack_subcommand && ret=0
;;
esac
;;
(swarm)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_swarm_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_swarm_subcommand && ret=0
;;
esac
;;
(system)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_system_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_system_subcommand && ret=0
;;
esac
;;
(version)
_arguments $(__docker_arguments) \
$opts_help \
"($help -f --format)"{-f=,--format=}"[Format the output using the given go template]:template: " && ret=0
;;
(volume)
local curcontext="$curcontext" state
_arguments $(__docker_arguments) \
$opts_help \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
case $state in
(command)
__docker_volume_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-${words[-1]}:
__docker_volume_subcommand && ret=0
;;
esac
;;
(help)
_arguments $(__docker_arguments) ":subcommand:__docker_commands" && ret=0
;;
esac
return ret
}
_docker() {
# Support for subservices, which allows for `compdef _docker docker-shell=_docker_containers`.
# Based on /usr/share/zsh/functions/Completion/Unix/_git without support for `ret`.
if [[ $service != docker ]]; then
_call_function - _$service
return
fi
local curcontext="$curcontext" state line help="-h --help"
integer ret=1
typeset -A opt_args
_arguments $(__docker_arguments) -C \
"(: -)"{-h,--help}"[Print usage]" \
"($help)--config[Location of client config files]:path:_directories" \
"($help -c --context)"{-c=,--context=}"[Execute the command in a docker context]:context:__docker_complete_contexts" \
"($help -D --debug)"{-D,--debug}"[Enable debug mode]" \
"($help -H --host)"{-H=,--host=}"[tcp://host:port to bind/connect to]:host: " \
"($help -l --log-level)"{-l=,--log-level=}"[Logging level]:level:(debug info warn error fatal)" \
"($help)--tls[Use TLS]" \
"($help)--tlscacert=[Trust certs signed only by this CA]:PEM file:_files -g "*.(pem|crt)"" \
"($help)--tlscert=[Path to TLS certificate file]:PEM file:_files -g "*.(pem|crt)"" \
"($help)--tlskey=[Path to TLS key file]:Key file:_files -g "*.(pem|key)"" \
"($help)--tlsverify[Use TLS and verify the remote]" \
"($help)--userland-proxy[Use userland proxy for loopback traffic]" \
"($help -v --version)"{-v,--version}"[Print version information and quit]" \
"($help -): :->command" \
"($help -)*:: :->option-or-argument" && ret=0
local host=${opt_args[-H]}${opt_args[--host]}
local config=${opt_args[--config]}
local context=${opt_args[-c]}${opt_args[--context]}
local docker_options="${host:+--host $host} ${config:+--config $config} ${context:+--context $context} "
case $state in
(command)
__docker_commands && ret=0
;;
(option-or-argument)
curcontext=${curcontext%:*:*}:docker-$words[1]:
__docker_subcommand && ret=0
;;
esac
return ret
}
_dockerd() {
integer ret=1
words[1]='daemon'
__docker_subcommand && ret=0
return ret
}
_docker "$@"
# Local Variables:
# mode: Shell-Script
# sh-indentation: 4
# indent-tabs-mode: nil
# sh-basic-offset: 4
# End:
# vim: ft=zsh sw=4 ts=4 et

View File

@ -0,0 +1,62 @@
alias dbl='docker build'
alias dcin='docker container inspect'
alias dcls='docker container ls'
alias dclsa='docker container ls -a'
alias dib='docker image build'
alias dii='docker image inspect'
alias dils='docker image ls'
alias dipu='docker image push'
alias dirm='docker image rm'
alias dit='docker image tag'
alias dlo='docker container logs'
alias dnc='docker network create'
alias dncn='docker network connect'
alias dndcn='docker network disconnect'
alias dni='docker network inspect'
alias dnls='docker network ls'
alias dnrm='docker network rm'
alias dpo='docker container port'
alias dpu='docker pull'
alias dr='docker container run'
alias drit='docker container run -it'
alias drm='docker container rm'
alias 'drm!'='docker container rm -f'
alias dst='docker container start'
alias drs='docker container restart'
alias dsta='docker stop $(docker ps -q)'
alias dstp='docker container stop'
alias dtop='docker top'
alias dvi='docker volume inspect'
alias dvls='docker volume ls'
alias dvprune='docker volume prune'
alias dxc='docker container exec'
alias dxcit='docker container exec -it'
if (( ! $+commands[docker] )); then
return
fi
# Standarized $0 handling
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
# If the completion file doesn't exist yet, we need to autoload it and
# bind it to `docker`. Otherwise, compinit will have already done that.
if [[ ! -f "$ZSH_CACHE_DIR/completions/_docker" ]]; then
typeset -g -A _comps
autoload -Uz _docker
_comps[docker]=_docker
fi
{
# `docker completion` is only available from 23.0.0 on
# docker version returns `Docker version 24.0.2, build cb74dfcd85`
# with `s:,:` remove the comma after the version, and select third word of it
if zstyle -t ':omz:plugins:docker' legacy-completion || \
! is-at-least 23.0.0 ${${(s:,:z)"$(command docker --version)"}[3]}; then
command cp "${0:h}/completions/_docker" "$ZSH_CACHE_DIR/completions/_docker"
else
command docker completion zsh | tee "$ZSH_CACHE_DIR/completions/_docker" > /dev/null
fi
} &|

View File

@ -0,0 +1,9 @@
# Doctl
This plugin provides completion for [Doctl](https://github.com/digitalocean/doctl).
To use it add doctl to the plugins array in your zshrc file.
```bash
plugins=(... doctl)
```

View File

@ -0,0 +1,17 @@
# Autocompletion for doctl, the command line tool for DigitalOcean service
#
# doctl project: https://github.com/digitalocean/doctl
#
# Author: https://github.com/HalisCz
if (( ! $+commands[doctl] )); then
return
fi
if [[ ! -f "$ZSH_CACHE_DIR/completions/_doctl" ]]; then
typeset -g -A _comps
autoload -Uz _doctl
_comps[doctl]=_doctl
fi
doctl completion zsh >| "$ZSH_CACHE_DIR/completions/_doctl" &|

View File

@ -0,0 +1,92 @@
# dotenv
Automatically load your project ENV variables from `.env` file when you `cd` into project root directory.
Storing configuration in the environment is one of the tenets of a [twelve-factor app](https://www.12factor.net). Anything that is likely to change between deployment environments, such as resource handles for databases or credentials for external services, should be extracted from the code into environment variables.
To use it, add `dotenv` to the plugins array in your zshrc file:
```sh
plugins=(... dotenv)
```
## Usage
Create `.env` file inside your project root directory and put your ENV variables there.
For example:
```sh
export AWS_S3_TOKEN=d84a83539134f28f412c652b09f9f98eff96c9a
export SECRET_KEY=7c6c72d959416d5aa368a409362ec6e2ac90d7f
export MONGO_URI=mongodb://127.0.0.1:27017
export PORT=3001
```
`export` is optional. This format works as well:
```sh
AWS_S3_TOKEN=d84a83539134f28f412c652b09f9f98eff96c9a
SECRET_KEY=7c6c72d959416d5aa368a409362ec6e2ac90d7f
MONGO_URI=mongodb://127.0.0.1:27017
PORT=3001
```
You can even mix both formats, although it's probably a bad idea.
## Settings
### ZSH_DOTENV_FILE
You can also modify the name of the file to be loaded with the variable `ZSH_DOTENV_FILE`.
If the variable isn't set, the plugin will default to use `.env`.
For example, this will make the plugin look for files named `.dotenv` and load them:
```zsh
# in ~/.zshrc, before Oh My Zsh is sourced:
ZSH_DOTENV_FILE=.dotenv
```
### ZSH_DOTENV_PROMPT
Set `ZSH_DOTENV_PROMPT=false` in your zshrc file if you don't want the confirmation message.
You can also choose the `Always` option when prompted to always allow sourcing the .env file
in that directory. See the next section for more details.
### ZSH_DOTENV_ALLOWED_LIST, ZSH_DOTENV_DISALLOWED_LIST
The default behavior of the plugin is to always ask whether to source a dotenv file. There's
a **Y**es, **N**o, **A**lways and N**e**ver option. If you choose Always, the directory of the .env file
will be added to an allowed list; if you choose Never, it will be added to a disallowed list.
If a directory is found in either of those lists, the plugin won't ask for confirmation and will
instead either source the .env file or proceed without action respectively.
The allowed and disallowed lists are saved by default in `$ZSH_CACHE_DIR/dotenv-allowed.list` and
`$ZSH_CACHE_DIR/dotenv-disallowed.list` respectively. If you want to change that location,
change the `$ZSH_DOTENV_ALLOWED_LIST` and `$ZSH_DOTENV_DISALLOWED_LIST` variables, like so:
```zsh
# in ~/.zshrc, before Oh My Zsh is sourced:
ZSH_DOTENV_ALLOWED_LIST=/path/to/dotenv/allowed/list
ZSH_DOTENV_DISALLOWED_LIST=/path/to/dotenv/disallowed/list
```
The file is just a list of directories, separated by a newline character. If you want
to change your decision, just edit the file and remove the line for the directory you want to
change.
NOTE: if a directory is found in both the allowed and disallowed lists, the disallowed list
takes preference, _i.e._ the .env file will never be sourced.
## Version Control
**It's strongly recommended to add `.env` file to `.gitignore`**, because usually it contains sensitive information such as your credentials, secret keys, passwords etc. You don't want to commit this file, it's supposed to be local only.
## Disclaimer
This plugin only sources the `.env` file. Nothing less, nothing more. It doesn't do any checks. It's designed to be the fastest and simplest option. You're responsible for the `.env` file content. You can put some code (or weird symbols) there, but do it on your own risk. `dotenv` is the basic tool, yet it does the job.
If you need more advanced and feature-rich ENV management, check out these awesome projects:
* [direnv](https://github.com/direnv/direnv)
* [zsh-autoenv](https://github.com/Tarrasch/zsh-autoenv)

View File

@ -0,0 +1,67 @@
## Settings
# Filename of the dotenv file to look for
: ${ZSH_DOTENV_FILE:=.env}
# Path to the file containing allowed paths
: ${ZSH_DOTENV_ALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-allowed.list"}
: ${ZSH_DOTENV_DISALLOWED_LIST:="${ZSH_CACHE_DIR:-$ZSH/cache}/dotenv-disallowed.list"}
## Functions
source_env() {
if [[ ! -f "$ZSH_DOTENV_FILE" ]]; then
return
fi
if [[ "$ZSH_DOTENV_PROMPT" != false ]]; then
local confirmation dirpath="${PWD:A}"
# make sure there is an (dis-)allowed file
touch "$ZSH_DOTENV_ALLOWED_LIST"
touch "$ZSH_DOTENV_DISALLOWED_LIST"
# early return if disallowed
if command grep -Fx -q "$dirpath" "$ZSH_DOTENV_DISALLOWED_LIST" &>/dev/null; then
return
fi
# check if current directory's .env file is allowed or ask for confirmation
if ! command grep -Fx -q "$dirpath" "$ZSH_DOTENV_ALLOWED_LIST" &>/dev/null; then
# get cursor column and print new line before prompt if not at line beginning
local column
echo -ne "\e[6n" > /dev/tty
read -t 1 -s -d R column < /dev/tty
column="${column##*\[*;}"
[[ $column -eq 1 ]] || echo
# print same-line prompt and output newline character if necessary
echo -n "dotenv: found '$ZSH_DOTENV_FILE' file. Source it? ([Y]es/[n]o/[a]lways/n[e]ver) "
read -k 1 confirmation
[[ "$confirmation" = $'\n' ]] || echo
# check input
case "$confirmation" in
[nN]) return ;;
[aA]) echo "$dirpath" >> "$ZSH_DOTENV_ALLOWED_LIST" ;;
[eE]) echo "$dirpath" >> "$ZSH_DOTENV_DISALLOWED_LIST"; return ;;
*) ;; # interpret anything else as a yes
esac
fi
fi
# test .env syntax
zsh -fn $ZSH_DOTENV_FILE || {
echo "dotenv: error when sourcing '$ZSH_DOTENV_FILE' file" >&2
return 1
}
setopt localoptions allexport
source $ZSH_DOTENV_FILE
}
autoload -U add-zsh-hook
add-zsh-hook chpwd source_env
source_env

View File

@ -0,0 +1,25 @@
# .NET Core CLI plugin
This plugin provides completion and useful aliases for [.NET Core CLI](https://dotnet.microsoft.com/).
To use it, add `dotnet` to the plugins array in your zshrc file.
```
plugins=(... dotnet)
```
## Aliases
| Alias | Command | Description |
|-------|------------------|-------------------------------------------------------------------|
| dn | dotnet new | Create a new .NET project or file. |
| dr | dotnet run | Build and run a .NET project output. |
| dt | dotnet test | Run unit tests using the test runner specified in a .NET project. |
| dw | dotnet watch | Watch for source file changes and restart the dotnet command. |
| dwr | dotnet watch run | Watch for source file changes and restart the `run` command. |
| dwt | dotnet watch test| Watch for source file changes and restart the `test` command. |
| ds | dotnet sln | Modify Visual Studio solution files. |
| da | dotnet add | Add a package or reference to a .NET project. |
| dp | dotnet pack | Create a NuGet package. |
| dng | dotnet nuget | Provides additional NuGet commands. |
| db | dotnet build | Build a .NET project |

View File

@ -0,0 +1,26 @@
# This scripts is copied from (MIT License):
# https://raw.githubusercontent.com/dotnet/sdk/main/scripts/register-completions.zsh
#compdef dotnet
_dotnet_completion() {
local -a completions=("${(@f)$(dotnet complete "${words}")}")
compadd -a completions
_files
}
compdef _dotnet_completion dotnet
# Aliases bellow are here for backwards compatibility
# added by Shaun Tabone (https://github.com/xontab)
alias dn='dotnet new'
alias dr='dotnet run'
alias dt='dotnet test'
alias dw='dotnet watch'
alias dwr='dotnet watch run'
alias dwt='dotnet watch test'
alias ds='dotnet sln'
alias da='dotnet add'
alias dp='dotnet pack'
alias dng='dotnet nuget'
alias db='dotnet build'

View File

@ -0,0 +1,19 @@
# droplr
Use [Droplr](https://droplr.com/) from the command line to upload files and shorten
links. It needs to have [Droplr.app](https://droplr.com/apps) installed and logged
in. MacOS only.
To use it, add `droplr` to the `$plugins` variable in your zshrc file:
```zsh
plugins=(... droplr)
```
Author: [Fabio Fernandes](https://github.com/fabiofl)
## Examples
- Upload a file: `droplr ./path/to/file/`
- Shorten a link: `droplr https://example.com`

View File

@ -0,0 +1,15 @@
# Only compatible with MacOS
[[ "$OSTYPE" == darwin* ]] || return
droplr() {
if [[ $# -eq 0 ]]; then
echo You need to specify a parameter. >&2
return 1
fi
if [[ "$1" =~ ^https?:// ]]; then
osascript -e 'tell app "Droplr" to shorten "'"$1"'"'
else
open -ga /Applications/Droplr.app "$1"
fi
}

View File

@ -0,0 +1,66 @@
# Drush
This plugin adds aliases and functions for [Drush](https://www.drush.org), a command-line shell
and Unix scripting interface for Drupal. It also adds completion for the `drush` command.
To enable it, add `drush` to the plugins array in zshrc file:
```zsh
plugins=(... drush)
```
## Aliases
| Alias | Command | Description |
| ------- | ----------------------------------------------------------- | -------------------------------------------------------------------- |
| `dr` | `drush` | Display drush help |
| `drca` | `drush cc all` | _(Deprecated in Drush 8)_ Clear all drupal caches |
| `drcb` | `drush cc block` | _(Deprecated in Drush 8)_ Clear block cache |
| `drcex` | `drush config:export -y` | Export Drupal configuration to a directory |
| `drcg` | `drush cc registry` | _(Deprecated in Drush 8)_ Clear registry cache |
| `drcim` | `drush config:import -y` | Import config from a config directory |
| `drcj` | `drush cc css-js` | Clear css-js cache |
| `drcm` | `drush cc menu` | Clear menu cache |
| `drcml` | `drush cc module-list` | Clear module-list cache |
| `drcr` | `drush core-cron` | Run all cron hooks in all active modules for specified site |
| `drct` | `drush cc theme-registry` | Clear theme-registry cache |
| `drcv` | `drush cc views` | Clear views cache _(make sure that the views module is enabled)_ |
| `drdmp` | `drush drush sql-dump --ordered-dump --result-file=dumpsql` | Backup database in a new dump.sql file |
| `drf` | `drush features` | Display features status |
| `drfr` | `drush features-revert -y` | Revert a feature module on your site |
| `drfra` | `drush features-revert-all` | Revert all enabled feature module on your site |
| `drfu` | `drush features-update -y` | Update a feature module on your site |
| `drif` | `drush image-flush --all` | Flush all derived images |
| `drpm` | `drush pm-list --type=module` | Show a list of available modules |
| `drst` | `drush core-status` | Provides a birds-eye view of the current Drupal installation, if any |
| `druli` | `drush user:login` | Display a one time login link for user ID 1, or another user |
| `drup` | `drush updatedb` | Apply any database updates required (as with running update.php) |
| `drups` | `drush updatedb-status` | List any pending database updates |
| `drv` | `drush version` | Show drush version |
| `drvd` | `drush variable-del` | Delete a variable |
| `drvg` | `drush variable-get` | Get a list of some or all site variables and values |
| `drvs` | `drush variable-set` | Set a variable |
| `drws` | `drush watchdog:show` | Show watchdog messages |
| `drwse` | `drush watchdog:show --extended` | Show watchdog messages with extended information |
| `drwst` | `drush watchdog:tail` | Tail watchdog messages |
## Functions
- `dren`: download and enable one or more extensions (modules or themes). Must be
invoked with one or more parameters, e.g.: `dren devel` or `dren devel module_filter views`.
- `drf`: edit drushrc, site alias, and Drupal settings.php files.
Can be invoked with one or without parameters, e.g.: `drf 1`.
- `dris`: disable one or more extensions (modules or themes). Must be invoked with
one or more parameters, e.g.: `dris devel` or `dris devel module_filter views`.
- `drpu`: uninstall one or more modules. Must be invoked with one or more
parameters, e.g.: `drpu devel` or `drpu devel module_filter views`.
- `drnew`: creates a brand new drupal website. Note: as soon as the installation
is complete, `drush` will print a username and a random password into the terminal:
```text
Installation complete. User name: admin User password: cf7t8yqNEm
```

View File

@ -0,0 +1,50 @@
# BASH completion script for Drush.
#
# Place this in your /etc/bash_completion.d/ directory or source it from your
# ~/.bash_completion or ~/.bash_profile files. Alternatively, source
# examples/example.bashrc instead, as it will automatically find and source
# this file.
#
# If you're using ZSH instead of BASH, add the following to your ~/.zshrc file
# and source it.
#
# autoload bashcompinit
# bashcompinit
# source /path/to/your/drush.complete.sh
# Ensure drush is available.
which drush > /dev/null || alias drush &> /dev/null || return
__drush_ps1() {
f="${TMPDIR:-/tmp/}/drush-env-${USER}/drush-drupal-site-$$"
if [ -f $f ]
then
__DRUPAL_SITE=$(cat "$f")
else
__DRUPAL_SITE="$DRUPAL_SITE"
fi
# Set DRUSH_PS1_SHOWCOLORHINTS to a non-empty value and define a
# __drush_ps1_colorize_alias() function for color hints in your Drush PS1
# prompt. See example.prompt.sh for an example implementation.
if [ -n "${__DRUPAL_SITE-}" ] && [ -n "${DRUSH_PS1_SHOWCOLORHINTS-}" ]; then
__drush_ps1_colorize_alias
fi
[[ -n "$__DRUPAL_SITE" ]] && printf "${1:- (%s)}" "$__DRUPAL_SITE"
}
# Completion function, uses the "drush complete" command to retrieve
# completions for a specific command line COMP_WORDS.
_drush_completion() {
# Set IFS to newline (locally), since we only use newline separators, and
# need to retain spaces (or not) after completions.
local IFS=$'\n'
# The '< /dev/null' is a work around for a bug in php libedit stdin handling.
# Note that libedit in place of libreadline in some distributions. See:
# https://bugs.launchpad.net/ubuntu/+source/php5/+bug/322214
COMPREPLY=( $(drush --early=includes/complete.inc "${COMP_WORDS[@]}" < /dev/null 2> /dev/null) )
}
# Register our completion function. We include common short aliases for Drush.
complete -o bashdefault -o default -o nospace -F _drush_completion d dr drush drush5 drush6 drush7 drush8 drush.php

View File

@ -0,0 +1,107 @@
# Functions
function dren() {
drush en "$@" -y
}
function dris() {
drush pm-disable "$@" -y
}
function drpu() {
drush pm-uninstall "$@" -y
}
function drf() {
if [[ -z "$1" ]] then
drush core-config
else
drush core-config --choice=$1
fi
}
function drfi() {
case "$1" in
fields) drush field-info fields ;;
types) drush field-info types ;;
*) drush field-info ;;
esac
}
function drnew() {
(
cd
echo "Website's name: "
read WEBSITE_NAME
HOST=http://$(hostname -i)/
if [[ $WEBSITE_NAME == "" ]] then
MINUTES=$(date +%M:%S)
WEBSITE_NAME="Drupal-$MINUTES"
echo "Your website will be named: $WEBSITE_NAME"
fi
drush dl drupal --drupal-project-rename=$WEBSITE_NAME
echo "Type your localhost directory: (Leave empty for /var/www/html/)"
read DIRECTORY
if [[ $DIRECTORY == "" ]] then
DIRECTORY="/var/www/html/"
fi
echo "Moving to $DIRECTORY$WEBSITE_NAME"
sudo mv $WEBSITE_NAME $DIRECTORY
cd $DIRECTORY$WEBSITE_NAME
echo "Database's user: "
read DATABASE_USR
echo "Database's password: "
read -s DATABASE_PWD
echo "Database's name for your project: "
read DATABASE
DB_URL="mysql://$DATABASE_USR:$DATABASE_PWD@localhost/$DATABASE"
drush site-install standard --db-url=$DB_URL --site-name=$WEBSITE_NAME
open_command $HOST$WEBSITE_NAME
echo "Done"
)
}
# Aliases
alias dr="drush"
alias drca="drush cc all" # Deprecated for Drush 8
alias drcb="drush cc block" # Deprecated for Drush 8
alias drcex="drush config:export -y"
alias drcg="drush cc registry" # Deprecated for Drush 8
alias drcim="drush config:import -y"
alias drcj="drush cc css-js"
alias drcm="drush cc menu"
alias drcml="drush cc module-list"
alias drcr="drush core-cron"
alias drct="drush cc theme-registry"
alias drcv="drush cc views"
alias drdmp="drush sql-dump --ordered-dump --result-file=dump.sql"
alias drf="drush features"
alias drfr="drush features-revert -y"
alias drfra="drush features-revert-all"
alias drfu="drush features-update -y"
alias drif="drush image-flush --all"
alias drpm="drush pm-list --type=module"
alias drst="drush core-status"
alias druli="drush user:login"
alias drup="drush updatedb"
alias drups="drush updatedb-status"
alias drv="drush version"
alias drvd="drush variable-del"
alias drvg="drush variable-get"
alias drvs="drush variable-set"
alias drws="drush watchdog:show"
alias drwse="drush watchdog:show --extended"
alias drwst="drush watchdog:tail"
# Enable drush autocomplete support
autoload bashcompinit
bashcompinit
source $(dirname $0)/drush.complete.sh

View File

@ -0,0 +1,11 @@
# eecms plugin
This plugin adds auto-completion of console commands for [`eecms`](https://github.com/ExpressionEngine/ExpressionEngine).
To use it, add `eecms` to the plugins array of your `.zshrc` file:
```
plugins=(... eecms)
```
It also adds the alias `eecms` which finds the eecms file in the current project
and runs it with php.

View File

@ -0,0 +1,20 @@
# ExpressionEngine CMS basic command completion
_eecms_console () {
echo "php $(find . -maxdepth 3 -mindepth 1 -name 'eecms' -type f | head -n 1)"
}
_eecms_get_command_list () {
`_eecms_console` | sed "/Available commands/,/^/d" | sed "s/[[:space:]].*//g"
}
_eecms () {
compadd `_eecms_get_command_list`
}
compdef _eecms '`_eecms_console`'
compdef _eecms 'system/ee/eecms'
compdef _eecms eecms
#Alias
alias eecms='`_eecms_console`'

View File

@ -0,0 +1,30 @@
# Emacs plugin
This plugin utilizes the Emacs daemon capability, allowing the user to quickly open frames, whether they are opened in a terminal via a ssh connection, or X frames opened on the same host. The plugin also provides some aliases for such operations.
- You don't have the cost of starting Emacs all the time anymore
- Opening a file is as fast as Emacs does not have anything else to do.
- You can share opened buffered across opened frames.
- Configuration changes made at runtime are applied to all frames.
**NOTE:** requires Emacs 24 and newer.
To use it, add emacs to the plugins array in your zshrc file:
```zsh
plugins=(... emacs)
```
## Aliases
The plugin uses a custom launcher (which we'll call here `$EMACS_LAUNCHER`) that is just a wrapper around [`emacsclient`](https://www.emacswiki.org/emacs/EmacsClient).
| Alias | Command | Description |
|--------|----------------------------------------------------|----------------------------------------------------------------|
| emacs | `$EMACS_LAUNCHER --no-wait` | Opens a temporary emacsclient frame |
| e | `emacs` | Same as emacs alias |
| te | `$EMACS_LAUNCHER -nw` | Open terminal emacsclient |
| eeval | `$EMACS_LAUNCHER --eval` | Same as `M-x eval` but from outside Emacs |
| eframe | `emacsclient --alternate-editor="" --create-frame` | Create new X frame |
| efile | - | Print the path to the file open in the current buffer |
| ecd | - | Print the directory of the file open in the the current buffer |

View File

@ -0,0 +1,68 @@
# Emacs 23 daemon capability is a killing feature.
# One emacs process handles all your frames whether
# you use a frame opened in a terminal via a ssh connection or X frames
# opened on the same host.
# Benefits are multiple
# - You don't have the cost of starting Emacs all the time anymore
# - Opening a file is as fast as Emacs does not have anything else to do.
# - You can share opened buffered across opened frames.
# - Configuration changes made at runtime are applied to all frames.
# Require emacs version to be minimum 24
autoload -Uz is-at-least
is-at-least 24 "${${(Az)"$(emacsclient --version 2>/dev/null)"}[2]}" || return 0
# Handle $0 according to the standard:
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
# Path to custom emacsclient launcher
export EMACS_PLUGIN_LAUNCHER="${0:A:h}/emacsclient.sh"
# set EDITOR if not already defined.
export EDITOR="${EDITOR:-${EMACS_PLUGIN_LAUNCHER}}"
alias emacs="$EMACS_PLUGIN_LAUNCHER --no-wait"
alias e=emacs
# open terminal emacsclient
alias te="$EMACS_PLUGIN_LAUNCHER -nw"
# same than M-x eval but from outside Emacs.
alias eeval="$EMACS_PLUGIN_LAUNCHER --eval"
# create a new X frame
alias eframe='emacsclient --alternate-editor="" --create-frame'
# Emacs ANSI Term tracking
if [[ -n "$INSIDE_EMACS" ]]; then
chpwd_emacs() { print -P "\033AnSiTc %d"; }
print -P "\033AnSiTc %d" # Track current working directory
print -P "\033AnSiTu %n" # Track username
# add chpwd hook
autoload -Uz add-zsh-hook
add-zsh-hook chpwd chpwd_emacs
fi
# Write to standard output the path to the file
# opened in the current buffer.
function efile {
local cmd="(buffer-file-name (window-buffer))"
local file="$("$EMACS_PLUGIN_LAUNCHER" --eval "$cmd" | tr -d \")"
if [[ -z "$file" ]]; then
echo "Can't deduce current buffer filename." >&2
return 1
fi
echo "$file"
}
# Write to standard output the directory of the file
# opened in the the current buffer
function ecd {
local file
file="$(efile)" || return $?
echo "${file:h}"
}

View File

@ -0,0 +1,38 @@
#!/bin/sh
emacsfun() {
local cmd frames
# Build the Emacs Lisp command to check for suitable frames
# See https://www.gnu.org/software/emacs/manual/html_node/elisp/Frames.html#index-framep
case "$*" in
*-t*|*--tty*|*-nw*) cmd="(memq 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are tty frames
*) cmd="(delete 't (mapcar 'framep (frame-list)))" ;; # if != nil, there are graphical terminals (x, w32, ns)
esac
# Check if there are suitable frames
frames="$(emacsclient -a '' -n -e "$cmd" 2>/dev/null |sed 's/.*\x07//g' )"
# Only create another X frame if there isn't one present
if [ -z "$frames" -o "$frames" = nil ]; then
emacsclient --alternate-editor="" --create-frame "$@"
return $?
fi
emacsclient --alternate-editor="" "$@"
}
# Adapted from https://github.com/davidshepherd7/emacs-read-stdin/blob/master/emacs-read-stdin.sh
# If the second argument is - then write stdin to a tempfile and open the
# tempfile. (first argument will be `--no-wait` passed in by the plugin.zsh)
if [ $# -ge 2 -a "$2" = "-" ]; then
# Create a tempfile to hold stdin
tempfile="$(mktemp --tmpdir emacs-stdin-$USERNAME.XXXXXXX 2>/dev/null \
|| mktemp -t emacs-stdin-$USERNAME)" # support BSD mktemp
# Redirect stdin to the tempfile
cat - > "$tempfile"
# Reset $2 to the tempfile so that "$@" works as expected
set -- "$1" "$tempfile" "${@:3}"
fi
emacsfun "$@"

View File

@ -0,0 +1,33 @@
# Ember CLI
This plugin adds completion and aliases for using [`ember-cli`](https://cli.emberjs.com/).
To use it, add `ember-cli` to the plugins array in your zshrc file:
```zsh
plugins=(... ember-cli)
```
## Aliases
| Alias | Command |
| ----- | -------------------- |
| `ea` | `ember addon` |
| `eb` | `ember build` |
| `ed` | `ember destroy` |
| `eg` | `ember generate` |
| `eh` | `ember help` |
| `ei` | `ember install` |
| `ein` | `ember init` |
| `es` | `ember serve` |
| `et` | `ember test` |
| `ets` | `ember test --serve` |
| `eu` | `ember update` |
| `ev` | `ember version` |
## Maintainers
- [BilalBudhani](https://github.com/BilalBudhani)
- [eubenesa](https://github.com/eubenesa)
- [scottkidder](https://github.com/scottkidder]
- [t-sauer](https://www.github.com/t-sauer)

View File

@ -0,0 +1,189 @@
#compdef ember
local curcontext="$curcontext" state line ret=1
_arguments -C -A "--version" -A "--help" \
'(- 1 *)--help' \
'(- 1 *)--version' \
'1: :->cmds' \
'*:: :->args' && ret=0
case $state in
cmds)
_values "ember command" \
"addon[Generates a new folder structure for building an addon, complete with test harness]" \
"asset-sizes[Shows the sizes of your asset files]" \
"build[Builds your app and places it into the output path (dist/ by default)]" \
"destroy[Destroys code generated by generate command]" \
"generate[Generates new code from blueprints]" \
"help[Outputs the usage instructions for all commands or the provided command]" \
"init[Creates a new ember-cli project in the current folder]" \
"install[Installs an ember-cli addon from npm]" \
"new[Creates a new directory and runs ember init in it]" \
"serve[Builds and serves your app, rebuilding on file changes]" \
"test[Runs your app's test suite]" \
"version[outputs ember-cli version]"
ret=0
;;
args)
case $line[1] in
help)
_values 'commands' \
'addon' \
'asset-sizes' \
'build' \
'destroy' \
'generate' \
'help' \
'init' \
'install' \
'new' \
'serve' \
'test' \
'vesion' && ret=0
;;
addon)
_arguments \
'(--blueprint)--blueprint=-' \
'(--directory)--directory=-' \
'(--dry-run)--dry-run' \
'(--skip-bower)--skip-bower' \
'(--skip-git)--skip-git' \
'(--skip-npm)--skip-npm' \
'(--verbose)--verbose'
;;
asset-sizes)
_arguments \
'(--output-path)--output-path=-'
;;
build)
_arguments \
'(--environment)--environment=-' \
'(--output-path)--output-path=-' \
'(--output-path)--suppress-sizes' \
'(--watch)--watch' \
'(--watcher)--watcher=-' \
'(-dev)-dev' \
'(-prod)-prod'
;;
destroy|generate)
_values 'arguments' \
'(--classic)--classic' \
'(--dry-run)--dry-run' \
'(--dummy)--dummy' \
'(--in-repo-addon)--in-repo-addon-=' \
'(--pod)--pod' \
'(--verbose)--verbose' && ret=0
_values 'blueprints' \
'acceptance-test' \
'adapter' \
'adapter-test' \
'component' \
'component-addon' \
'component-test' \
'controller' \
'controller-test' \
'helper' \
'helper-addon' \
'helper-test' \
'initializer' \
'initializer-addon' \
'initializer-test' \
'instance-initializer' \
'instance-initializer-addon' \
'instance-initializer-test' \
'mixin' \
'mixin-test' \
'model' \
'model-test' \
'resource' \
'route' \
'route-addon' \
'route-test' \
'serializer' \
'serializer-test' \
'service' \
'service-test' \
'template' \
'test-helper' \
'transform' \
'transform-test' \
'util' \
'util-test' \
'view' \
'view-test' \
'addon' \
'addon-import' \
'app' \
'blueprint' \
'http-mock' \
'http-proxy' \
'in-repo-addon' \
'lib' \
'server' \
'vendor-shim' && ret=0
;;
init)
_arguments \
'(--blueprint)--blueprint=-' \
'(--name)--name=-' \
'(--dry-run)--dry-run' \
'(--skip-bower)--skip-bower' \
'(--skip-npm)--skip-npm' \
'(--verbose)--verbose'
;;
install)
_arguments \
'(--save-dev)--save-dev' \
'(--save)--save'
;;
new)
_arguments \
'(--blueprint)--blueprint=-' \
'(--directory)--directory=-' \
'(--dry-run)--dry-run' \
'(--skip-bower)--skip-bower' \
'(--skip-git)--skip-git' \
'(--skip-npm)--skip-npm' \
'(--verbose)--verbose'
;;
serve)
_arguments \
'(--port)--port=-[To use a port different than 4200. Pass 0 to automatically pick an available port.]' \
'(--host)--host=-[Listens on all interfaces by default]' \
'(--proxy)--proxy=-' \
'(--secure-proxy)--secure-proxy[Set to false to proxy self-signed SSL certificates]' \
'(--transparent-proxy)--transparent-proxy[Set to false to omit x-forwarded-* headers when proxying]' \
'(--watcher)--watcher=-' \
'(--live-reload)--live-reload' \
'(--live-reload-host)--live-reload-host=-[Defaults to host]' \
'(--live-reload-base-url)--live-reload-base-url=-[Defaults to baseURL]' \
'(--live-reload-port)--live-reload-port=-[Defaults to port number within \[49152...65535\]]' \
'(--environment)--environment=-' \
'(--output-path)--output-path=-' \
'(--ssl)--ssl' \
'(--ssl-key)--ssl-key=-' \
'(--ssl-cert)--ssl-cert=-'
;;
test)
_arguments \
'(--environment)--environment=-' \
'(--config-file)--config-file=-' \
'(--server)--server' \
'(--host)--host=-' \
'(--test-port)--test-port=-[The test port to use when running with --server.]' \
'(--filter)--filter=-[A string to filter tests to run]' \
'(--module)--module=-[The name of a test module to run]' \
'(--watcher)--watcher=-' \
'(--launch)--launch=-[A comma separated list of browsers to launch for tests.]' \
'(--reporter)--reporter=-[Test reporter to use \[tap|dot|xunit\] (default: tap)]' \
'(--silent)--silent[Suppress any output except for the test report]' \
'(--test-page)--test-page=-[Test page to invoke]' \
'(--path)--path=-[Reuse an existing build at given path.]' \
'(--query)--query=-[A query string to append to the test page URL.]'
;;
esac
;;
esac
return ret

View File

@ -0,0 +1,12 @@
alias ea='ember addon'
alias eb='ember build'
alias ed='ember destroy'
alias eg='ember generate'
alias eh='ember help'
alias ei='ember install'
alias ein='ember init'
alias es='ember serve'
alias et='ember test'
alias ets='ember test --serve'
alias eu='ember update'
alias ev='ember version'

View File

@ -0,0 +1,14 @@
# emoji-clock
The plugin displays current time as an emoji symbol with half hour accuracy.
To use it, add `emoji-clock` to the plugins array of your zshrc file:
```
plugins=(... emoji-clock)
```
## Features
| Function | Description |
|-------------------|----------------------------------------------------------------------|
| `emoji-clock` | Displays current time in clock emoji symbol with half hour accuracy |

View File

@ -0,0 +1,33 @@
# ------------------------------------------------------------------------------
# FILE: emoji-clock.plugin.zsh
# DESCRIPTION: The current time with half hour accuracy as an emoji symbol.
# Inspired by Andre Torrez' "Put A Burger In Your Shell"
# https://notes.torrez.org/2013/04/put-a-burger-in-your-shell.html
# AUTHOR: Alexis Hildebrandt (afh[at]surryhill.net)
# VERSION: 1.0.0
# -----------------------------------------------------------------------------
function emoji-clock() {
# Add 15 minutes to the current time and save the value as $minutes.
(( minutes = $(date '+%M') + 15 ))
(( hour = $(date '+%I') + minutes / 60 ))
# make sure minutes and hours don't exceed 60 nor 12 respectively
(( minutes %= 60 )); (( hour %= 12 ))
case $hour in
0) clock="🕛"; [ $minutes -ge 30 ] && clock="🕧";;
1) clock="🕐"; [ $minutes -ge 30 ] && clock="🕜";;
2) clock="🕑"; [ $minutes -ge 30 ] && clock="🕝";;
3) clock="🕒"; [ $minutes -ge 30 ] && clock="🕞";;
4) clock="🕓"; [ $minutes -ge 30 ] && clock="🕟";;
5) clock="🕔"; [ $minutes -ge 30 ] && clock="🕠";;
6) clock="🕕"; [ $minutes -ge 30 ] && clock="🕡";;
7) clock="🕖"; [ $minutes -ge 30 ] && clock="🕢";;
8) clock="🕗"; [ $minutes -ge 30 ] && clock="🕣";;
9) clock="🕘"; [ $minutes -ge 30 ] && clock="🕤";;
10) clock="🕙"; [ $minutes -ge 30 ] && clock="🕥";;
11) clock="🕚"; [ $minutes -ge 30 ] && clock="🕦";;
*) clock="⌛";;
esac
echo $clock
}

View File

@ -0,0 +1,127 @@
# emoji plugin
Support for conveniently working with Unicode emoji in Zsh.
## Features
This plugin provides support for working with Unicode emoji characters in `zsh` using human-readable identifiers. It provides global variables which map emoji names to the actual characters, country names to their flags, and some named groupings of emoji. It also provides associated functions for displaying them.
#### Variables
Variable | Description
----------------- | --------------------------------
$emoji | Maps emoji names to characters (except flags)
$emoji_flags | Maps country names to flag characters (using region indicators)
$emoji_groups | Named groups of emoji. Keys are group names; values are whitespace-separated lists of character names
You may define new emoji groups at run time by modifying `$emoji_groups`. The special group name `all` is reserved for use by the plugin. You should not modify `$emoji` or `$emoji_flags`.
#### Functions
Function | Description
---------------- | -------------------------------
random_emoji | Prints a random emoji character
display_emoji | Displays emoji, along with their names
## Usage and Examples
To output a specific emoji, use:
```
$> echo $emoji[<name>]
```
E.g.:
```
$> echo $emoji[mouse_face]
```
To output a random emoji, use:
```
$> random_emoji
```
To output a random emoji from a particular group, use:
```
$> random_emoji <group>
```
E.g.:
```
$> random_emoji fruits
$> random_emoji animals
$> random_emoji vehicles
$> random_emoji faces
```
The defined group names can be found with `echo ${(k)emoji_groups}`.
To list all available emoji with their names, use:
```
$> display_emoji
$> display_emoji faces
$> display_emoji people
```
To use emoji in a prompt:
```
PROMPT="$emoji[penguin] > ""
PROMPT='$(random_emoji fruits) > '
surfer=$emoji[surfer]
PROMPT="$surfer > "
```
## Technical Details
The emoji names and codes are sourced from Unicode Technical Report \#51, which provides information on emoji support in Unicode. It can be found at https://www.unicode.org/reports/tr51/index.html.
The group definitions are added by this OMZ plugin. They are not based on external definitions.
The values in the `$emoji*` maps are the emoji characters themselves, not escape sequences or other forms that require interpretation. They can be used in any context and do not require escape sequence support from commands like `echo` or `print`.
The emoji in the main `$emoji` map are standalone character sequences which can all be output on their own, without worrying about combining characters. The values may actually be multi-code-point sequences, instead of a single code point, and may include combining characters in those sequences. But they're arranged so their effects do not extend beyond that sequence.
The exception to this is the skin tone / hair style variation selectors. These are included in the main `$emoji` map because they can be displayed on their own, as well as used as combining characters. (If they follow a character that is not one of the emoji characters they combine with, they are displayed as color swatches.)
## Experimental Features
This defines some additional variables and functions, but these are experimental and subject to change at any time. You shouldn't rely on them being available. They're mostly for the use of emoji plugin developers to help decide what to include in future revisions.
Variables:
Variable | Description
----------------- | --------------------------------
$emoji_skintone | Skin tone modifiers (from Unicode 8.0)
#### Skin Tone Variation Selection
This includes experimental support for the skin tone Variation Selectors introduced with Unicode 8.0, which let you select different skin tones for emoji involving humans.
NOTE: This really is experimental. The skin tone selectors are a relatively new feature and may not be supported by all systems. And the support in this plugin is a work in progress. It may not work in all places. In fact, I haven't gotten it to work anywhere yet. -apjanke
The "variation selectors" are combining characters which change the appearance of the preceding character. A variation selector character can be output immediately following a human emoji to change its skin tone color. You can also output a variation selector on its own to display a color swatch of that skin tone.
The `$emoji_skintone` associative array maps skin tone IDs to the variation selector characters. To use one, output it immediately following a smiley or other human emoji.
```
echo $emoji[waving_hand]$emoji_skintone[5]
```
Note that `$emoji_skintone` is an associative array, and its keys are the *names* of "Fitzpatrick Skin Type" groups, not linear indexes into a normal array. The names are `1_2`, `3`, `4`, `5`, and `6`. (Types 1 and 2 are combined into a single color.) See the [Diversity section in Unicode TR 51](https://www.unicode.org/reports/tr51/index.html#Diversity) for details.
#### Gemoji support
The [gemoji project](https://github.com/github/gemoji) seems to be the de facto main source for short names and other emoji-related metadata that isn't included in the official Unicode reports. So, our list of emojis incorporates some of their aliases to make your life more convenient:
```
echo $emoji[grinning_face_with_smiling_eyes]
echo $emoji[smile]
```
These two commands yield the same emoji (😄). The first name is the official one, in the Unicode reference, and the second one is the alias that was in Gemoji's database.
## TODO
These are things that could be enhanced in future revisions of the plugin.
* Incorporate CLDR data for ordering and groupings
* Short :bracket: style names (from gemoji)
* ZWJ combining function?

View File

@ -0,0 +1,7274 @@
# emoji-char-definitions.zsh - Emoji definitions for oh-my-zsh emoji plugin
#
# This file is auto-generated by update_emoji.py. Do not edit it manually.
#
# This contains the definition for:
# $emoji - which maps character names to Unicode characters
# $emoji_flags - maps country names to Unicode flag characters using region
# indicators
# $emoji_mod - maps modifier components to Unicode characters
# $emoji_groups - a single associative array to avoid cluttering up the
# global namespace, and to allow adding additional group
# definitions at run time. The keys are the group names, and
# the values are whitespace-separated lists of emoji
# character names.
# Main emoji
typeset -gAH emoji
# National flags
typeset -gAH emoji_flags
# Combining modifiers
typeset -gAH emoji_mod
# Emoji groups
typeset -gAH emoji_groups
emoji[grinning_face]=$'\U1F600'
emoji[grinning]=$'\U1F600'
emoji[grinning_face_with_big_eyes]=$'\U1F603'
emoji[smiley]=$'\U1F603'
emoji[grinning_face_with_smiling_eyes]=$'\U1F604'
emoji[smile]=$'\U1F604'
emoji[beaming_face_with_smiling_eyes]=$'\U1F601'
emoji[grin]=$'\U1F601'
emoji[grinning_squinting_face]=$'\U1F606'
emoji[laughing]=$'\U1F606'
emoji[satisfied]=$'\U1F606'
emoji[grinning_face_with_sweat]=$'\U1F605'
emoji[sweat_smile]=$'\U1F605'
emoji[rolling_on_the_floor_laughing]=$'\U1F923'
emoji[rofl]=$'\U1F923'
emoji[face_with_tears_of_joy]=$'\U1F602'
emoji[joy]=$'\U1F602'
emoji[slightly_smiling_face]=$'\U1F642'
emoji[upside_down_face]=$'\U1F643'
emoji[winking_face]=$'\U1F609'
emoji[wink]=$'\U1F609'
emoji[smiling_face_with_smiling_eyes]=$'\U1F60A'
emoji[blush]=$'\U1F60A'
emoji[smiling_face_with_halo]=$'\U1F607'
emoji[innocent]=$'\U1F607'
emoji[smiling_face_with_hearts]=$'\U1F970'
emoji[smiling_face_with_three_hearts]=$'\U1F970'
emoji[smiling_face_with_heart_eyes]=$'\U1F60D'
emoji[heart_eyes]=$'\U1F60D'
emoji[star_struck]=$'\U1F929'
emoji[face_blowing_a_kiss]=$'\U1F618'
emoji[kissing_heart]=$'\U1F618'
emoji[kissing_face]=$'\U1F617'
emoji[kissing]=$'\U1F617'
emoji[smiling_face]=$'\U263A\UFE0F'
emoji[relaxed]=$'\U263A\UFE0F'
emoji[smiling_face_unqualified]=$'\U263A'
emoji[kissing_face_with_closed_eyes]=$'\U1F61A'
emoji[kissing_closed_eyes]=$'\U1F61A'
emoji[kissing_face_with_smiling_eyes]=$'\U1F619'
emoji[kissing_smiling_eyes]=$'\U1F619'
emoji[face_savoring_food]=$'\U1F60B'
emoji[yum]=$'\U1F60B'
emoji[face_with_tongue]=$'\U1F61B'
emoji[stuck_out_tongue]=$'\U1F61B'
emoji[winking_face_with_tongue]=$'\U1F61C'
emoji[stuck_out_tongue_winking_eye]=$'\U1F61C'
emoji[zany_face]=$'\U1F92A'
emoji[squinting_face_with_tongue]=$'\U1F61D'
emoji[stuck_out_tongue_closed_eyes]=$'\U1F61D'
emoji[money_mouth_face]=$'\U1F911'
emoji[hugging_face]=$'\U1F917'
emoji[hugs]=$'\U1F917'
emoji[face_with_hand_over_mouth]=$'\U1F92D'
emoji[hand_over_mouth]=$'\U1F92D'
emoji[shushing_face]=$'\U1F92B'
emoji[thinking_face]=$'\U1F914'
emoji[thinking]=$'\U1F914'
emoji[zipper_mouth_face]=$'\U1F910'
emoji[face_with_raised_eyebrow]=$'\U1F928'
emoji[raised_eyebrow]=$'\U1F928'
emoji[neutral_face]=$'\U1F610'
emoji[expressionless_face]=$'\U1F611'
emoji[expressionless]=$'\U1F611'
emoji[face_without_mouth]=$'\U1F636'
emoji[no_mouth]=$'\U1F636'
emoji[smirking_face]=$'\U1F60F'
emoji[smirk]=$'\U1F60F'
emoji[unamused_face]=$'\U1F612'
emoji[unamused]=$'\U1F612'
emoji[face_with_rolling_eyes]=$'\U1F644'
emoji[roll_eyes]=$'\U1F644'
emoji[grimacing_face]=$'\U1F62C'
emoji[grimacing]=$'\U1F62C'
emoji[lying_face]=$'\U1F925'
emoji[relieved_face]=$'\U1F60C'
emoji[relieved]=$'\U1F60C'
emoji[pensive_face]=$'\U1F614'
emoji[pensive]=$'\U1F614'
emoji[sleepy_face]=$'\U1F62A'
emoji[sleepy]=$'\U1F62A'
emoji[drooling_face]=$'\U1F924'
emoji[sleeping_face]=$'\U1F634'
emoji[sleeping]=$'\U1F634'
emoji[face_with_medical_mask]=$'\U1F637'
emoji[mask]=$'\U1F637'
emoji[face_with_thermometer]=$'\U1F912'
emoji[face_with_head_bandage]=$'\U1F915'
emoji[nauseated_face]=$'\U1F922'
emoji[face_vomiting]=$'\U1F92E'
emoji[vomiting_face]=$'\U1F92E'
emoji[sneezing_face]=$'\U1F927'
emoji[hot_face]=$'\U1F975'
emoji[cold_face]=$'\U1F976'
emoji[woozy_face]=$'\U1F974'
emoji[dizzy_face]=$'\U1F635'
emoji[exploding_head]=$'\U1F92F'
emoji[cowboy_hat_face]=$'\U1F920'
emoji[partying_face]=$'\U1F973'
emoji[smiling_face_with_sunglasses]=$'\U1F60E'
emoji[nerd_face]=$'\U1F913'
emoji[face_with_monocle]=$'\U1F9D0'
emoji[monocle_face]=$'\U1F9D0'
emoji[confused_face]=$'\U1F615'
emoji[confused]=$'\U1F615'
emoji[worried_face]=$'\U1F61F'
emoji[worried]=$'\U1F61F'
emoji[slightly_frowning_face]=$'\U1F641'
emoji[slightly_frowning_face_1]=$'\U2639\UFE0F'
emoji[frowning_face_unqualified]=$'\U2639'
emoji[frowning_face]=$'\U2639'
emoji[face_with_open_mouth]=$'\U1F62E'
emoji[open_mouth]=$'\U1F62E'
emoji[hushed_face]=$'\U1F62F'
emoji[hushed]=$'\U1F62F'
emoji[astonished_face]=$'\U1F632'
emoji[astonished]=$'\U1F632'
emoji[flushed_face]=$'\U1F633'
emoji[flushed]=$'\U1F633'
emoji[pleading_face]=$'\U1F97A'
emoji[frowning_face_with_open_mouth]=$'\U1F626'
emoji[frowning]=$'\U1F626'
emoji[anguished_face]=$'\U1F627'
emoji[anguished]=$'\U1F627'
emoji[fearful_face]=$'\U1F628'
emoji[fearful]=$'\U1F628'
emoji[anxious_face_with_sweat]=$'\U1F630'
emoji[cold_sweat]=$'\U1F630'
emoji[sad_but_relieved_face]=$'\U1F625'
emoji[disappointed_relieved]=$'\U1F625'
emoji[crying_face]=$'\U1F622'
emoji[cry]=$'\U1F622'
emoji[loudly_crying_face]=$'\U1F62D'
emoji[sob]=$'\U1F62D'
emoji[face_screaming_in_fear]=$'\U1F631'
emoji[scream]=$'\U1F631'
emoji[confounded_face]=$'\U1F616'
emoji[confounded]=$'\U1F616'
emoji[persevering_face]=$'\U1F623'
emoji[persevere]=$'\U1F623'
emoji[disappointed_face]=$'\U1F61E'
emoji[disappointed]=$'\U1F61E'
emoji[downcast_face_with_sweat]=$'\U1F613'
emoji[sweat]=$'\U1F613'
emoji[weary_face]=$'\U1F629'
emoji[weary]=$'\U1F629'
emoji[tired_face]=$'\U1F62B'
emoji[yawning_face]=$'\U1F971'
emoji[face_with_steam_from_nose]=$'\U1F624'
emoji[triumph]=$'\U1F624'
emoji[pouting_face]=$'\U1F621'
emoji[rage]=$'\U1F621'
emoji[pout]=$'\U1F621'
emoji[angry_face]=$'\U1F620'
emoji[angry]=$'\U1F620'
emoji[face_with_symbols_on_mouth]=$'\U1F92C'
emoji[cursing_face]=$'\U1F92C'
emoji[smiling_face_with_horns]=$'\U1F608'
emoji[smiling_imp]=$'\U1F608'
emoji[angry_face_with_horns]=$'\U1F47F'
emoji[imp]=$'\U1F47F'
emoji[skull]=$'\U1F480'
emoji[skull_and_crossbones]=$'\U2620\UFE0F'
emoji[skull_and_crossbones_unqualified]=$'\U2620'
emoji[pile_of_poo]=$'\U1F4A9'
emoji[hankey]=$'\U1F4A9'
emoji[poop]=$'\U1F4A9'
emoji[shit]=$'\U1F4A9'
emoji[clown_face]=$'\U1F921'
emoji[ogre]=$'\U1F479'
emoji[japanese_ogre]=$'\U1F479'
emoji[goblin]=$'\U1F47A'
emoji[japanese_goblin]=$'\U1F47A'
emoji[ghost]=$'\U1F47B'
emoji[alien]=$'\U1F47D'
emoji[alien_monster]=$'\U1F47E'
emoji[space_invader]=$'\U1F47E'
emoji[robot]=$'\U1F916'
emoji[grinning_cat]=$'\U1F63A'
emoji[smiley_cat]=$'\U1F63A'
emoji[grinning_cat_with_smiling_eyes]=$'\U1F638'
emoji[smile_cat]=$'\U1F638'
emoji[cat_with_tears_of_joy]=$'\U1F639'
emoji[joy_cat]=$'\U1F639'
emoji[smiling_cat_with_heart_eyes]=$'\U1F63B'
emoji[heart_eyes_cat]=$'\U1F63B'
emoji[cat_with_wry_smile]=$'\U1F63C'
emoji[smirk_cat]=$'\U1F63C'
emoji[kissing_cat]=$'\U1F63D'
emoji[weary_cat]=$'\U1F640'
emoji[scream_cat]=$'\U1F640'
emoji[crying_cat]=$'\U1F63F'
emoji[crying_cat_face]=$'\U1F63F'
emoji[pouting_cat]=$'\U1F63E'
emoji[see_no_evil_monkey]=$'\U1F648'
emoji[see_no_evil]=$'\U1F648'
emoji[hear_no_evil_monkey]=$'\U1F649'
emoji[hear_no_evil]=$'\U1F649'
emoji[speak_no_evil_monkey]=$'\U1F64A'
emoji[speak_no_evil]=$'\U1F64A'
emoji[kiss_mark]=$'\U1F48B'
emoji[love_letter]=$'\U1F48C'
emoji[heart_with_arrow]=$'\U1F498'
emoji[cupid]=$'\U1F498'
emoji[heart_with_ribbon]=$'\U1F49D'
emoji[gift_heart]=$'\U1F49D'
emoji[sparkling_heart]=$'\U1F496'
emoji[growing_heart]=$'\U1F497'
emoji[heartpulse]=$'\U1F497'
emoji[beating_heart]=$'\U1F493'
emoji[heartbeat]=$'\U1F493'
emoji[revolving_hearts]=$'\U1F49E'
emoji[two_hearts]=$'\U1F495'
emoji[heart_decoration]=$'\U1F49F'
emoji[heart_exclamation]=$'\U2763\UFE0F'
emoji[heavy_heart_exclamation]=$'\U2763\UFE0F'
emoji[heart_exclamation_unqualified]=$'\U2763'
emoji[broken_heart]=$'\U1F494'
emoji[red_heart]=$'\U2764\UFE0F'
emoji[heart]=$'\U2764\UFE0F'
emoji[red_heart_unqualified]=$'\U2764'
emoji[orange_heart]=$'\U1F9E1'
emoji[yellow_heart]=$'\U1F49B'
emoji[green_heart]=$'\U1F49A'
emoji[blue_heart]=$'\U1F499'
emoji[purple_heart]=$'\U1F49C'
emoji[brown_heart]=$'\U1F90E'
emoji[black_heart]=$'\U1F5A4'
emoji[white_heart]=$'\U1F90D'
emoji[hundred_points]=$'\U1F4AF'
emoji[100]=$'\U1F4AF'
emoji[anger_symbol]=$'\U1F4A2'
emoji[anger]=$'\U1F4A2'
emoji[collision]=$'\U1F4A5'
emoji[boom]=$'\U1F4A5'
emoji[dizzy]=$'\U1F4AB'
emoji[sweat_droplets]=$'\U1F4A6'
emoji[sweat_drops]=$'\U1F4A6'
emoji[dashing_away]=$'\U1F4A8'
emoji[dash]=$'\U1F4A8'
emoji[hole]=$'\U1F573\UFE0F'
emoji[hole_unqualified]=$'\U1F573'
emoji[bomb]=$'\U1F4A3'
emoji[speech_balloon]=$'\U1F4AC'
emoji[eye_in_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F'
emoji[eye_speech_bubble]=$'\U1F441\UFE0F\U200D\U1F5E8\UFE0F'
emoji[eye_in_speech_bubble_unqualified]=$'\U1F441\U200D\U1F5E8\UFE0F'
emoji[eye_in_speech_bubble_unqualified_1]=$'\U1F441\UFE0F\U200D\U1F5E8'
emoji[eye_in_speech_bubble_unqualified_2]=$'\U1F441\U200D\U1F5E8'
emoji[left_speech_bubble]=$'\U1F5E8\UFE0F'
emoji[left_speech_bubble_unqualified]=$'\U1F5E8'
emoji[right_anger_bubble]=$'\U1F5EF\UFE0F'
emoji[right_anger_bubble_unqualified]=$'\U1F5EF'
emoji[thought_balloon]=$'\U1F4AD'
emoji[zzz]=$'\U1F4A4'
emoji[waving_hand]=$'\U1F44B'
emoji[wave]=$'\U1F44B'
emoji[waving_hand_light_skin_tone]=$'\U1F44B\U1F3FB'
emoji[waving_hand_medium_light_skin_tone]=$'\U1F44B\U1F3FC'
emoji[waving_hand_medium_skin_tone]=$'\U1F44B\U1F3FD'
emoji[waving_hand_medium_dark_skin_tone]=$'\U1F44B\U1F3FE'
emoji[waving_hand_dark_skin_tone]=$'\U1F44B\U1F3FF'
emoji[raised_back_of_hand]=$'\U1F91A'
emoji[raised_back_of_hand_light_skin_tone]=$'\U1F91A\U1F3FB'
emoji[raised_back_of_hand_medium_light_skin_tone]=$'\U1F91A\U1F3FC'
emoji[raised_back_of_hand_medium_skin_tone]=$'\U1F91A\U1F3FD'
emoji[raised_back_of_hand_medium_dark_skin_tone]=$'\U1F91A\U1F3FE'
emoji[raised_back_of_hand_dark_skin_tone]=$'\U1F91A\U1F3FF'
emoji[hand_with_fingers_splayed]=$'\U1F590\UFE0F'
emoji[hand_with_fingers_splayed_unqualified]=$'\U1F590'
emoji[raised_hand_with_fingers_splayed]=$'\U1F590'
emoji[hand_with_fingers_splayed_light_skin_tone]=$'\U1F590\U1F3FB'
emoji[hand_with_fingers_splayed_medium_light_skin_tone]=$'\U1F590\U1F3FC'
emoji[hand_with_fingers_splayed_medium_skin_tone]=$'\U1F590\U1F3FD'
emoji[hand_with_fingers_splayed_medium_dark_skin_tone]=$'\U1F590\U1F3FE'
emoji[hand_with_fingers_splayed_dark_skin_tone]=$'\U1F590\U1F3FF'
emoji[raised_hand]=$'\U270B'
emoji[hand]=$'\U270B'
emoji[raised_hand_light_skin_tone]=$'\U270B\U1F3FB'
emoji[raised_hand_medium_light_skin_tone]=$'\U270B\U1F3FC'
emoji[raised_hand_medium_skin_tone]=$'\U270B\U1F3FD'
emoji[raised_hand_medium_dark_skin_tone]=$'\U270B\U1F3FE'
emoji[raised_hand_dark_skin_tone]=$'\U270B\U1F3FF'
emoji[vulcan_salute]=$'\U1F596'
emoji[vulcan_salute_light_skin_tone]=$'\U1F596\U1F3FB'
emoji[vulcan_salute_medium_light_skin_tone]=$'\U1F596\U1F3FC'
emoji[vulcan_salute_medium_skin_tone]=$'\U1F596\U1F3FD'
emoji[vulcan_salute_medium_dark_skin_tone]=$'\U1F596\U1F3FE'
emoji[vulcan_salute_dark_skin_tone]=$'\U1F596\U1F3FF'
emoji[OK_hand]=$'\U1F44C'
emoji[ok_hand]=$'\U1F44C'
emoji[OK_hand_light_skin_tone]=$'\U1F44C\U1F3FB'
emoji[OK_hand_medium_light_skin_tone]=$'\U1F44C\U1F3FC'
emoji[OK_hand_medium_skin_tone]=$'\U1F44C\U1F3FD'
emoji[OK_hand_medium_dark_skin_tone]=$'\U1F44C\U1F3FE'
emoji[OK_hand_dark_skin_tone]=$'\U1F44C\U1F3FF'
emoji[pinching_hand]=$'\U1F90F'
emoji[pinching_hand_light_skin_tone]=$'\U1F90F\U1F3FB'
emoji[pinching_hand_medium_light_skin_tone]=$'\U1F90F\U1F3FC'
emoji[pinching_hand_medium_skin_tone]=$'\U1F90F\U1F3FD'
emoji[pinching_hand_medium_dark_skin_tone]=$'\U1F90F\U1F3FE'
emoji[pinching_hand_dark_skin_tone]=$'\U1F90F\U1F3FF'
emoji[victory_hand]=$'\U270C\UFE0F'
emoji[v]=$'\U270C\UFE0F'
emoji[victory_hand_unqualified]=$'\U270C'
emoji[victory_hand_light_skin_tone]=$'\U270C\U1F3FB'
emoji[victory_hand_medium_light_skin_tone]=$'\U270C\U1F3FC'
emoji[victory_hand_medium_skin_tone]=$'\U270C\U1F3FD'
emoji[victory_hand_medium_dark_skin_tone]=$'\U270C\U1F3FE'
emoji[victory_hand_dark_skin_tone]=$'\U270C\U1F3FF'
emoji[crossed_fingers]=$'\U1F91E'
emoji[crossed_fingers_light_skin_tone]=$'\U1F91E\U1F3FB'
emoji[crossed_fingers_medium_light_skin_tone]=$'\U1F91E\U1F3FC'
emoji[crossed_fingers_medium_skin_tone]=$'\U1F91E\U1F3FD'
emoji[crossed_fingers_medium_dark_skin_tone]=$'\U1F91E\U1F3FE'
emoji[crossed_fingers_dark_skin_tone]=$'\U1F91E\U1F3FF'
emoji[love_you_gesture]=$'\U1F91F'
emoji[love_you_gesture_light_skin_tone]=$'\U1F91F\U1F3FB'
emoji[love_you_gesture_medium_light_skin_tone]=$'\U1F91F\U1F3FC'
emoji[love_you_gesture_medium_skin_tone]=$'\U1F91F\U1F3FD'
emoji[love_you_gesture_medium_dark_skin_tone]=$'\U1F91F\U1F3FE'
emoji[love_you_gesture_dark_skin_tone]=$'\U1F91F\U1F3FF'
emoji[sign_of_the_horns]=$'\U1F918'
emoji[metal]=$'\U1F918'
emoji[sign_of_the_horns_light_skin_tone]=$'\U1F918\U1F3FB'
emoji[sign_of_the_horns_medium_light_skin_tone]=$'\U1F918\U1F3FC'
emoji[sign_of_the_horns_medium_skin_tone]=$'\U1F918\U1F3FD'
emoji[sign_of_the_horns_medium_dark_skin_tone]=$'\U1F918\U1F3FE'
emoji[sign_of_the_horns_dark_skin_tone]=$'\U1F918\U1F3FF'
emoji[call_me_hand]=$'\U1F919'
emoji[call_me_hand_light_skin_tone]=$'\U1F919\U1F3FB'
emoji[call_me_hand_medium_light_skin_tone]=$'\U1F919\U1F3FC'
emoji[call_me_hand_medium_skin_tone]=$'\U1F919\U1F3FD'
emoji[call_me_hand_medium_dark_skin_tone]=$'\U1F919\U1F3FE'
emoji[call_me_hand_dark_skin_tone]=$'\U1F919\U1F3FF'
emoji[backhand_index_pointing_left]=$'\U1F448'
emoji[point_left]=$'\U1F448'
emoji[backhand_index_pointing_left_light_skin_tone]=$'\U1F448\U1F3FB'
emoji[backhand_index_pointing_left_medium_light_skin_tone]=$'\U1F448\U1F3FC'
emoji[backhand_index_pointing_left_medium_skin_tone]=$'\U1F448\U1F3FD'
emoji[backhand_index_pointing_left_medium_dark_skin_tone]=$'\U1F448\U1F3FE'
emoji[backhand_index_pointing_left_dark_skin_tone]=$'\U1F448\U1F3FF'
emoji[backhand_index_pointing_right]=$'\U1F449'
emoji[point_right]=$'\U1F449'
emoji[backhand_index_pointing_right_light_skin_tone]=$'\U1F449\U1F3FB'
emoji[backhand_index_pointing_right_medium_light_skin_tone]=$'\U1F449\U1F3FC'
emoji[backhand_index_pointing_right_medium_skin_tone]=$'\U1F449\U1F3FD'
emoji[backhand_index_pointing_right_medium_dark_skin_tone]=$'\U1F449\U1F3FE'
emoji[backhand_index_pointing_right_dark_skin_tone]=$'\U1F449\U1F3FF'
emoji[backhand_index_pointing_up]=$'\U1F446'
emoji[point_up_2]=$'\U1F446'
emoji[backhand_index_pointing_up_light_skin_tone]=$'\U1F446\U1F3FB'
emoji[backhand_index_pointing_up_medium_light_skin_tone]=$'\U1F446\U1F3FC'
emoji[backhand_index_pointing_up_medium_skin_tone]=$'\U1F446\U1F3FD'
emoji[backhand_index_pointing_up_medium_dark_skin_tone]=$'\U1F446\U1F3FE'
emoji[backhand_index_pointing_up_dark_skin_tone]=$'\U1F446\U1F3FF'
emoji[middle_finger]=$'\U1F595'
emoji[fu]=$'\U1F595'
emoji[middle_finger_light_skin_tone]=$'\U1F595\U1F3FB'
emoji[middle_finger_medium_light_skin_tone]=$'\U1F595\U1F3FC'
emoji[middle_finger_medium_skin_tone]=$'\U1F595\U1F3FD'
emoji[middle_finger_medium_dark_skin_tone]=$'\U1F595\U1F3FE'
emoji[middle_finger_dark_skin_tone]=$'\U1F595\U1F3FF'
emoji[backhand_index_pointing_down]=$'\U1F447'
emoji[point_down]=$'\U1F447'
emoji[backhand_index_pointing_down_light_skin_tone]=$'\U1F447\U1F3FB'
emoji[backhand_index_pointing_down_medium_light_skin_tone]=$'\U1F447\U1F3FC'
emoji[backhand_index_pointing_down_medium_skin_tone]=$'\U1F447\U1F3FD'
emoji[backhand_index_pointing_down_medium_dark_skin_tone]=$'\U1F447\U1F3FE'
emoji[backhand_index_pointing_down_dark_skin_tone]=$'\U1F447\U1F3FF'
emoji[index_pointing_up]=$'\U261D\UFE0F'
emoji[point_up]=$'\U261D\UFE0F'
emoji[index_pointing_up_unqualified]=$'\U261D'
emoji[index_pointing_up_light_skin_tone]=$'\U261D\U1F3FB'
emoji[index_pointing_up_medium_light_skin_tone]=$'\U261D\U1F3FC'
emoji[index_pointing_up_medium_skin_tone]=$'\U261D\U1F3FD'
emoji[index_pointing_up_medium_dark_skin_tone]=$'\U261D\U1F3FE'
emoji[index_pointing_up_dark_skin_tone]=$'\U261D\U1F3FF'
emoji[thumbs_up]=$'\U1F44D'
emoji[+1]=$'\U1F44D'
emoji[thumbsup]=$'\U1F44D'
emoji[thumbs_up_light_skin_tone]=$'\U1F44D\U1F3FB'
emoji[thumbs_up_medium_light_skin_tone]=$'\U1F44D\U1F3FC'
emoji[thumbs_up_medium_skin_tone]=$'\U1F44D\U1F3FD'
emoji[thumbs_up_medium_dark_skin_tone]=$'\U1F44D\U1F3FE'
emoji[thumbs_up_dark_skin_tone]=$'\U1F44D\U1F3FF'
emoji[thumbs_down]=$'\U1F44E'
emoji[-1]=$'\U1F44E'
emoji[thumbsdown]=$'\U1F44E'
emoji[thumbs_down_light_skin_tone]=$'\U1F44E\U1F3FB'
emoji[thumbs_down_medium_light_skin_tone]=$'\U1F44E\U1F3FC'
emoji[thumbs_down_medium_skin_tone]=$'\U1F44E\U1F3FD'
emoji[thumbs_down_medium_dark_skin_tone]=$'\U1F44E\U1F3FE'
emoji[thumbs_down_dark_skin_tone]=$'\U1F44E\U1F3FF'
emoji[raised_fist]=$'\U270A'
emoji[fist_raised]=$'\U270A'
emoji[fist]=$'\U270A'
emoji[raised_fist_light_skin_tone]=$'\U270A\U1F3FB'
emoji[raised_fist_medium_light_skin_tone]=$'\U270A\U1F3FC'
emoji[raised_fist_medium_skin_tone]=$'\U270A\U1F3FD'
emoji[raised_fist_medium_dark_skin_tone]=$'\U270A\U1F3FE'
emoji[raised_fist_dark_skin_tone]=$'\U270A\U1F3FF'
emoji[oncoming_fist]=$'\U1F44A'
emoji[fist_oncoming]=$'\U1F44A'
emoji[facepunch]=$'\U1F44A'
emoji[punch]=$'\U1F44A'
emoji[oncoming_fist_light_skin_tone]=$'\U1F44A\U1F3FB'
emoji[oncoming_fist_medium_light_skin_tone]=$'\U1F44A\U1F3FC'
emoji[oncoming_fist_medium_skin_tone]=$'\U1F44A\U1F3FD'
emoji[oncoming_fist_medium_dark_skin_tone]=$'\U1F44A\U1F3FE'
emoji[oncoming_fist_dark_skin_tone]=$'\U1F44A\U1F3FF'
emoji[left_facing_fist]=$'\U1F91B'
emoji[fist_left]=$'\U1F91B'
emoji[left_facing_fist_light_skin_tone]=$'\U1F91B\U1F3FB'
emoji[left_facing_fist_medium_light_skin_tone]=$'\U1F91B\U1F3FC'
emoji[left_facing_fist_medium_skin_tone]=$'\U1F91B\U1F3FD'
emoji[left_facing_fist_medium_dark_skin_tone]=$'\U1F91B\U1F3FE'
emoji[left_facing_fist_dark_skin_tone]=$'\U1F91B\U1F3FF'
emoji[right_facing_fist]=$'\U1F91C'
emoji[fist_right]=$'\U1F91C'
emoji[right_facing_fist_light_skin_tone]=$'\U1F91C\U1F3FB'
emoji[right_facing_fist_medium_light_skin_tone]=$'\U1F91C\U1F3FC'
emoji[right_facing_fist_medium_skin_tone]=$'\U1F91C\U1F3FD'
emoji[right_facing_fist_medium_dark_skin_tone]=$'\U1F91C\U1F3FE'
emoji[right_facing_fist_dark_skin_tone]=$'\U1F91C\U1F3FF'
emoji[clapping_hands]=$'\U1F44F'
emoji[clap]=$'\U1F44F'
emoji[clapping_hands_light_skin_tone]=$'\U1F44F\U1F3FB'
emoji[clapping_hands_medium_light_skin_tone]=$'\U1F44F\U1F3FC'
emoji[clapping_hands_medium_skin_tone]=$'\U1F44F\U1F3FD'
emoji[clapping_hands_medium_dark_skin_tone]=$'\U1F44F\U1F3FE'
emoji[clapping_hands_dark_skin_tone]=$'\U1F44F\U1F3FF'
emoji[raising_hands]=$'\U1F64C'
emoji[raised_hands]=$'\U1F64C'
emoji[raising_hands_light_skin_tone]=$'\U1F64C\U1F3FB'
emoji[raising_hands_medium_light_skin_tone]=$'\U1F64C\U1F3FC'
emoji[raising_hands_medium_skin_tone]=$'\U1F64C\U1F3FD'
emoji[raising_hands_medium_dark_skin_tone]=$'\U1F64C\U1F3FE'
emoji[raising_hands_dark_skin_tone]=$'\U1F64C\U1F3FF'
emoji[open_hands]=$'\U1F450'
emoji[open_hands_light_skin_tone]=$'\U1F450\U1F3FB'
emoji[open_hands_medium_light_skin_tone]=$'\U1F450\U1F3FC'
emoji[open_hands_medium_skin_tone]=$'\U1F450\U1F3FD'
emoji[open_hands_medium_dark_skin_tone]=$'\U1F450\U1F3FE'
emoji[open_hands_dark_skin_tone]=$'\U1F450\U1F3FF'
emoji[palms_up_together]=$'\U1F932'
emoji[palms_up_together_light_skin_tone]=$'\U1F932\U1F3FB'
emoji[palms_up_together_medium_light_skin_tone]=$'\U1F932\U1F3FC'
emoji[palms_up_together_medium_skin_tone]=$'\U1F932\U1F3FD'
emoji[palms_up_together_medium_dark_skin_tone]=$'\U1F932\U1F3FE'
emoji[palms_up_together_dark_skin_tone]=$'\U1F932\U1F3FF'
emoji[handshake]=$'\U1F91D'
emoji[folded_hands]=$'\U1F64F'
emoji[pray]=$'\U1F64F'
emoji[folded_hands_light_skin_tone]=$'\U1F64F\U1F3FB'
emoji[folded_hands_medium_light_skin_tone]=$'\U1F64F\U1F3FC'
emoji[folded_hands_medium_skin_tone]=$'\U1F64F\U1F3FD'
emoji[folded_hands_medium_dark_skin_tone]=$'\U1F64F\U1F3FE'
emoji[folded_hands_dark_skin_tone]=$'\U1F64F\U1F3FF'
emoji[writing_hand]=$'\U270D\UFE0F'
emoji[writing_hand_unqualified]=$'\U270D'
emoji[writing_hand_light_skin_tone]=$'\U270D\U1F3FB'
emoji[writing_hand_medium_light_skin_tone]=$'\U270D\U1F3FC'
emoji[writing_hand_medium_skin_tone]=$'\U270D\U1F3FD'
emoji[writing_hand_medium_dark_skin_tone]=$'\U270D\U1F3FE'
emoji[writing_hand_dark_skin_tone]=$'\U270D\U1F3FF'
emoji[nail_polish]=$'\U1F485'
emoji[nail_care]=$'\U1F485'
emoji[nail_polish_light_skin_tone]=$'\U1F485\U1F3FB'
emoji[nail_polish_medium_light_skin_tone]=$'\U1F485\U1F3FC'
emoji[nail_polish_medium_skin_tone]=$'\U1F485\U1F3FD'
emoji[nail_polish_medium_dark_skin_tone]=$'\U1F485\U1F3FE'
emoji[nail_polish_dark_skin_tone]=$'\U1F485\U1F3FF'
emoji[selfie]=$'\U1F933'
emoji[selfie_light_skin_tone]=$'\U1F933\U1F3FB'
emoji[selfie_medium_light_skin_tone]=$'\U1F933\U1F3FC'
emoji[selfie_medium_skin_tone]=$'\U1F933\U1F3FD'
emoji[selfie_medium_dark_skin_tone]=$'\U1F933\U1F3FE'
emoji[selfie_dark_skin_tone]=$'\U1F933\U1F3FF'
emoji[flexed_biceps]=$'\U1F4AA'
emoji[muscle]=$'\U1F4AA'
emoji[flexed_biceps_light_skin_tone]=$'\U1F4AA\U1F3FB'
emoji[flexed_biceps_medium_light_skin_tone]=$'\U1F4AA\U1F3FC'
emoji[flexed_biceps_medium_skin_tone]=$'\U1F4AA\U1F3FD'
emoji[flexed_biceps_medium_dark_skin_tone]=$'\U1F4AA\U1F3FE'
emoji[flexed_biceps_dark_skin_tone]=$'\U1F4AA\U1F3FF'
emoji[mechanical_arm]=$'\U1F9BE'
emoji[mechanical_leg]=$'\U1F9BF'
emoji[mechanical_leg_1]=$'\U1F9B5'
emoji[leg]=$'\U1F9B5'
emoji[leg_light_skin_tone]=$'\U1F9B5\U1F3FB'
emoji[leg_medium_light_skin_tone]=$'\U1F9B5\U1F3FC'
emoji[leg_medium_skin_tone]=$'\U1F9B5\U1F3FD'
emoji[leg_medium_dark_skin_tone]=$'\U1F9B5\U1F3FE'
emoji[leg_dark_skin_tone]=$'\U1F9B5\U1F3FF'
emoji[foot]=$'\U1F9B6'
emoji[foot_light_skin_tone]=$'\U1F9B6\U1F3FB'
emoji[foot_medium_light_skin_tone]=$'\U1F9B6\U1F3FC'
emoji[foot_medium_skin_tone]=$'\U1F9B6\U1F3FD'
emoji[foot_medium_dark_skin_tone]=$'\U1F9B6\U1F3FE'
emoji[foot_dark_skin_tone]=$'\U1F9B6\U1F3FF'
emoji[ear]=$'\U1F442'
emoji[ear_light_skin_tone]=$'\U1F442\U1F3FB'
emoji[ear_medium_light_skin_tone]=$'\U1F442\U1F3FC'
emoji[ear_medium_skin_tone]=$'\U1F442\U1F3FD'
emoji[ear_medium_dark_skin_tone]=$'\U1F442\U1F3FE'
emoji[ear_dark_skin_tone]=$'\U1F442\U1F3FF'
emoji[ear_with_hearing_aid]=$'\U1F9BB'
emoji[ear_with_hearing_aid_light_skin_tone]=$'\U1F9BB\U1F3FB'
emoji[ear_with_hearing_aid_medium_light_skin_tone]=$'\U1F9BB\U1F3FC'
emoji[ear_with_hearing_aid_medium_skin_tone]=$'\U1F9BB\U1F3FD'
emoji[ear_with_hearing_aid_medium_dark_skin_tone]=$'\U1F9BB\U1F3FE'
emoji[ear_with_hearing_aid_dark_skin_tone]=$'\U1F9BB\U1F3FF'
emoji[nose]=$'\U1F443'
emoji[nose_light_skin_tone]=$'\U1F443\U1F3FB'
emoji[nose_medium_light_skin_tone]=$'\U1F443\U1F3FC'
emoji[nose_medium_skin_tone]=$'\U1F443\U1F3FD'
emoji[nose_medium_dark_skin_tone]=$'\U1F443\U1F3FE'
emoji[nose_dark_skin_tone]=$'\U1F443\U1F3FF'
emoji[brain]=$'\U1F9E0'
emoji[tooth]=$'\U1F9B7'
emoji[bone]=$'\U1F9B4'
emoji[eyes]=$'\U1F440'
emoji[eyes_1]=$'\U1F441\UFE0F'
emoji[eye_unqualified]=$'\U1F441'
emoji[eye]=$'\U1F441'
emoji[tongue]=$'\U1F445'
emoji[mouth]=$'\U1F444'
emoji[lips]=$'\U1F444'
emoji[baby]=$'\U1F476'
emoji[baby_light_skin_tone]=$'\U1F476\U1F3FB'
emoji[baby_medium_light_skin_tone]=$'\U1F476\U1F3FC'
emoji[baby_medium_skin_tone]=$'\U1F476\U1F3FD'
emoji[baby_medium_dark_skin_tone]=$'\U1F476\U1F3FE'
emoji[baby_dark_skin_tone]=$'\U1F476\U1F3FF'
emoji[child]=$'\U1F9D2'
emoji[child_light_skin_tone]=$'\U1F9D2\U1F3FB'
emoji[child_medium_light_skin_tone]=$'\U1F9D2\U1F3FC'
emoji[child_medium_skin_tone]=$'\U1F9D2\U1F3FD'
emoji[child_medium_dark_skin_tone]=$'\U1F9D2\U1F3FE'
emoji[child_dark_skin_tone]=$'\U1F9D2\U1F3FF'
emoji[boy]=$'\U1F466'
emoji[boy_light_skin_tone]=$'\U1F466\U1F3FB'
emoji[boy_medium_light_skin_tone]=$'\U1F466\U1F3FC'
emoji[boy_medium_skin_tone]=$'\U1F466\U1F3FD'
emoji[boy_medium_dark_skin_tone]=$'\U1F466\U1F3FE'
emoji[boy_dark_skin_tone]=$'\U1F466\U1F3FF'
emoji[girl]=$'\U1F467'
emoji[girl_light_skin_tone]=$'\U1F467\U1F3FB'
emoji[girl_medium_light_skin_tone]=$'\U1F467\U1F3FC'
emoji[girl_medium_skin_tone]=$'\U1F467\U1F3FD'
emoji[girl_medium_dark_skin_tone]=$'\U1F467\U1F3FE'
emoji[girl_dark_skin_tone]=$'\U1F467\U1F3FF'
emoji[person]=$'\U1F9D1'
emoji[adult]=$'\U1F9D1'
emoji[person_light_skin_tone]=$'\U1F9D1\U1F3FB'
emoji[person_medium_light_skin_tone]=$'\U1F9D1\U1F3FC'
emoji[person_medium_skin_tone]=$'\U1F9D1\U1F3FD'
emoji[person_medium_dark_skin_tone]=$'\U1F9D1\U1F3FE'
emoji[person_dark_skin_tone]=$'\U1F9D1\U1F3FF'
emoji[person_blond_hair]=$'\U1F471'
emoji[blond_haired_person]=$'\U1F471'
emoji[person_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB'
emoji[person_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC'
emoji[person_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD'
emoji[person_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE'
emoji[person_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF'
emoji[man]=$'\U1F468'
emoji[man_light_skin_tone]=$'\U1F468\U1F3FB'
emoji[man_medium_light_skin_tone]=$'\U1F468\U1F3FC'
emoji[man_medium_skin_tone]=$'\U1F468\U1F3FD'
emoji[man_medium_dark_skin_tone]=$'\U1F468\U1F3FE'
emoji[man_dark_skin_tone]=$'\U1F468\U1F3FF'
emoji[man_beard]=$'\U1F9D4'
emoji[bearded_person]=$'\U1F9D4'
emoji[man_light_skin_tone_beard]=$'\U1F9D4\U1F3FB'
emoji[man_medium_light_skin_tone_beard]=$'\U1F9D4\U1F3FC'
emoji[man_medium_skin_tone_beard]=$'\U1F9D4\U1F3FD'
emoji[man_medium_dark_skin_tone_beard]=$'\U1F9D4\U1F3FE'
emoji[man_dark_skin_tone_beard]=$'\U1F9D4\U1F3FF'
emoji[man_blond_hair]=$'\U1F471\U200D\U2642\UFE0F'
emoji[man_blond_hair_minimally]=$'\U1F471\U200D\U2642'
emoji[blond_haired_man]=$'\U1F471\U200D\U2642'
emoji[man_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2642\UFE0F'
emoji[man_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2642'
emoji[man_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2642\UFE0F'
emoji[man_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2642'
emoji[man_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2642\UFE0F'
emoji[man_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2642'
emoji[man_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2642\UFE0F'
emoji[man_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2642'
emoji[man_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2642\UFE0F'
emoji[man_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2642'
emoji[man_red_hair]=$'\U1F468\U200D\U1F9B0'
emoji[red_haired_man]=$'\U1F468\U200D\U1F9B0'
emoji[man_light_skin_tone_red_hair]=$'\U1F468\U1F3FB\U200D\U1F9B0'
emoji[man_medium_light_skin_tone_red_hair]=$'\U1F468\U1F3FC\U200D\U1F9B0'
emoji[man_medium_skin_tone_red_hair]=$'\U1F468\U1F3FD\U200D\U1F9B0'
emoji[man_medium_dark_skin_tone_red_hair]=$'\U1F468\U1F3FE\U200D\U1F9B0'
emoji[man_dark_skin_tone_red_hair]=$'\U1F468\U1F3FF\U200D\U1F9B0'
emoji[man_curly_hair]=$'\U1F468\U200D\U1F9B1'
emoji[curly_haired_man]=$'\U1F468\U200D\U1F9B1'
emoji[man_light_skin_tone_curly_hair]=$'\U1F468\U1F3FB\U200D\U1F9B1'
emoji[man_medium_light_skin_tone_curly_hair]=$'\U1F468\U1F3FC\U200D\U1F9B1'
emoji[man_medium_skin_tone_curly_hair]=$'\U1F468\U1F3FD\U200D\U1F9B1'
emoji[man_medium_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FE\U200D\U1F9B1'
emoji[man_dark_skin_tone_curly_hair]=$'\U1F468\U1F3FF\U200D\U1F9B1'
emoji[man_white_hair]=$'\U1F468\U200D\U1F9B3'
emoji[white_haired_man]=$'\U1F468\U200D\U1F9B3'
emoji[man_light_skin_tone_white_hair]=$'\U1F468\U1F3FB\U200D\U1F9B3'
emoji[man_medium_light_skin_tone_white_hair]=$'\U1F468\U1F3FC\U200D\U1F9B3'
emoji[man_medium_skin_tone_white_hair]=$'\U1F468\U1F3FD\U200D\U1F9B3'
emoji[man_medium_dark_skin_tone_white_hair]=$'\U1F468\U1F3FE\U200D\U1F9B3'
emoji[man_dark_skin_tone_white_hair]=$'\U1F468\U1F3FF\U200D\U1F9B3'
emoji[man_bald]=$'\U1F468\U200D\U1F9B2'
emoji[bald_man]=$'\U1F468\U200D\U1F9B2'
emoji[man_light_skin_tone_bald]=$'\U1F468\U1F3FB\U200D\U1F9B2'
emoji[man_medium_light_skin_tone_bald]=$'\U1F468\U1F3FC\U200D\U1F9B2'
emoji[man_medium_skin_tone_bald]=$'\U1F468\U1F3FD\U200D\U1F9B2'
emoji[man_medium_dark_skin_tone_bald]=$'\U1F468\U1F3FE\U200D\U1F9B2'
emoji[man_dark_skin_tone_bald]=$'\U1F468\U1F3FF\U200D\U1F9B2'
emoji[woman]=$'\U1F469'
emoji[woman_light_skin_tone]=$'\U1F469\U1F3FB'
emoji[woman_medium_light_skin_tone]=$'\U1F469\U1F3FC'
emoji[woman_medium_skin_tone]=$'\U1F469\U1F3FD'
emoji[woman_medium_dark_skin_tone]=$'\U1F469\U1F3FE'
emoji[woman_dark_skin_tone]=$'\U1F469\U1F3FF'
emoji[woman_blond_hair]=$'\U1F471\U200D\U2640\UFE0F'
emoji[woman_blond_hair_minimally]=$'\U1F471\U200D\U2640'
emoji[blond_haired_woman]=$'\U1F471\U200D\U2640'
emoji[blonde_woman]=$'\U1F471\U200D\U2640'
emoji[woman_light_skin_tone_blond_hair]=$'\U1F471\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FB\U200D\U2640'
emoji[woman_medium_light_skin_tone_blond_hair]=$'\U1F471\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_medium_light_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FC\U200D\U2640'
emoji[woman_medium_skin_tone_blond_hair]=$'\U1F471\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_medium_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FD\U200D\U2640'
emoji[woman_medium_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_medium_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FE\U200D\U2640'
emoji[woman_dark_skin_tone_blond_hair]=$'\U1F471\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_dark_skin_tone_blond_hair_minimally]=$'\U1F471\U1F3FF\U200D\U2640'
emoji[woman_red_hair]=$'\U1F469\U200D\U1F9B0'
emoji[red_haired_woman]=$'\U1F469\U200D\U1F9B0'
emoji[woman_light_skin_tone_red_hair]=$'\U1F469\U1F3FB\U200D\U1F9B0'
emoji[woman_medium_light_skin_tone_red_hair]=$'\U1F469\U1F3FC\U200D\U1F9B0'
emoji[woman_medium_skin_tone_red_hair]=$'\U1F469\U1F3FD\U200D\U1F9B0'
emoji[woman_medium_dark_skin_tone_red_hair]=$'\U1F469\U1F3FE\U200D\U1F9B0'
emoji[woman_dark_skin_tone_red_hair]=$'\U1F469\U1F3FF\U200D\U1F9B0'
emoji[woman_curly_hair]=$'\U1F469\U200D\U1F9B1'
emoji[curly_haired_woman]=$'\U1F469\U200D\U1F9B1'
emoji[woman_light_skin_tone_curly_hair]=$'\U1F469\U1F3FB\U200D\U1F9B1'
emoji[woman_medium_light_skin_tone_curly_hair]=$'\U1F469\U1F3FC\U200D\U1F9B1'
emoji[woman_medium_skin_tone_curly_hair]=$'\U1F469\U1F3FD\U200D\U1F9B1'
emoji[woman_medium_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FE\U200D\U1F9B1'
emoji[woman_dark_skin_tone_curly_hair]=$'\U1F469\U1F3FF\U200D\U1F9B1'
emoji[woman_white_hair]=$'\U1F469\U200D\U1F9B3'
emoji[white_haired_woman]=$'\U1F469\U200D\U1F9B3'
emoji[woman_light_skin_tone_white_hair]=$'\U1F469\U1F3FB\U200D\U1F9B3'
emoji[woman_medium_light_skin_tone_white_hair]=$'\U1F469\U1F3FC\U200D\U1F9B3'
emoji[woman_medium_skin_tone_white_hair]=$'\U1F469\U1F3FD\U200D\U1F9B3'
emoji[woman_medium_dark_skin_tone_white_hair]=$'\U1F469\U1F3FE\U200D\U1F9B3'
emoji[woman_dark_skin_tone_white_hair]=$'\U1F469\U1F3FF\U200D\U1F9B3'
emoji[woman_bald]=$'\U1F469\U200D\U1F9B2'
emoji[bald_woman]=$'\U1F469\U200D\U1F9B2'
emoji[woman_light_skin_tone_bald]=$'\U1F469\U1F3FB\U200D\U1F9B2'
emoji[woman_medium_light_skin_tone_bald]=$'\U1F469\U1F3FC\U200D\U1F9B2'
emoji[woman_medium_skin_tone_bald]=$'\U1F469\U1F3FD\U200D\U1F9B2'
emoji[woman_medium_dark_skin_tone_bald]=$'\U1F469\U1F3FE\U200D\U1F9B2'
emoji[woman_dark_skin_tone_bald]=$'\U1F469\U1F3FF\U200D\U1F9B2'
emoji[older_person]=$'\U1F9D3'
emoji[older_adult]=$'\U1F9D3'
emoji[older_person_light_skin_tone]=$'\U1F9D3\U1F3FB'
emoji[older_person_medium_light_skin_tone]=$'\U1F9D3\U1F3FC'
emoji[older_person_medium_skin_tone]=$'\U1F9D3\U1F3FD'
emoji[older_person_medium_dark_skin_tone]=$'\U1F9D3\U1F3FE'
emoji[older_person_dark_skin_tone]=$'\U1F9D3\U1F3FF'
emoji[old_man]=$'\U1F474'
emoji[older_man]=$'\U1F474'
emoji[old_man_light_skin_tone]=$'\U1F474\U1F3FB'
emoji[old_man_medium_light_skin_tone]=$'\U1F474\U1F3FC'
emoji[old_man_medium_skin_tone]=$'\U1F474\U1F3FD'
emoji[old_man_medium_dark_skin_tone]=$'\U1F474\U1F3FE'
emoji[old_man_dark_skin_tone]=$'\U1F474\U1F3FF'
emoji[old_woman]=$'\U1F475'
emoji[older_woman]=$'\U1F475'
emoji[old_woman_light_skin_tone]=$'\U1F475\U1F3FB'
emoji[old_woman_medium_light_skin_tone]=$'\U1F475\U1F3FC'
emoji[old_woman_medium_skin_tone]=$'\U1F475\U1F3FD'
emoji[old_woman_medium_dark_skin_tone]=$'\U1F475\U1F3FE'
emoji[old_woman_dark_skin_tone]=$'\U1F475\U1F3FF'
emoji[person_frowning]=$'\U1F64D'
emoji[frowning_person]=$'\U1F64D'
emoji[person_frowning_light_skin_tone]=$'\U1F64D\U1F3FB'
emoji[person_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC'
emoji[person_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD'
emoji[person_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE'
emoji[person_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF'
emoji[man_frowning]=$'\U1F64D\U200D\U2642\UFE0F'
emoji[man_frowning_minimally]=$'\U1F64D\U200D\U2642'
emoji[frowning_man]=$'\U1F64D\U200D\U2642'
emoji[man_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2642\UFE0F'
emoji[man_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2642'
emoji[man_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2642\UFE0F'
emoji[man_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2642'
emoji[man_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2642\UFE0F'
emoji[man_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2642'
emoji[man_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2642\UFE0F'
emoji[man_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2642'
emoji[man_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2642\UFE0F'
emoji[man_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2642'
emoji[woman_frowning]=$'\U1F64D\U200D\U2640\UFE0F'
emoji[woman_frowning_minimally]=$'\U1F64D\U200D\U2640'
emoji[frowning_woman]=$'\U1F64D\U200D\U2640'
emoji[woman_frowning_light_skin_tone]=$'\U1F64D\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_frowning_light_skin_tone_minimally]=$'\U1F64D\U1F3FB\U200D\U2640'
emoji[woman_frowning_medium_light_skin_tone]=$'\U1F64D\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_frowning_medium_light_skin_tone_minimally]=$'\U1F64D\U1F3FC\U200D\U2640'
emoji[woman_frowning_medium_skin_tone]=$'\U1F64D\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_frowning_medium_skin_tone_minimally]=$'\U1F64D\U1F3FD\U200D\U2640'
emoji[woman_frowning_medium_dark_skin_tone]=$'\U1F64D\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_frowning_medium_dark_skin_tone_minimally]=$'\U1F64D\U1F3FE\U200D\U2640'
emoji[woman_frowning_dark_skin_tone]=$'\U1F64D\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_frowning_dark_skin_tone_minimally]=$'\U1F64D\U1F3FF\U200D\U2640'
emoji[person_pouting]=$'\U1F64E'
emoji[person_pouting_light_skin_tone]=$'\U1F64E\U1F3FB'
emoji[person_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC'
emoji[person_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD'
emoji[person_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE'
emoji[person_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF'
emoji[man_pouting]=$'\U1F64E\U200D\U2642\UFE0F'
emoji[man_pouting_minimally]=$'\U1F64E\U200D\U2642'
emoji[pouting_man]=$'\U1F64E\U200D\U2642'
emoji[man_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2642\UFE0F'
emoji[man_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2642'
emoji[man_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2642\UFE0F'
emoji[man_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2642'
emoji[man_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2642\UFE0F'
emoji[man_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2642'
emoji[man_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2642\UFE0F'
emoji[man_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2642'
emoji[man_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2642\UFE0F'
emoji[man_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2642'
emoji[woman_pouting]=$'\U1F64E\U200D\U2640\UFE0F'
emoji[woman_pouting_minimally]=$'\U1F64E\U200D\U2640'
emoji[pouting_woman]=$'\U1F64E\U200D\U2640'
emoji[woman_pouting_light_skin_tone]=$'\U1F64E\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_pouting_light_skin_tone_minimally]=$'\U1F64E\U1F3FB\U200D\U2640'
emoji[woman_pouting_medium_light_skin_tone]=$'\U1F64E\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_pouting_medium_light_skin_tone_minimally]=$'\U1F64E\U1F3FC\U200D\U2640'
emoji[woman_pouting_medium_skin_tone]=$'\U1F64E\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_pouting_medium_skin_tone_minimally]=$'\U1F64E\U1F3FD\U200D\U2640'
emoji[woman_pouting_medium_dark_skin_tone]=$'\U1F64E\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_pouting_medium_dark_skin_tone_minimally]=$'\U1F64E\U1F3FE\U200D\U2640'
emoji[woman_pouting_dark_skin_tone]=$'\U1F64E\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_pouting_dark_skin_tone_minimally]=$'\U1F64E\U1F3FF\U200D\U2640'
emoji[person_gesturing_NO]=$'\U1F645'
emoji[no_good]=$'\U1F645'
emoji[person_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB'
emoji[person_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC'
emoji[person_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD'
emoji[person_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE'
emoji[person_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF'
emoji[man_gesturing_NO]=$'\U1F645\U200D\U2642\UFE0F'
emoji[man_gesturing_NO_minimally]=$'\U1F645\U200D\U2642'
emoji[no_good_man]=$'\U1F645\U200D\U2642'
emoji[ng_man]=$'\U1F645\U200D\U2642'
emoji[man_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2642\UFE0F'
emoji[man_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2642'
emoji[man_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2642\UFE0F'
emoji[man_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2642'
emoji[man_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2642\UFE0F'
emoji[man_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2642'
emoji[man_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2642\UFE0F'
emoji[man_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2642'
emoji[man_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2642\UFE0F'
emoji[man_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2642'
emoji[woman_gesturing_NO]=$'\U1F645\U200D\U2640\UFE0F'
emoji[woman_gesturing_NO_minimally]=$'\U1F645\U200D\U2640'
emoji[no_good_woman]=$'\U1F645\U200D\U2640'
emoji[ng_woman]=$'\U1F645\U200D\U2640'
emoji[woman_gesturing_NO_light_skin_tone]=$'\U1F645\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_gesturing_NO_light_skin_tone_minimally]=$'\U1F645\U1F3FB\U200D\U2640'
emoji[woman_gesturing_NO_medium_light_skin_tone]=$'\U1F645\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_gesturing_NO_medium_light_skin_tone_minimally]=$'\U1F645\U1F3FC\U200D\U2640'
emoji[woman_gesturing_NO_medium_skin_tone]=$'\U1F645\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_gesturing_NO_medium_skin_tone_minimally]=$'\U1F645\U1F3FD\U200D\U2640'
emoji[woman_gesturing_NO_medium_dark_skin_tone]=$'\U1F645\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_gesturing_NO_medium_dark_skin_tone_minimally]=$'\U1F645\U1F3FE\U200D\U2640'
emoji[woman_gesturing_NO_dark_skin_tone]=$'\U1F645\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_gesturing_NO_dark_skin_tone_minimally]=$'\U1F645\U1F3FF\U200D\U2640'
emoji[person_gesturing_OK]=$'\U1F646'
emoji[ok_person]=$'\U1F646'
emoji[person_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB'
emoji[person_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC'
emoji[person_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD'
emoji[person_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE'
emoji[person_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF'
emoji[man_gesturing_OK]=$'\U1F646\U200D\U2642\UFE0F'
emoji[man_gesturing_OK_minimally]=$'\U1F646\U200D\U2642'
emoji[ok_man]=$'\U1F646\U200D\U2642'
emoji[man_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2642\UFE0F'
emoji[man_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2642'
emoji[man_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2642\UFE0F'
emoji[man_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2642'
emoji[man_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2642\UFE0F'
emoji[man_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2642'
emoji[man_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2642\UFE0F'
emoji[man_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2642'
emoji[man_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2642\UFE0F'
emoji[man_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2642'
emoji[woman_gesturing_OK]=$'\U1F646\U200D\U2640\UFE0F'
emoji[woman_gesturing_OK_minimally]=$'\U1F646\U200D\U2640'
emoji[ok_woman]=$'\U1F646\U200D\U2640'
emoji[woman_gesturing_OK_light_skin_tone]=$'\U1F646\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_gesturing_OK_light_skin_tone_minimally]=$'\U1F646\U1F3FB\U200D\U2640'
emoji[woman_gesturing_OK_medium_light_skin_tone]=$'\U1F646\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_gesturing_OK_medium_light_skin_tone_minimally]=$'\U1F646\U1F3FC\U200D\U2640'
emoji[woman_gesturing_OK_medium_skin_tone]=$'\U1F646\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_gesturing_OK_medium_skin_tone_minimally]=$'\U1F646\U1F3FD\U200D\U2640'
emoji[woman_gesturing_OK_medium_dark_skin_tone]=$'\U1F646\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_gesturing_OK_medium_dark_skin_tone_minimally]=$'\U1F646\U1F3FE\U200D\U2640'
emoji[woman_gesturing_OK_dark_skin_tone]=$'\U1F646\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_gesturing_OK_dark_skin_tone_minimally]=$'\U1F646\U1F3FF\U200D\U2640'
emoji[person_tipping_hand]=$'\U1F481'
emoji[tipping_hand_person]=$'\U1F481'
emoji[information_desk_person]=$'\U1F481'
emoji[person_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB'
emoji[person_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC'
emoji[person_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD'
emoji[person_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE'
emoji[person_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF'
emoji[man_tipping_hand]=$'\U1F481\U200D\U2642\UFE0F'
emoji[man_tipping_hand_minimally]=$'\U1F481\U200D\U2642'
emoji[tipping_hand_man]=$'\U1F481\U200D\U2642'
emoji[sassy_man]=$'\U1F481\U200D\U2642'
emoji[man_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2642\UFE0F'
emoji[man_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2642'
emoji[man_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2642\UFE0F'
emoji[man_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2642'
emoji[man_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2642\UFE0F'
emoji[man_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2642'
emoji[man_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2642\UFE0F'
emoji[man_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2642'
emoji[man_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2642\UFE0F'
emoji[man_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2642'
emoji[woman_tipping_hand]=$'\U1F481\U200D\U2640\UFE0F'
emoji[woman_tipping_hand_minimally]=$'\U1F481\U200D\U2640'
emoji[tipping_hand_woman]=$'\U1F481\U200D\U2640'
emoji[sassy_woman]=$'\U1F481\U200D\U2640'
emoji[woman_tipping_hand_light_skin_tone]=$'\U1F481\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_tipping_hand_light_skin_tone_minimally]=$'\U1F481\U1F3FB\U200D\U2640'
emoji[woman_tipping_hand_medium_light_skin_tone]=$'\U1F481\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_tipping_hand_medium_light_skin_tone_minimally]=$'\U1F481\U1F3FC\U200D\U2640'
emoji[woman_tipping_hand_medium_skin_tone]=$'\U1F481\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_tipping_hand_medium_skin_tone_minimally]=$'\U1F481\U1F3FD\U200D\U2640'
emoji[woman_tipping_hand_medium_dark_skin_tone]=$'\U1F481\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_tipping_hand_medium_dark_skin_tone_minimally]=$'\U1F481\U1F3FE\U200D\U2640'
emoji[woman_tipping_hand_dark_skin_tone]=$'\U1F481\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_tipping_hand_dark_skin_tone_minimally]=$'\U1F481\U1F3FF\U200D\U2640'
emoji[person_raising_hand]=$'\U1F64B'
emoji[raising_hand]=$'\U1F64B'
emoji[person_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB'
emoji[person_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC'
emoji[person_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD'
emoji[person_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE'
emoji[person_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF'
emoji[man_raising_hand]=$'\U1F64B\U200D\U2642\UFE0F'
emoji[man_raising_hand_minimally]=$'\U1F64B\U200D\U2642'
emoji[raising_hand_man]=$'\U1F64B\U200D\U2642'
emoji[man_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2642\UFE0F'
emoji[man_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2642'
emoji[man_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2642\UFE0F'
emoji[man_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2642'
emoji[man_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2642\UFE0F'
emoji[man_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2642'
emoji[man_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2642\UFE0F'
emoji[man_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2642'
emoji[man_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2642\UFE0F'
emoji[man_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2642'
emoji[woman_raising_hand]=$'\U1F64B\U200D\U2640\UFE0F'
emoji[woman_raising_hand_minimally]=$'\U1F64B\U200D\U2640'
emoji[raising_hand_woman]=$'\U1F64B\U200D\U2640'
emoji[woman_raising_hand_light_skin_tone]=$'\U1F64B\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_raising_hand_light_skin_tone_minimally]=$'\U1F64B\U1F3FB\U200D\U2640'
emoji[woman_raising_hand_medium_light_skin_tone]=$'\U1F64B\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_raising_hand_medium_light_skin_tone_minimally]=$'\U1F64B\U1F3FC\U200D\U2640'
emoji[woman_raising_hand_medium_skin_tone]=$'\U1F64B\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_raising_hand_medium_skin_tone_minimally]=$'\U1F64B\U1F3FD\U200D\U2640'
emoji[woman_raising_hand_medium_dark_skin_tone]=$'\U1F64B\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_raising_hand_medium_dark_skin_tone_minimally]=$'\U1F64B\U1F3FE\U200D\U2640'
emoji[woman_raising_hand_dark_skin_tone]=$'\U1F64B\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_raising_hand_dark_skin_tone_minimally]=$'\U1F64B\U1F3FF\U200D\U2640'
emoji[deaf_person]=$'\U1F9CF'
emoji[deaf_person_light_skin_tone]=$'\U1F9CF\U1F3FB'
emoji[deaf_person_medium_light_skin_tone]=$'\U1F9CF\U1F3FC'
emoji[deaf_person_medium_skin_tone]=$'\U1F9CF\U1F3FD'
emoji[deaf_person_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE'
emoji[deaf_person_dark_skin_tone]=$'\U1F9CF\U1F3FF'
emoji[deaf_man]=$'\U1F9CF\U200D\U2642\UFE0F'
emoji[deaf_man_minimally]=$'\U1F9CF\U200D\U2642'
emoji[deaf_man_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2642\UFE0F'
emoji[deaf_man_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2642'
emoji[deaf_man_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2642\UFE0F'
emoji[deaf_man_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2642'
emoji[deaf_man_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2642\UFE0F'
emoji[deaf_man_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2642'
emoji[deaf_man_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2642\UFE0F'
emoji[deaf_man_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2642'
emoji[deaf_man_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2642\UFE0F'
emoji[deaf_man_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2642'
emoji[deaf_woman]=$'\U1F9CF\U200D\U2640\UFE0F'
emoji[deaf_woman_minimally]=$'\U1F9CF\U200D\U2640'
emoji[deaf_woman_light_skin_tone]=$'\U1F9CF\U1F3FB\U200D\U2640\UFE0F'
emoji[deaf_woman_light_skin_tone_minimally]=$'\U1F9CF\U1F3FB\U200D\U2640'
emoji[deaf_woman_medium_light_skin_tone]=$'\U1F9CF\U1F3FC\U200D\U2640\UFE0F'
emoji[deaf_woman_medium_light_skin_tone_minimally]=$'\U1F9CF\U1F3FC\U200D\U2640'
emoji[deaf_woman_medium_skin_tone]=$'\U1F9CF\U1F3FD\U200D\U2640\UFE0F'
emoji[deaf_woman_medium_skin_tone_minimally]=$'\U1F9CF\U1F3FD\U200D\U2640'
emoji[deaf_woman_medium_dark_skin_tone]=$'\U1F9CF\U1F3FE\U200D\U2640\UFE0F'
emoji[deaf_woman_medium_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FE\U200D\U2640'
emoji[deaf_woman_dark_skin_tone]=$'\U1F9CF\U1F3FF\U200D\U2640\UFE0F'
emoji[deaf_woman_dark_skin_tone_minimally]=$'\U1F9CF\U1F3FF\U200D\U2640'
emoji[person_bowing]=$'\U1F647'
emoji[bow]=$'\U1F647'
emoji[person_bowing_light_skin_tone]=$'\U1F647\U1F3FB'
emoji[person_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC'
emoji[person_bowing_medium_skin_tone]=$'\U1F647\U1F3FD'
emoji[person_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE'
emoji[person_bowing_dark_skin_tone]=$'\U1F647\U1F3FF'
emoji[man_bowing]=$'\U1F647\U200D\U2642\UFE0F'
emoji[man_bowing_minimally]=$'\U1F647\U200D\U2642'
emoji[bowing_man]=$'\U1F647\U200D\U2642'
emoji[man_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2642\UFE0F'
emoji[man_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2642'
emoji[man_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2642\UFE0F'
emoji[man_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2642'
emoji[man_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2642\UFE0F'
emoji[man_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2642'
emoji[man_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2642\UFE0F'
emoji[man_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2642'
emoji[man_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2642\UFE0F'
emoji[man_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2642'
emoji[woman_bowing]=$'\U1F647\U200D\U2640\UFE0F'
emoji[woman_bowing_minimally]=$'\U1F647\U200D\U2640'
emoji[bowing_woman]=$'\U1F647\U200D\U2640'
emoji[woman_bowing_light_skin_tone]=$'\U1F647\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_bowing_light_skin_tone_minimally]=$'\U1F647\U1F3FB\U200D\U2640'
emoji[woman_bowing_medium_light_skin_tone]=$'\U1F647\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_bowing_medium_light_skin_tone_minimally]=$'\U1F647\U1F3FC\U200D\U2640'
emoji[woman_bowing_medium_skin_tone]=$'\U1F647\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_bowing_medium_skin_tone_minimally]=$'\U1F647\U1F3FD\U200D\U2640'
emoji[woman_bowing_medium_dark_skin_tone]=$'\U1F647\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_bowing_medium_dark_skin_tone_minimally]=$'\U1F647\U1F3FE\U200D\U2640'
emoji[woman_bowing_dark_skin_tone]=$'\U1F647\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_bowing_dark_skin_tone_minimally]=$'\U1F647\U1F3FF\U200D\U2640'
emoji[person_facepalming]=$'\U1F926'
emoji[facepalm]=$'\U1F926'
emoji[person_facepalming_light_skin_tone]=$'\U1F926\U1F3FB'
emoji[person_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC'
emoji[person_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD'
emoji[person_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE'
emoji[person_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF'
emoji[man_facepalming]=$'\U1F926\U200D\U2642\UFE0F'
emoji[man_facepalming_minimally]=$'\U1F926\U200D\U2642'
emoji[man_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2642\UFE0F'
emoji[man_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2642'
emoji[man_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2642\UFE0F'
emoji[man_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2642'
emoji[man_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2642\UFE0F'
emoji[man_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2642'
emoji[man_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2642\UFE0F'
emoji[man_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2642'
emoji[man_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2642\UFE0F'
emoji[man_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2642'
emoji[woman_facepalming]=$'\U1F926\U200D\U2640\UFE0F'
emoji[woman_facepalming_minimally]=$'\U1F926\U200D\U2640'
emoji[woman_facepalming_light_skin_tone]=$'\U1F926\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_facepalming_light_skin_tone_minimally]=$'\U1F926\U1F3FB\U200D\U2640'
emoji[woman_facepalming_medium_light_skin_tone]=$'\U1F926\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_facepalming_medium_light_skin_tone_minimally]=$'\U1F926\U1F3FC\U200D\U2640'
emoji[woman_facepalming_medium_skin_tone]=$'\U1F926\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_facepalming_medium_skin_tone_minimally]=$'\U1F926\U1F3FD\U200D\U2640'
emoji[woman_facepalming_medium_dark_skin_tone]=$'\U1F926\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_facepalming_medium_dark_skin_tone_minimally]=$'\U1F926\U1F3FE\U200D\U2640'
emoji[woman_facepalming_dark_skin_tone]=$'\U1F926\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_facepalming_dark_skin_tone_minimally]=$'\U1F926\U1F3FF\U200D\U2640'
emoji[person_shrugging]=$'\U1F937'
emoji[shrug]=$'\U1F937'
emoji[person_shrugging_light_skin_tone]=$'\U1F937\U1F3FB'
emoji[person_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC'
emoji[person_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD'
emoji[person_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE'
emoji[person_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF'
emoji[man_shrugging]=$'\U1F937\U200D\U2642\UFE0F'
emoji[man_shrugging_minimally]=$'\U1F937\U200D\U2642'
emoji[man_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2642\UFE0F'
emoji[man_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2642'
emoji[man_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2642\UFE0F'
emoji[man_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2642'
emoji[man_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2642\UFE0F'
emoji[man_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2642'
emoji[man_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2642\UFE0F'
emoji[man_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2642'
emoji[man_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2642\UFE0F'
emoji[man_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2642'
emoji[woman_shrugging]=$'\U1F937\U200D\U2640\UFE0F'
emoji[woman_shrugging_minimally]=$'\U1F937\U200D\U2640'
emoji[woman_shrugging_light_skin_tone]=$'\U1F937\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_shrugging_light_skin_tone_minimally]=$'\U1F937\U1F3FB\U200D\U2640'
emoji[woman_shrugging_medium_light_skin_tone]=$'\U1F937\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_shrugging_medium_light_skin_tone_minimally]=$'\U1F937\U1F3FC\U200D\U2640'
emoji[woman_shrugging_medium_skin_tone]=$'\U1F937\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_shrugging_medium_skin_tone_minimally]=$'\U1F937\U1F3FD\U200D\U2640'
emoji[woman_shrugging_medium_dark_skin_tone]=$'\U1F937\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_shrugging_medium_dark_skin_tone_minimally]=$'\U1F937\U1F3FE\U200D\U2640'
emoji[woman_shrugging_dark_skin_tone]=$'\U1F937\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_shrugging_dark_skin_tone_minimally]=$'\U1F937\U1F3FF\U200D\U2640'
emoji[man_health_worker]=$'\U1F468\U200D\U2695\UFE0F'
emoji[man_health_worker_minimally]=$'\U1F468\U200D\U2695'
emoji[man_health_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2695\UFE0F'
emoji[man_health_worker_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2695'
emoji[man_health_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2695\UFE0F'
emoji[man_health_worker_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2695'
emoji[man_health_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2695\UFE0F'
emoji[man_health_worker_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2695'
emoji[man_health_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2695\UFE0F'
emoji[man_health_worker_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2695'
emoji[man_health_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2695\UFE0F'
emoji[man_health_worker_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2695'
emoji[woman_health_worker]=$'\U1F469\U200D\U2695\UFE0F'
emoji[woman_health_worker_minimally]=$'\U1F469\U200D\U2695'
emoji[woman_health_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2695\UFE0F'
emoji[woman_health_worker_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2695'
emoji[woman_health_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2695\UFE0F'
emoji[woman_health_worker_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2695'
emoji[woman_health_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2695\UFE0F'
emoji[woman_health_worker_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2695'
emoji[woman_health_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2695\UFE0F'
emoji[woman_health_worker_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2695'
emoji[woman_health_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2695\UFE0F'
emoji[woman_health_worker_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2695'
emoji[man_student]=$'\U1F468\U200D\U1F393'
emoji[man_student_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F393'
emoji[man_student_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F393'
emoji[man_student_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F393'
emoji[man_student_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F393'
emoji[man_student_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F393'
emoji[woman_student]=$'\U1F469\U200D\U1F393'
emoji[woman_student_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F393'
emoji[woman_student_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F393'
emoji[woman_student_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F393'
emoji[woman_student_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F393'
emoji[woman_student_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F393'
emoji[man_teacher]=$'\U1F468\U200D\U1F3EB'
emoji[man_teacher_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3EB'
emoji[man_teacher_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3EB'
emoji[man_teacher_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3EB'
emoji[man_teacher_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3EB'
emoji[man_teacher_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3EB'
emoji[woman_teacher]=$'\U1F469\U200D\U1F3EB'
emoji[woman_teacher_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3EB'
emoji[woman_teacher_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3EB'
emoji[woman_teacher_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3EB'
emoji[woman_teacher_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3EB'
emoji[woman_teacher_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3EB'
emoji[man_judge]=$'\U1F468\U200D\U2696\UFE0F'
emoji[man_judge_minimally]=$'\U1F468\U200D\U2696'
emoji[man_judge_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2696\UFE0F'
emoji[man_judge_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2696'
emoji[man_judge_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2696\UFE0F'
emoji[man_judge_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2696'
emoji[man_judge_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2696\UFE0F'
emoji[man_judge_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2696'
emoji[man_judge_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2696\UFE0F'
emoji[man_judge_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2696'
emoji[man_judge_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2696\UFE0F'
emoji[man_judge_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2696'
emoji[woman_judge]=$'\U1F469\U200D\U2696\UFE0F'
emoji[woman_judge_minimally]=$'\U1F469\U200D\U2696'
emoji[woman_judge_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2696\UFE0F'
emoji[woman_judge_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2696'
emoji[woman_judge_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2696\UFE0F'
emoji[woman_judge_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2696'
emoji[woman_judge_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2696\UFE0F'
emoji[woman_judge_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2696'
emoji[woman_judge_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2696\UFE0F'
emoji[woman_judge_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2696'
emoji[woman_judge_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2696\UFE0F'
emoji[woman_judge_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2696'
emoji[man_farmer]=$'\U1F468\U200D\U1F33E'
emoji[man_farmer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F33E'
emoji[man_farmer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F33E'
emoji[man_farmer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F33E'
emoji[man_farmer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F33E'
emoji[man_farmer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F33E'
emoji[woman_farmer]=$'\U1F469\U200D\U1F33E'
emoji[woman_farmer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F33E'
emoji[woman_farmer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F33E'
emoji[woman_farmer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F33E'
emoji[woman_farmer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F33E'
emoji[woman_farmer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F33E'
emoji[man_cook]=$'\U1F468\U200D\U1F373'
emoji[man_cook_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F373'
emoji[man_cook_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F373'
emoji[man_cook_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F373'
emoji[man_cook_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F373'
emoji[man_cook_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F373'
emoji[woman_cook]=$'\U1F469\U200D\U1F373'
emoji[woman_cook_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F373'
emoji[woman_cook_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F373'
emoji[woman_cook_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F373'
emoji[woman_cook_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F373'
emoji[woman_cook_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F373'
emoji[man_mechanic]=$'\U1F468\U200D\U1F527'
emoji[man_mechanic_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F527'
emoji[man_mechanic_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F527'
emoji[man_mechanic_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F527'
emoji[man_mechanic_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F527'
emoji[man_mechanic_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F527'
emoji[woman_mechanic]=$'\U1F469\U200D\U1F527'
emoji[woman_mechanic_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F527'
emoji[woman_mechanic_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F527'
emoji[woman_mechanic_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F527'
emoji[woman_mechanic_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F527'
emoji[woman_mechanic_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F527'
emoji[man_factory_worker]=$'\U1F468\U200D\U1F3ED'
emoji[man_factory_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3ED'
emoji[man_factory_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3ED'
emoji[man_factory_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3ED'
emoji[man_factory_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3ED'
emoji[man_factory_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3ED'
emoji[woman_factory_worker]=$'\U1F469\U200D\U1F3ED'
emoji[woman_factory_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3ED'
emoji[woman_factory_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3ED'
emoji[woman_factory_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3ED'
emoji[woman_factory_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3ED'
emoji[woman_factory_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3ED'
emoji[man_office_worker]=$'\U1F468\U200D\U1F4BC'
emoji[man_office_worker_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BC'
emoji[man_office_worker_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BC'
emoji[man_office_worker_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BC'
emoji[man_office_worker_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BC'
emoji[man_office_worker_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BC'
emoji[woman_office_worker]=$'\U1F469\U200D\U1F4BC'
emoji[woman_office_worker_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BC'
emoji[woman_office_worker_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BC'
emoji[woman_office_worker_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BC'
emoji[woman_office_worker_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BC'
emoji[woman_office_worker_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BC'
emoji[man_scientist]=$'\U1F468\U200D\U1F52C'
emoji[man_scientist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F52C'
emoji[man_scientist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F52C'
emoji[man_scientist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F52C'
emoji[man_scientist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F52C'
emoji[man_scientist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F52C'
emoji[woman_scientist]=$'\U1F469\U200D\U1F52C'
emoji[woman_scientist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F52C'
emoji[woman_scientist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F52C'
emoji[woman_scientist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F52C'
emoji[woman_scientist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F52C'
emoji[woman_scientist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F52C'
emoji[man_technologist]=$'\U1F468\U200D\U1F4BB'
emoji[man_technologist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F4BB'
emoji[man_technologist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F4BB'
emoji[man_technologist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F4BB'
emoji[man_technologist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F4BB'
emoji[man_technologist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F4BB'
emoji[woman_technologist]=$'\U1F469\U200D\U1F4BB'
emoji[woman_technologist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F4BB'
emoji[woman_technologist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F4BB'
emoji[woman_technologist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F4BB'
emoji[woman_technologist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F4BB'
emoji[woman_technologist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F4BB'
emoji[man_singer]=$'\U1F468\U200D\U1F3A4'
emoji[man_singer_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A4'
emoji[man_singer_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A4'
emoji[man_singer_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A4'
emoji[man_singer_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A4'
emoji[man_singer_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A4'
emoji[woman_singer]=$'\U1F469\U200D\U1F3A4'
emoji[woman_singer_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A4'
emoji[woman_singer_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A4'
emoji[woman_singer_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A4'
emoji[woman_singer_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A4'
emoji[woman_singer_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A4'
emoji[man_artist]=$'\U1F468\U200D\U1F3A8'
emoji[man_artist_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F3A8'
emoji[man_artist_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F3A8'
emoji[man_artist_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F3A8'
emoji[man_artist_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F3A8'
emoji[man_artist_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F3A8'
emoji[woman_artist]=$'\U1F469\U200D\U1F3A8'
emoji[woman_artist_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F3A8'
emoji[woman_artist_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F3A8'
emoji[woman_artist_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F3A8'
emoji[woman_artist_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F3A8'
emoji[woman_artist_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F3A8'
emoji[man_pilot]=$'\U1F468\U200D\U2708\UFE0F'
emoji[man_pilot_minimally]=$'\U1F468\U200D\U2708'
emoji[man_pilot_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U2708\UFE0F'
emoji[man_pilot_light_skin_tone_minimally]=$'\U1F468\U1F3FB\U200D\U2708'
emoji[man_pilot_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U2708\UFE0F'
emoji[man_pilot_medium_light_skin_tone_minimally]=$'\U1F468\U1F3FC\U200D\U2708'
emoji[man_pilot_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U2708\UFE0F'
emoji[man_pilot_medium_skin_tone_minimally]=$'\U1F468\U1F3FD\U200D\U2708'
emoji[man_pilot_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U2708\UFE0F'
emoji[man_pilot_medium_dark_skin_tone_minimally]=$'\U1F468\U1F3FE\U200D\U2708'
emoji[man_pilot_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U2708\UFE0F'
emoji[man_pilot_dark_skin_tone_minimally]=$'\U1F468\U1F3FF\U200D\U2708'
emoji[woman_pilot]=$'\U1F469\U200D\U2708\UFE0F'
emoji[woman_pilot_minimally]=$'\U1F469\U200D\U2708'
emoji[woman_pilot_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U2708\UFE0F'
emoji[woman_pilot_light_skin_tone_minimally]=$'\U1F469\U1F3FB\U200D\U2708'
emoji[woman_pilot_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U2708\UFE0F'
emoji[woman_pilot_medium_light_skin_tone_minimally]=$'\U1F469\U1F3FC\U200D\U2708'
emoji[woman_pilot_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U2708\UFE0F'
emoji[woman_pilot_medium_skin_tone_minimally]=$'\U1F469\U1F3FD\U200D\U2708'
emoji[woman_pilot_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U2708\UFE0F'
emoji[woman_pilot_medium_dark_skin_tone_minimally]=$'\U1F469\U1F3FE\U200D\U2708'
emoji[woman_pilot_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U2708\UFE0F'
emoji[woman_pilot_dark_skin_tone_minimally]=$'\U1F469\U1F3FF\U200D\U2708'
emoji[man_astronaut]=$'\U1F468\U200D\U1F680'
emoji[man_astronaut_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F680'
emoji[man_astronaut_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F680'
emoji[man_astronaut_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F680'
emoji[man_astronaut_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F680'
emoji[man_astronaut_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F680'
emoji[woman_astronaut]=$'\U1F469\U200D\U1F680'
emoji[woman_astronaut_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F680'
emoji[woman_astronaut_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F680'
emoji[woman_astronaut_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F680'
emoji[woman_astronaut_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F680'
emoji[woman_astronaut_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F680'
emoji[man_firefighter]=$'\U1F468\U200D\U1F692'
emoji[man_firefighter_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F692'
emoji[man_firefighter_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F692'
emoji[man_firefighter_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F692'
emoji[man_firefighter_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F692'
emoji[man_firefighter_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F692'
emoji[woman_firefighter]=$'\U1F469\U200D\U1F692'
emoji[woman_firefighter_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F692'
emoji[woman_firefighter_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F692'
emoji[woman_firefighter_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F692'
emoji[woman_firefighter_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F692'
emoji[woman_firefighter_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F692'
emoji[police_officer]=$'\U1F46E'
emoji[cop]=$'\U1F46E'
emoji[police_officer_light_skin_tone]=$'\U1F46E\U1F3FB'
emoji[police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC'
emoji[police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD'
emoji[police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE'
emoji[police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF'
emoji[man_police_officer]=$'\U1F46E\U200D\U2642\UFE0F'
emoji[man_police_officer_minimally]=$'\U1F46E\U200D\U2642'
emoji[policeman]=$'\U1F46E\U200D\U2642'
emoji[man_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2642\UFE0F'
emoji[man_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2642'
emoji[man_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2642\UFE0F'
emoji[man_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2642'
emoji[man_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2642\UFE0F'
emoji[man_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2642'
emoji[man_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2642\UFE0F'
emoji[man_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2642'
emoji[man_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2642\UFE0F'
emoji[man_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2642'
emoji[woman_police_officer]=$'\U1F46E\U200D\U2640\UFE0F'
emoji[woman_police_officer_minimally]=$'\U1F46E\U200D\U2640'
emoji[policewoman]=$'\U1F46E\U200D\U2640'
emoji[woman_police_officer_light_skin_tone]=$'\U1F46E\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_police_officer_light_skin_tone_minimally]=$'\U1F46E\U1F3FB\U200D\U2640'
emoji[woman_police_officer_medium_light_skin_tone]=$'\U1F46E\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_police_officer_medium_light_skin_tone_minimally]=$'\U1F46E\U1F3FC\U200D\U2640'
emoji[woman_police_officer_medium_skin_tone]=$'\U1F46E\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_police_officer_medium_skin_tone_minimally]=$'\U1F46E\U1F3FD\U200D\U2640'
emoji[woman_police_officer_medium_dark_skin_tone]=$'\U1F46E\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_police_officer_medium_dark_skin_tone_minimally]=$'\U1F46E\U1F3FE\U200D\U2640'
emoji[woman_police_officer_dark_skin_tone]=$'\U1F46E\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_police_officer_dark_skin_tone_minimally]=$'\U1F46E\U1F3FF\U200D\U2640'
emoji[detective]=$'\U1F575\UFE0F'
emoji[detective_unqualified]=$'\U1F575'
emoji[detective_light_skin_tone]=$'\U1F575\U1F3FB'
emoji[detective_medium_light_skin_tone]=$'\U1F575\U1F3FC'
emoji[detective_medium_skin_tone]=$'\U1F575\U1F3FD'
emoji[detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE'
emoji[detective_dark_skin_tone]=$'\U1F575\U1F3FF'
emoji[man_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F'
emoji[male_detective]=$'\U1F575\UFE0F\U200D\U2642\UFE0F'
emoji[man_detective_unqualified]=$'\U1F575\U200D\U2642\UFE0F'
emoji[man_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2642'
emoji[man_detective_unqualified_2]=$'\U1F575\U200D\U2642'
emoji[man_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2642\UFE0F'
emoji[man_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2642'
emoji[man_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2642\UFE0F'
emoji[man_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2642'
emoji[man_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2642\UFE0F'
emoji[man_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2642'
emoji[man_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2642\UFE0F'
emoji[man_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2642'
emoji[man_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2642\UFE0F'
emoji[man_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2642'
emoji[woman_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F'
emoji[female_detective]=$'\U1F575\UFE0F\U200D\U2640\UFE0F'
emoji[woman_detective_unqualified]=$'\U1F575\U200D\U2640\UFE0F'
emoji[woman_detective_unqualified_1]=$'\U1F575\UFE0F\U200D\U2640'
emoji[woman_detective_unqualified_2]=$'\U1F575\U200D\U2640'
emoji[woman_detective_light_skin_tone]=$'\U1F575\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_detective_light_skin_tone_minimally]=$'\U1F575\U1F3FB\U200D\U2640'
emoji[woman_detective_medium_light_skin_tone]=$'\U1F575\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_detective_medium_light_skin_tone_minimally]=$'\U1F575\U1F3FC\U200D\U2640'
emoji[woman_detective_medium_skin_tone]=$'\U1F575\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_detective_medium_skin_tone_minimally]=$'\U1F575\U1F3FD\U200D\U2640'
emoji[woman_detective_medium_dark_skin_tone]=$'\U1F575\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_detective_medium_dark_skin_tone_minimally]=$'\U1F575\U1F3FE\U200D\U2640'
emoji[woman_detective_dark_skin_tone]=$'\U1F575\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_detective_dark_skin_tone_minimally]=$'\U1F575\U1F3FF\U200D\U2640'
emoji[guard]=$'\U1F482'
emoji[guard_light_skin_tone]=$'\U1F482\U1F3FB'
emoji[guard_medium_light_skin_tone]=$'\U1F482\U1F3FC'
emoji[guard_medium_skin_tone]=$'\U1F482\U1F3FD'
emoji[guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE'
emoji[guard_dark_skin_tone]=$'\U1F482\U1F3FF'
emoji[man_guard]=$'\U1F482\U200D\U2642\UFE0F'
emoji[man_guard_minimally]=$'\U1F482\U200D\U2642'
emoji[guardsman]=$'\U1F482\U200D\U2642'
emoji[man_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2642\UFE0F'
emoji[man_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2642'
emoji[man_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2642\UFE0F'
emoji[man_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2642'
emoji[man_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2642\UFE0F'
emoji[man_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2642'
emoji[man_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2642\UFE0F'
emoji[man_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2642'
emoji[man_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2642\UFE0F'
emoji[man_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2642'
emoji[woman_guard]=$'\U1F482\U200D\U2640\UFE0F'
emoji[woman_guard_minimally]=$'\U1F482\U200D\U2640'
emoji[guardswoman]=$'\U1F482\U200D\U2640'
emoji[woman_guard_light_skin_tone]=$'\U1F482\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_guard_light_skin_tone_minimally]=$'\U1F482\U1F3FB\U200D\U2640'
emoji[woman_guard_medium_light_skin_tone]=$'\U1F482\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_guard_medium_light_skin_tone_minimally]=$'\U1F482\U1F3FC\U200D\U2640'
emoji[woman_guard_medium_skin_tone]=$'\U1F482\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_guard_medium_skin_tone_minimally]=$'\U1F482\U1F3FD\U200D\U2640'
emoji[woman_guard_medium_dark_skin_tone]=$'\U1F482\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_guard_medium_dark_skin_tone_minimally]=$'\U1F482\U1F3FE\U200D\U2640'
emoji[woman_guard_dark_skin_tone]=$'\U1F482\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_guard_dark_skin_tone_minimally]=$'\U1F482\U1F3FF\U200D\U2640'
emoji[construction_worker]=$'\U1F477'
emoji[construction_worker_light_skin_tone]=$'\U1F477\U1F3FB'
emoji[construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC'
emoji[construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD'
emoji[construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE'
emoji[construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF'
emoji[man_construction_worker]=$'\U1F477\U200D\U2642\UFE0F'
emoji[man_construction_worker_minimally]=$'\U1F477\U200D\U2642'
emoji[construction_worker_man]=$'\U1F477\U200D\U2642'
emoji[man_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2642\UFE0F'
emoji[man_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2642'
emoji[man_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2642\UFE0F'
emoji[man_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2642'
emoji[man_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2642\UFE0F'
emoji[man_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2642'
emoji[man_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2642\UFE0F'
emoji[man_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2642'
emoji[man_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2642\UFE0F'
emoji[man_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2642'
emoji[woman_construction_worker]=$'\U1F477\U200D\U2640\UFE0F'
emoji[woman_construction_worker_minimally]=$'\U1F477\U200D\U2640'
emoji[construction_worker_woman]=$'\U1F477\U200D\U2640'
emoji[woman_construction_worker_light_skin_tone]=$'\U1F477\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_construction_worker_light_skin_tone_minimally]=$'\U1F477\U1F3FB\U200D\U2640'
emoji[woman_construction_worker_medium_light_skin_tone]=$'\U1F477\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_construction_worker_medium_light_skin_tone_minimally]=$'\U1F477\U1F3FC\U200D\U2640'
emoji[woman_construction_worker_medium_skin_tone]=$'\U1F477\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_construction_worker_medium_skin_tone_minimally]=$'\U1F477\U1F3FD\U200D\U2640'
emoji[woman_construction_worker_medium_dark_skin_tone]=$'\U1F477\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_construction_worker_medium_dark_skin_tone_minimally]=$'\U1F477\U1F3FE\U200D\U2640'
emoji[woman_construction_worker_dark_skin_tone]=$'\U1F477\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_construction_worker_dark_skin_tone_minimally]=$'\U1F477\U1F3FF\U200D\U2640'
emoji[prince]=$'\U1F934'
emoji[prince_light_skin_tone]=$'\U1F934\U1F3FB'
emoji[prince_medium_light_skin_tone]=$'\U1F934\U1F3FC'
emoji[prince_medium_skin_tone]=$'\U1F934\U1F3FD'
emoji[prince_medium_dark_skin_tone]=$'\U1F934\U1F3FE'
emoji[prince_dark_skin_tone]=$'\U1F934\U1F3FF'
emoji[princess]=$'\U1F478'
emoji[princess_light_skin_tone]=$'\U1F478\U1F3FB'
emoji[princess_medium_light_skin_tone]=$'\U1F478\U1F3FC'
emoji[princess_medium_skin_tone]=$'\U1F478\U1F3FD'
emoji[princess_medium_dark_skin_tone]=$'\U1F478\U1F3FE'
emoji[princess_dark_skin_tone]=$'\U1F478\U1F3FF'
emoji[person_wearing_turban]=$'\U1F473'
emoji[person_with_turban]=$'\U1F473'
emoji[person_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB'
emoji[person_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC'
emoji[person_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD'
emoji[person_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE'
emoji[person_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF'
emoji[man_wearing_turban]=$'\U1F473\U200D\U2642\UFE0F'
emoji[man_wearing_turban_minimally]=$'\U1F473\U200D\U2642'
emoji[man_with_turban]=$'\U1F473\U200D\U2642'
emoji[man_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2642\UFE0F'
emoji[man_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2642'
emoji[man_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2642\UFE0F'
emoji[man_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2642'
emoji[man_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2642\UFE0F'
emoji[man_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2642'
emoji[man_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2642\UFE0F'
emoji[man_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2642'
emoji[man_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2642\UFE0F'
emoji[man_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2642'
emoji[woman_wearing_turban]=$'\U1F473\U200D\U2640\UFE0F'
emoji[woman_wearing_turban_minimally]=$'\U1F473\U200D\U2640'
emoji[woman_with_turban]=$'\U1F473\U200D\U2640'
emoji[woman_wearing_turban_light_skin_tone]=$'\U1F473\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_wearing_turban_light_skin_tone_minimally]=$'\U1F473\U1F3FB\U200D\U2640'
emoji[woman_wearing_turban_medium_light_skin_tone]=$'\U1F473\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_wearing_turban_medium_light_skin_tone_minimally]=$'\U1F473\U1F3FC\U200D\U2640'
emoji[woman_wearing_turban_medium_skin_tone]=$'\U1F473\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_wearing_turban_medium_skin_tone_minimally]=$'\U1F473\U1F3FD\U200D\U2640'
emoji[woman_wearing_turban_medium_dark_skin_tone]=$'\U1F473\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_wearing_turban_medium_dark_skin_tone_minimally]=$'\U1F473\U1F3FE\U200D\U2640'
emoji[woman_wearing_turban_dark_skin_tone]=$'\U1F473\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_wearing_turban_dark_skin_tone_minimally]=$'\U1F473\U1F3FF\U200D\U2640'
emoji[man_with_Chinese_cap]=$'\U1F472'
emoji[man_with_gua_pi_mao]=$'\U1F472'
emoji[man_with_Chinese_cap_light_skin_tone]=$'\U1F472\U1F3FB'
emoji[man_with_Chinese_cap_medium_light_skin_tone]=$'\U1F472\U1F3FC'
emoji[man_with_Chinese_cap_medium_skin_tone]=$'\U1F472\U1F3FD'
emoji[man_with_Chinese_cap_medium_dark_skin_tone]=$'\U1F472\U1F3FE'
emoji[man_with_Chinese_cap_dark_skin_tone]=$'\U1F472\U1F3FF'
emoji[woman_with_headscarf]=$'\U1F9D5'
emoji[woman_with_headscarf_light_skin_tone]=$'\U1F9D5\U1F3FB'
emoji[woman_with_headscarf_medium_light_skin_tone]=$'\U1F9D5\U1F3FC'
emoji[woman_with_headscarf_medium_skin_tone]=$'\U1F9D5\U1F3FD'
emoji[woman_with_headscarf_medium_dark_skin_tone]=$'\U1F9D5\U1F3FE'
emoji[woman_with_headscarf_dark_skin_tone]=$'\U1F9D5\U1F3FF'
emoji[man_in_tuxedo]=$'\U1F935'
emoji[man_in_tuxedo_light_skin_tone]=$'\U1F935\U1F3FB'
emoji[man_in_tuxedo_medium_light_skin_tone]=$'\U1F935\U1F3FC'
emoji[man_in_tuxedo_medium_skin_tone]=$'\U1F935\U1F3FD'
emoji[man_in_tuxedo_medium_dark_skin_tone]=$'\U1F935\U1F3FE'
emoji[man_in_tuxedo_dark_skin_tone]=$'\U1F935\U1F3FF'
emoji[bride_with_veil]=$'\U1F470'
emoji[bride_with_veil_light_skin_tone]=$'\U1F470\U1F3FB'
emoji[bride_with_veil_medium_light_skin_tone]=$'\U1F470\U1F3FC'
emoji[bride_with_veil_medium_skin_tone]=$'\U1F470\U1F3FD'
emoji[bride_with_veil_medium_dark_skin_tone]=$'\U1F470\U1F3FE'
emoji[bride_with_veil_dark_skin_tone]=$'\U1F470\U1F3FF'
emoji[pregnant_woman]=$'\U1F930'
emoji[pregnant_woman_light_skin_tone]=$'\U1F930\U1F3FB'
emoji[pregnant_woman_medium_light_skin_tone]=$'\U1F930\U1F3FC'
emoji[pregnant_woman_medium_skin_tone]=$'\U1F930\U1F3FD'
emoji[pregnant_woman_medium_dark_skin_tone]=$'\U1F930\U1F3FE'
emoji[pregnant_woman_dark_skin_tone]=$'\U1F930\U1F3FF'
emoji[breast_feeding]=$'\U1F931'
emoji[breast_feeding_light_skin_tone]=$'\U1F931\U1F3FB'
emoji[breast_feeding_medium_light_skin_tone]=$'\U1F931\U1F3FC'
emoji[breast_feeding_medium_skin_tone]=$'\U1F931\U1F3FD'
emoji[breast_feeding_medium_dark_skin_tone]=$'\U1F931\U1F3FE'
emoji[breast_feeding_dark_skin_tone]=$'\U1F931\U1F3FF'
emoji[baby_angel]=$'\U1F47C'
emoji[angel]=$'\U1F47C'
emoji[baby_angel_light_skin_tone]=$'\U1F47C\U1F3FB'
emoji[baby_angel_medium_light_skin_tone]=$'\U1F47C\U1F3FC'
emoji[baby_angel_medium_skin_tone]=$'\U1F47C\U1F3FD'
emoji[baby_angel_medium_dark_skin_tone]=$'\U1F47C\U1F3FE'
emoji[baby_angel_dark_skin_tone]=$'\U1F47C\U1F3FF'
emoji[Santa_Claus]=$'\U1F385'
emoji[santa]=$'\U1F385'
emoji[Santa_Claus_light_skin_tone]=$'\U1F385\U1F3FB'
emoji[Santa_Claus_medium_light_skin_tone]=$'\U1F385\U1F3FC'
emoji[Santa_Claus_medium_skin_tone]=$'\U1F385\U1F3FD'
emoji[Santa_Claus_medium_dark_skin_tone]=$'\U1F385\U1F3FE'
emoji[Santa_Claus_dark_skin_tone]=$'\U1F385\U1F3FF'
emoji[Mrs_Claus]=$'\U1F936'
emoji[mrs_claus]=$'\U1F936'
emoji[Mrs_Claus_light_skin_tone]=$'\U1F936\U1F3FB'
emoji[Mrs_Claus_medium_light_skin_tone]=$'\U1F936\U1F3FC'
emoji[Mrs_Claus_medium_skin_tone]=$'\U1F936\U1F3FD'
emoji[Mrs_Claus_medium_dark_skin_tone]=$'\U1F936\U1F3FE'
emoji[Mrs_Claus_dark_skin_tone]=$'\U1F936\U1F3FF'
emoji[superhero]=$'\U1F9B8'
emoji[superhero_light_skin_tone]=$'\U1F9B8\U1F3FB'
emoji[superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC'
emoji[superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD'
emoji[superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE'
emoji[superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF'
emoji[man_superhero]=$'\U1F9B8\U200D\U2642\UFE0F'
emoji[man_superhero_minimally]=$'\U1F9B8\U200D\U2642'
emoji[superhero_man]=$'\U1F9B8\U200D\U2642'
emoji[man_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2642\UFE0F'
emoji[man_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2642'
emoji[man_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2642\UFE0F'
emoji[man_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2642'
emoji[man_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2642\UFE0F'
emoji[man_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2642'
emoji[man_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2642\UFE0F'
emoji[man_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2642'
emoji[man_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2642\UFE0F'
emoji[man_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2642'
emoji[woman_superhero]=$'\U1F9B8\U200D\U2640\UFE0F'
emoji[woman_superhero_minimally]=$'\U1F9B8\U200D\U2640'
emoji[superhero_woman]=$'\U1F9B8\U200D\U2640'
emoji[woman_superhero_light_skin_tone]=$'\U1F9B8\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_superhero_light_skin_tone_minimally]=$'\U1F9B8\U1F3FB\U200D\U2640'
emoji[woman_superhero_medium_light_skin_tone]=$'\U1F9B8\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_superhero_medium_light_skin_tone_minimally]=$'\U1F9B8\U1F3FC\U200D\U2640'
emoji[woman_superhero_medium_skin_tone]=$'\U1F9B8\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_superhero_medium_skin_tone_minimally]=$'\U1F9B8\U1F3FD\U200D\U2640'
emoji[woman_superhero_medium_dark_skin_tone]=$'\U1F9B8\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_superhero_medium_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FE\U200D\U2640'
emoji[woman_superhero_dark_skin_tone]=$'\U1F9B8\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_superhero_dark_skin_tone_minimally]=$'\U1F9B8\U1F3FF\U200D\U2640'
emoji[supervillain]=$'\U1F9B9'
emoji[supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB'
emoji[supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC'
emoji[supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD'
emoji[supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE'
emoji[supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF'
emoji[man_supervillain]=$'\U1F9B9\U200D\U2642\UFE0F'
emoji[man_supervillain_minimally]=$'\U1F9B9\U200D\U2642'
emoji[supervillain_man]=$'\U1F9B9\U200D\U2642'
emoji[man_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2642\UFE0F'
emoji[man_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2642'
emoji[man_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2642\UFE0F'
emoji[man_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2642'
emoji[man_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2642\UFE0F'
emoji[man_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2642'
emoji[man_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2642\UFE0F'
emoji[man_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2642'
emoji[man_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2642\UFE0F'
emoji[man_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2642'
emoji[woman_supervillain]=$'\U1F9B9\U200D\U2640\UFE0F'
emoji[woman_supervillain_minimally]=$'\U1F9B9\U200D\U2640'
emoji[supervillain_woman]=$'\U1F9B9\U200D\U2640'
emoji[woman_supervillain_light_skin_tone]=$'\U1F9B9\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_supervillain_light_skin_tone_minimally]=$'\U1F9B9\U1F3FB\U200D\U2640'
emoji[woman_supervillain_medium_light_skin_tone]=$'\U1F9B9\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_supervillain_medium_light_skin_tone_minimally]=$'\U1F9B9\U1F3FC\U200D\U2640'
emoji[woman_supervillain_medium_skin_tone]=$'\U1F9B9\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_supervillain_medium_skin_tone_minimally]=$'\U1F9B9\U1F3FD\U200D\U2640'
emoji[woman_supervillain_medium_dark_skin_tone]=$'\U1F9B9\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_supervillain_medium_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FE\U200D\U2640'
emoji[woman_supervillain_dark_skin_tone]=$'\U1F9B9\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_supervillain_dark_skin_tone_minimally]=$'\U1F9B9\U1F3FF\U200D\U2640'
emoji[mage]=$'\U1F9D9'
emoji[mage_light_skin_tone]=$'\U1F9D9\U1F3FB'
emoji[mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC'
emoji[mage_medium_skin_tone]=$'\U1F9D9\U1F3FD'
emoji[mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE'
emoji[mage_dark_skin_tone]=$'\U1F9D9\U1F3FF'
emoji[man_mage]=$'\U1F9D9\U200D\U2642\UFE0F'
emoji[man_mage_minimally]=$'\U1F9D9\U200D\U2642'
emoji[mage_man]=$'\U1F9D9\U200D\U2642'
emoji[man_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2642\UFE0F'
emoji[man_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2642'
emoji[man_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2642\UFE0F'
emoji[man_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2642'
emoji[man_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2642\UFE0F'
emoji[man_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2642'
emoji[man_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2642\UFE0F'
emoji[man_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2642'
emoji[man_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2642\UFE0F'
emoji[man_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2642'
emoji[woman_mage]=$'\U1F9D9\U200D\U2640\UFE0F'
emoji[woman_mage_minimally]=$'\U1F9D9\U200D\U2640'
emoji[mage_woman]=$'\U1F9D9\U200D\U2640'
emoji[woman_mage_light_skin_tone]=$'\U1F9D9\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_mage_light_skin_tone_minimally]=$'\U1F9D9\U1F3FB\U200D\U2640'
emoji[woman_mage_medium_light_skin_tone]=$'\U1F9D9\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_mage_medium_light_skin_tone_minimally]=$'\U1F9D9\U1F3FC\U200D\U2640'
emoji[woman_mage_medium_skin_tone]=$'\U1F9D9\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_mage_medium_skin_tone_minimally]=$'\U1F9D9\U1F3FD\U200D\U2640'
emoji[woman_mage_medium_dark_skin_tone]=$'\U1F9D9\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_mage_medium_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FE\U200D\U2640'
emoji[woman_mage_dark_skin_tone]=$'\U1F9D9\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_mage_dark_skin_tone_minimally]=$'\U1F9D9\U1F3FF\U200D\U2640'
emoji[fairy]=$'\U1F9DA'
emoji[fairy_light_skin_tone]=$'\U1F9DA\U1F3FB'
emoji[fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC'
emoji[fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD'
emoji[fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE'
emoji[fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF'
emoji[man_fairy]=$'\U1F9DA\U200D\U2642\UFE0F'
emoji[man_fairy_minimally]=$'\U1F9DA\U200D\U2642'
emoji[fairy_man]=$'\U1F9DA\U200D\U2642'
emoji[man_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2642\UFE0F'
emoji[man_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2642'
emoji[man_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2642\UFE0F'
emoji[man_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2642'
emoji[man_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2642\UFE0F'
emoji[man_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2642'
emoji[man_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2642\UFE0F'
emoji[man_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2642'
emoji[man_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2642\UFE0F'
emoji[man_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2642'
emoji[woman_fairy]=$'\U1F9DA\U200D\U2640\UFE0F'
emoji[woman_fairy_minimally]=$'\U1F9DA\U200D\U2640'
emoji[fairy_woman]=$'\U1F9DA\U200D\U2640'
emoji[woman_fairy_light_skin_tone]=$'\U1F9DA\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_fairy_light_skin_tone_minimally]=$'\U1F9DA\U1F3FB\U200D\U2640'
emoji[woman_fairy_medium_light_skin_tone]=$'\U1F9DA\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_fairy_medium_light_skin_tone_minimally]=$'\U1F9DA\U1F3FC\U200D\U2640'
emoji[woman_fairy_medium_skin_tone]=$'\U1F9DA\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_fairy_medium_skin_tone_minimally]=$'\U1F9DA\U1F3FD\U200D\U2640'
emoji[woman_fairy_medium_dark_skin_tone]=$'\U1F9DA\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_fairy_medium_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FE\U200D\U2640'
emoji[woman_fairy_dark_skin_tone]=$'\U1F9DA\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_fairy_dark_skin_tone_minimally]=$'\U1F9DA\U1F3FF\U200D\U2640'
emoji[vampire]=$'\U1F9DB'
emoji[vampire_light_skin_tone]=$'\U1F9DB\U1F3FB'
emoji[vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC'
emoji[vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD'
emoji[vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE'
emoji[vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF'
emoji[man_vampire]=$'\U1F9DB\U200D\U2642\UFE0F'
emoji[man_vampire_minimally]=$'\U1F9DB\U200D\U2642'
emoji[vampire_man]=$'\U1F9DB\U200D\U2642'
emoji[man_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2642\UFE0F'
emoji[man_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2642'
emoji[man_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2642\UFE0F'
emoji[man_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2642'
emoji[man_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2642\UFE0F'
emoji[man_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2642'
emoji[man_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2642\UFE0F'
emoji[man_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2642'
emoji[man_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2642\UFE0F'
emoji[man_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2642'
emoji[woman_vampire]=$'\U1F9DB\U200D\U2640\UFE0F'
emoji[woman_vampire_minimally]=$'\U1F9DB\U200D\U2640'
emoji[vampire_woman]=$'\U1F9DB\U200D\U2640'
emoji[woman_vampire_light_skin_tone]=$'\U1F9DB\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_vampire_light_skin_tone_minimally]=$'\U1F9DB\U1F3FB\U200D\U2640'
emoji[woman_vampire_medium_light_skin_tone]=$'\U1F9DB\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_vampire_medium_light_skin_tone_minimally]=$'\U1F9DB\U1F3FC\U200D\U2640'
emoji[woman_vampire_medium_skin_tone]=$'\U1F9DB\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_vampire_medium_skin_tone_minimally]=$'\U1F9DB\U1F3FD\U200D\U2640'
emoji[woman_vampire_medium_dark_skin_tone]=$'\U1F9DB\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_vampire_medium_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FE\U200D\U2640'
emoji[woman_vampire_dark_skin_tone]=$'\U1F9DB\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_vampire_dark_skin_tone_minimally]=$'\U1F9DB\U1F3FF\U200D\U2640'
emoji[merperson]=$'\U1F9DC'
emoji[merperson_light_skin_tone]=$'\U1F9DC\U1F3FB'
emoji[merperson_medium_light_skin_tone]=$'\U1F9DC\U1F3FC'
emoji[merperson_medium_skin_tone]=$'\U1F9DC\U1F3FD'
emoji[merperson_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE'
emoji[merperson_dark_skin_tone]=$'\U1F9DC\U1F3FF'
emoji[merman]=$'\U1F9DC\U200D\U2642\UFE0F'
emoji[merman_minimally]=$'\U1F9DC\U200D\U2642'
emoji[merman_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2642\UFE0F'
emoji[merman_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2642'
emoji[merman_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2642\UFE0F'
emoji[merman_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2642'
emoji[merman_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2642\UFE0F'
emoji[merman_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2642'
emoji[merman_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2642\UFE0F'
emoji[merman_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2642'
emoji[merman_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2642\UFE0F'
emoji[merman_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2642'
emoji[mermaid]=$'\U1F9DC\U200D\U2640\UFE0F'
emoji[mermaid_minimally]=$'\U1F9DC\U200D\U2640'
emoji[mermaid_light_skin_tone]=$'\U1F9DC\U1F3FB\U200D\U2640\UFE0F'
emoji[mermaid_light_skin_tone_minimally]=$'\U1F9DC\U1F3FB\U200D\U2640'
emoji[mermaid_medium_light_skin_tone]=$'\U1F9DC\U1F3FC\U200D\U2640\UFE0F'
emoji[mermaid_medium_light_skin_tone_minimally]=$'\U1F9DC\U1F3FC\U200D\U2640'
emoji[mermaid_medium_skin_tone]=$'\U1F9DC\U1F3FD\U200D\U2640\UFE0F'
emoji[mermaid_medium_skin_tone_minimally]=$'\U1F9DC\U1F3FD\U200D\U2640'
emoji[mermaid_medium_dark_skin_tone]=$'\U1F9DC\U1F3FE\U200D\U2640\UFE0F'
emoji[mermaid_medium_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FE\U200D\U2640'
emoji[mermaid_dark_skin_tone]=$'\U1F9DC\U1F3FF\U200D\U2640\UFE0F'
emoji[mermaid_dark_skin_tone_minimally]=$'\U1F9DC\U1F3FF\U200D\U2640'
emoji[elf]=$'\U1F9DD'
emoji[elf_light_skin_tone]=$'\U1F9DD\U1F3FB'
emoji[elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC'
emoji[elf_medium_skin_tone]=$'\U1F9DD\U1F3FD'
emoji[elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE'
emoji[elf_dark_skin_tone]=$'\U1F9DD\U1F3FF'
emoji[man_elf]=$'\U1F9DD\U200D\U2642\UFE0F'
emoji[man_elf_minimally]=$'\U1F9DD\U200D\U2642'
emoji[elf_man]=$'\U1F9DD\U200D\U2642'
emoji[man_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2642\UFE0F'
emoji[man_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2642'
emoji[man_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2642\UFE0F'
emoji[man_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2642'
emoji[man_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2642\UFE0F'
emoji[man_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2642'
emoji[man_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2642\UFE0F'
emoji[man_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2642'
emoji[man_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2642\UFE0F'
emoji[man_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2642'
emoji[woman_elf]=$'\U1F9DD\U200D\U2640\UFE0F'
emoji[woman_elf_minimally]=$'\U1F9DD\U200D\U2640'
emoji[elf_woman]=$'\U1F9DD\U200D\U2640'
emoji[woman_elf_light_skin_tone]=$'\U1F9DD\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_elf_light_skin_tone_minimally]=$'\U1F9DD\U1F3FB\U200D\U2640'
emoji[woman_elf_medium_light_skin_tone]=$'\U1F9DD\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_elf_medium_light_skin_tone_minimally]=$'\U1F9DD\U1F3FC\U200D\U2640'
emoji[woman_elf_medium_skin_tone]=$'\U1F9DD\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_elf_medium_skin_tone_minimally]=$'\U1F9DD\U1F3FD\U200D\U2640'
emoji[woman_elf_medium_dark_skin_tone]=$'\U1F9DD\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_elf_medium_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FE\U200D\U2640'
emoji[woman_elf_dark_skin_tone]=$'\U1F9DD\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_elf_dark_skin_tone_minimally]=$'\U1F9DD\U1F3FF\U200D\U2640'
emoji[genie]=$'\U1F9DE'
emoji[man_genie]=$'\U1F9DE\U200D\U2642\UFE0F'
emoji[man_genie_minimally]=$'\U1F9DE\U200D\U2642'
emoji[genie_man]=$'\U1F9DE\U200D\U2642'
emoji[woman_genie]=$'\U1F9DE\U200D\U2640\UFE0F'
emoji[woman_genie_minimally]=$'\U1F9DE\U200D\U2640'
emoji[genie_woman]=$'\U1F9DE\U200D\U2640'
emoji[zombie]=$'\U1F9DF'
emoji[man_zombie]=$'\U1F9DF\U200D\U2642\UFE0F'
emoji[man_zombie_minimally]=$'\U1F9DF\U200D\U2642'
emoji[zombie_man]=$'\U1F9DF\U200D\U2642'
emoji[woman_zombie]=$'\U1F9DF\U200D\U2640\UFE0F'
emoji[woman_zombie_minimally]=$'\U1F9DF\U200D\U2640'
emoji[zombie_woman]=$'\U1F9DF\U200D\U2640'
emoji[person_getting_massage]=$'\U1F486'
emoji[massage]=$'\U1F486'
emoji[person_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB'
emoji[person_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC'
emoji[person_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD'
emoji[person_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE'
emoji[person_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF'
emoji[man_getting_massage]=$'\U1F486\U200D\U2642\UFE0F'
emoji[man_getting_massage_minimally]=$'\U1F486\U200D\U2642'
emoji[massage_man]=$'\U1F486\U200D\U2642'
emoji[man_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2642\UFE0F'
emoji[man_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2642'
emoji[man_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2642\UFE0F'
emoji[man_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2642'
emoji[man_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2642\UFE0F'
emoji[man_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2642'
emoji[man_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2642\UFE0F'
emoji[man_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2642'
emoji[man_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2642\UFE0F'
emoji[man_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2642'
emoji[woman_getting_massage]=$'\U1F486\U200D\U2640\UFE0F'
emoji[woman_getting_massage_minimally]=$'\U1F486\U200D\U2640'
emoji[massage_woman]=$'\U1F486\U200D\U2640'
emoji[woman_getting_massage_light_skin_tone]=$'\U1F486\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_getting_massage_light_skin_tone_minimally]=$'\U1F486\U1F3FB\U200D\U2640'
emoji[woman_getting_massage_medium_light_skin_tone]=$'\U1F486\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_getting_massage_medium_light_skin_tone_minimally]=$'\U1F486\U1F3FC\U200D\U2640'
emoji[woman_getting_massage_medium_skin_tone]=$'\U1F486\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_getting_massage_medium_skin_tone_minimally]=$'\U1F486\U1F3FD\U200D\U2640'
emoji[woman_getting_massage_medium_dark_skin_tone]=$'\U1F486\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_getting_massage_medium_dark_skin_tone_minimally]=$'\U1F486\U1F3FE\U200D\U2640'
emoji[woman_getting_massage_dark_skin_tone]=$'\U1F486\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_getting_massage_dark_skin_tone_minimally]=$'\U1F486\U1F3FF\U200D\U2640'
emoji[person_getting_haircut]=$'\U1F487'
emoji[haircut]=$'\U1F487'
emoji[person_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB'
emoji[person_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC'
emoji[person_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD'
emoji[person_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE'
emoji[person_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF'
emoji[man_getting_haircut]=$'\U1F487\U200D\U2642\UFE0F'
emoji[man_getting_haircut_minimally]=$'\U1F487\U200D\U2642'
emoji[haircut_man]=$'\U1F487\U200D\U2642'
emoji[man_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2642\UFE0F'
emoji[man_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2642'
emoji[man_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2642\UFE0F'
emoji[man_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2642'
emoji[man_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2642\UFE0F'
emoji[man_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2642'
emoji[man_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2642\UFE0F'
emoji[man_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2642'
emoji[man_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2642\UFE0F'
emoji[man_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2642'
emoji[woman_getting_haircut]=$'\U1F487\U200D\U2640\UFE0F'
emoji[woman_getting_haircut_minimally]=$'\U1F487\U200D\U2640'
emoji[haircut_woman]=$'\U1F487\U200D\U2640'
emoji[woman_getting_haircut_light_skin_tone]=$'\U1F487\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_getting_haircut_light_skin_tone_minimally]=$'\U1F487\U1F3FB\U200D\U2640'
emoji[woman_getting_haircut_medium_light_skin_tone]=$'\U1F487\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_getting_haircut_medium_light_skin_tone_minimally]=$'\U1F487\U1F3FC\U200D\U2640'
emoji[woman_getting_haircut_medium_skin_tone]=$'\U1F487\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_getting_haircut_medium_skin_tone_minimally]=$'\U1F487\U1F3FD\U200D\U2640'
emoji[woman_getting_haircut_medium_dark_skin_tone]=$'\U1F487\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_getting_haircut_medium_dark_skin_tone_minimally]=$'\U1F487\U1F3FE\U200D\U2640'
emoji[woman_getting_haircut_dark_skin_tone]=$'\U1F487\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_getting_haircut_dark_skin_tone_minimally]=$'\U1F487\U1F3FF\U200D\U2640'
emoji[person_walking]=$'\U1F6B6'
emoji[walking]=$'\U1F6B6'
emoji[person_walking_light_skin_tone]=$'\U1F6B6\U1F3FB'
emoji[person_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC'
emoji[person_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD'
emoji[person_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE'
emoji[person_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF'
emoji[man_walking]=$'\U1F6B6\U200D\U2642\UFE0F'
emoji[man_walking_minimally]=$'\U1F6B6\U200D\U2642'
emoji[walking_man]=$'\U1F6B6\U200D\U2642'
emoji[man_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2642\UFE0F'
emoji[man_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2642'
emoji[man_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2642\UFE0F'
emoji[man_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2642'
emoji[man_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2642\UFE0F'
emoji[man_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2642'
emoji[man_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2642\UFE0F'
emoji[man_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2642'
emoji[man_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2642\UFE0F'
emoji[man_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2642'
emoji[woman_walking]=$'\U1F6B6\U200D\U2640\UFE0F'
emoji[woman_walking_minimally]=$'\U1F6B6\U200D\U2640'
emoji[walking_woman]=$'\U1F6B6\U200D\U2640'
emoji[woman_walking_light_skin_tone]=$'\U1F6B6\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_walking_light_skin_tone_minimally]=$'\U1F6B6\U1F3FB\U200D\U2640'
emoji[woman_walking_medium_light_skin_tone]=$'\U1F6B6\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_walking_medium_light_skin_tone_minimally]=$'\U1F6B6\U1F3FC\U200D\U2640'
emoji[woman_walking_medium_skin_tone]=$'\U1F6B6\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_walking_medium_skin_tone_minimally]=$'\U1F6B6\U1F3FD\U200D\U2640'
emoji[woman_walking_medium_dark_skin_tone]=$'\U1F6B6\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_walking_medium_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FE\U200D\U2640'
emoji[woman_walking_dark_skin_tone]=$'\U1F6B6\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_walking_dark_skin_tone_minimally]=$'\U1F6B6\U1F3FF\U200D\U2640'
emoji[person_standing]=$'\U1F9CD'
emoji[standing_person]=$'\U1F9CD'
emoji[person_standing_light_skin_tone]=$'\U1F9CD\U1F3FB'
emoji[person_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC'
emoji[person_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD'
emoji[person_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE'
emoji[person_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF'
emoji[man_standing]=$'\U1F9CD\U200D\U2642\UFE0F'
emoji[man_standing_minimally]=$'\U1F9CD\U200D\U2642'
emoji[standing_man]=$'\U1F9CD\U200D\U2642'
emoji[man_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2642\UFE0F'
emoji[man_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2642'
emoji[man_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2642\UFE0F'
emoji[man_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2642'
emoji[man_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2642\UFE0F'
emoji[man_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2642'
emoji[man_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2642\UFE0F'
emoji[man_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2642'
emoji[man_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2642\UFE0F'
emoji[man_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2642'
emoji[woman_standing]=$'\U1F9CD\U200D\U2640\UFE0F'
emoji[woman_standing_minimally]=$'\U1F9CD\U200D\U2640'
emoji[standing_woman]=$'\U1F9CD\U200D\U2640'
emoji[woman_standing_light_skin_tone]=$'\U1F9CD\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_standing_light_skin_tone_minimally]=$'\U1F9CD\U1F3FB\U200D\U2640'
emoji[woman_standing_medium_light_skin_tone]=$'\U1F9CD\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_standing_medium_light_skin_tone_minimally]=$'\U1F9CD\U1F3FC\U200D\U2640'
emoji[woman_standing_medium_skin_tone]=$'\U1F9CD\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_standing_medium_skin_tone_minimally]=$'\U1F9CD\U1F3FD\U200D\U2640'
emoji[woman_standing_medium_dark_skin_tone]=$'\U1F9CD\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_standing_medium_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FE\U200D\U2640'
emoji[woman_standing_dark_skin_tone]=$'\U1F9CD\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_standing_dark_skin_tone_minimally]=$'\U1F9CD\U1F3FF\U200D\U2640'
emoji[person_kneeling]=$'\U1F9CE'
emoji[kneeling_person]=$'\U1F9CE'
emoji[person_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB'
emoji[person_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC'
emoji[person_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD'
emoji[person_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE'
emoji[person_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF'
emoji[man_kneeling]=$'\U1F9CE\U200D\U2642\UFE0F'
emoji[man_kneeling_minimally]=$'\U1F9CE\U200D\U2642'
emoji[kneeling_man]=$'\U1F9CE\U200D\U2642'
emoji[man_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2642\UFE0F'
emoji[man_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2642'
emoji[man_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2642\UFE0F'
emoji[man_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2642'
emoji[man_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2642\UFE0F'
emoji[man_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2642'
emoji[man_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2642\UFE0F'
emoji[man_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2642'
emoji[man_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2642\UFE0F'
emoji[man_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2642'
emoji[woman_kneeling]=$'\U1F9CE\U200D\U2640\UFE0F'
emoji[woman_kneeling_minimally]=$'\U1F9CE\U200D\U2640'
emoji[kneeling_woman]=$'\U1F9CE\U200D\U2640'
emoji[woman_kneeling_light_skin_tone]=$'\U1F9CE\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_kneeling_light_skin_tone_minimally]=$'\U1F9CE\U1F3FB\U200D\U2640'
emoji[woman_kneeling_medium_light_skin_tone]=$'\U1F9CE\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_kneeling_medium_light_skin_tone_minimally]=$'\U1F9CE\U1F3FC\U200D\U2640'
emoji[woman_kneeling_medium_skin_tone]=$'\U1F9CE\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_kneeling_medium_skin_tone_minimally]=$'\U1F9CE\U1F3FD\U200D\U2640'
emoji[woman_kneeling_medium_dark_skin_tone]=$'\U1F9CE\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_kneeling_medium_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FE\U200D\U2640'
emoji[woman_kneeling_dark_skin_tone]=$'\U1F9CE\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_kneeling_dark_skin_tone_minimally]=$'\U1F9CE\U1F3FF\U200D\U2640'
emoji[man_with_probing_cane]=$'\U1F468\U200D\U1F9AF'
emoji[man_with_probing_cane_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9AF'
emoji[man_with_probing_cane_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9AF'
emoji[man_with_probing_cane_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9AF'
emoji[man_with_probing_cane_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9AF'
emoji[man_with_probing_cane_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9AF'
emoji[woman_with_probing_cane]=$'\U1F469\U200D\U1F9AF'
emoji[woman_with_probing_cane_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9AF'
emoji[woman_with_probing_cane_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9AF'
emoji[woman_with_probing_cane_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9AF'
emoji[woman_with_probing_cane_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9AF'
emoji[woman_with_probing_cane_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9AF'
emoji[man_in_motorized_wheelchair]=$'\U1F468\U200D\U1F9BC'
emoji[man_in_motorized_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BC'
emoji[man_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BC'
emoji[man_in_motorized_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BC'
emoji[man_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BC'
emoji[man_in_motorized_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BC'
emoji[woman_in_motorized_wheelchair]=$'\U1F469\U200D\U1F9BC'
emoji[woman_in_motorized_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BC'
emoji[woman_in_motorized_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BC'
emoji[woman_in_motorized_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BC'
emoji[woman_in_motorized_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BC'
emoji[woman_in_motorized_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BC'
emoji[man_in_manual_wheelchair]=$'\U1F468\U200D\U1F9BD'
emoji[man_in_manual_wheelchair_light_skin_tone]=$'\U1F468\U1F3FB\U200D\U1F9BD'
emoji[man_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F9BD'
emoji[man_in_manual_wheelchair_medium_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F9BD'
emoji[man_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F9BD'
emoji[man_in_manual_wheelchair_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F9BD'
emoji[woman_in_manual_wheelchair]=$'\U1F469\U200D\U1F9BD'
emoji[woman_in_manual_wheelchair_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F9BD'
emoji[woman_in_manual_wheelchair_medium_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F9BD'
emoji[woman_in_manual_wheelchair_medium_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F9BD'
emoji[woman_in_manual_wheelchair_medium_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F9BD'
emoji[woman_in_manual_wheelchair_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F9BD'
emoji[person_running]=$'\U1F3C3'
emoji[runner]=$'\U1F3C3'
emoji[running]=$'\U1F3C3'
emoji[person_running_light_skin_tone]=$'\U1F3C3\U1F3FB'
emoji[person_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC'
emoji[person_running_medium_skin_tone]=$'\U1F3C3\U1F3FD'
emoji[person_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE'
emoji[person_running_dark_skin_tone]=$'\U1F3C3\U1F3FF'
emoji[man_running]=$'\U1F3C3\U200D\U2642\UFE0F'
emoji[man_running_minimally]=$'\U1F3C3\U200D\U2642'
emoji[running_man]=$'\U1F3C3\U200D\U2642'
emoji[man_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2642\UFE0F'
emoji[man_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2642'
emoji[man_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2642\UFE0F'
emoji[man_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2642'
emoji[man_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2642\UFE0F'
emoji[man_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2642'
emoji[man_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2642\UFE0F'
emoji[man_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2642'
emoji[man_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2642\UFE0F'
emoji[man_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2642'
emoji[woman_running]=$'\U1F3C3\U200D\U2640\UFE0F'
emoji[woman_running_minimally]=$'\U1F3C3\U200D\U2640'
emoji[running_woman]=$'\U1F3C3\U200D\U2640'
emoji[woman_running_light_skin_tone]=$'\U1F3C3\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_running_light_skin_tone_minimally]=$'\U1F3C3\U1F3FB\U200D\U2640'
emoji[woman_running_medium_light_skin_tone]=$'\U1F3C3\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_running_medium_light_skin_tone_minimally]=$'\U1F3C3\U1F3FC\U200D\U2640'
emoji[woman_running_medium_skin_tone]=$'\U1F3C3\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_running_medium_skin_tone_minimally]=$'\U1F3C3\U1F3FD\U200D\U2640'
emoji[woman_running_medium_dark_skin_tone]=$'\U1F3C3\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_running_medium_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FE\U200D\U2640'
emoji[woman_running_dark_skin_tone]=$'\U1F3C3\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_running_dark_skin_tone_minimally]=$'\U1F3C3\U1F3FF\U200D\U2640'
emoji[woman_dancing]=$'\U1F483'
emoji[dancer]=$'\U1F483'
emoji[woman_dancing_light_skin_tone]=$'\U1F483\U1F3FB'
emoji[woman_dancing_medium_light_skin_tone]=$'\U1F483\U1F3FC'
emoji[woman_dancing_medium_skin_tone]=$'\U1F483\U1F3FD'
emoji[woman_dancing_medium_dark_skin_tone]=$'\U1F483\U1F3FE'
emoji[woman_dancing_dark_skin_tone]=$'\U1F483\U1F3FF'
emoji[woman_dancing_dark_skin_tone_1]=$'\U1F57A'
emoji[man_dancing]=$'\U1F57A'
emoji[man_dancing_light_skin_tone]=$'\U1F57A\U1F3FB'
emoji[man_dancing_medium_light_skin_tone]=$'\U1F57A\U1F3FC'
emoji[man_dancing_medium_skin_tone]=$'\U1F57A\U1F3FD'
emoji[man_dancing_medium_dark_skin_tone]=$'\U1F57A\U1F3FE'
emoji[man_dancing_dark_skin_tone]=$'\U1F57A\U1F3FF'
emoji[man_in_suit_levitating]=$'\U1F574\UFE0F'
emoji[man_in_suit_levitating_unqualified]=$'\U1F574'
emoji[business_suit_levitating]=$'\U1F574'
emoji[man_in_suit_levitating_light_skin_tone]=$'\U1F574\U1F3FB'
emoji[man_in_suit_levitating_medium_light_skin_tone]=$'\U1F574\U1F3FC'
emoji[man_in_suit_levitating_medium_skin_tone]=$'\U1F574\U1F3FD'
emoji[man_in_suit_levitating_medium_dark_skin_tone]=$'\U1F574\U1F3FE'
emoji[man_in_suit_levitating_dark_skin_tone]=$'\U1F574\U1F3FF'
emoji[people_with_bunny_ears]=$'\U1F46F'
emoji[dancers]=$'\U1F46F'
emoji[men_with_bunny_ears]=$'\U1F46F\U200D\U2642\UFE0F'
emoji[men_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2642'
emoji[dancing_men]=$'\U1F46F\U200D\U2642'
emoji[women_with_bunny_ears]=$'\U1F46F\U200D\U2640\UFE0F'
emoji[women_with_bunny_ears_minimally]=$'\U1F46F\U200D\U2640'
emoji[dancing_women]=$'\U1F46F\U200D\U2640'
emoji[person_in_steamy_room]=$'\U1F9D6'
emoji[sauna_person]=$'\U1F9D6'
emoji[person_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB'
emoji[person_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC'
emoji[person_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD'
emoji[person_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE'
emoji[person_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF'
emoji[man_in_steamy_room]=$'\U1F9D6\U200D\U2642\UFE0F'
emoji[man_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2642'
emoji[sauna_man]=$'\U1F9D6\U200D\U2642'
emoji[man_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2642\UFE0F'
emoji[man_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2642'
emoji[man_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2642\UFE0F'
emoji[man_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2642'
emoji[man_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2642\UFE0F'
emoji[man_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2642'
emoji[man_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2642\UFE0F'
emoji[man_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2642'
emoji[man_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2642\UFE0F'
emoji[man_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2642'
emoji[woman_in_steamy_room]=$'\U1F9D6\U200D\U2640\UFE0F'
emoji[woman_in_steamy_room_minimally]=$'\U1F9D6\U200D\U2640'
emoji[sauna_woman]=$'\U1F9D6\U200D\U2640'
emoji[woman_in_steamy_room_light_skin_tone]=$'\U1F9D6\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_in_steamy_room_light_skin_tone_minimally]=$'\U1F9D6\U1F3FB\U200D\U2640'
emoji[woman_in_steamy_room_medium_light_skin_tone]=$'\U1F9D6\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_in_steamy_room_medium_light_skin_tone_minimally]=$'\U1F9D6\U1F3FC\U200D\U2640'
emoji[woman_in_steamy_room_medium_skin_tone]=$'\U1F9D6\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_in_steamy_room_medium_skin_tone_minimally]=$'\U1F9D6\U1F3FD\U200D\U2640'
emoji[woman_in_steamy_room_medium_dark_skin_tone]=$'\U1F9D6\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_in_steamy_room_medium_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FE\U200D\U2640'
emoji[woman_in_steamy_room_dark_skin_tone]=$'\U1F9D6\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_in_steamy_room_dark_skin_tone_minimally]=$'\U1F9D6\U1F3FF\U200D\U2640'
emoji[person_climbing]=$'\U1F9D7'
emoji[climbing]=$'\U1F9D7'
emoji[person_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB'
emoji[person_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC'
emoji[person_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD'
emoji[person_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE'
emoji[person_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF'
emoji[man_climbing]=$'\U1F9D7\U200D\U2642\UFE0F'
emoji[man_climbing_minimally]=$'\U1F9D7\U200D\U2642'
emoji[climbing_man]=$'\U1F9D7\U200D\U2642'
emoji[man_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2642\UFE0F'
emoji[man_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2642'
emoji[man_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2642\UFE0F'
emoji[man_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2642'
emoji[man_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2642\UFE0F'
emoji[man_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2642'
emoji[man_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2642\UFE0F'
emoji[man_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2642'
emoji[man_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2642\UFE0F'
emoji[man_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2642'
emoji[woman_climbing]=$'\U1F9D7\U200D\U2640\UFE0F'
emoji[woman_climbing_minimally]=$'\U1F9D7\U200D\U2640'
emoji[climbing_woman]=$'\U1F9D7\U200D\U2640'
emoji[woman_climbing_light_skin_tone]=$'\U1F9D7\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_climbing_light_skin_tone_minimally]=$'\U1F9D7\U1F3FB\U200D\U2640'
emoji[woman_climbing_medium_light_skin_tone]=$'\U1F9D7\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_climbing_medium_light_skin_tone_minimally]=$'\U1F9D7\U1F3FC\U200D\U2640'
emoji[woman_climbing_medium_skin_tone]=$'\U1F9D7\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_climbing_medium_skin_tone_minimally]=$'\U1F9D7\U1F3FD\U200D\U2640'
emoji[woman_climbing_medium_dark_skin_tone]=$'\U1F9D7\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_climbing_medium_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FE\U200D\U2640'
emoji[woman_climbing_dark_skin_tone]=$'\U1F9D7\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_climbing_dark_skin_tone_minimally]=$'\U1F9D7\U1F3FF\U200D\U2640'
emoji[person_fencing]=$'\U1F93A'
emoji[horse_racing]=$'\U1F3C7'
emoji[horse_racing_light_skin_tone]=$'\U1F3C7\U1F3FB'
emoji[horse_racing_medium_light_skin_tone]=$'\U1F3C7\U1F3FC'
emoji[horse_racing_medium_skin_tone]=$'\U1F3C7\U1F3FD'
emoji[horse_racing_medium_dark_skin_tone]=$'\U1F3C7\U1F3FE'
emoji[horse_racing_dark_skin_tone]=$'\U1F3C7\U1F3FF'
emoji[skier]=$'\U26F7\UFE0F'
emoji[skier_unqualified]=$'\U26F7'
emoji[snowboarder]=$'\U1F3C2'
emoji[snowboarder_light_skin_tone]=$'\U1F3C2\U1F3FB'
emoji[snowboarder_medium_light_skin_tone]=$'\U1F3C2\U1F3FC'
emoji[snowboarder_medium_skin_tone]=$'\U1F3C2\U1F3FD'
emoji[snowboarder_medium_dark_skin_tone]=$'\U1F3C2\U1F3FE'
emoji[snowboarder_dark_skin_tone]=$'\U1F3C2\U1F3FF'
emoji[person_golfing]=$'\U1F3CC\UFE0F'
emoji[person_golfing_unqualified]=$'\U1F3CC'
emoji[golfing]=$'\U1F3CC'
emoji[person_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB'
emoji[person_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC'
emoji[person_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD'
emoji[person_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE'
emoji[person_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF'
emoji[man_golfing]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F'
emoji[golfing_man]=$'\U1F3CC\UFE0F\U200D\U2642\UFE0F'
emoji[man_golfing_unqualified]=$'\U1F3CC\U200D\U2642\UFE0F'
emoji[man_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2642'
emoji[man_golfing_unqualified_2]=$'\U1F3CC\U200D\U2642'
emoji[man_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2642\UFE0F'
emoji[man_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2642'
emoji[man_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2642\UFE0F'
emoji[man_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2642'
emoji[man_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2642\UFE0F'
emoji[man_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2642'
emoji[man_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2642\UFE0F'
emoji[man_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2642'
emoji[man_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2642\UFE0F'
emoji[man_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2642'
emoji[woman_golfing]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F'
emoji[golfing_woman]=$'\U1F3CC\UFE0F\U200D\U2640\UFE0F'
emoji[woman_golfing_unqualified]=$'\U1F3CC\U200D\U2640\UFE0F'
emoji[woman_golfing_unqualified_1]=$'\U1F3CC\UFE0F\U200D\U2640'
emoji[woman_golfing_unqualified_2]=$'\U1F3CC\U200D\U2640'
emoji[woman_golfing_light_skin_tone]=$'\U1F3CC\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_golfing_light_skin_tone_minimally]=$'\U1F3CC\U1F3FB\U200D\U2640'
emoji[woman_golfing_medium_light_skin_tone]=$'\U1F3CC\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_golfing_medium_light_skin_tone_minimally]=$'\U1F3CC\U1F3FC\U200D\U2640'
emoji[woman_golfing_medium_skin_tone]=$'\U1F3CC\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_golfing_medium_skin_tone_minimally]=$'\U1F3CC\U1F3FD\U200D\U2640'
emoji[woman_golfing_medium_dark_skin_tone]=$'\U1F3CC\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_golfing_medium_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FE\U200D\U2640'
emoji[woman_golfing_dark_skin_tone]=$'\U1F3CC\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_golfing_dark_skin_tone_minimally]=$'\U1F3CC\U1F3FF\U200D\U2640'
emoji[person_surfing]=$'\U1F3C4'
emoji[surfer]=$'\U1F3C4'
emoji[person_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB'
emoji[person_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC'
emoji[person_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD'
emoji[person_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE'
emoji[person_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF'
emoji[man_surfing]=$'\U1F3C4\U200D\U2642\UFE0F'
emoji[man_surfing_minimally]=$'\U1F3C4\U200D\U2642'
emoji[surfing_man]=$'\U1F3C4\U200D\U2642'
emoji[man_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2642\UFE0F'
emoji[man_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2642'
emoji[man_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2642\UFE0F'
emoji[man_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2642'
emoji[man_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2642\UFE0F'
emoji[man_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2642'
emoji[man_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2642\UFE0F'
emoji[man_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2642'
emoji[man_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2642\UFE0F'
emoji[man_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2642'
emoji[woman_surfing]=$'\U1F3C4\U200D\U2640\UFE0F'
emoji[woman_surfing_minimally]=$'\U1F3C4\U200D\U2640'
emoji[surfing_woman]=$'\U1F3C4\U200D\U2640'
emoji[woman_surfing_light_skin_tone]=$'\U1F3C4\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_surfing_light_skin_tone_minimally]=$'\U1F3C4\U1F3FB\U200D\U2640'
emoji[woman_surfing_medium_light_skin_tone]=$'\U1F3C4\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_surfing_medium_light_skin_tone_minimally]=$'\U1F3C4\U1F3FC\U200D\U2640'
emoji[woman_surfing_medium_skin_tone]=$'\U1F3C4\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_surfing_medium_skin_tone_minimally]=$'\U1F3C4\U1F3FD\U200D\U2640'
emoji[woman_surfing_medium_dark_skin_tone]=$'\U1F3C4\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_surfing_medium_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FE\U200D\U2640'
emoji[woman_surfing_dark_skin_tone]=$'\U1F3C4\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_surfing_dark_skin_tone_minimally]=$'\U1F3C4\U1F3FF\U200D\U2640'
emoji[person_rowing_boat]=$'\U1F6A3'
emoji[rowboat]=$'\U1F6A3'
emoji[person_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB'
emoji[person_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC'
emoji[person_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD'
emoji[person_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE'
emoji[person_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF'
emoji[man_rowing_boat]=$'\U1F6A3\U200D\U2642\UFE0F'
emoji[man_rowing_boat_minimally]=$'\U1F6A3\U200D\U2642'
emoji[rowing_man]=$'\U1F6A3\U200D\U2642'
emoji[man_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2642\UFE0F'
emoji[man_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2642'
emoji[man_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2642\UFE0F'
emoji[man_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2642'
emoji[man_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2642\UFE0F'
emoji[man_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2642'
emoji[man_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2642\UFE0F'
emoji[man_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2642'
emoji[man_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2642\UFE0F'
emoji[man_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2642'
emoji[woman_rowing_boat]=$'\U1F6A3\U200D\U2640\UFE0F'
emoji[woman_rowing_boat_minimally]=$'\U1F6A3\U200D\U2640'
emoji[rowing_woman]=$'\U1F6A3\U200D\U2640'
emoji[woman_rowing_boat_light_skin_tone]=$'\U1F6A3\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_rowing_boat_light_skin_tone_minimally]=$'\U1F6A3\U1F3FB\U200D\U2640'
emoji[woman_rowing_boat_medium_light_skin_tone]=$'\U1F6A3\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_rowing_boat_medium_light_skin_tone_minimally]=$'\U1F6A3\U1F3FC\U200D\U2640'
emoji[woman_rowing_boat_medium_skin_tone]=$'\U1F6A3\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_rowing_boat_medium_skin_tone_minimally]=$'\U1F6A3\U1F3FD\U200D\U2640'
emoji[woman_rowing_boat_medium_dark_skin_tone]=$'\U1F6A3\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_rowing_boat_medium_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FE\U200D\U2640'
emoji[woman_rowing_boat_dark_skin_tone]=$'\U1F6A3\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_rowing_boat_dark_skin_tone_minimally]=$'\U1F6A3\U1F3FF\U200D\U2640'
emoji[person_swimming]=$'\U1F3CA'
emoji[swimmer]=$'\U1F3CA'
emoji[person_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB'
emoji[person_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC'
emoji[person_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD'
emoji[person_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE'
emoji[person_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF'
emoji[man_swimming]=$'\U1F3CA\U200D\U2642\UFE0F'
emoji[man_swimming_minimally]=$'\U1F3CA\U200D\U2642'
emoji[swimming_man]=$'\U1F3CA\U200D\U2642'
emoji[man_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2642\UFE0F'
emoji[man_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2642'
emoji[man_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2642\UFE0F'
emoji[man_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2642'
emoji[man_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2642\UFE0F'
emoji[man_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2642'
emoji[man_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2642\UFE0F'
emoji[man_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2642'
emoji[man_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2642\UFE0F'
emoji[man_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2642'
emoji[woman_swimming]=$'\U1F3CA\U200D\U2640\UFE0F'
emoji[woman_swimming_minimally]=$'\U1F3CA\U200D\U2640'
emoji[swimming_woman]=$'\U1F3CA\U200D\U2640'
emoji[woman_swimming_light_skin_tone]=$'\U1F3CA\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_swimming_light_skin_tone_minimally]=$'\U1F3CA\U1F3FB\U200D\U2640'
emoji[woman_swimming_medium_light_skin_tone]=$'\U1F3CA\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_swimming_medium_light_skin_tone_minimally]=$'\U1F3CA\U1F3FC\U200D\U2640'
emoji[woman_swimming_medium_skin_tone]=$'\U1F3CA\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_swimming_medium_skin_tone_minimally]=$'\U1F3CA\U1F3FD\U200D\U2640'
emoji[woman_swimming_medium_dark_skin_tone]=$'\U1F3CA\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_swimming_medium_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FE\U200D\U2640'
emoji[woman_swimming_dark_skin_tone]=$'\U1F3CA\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_swimming_dark_skin_tone_minimally]=$'\U1F3CA\U1F3FF\U200D\U2640'
emoji[person_bouncing_ball]=$'\U26F9\UFE0F'
emoji[person_bouncing_ball_unqualified]=$'\U26F9'
emoji[bouncing_ball_person]=$'\U26F9'
emoji[person_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB'
emoji[person_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC'
emoji[person_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD'
emoji[person_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE'
emoji[person_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF'
emoji[man_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
emoji[bouncing_ball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
emoji[basketball_man]=$'\U26F9\UFE0F\U200D\U2642\UFE0F'
emoji[man_bouncing_ball_unqualified]=$'\U26F9\U200D\U2642\UFE0F'
emoji[man_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2642'
emoji[man_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2642'
emoji[man_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2642\UFE0F'
emoji[man_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2642'
emoji[man_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2642\UFE0F'
emoji[man_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2642'
emoji[man_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2642\UFE0F'
emoji[man_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2642'
emoji[man_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2642\UFE0F'
emoji[man_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2642'
emoji[man_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2642\UFE0F'
emoji[man_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2642'
emoji[woman_bouncing_ball]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
emoji[bouncing_ball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
emoji[basketball_woman]=$'\U26F9\UFE0F\U200D\U2640\UFE0F'
emoji[woman_bouncing_ball_unqualified]=$'\U26F9\U200D\U2640\UFE0F'
emoji[woman_bouncing_ball_unqualified_1]=$'\U26F9\UFE0F\U200D\U2640'
emoji[woman_bouncing_ball_unqualified_2]=$'\U26F9\U200D\U2640'
emoji[woman_bouncing_ball_light_skin_tone]=$'\U26F9\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_bouncing_ball_light_skin_tone_minimally]=$'\U26F9\U1F3FB\U200D\U2640'
emoji[woman_bouncing_ball_medium_light_skin_tone]=$'\U26F9\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_bouncing_ball_medium_light_skin_tone_minimally]=$'\U26F9\U1F3FC\U200D\U2640'
emoji[woman_bouncing_ball_medium_skin_tone]=$'\U26F9\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_bouncing_ball_medium_skin_tone_minimally]=$'\U26F9\U1F3FD\U200D\U2640'
emoji[woman_bouncing_ball_medium_dark_skin_tone]=$'\U26F9\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_bouncing_ball_medium_dark_skin_tone_minimally]=$'\U26F9\U1F3FE\U200D\U2640'
emoji[woman_bouncing_ball_dark_skin_tone]=$'\U26F9\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_bouncing_ball_dark_skin_tone_minimally]=$'\U26F9\U1F3FF\U200D\U2640'
emoji[person_lifting_weights]=$'\U1F3CB\UFE0F'
emoji[person_lifting_weights_unqualified]=$'\U1F3CB'
emoji[weight_lifting]=$'\U1F3CB'
emoji[person_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB'
emoji[person_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC'
emoji[person_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD'
emoji[person_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE'
emoji[person_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF'
emoji[man_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F'
emoji[weight_lifting_man]=$'\U1F3CB\UFE0F\U200D\U2642\UFE0F'
emoji[man_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2642\UFE0F'
emoji[man_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2642'
emoji[man_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2642'
emoji[man_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2642\UFE0F'
emoji[man_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2642'
emoji[man_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2642\UFE0F'
emoji[man_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2642'
emoji[man_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2642\UFE0F'
emoji[man_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2642'
emoji[man_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2642\UFE0F'
emoji[man_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2642'
emoji[man_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2642\UFE0F'
emoji[man_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2642'
emoji[woman_lifting_weights]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F'
emoji[weight_lifting_woman]=$'\U1F3CB\UFE0F\U200D\U2640\UFE0F'
emoji[woman_lifting_weights_unqualified]=$'\U1F3CB\U200D\U2640\UFE0F'
emoji[woman_lifting_weights_unqualified_1]=$'\U1F3CB\UFE0F\U200D\U2640'
emoji[woman_lifting_weights_unqualified_2]=$'\U1F3CB\U200D\U2640'
emoji[woman_lifting_weights_light_skin_tone]=$'\U1F3CB\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_lifting_weights_light_skin_tone_minimally]=$'\U1F3CB\U1F3FB\U200D\U2640'
emoji[woman_lifting_weights_medium_light_skin_tone]=$'\U1F3CB\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_lifting_weights_medium_light_skin_tone_minimally]=$'\U1F3CB\U1F3FC\U200D\U2640'
emoji[woman_lifting_weights_medium_skin_tone]=$'\U1F3CB\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_lifting_weights_medium_skin_tone_minimally]=$'\U1F3CB\U1F3FD\U200D\U2640'
emoji[woman_lifting_weights_medium_dark_skin_tone]=$'\U1F3CB\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_lifting_weights_medium_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FE\U200D\U2640'
emoji[woman_lifting_weights_dark_skin_tone]=$'\U1F3CB\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_lifting_weights_dark_skin_tone_minimally]=$'\U1F3CB\U1F3FF\U200D\U2640'
emoji[person_biking]=$'\U1F6B4'
emoji[bicyclist]=$'\U1F6B4'
emoji[person_biking_light_skin_tone]=$'\U1F6B4\U1F3FB'
emoji[person_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC'
emoji[person_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD'
emoji[person_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE'
emoji[person_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF'
emoji[man_biking]=$'\U1F6B4\U200D\U2642\UFE0F'
emoji[man_biking_minimally]=$'\U1F6B4\U200D\U2642'
emoji[biking_man]=$'\U1F6B4\U200D\U2642'
emoji[man_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2642\UFE0F'
emoji[man_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2642'
emoji[man_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2642\UFE0F'
emoji[man_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2642'
emoji[man_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2642\UFE0F'
emoji[man_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2642'
emoji[man_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2642\UFE0F'
emoji[man_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2642'
emoji[man_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2642\UFE0F'
emoji[man_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2642'
emoji[woman_biking]=$'\U1F6B4\U200D\U2640\UFE0F'
emoji[woman_biking_minimally]=$'\U1F6B4\U200D\U2640'
emoji[biking_woman]=$'\U1F6B4\U200D\U2640'
emoji[woman_biking_light_skin_tone]=$'\U1F6B4\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_biking_light_skin_tone_minimally]=$'\U1F6B4\U1F3FB\U200D\U2640'
emoji[woman_biking_medium_light_skin_tone]=$'\U1F6B4\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_biking_medium_light_skin_tone_minimally]=$'\U1F6B4\U1F3FC\U200D\U2640'
emoji[woman_biking_medium_skin_tone]=$'\U1F6B4\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_biking_medium_skin_tone_minimally]=$'\U1F6B4\U1F3FD\U200D\U2640'
emoji[woman_biking_medium_dark_skin_tone]=$'\U1F6B4\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_biking_medium_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FE\U200D\U2640'
emoji[woman_biking_dark_skin_tone]=$'\U1F6B4\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_biking_dark_skin_tone_minimally]=$'\U1F6B4\U1F3FF\U200D\U2640'
emoji[person_mountain_biking]=$'\U1F6B5'
emoji[mountain_bicyclist]=$'\U1F6B5'
emoji[person_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB'
emoji[person_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC'
emoji[person_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD'
emoji[person_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE'
emoji[person_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF'
emoji[man_mountain_biking]=$'\U1F6B5\U200D\U2642\UFE0F'
emoji[man_mountain_biking_minimally]=$'\U1F6B5\U200D\U2642'
emoji[mountain_biking_man]=$'\U1F6B5\U200D\U2642'
emoji[man_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2642\UFE0F'
emoji[man_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2642'
emoji[man_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2642\UFE0F'
emoji[man_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2642'
emoji[man_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2642\UFE0F'
emoji[man_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2642'
emoji[man_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2642\UFE0F'
emoji[man_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2642'
emoji[man_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2642\UFE0F'
emoji[man_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2642'
emoji[woman_mountain_biking]=$'\U1F6B5\U200D\U2640\UFE0F'
emoji[woman_mountain_biking_minimally]=$'\U1F6B5\U200D\U2640'
emoji[mountain_biking_woman]=$'\U1F6B5\U200D\U2640'
emoji[woman_mountain_biking_light_skin_tone]=$'\U1F6B5\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_mountain_biking_light_skin_tone_minimally]=$'\U1F6B5\U1F3FB\U200D\U2640'
emoji[woman_mountain_biking_medium_light_skin_tone]=$'\U1F6B5\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_mountain_biking_medium_light_skin_tone_minimally]=$'\U1F6B5\U1F3FC\U200D\U2640'
emoji[woman_mountain_biking_medium_skin_tone]=$'\U1F6B5\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_mountain_biking_medium_skin_tone_minimally]=$'\U1F6B5\U1F3FD\U200D\U2640'
emoji[woman_mountain_biking_medium_dark_skin_tone]=$'\U1F6B5\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_mountain_biking_medium_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FE\U200D\U2640'
emoji[woman_mountain_biking_dark_skin_tone]=$'\U1F6B5\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_mountain_biking_dark_skin_tone_minimally]=$'\U1F6B5\U1F3FF\U200D\U2640'
emoji[person_cartwheeling]=$'\U1F938'
emoji[cartwheeling]=$'\U1F938'
emoji[person_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB'
emoji[person_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC'
emoji[person_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD'
emoji[person_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE'
emoji[person_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF'
emoji[man_cartwheeling]=$'\U1F938\U200D\U2642\UFE0F'
emoji[man_cartwheeling_minimally]=$'\U1F938\U200D\U2642'
emoji[man_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2642\UFE0F'
emoji[man_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2642'
emoji[man_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2642\UFE0F'
emoji[man_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2642'
emoji[man_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2642\UFE0F'
emoji[man_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2642'
emoji[man_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2642\UFE0F'
emoji[man_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2642'
emoji[man_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2642\UFE0F'
emoji[man_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2642'
emoji[woman_cartwheeling]=$'\U1F938\U200D\U2640\UFE0F'
emoji[woman_cartwheeling_minimally]=$'\U1F938\U200D\U2640'
emoji[woman_cartwheeling_light_skin_tone]=$'\U1F938\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_cartwheeling_light_skin_tone_minimally]=$'\U1F938\U1F3FB\U200D\U2640'
emoji[woman_cartwheeling_medium_light_skin_tone]=$'\U1F938\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_cartwheeling_medium_light_skin_tone_minimally]=$'\U1F938\U1F3FC\U200D\U2640'
emoji[woman_cartwheeling_medium_skin_tone]=$'\U1F938\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_cartwheeling_medium_skin_tone_minimally]=$'\U1F938\U1F3FD\U200D\U2640'
emoji[woman_cartwheeling_medium_dark_skin_tone]=$'\U1F938\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_cartwheeling_medium_dark_skin_tone_minimally]=$'\U1F938\U1F3FE\U200D\U2640'
emoji[woman_cartwheeling_dark_skin_tone]=$'\U1F938\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_cartwheeling_dark_skin_tone_minimally]=$'\U1F938\U1F3FF\U200D\U2640'
emoji[people_wrestling]=$'\U1F93C'
emoji[wrestling]=$'\U1F93C'
emoji[men_wrestling]=$'\U1F93C\U200D\U2642\UFE0F'
emoji[men_wrestling_minimally]=$'\U1F93C\U200D\U2642'
emoji[women_wrestling]=$'\U1F93C\U200D\U2640\UFE0F'
emoji[women_wrestling_minimally]=$'\U1F93C\U200D\U2640'
emoji[person_playing_water_polo]=$'\U1F93D'
emoji[water_polo]=$'\U1F93D'
emoji[person_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB'
emoji[person_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC'
emoji[person_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD'
emoji[person_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE'
emoji[person_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF'
emoji[man_playing_water_polo]=$'\U1F93D\U200D\U2642\UFE0F'
emoji[man_playing_water_polo_minimally]=$'\U1F93D\U200D\U2642'
emoji[man_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2642\UFE0F'
emoji[man_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2642'
emoji[man_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2642\UFE0F'
emoji[man_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2642'
emoji[man_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2642\UFE0F'
emoji[man_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2642'
emoji[man_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2642\UFE0F'
emoji[man_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2642'
emoji[man_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2642\UFE0F'
emoji[man_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2642'
emoji[woman_playing_water_polo]=$'\U1F93D\U200D\U2640\UFE0F'
emoji[woman_playing_water_polo_minimally]=$'\U1F93D\U200D\U2640'
emoji[woman_playing_water_polo_light_skin_tone]=$'\U1F93D\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_playing_water_polo_light_skin_tone_minimally]=$'\U1F93D\U1F3FB\U200D\U2640'
emoji[woman_playing_water_polo_medium_light_skin_tone]=$'\U1F93D\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_playing_water_polo_medium_light_skin_tone_minimally]=$'\U1F93D\U1F3FC\U200D\U2640'
emoji[woman_playing_water_polo_medium_skin_tone]=$'\U1F93D\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_playing_water_polo_medium_skin_tone_minimally]=$'\U1F93D\U1F3FD\U200D\U2640'
emoji[woman_playing_water_polo_medium_dark_skin_tone]=$'\U1F93D\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_playing_water_polo_medium_dark_skin_tone_minimally]=$'\U1F93D\U1F3FE\U200D\U2640'
emoji[woman_playing_water_polo_dark_skin_tone]=$'\U1F93D\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_playing_water_polo_dark_skin_tone_minimally]=$'\U1F93D\U1F3FF\U200D\U2640'
emoji[person_playing_handball]=$'\U1F93E'
emoji[handball_person]=$'\U1F93E'
emoji[person_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB'
emoji[person_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC'
emoji[person_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD'
emoji[person_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE'
emoji[person_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF'
emoji[man_playing_handball]=$'\U1F93E\U200D\U2642\UFE0F'
emoji[man_playing_handball_minimally]=$'\U1F93E\U200D\U2642'
emoji[man_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2642\UFE0F'
emoji[man_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2642'
emoji[man_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2642\UFE0F'
emoji[man_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2642'
emoji[man_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2642\UFE0F'
emoji[man_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2642'
emoji[man_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2642\UFE0F'
emoji[man_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2642'
emoji[man_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2642\UFE0F'
emoji[man_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2642'
emoji[woman_playing_handball]=$'\U1F93E\U200D\U2640\UFE0F'
emoji[woman_playing_handball_minimally]=$'\U1F93E\U200D\U2640'
emoji[woman_playing_handball_light_skin_tone]=$'\U1F93E\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_playing_handball_light_skin_tone_minimally]=$'\U1F93E\U1F3FB\U200D\U2640'
emoji[woman_playing_handball_medium_light_skin_tone]=$'\U1F93E\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_playing_handball_medium_light_skin_tone_minimally]=$'\U1F93E\U1F3FC\U200D\U2640'
emoji[woman_playing_handball_medium_skin_tone]=$'\U1F93E\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_playing_handball_medium_skin_tone_minimally]=$'\U1F93E\U1F3FD\U200D\U2640'
emoji[woman_playing_handball_medium_dark_skin_tone]=$'\U1F93E\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_playing_handball_medium_dark_skin_tone_minimally]=$'\U1F93E\U1F3FE\U200D\U2640'
emoji[woman_playing_handball_dark_skin_tone]=$'\U1F93E\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_playing_handball_dark_skin_tone_minimally]=$'\U1F93E\U1F3FF\U200D\U2640'
emoji[person_juggling]=$'\U1F939'
emoji[juggling_person]=$'\U1F939'
emoji[person_juggling_light_skin_tone]=$'\U1F939\U1F3FB'
emoji[person_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC'
emoji[person_juggling_medium_skin_tone]=$'\U1F939\U1F3FD'
emoji[person_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE'
emoji[person_juggling_dark_skin_tone]=$'\U1F939\U1F3FF'
emoji[man_juggling]=$'\U1F939\U200D\U2642\UFE0F'
emoji[man_juggling_minimally]=$'\U1F939\U200D\U2642'
emoji[man_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2642\UFE0F'
emoji[man_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2642'
emoji[man_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2642\UFE0F'
emoji[man_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2642'
emoji[man_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2642\UFE0F'
emoji[man_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2642'
emoji[man_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2642\UFE0F'
emoji[man_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2642'
emoji[man_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2642\UFE0F'
emoji[man_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2642'
emoji[woman_juggling]=$'\U1F939\U200D\U2640\UFE0F'
emoji[woman_juggling_minimally]=$'\U1F939\U200D\U2640'
emoji[woman_juggling_light_skin_tone]=$'\U1F939\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_juggling_light_skin_tone_minimally]=$'\U1F939\U1F3FB\U200D\U2640'
emoji[woman_juggling_medium_light_skin_tone]=$'\U1F939\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_juggling_medium_light_skin_tone_minimally]=$'\U1F939\U1F3FC\U200D\U2640'
emoji[woman_juggling_medium_skin_tone]=$'\U1F939\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_juggling_medium_skin_tone_minimally]=$'\U1F939\U1F3FD\U200D\U2640'
emoji[woman_juggling_medium_dark_skin_tone]=$'\U1F939\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_juggling_medium_dark_skin_tone_minimally]=$'\U1F939\U1F3FE\U200D\U2640'
emoji[woman_juggling_dark_skin_tone]=$'\U1F939\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_juggling_dark_skin_tone_minimally]=$'\U1F939\U1F3FF\U200D\U2640'
emoji[person_in_lotus_position]=$'\U1F9D8'
emoji[lotus_position]=$'\U1F9D8'
emoji[person_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB'
emoji[person_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC'
emoji[person_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD'
emoji[person_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE'
emoji[person_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF'
emoji[man_in_lotus_position]=$'\U1F9D8\U200D\U2642\UFE0F'
emoji[man_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2642'
emoji[lotus_position_man]=$'\U1F9D8\U200D\U2642'
emoji[man_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2642\UFE0F'
emoji[man_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2642'
emoji[man_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2642\UFE0F'
emoji[man_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2642'
emoji[man_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2642\UFE0F'
emoji[man_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2642'
emoji[man_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2642\UFE0F'
emoji[man_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2642'
emoji[man_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2642\UFE0F'
emoji[man_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2642'
emoji[woman_in_lotus_position]=$'\U1F9D8\U200D\U2640\UFE0F'
emoji[woman_in_lotus_position_minimally]=$'\U1F9D8\U200D\U2640'
emoji[lotus_position_woman]=$'\U1F9D8\U200D\U2640'
emoji[woman_in_lotus_position_light_skin_tone]=$'\U1F9D8\U1F3FB\U200D\U2640\UFE0F'
emoji[woman_in_lotus_position_light_skin_tone_minimally]=$'\U1F9D8\U1F3FB\U200D\U2640'
emoji[woman_in_lotus_position_medium_light_skin_tone]=$'\U1F9D8\U1F3FC\U200D\U2640\UFE0F'
emoji[woman_in_lotus_position_medium_light_skin_tone_minimally]=$'\U1F9D8\U1F3FC\U200D\U2640'
emoji[woman_in_lotus_position_medium_skin_tone]=$'\U1F9D8\U1F3FD\U200D\U2640\UFE0F'
emoji[woman_in_lotus_position_medium_skin_tone_minimally]=$'\U1F9D8\U1F3FD\U200D\U2640'
emoji[woman_in_lotus_position_medium_dark_skin_tone]=$'\U1F9D8\U1F3FE\U200D\U2640\UFE0F'
emoji[woman_in_lotus_position_medium_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FE\U200D\U2640'
emoji[woman_in_lotus_position_dark_skin_tone]=$'\U1F9D8\U1F3FF\U200D\U2640\UFE0F'
emoji[woman_in_lotus_position_dark_skin_tone_minimally]=$'\U1F9D8\U1F3FF\U200D\U2640'
emoji[person_taking_bath]=$'\U1F6C0'
emoji[bath]=$'\U1F6C0'
emoji[person_taking_bath_light_skin_tone]=$'\U1F6C0\U1F3FB'
emoji[person_taking_bath_medium_light_skin_tone]=$'\U1F6C0\U1F3FC'
emoji[person_taking_bath_medium_skin_tone]=$'\U1F6C0\U1F3FD'
emoji[person_taking_bath_medium_dark_skin_tone]=$'\U1F6C0\U1F3FE'
emoji[person_taking_bath_dark_skin_tone]=$'\U1F6C0\U1F3FF'
emoji[person_in_bed]=$'\U1F6CC'
emoji[sleeping_bed]=$'\U1F6CC'
emoji[person_in_bed_light_skin_tone]=$'\U1F6CC\U1F3FB'
emoji[person_in_bed_medium_light_skin_tone]=$'\U1F6CC\U1F3FC'
emoji[person_in_bed_medium_skin_tone]=$'\U1F6CC\U1F3FD'
emoji[person_in_bed_medium_dark_skin_tone]=$'\U1F6CC\U1F3FE'
emoji[person_in_bed_dark_skin_tone]=$'\U1F6CC\U1F3FF'
emoji[people_holding_hands]=$'\U1F9D1\U200D\U1F91D\U200D\U1F9D1'
emoji[people_holding_hands_light_skin_tone]=$'\U1F9D1\U1F3FB\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
emoji[people_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F9D1\U1F3FC\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
emoji[people_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
emoji[people_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F9D1\U1F3FD\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
emoji[people_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
emoji[people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
emoji[people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F9D1\U1F3FE\U200D\U1F91D\U200D\U1F9D1\U1F3FE'
emoji[people_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FB'
emoji[people_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FC'
emoji[people_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FD'
emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FE'
emoji[people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F9D1\U1F3FF\U200D\U1F91D\U200D\U1F9D1\U1F3FF'
emoji[women_holding_hands]=$'\U1F46D'
emoji[two_women_holding_hands]=$'\U1F46D'
emoji[women_holding_hands_light_skin_tone]=$'\U1F46D\U1F3FB'
emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F469\U1F3FB'
emoji[women_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46D\U1F3FC'
emoji[women_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FB'
emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F469\U1F3FC'
emoji[women_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46D\U1F3FD'
emoji[women_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FB'
emoji[women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FC'
emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F469\U1F3FD'
emoji[women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46D\U1F3FE'
emoji[women_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FB'
emoji[women_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FC'
emoji[women_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FD'
emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F469\U1F3FE'
emoji[women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46D\U1F3FF'
emoji[woman_and_man_holding_hands]=$'\U1F46B'
emoji[couple]=$'\U1F46B'
emoji[woman_and_man_holding_hands_light_skin_tone]=$'\U1F46B\U1F3FB'
emoji[woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FC'
emoji[woman_and_man_holding_hands_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FD'
emoji[woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FE'
emoji[woman_and_man_holding_hands_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FB\U200D\U1F91D\U200D\U1F468\U1F3FF'
emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46B\U1F3FC'
emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FD'
emoji[woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FE'
emoji[woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FF'
emoji[woman_and_man_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC'
emoji[woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46B\U1F3FD'
emoji[woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FE'
emoji[woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FF'
emoji[woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC'
emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD'
emoji[woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46B\U1F3FE'
emoji[woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone]=$'\U1F469\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FF'
emoji[woman_and_man_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC'
emoji[woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD'
emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F469\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE'
emoji[woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46B\U1F3FF'
emoji[men_holding_hands]=$'\U1F46C'
emoji[two_men_holding_hands]=$'\U1F46C'
emoji[men_holding_hands_light_skin_tone]=$'\U1F46C\U1F3FB'
emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone]=$'\U1F468\U1F3FC\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[men_holding_hands_medium_light_skin_tone_light_skin_tone_1]=$'\U1F46C\U1F3FC'
emoji[men_holding_hands_medium_skin_tone_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FD\U200D\U1F91D\U200D\U1F468\U1F3FC'
emoji[men_holding_hands_medium_skin_tone_medium_light_skin_tone_1]=$'\U1F46C\U1F3FD'
emoji[men_holding_hands_medium_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FC'
emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FE\U200D\U1F91D\U200D\U1F468\U1F3FD'
emoji[men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1]=$'\U1F46C\U1F3FE'
emoji[men_holding_hands_dark_skin_tone_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FB'
emoji[men_holding_hands_dark_skin_tone_medium_light_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FC'
emoji[men_holding_hands_dark_skin_tone_medium_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FD'
emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone]=$'\U1F468\U1F3FF\U200D\U1F91D\U200D\U1F468\U1F3FE'
emoji[men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1]=$'\U1F46C\U1F3FF'
emoji[kiss]=$'\U1F48F'
emoji[couplekiss]=$'\U1F48F'
emoji[kiss_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
emoji[couplekiss_man_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
emoji[kiss_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F468'
emoji[kiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
emoji[couplekiss_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F468'
emoji[kiss_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F48B\U200D\U1F468'
emoji[kiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469'
emoji[couplekiss_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F48B\U200D\U1F469'
emoji[kiss_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F48B\U200D\U1F469'
emoji[couple_with_heart]=$'\U1F491'
emoji[couple_with_heart_woman_man]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F468'
emoji[couple_with_heart_woman_man_minimally]=$'\U1F469\U200D\U2764\U200D\U1F468'
emoji[couple_with_heart_man_man]=$'\U1F468\U200D\U2764\UFE0F\U200D\U1F468'
emoji[couple_with_heart_man_man_minimally]=$'\U1F468\U200D\U2764\U200D\U1F468'
emoji[couple_with_heart_woman_woman]=$'\U1F469\U200D\U2764\UFE0F\U200D\U1F469'
emoji[couple_with_heart_woman_woman_minimally]=$'\U1F469\U200D\U2764\U200D\U1F469'
emoji[family]=$'\U1F46A'
emoji[family_man_woman_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466'
emoji[family_man_woman_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467'
emoji[family_man_woman_girl_boy]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F466'
emoji[family_man_woman_boy_boy]=$'\U1F468\U200D\U1F469\U200D\U1F466\U200D\U1F466'
emoji[family_man_woman_girl_girl]=$'\U1F468\U200D\U1F469\U200D\U1F467\U200D\U1F467'
emoji[family_man_man_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466'
emoji[family_man_man_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467'
emoji[family_man_man_girl_boy]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F466'
emoji[family_man_man_boy_boy]=$'\U1F468\U200D\U1F468\U200D\U1F466\U200D\U1F466'
emoji[family_man_man_girl_girl]=$'\U1F468\U200D\U1F468\U200D\U1F467\U200D\U1F467'
emoji[family_woman_woman_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466'
emoji[family_woman_woman_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467'
emoji[family_woman_woman_girl_boy]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F466'
emoji[family_woman_woman_boy_boy]=$'\U1F469\U200D\U1F469\U200D\U1F466\U200D\U1F466'
emoji[family_woman_woman_girl_girl]=$'\U1F469\U200D\U1F469\U200D\U1F467\U200D\U1F467'
emoji[family_man_boy]=$'\U1F468\U200D\U1F466'
emoji[family_man_boy_boy]=$'\U1F468\U200D\U1F466\U200D\U1F466'
emoji[family_man_girl]=$'\U1F468\U200D\U1F467'
emoji[family_man_girl_boy]=$'\U1F468\U200D\U1F467\U200D\U1F466'
emoji[family_man_girl_girl]=$'\U1F468\U200D\U1F467\U200D\U1F467'
emoji[family_woman_boy]=$'\U1F469\U200D\U1F466'
emoji[family_woman_boy_boy]=$'\U1F469\U200D\U1F466\U200D\U1F466'
emoji[family_woman_girl]=$'\U1F469\U200D\U1F467'
emoji[family_woman_girl_boy]=$'\U1F469\U200D\U1F467\U200D\U1F466'
emoji[family_woman_girl_girl]=$'\U1F469\U200D\U1F467\U200D\U1F467'
emoji[speaking_head]=$'\U1F5E3\UFE0F'
emoji[speaking_head_unqualified]=$'\U1F5E3'
emoji[bust_in_silhouette]=$'\U1F464'
emoji[busts_in_silhouette]=$'\U1F465'
emoji[footprints]=$'\U1F463'
emoji_mod[light_skin_tone]=$'\U1F3FB'
emoji_mod[medium_light_skin_tone]=$'\U1F3FC'
emoji_mod[medium_skin_tone]=$'\U1F3FD'
emoji_mod[medium_dark_skin_tone]=$'\U1F3FE'
emoji_mod[medium_dark_skin_tone_1]=$'\U1F3FF'
emoji_mod[red_hair]=$'\U1F9B0'
emoji_mod[curly_hair]=$'\U1F9B1'
emoji_mod[white_hair]=$'\U1F9B3'
emoji_mod[bald]=$'\U1F9B2'
emoji[monkey_face]=$'\U1F435'
emoji[monkey_face_1]=$'\U1F412'
emoji[monkey]=$'\U1F412'
emoji[gorilla]=$'\U1F98D'
emoji[orangutan]=$'\U1F9A7'
emoji[dog_face]=$'\U1F436'
emoji[dog]=$'\U1F436'
emoji[dog_face_1]=$'\U1F415'
emoji[dog2]=$'\U1F415'
emoji[guide_dog]=$'\U1F9AE'
emoji[service_dog]=$'\U1F415\U200D\U1F9BA'
emoji[poodle]=$'\U1F429'
emoji[wolf]=$'\U1F43A'
emoji[fox]=$'\U1F98A'
emoji[fox_face]=$'\U1F98A'
emoji[raccoon]=$'\U1F99D'
emoji[cat_face]=$'\U1F431'
emoji[cat]=$'\U1F431'
emoji[cat_face_1]=$'\U1F408'
emoji[cat2]=$'\U1F408'
emoji[lion]=$'\U1F981'
emoji[tiger_face]=$'\U1F42F'
emoji[tiger]=$'\U1F42F'
emoji[tiger_face_1]=$'\U1F405'
emoji[tiger2]=$'\U1F405'
emoji[leopard]=$'\U1F406'
emoji[horse_face]=$'\U1F434'
emoji[horse]=$'\U1F434'
emoji[horse_face_1]=$'\U1F40E'
emoji[racehorse]=$'\U1F40E'
emoji[unicorn]=$'\U1F984'
emoji[zebra]=$'\U1F993'
emoji[deer]=$'\U1F98C'
emoji[cow_face]=$'\U1F42E'
emoji[ox]=$'\U1F402'
emoji[water_buffalo]=$'\U1F403'
emoji[cow]=$'\U1F404'
emoji[cow2]=$'\U1F404'
emoji[pig_face]=$'\U1F437'
emoji[pig]=$'\U1F437'
emoji[pig_face_1]=$'\U1F416'
emoji[pig2]=$'\U1F416'
emoji[boar]=$'\U1F417'
emoji[pig_nose]=$'\U1F43D'
emoji[ram]=$'\U1F40F'
emoji[ewe]=$'\U1F411'
emoji[sheep]=$'\U1F411'
emoji[goat]=$'\U1F410'
emoji[camel]=$'\U1F42A'
emoji[dromedary_camel]=$'\U1F42A'
emoji[two_hump_camel]=$'\U1F42B'
emoji[llama]=$'\U1F999'
emoji[giraffe]=$'\U1F992'
emoji[elephant]=$'\U1F418'
emoji[rhinoceros]=$'\U1F98F'
emoji[hippopotamus]=$'\U1F99B'
emoji[mouse_face]=$'\U1F42D'
emoji[mouse]=$'\U1F42D'
emoji[mouse_face_1]=$'\U1F401'
emoji[mouse2]=$'\U1F401'
emoji[rat]=$'\U1F400'
emoji[hamster]=$'\U1F439'
emoji[rabbit_face]=$'\U1F430'
emoji[rabbit]=$'\U1F430'
emoji[rabbit_face_1]=$'\U1F407'
emoji[rabbit2]=$'\U1F407'
emoji[chipmunk]=$'\U1F43F\UFE0F'
emoji[chipmunk_unqualified]=$'\U1F43F'
emoji[hedgehog]=$'\U1F994'
emoji[bat]=$'\U1F987'
emoji[bear]=$'\U1F43B'
emoji[koala]=$'\U1F428'
emoji[panda]=$'\U1F43C'
emoji[panda_face]=$'\U1F43C'
emoji[sloth]=$'\U1F9A5'
emoji[otter]=$'\U1F9A6'
emoji[skunk]=$'\U1F9A8'
emoji[kangaroo]=$'\U1F998'
emoji[badger]=$'\U1F9A1'
emoji[paw_prints]=$'\U1F43E'
emoji[feet]=$'\U1F43E'
emoji[turkey]=$'\U1F983'
emoji[chicken]=$'\U1F414'
emoji[rooster]=$'\U1F413'
emoji[hatching_chick]=$'\U1F423'
emoji[baby_chick]=$'\U1F424'
emoji[front_facing_baby_chick]=$'\U1F425'
emoji[hatched_chick]=$'\U1F425'
emoji[bird]=$'\U1F426'
emoji[penguin]=$'\U1F427'
emoji[dove]=$'\U1F54A\UFE0F'
emoji[dove_unqualified]=$'\U1F54A'
emoji[eagle]=$'\U1F985'
emoji[duck]=$'\U1F986'
emoji[swan]=$'\U1F9A2'
emoji[owl]=$'\U1F989'
emoji[flamingo]=$'\U1F9A9'
emoji[peacock]=$'\U1F99A'
emoji[parrot]=$'\U1F99C'
emoji[frog]=$'\U1F438'
emoji[crocodile]=$'\U1F40A'
emoji[turtle]=$'\U1F422'
emoji[lizard]=$'\U1F98E'
emoji[snake]=$'\U1F40D'
emoji[dragon_face]=$'\U1F432'
emoji[dragon_face_1]=$'\U1F409'
emoji[dragon]=$'\U1F409'
emoji[sauropod]=$'\U1F995'
emoji[T_Rex]=$'\U1F996'
emoji[t-rex]=$'\U1F996'
emoji[spouting_whale]=$'\U1F433'
emoji[whale]=$'\U1F433'
emoji[spouting_whale_1]=$'\U1F40B'
emoji[whale2]=$'\U1F40B'
emoji[dolphin]=$'\U1F42C'
emoji[flipper]=$'\U1F42C'
emoji[fish]=$'\U1F41F'
emoji[tropical_fish]=$'\U1F420'
emoji[blowfish]=$'\U1F421'
emoji[shark]=$'\U1F988'
emoji[octopus]=$'\U1F419'
emoji[spiral_shell]=$'\U1F41A'
emoji[shell]=$'\U1F41A'
emoji[snail]=$'\U1F40C'
emoji[butterfly]=$'\U1F98B'
emoji[bug]=$'\U1F41B'
emoji[ant]=$'\U1F41C'
emoji[honeybee]=$'\U1F41D'
emoji[bee]=$'\U1F41D'
emoji[lady_beetle]=$'\U1F41E'
emoji[beetle]=$'\U1F41E'
emoji[cricket]=$'\U1F997'
emoji[spider]=$'\U1F577\UFE0F'
emoji[spider_unqualified]=$'\U1F577'
emoji[spider_web]=$'\U1F578\UFE0F'
emoji[spider_web_unqualified]=$'\U1F578'
emoji[scorpion]=$'\U1F982'
emoji[mosquito]=$'\U1F99F'
emoji[microbe]=$'\U1F9A0'
emoji[bouquet]=$'\U1F490'
emoji[cherry_blossom]=$'\U1F338'
emoji[white_flower]=$'\U1F4AE'
emoji[rosette]=$'\U1F3F5\UFE0F'
emoji[rosette_unqualified]=$'\U1F3F5'
emoji[rosette_unqualified_1]=$'\U1F339'
emoji[rose]=$'\U1F339'
emoji[wilted_flower]=$'\U1F940'
emoji[hibiscus]=$'\U1F33A'
emoji[sunflower]=$'\U1F33B'
emoji[blossom]=$'\U1F33C'
emoji[tulip]=$'\U1F337'
emoji[seedling]=$'\U1F331'
emoji[evergreen_tree]=$'\U1F332'
emoji[deciduous_tree]=$'\U1F333'
emoji[palm_tree]=$'\U1F334'
emoji[cactus]=$'\U1F335'
emoji[sheaf_of_rice]=$'\U1F33E'
emoji[ear_of_rice]=$'\U1F33E'
emoji[herb]=$'\U1F33F'
emoji[shamrock]=$'\U2618\UFE0F'
emoji[shamrock_unqualified]=$'\U2618'
emoji[four_leaf_clover]=$'\U1F340'
emoji[maple_leaf]=$'\U1F341'
emoji[fallen_leaf]=$'\U1F342'
emoji[leaf_fluttering_in_wind]=$'\U1F343'
emoji[leaves]=$'\U1F343'
emoji[grapes]=$'\U1F347'
emoji[melon]=$'\U1F348'
emoji[watermelon]=$'\U1F349'
emoji[tangerine]=$'\U1F34A'
emoji[orange]=$'\U1F34A'
emoji[mandarin]=$'\U1F34A'
emoji[lemon]=$'\U1F34B'
emoji[banana]=$'\U1F34C'
emoji[pineapple]=$'\U1F34D'
emoji[mango]=$'\U1F96D'
emoji[red_apple]=$'\U1F34E'
emoji[apple]=$'\U1F34E'
emoji[green_apple]=$'\U1F34F'
emoji[pear]=$'\U1F350'
emoji[peach]=$'\U1F351'
emoji[cherries]=$'\U1F352'
emoji[strawberry]=$'\U1F353'
emoji[kiwi_fruit]=$'\U1F95D'
emoji[tomato]=$'\U1F345'
emoji[coconut]=$'\U1F965'
emoji[avocado]=$'\U1F951'
emoji[eggplant]=$'\U1F346'
emoji[potato]=$'\U1F954'
emoji[carrot]=$'\U1F955'
emoji[ear_of_corn]=$'\U1F33D'
emoji[corn]=$'\U1F33D'
emoji[hot_pepper]=$'\U1F336\UFE0F'
emoji[hot_pepper_unqualified]=$'\U1F336'
emoji[cucumber]=$'\U1F952'
emoji[leafy_green]=$'\U1F96C'
emoji[broccoli]=$'\U1F966'
emoji[garlic]=$'\U1F9C4'
emoji[onion]=$'\U1F9C5'
emoji[mushroom]=$'\U1F344'
emoji[peanuts]=$'\U1F95C'
emoji[chestnut]=$'\U1F330'
emoji[bread]=$'\U1F35E'
emoji[croissant]=$'\U1F950'
emoji[baguette_bread]=$'\U1F956'
emoji[pretzel]=$'\U1F968'
emoji[bagel]=$'\U1F96F'
emoji[pancakes]=$'\U1F95E'
emoji[waffle]=$'\U1F9C7'
emoji[cheese_wedge]=$'\U1F9C0'
emoji[cheese]=$'\U1F9C0'
emoji[meat_on_bone]=$'\U1F356'
emoji[poultry_leg]=$'\U1F357'
emoji[cut_of_meat]=$'\U1F969'
emoji[bacon]=$'\U1F953'
emoji[hamburger]=$'\U1F354'
emoji[french_fries]=$'\U1F35F'
emoji[fries]=$'\U1F35F'
emoji[pizza]=$'\U1F355'
emoji[hot_dog]=$'\U1F32D'
emoji[hotdog]=$'\U1F32D'
emoji[sandwich]=$'\U1F96A'
emoji[taco]=$'\U1F32E'
emoji[burrito]=$'\U1F32F'
emoji[stuffed_flatbread]=$'\U1F959'
emoji[falafel]=$'\U1F9C6'
emoji[egg]=$'\U1F95A'
emoji[cooking]=$'\U1F373'
emoji[fried_egg]=$'\U1F373'
emoji[shallow_pan_of_food]=$'\U1F958'
emoji[pot_of_food]=$'\U1F372'
emoji[stew]=$'\U1F372'
emoji[bowl_with_spoon]=$'\U1F963'
emoji[green_salad]=$'\U1F957'
emoji[popcorn]=$'\U1F37F'
emoji[butter]=$'\U1F9C8'
emoji[salt]=$'\U1F9C2'
emoji[canned_food]=$'\U1F96B'
emoji[bento_box]=$'\U1F371'
emoji[bento]=$'\U1F371'
emoji[rice_cracker]=$'\U1F358'
emoji[rice_ball]=$'\U1F359'
emoji[cooked_rice]=$'\U1F35A'
emoji[rice]=$'\U1F35A'
emoji[curry_rice]=$'\U1F35B'
emoji[curry]=$'\U1F35B'
emoji[steaming_bowl]=$'\U1F35C'
emoji[ramen]=$'\U1F35C'
emoji[spaghetti]=$'\U1F35D'
emoji[roasted_sweet_potato]=$'\U1F360'
emoji[sweet_potato]=$'\U1F360'
emoji[oden]=$'\U1F362'
emoji[sushi]=$'\U1F363'
emoji[fried_shrimp]=$'\U1F364'
emoji[fish_cake_with_swirl]=$'\U1F365'
emoji[fish_cake]=$'\U1F365'
emoji[moon_cake]=$'\U1F96E'
emoji[dango]=$'\U1F361'
emoji[dumpling]=$'\U1F95F'
emoji[fortune_cookie]=$'\U1F960'
emoji[takeout_box]=$'\U1F961'
emoji[crab]=$'\U1F980'
emoji[lobster]=$'\U1F99E'
emoji[shrimp]=$'\U1F990'
emoji[squid]=$'\U1F991'
emoji[oyster]=$'\U1F9AA'
emoji[soft_ice_cream]=$'\U1F366'
emoji[icecream]=$'\U1F366'
emoji[shaved_ice]=$'\U1F367'
emoji[ice_cream]=$'\U1F368'
emoji[doughnut]=$'\U1F369'
emoji[cookie]=$'\U1F36A'
emoji[birthday_cake]=$'\U1F382'
emoji[birthday]=$'\U1F382'
emoji[shortcake]=$'\U1F370'
emoji[cake]=$'\U1F370'
emoji[cupcake]=$'\U1F9C1'
emoji[pie]=$'\U1F967'
emoji[chocolate_bar]=$'\U1F36B'
emoji[candy]=$'\U1F36C'
emoji[lollipop]=$'\U1F36D'
emoji[custard]=$'\U1F36E'
emoji[honey_pot]=$'\U1F36F'
emoji[baby_bottle]=$'\U1F37C'
emoji[glass_of_milk]=$'\U1F95B'
emoji[milk_glass]=$'\U1F95B'
emoji[hot_beverage]=$'\U2615'
emoji[coffee]=$'\U2615'
emoji[teacup_without_handle]=$'\U1F375'
emoji[tea]=$'\U1F375'
emoji[sake]=$'\U1F376'
emoji[bottle_with_popping_cork]=$'\U1F37E'
emoji[champagne]=$'\U1F37E'
emoji[wine_glass]=$'\U1F377'
emoji[cocktail_glass]=$'\U1F378'
emoji[cocktail]=$'\U1F378'
emoji[tropical_drink]=$'\U1F379'
emoji[beer_mug]=$'\U1F37A'
emoji[beer]=$'\U1F37A'
emoji[clinking_beer_mugs]=$'\U1F37B'
emoji[beers]=$'\U1F37B'
emoji[clinking_glasses]=$'\U1F942'
emoji[tumbler_glass]=$'\U1F943'
emoji[cup_with_straw]=$'\U1F964'
emoji[beverage_box]=$'\U1F9C3'
emoji[mate]=$'\U1F9C9'
emoji[ice_cube]=$'\U1F9CA'
emoji[chopsticks]=$'\U1F962'
emoji[fork_and_knife_with_plate]=$'\U1F37D\UFE0F'
emoji[fork_and_knife_with_plate_unqualified]=$'\U1F37D'
emoji[plate_with_cutlery]=$'\U1F37D'
emoji[fork_and_knife_with_plate_unqualified_1]=$'\U1F374'
emoji[fork_and_knife]=$'\U1F374'
emoji[spoon]=$'\U1F944'
emoji[kitchen_knife]=$'\U1F52A'
emoji[hocho]=$'\U1F52A'
emoji[knife]=$'\U1F52A'
emoji[amphora]=$'\U1F3FA'
emoji[globe_showing_Europe_Africa]=$'\U1F30D'
emoji[earth_africa]=$'\U1F30D'
emoji[globe_showing_Americas]=$'\U1F30E'
emoji[earth_americas]=$'\U1F30E'
emoji[globe_showing_Asia_Australia]=$'\U1F30F'
emoji[earth_asia]=$'\U1F30F'
emoji[globe_with_meridians]=$'\U1F310'
emoji[world_map]=$'\U1F5FA\UFE0F'
emoji[world_map_unqualified]=$'\U1F5FA'
emoji[map_of_Japan]=$'\U1F5FE'
emoji[japan]=$'\U1F5FE'
emoji[compass]=$'\U1F9ED'
emoji[snow_capped_mountain]=$'\U1F3D4\UFE0F'
emoji[snow_capped_mountain_unqualified]=$'\U1F3D4'
emoji[mountain_snow]=$'\U1F3D4'
emoji[snow_capped_mountain_unqualified_1]=$'\U26F0\UFE0F'
emoji[snow_capped_mountain_unqualified_2]=$'\U26F0'
emoji[mountain]=$'\U26F0'
emoji[volcano]=$'\U1F30B'
emoji[mount_fuji]=$'\U1F5FB'
emoji[camping]=$'\U1F3D5\UFE0F'
emoji[camping_unqualified]=$'\U1F3D5'
emoji[beach_with_umbrella]=$'\U1F3D6\UFE0F'
emoji[beach_with_umbrella_unqualified]=$'\U1F3D6'
emoji[beach_umbrella]=$'\U1F3D6'
emoji[desert]=$'\U1F3DC\UFE0F'
emoji[desert_unqualified]=$'\U1F3DC'
emoji[desert_island]=$'\U1F3DD\UFE0F'
emoji[desert_island_unqualified]=$'\U1F3DD'
emoji[national_park]=$'\U1F3DE\UFE0F'
emoji[national_park_unqualified]=$'\U1F3DE'
emoji[stadium]=$'\U1F3DF\UFE0F'
emoji[stadium_unqualified]=$'\U1F3DF'
emoji[classical_building]=$'\U1F3DB\UFE0F'
emoji[classical_building_unqualified]=$'\U1F3DB'
emoji[building_construction]=$'\U1F3D7\UFE0F'
emoji[building_construction_unqualified]=$'\U1F3D7'
emoji[brick]=$'\U1F9F1'
emoji[bricks]=$'\U1F9F1'
emoji[houses]=$'\U1F3D8\UFE0F'
emoji[houses_unqualified]=$'\U1F3D8'
emoji[derelict_house]=$'\U1F3DA\UFE0F'
emoji[derelict_house_unqualified]=$'\U1F3DA'
emoji[derelict_house_unqualified_1]=$'\U1F3E0'
emoji[house]=$'\U1F3E0'
emoji[house_with_garden]=$'\U1F3E1'
emoji[office_building]=$'\U1F3E2'
emoji[office]=$'\U1F3E2'
emoji[Japanese_post_office]=$'\U1F3E3'
emoji[post_office]=$'\U1F3E3'
emoji[Japanese_post_office_1]=$'\U1F3E4'
emoji[european_post_office]=$'\U1F3E4'
emoji[hospital]=$'\U1F3E5'
emoji[bank]=$'\U1F3E6'
emoji[hotel]=$'\U1F3E8'
emoji[love_hotel]=$'\U1F3E9'
emoji[convenience_store]=$'\U1F3EA'
emoji[school]=$'\U1F3EB'
emoji[department_store]=$'\U1F3EC'
emoji[factory]=$'\U1F3ED'
emoji[Japanese_castle]=$'\U1F3EF'
emoji[japanese_castle]=$'\U1F3EF'
emoji[Japanese_castle_1]=$'\U1F3F0'
emoji[european_castle]=$'\U1F3F0'
emoji[wedding]=$'\U1F492'
emoji[Tokyo_tower]=$'\U1F5FC'
emoji[tokyo_tower]=$'\U1F5FC'
emoji[Statue_of_Liberty]=$'\U1F5FD'
emoji[statue_of_liberty]=$'\U1F5FD'
emoji[church]=$'\U26EA'
emoji[mosque]=$'\U1F54C'
emoji[hindu_temple]=$'\U1F6D5'
emoji[synagogue]=$'\U1F54D'
emoji[shinto_shrine]=$'\U26E9\UFE0F'
emoji[shinto_shrine_unqualified]=$'\U26E9'
emoji[kaaba]=$'\U1F54B'
emoji[fountain]=$'\U26F2'
emoji[tent]=$'\U26FA'
emoji[foggy]=$'\U1F301'
emoji[night_with_stars]=$'\U1F303'
emoji[cityscape]=$'\U1F3D9\UFE0F'
emoji[cityscape_unqualified]=$'\U1F3D9'
emoji[sunrise_over_mountains]=$'\U1F304'
emoji[sunrise_over_mountains_1]=$'\U1F305'
emoji[sunrise]=$'\U1F305'
emoji[cityscape_at_dusk]=$'\U1F306'
emoji[city_sunset]=$'\U1F306'
emoji[sunset]=$'\U1F307'
emoji[city_sunrise]=$'\U1F307'
emoji[bridge_at_night]=$'\U1F309'
emoji[hot_springs]=$'\U2668\UFE0F'
emoji[hotsprings]=$'\U2668\UFE0F'
emoji[hot_springs_unqualified]=$'\U2668'
emoji[carousel_horse]=$'\U1F3A0'
emoji[ferris_wheel]=$'\U1F3A1'
emoji[roller_coaster]=$'\U1F3A2'
emoji[barber_pole]=$'\U1F488'
emoji[barber]=$'\U1F488'
emoji[circus_tent]=$'\U1F3AA'
emoji[locomotive]=$'\U1F682'
emoji[steam_locomotive]=$'\U1F682'
emoji[railway_car]=$'\U1F683'
emoji[high_speed_train]=$'\U1F684'
emoji[bullettrain_side]=$'\U1F684'
emoji[bullet_train]=$'\U1F685'
emoji[bullettrain_front]=$'\U1F685'
emoji[bullet_train_1]=$'\U1F686'
emoji[train2]=$'\U1F686'
emoji[metro]=$'\U1F687'
emoji[light_rail]=$'\U1F688'
emoji[station]=$'\U1F689'
emoji[tram]=$'\U1F68A'
emoji[monorail]=$'\U1F69D'
emoji[mountain_railway]=$'\U1F69E'
emoji[tram_car]=$'\U1F68B'
emoji[train]=$'\U1F68B'
emoji[bus]=$'\U1F68C'
emoji[oncoming_bus]=$'\U1F68D'
emoji[trolleybus]=$'\U1F68E'
emoji[minibus]=$'\U1F690'
emoji[ambulance]=$'\U1F691'
emoji[fire_engine]=$'\U1F692'
emoji[police_car]=$'\U1F693'
emoji[oncoming_police_car]=$'\U1F694'
emoji[taxi]=$'\U1F695'
emoji[oncoming_taxi]=$'\U1F696'
emoji[automobile]=$'\U1F697'
emoji[car]=$'\U1F697'
emoji[red_car]=$'\U1F697'
emoji[oncoming_automobile]=$'\U1F698'
emoji[sport_utility_vehicle]=$'\U1F699'
emoji[blue_car]=$'\U1F699'
emoji[delivery_truck]=$'\U1F69A'
emoji[truck]=$'\U1F69A'
emoji[articulated_lorry]=$'\U1F69B'
emoji[tractor]=$'\U1F69C'
emoji[racing_car]=$'\U1F3CE\UFE0F'
emoji[racing_car_unqualified]=$'\U1F3CE'
emoji[motorcycle]=$'\U1F3CD\UFE0F'
emoji[motorcycle_unqualified]=$'\U1F3CD'
emoji[motor_scooter]=$'\U1F6F5'
emoji[manual_wheelchair]=$'\U1F9BD'
emoji[motorized_wheelchair]=$'\U1F9BC'
emoji[auto_rickshaw]=$'\U1F6FA'
emoji[bicycle]=$'\U1F6B2'
emoji[bike]=$'\U1F6B2'
emoji[kick_scooter]=$'\U1F6F4'
emoji[skateboard]=$'\U1F6F9'
emoji[bus_stop]=$'\U1F68F'
emoji[busstop]=$'\U1F68F'
emoji[motorway]=$'\U1F6E3\UFE0F'
emoji[motorway_unqualified]=$'\U1F6E3'
emoji[railway_track]=$'\U1F6E4\UFE0F'
emoji[railway_track_unqualified]=$'\U1F6E4'
emoji[oil_drum]=$'\U1F6E2\UFE0F'
emoji[oil_drum_unqualified]=$'\U1F6E2'
emoji[fuel_pump]=$'\U26FD'
emoji[fuelpump]=$'\U26FD'
emoji[police_car_light]=$'\U1F6A8'
emoji[rotating_light]=$'\U1F6A8'
emoji[horizontal_traffic_light]=$'\U1F6A5'
emoji[traffic_light]=$'\U1F6A5'
emoji[vertical_traffic_light]=$'\U1F6A6'
emoji[stop_sign]=$'\U1F6D1'
emoji[construction]=$'\U1F6A7'
emoji[anchor]=$'\U2693'
emoji[sailboat]=$'\U26F5'
emoji[boat]=$'\U26F5'
emoji[canoe]=$'\U1F6F6'
emoji[speedboat]=$'\U1F6A4'
emoji[passenger_ship]=$'\U1F6F3\UFE0F'
emoji[passenger_ship_unqualified]=$'\U1F6F3'
emoji[ferry]=$'\U26F4\UFE0F'
emoji[ferry_unqualified]=$'\U26F4'
emoji[motor_boat]=$'\U1F6E5\UFE0F'
emoji[motor_boat_unqualified]=$'\U1F6E5'
emoji[ship]=$'\U1F6A2'
emoji[airplane]=$'\U2708\UFE0F'
emoji[airplane_unqualified]=$'\U2708'
emoji[small_airplane]=$'\U1F6E9\UFE0F'
emoji[small_airplane_unqualified]=$'\U1F6E9'
emoji[airplane_departure]=$'\U1F6EB'
emoji[flight_departure]=$'\U1F6EB'
emoji[airplane_arrival]=$'\U1F6EC'
emoji[flight_arrival]=$'\U1F6EC'
emoji[parachute]=$'\U1FA82'
emoji[seat]=$'\U1F4BA'
emoji[helicopter]=$'\U1F681'
emoji[suspension_railway]=$'\U1F69F'
emoji[mountain_cableway]=$'\U1F6A0'
emoji[aerial_tramway]=$'\U1F6A1'
emoji[satellite]=$'\U1F6F0\UFE0F'
emoji[satellite_unqualified]=$'\U1F6F0'
emoji[artificial_satellite]=$'\U1F6F0'
emoji[rocket]=$'\U1F680'
emoji[flying_saucer]=$'\U1F6F8'
emoji[bellhop_bell]=$'\U1F6CE\UFE0F'
emoji[bellhop_bell_unqualified]=$'\U1F6CE'
emoji[luggage]=$'\U1F9F3'
emoji[hourglass_done]=$'\U231B'
emoji[hourglass]=$'\U231B'
emoji[hourglass_not_done]=$'\U23F3'
emoji[hourglass_flowing_sand]=$'\U23F3'
emoji[watch]=$'\U231A'
emoji[alarm_clock]=$'\U23F0'
emoji[stopwatch]=$'\U23F1\UFE0F'
emoji[stopwatch_unqualified]=$'\U23F1'
emoji[timer_clock]=$'\U23F2\UFE0F'
emoji[timer_clock_unqualified]=$'\U23F2'
emoji[mantelpiece_clock]=$'\U1F570\UFE0F'
emoji[mantelpiece_clock_unqualified]=$'\U1F570'
emoji[twelve_o_clock]=$'\U1F55B'
emoji[clock12]=$'\U1F55B'
emoji[twelve_thirty]=$'\U1F567'
emoji[clock1230]=$'\U1F567'
emoji[one_o_clock]=$'\U1F550'
emoji[clock1]=$'\U1F550'
emoji[one_thirty]=$'\U1F55C'
emoji[clock130]=$'\U1F55C'
emoji[two_o_clock]=$'\U1F551'
emoji[clock2]=$'\U1F551'
emoji[two_thirty]=$'\U1F55D'
emoji[clock230]=$'\U1F55D'
emoji[three_o_clock]=$'\U1F552'
emoji[clock3]=$'\U1F552'
emoji[three_thirty]=$'\U1F55E'
emoji[clock330]=$'\U1F55E'
emoji[four_o_clock]=$'\U1F553'
emoji[clock4]=$'\U1F553'
emoji[four_thirty]=$'\U1F55F'
emoji[clock430]=$'\U1F55F'
emoji[five_o_clock]=$'\U1F554'
emoji[clock5]=$'\U1F554'
emoji[five_thirty]=$'\U1F560'
emoji[clock530]=$'\U1F560'
emoji[six_o_clock]=$'\U1F555'
emoji[clock6]=$'\U1F555'
emoji[six_thirty]=$'\U1F561'
emoji[clock630]=$'\U1F561'
emoji[seven_o_clock]=$'\U1F556'
emoji[clock7]=$'\U1F556'
emoji[seven_thirty]=$'\U1F562'
emoji[clock730]=$'\U1F562'
emoji[eight_o_clock]=$'\U1F557'
emoji[clock8]=$'\U1F557'
emoji[eight_thirty]=$'\U1F563'
emoji[clock830]=$'\U1F563'
emoji[nine_o_clock]=$'\U1F558'
emoji[clock9]=$'\U1F558'
emoji[nine_thirty]=$'\U1F564'
emoji[clock930]=$'\U1F564'
emoji[ten_o_clock]=$'\U1F559'
emoji[clock10]=$'\U1F559'
emoji[ten_thirty]=$'\U1F565'
emoji[clock1030]=$'\U1F565'
emoji[eleven_o_clock]=$'\U1F55A'
emoji[clock11]=$'\U1F55A'
emoji[eleven_thirty]=$'\U1F566'
emoji[clock1130]=$'\U1F566'
emoji[new_moon]=$'\U1F311'
emoji[waxing_crescent_moon]=$'\U1F312'
emoji[first_quarter_moon]=$'\U1F313'
emoji[waxing_gibbous_moon]=$'\U1F314'
emoji[moon]=$'\U1F314'
emoji[full_moon]=$'\U1F315'
emoji[waning_gibbous_moon]=$'\U1F316'
emoji[last_quarter_moon]=$'\U1F317'
emoji[waning_crescent_moon]=$'\U1F318'
emoji[waning_crescent_moon_1]=$'\U1F319'
emoji[crescent_moon]=$'\U1F319'
emoji[new_moon_face]=$'\U1F31A'
emoji[new_moon_with_face]=$'\U1F31A'
emoji[first_quarter_moon_face]=$'\U1F31B'
emoji[first_quarter_moon_with_face]=$'\U1F31B'
emoji[last_quarter_moon_face]=$'\U1F31C'
emoji[last_quarter_moon_with_face]=$'\U1F31C'
emoji[thermometer]=$'\U1F321\UFE0F'
emoji[thermometer_unqualified]=$'\U1F321'
emoji[sun]=$'\U2600\UFE0F'
emoji[sunny]=$'\U2600\UFE0F'
emoji[sun_unqualified]=$'\U2600'
emoji[full_moon_face]=$'\U1F31D'
emoji[full_moon_with_face]=$'\U1F31D'
emoji[sun_with_face]=$'\U1F31E'
emoji[ringed_planet]=$'\U1FA90'
emoji[star]=$'\U2B50'
emoji[glowing_star]=$'\U1F31F'
emoji[star2]=$'\U1F31F'
emoji[shooting_star]=$'\U1F320'
emoji[stars]=$'\U1F320'
emoji[milky_way]=$'\U1F30C'
emoji[cloud]=$'\U2601\UFE0F'
emoji[cloud_unqualified]=$'\U2601'
emoji[sun_behind_cloud]=$'\U26C5'
emoji[partly_sunny]=$'\U26C5'
emoji[cloud_with_lightning_and_rain]=$'\U26C8\UFE0F'
emoji[cloud_with_lightning_and_rain_unqualified]=$'\U26C8'
emoji[sun_behind_small_cloud]=$'\U1F324\UFE0F'
emoji[sun_behind_small_cloud_unqualified]=$'\U1F324'
emoji[sun_behind_large_cloud]=$'\U1F325\UFE0F'
emoji[sun_behind_large_cloud_unqualified]=$'\U1F325'
emoji[sun_behind_rain_cloud]=$'\U1F326\UFE0F'
emoji[sun_behind_rain_cloud_unqualified]=$'\U1F326'
emoji[cloud_with_rain]=$'\U1F327\UFE0F'
emoji[cloud_with_rain_unqualified]=$'\U1F327'
emoji[cloud_with_snow]=$'\U1F328\UFE0F'
emoji[cloud_with_snow_unqualified]=$'\U1F328'
emoji[cloud_with_lightning]=$'\U1F329\UFE0F'
emoji[cloud_with_lightning_unqualified]=$'\U1F329'
emoji[tornado]=$'\U1F32A\UFE0F'
emoji[tornado_unqualified]=$'\U1F32A'
emoji[fog]=$'\U1F32B\UFE0F'
emoji[fog_unqualified]=$'\U1F32B'
emoji[wind_face]=$'\U1F32C\UFE0F'
emoji[wind_face_unqualified]=$'\U1F32C'
emoji[cyclone]=$'\U1F300'
emoji[rainbow]=$'\U1F308'
emoji[closed_umbrella]=$'\U1F302'
emoji[closed_umbrella_1]=$'\U2602\UFE0F'
emoji[open_umbrella]=$'\U2602\UFE0F'
emoji[umbrella_unqualified]=$'\U2602'
emoji[umbrella_with_rain_drops]=$'\U2614'
emoji[umbrella]=$'\U2614'
emoji[umbrella_on_ground]=$'\U26F1\UFE0F'
emoji[umbrella_on_ground_unqualified]=$'\U26F1'
emoji[parasol_on_ground]=$'\U26F1'
emoji[high_voltage]=$'\U26A1'
emoji[zap]=$'\U26A1'
emoji[snowflake]=$'\U2744\UFE0F'
emoji[snowflake_unqualified]=$'\U2744'
emoji[snowman]=$'\U2603\UFE0F'
emoji[snowman_with_snow]=$'\U2603\UFE0F'
emoji[snowman_unqualified]=$'\U2603'
emoji[snowman_without_snow]=$'\U26C4'
emoji[comet]=$'\U2604\UFE0F'
emoji[comet_unqualified]=$'\U2604'
emoji[fire]=$'\U1F525'
emoji[droplet]=$'\U1F4A7'
emoji[water_wave]=$'\U1F30A'
emoji[ocean]=$'\U1F30A'
emoji[jack_o_lantern]=$'\U1F383'
emoji[Christmas_tree]=$'\U1F384'
emoji[christmas_tree]=$'\U1F384'
emoji[fireworks]=$'\U1F386'
emoji[sparkler]=$'\U1F387'
emoji[firecracker]=$'\U1F9E8'
emoji[sparkles]=$'\U2728'
emoji[balloon]=$'\U1F388'
emoji[party_popper]=$'\U1F389'
emoji[tada]=$'\U1F389'
emoji[confetti_ball]=$'\U1F38A'
emoji[tanabata_tree]=$'\U1F38B'
emoji[pine_decoration]=$'\U1F38D'
emoji[bamboo]=$'\U1F38D'
emoji[Japanese_dolls]=$'\U1F38E'
emoji[dolls]=$'\U1F38E'
emoji[carp_streamer]=$'\U1F38F'
emoji[flags]=$'\U1F38F'
emoji[wind_chime]=$'\U1F390'
emoji[moon_viewing_ceremony]=$'\U1F391'
emoji[rice_scene]=$'\U1F391'
emoji[red_envelope]=$'\U1F9E7'
emoji[ribbon]=$'\U1F380'
emoji[wrapped_gift]=$'\U1F381'
emoji[gift]=$'\U1F381'
emoji[reminder_ribbon]=$'\U1F397\UFE0F'
emoji[reminder_ribbon_unqualified]=$'\U1F397'
emoji[admission_tickets]=$'\U1F39F\UFE0F'
emoji[admission_tickets_unqualified]=$'\U1F39F'
emoji[tickets]=$'\U1F39F'
emoji[admission_tickets_unqualified_1]=$'\U1F3AB'
emoji[ticket]=$'\U1F3AB'
emoji[military_medal]=$'\U1F396\UFE0F'
emoji[military_medal_unqualified]=$'\U1F396'
emoji[medal_military]=$'\U1F396'
emoji[trophy]=$'\U1F3C6'
emoji[sports_medal]=$'\U1F3C5'
emoji[medal_sports]=$'\U1F3C5'
emoji[1st_place_medal]=$'\U1F947'
emoji[2nd_place_medal]=$'\U1F948'
emoji[3rd_place_medal]=$'\U1F949'
emoji[soccer_ball]=$'\U26BD'
emoji[soccer]=$'\U26BD'
emoji[baseball]=$'\U26BE'
emoji[softball]=$'\U1F94E'
emoji[basketball]=$'\U1F3C0'
emoji[volleyball]=$'\U1F3D0'
emoji[american_football]=$'\U1F3C8'
emoji[football]=$'\U1F3C8'
emoji[rugby_football]=$'\U1F3C9'
emoji[tennis]=$'\U1F3BE'
emoji[flying_disc]=$'\U1F94F'
emoji[bowling]=$'\U1F3B3'
emoji[cricket_game]=$'\U1F3CF'
emoji[field_hockey]=$'\U1F3D1'
emoji[ice_hockey]=$'\U1F3D2'
emoji[lacrosse]=$'\U1F94D'
emoji[ping_pong]=$'\U1F3D3'
emoji[badminton]=$'\U1F3F8'
emoji[boxing_glove]=$'\U1F94A'
emoji[martial_arts_uniform]=$'\U1F94B'
emoji[goal_net]=$'\U1F945'
emoji[flag_in_hole]=$'\U26F3'
emoji[golf]=$'\U26F3'
emoji[ice_skate]=$'\U26F8\UFE0F'
emoji[ice_skate_unqualified]=$'\U26F8'
emoji[fishing_pole]=$'\U1F3A3'
emoji[fishing_pole_and_fish]=$'\U1F3A3'
emoji[diving_mask]=$'\U1F93F'
emoji[running_shirt]=$'\U1F3BD'
emoji[running_shirt_with_sash]=$'\U1F3BD'
emoji[skis]=$'\U1F3BF'
emoji[ski]=$'\U1F3BF'
emoji[sled]=$'\U1F6F7'
emoji[curling_stone]=$'\U1F94C'
emoji[direct_hit]=$'\U1F3AF'
emoji[dart]=$'\U1F3AF'
emoji[yo_yo]=$'\U1FA80'
emoji[kite]=$'\U1FA81'
emoji[pool_8_ball]=$'\U1F3B1'
emoji[8ball]=$'\U1F3B1'
emoji[crystal_ball]=$'\U1F52E'
emoji[nazar_amulet]=$'\U1F9FF'
emoji[video_game]=$'\U1F3AE'
emoji[joystick]=$'\U1F579\UFE0F'
emoji[joystick_unqualified]=$'\U1F579'
emoji[slot_machine]=$'\U1F3B0'
emoji[game_die]=$'\U1F3B2'
emoji[puzzle_piece]=$'\U1F9E9'
emoji[jigsaw]=$'\U1F9E9'
emoji[teddy_bear]=$'\U1F9F8'
emoji[spade_suit]=$'\U2660\UFE0F'
emoji[spades]=$'\U2660\UFE0F'
emoji[spade_suit_unqualified]=$'\U2660'
emoji[heart_suit]=$'\U2665\UFE0F'
emoji[hearts]=$'\U2665\UFE0F'
emoji[heart_suit_unqualified]=$'\U2665'
emoji[diamond_suit]=$'\U2666\UFE0F'
emoji[diamonds]=$'\U2666\UFE0F'
emoji[diamond_suit_unqualified]=$'\U2666'
emoji[club_suit]=$'\U2663\UFE0F'
emoji[clubs]=$'\U2663\UFE0F'
emoji[club_suit_unqualified]=$'\U2663'
emoji[chess_pawn]=$'\U265F\UFE0F'
emoji[chess_pawn_unqualified]=$'\U265F'
emoji[joker]=$'\U1F0CF'
emoji[black_joker]=$'\U1F0CF'
emoji[mahjong_red_dragon]=$'\U1F004'
emoji[mahjong]=$'\U1F004'
emoji[flower_playing_cards]=$'\U1F3B4'
emoji[performing_arts]=$'\U1F3AD'
emoji[framed_picture]=$'\U1F5BC\UFE0F'
emoji[framed_picture_unqualified]=$'\U1F5BC'
emoji[artist_palette]=$'\U1F3A8'
emoji[art]=$'\U1F3A8'
emoji[thread]=$'\U1F9F5'
emoji[yarn]=$'\U1F9F6'
emoji[glasses]=$'\U1F453'
emoji[eyeglasses]=$'\U1F453'
emoji[sunglasses]=$'\U1F576\UFE0F'
emoji[sunglasses_unqualified]=$'\U1F576'
emoji[dark_sunglasses]=$'\U1F576'
emoji[goggles]=$'\U1F97D'
emoji[lab_coat]=$'\U1F97C'
emoji[safety_vest]=$'\U1F9BA'
emoji[necktie]=$'\U1F454'
emoji[t_shirt]=$'\U1F455'
emoji[shirt]=$'\U1F455'
emoji[tshirt]=$'\U1F455'
emoji[jeans]=$'\U1F456'
emoji[scarf]=$'\U1F9E3'
emoji[gloves]=$'\U1F9E4'
emoji[coat]=$'\U1F9E5'
emoji[socks]=$'\U1F9E6'
emoji[dress]=$'\U1F457'
emoji[kimono]=$'\U1F458'
emoji[sari]=$'\U1F97B'
emoji[one_piece_swimsuit]=$'\U1FA71'
emoji[swim_brief]=$'\U1FA72'
emoji[shorts]=$'\U1FA73'
emoji[bikini]=$'\U1F459'
emoji[woman_s_clothes]=$'\U1F45A'
emoji[womans_clothes]=$'\U1F45A'
emoji[purse]=$'\U1F45B'
emoji[handbag]=$'\U1F45C'
emoji[clutch_bag]=$'\U1F45D'
emoji[pouch]=$'\U1F45D'
emoji[shopping_bags]=$'\U1F6CD\UFE0F'
emoji[shopping_bags_unqualified]=$'\U1F6CD'
emoji[shopping]=$'\U1F6CD'
emoji[backpack]=$'\U1F392'
emoji[school_satchel]=$'\U1F392'
emoji[man_s_shoe]=$'\U1F45E'
emoji[mans_shoe]=$'\U1F45E'
emoji[shoe]=$'\U1F45E'
emoji[running_shoe]=$'\U1F45F'
emoji[athletic_shoe]=$'\U1F45F'
emoji[hiking_boot]=$'\U1F97E'
emoji[flat_shoe]=$'\U1F97F'
emoji[high_heeled_shoe]=$'\U1F460'
emoji[high_heel]=$'\U1F460'
emoji[woman_s_sandal]=$'\U1F461'
emoji[sandal]=$'\U1F461'
emoji[ballet_shoes]=$'\U1FA70'
emoji[woman_s_boot]=$'\U1F462'
emoji[boot]=$'\U1F462'
emoji[crown]=$'\U1F451'
emoji[woman_s_hat]=$'\U1F452'
emoji[womans_hat]=$'\U1F452'
emoji[top_hat]=$'\U1F3A9'
emoji[tophat]=$'\U1F3A9'
emoji[graduation_cap]=$'\U1F393'
emoji[mortar_board]=$'\U1F393'
emoji[billed_cap]=$'\U1F9E2'
emoji[rescue_worker_s_helmet]=$'\U26D1\UFE0F'
emoji[rescue_worker_s_helmet_unqualified]=$'\U26D1'
emoji[rescue_worker_helmet]=$'\U26D1'
emoji[prayer_beads]=$'\U1F4FF'
emoji[lipstick]=$'\U1F484'
emoji[ring]=$'\U1F48D'
emoji[gem_stone]=$'\U1F48E'
emoji[gem]=$'\U1F48E'
emoji[muted_speaker]=$'\U1F507'
emoji[mute]=$'\U1F507'
emoji[speaker_low_volume]=$'\U1F508'
emoji[speaker]=$'\U1F508'
emoji[speaker_medium_volume]=$'\U1F509'
emoji[sound]=$'\U1F509'
emoji[speaker_high_volume]=$'\U1F50A'
emoji[loud_sound]=$'\U1F50A'
emoji[loudspeaker]=$'\U1F4E2'
emoji[megaphone]=$'\U1F4E3'
emoji[mega]=$'\U1F4E3'
emoji[postal_horn]=$'\U1F4EF'
emoji[bell]=$'\U1F514'
emoji[bell_with_slash]=$'\U1F515'
emoji[no_bell]=$'\U1F515'
emoji[musical_score]=$'\U1F3BC'
emoji[musical_note]=$'\U1F3B5'
emoji[musical_notes]=$'\U1F3B6'
emoji[notes]=$'\U1F3B6'
emoji[studio_microphone]=$'\U1F399\UFE0F'
emoji[studio_microphone_unqualified]=$'\U1F399'
emoji[level_slider]=$'\U1F39A\UFE0F'
emoji[level_slider_unqualified]=$'\U1F39A'
emoji[control_knobs]=$'\U1F39B\UFE0F'
emoji[control_knobs_unqualified]=$'\U1F39B'
emoji[microphone]=$'\U1F3A4'
emoji[headphone]=$'\U1F3A7'
emoji[headphones]=$'\U1F3A7'
emoji[radio]=$'\U1F4FB'
emoji[saxophone]=$'\U1F3B7'
emoji[guitar]=$'\U1F3B8'
emoji[musical_keyboard]=$'\U1F3B9'
emoji[trumpet]=$'\U1F3BA'
emoji[violin]=$'\U1F3BB'
emoji[banjo]=$'\U1FA95'
emoji[drum]=$'\U1F941'
emoji[mobile_phone]=$'\U1F4F1'
emoji[iphone]=$'\U1F4F1'
emoji[mobile_phone_with_arrow]=$'\U1F4F2'
emoji[calling]=$'\U1F4F2'
emoji[telephone]=$'\U260E\UFE0F'
emoji[phone]=$'\U260E\UFE0F'
emoji[telephone_unqualified]=$'\U260E'
emoji[telephone_receiver]=$'\U1F4DE'
emoji[pager]=$'\U1F4DF'
emoji[fax_machine]=$'\U1F4E0'
emoji[fax]=$'\U1F4E0'
emoji[battery]=$'\U1F50B'
emoji[electric_plug]=$'\U1F50C'
emoji[laptop_computer]=$'\U1F4BB'
emoji[computer]=$'\U1F4BB'
emoji[desktop_computer]=$'\U1F5A5\UFE0F'
emoji[desktop_computer_unqualified]=$'\U1F5A5'
emoji[printer]=$'\U1F5A8\UFE0F'
emoji[printer_unqualified]=$'\U1F5A8'
emoji[keyboard]=$'\U2328\UFE0F'
emoji[keyboard_unqualified]=$'\U2328'
emoji[computer_mouse]=$'\U1F5B1\UFE0F'
emoji[computer_mouse_unqualified]=$'\U1F5B1'
emoji[trackball]=$'\U1F5B2\UFE0F'
emoji[trackball_unqualified]=$'\U1F5B2'
emoji[computer_disk]=$'\U1F4BD'
emoji[minidisc]=$'\U1F4BD'
emoji[floppy_disk]=$'\U1F4BE'
emoji[optical_disk]=$'\U1F4BF'
emoji[cd]=$'\U1F4BF'
emoji[dvd]=$'\U1F4C0'
emoji[abacus]=$'\U1F9EE'
emoji[movie_camera]=$'\U1F3A5'
emoji[film_frames]=$'\U1F39E\UFE0F'
emoji[film_frames_unqualified]=$'\U1F39E'
emoji[film_strip]=$'\U1F39E'
emoji[film_projector]=$'\U1F4FD\UFE0F'
emoji[film_projector_unqualified]=$'\U1F4FD'
emoji[clapper_board]=$'\U1F3AC'
emoji[clapper]=$'\U1F3AC'
emoji[television]=$'\U1F4FA'
emoji[tv]=$'\U1F4FA'
emoji[camera]=$'\U1F4F7'
emoji[camera_with_flash]=$'\U1F4F8'
emoji[camera_flash]=$'\U1F4F8'
emoji[video_camera]=$'\U1F4F9'
emoji[videocassette]=$'\U1F4FC'
emoji[vhs]=$'\U1F4FC'
emoji[magnifying_glass_tilted_left]=$'\U1F50D'
emoji[mag]=$'\U1F50D'
emoji[magnifying_glass_tilted_right]=$'\U1F50E'
emoji[mag_right]=$'\U1F50E'
emoji[candle]=$'\U1F56F\UFE0F'
emoji[candle_unqualified]=$'\U1F56F'
emoji[light_bulb]=$'\U1F4A1'
emoji[bulb]=$'\U1F4A1'
emoji[flashlight]=$'\U1F526'
emoji[red_paper_lantern]=$'\U1F3EE'
emoji[izakaya_lantern]=$'\U1F3EE'
emoji[lantern]=$'\U1F3EE'
emoji[diya_lamp]=$'\U1FA94'
emoji[notebook_with_decorative_cover]=$'\U1F4D4'
emoji[closed_book]=$'\U1F4D5'
emoji[open_book]=$'\U1F4D6'
emoji[book]=$'\U1F4D6'
emoji[green_book]=$'\U1F4D7'
emoji[blue_book]=$'\U1F4D8'
emoji[orange_book]=$'\U1F4D9'
emoji[books]=$'\U1F4DA'
emoji[notebook]=$'\U1F4D3'
emoji[ledger]=$'\U1F4D2'
emoji[page_with_curl]=$'\U1F4C3'
emoji[scroll]=$'\U1F4DC'
emoji[page_facing_up]=$'\U1F4C4'
emoji[newspaper]=$'\U1F4F0'
emoji[rolled_up_newspaper]=$'\U1F5DE\UFE0F'
emoji[rolled_up_newspaper_unqualified]=$'\U1F5DE'
emoji[newspaper_roll]=$'\U1F5DE'
emoji[bookmark_tabs]=$'\U1F4D1'
emoji[bookmark_tabs_1]=$'\U1F516'
emoji[bookmark]=$'\U1F516'
emoji[label]=$'\U1F3F7\UFE0F'
emoji[label_unqualified]=$'\U1F3F7'
emoji[money_bag]=$'\U1F4B0'
emoji[moneybag]=$'\U1F4B0'
emoji[yen_banknote]=$'\U1F4B4'
emoji[yen]=$'\U1F4B4'
emoji[dollar_banknote]=$'\U1F4B5'
emoji[dollar]=$'\U1F4B5'
emoji[euro_banknote]=$'\U1F4B6'
emoji[euro]=$'\U1F4B6'
emoji[pound_banknote]=$'\U1F4B7'
emoji[pound]=$'\U1F4B7'
emoji[money_with_wings]=$'\U1F4B8'
emoji[credit_card]=$'\U1F4B3'
emoji[receipt]=$'\U1F9FE'
emoji[chart_increasing_with_yen]=$'\U1F4B9'
emoji[chart]=$'\U1F4B9'
emoji[currency_exchange]=$'\U1F4B1'
emoji[heavy_dollar_sign]=$'\U1F4B2'
emoji[envelope]=$'\U2709\UFE0F'
emoji[email]=$'\U2709\UFE0F'
emoji[envelope_unqualified]=$'\U2709'
emoji[e_mail]=$'\U1F4E7'
emoji[e-mail]=$'\U1F4E7'
emoji[incoming_envelope]=$'\U1F4E8'
emoji[envelope_with_arrow]=$'\U1F4E9'
emoji[outbox_tray]=$'\U1F4E4'
emoji[inbox_tray]=$'\U1F4E5'
emoji[package]=$'\U1F4E6'
emoji[closed_mailbox_with_raised_flag]=$'\U1F4EB'
emoji[mailbox]=$'\U1F4EB'
emoji[closed_mailbox_with_lowered_flag]=$'\U1F4EA'
emoji[mailbox_closed]=$'\U1F4EA'
emoji[open_mailbox_with_raised_flag]=$'\U1F4EC'
emoji[mailbox_with_mail]=$'\U1F4EC'
emoji[open_mailbox_with_lowered_flag]=$'\U1F4ED'
emoji[mailbox_with_no_mail]=$'\U1F4ED'
emoji[postbox]=$'\U1F4EE'
emoji[ballot_box_with_ballot]=$'\U1F5F3\UFE0F'
emoji[ballot_box_with_ballot_unqualified]=$'\U1F5F3'
emoji[ballot_box]=$'\U1F5F3'
emoji[pencil]=$'\U270F\UFE0F'
emoji[pencil2]=$'\U270F\UFE0F'
emoji[pencil_unqualified]=$'\U270F'
emoji[black_nib]=$'\U2712\UFE0F'
emoji[black_nib_unqualified]=$'\U2712'
emoji[fountain_pen]=$'\U1F58B\UFE0F'
emoji[fountain_pen_unqualified]=$'\U1F58B'
emoji[fountain_pen_unqualified_1]=$'\U1F58A\UFE0F'
emoji[fountain_pen_unqualified_2]=$'\U1F58A'
emoji[pen]=$'\U1F58A'
emoji[paintbrush]=$'\U1F58C\UFE0F'
emoji[paintbrush_unqualified]=$'\U1F58C'
emoji[crayon]=$'\U1F58D\UFE0F'
emoji[crayon_unqualified]=$'\U1F58D'
emoji[memo]=$'\U1F4DD'
emoji[briefcase]=$'\U1F4BC'
emoji[file_folder]=$'\U1F4C1'
emoji[open_file_folder]=$'\U1F4C2'
emoji[card_index_dividers]=$'\U1F5C2\UFE0F'
emoji[card_index_dividers_unqualified]=$'\U1F5C2'
emoji[calendar]=$'\U1F4C5'
emoji[date]=$'\U1F4C5'
emoji[tear_off_calendar]=$'\U1F4C6'
emoji[spiral_notepad]=$'\U1F5D2\UFE0F'
emoji[spiral_notepad_unqualified]=$'\U1F5D2'
emoji[spiral_calendar]=$'\U1F5D3\UFE0F'
emoji[spiral_calendar_unqualified]=$'\U1F5D3'
emoji[card_index]=$'\U1F4C7'
emoji[chart_increasing]=$'\U1F4C8'
emoji[chart_with_upwards_trend]=$'\U1F4C8'
emoji[chart_decreasing]=$'\U1F4C9'
emoji[chart_with_downwards_trend]=$'\U1F4C9'
emoji[bar_chart]=$'\U1F4CA'
emoji[clipboard]=$'\U1F4CB'
emoji[pushpin]=$'\U1F4CC'
emoji[round_pushpin]=$'\U1F4CD'
emoji[paperclip]=$'\U1F4CE'
emoji[linked_paperclips]=$'\U1F587\UFE0F'
emoji[linked_paperclips_unqualified]=$'\U1F587'
emoji[paperclips]=$'\U1F587'
emoji[straight_ruler]=$'\U1F4CF'
emoji[triangular_ruler]=$'\U1F4D0'
emoji[scissors]=$'\U2702\UFE0F'
emoji[scissors_unqualified]=$'\U2702'
emoji[card_file_box]=$'\U1F5C3\UFE0F'
emoji[card_file_box_unqualified]=$'\U1F5C3'
emoji[file_cabinet]=$'\U1F5C4\UFE0F'
emoji[file_cabinet_unqualified]=$'\U1F5C4'
emoji[wastebasket]=$'\U1F5D1\UFE0F'
emoji[wastebasket_unqualified]=$'\U1F5D1'
emoji[locked]=$'\U1F512'
emoji[lock]=$'\U1F512'
emoji[unlocked]=$'\U1F513'
emoji[unlock]=$'\U1F513'
emoji[locked_with_pen]=$'\U1F50F'
emoji[lock_with_ink_pen]=$'\U1F50F'
emoji[locked_with_key]=$'\U1F510'
emoji[closed_lock_with_key]=$'\U1F510'
emoji[locked_with_key_1]=$'\U1F511'
emoji[key]=$'\U1F511'
emoji[old_key]=$'\U1F5DD\UFE0F'
emoji[old_key_unqualified]=$'\U1F5DD'
emoji[hammer]=$'\U1F528'
emoji[axe]=$'\U1FA93'
emoji[pick]=$'\U26CF\UFE0F'
emoji[pick_unqualified]=$'\U26CF'
emoji[hammer_and_pick]=$'\U2692\UFE0F'
emoji[hammer_and_pick_unqualified]=$'\U2692'
emoji[hammer_and_wrench]=$'\U1F6E0\UFE0F'
emoji[hammer_and_wrench_unqualified]=$'\U1F6E0'
emoji[dagger]=$'\U1F5E1\UFE0F'
emoji[dagger_unqualified]=$'\U1F5E1'
emoji[crossed_swords]=$'\U2694\UFE0F'
emoji[crossed_swords_unqualified]=$'\U2694'
emoji[pistol]=$'\U1F52B'
emoji[gun]=$'\U1F52B'
emoji[bow_and_arrow]=$'\U1F3F9'
emoji[shield]=$'\U1F6E1\UFE0F'
emoji[shield_unqualified]=$'\U1F6E1'
emoji[wrench]=$'\U1F527'
emoji[nut_and_bolt]=$'\U1F529'
emoji[gear]=$'\U2699\UFE0F'
emoji[gear_unqualified]=$'\U2699'
emoji[clamp]=$'\U1F5DC\UFE0F'
emoji[clamp_unqualified]=$'\U1F5DC'
emoji[balance_scale]=$'\U2696\UFE0F'
emoji[balance_scale_unqualified]=$'\U2696'
emoji[probing_cane]=$'\U1F9AF'
emoji[link]=$'\U1F517'
emoji[chains]=$'\U26D3\UFE0F'
emoji[chains_unqualified]=$'\U26D3'
emoji[toolbox]=$'\U1F9F0'
emoji[magnet]=$'\U1F9F2'
emoji[alembic]=$'\U2697\UFE0F'
emoji[alembic_unqualified]=$'\U2697'
emoji[test_tube]=$'\U1F9EA'
emoji[petri_dish]=$'\U1F9EB'
emoji[dna]=$'\U1F9EC'
emoji[microscope]=$'\U1F52C'
emoji[telescope]=$'\U1F52D'
emoji[satellite_antenna]=$'\U1F4E1'
emoji[syringe]=$'\U1F489'
emoji[drop_of_blood]=$'\U1FA78'
emoji[pill]=$'\U1F48A'
emoji[adhesive_bandage]=$'\U1FA79'
emoji[stethoscope]=$'\U1FA7A'
emoji[door]=$'\U1F6AA'
emoji[bed]=$'\U1F6CF\UFE0F'
emoji[bed_unqualified]=$'\U1F6CF'
emoji[couch_and_lamp]=$'\U1F6CB\UFE0F'
emoji[couch_and_lamp_unqualified]=$'\U1F6CB'
emoji[chair]=$'\U1FA91'
emoji[toilet]=$'\U1F6BD'
emoji[shower]=$'\U1F6BF'
emoji[bathtub]=$'\U1F6C1'
emoji[razor]=$'\U1FA92'
emoji[lotion_bottle]=$'\U1F9F4'
emoji[safety_pin]=$'\U1F9F7'
emoji[broom]=$'\U1F9F9'
emoji[basket]=$'\U1F9FA'
emoji[roll_of_paper]=$'\U1F9FB'
emoji[soap]=$'\U1F9FC'
emoji[sponge]=$'\U1F9FD'
emoji[fire_extinguisher]=$'\U1F9EF'
emoji[shopping_cart]=$'\U1F6D2'
emoji[cigarette]=$'\U1F6AC'
emoji[smoking]=$'\U1F6AC'
emoji[coffin]=$'\U26B0\UFE0F'
emoji[coffin_unqualified]=$'\U26B0'
emoji[funeral_urn]=$'\U26B1\UFE0F'
emoji[funeral_urn_unqualified]=$'\U26B1'
emoji[moai]=$'\U1F5FF'
emoji[moyai]=$'\U1F5FF'
emoji[ATM_sign]=$'\U1F3E7'
emoji[atm]=$'\U1F3E7'
emoji[litter_in_bin_sign]=$'\U1F6AE'
emoji[put_litter_in_its_place]=$'\U1F6AE'
emoji[potable_water]=$'\U1F6B0'
emoji[wheelchair_symbol]=$'\U267F'
emoji[wheelchair]=$'\U267F'
emoji[men_s_room]=$'\U1F6B9'
emoji[mens]=$'\U1F6B9'
emoji[women_s_room]=$'\U1F6BA'
emoji[womens]=$'\U1F6BA'
emoji[restroom]=$'\U1F6BB'
emoji[baby_symbol]=$'\U1F6BC'
emoji[water_closet]=$'\U1F6BE'
emoji[wc]=$'\U1F6BE'
emoji[passport_control]=$'\U1F6C2'
emoji[customs]=$'\U1F6C3'
emoji[baggage_claim]=$'\U1F6C4'
emoji[left_luggage]=$'\U1F6C5'
emoji[warning]=$'\U26A0\UFE0F'
emoji[warning_unqualified]=$'\U26A0'
emoji[children_crossing]=$'\U1F6B8'
emoji[no_entry]=$'\U26D4'
emoji[prohibited]=$'\U1F6AB'
emoji[no_entry_sign]=$'\U1F6AB'
emoji[no_bicycles]=$'\U1F6B3'
emoji[no_smoking]=$'\U1F6AD'
emoji[no_littering]=$'\U1F6AF'
emoji[do_not_litter]=$'\U1F6AF'
emoji[non_potable_water]=$'\U1F6B1'
emoji[non-potable_water]=$'\U1F6B1'
emoji[no_pedestrians]=$'\U1F6B7'
emoji[no_mobile_phones]=$'\U1F4F5'
emoji[no_one_under_eighteen]=$'\U1F51E'
emoji[underage]=$'\U1F51E'
emoji[radioactive]=$'\U2622\UFE0F'
emoji[radioactive_unqualified]=$'\U2622'
emoji[biohazard]=$'\U2623\UFE0F'
emoji[biohazard_unqualified]=$'\U2623'
emoji[up_arrow]=$'\U2B06\UFE0F'
emoji[arrow_up]=$'\U2B06\UFE0F'
emoji[up_arrow_unqualified]=$'\U2B06'
emoji[up_right_arrow]=$'\U2197\UFE0F'
emoji[arrow_upper_right]=$'\U2197\UFE0F'
emoji[up_right_arrow_unqualified]=$'\U2197'
emoji[up_right_arrow_unqualified_1]=$'\U27A1\UFE0F'
emoji[arrow_right]=$'\U27A1\UFE0F'
emoji[up_right_arrow_unqualified_2]=$'\U27A1'
emoji[down_right_arrow]=$'\U2198\UFE0F'
emoji[arrow_lower_right]=$'\U2198\UFE0F'
emoji[down_right_arrow_unqualified]=$'\U2198'
emoji[down_arrow]=$'\U2B07\UFE0F'
emoji[arrow_down]=$'\U2B07\UFE0F'
emoji[down_arrow_unqualified]=$'\U2B07'
emoji[down_left_arrow]=$'\U2199\UFE0F'
emoji[arrow_lower_left]=$'\U2199\UFE0F'
emoji[down_left_arrow_unqualified]=$'\U2199'
emoji[down_left_arrow_unqualified_1]=$'\U2B05\UFE0F'
emoji[arrow_left]=$'\U2B05\UFE0F'
emoji[down_left_arrow_unqualified_2]=$'\U2B05'
emoji[up_left_arrow]=$'\U2196\UFE0F'
emoji[arrow_upper_left]=$'\U2196\UFE0F'
emoji[up_left_arrow_unqualified]=$'\U2196'
emoji[up_down_arrow]=$'\U2195\UFE0F'
emoji[arrow_up_down]=$'\U2195\UFE0F'
emoji[up_down_arrow_unqualified]=$'\U2195'
emoji[left_right_arrow]=$'\U2194\UFE0F'
emoji[left_right_arrow_unqualified]=$'\U2194'
emoji[right_arrow_curving_left]=$'\U21A9\UFE0F'
emoji[leftwards_arrow_with_hook]=$'\U21A9\UFE0F'
emoji[right_arrow_curving_left_unqualified]=$'\U21A9'
emoji[left_arrow_curving_right]=$'\U21AA\UFE0F'
emoji[arrow_right_hook]=$'\U21AA\UFE0F'
emoji[left_arrow_curving_right_unqualified]=$'\U21AA'
emoji[right_arrow_curving_up]=$'\U2934\UFE0F'
emoji[arrow_heading_up]=$'\U2934\UFE0F'
emoji[right_arrow_curving_up_unqualified]=$'\U2934'
emoji[right_arrow_curving_down]=$'\U2935\UFE0F'
emoji[arrow_heading_down]=$'\U2935\UFE0F'
emoji[right_arrow_curving_down_unqualified]=$'\U2935'
emoji[clockwise_vertical_arrows]=$'\U1F503'
emoji[arrows_clockwise]=$'\U1F503'
emoji[counterclockwise_arrows_button]=$'\U1F504'
emoji[arrows_counterclockwise]=$'\U1F504'
emoji[BACK_arrow]=$'\U1F519'
emoji[back]=$'\U1F519'
emoji[END_arrow]=$'\U1F51A'
emoji[end]=$'\U1F51A'
emoji[ON_arrow]=$'\U1F51B'
emoji[on]=$'\U1F51B'
emoji[SOON_arrow]=$'\U1F51C'
emoji[soon]=$'\U1F51C'
emoji[TOP_arrow]=$'\U1F51D'
emoji[top]=$'\U1F51D'
emoji[place_of_worship]=$'\U1F6D0'
emoji[atom_symbol]=$'\U269B\UFE0F'
emoji[atom_symbol_unqualified]=$'\U269B'
emoji[atom_symbol_unqualified_1]=$'\U1F549\UFE0F'
emoji[om_unqualified]=$'\U1F549'
emoji[om]=$'\U1F549'
emoji[star_of_David]=$'\U2721\UFE0F'
emoji[star_of_david]=$'\U2721\UFE0F'
emoji[star_of_David_unqualified]=$'\U2721'
emoji[wheel_of_dharma]=$'\U2638\UFE0F'
emoji[wheel_of_dharma_unqualified]=$'\U2638'
emoji[yin_yang]=$'\U262F\UFE0F'
emoji[yin_yang_unqualified]=$'\U262F'
emoji[latin_cross]=$'\U271D\UFE0F'
emoji[latin_cross_unqualified]=$'\U271D'
emoji[orthodox_cross]=$'\U2626\UFE0F'
emoji[orthodox_cross_unqualified]=$'\U2626'
emoji[star_and_crescent]=$'\U262A\UFE0F'
emoji[star_and_crescent_unqualified]=$'\U262A'
emoji[peace_symbol]=$'\U262E\UFE0F'
emoji[peace_symbol_unqualified]=$'\U262E'
emoji[menorah]=$'\U1F54E'
emoji[dotted_six_pointed_star]=$'\U1F52F'
emoji[six_pointed_star]=$'\U1F52F'
emoji[Aries]=$'\U2648'
emoji[aries]=$'\U2648'
emoji[Taurus]=$'\U2649'
emoji[taurus]=$'\U2649'
emoji[Gemini]=$'\U264A'
emoji[gemini]=$'\U264A'
emoji[Cancer]=$'\U264B'
emoji[cancer]=$'\U264B'
emoji[Leo]=$'\U264C'
emoji[leo]=$'\U264C'
emoji[Virgo]=$'\U264D'
emoji[virgo]=$'\U264D'
emoji[Libra]=$'\U264E'
emoji[libra]=$'\U264E'
emoji[Scorpio]=$'\U264F'
emoji[scorpius]=$'\U264F'
emoji[Sagittarius]=$'\U2650'
emoji[sagittarius]=$'\U2650'
emoji[Capricorn]=$'\U2651'
emoji[capricorn]=$'\U2651'
emoji[Aquarius]=$'\U2652'
emoji[aquarius]=$'\U2652'
emoji[Pisces]=$'\U2653'
emoji[pisces]=$'\U2653'
emoji[Ophiuchus]=$'\U26CE'
emoji[ophiuchus]=$'\U26CE'
emoji[shuffle_tracks_button]=$'\U1F500'
emoji[twisted_rightwards_arrows]=$'\U1F500'
emoji[repeat_button]=$'\U1F501'
emoji[repeat]=$'\U1F501'
emoji[repeat_single_button]=$'\U1F502'
emoji[repeat_one]=$'\U1F502'
emoji[play_button]=$'\U25B6\UFE0F'
emoji[arrow_forward]=$'\U25B6\UFE0F'
emoji[play_button_unqualified]=$'\U25B6'
emoji[fast_forward_button]=$'\U23E9'
emoji[fast_forward]=$'\U23E9'
emoji[next_track_button]=$'\U23ED\UFE0F'
emoji[next_track_button_unqualified]=$'\U23ED'
emoji[play_or_pause_button]=$'\U23EF\UFE0F'
emoji[play_or_pause_button_unqualified]=$'\U23EF'
emoji[reverse_button]=$'\U25C0\UFE0F'
emoji[arrow_backward]=$'\U25C0\UFE0F'
emoji[reverse_button_unqualified]=$'\U25C0'
emoji[fast_reverse_button]=$'\U23EA'
emoji[rewind]=$'\U23EA'
emoji[last_track_button]=$'\U23EE\UFE0F'
emoji[last_track_button_unqualified]=$'\U23EE'
emoji[previous_track_button]=$'\U23EE'
emoji[upwards_button]=$'\U1F53C'
emoji[arrow_up_small]=$'\U1F53C'
emoji[fast_up_button]=$'\U23EB'
emoji[arrow_double_up]=$'\U23EB'
emoji[downwards_button]=$'\U1F53D'
emoji[arrow_down_small]=$'\U1F53D'
emoji[fast_down_button]=$'\U23EC'
emoji[arrow_double_down]=$'\U23EC'
emoji[pause_button]=$'\U23F8\UFE0F'
emoji[pause_button_unqualified]=$'\U23F8'
emoji[stop_button]=$'\U23F9\UFE0F'
emoji[stop_button_unqualified]=$'\U23F9'
emoji[record_button]=$'\U23FA\UFE0F'
emoji[record_button_unqualified]=$'\U23FA'
emoji[eject_button]=$'\U23CF\UFE0F'
emoji[eject_button_unqualified]=$'\U23CF'
emoji[cinema]=$'\U1F3A6'
emoji[dim_button]=$'\U1F505'
emoji[low_brightness]=$'\U1F505'
emoji[bright_button]=$'\U1F506'
emoji[high_brightness]=$'\U1F506'
emoji[antenna_bars]=$'\U1F4F6'
emoji[signal_strength]=$'\U1F4F6'
emoji[vibration_mode]=$'\U1F4F3'
emoji[mobile_phone_off]=$'\U1F4F4'
emoji[female_sign]=$'\U2640\UFE0F'
emoji[female_sign_unqualified]=$'\U2640'
emoji[female_sign_unqualified_1]=$'\U2642\UFE0F'
emoji[male_sign]=$'\U2642\UFE0F'
emoji[female_sign_unqualified_2]=$'\U2642'
emoji[medical_symbol]=$'\U2695\UFE0F'
emoji[medical_symbol_unqualified]=$'\U2695'
emoji[infinity]=$'\U267E\UFE0F'
emoji[infinity_unqualified]=$'\U267E'
emoji[recycling_symbol]=$'\U267B\UFE0F'
emoji[recycle]=$'\U267B\UFE0F'
emoji[recycling_symbol_unqualified]=$'\U267B'
emoji[fleur_de_lis]=$'\U269C\UFE0F'
emoji[fleur_de_lis_unqualified]=$'\U269C'
emoji[trident_emblem]=$'\U1F531'
emoji[trident]=$'\U1F531'
emoji[name_badge]=$'\U1F4DB'
emoji[Japanese_symbol_for_beginner]=$'\U1F530'
emoji[beginner]=$'\U1F530'
emoji[hollow_red_circle]=$'\U2B55'
emoji[o]=$'\U2B55'
emoji[check_mark_button]=$'\U2705'
emoji[white_check_mark]=$'\U2705'
emoji[check_box_with_check]=$'\U2611\UFE0F'
emoji[ballot_box_with_check]=$'\U2611\UFE0F'
emoji[check_box_with_check_unqualified]=$'\U2611'
emoji[check_mark]=$'\U2714\UFE0F'
emoji[heavy_check_mark]=$'\U2714\UFE0F'
emoji[check_mark_unqualified]=$'\U2714'
emoji[multiplication_sign]=$'\U2716\UFE0F'
emoji[heavy_multiplication_x]=$'\U2716\UFE0F'
emoji[multiplication_sign_unqualified]=$'\U2716'
emoji[cross_mark]=$'\U274C'
emoji[x]=$'\U274C'
emoji[cross_mark_button]=$'\U274E'
emoji[negative_squared_cross_mark]=$'\U274E'
emoji[plus_sign]=$'\U2795'
emoji[heavy_plus_sign]=$'\U2795'
emoji[minus_sign]=$'\U2796'
emoji[heavy_minus_sign]=$'\U2796'
emoji[division_sign]=$'\U2797'
emoji[heavy_division_sign]=$'\U2797'
emoji[curly_loop]=$'\U27B0'
emoji[double_curly_loop]=$'\U27BF'
emoji[loop]=$'\U27BF'
emoji[part_alternation_mark]=$'\U303D\UFE0F'
emoji[part_alternation_mark_unqualified]=$'\U303D'
emoji[eight_spoked_asterisk]=$'\U2733\UFE0F'
emoji[eight_spoked_asterisk_unqualified]=$'\U2733'
emoji[eight_pointed_star]=$'\U2734\UFE0F'
emoji[eight_pointed_black_star]=$'\U2734\UFE0F'
emoji[eight_pointed_star_unqualified]=$'\U2734'
emoji[sparkle]=$'\U2747\UFE0F'
emoji[sparkle_unqualified]=$'\U2747'
emoji[double_exclamation_mark]=$'\U203C\UFE0F'
emoji[bangbang]=$'\U203C\UFE0F'
emoji[double_exclamation_mark_unqualified]=$'\U203C'
emoji[exclamation_question_mark]=$'\U2049\UFE0F'
emoji[interrobang]=$'\U2049\UFE0F'
emoji[exclamation_question_mark_unqualified]=$'\U2049'
emoji[exclamation_question_mark_unqualified_1]=$'\U2753'
emoji[question]=$'\U2753'
emoji[white_question_mark]=$'\U2754'
emoji[grey_question]=$'\U2754'
emoji[white_exclamation_mark]=$'\U2755'
emoji[grey_exclamation]=$'\U2755'
emoji[white_exclamation_mark_1]=$'\U2757'
emoji[exclamation]=$'\U2757'
emoji[heavy_exclamation_mark]=$'\U2757'
emoji[wavy_dash]=$'\U3030\UFE0F'
emoji[wavy_dash_unqualified]=$'\U3030'
emoji[copyright]=$'\U00A9\UFE0F'
emoji[copyright_unqualified]=$'\U00A9'
emoji[registered]=$'\U00AE\UFE0F'
emoji[registered_unqualified]=$'\U00AE'
emoji[trade_mark]=$'\U2122\UFE0F'
emoji[tm]=$'\U2122\UFE0F'
emoji[trade_mark_unqualified]=$'\U2122'
emoji[keycap_#]=$'\U0023\UFE0F\U20E3'
emoji[hash]=$'\U0023\UFE0F\U20E3'
emoji[keycap_#_unqualified]=$'\U0023\U20E3'
emoji[keycap_*]=$'\U002A\UFE0F\U20E3'
emoji[asterisk]=$'\U002A\UFE0F\U20E3'
emoji[keycap_*_unqualified]=$'\U002A\U20E3'
emoji[keycap_0]=$'\U0030\UFE0F\U20E3'
emoji[zero]=$'\U0030\UFE0F\U20E3'
emoji[keycap_0_unqualified]=$'\U0030\U20E3'
emoji[keycap_1]=$'\U0031\UFE0F\U20E3'
emoji[one]=$'\U0031\UFE0F\U20E3'
emoji[keycap_1_unqualified]=$'\U0031\U20E3'
emoji[keycap_2]=$'\U0032\UFE0F\U20E3'
emoji[two]=$'\U0032\UFE0F\U20E3'
emoji[keycap_2_unqualified]=$'\U0032\U20E3'
emoji[keycap_3]=$'\U0033\UFE0F\U20E3'
emoji[three]=$'\U0033\UFE0F\U20E3'
emoji[keycap_3_unqualified]=$'\U0033\U20E3'
emoji[keycap_4]=$'\U0034\UFE0F\U20E3'
emoji[four]=$'\U0034\UFE0F\U20E3'
emoji[keycap_4_unqualified]=$'\U0034\U20E3'
emoji[keycap_5]=$'\U0035\UFE0F\U20E3'
emoji[five]=$'\U0035\UFE0F\U20E3'
emoji[keycap_5_unqualified]=$'\U0035\U20E3'
emoji[keycap_6]=$'\U0036\UFE0F\U20E3'
emoji[six]=$'\U0036\UFE0F\U20E3'
emoji[keycap_6_unqualified]=$'\U0036\U20E3'
emoji[keycap_7]=$'\U0037\UFE0F\U20E3'
emoji[seven]=$'\U0037\UFE0F\U20E3'
emoji[keycap_7_unqualified]=$'\U0037\U20E3'
emoji[keycap_8]=$'\U0038\UFE0F\U20E3'
emoji[eight]=$'\U0038\UFE0F\U20E3'
emoji[keycap_8_unqualified]=$'\U0038\U20E3'
emoji[keycap_9]=$'\U0039\UFE0F\U20E3'
emoji[nine]=$'\U0039\UFE0F\U20E3'
emoji[keycap_9_unqualified]=$'\U0039\U20E3'
emoji[keycap_10]=$'\U1F51F'
emoji[keycap_ten]=$'\U1F51F'
emoji[input_latin_uppercase]=$'\U1F520'
emoji[capital_abcd]=$'\U1F520'
emoji[input_latin_lowercase]=$'\U1F521'
emoji[abcd]=$'\U1F521'
emoji[input_numbers]=$'\U1F522'
emoji[1234]=$'\U1F522'
emoji[input_symbols]=$'\U1F523'
emoji[symbols]=$'\U1F523'
emoji[input_latin_letters]=$'\U1F524'
emoji[abc]=$'\U1F524'
emoji[A_button_blood_type_]=$'\U1F170\UFE0F'
emoji[a]=$'\U1F170\UFE0F'
emoji[A_button_blood_type__unqualified]=$'\U1F170'
emoji[AB_button_blood_type_]=$'\U1F18E'
emoji[ab]=$'\U1F18E'
emoji[AB_button_blood_type__1]=$'\U1F171\UFE0F'
emoji[b]=$'\U1F171\UFE0F'
emoji[B_button_blood_type__unqualified]=$'\U1F171'
emoji[CL_button]=$'\U1F191'
emoji[cl]=$'\U1F191'
emoji[COOL_button]=$'\U1F192'
emoji[cool]=$'\U1F192'
emoji[FREE_button]=$'\U1F193'
emoji[free]=$'\U1F193'
emoji[information]=$'\U2139\UFE0F'
emoji[information_source]=$'\U2139\UFE0F'
emoji[information_unqualified]=$'\U2139'
emoji[ID_button]=$'\U1F194'
emoji[id]=$'\U1F194'
emoji[circled_M]=$'\U24C2\UFE0F'
emoji[m]=$'\U24C2\UFE0F'
emoji[circled_M_unqualified]=$'\U24C2'
emoji[NEW_button]=$'\U1F195'
emoji[new]=$'\U1F195'
emoji[NG_button]=$'\U1F196'
emoji[ng]=$'\U1F196'
emoji[O_button_blood_type_]=$'\U1F17E\UFE0F'
emoji[o2]=$'\U1F17E\UFE0F'
emoji[O_button_blood_type__unqualified]=$'\U1F17E'
emoji[OK_button]=$'\U1F197'
emoji[ok]=$'\U1F197'
emoji[P_button]=$'\U1F17F\UFE0F'
emoji[parking]=$'\U1F17F\UFE0F'
emoji[P_button_unqualified]=$'\U1F17F'
emoji[SOS_button]=$'\U1F198'
emoji[sos]=$'\U1F198'
emoji[UP_button]=$'\U1F199'
emoji[up]=$'\U1F199'
emoji[VS_button]=$'\U1F19A'
emoji[vs]=$'\U1F19A'
emoji[Japanese_here_button]=$'\U1F201'
emoji[koko]=$'\U1F201'
emoji[Japanese_service_charge_button]=$'\U1F202\UFE0F'
emoji[sa]=$'\U1F202\UFE0F'
emoji[Japanese_service_charge_button_unqualified]=$'\U1F202'
emoji[Japanese_monthly_amount_button]=$'\U1F237\UFE0F'
emoji[u6708]=$'\U1F237\UFE0F'
emoji[Japanese_monthly_amount_button_unqualified]=$'\U1F237'
emoji[Japanese_not_free_of_charge_button]=$'\U1F236'
emoji[u6709]=$'\U1F236'
emoji[Japanese_reserved_button]=$'\U1F22F'
emoji[u6307]=$'\U1F22F'
emoji[Japanese_bargain_button]=$'\U1F250'
emoji[ideograph_advantage]=$'\U1F250'
emoji[Japanese_discount_button]=$'\U1F239'
emoji[u5272]=$'\U1F239'
emoji[Japanese_free_of_charge_button]=$'\U1F21A'
emoji[u7121]=$'\U1F21A'
emoji[Japanese_prohibited_button]=$'\U1F232'
emoji[u7981]=$'\U1F232'
emoji[Japanese_acceptable_button]=$'\U1F251'
emoji[accept]=$'\U1F251'
emoji[Japanese_application_button]=$'\U1F238'
emoji[u7533]=$'\U1F238'
emoji[Japanese_passing_grade_button]=$'\U1F234'
emoji[u5408]=$'\U1F234'
emoji[Japanese_vacancy_button]=$'\U1F233'
emoji[u7a7a]=$'\U1F233'
emoji[Japanese_congratulations_button]=$'\U3297\UFE0F'
emoji[congratulations]=$'\U3297\UFE0F'
emoji[Japanese_congratulations_button_unqualified]=$'\U3297'
emoji[Japanese_secret_button]=$'\U3299\UFE0F'
emoji[secret]=$'\U3299\UFE0F'
emoji[Japanese_secret_button_unqualified]=$'\U3299'
emoji[Japanese_open_for_business_button]=$'\U1F23A'
emoji[u55b6]=$'\U1F23A'
emoji[Japanese_no_vacancy_button]=$'\U1F235'
emoji[u6e80]=$'\U1F235'
emoji[red_circle]=$'\U1F534'
emoji[orange_circle]=$'\U1F7E0'
emoji[yellow_circle]=$'\U1F7E1'
emoji[green_circle]=$'\U1F7E2'
emoji[blue_circle]=$'\U1F535'
emoji[large_blue_circle]=$'\U1F535'
emoji[purple_circle]=$'\U1F7E3'
emoji[brown_circle]=$'\U1F7E4'
emoji[black_circle]=$'\U26AB'
emoji[white_circle]=$'\U26AA'
emoji[red_square]=$'\U1F7E5'
emoji[orange_square]=$'\U1F7E7'
emoji[yellow_square]=$'\U1F7E8'
emoji[green_square]=$'\U1F7E9'
emoji[blue_square]=$'\U1F7E6'
emoji[purple_square]=$'\U1F7EA'
emoji[brown_square]=$'\U1F7EB'
emoji[black_large_square]=$'\U2B1B'
emoji[white_large_square]=$'\U2B1C'
emoji[black_medium_square]=$'\U25FC\UFE0F'
emoji[black_medium_square_unqualified]=$'\U25FC'
emoji[white_medium_square]=$'\U25FB\UFE0F'
emoji[white_medium_square_unqualified]=$'\U25FB'
emoji[black_medium_small_square]=$'\U25FE'
emoji[white_medium_small_square]=$'\U25FD'
emoji[black_small_square]=$'\U25AA\UFE0F'
emoji[black_small_square_unqualified]=$'\U25AA'
emoji[white_small_square]=$'\U25AB\UFE0F'
emoji[white_small_square_unqualified]=$'\U25AB'
emoji[large_orange_diamond]=$'\U1F536'
emoji[large_blue_diamond]=$'\U1F537'
emoji[small_orange_diamond]=$'\U1F538'
emoji[small_blue_diamond]=$'\U1F539'
emoji[red_triangle_pointed_up]=$'\U1F53A'
emoji[small_red_triangle]=$'\U1F53A'
emoji[red_triangle_pointed_down]=$'\U1F53B'
emoji[small_red_triangle_down]=$'\U1F53B'
emoji[diamond_with_a_dot]=$'\U1F4A0'
emoji[diamond_shape_with_a_dot_inside]=$'\U1F4A0'
emoji[radio_button]=$'\U1F518'
emoji[white_square_button]=$'\U1F533'
emoji[black_square_button]=$'\U1F532'
emoji_flags[chequered_flag]=$'\U1F3C1'
emoji_flags[checkered_flag]=$'\U1F3C1'
emoji_flags[triangular_flag]=$'\U1F6A9'
emoji_flags[triangular_flag_on_post]=$'\U1F6A9'
emoji_flags[crossed_flags]=$'\U1F38C'
emoji_flags[black_flag]=$'\U1F3F4'
emoji_flags[white_flag]=$'\U1F3F3\UFE0F'
emoji_flags[white_flag_unqualified]=$'\U1F3F3'
emoji_flags[rainbow_flag]=$'\U1F3F3\UFE0F\U200D\U1F308'
emoji_flags[rainbow_flag_unqualified]=$'\U1F3F3\U200D\U1F308'
emoji_flags[pirate_flag]=$'\U1F3F4\U200D\U2620\UFE0F'
emoji_flags[pirate_flag_minimally]=$'\U1F3F4\U200D\U2620'
emoji_flags[Ascension_Island]=$'\U1F1E6\U1F1E8'
emoji_flags[ascension_island]=$'\U1F1E6\U1F1E8'
emoji_flags[Andorra]=$'\U1F1E6\U1F1E9'
emoji_flags[AD]=$'\U1F1E6\U1F1E9'
emoji_flags[AND]=$'\U1F1E6\U1F1E9'
emoji_flags[andorra]=$'\U1F1E6\U1F1E9'
emoji_flags[United_Arab_Emirates]=$'\U1F1E6\U1F1EA'
emoji_flags[AE]=$'\U1F1E6\U1F1EA'
emoji_flags[ARE]=$'\U1F1E6\U1F1EA'
emoji_flags[united_arab_emirates]=$'\U1F1E6\U1F1EA'
emoji_flags[Afghanistan]=$'\U1F1E6\U1F1EB'
emoji_flags[AF]=$'\U1F1E6\U1F1EB'
emoji_flags[AFG]=$'\U1F1E6\U1F1EB'
emoji_flags[afghanistan]=$'\U1F1E6\U1F1EB'
emoji_flags[Antigua_and_Barbuda]=$'\U1F1E6\U1F1EC'
emoji_flags[AG]=$'\U1F1E6\U1F1EC'
emoji_flags[ATG]=$'\U1F1E6\U1F1EC'
emoji_flags[antigua_barbuda]=$'\U1F1E6\U1F1EC'
emoji_flags[Anguilla]=$'\U1F1E6\U1F1EE'
emoji_flags[AI]=$'\U1F1E6\U1F1EE'
emoji_flags[AIA]=$'\U1F1E6\U1F1EE'
emoji_flags[anguilla]=$'\U1F1E6\U1F1EE'
emoji_flags[Albania]=$'\U1F1E6\U1F1F1'
emoji_flags[AL]=$'\U1F1E6\U1F1F1'
emoji_flags[ALB]=$'\U1F1E6\U1F1F1'
emoji_flags[albania]=$'\U1F1E6\U1F1F1'
emoji_flags[Armenia]=$'\U1F1E6\U1F1F2'
emoji_flags[AM]=$'\U1F1E6\U1F1F2'
emoji_flags[ARM]=$'\U1F1E6\U1F1F2'
emoji_flags[armenia]=$'\U1F1E6\U1F1F2'
emoji_flags[Angola]=$'\U1F1E6\U1F1F4'
emoji_flags[AO]=$'\U1F1E6\U1F1F4'
emoji_flags[AGO]=$'\U1F1E6\U1F1F4'
emoji_flags[angola]=$'\U1F1E6\U1F1F4'
emoji_flags[Antarctica]=$'\U1F1E6\U1F1F6'
emoji_flags[AQ]=$'\U1F1E6\U1F1F6'
emoji_flags[ATA]=$'\U1F1E6\U1F1F6'
emoji_flags[antarctica]=$'\U1F1E6\U1F1F6'
emoji_flags[Argentina]=$'\U1F1E6\U1F1F7'
emoji_flags[AR]=$'\U1F1E6\U1F1F7'
emoji_flags[ARG]=$'\U1F1E6\U1F1F7'
emoji_flags[argentina]=$'\U1F1E6\U1F1F7'
emoji_flags[American_Samoa]=$'\U1F1E6\U1F1F8'
emoji_flags[AS]=$'\U1F1E6\U1F1F8'
emoji_flags[ASM]=$'\U1F1E6\U1F1F8'
emoji_flags[american_samoa]=$'\U1F1E6\U1F1F8'
emoji_flags[Austria]=$'\U1F1E6\U1F1F9'
emoji_flags[AT]=$'\U1F1E6\U1F1F9'
emoji_flags[AUT]=$'\U1F1E6\U1F1F9'
emoji_flags[austria]=$'\U1F1E6\U1F1F9'
emoji_flags[Australia]=$'\U1F1E6\U1F1FA'
emoji_flags[AU]=$'\U1F1E6\U1F1FA'
emoji_flags[AUS]=$'\U1F1E6\U1F1FA'
emoji_flags[australia]=$'\U1F1E6\U1F1FA'
emoji_flags[Aruba]=$'\U1F1E6\U1F1FC'
emoji_flags[AW]=$'\U1F1E6\U1F1FC'
emoji_flags[ABW]=$'\U1F1E6\U1F1FC'
emoji_flags[aruba]=$'\U1F1E6\U1F1FC'
emoji_flags[Åland_Islands]=$'\U1F1E6\U1F1FD'
emoji_flags[AX]=$'\U1F1E6\U1F1FD'
emoji_flags[ALA]=$'\U1F1E6\U1F1FD'
emoji_flags[aland_islands]=$'\U1F1E6\U1F1FD'
emoji_flags[Azerbaijan]=$'\U1F1E6\U1F1FF'
emoji_flags[AZ]=$'\U1F1E6\U1F1FF'
emoji_flags[AZE]=$'\U1F1E6\U1F1FF'
emoji_flags[azerbaijan]=$'\U1F1E6\U1F1FF'
emoji_flags[Bosnia_and_Herzegovina]=$'\U1F1E7\U1F1E6'
emoji_flags[BA]=$'\U1F1E7\U1F1E6'
emoji_flags[BIH]=$'\U1F1E7\U1F1E6'
emoji_flags[bosnia_herzegovina]=$'\U1F1E7\U1F1E6'
emoji_flags[Barbados]=$'\U1F1E7\U1F1E7'
emoji_flags[BB]=$'\U1F1E7\U1F1E7'
emoji_flags[BRB]=$'\U1F1E7\U1F1E7'
emoji_flags[barbados]=$'\U1F1E7\U1F1E7'
emoji_flags[Bangladesh]=$'\U1F1E7\U1F1E9'
emoji_flags[BD]=$'\U1F1E7\U1F1E9'
emoji_flags[BGD]=$'\U1F1E7\U1F1E9'
emoji_flags[bangladesh]=$'\U1F1E7\U1F1E9'
emoji_flags[Belgium]=$'\U1F1E7\U1F1EA'
emoji_flags[BE]=$'\U1F1E7\U1F1EA'
emoji_flags[BEL]=$'\U1F1E7\U1F1EA'
emoji_flags[belgium]=$'\U1F1E7\U1F1EA'
emoji_flags[Burkina_Faso]=$'\U1F1E7\U1F1EB'
emoji_flags[BF]=$'\U1F1E7\U1F1EB'
emoji_flags[BFA]=$'\U1F1E7\U1F1EB'
emoji_flags[burkina_faso]=$'\U1F1E7\U1F1EB'
emoji_flags[Bulgaria]=$'\U1F1E7\U1F1EC'
emoji_flags[BG]=$'\U1F1E7\U1F1EC'
emoji_flags[BGR]=$'\U1F1E7\U1F1EC'
emoji_flags[bulgaria]=$'\U1F1E7\U1F1EC'
emoji_flags[Bahrain]=$'\U1F1E7\U1F1ED'
emoji_flags[BH]=$'\U1F1E7\U1F1ED'
emoji_flags[BHR]=$'\U1F1E7\U1F1ED'
emoji_flags[bahrain]=$'\U1F1E7\U1F1ED'
emoji_flags[Burundi]=$'\U1F1E7\U1F1EE'
emoji_flags[BI]=$'\U1F1E7\U1F1EE'
emoji_flags[BDI]=$'\U1F1E7\U1F1EE'
emoji_flags[burundi]=$'\U1F1E7\U1F1EE'
emoji_flags[Benin]=$'\U1F1E7\U1F1EF'
emoji_flags[BJ]=$'\U1F1E7\U1F1EF'
emoji_flags[BEN]=$'\U1F1E7\U1F1EF'
emoji_flags[benin]=$'\U1F1E7\U1F1EF'
emoji_flags[St_Barthélemy]=$'\U1F1E7\U1F1F1'
emoji_flags[BL]=$'\U1F1E7\U1F1F1'
emoji_flags[BLM]=$'\U1F1E7\U1F1F1'
emoji_flags[st_barthelemy]=$'\U1F1E7\U1F1F1'
emoji_flags[Bermuda]=$'\U1F1E7\U1F1F2'
emoji_flags[BM]=$'\U1F1E7\U1F1F2'
emoji_flags[BMU]=$'\U1F1E7\U1F1F2'
emoji_flags[bermuda]=$'\U1F1E7\U1F1F2'
emoji_flags[Brunei]=$'\U1F1E7\U1F1F3'
emoji_flags[BN]=$'\U1F1E7\U1F1F3'
emoji_flags[BRN]=$'\U1F1E7\U1F1F3'
emoji_flags[brunei]=$'\U1F1E7\U1F1F3'
emoji_flags[Bolivia]=$'\U1F1E7\U1F1F4'
emoji_flags[BO]=$'\U1F1E7\U1F1F4'
emoji_flags[BOL]=$'\U1F1E7\U1F1F4'
emoji_flags[bolivia]=$'\U1F1E7\U1F1F4'
emoji_flags[Caribbean_Netherlands]=$'\U1F1E7\U1F1F6'
emoji_flags[BQ]=$'\U1F1E7\U1F1F6'
emoji_flags[BES]=$'\U1F1E7\U1F1F6'
emoji_flags[caribbean_netherlands]=$'\U1F1E7\U1F1F6'
emoji_flags[Brazil]=$'\U1F1E7\U1F1F7'
emoji_flags[BR]=$'\U1F1E7\U1F1F7'
emoji_flags[BRA]=$'\U1F1E7\U1F1F7'
emoji_flags[brazil]=$'\U1F1E7\U1F1F7'
emoji_flags[Bahamas]=$'\U1F1E7\U1F1F8'
emoji_flags[BS]=$'\U1F1E7\U1F1F8'
emoji_flags[BHS]=$'\U1F1E7\U1F1F8'
emoji_flags[bahamas]=$'\U1F1E7\U1F1F8'
emoji_flags[Bhutan]=$'\U1F1E7\U1F1F9'
emoji_flags[BT]=$'\U1F1E7\U1F1F9'
emoji_flags[BTN]=$'\U1F1E7\U1F1F9'
emoji_flags[bhutan]=$'\U1F1E7\U1F1F9'
emoji_flags[Bouvet_Island]=$'\U1F1E7\U1F1FB'
emoji_flags[BV]=$'\U1F1E7\U1F1FB'
emoji_flags[BVT]=$'\U1F1E7\U1F1FB'
emoji_flags[bouvet_island]=$'\U1F1E7\U1F1FB'
emoji_flags[Botswana]=$'\U1F1E7\U1F1FC'
emoji_flags[BW]=$'\U1F1E7\U1F1FC'
emoji_flags[BWA]=$'\U1F1E7\U1F1FC'
emoji_flags[botswana]=$'\U1F1E7\U1F1FC'
emoji_flags[Belarus]=$'\U1F1E7\U1F1FE'
emoji_flags[BY]=$'\U1F1E7\U1F1FE'
emoji_flags[BLR]=$'\U1F1E7\U1F1FE'
emoji_flags[belarus]=$'\U1F1E7\U1F1FE'
emoji_flags[Belize]=$'\U1F1E7\U1F1FF'
emoji_flags[BZ]=$'\U1F1E7\U1F1FF'
emoji_flags[BLZ]=$'\U1F1E7\U1F1FF'
emoji_flags[belize]=$'\U1F1E7\U1F1FF'
emoji_flags[Canada]=$'\U1F1E8\U1F1E6'
emoji_flags[CA]=$'\U1F1E8\U1F1E6'
emoji_flags[CAN]=$'\U1F1E8\U1F1E6'
emoji_flags[canada]=$'\U1F1E8\U1F1E6'
emoji_flags[Cocos_Keeling_Islands]=$'\U1F1E8\U1F1E8'
emoji_flags[CC]=$'\U1F1E8\U1F1E8'
emoji_flags[CCK]=$'\U1F1E8\U1F1E8'
emoji_flags[cocos_islands]=$'\U1F1E8\U1F1E8'
emoji_flags[Congo__Kinshasa]=$'\U1F1E8\U1F1E9'
emoji_flags[CD]=$'\U1F1E8\U1F1E9'
emoji_flags[COD]=$'\U1F1E8\U1F1E9'
emoji_flags[congo_kinshasa]=$'\U1F1E8\U1F1E9'
emoji_flags[Central_African_Republic]=$'\U1F1E8\U1F1EB'
emoji_flags[CF]=$'\U1F1E8\U1F1EB'
emoji_flags[CAF]=$'\U1F1E8\U1F1EB'
emoji_flags[central_african_republic]=$'\U1F1E8\U1F1EB'
emoji_flags[Congo__Brazzaville]=$'\U1F1E8\U1F1EC'
emoji_flags[CG]=$'\U1F1E8\U1F1EC'
emoji_flags[COG]=$'\U1F1E8\U1F1EC'
emoji_flags[congo_brazzaville]=$'\U1F1E8\U1F1EC'
emoji_flags[Switzerland]=$'\U1F1E8\U1F1ED'
emoji_flags[CH]=$'\U1F1E8\U1F1ED'
emoji_flags[CHE]=$'\U1F1E8\U1F1ED'
emoji_flags[switzerland]=$'\U1F1E8\U1F1ED'
emoji_flags[Côte_d_Ivoire]=$'\U1F1E8\U1F1EE'
emoji_flags[CI]=$'\U1F1E8\U1F1EE'
emoji_flags[CIV]=$'\U1F1E8\U1F1EE'
emoji_flags[cote_divoire]=$'\U1F1E8\U1F1EE'
emoji_flags[Cook_Islands]=$'\U1F1E8\U1F1F0'
emoji_flags[CK]=$'\U1F1E8\U1F1F0'
emoji_flags[COK]=$'\U1F1E8\U1F1F0'
emoji_flags[cook_islands]=$'\U1F1E8\U1F1F0'
emoji_flags[Chile]=$'\U1F1E8\U1F1F1'
emoji_flags[CL]=$'\U1F1E8\U1F1F1'
emoji_flags[CHL]=$'\U1F1E8\U1F1F1'
emoji_flags[chile]=$'\U1F1E8\U1F1F1'
emoji_flags[Cameroon]=$'\U1F1E8\U1F1F2'
emoji_flags[CM]=$'\U1F1E8\U1F1F2'
emoji_flags[CMR]=$'\U1F1E8\U1F1F2'
emoji_flags[cameroon]=$'\U1F1E8\U1F1F2'
emoji_flags[China]=$'\U1F1E8\U1F1F3'
emoji_flags[CN]=$'\U1F1E8\U1F1F3'
emoji_flags[CHN]=$'\U1F1E8\U1F1F3'
emoji_flags[cn]=$'\U1F1E8\U1F1F3'
emoji_flags[Colombia]=$'\U1F1E8\U1F1F4'
emoji_flags[CO]=$'\U1F1E8\U1F1F4'
emoji_flags[COL]=$'\U1F1E8\U1F1F4'
emoji_flags[colombia]=$'\U1F1E8\U1F1F4'
emoji_flags[Clipperton_Island]=$'\U1F1E8\U1F1F5'
emoji_flags[clipperton_island]=$'\U1F1E8\U1F1F5'
emoji_flags[Costa_Rica]=$'\U1F1E8\U1F1F7'
emoji_flags[CR]=$'\U1F1E8\U1F1F7'
emoji_flags[CRI]=$'\U1F1E8\U1F1F7'
emoji_flags[costa_rica]=$'\U1F1E8\U1F1F7'
emoji_flags[Cuba]=$'\U1F1E8\U1F1FA'
emoji_flags[CU]=$'\U1F1E8\U1F1FA'
emoji_flags[CUB]=$'\U1F1E8\U1F1FA'
emoji_flags[cuba]=$'\U1F1E8\U1F1FA'
emoji_flags[Cape_Verde]=$'\U1F1E8\U1F1FB'
emoji_flags[CV]=$'\U1F1E8\U1F1FB'
emoji_flags[CPV]=$'\U1F1E8\U1F1FB'
emoji_flags[cape_verde]=$'\U1F1E8\U1F1FB'
emoji_flags[Curaçao]=$'\U1F1E8\U1F1FC'
emoji_flags[CW]=$'\U1F1E8\U1F1FC'
emoji_flags[CUW]=$'\U1F1E8\U1F1FC'
emoji_flags[curacao]=$'\U1F1E8\U1F1FC'
emoji_flags[Christmas_Island]=$'\U1F1E8\U1F1FD'
emoji_flags[CX]=$'\U1F1E8\U1F1FD'
emoji_flags[CXR]=$'\U1F1E8\U1F1FD'
emoji_flags[christmas_island]=$'\U1F1E8\U1F1FD'
emoji_flags[Cyprus]=$'\U1F1E8\U1F1FE'
emoji_flags[CY]=$'\U1F1E8\U1F1FE'
emoji_flags[CYP]=$'\U1F1E8\U1F1FE'
emoji_flags[cyprus]=$'\U1F1E8\U1F1FE'
emoji_flags[Czechia]=$'\U1F1E8\U1F1FF'
emoji_flags[CZ]=$'\U1F1E8\U1F1FF'
emoji_flags[CZE]=$'\U1F1E8\U1F1FF'
emoji_flags[czech_republic]=$'\U1F1E8\U1F1FF'
emoji_flags[Germany]=$'\U1F1E9\U1F1EA'
emoji_flags[DE]=$'\U1F1E9\U1F1EA'
emoji_flags[DEU]=$'\U1F1E9\U1F1EA'
emoji_flags[de]=$'\U1F1E9\U1F1EA'
emoji_flags[Diego_Garcia]=$'\U1F1E9\U1F1EC'
emoji_flags[diego_garcia]=$'\U1F1E9\U1F1EC'
emoji_flags[Djibouti]=$'\U1F1E9\U1F1EF'
emoji_flags[DJ]=$'\U1F1E9\U1F1EF'
emoji_flags[DJI]=$'\U1F1E9\U1F1EF'
emoji_flags[djibouti]=$'\U1F1E9\U1F1EF'
emoji_flags[Denmark]=$'\U1F1E9\U1F1F0'
emoji_flags[DK]=$'\U1F1E9\U1F1F0'
emoji_flags[DNK]=$'\U1F1E9\U1F1F0'
emoji_flags[denmark]=$'\U1F1E9\U1F1F0'
emoji_flags[Dominica]=$'\U1F1E9\U1F1F2'
emoji_flags[DM]=$'\U1F1E9\U1F1F2'
emoji_flags[DMA]=$'\U1F1E9\U1F1F2'
emoji_flags[dominica]=$'\U1F1E9\U1F1F2'
emoji_flags[Dominican_Republic]=$'\U1F1E9\U1F1F4'
emoji_flags[DO]=$'\U1F1E9\U1F1F4'
emoji_flags[DOM]=$'\U1F1E9\U1F1F4'
emoji_flags[dominican_republic]=$'\U1F1E9\U1F1F4'
emoji_flags[Algeria]=$'\U1F1E9\U1F1FF'
emoji_flags[DZ]=$'\U1F1E9\U1F1FF'
emoji_flags[DZA]=$'\U1F1E9\U1F1FF'
emoji_flags[algeria]=$'\U1F1E9\U1F1FF'
emoji_flags[Ceuta_and_Melilla]=$'\U1F1EA\U1F1E6'
emoji_flags[ceuta_melilla]=$'\U1F1EA\U1F1E6'
emoji_flags[Ecuador]=$'\U1F1EA\U1F1E8'
emoji_flags[EC]=$'\U1F1EA\U1F1E8'
emoji_flags[ECU]=$'\U1F1EA\U1F1E8'
emoji_flags[ecuador]=$'\U1F1EA\U1F1E8'
emoji_flags[Estonia]=$'\U1F1EA\U1F1EA'
emoji_flags[EE]=$'\U1F1EA\U1F1EA'
emoji_flags[EST]=$'\U1F1EA\U1F1EA'
emoji_flags[estonia]=$'\U1F1EA\U1F1EA'
emoji_flags[Egypt]=$'\U1F1EA\U1F1EC'
emoji_flags[EG]=$'\U1F1EA\U1F1EC'
emoji_flags[EGY]=$'\U1F1EA\U1F1EC'
emoji_flags[egypt]=$'\U1F1EA\U1F1EC'
emoji_flags[Western_Sahara]=$'\U1F1EA\U1F1ED'
emoji_flags[EH]=$'\U1F1EA\U1F1ED'
emoji_flags[ESH]=$'\U1F1EA\U1F1ED'
emoji_flags[western_sahara]=$'\U1F1EA\U1F1ED'
emoji_flags[Eritrea]=$'\U1F1EA\U1F1F7'
emoji_flags[ER]=$'\U1F1EA\U1F1F7'
emoji_flags[ERI]=$'\U1F1EA\U1F1F7'
emoji_flags[eritrea]=$'\U1F1EA\U1F1F7'
emoji_flags[Spain]=$'\U1F1EA\U1F1F8'
emoji_flags[ES]=$'\U1F1EA\U1F1F8'
emoji_flags[ESP]=$'\U1F1EA\U1F1F8'
emoji_flags[es]=$'\U1F1EA\U1F1F8'
emoji_flags[Ethiopia]=$'\U1F1EA\U1F1F9'
emoji_flags[ET]=$'\U1F1EA\U1F1F9'
emoji_flags[ETH]=$'\U1F1EA\U1F1F9'
emoji_flags[ethiopia]=$'\U1F1EA\U1F1F9'
emoji_flags[European_Union]=$'\U1F1EA\U1F1FA'
emoji_flags[eu]=$'\U1F1EA\U1F1FA'
emoji_flags[european_union]=$'\U1F1EA\U1F1FA'
emoji_flags[Finland]=$'\U1F1EB\U1F1EE'
emoji_flags[FI]=$'\U1F1EB\U1F1EE'
emoji_flags[FIN]=$'\U1F1EB\U1F1EE'
emoji_flags[finland]=$'\U1F1EB\U1F1EE'
emoji_flags[Fiji]=$'\U1F1EB\U1F1EF'
emoji_flags[FJ]=$'\U1F1EB\U1F1EF'
emoji_flags[FJI]=$'\U1F1EB\U1F1EF'
emoji_flags[fiji]=$'\U1F1EB\U1F1EF'
emoji_flags[Falkland_Islands]=$'\U1F1EB\U1F1F0'
emoji_flags[FK]=$'\U1F1EB\U1F1F0'
emoji_flags[FLK]=$'\U1F1EB\U1F1F0'
emoji_flags[falkland_islands]=$'\U1F1EB\U1F1F0'
emoji_flags[Micronesia]=$'\U1F1EB\U1F1F2'
emoji_flags[FM]=$'\U1F1EB\U1F1F2'
emoji_flags[FSM]=$'\U1F1EB\U1F1F2'
emoji_flags[micronesia]=$'\U1F1EB\U1F1F2'
emoji_flags[Faroe_Islands]=$'\U1F1EB\U1F1F4'
emoji_flags[FO]=$'\U1F1EB\U1F1F4'
emoji_flags[FRO]=$'\U1F1EB\U1F1F4'
emoji_flags[faroe_islands]=$'\U1F1EB\U1F1F4'
emoji_flags[France]=$'\U1F1EB\U1F1F7'
emoji_flags[FR]=$'\U1F1EB\U1F1F7'
emoji_flags[FRA]=$'\U1F1EB\U1F1F7'
emoji_flags[fr]=$'\U1F1EB\U1F1F7'
emoji_flags[Gabon]=$'\U1F1EC\U1F1E6'
emoji_flags[GA]=$'\U1F1EC\U1F1E6'
emoji_flags[GAB]=$'\U1F1EC\U1F1E6'
emoji_flags[gabon]=$'\U1F1EC\U1F1E6'
emoji_flags[United_Kingdom]=$'\U1F1EC\U1F1E7'
emoji_flags[GB]=$'\U1F1EC\U1F1E7'
emoji_flags[GBR]=$'\U1F1EC\U1F1E7'
emoji_flags[gb]=$'\U1F1EC\U1F1E7'
emoji_flags[uk]=$'\U1F1EC\U1F1E7'
emoji_flags[Grenada]=$'\U1F1EC\U1F1E9'
emoji_flags[GD]=$'\U1F1EC\U1F1E9'
emoji_flags[GRD]=$'\U1F1EC\U1F1E9'
emoji_flags[grenada]=$'\U1F1EC\U1F1E9'
emoji_flags[Georgia]=$'\U1F1EC\U1F1EA'
emoji_flags[GE]=$'\U1F1EC\U1F1EA'
emoji_flags[GEO]=$'\U1F1EC\U1F1EA'
emoji_flags[georgia]=$'\U1F1EC\U1F1EA'
emoji_flags[French_Guiana]=$'\U1F1EC\U1F1EB'
emoji_flags[GF]=$'\U1F1EC\U1F1EB'
emoji_flags[GUF]=$'\U1F1EC\U1F1EB'
emoji_flags[french_guiana]=$'\U1F1EC\U1F1EB'
emoji_flags[Guernsey]=$'\U1F1EC\U1F1EC'
emoji_flags[GG]=$'\U1F1EC\U1F1EC'
emoji_flags[GGY]=$'\U1F1EC\U1F1EC'
emoji_flags[guernsey]=$'\U1F1EC\U1F1EC'
emoji_flags[Ghana]=$'\U1F1EC\U1F1ED'
emoji_flags[GH]=$'\U1F1EC\U1F1ED'
emoji_flags[GHA]=$'\U1F1EC\U1F1ED'
emoji_flags[ghana]=$'\U1F1EC\U1F1ED'
emoji_flags[Gibraltar]=$'\U1F1EC\U1F1EE'
emoji_flags[GI]=$'\U1F1EC\U1F1EE'
emoji_flags[GIB]=$'\U1F1EC\U1F1EE'
emoji_flags[gibraltar]=$'\U1F1EC\U1F1EE'
emoji_flags[Greenland]=$'\U1F1EC\U1F1F1'
emoji_flags[GL]=$'\U1F1EC\U1F1F1'
emoji_flags[GRL]=$'\U1F1EC\U1F1F1'
emoji_flags[greenland]=$'\U1F1EC\U1F1F1'
emoji_flags[Gambia]=$'\U1F1EC\U1F1F2'
emoji_flags[GM]=$'\U1F1EC\U1F1F2'
emoji_flags[GMB]=$'\U1F1EC\U1F1F2'
emoji_flags[gambia]=$'\U1F1EC\U1F1F2'
emoji_flags[Guinea]=$'\U1F1EC\U1F1F3'
emoji_flags[GN]=$'\U1F1EC\U1F1F3'
emoji_flags[GIN]=$'\U1F1EC\U1F1F3'
emoji_flags[guinea]=$'\U1F1EC\U1F1F3'
emoji_flags[Guadeloupe]=$'\U1F1EC\U1F1F5'
emoji_flags[GP]=$'\U1F1EC\U1F1F5'
emoji_flags[GLP]=$'\U1F1EC\U1F1F5'
emoji_flags[guadeloupe]=$'\U1F1EC\U1F1F5'
emoji_flags[Equatorial_Guinea]=$'\U1F1EC\U1F1F6'
emoji_flags[GQ]=$'\U1F1EC\U1F1F6'
emoji_flags[GNQ]=$'\U1F1EC\U1F1F6'
emoji_flags[equatorial_guinea]=$'\U1F1EC\U1F1F6'
emoji_flags[Greece]=$'\U1F1EC\U1F1F7'
emoji_flags[GR]=$'\U1F1EC\U1F1F7'
emoji_flags[GRC]=$'\U1F1EC\U1F1F7'
emoji_flags[greece]=$'\U1F1EC\U1F1F7'
emoji_flags[South_Georgia_and_South_Sandwich_Islands]=$'\U1F1EC\U1F1F8'
emoji_flags[GS]=$'\U1F1EC\U1F1F8'
emoji_flags[SGS]=$'\U1F1EC\U1F1F8'
emoji_flags[south_georgia_south_sandwich_islands]=$'\U1F1EC\U1F1F8'
emoji_flags[Guatemala]=$'\U1F1EC\U1F1F9'
emoji_flags[GT]=$'\U1F1EC\U1F1F9'
emoji_flags[GTM]=$'\U1F1EC\U1F1F9'
emoji_flags[guatemala]=$'\U1F1EC\U1F1F9'
emoji_flags[Guam]=$'\U1F1EC\U1F1FA'
emoji_flags[GU]=$'\U1F1EC\U1F1FA'
emoji_flags[GUM]=$'\U1F1EC\U1F1FA'
emoji_flags[guam]=$'\U1F1EC\U1F1FA'
emoji_flags[Guinea_Bissau]=$'\U1F1EC\U1F1FC'
emoji_flags[GW]=$'\U1F1EC\U1F1FC'
emoji_flags[GNB]=$'\U1F1EC\U1F1FC'
emoji_flags[guinea_bissau]=$'\U1F1EC\U1F1FC'
emoji_flags[Guyana]=$'\U1F1EC\U1F1FE'
emoji_flags[GY]=$'\U1F1EC\U1F1FE'
emoji_flags[GUY]=$'\U1F1EC\U1F1FE'
emoji_flags[guyana]=$'\U1F1EC\U1F1FE'
emoji_flags[Hong_Kong_SAR_China]=$'\U1F1ED\U1F1F0'
emoji_flags[HK]=$'\U1F1ED\U1F1F0'
emoji_flags[HKG]=$'\U1F1ED\U1F1F0'
emoji_flags[hong_kong]=$'\U1F1ED\U1F1F0'
emoji_flags[Heard_and_McDonald_Islands]=$'\U1F1ED\U1F1F2'
emoji_flags[HM]=$'\U1F1ED\U1F1F2'
emoji_flags[HMD]=$'\U1F1ED\U1F1F2'
emoji_flags[heard_mcdonald_islands]=$'\U1F1ED\U1F1F2'
emoji_flags[Honduras]=$'\U1F1ED\U1F1F3'
emoji_flags[HN]=$'\U1F1ED\U1F1F3'
emoji_flags[HND]=$'\U1F1ED\U1F1F3'
emoji_flags[honduras]=$'\U1F1ED\U1F1F3'
emoji_flags[Croatia]=$'\U1F1ED\U1F1F7'
emoji_flags[HR]=$'\U1F1ED\U1F1F7'
emoji_flags[HRV]=$'\U1F1ED\U1F1F7'
emoji_flags[croatia]=$'\U1F1ED\U1F1F7'
emoji_flags[Haiti]=$'\U1F1ED\U1F1F9'
emoji_flags[HT]=$'\U1F1ED\U1F1F9'
emoji_flags[HTI]=$'\U1F1ED\U1F1F9'
emoji_flags[haiti]=$'\U1F1ED\U1F1F9'
emoji_flags[Hungary]=$'\U1F1ED\U1F1FA'
emoji_flags[HU]=$'\U1F1ED\U1F1FA'
emoji_flags[HUN]=$'\U1F1ED\U1F1FA'
emoji_flags[hungary]=$'\U1F1ED\U1F1FA'
emoji_flags[Canary_Islands]=$'\U1F1EE\U1F1E8'
emoji_flags[canary_islands]=$'\U1F1EE\U1F1E8'
emoji_flags[Indonesia]=$'\U1F1EE\U1F1E9'
emoji_flags[ID]=$'\U1F1EE\U1F1E9'
emoji_flags[IDN]=$'\U1F1EE\U1F1E9'
emoji_flags[indonesia]=$'\U1F1EE\U1F1E9'
emoji_flags[Ireland]=$'\U1F1EE\U1F1EA'
emoji_flags[IE]=$'\U1F1EE\U1F1EA'
emoji_flags[IRL]=$'\U1F1EE\U1F1EA'
emoji_flags[ireland]=$'\U1F1EE\U1F1EA'
emoji_flags[Israel]=$'\U1F1EE\U1F1F1'
emoji_flags[IL]=$'\U1F1EE\U1F1F1'
emoji_flags[ISR]=$'\U1F1EE\U1F1F1'
emoji_flags[israel]=$'\U1F1EE\U1F1F1'
emoji_flags[Isle_of_Man]=$'\U1F1EE\U1F1F2'
emoji_flags[IM]=$'\U1F1EE\U1F1F2'
emoji_flags[IMN]=$'\U1F1EE\U1F1F2'
emoji_flags[isle_of_man]=$'\U1F1EE\U1F1F2'
emoji_flags[India]=$'\U1F1EE\U1F1F3'
emoji_flags[IN]=$'\U1F1EE\U1F1F3'
emoji_flags[IND]=$'\U1F1EE\U1F1F3'
emoji_flags[india]=$'\U1F1EE\U1F1F3'
emoji_flags[British_Indian_Ocean_Territory]=$'\U1F1EE\U1F1F4'
emoji_flags[IO]=$'\U1F1EE\U1F1F4'
emoji_flags[IOT]=$'\U1F1EE\U1F1F4'
emoji_flags[british_indian_ocean_territory]=$'\U1F1EE\U1F1F4'
emoji_flags[Iraq]=$'\U1F1EE\U1F1F6'
emoji_flags[IQ]=$'\U1F1EE\U1F1F6'
emoji_flags[IRQ]=$'\U1F1EE\U1F1F6'
emoji_flags[iraq]=$'\U1F1EE\U1F1F6'
emoji_flags[Iran]=$'\U1F1EE\U1F1F7'
emoji_flags[IR]=$'\U1F1EE\U1F1F7'
emoji_flags[IRN]=$'\U1F1EE\U1F1F7'
emoji_flags[iran]=$'\U1F1EE\U1F1F7'
emoji_flags[Iceland]=$'\U1F1EE\U1F1F8'
emoji_flags[IS]=$'\U1F1EE\U1F1F8'
emoji_flags[ISL]=$'\U1F1EE\U1F1F8'
emoji_flags[iceland]=$'\U1F1EE\U1F1F8'
emoji_flags[Italy]=$'\U1F1EE\U1F1F9'
emoji_flags[IT]=$'\U1F1EE\U1F1F9'
emoji_flags[ITA]=$'\U1F1EE\U1F1F9'
emoji_flags[it]=$'\U1F1EE\U1F1F9'
emoji_flags[Jersey]=$'\U1F1EF\U1F1EA'
emoji_flags[JE]=$'\U1F1EF\U1F1EA'
emoji_flags[JEY]=$'\U1F1EF\U1F1EA'
emoji_flags[jersey]=$'\U1F1EF\U1F1EA'
emoji_flags[Jamaica]=$'\U1F1EF\U1F1F2'
emoji_flags[JM]=$'\U1F1EF\U1F1F2'
emoji_flags[JAM]=$'\U1F1EF\U1F1F2'
emoji_flags[jamaica]=$'\U1F1EF\U1F1F2'
emoji_flags[Jordan]=$'\U1F1EF\U1F1F4'
emoji_flags[JO]=$'\U1F1EF\U1F1F4'
emoji_flags[JOR]=$'\U1F1EF\U1F1F4'
emoji_flags[jordan]=$'\U1F1EF\U1F1F4'
emoji_flags[Japan]=$'\U1F1EF\U1F1F5'
emoji_flags[JP]=$'\U1F1EF\U1F1F5'
emoji_flags[JPN]=$'\U1F1EF\U1F1F5'
emoji_flags[jp]=$'\U1F1EF\U1F1F5'
emoji_flags[Kenya]=$'\U1F1F0\U1F1EA'
emoji_flags[KE]=$'\U1F1F0\U1F1EA'
emoji_flags[KEN]=$'\U1F1F0\U1F1EA'
emoji_flags[kenya]=$'\U1F1F0\U1F1EA'
emoji_flags[Kyrgyzstan]=$'\U1F1F0\U1F1EC'
emoji_flags[KG]=$'\U1F1F0\U1F1EC'
emoji_flags[KGZ]=$'\U1F1F0\U1F1EC'
emoji_flags[kyrgyzstan]=$'\U1F1F0\U1F1EC'
emoji_flags[Cambodia]=$'\U1F1F0\U1F1ED'
emoji_flags[KH]=$'\U1F1F0\U1F1ED'
emoji_flags[KHM]=$'\U1F1F0\U1F1ED'
emoji_flags[cambodia]=$'\U1F1F0\U1F1ED'
emoji_flags[Kiribati]=$'\U1F1F0\U1F1EE'
emoji_flags[KI]=$'\U1F1F0\U1F1EE'
emoji_flags[KIR]=$'\U1F1F0\U1F1EE'
emoji_flags[kiribati]=$'\U1F1F0\U1F1EE'
emoji_flags[Comoros]=$'\U1F1F0\U1F1F2'
emoji_flags[KM]=$'\U1F1F0\U1F1F2'
emoji_flags[COM]=$'\U1F1F0\U1F1F2'
emoji_flags[comoros]=$'\U1F1F0\U1F1F2'
emoji_flags[St_Kitts_and_Nevis]=$'\U1F1F0\U1F1F3'
emoji_flags[KN]=$'\U1F1F0\U1F1F3'
emoji_flags[KNA]=$'\U1F1F0\U1F1F3'
emoji_flags[st_kitts_nevis]=$'\U1F1F0\U1F1F3'
emoji_flags[North_Korea]=$'\U1F1F0\U1F1F5'
emoji_flags[KP]=$'\U1F1F0\U1F1F5'
emoji_flags[PRK]=$'\U1F1F0\U1F1F5'
emoji_flags[north_korea]=$'\U1F1F0\U1F1F5'
emoji_flags[South_Korea]=$'\U1F1F0\U1F1F7'
emoji_flags[KR]=$'\U1F1F0\U1F1F7'
emoji_flags[KOR]=$'\U1F1F0\U1F1F7'
emoji_flags[kr]=$'\U1F1F0\U1F1F7'
emoji_flags[Kuwait]=$'\U1F1F0\U1F1FC'
emoji_flags[KW]=$'\U1F1F0\U1F1FC'
emoji_flags[KWT]=$'\U1F1F0\U1F1FC'
emoji_flags[kuwait]=$'\U1F1F0\U1F1FC'
emoji_flags[Cayman_Islands]=$'\U1F1F0\U1F1FE'
emoji_flags[KY]=$'\U1F1F0\U1F1FE'
emoji_flags[CYM]=$'\U1F1F0\U1F1FE'
emoji_flags[cayman_islands]=$'\U1F1F0\U1F1FE'
emoji_flags[Kazakhstan]=$'\U1F1F0\U1F1FF'
emoji_flags[KZ]=$'\U1F1F0\U1F1FF'
emoji_flags[KAZ]=$'\U1F1F0\U1F1FF'
emoji_flags[kazakhstan]=$'\U1F1F0\U1F1FF'
emoji_flags[Laos]=$'\U1F1F1\U1F1E6'
emoji_flags[LA]=$'\U1F1F1\U1F1E6'
emoji_flags[LAO]=$'\U1F1F1\U1F1E6'
emoji_flags[laos]=$'\U1F1F1\U1F1E6'
emoji_flags[Lebanon]=$'\U1F1F1\U1F1E7'
emoji_flags[LB]=$'\U1F1F1\U1F1E7'
emoji_flags[LBN]=$'\U1F1F1\U1F1E7'
emoji_flags[lebanon]=$'\U1F1F1\U1F1E7'
emoji_flags[St_Lucia]=$'\U1F1F1\U1F1E8'
emoji_flags[LC]=$'\U1F1F1\U1F1E8'
emoji_flags[LCA]=$'\U1F1F1\U1F1E8'
emoji_flags[st_lucia]=$'\U1F1F1\U1F1E8'
emoji_flags[Liechtenstein]=$'\U1F1F1\U1F1EE'
emoji_flags[LI]=$'\U1F1F1\U1F1EE'
emoji_flags[LIE]=$'\U1F1F1\U1F1EE'
emoji_flags[liechtenstein]=$'\U1F1F1\U1F1EE'
emoji_flags[Sri_Lanka]=$'\U1F1F1\U1F1F0'
emoji_flags[LK]=$'\U1F1F1\U1F1F0'
emoji_flags[LKA]=$'\U1F1F1\U1F1F0'
emoji_flags[sri_lanka]=$'\U1F1F1\U1F1F0'
emoji_flags[Liberia]=$'\U1F1F1\U1F1F7'
emoji_flags[LR]=$'\U1F1F1\U1F1F7'
emoji_flags[LBR]=$'\U1F1F1\U1F1F7'
emoji_flags[liberia]=$'\U1F1F1\U1F1F7'
emoji_flags[Lesotho]=$'\U1F1F1\U1F1F8'
emoji_flags[LS]=$'\U1F1F1\U1F1F8'
emoji_flags[LSO]=$'\U1F1F1\U1F1F8'
emoji_flags[lesotho]=$'\U1F1F1\U1F1F8'
emoji_flags[Lithuania]=$'\U1F1F1\U1F1F9'
emoji_flags[LT]=$'\U1F1F1\U1F1F9'
emoji_flags[LTU]=$'\U1F1F1\U1F1F9'
emoji_flags[lithuania]=$'\U1F1F1\U1F1F9'
emoji_flags[Luxembourg]=$'\U1F1F1\U1F1FA'
emoji_flags[LU]=$'\U1F1F1\U1F1FA'
emoji_flags[LUX]=$'\U1F1F1\U1F1FA'
emoji_flags[luxembourg]=$'\U1F1F1\U1F1FA'
emoji_flags[Latvia]=$'\U1F1F1\U1F1FB'
emoji_flags[LV]=$'\U1F1F1\U1F1FB'
emoji_flags[LVA]=$'\U1F1F1\U1F1FB'
emoji_flags[latvia]=$'\U1F1F1\U1F1FB'
emoji_flags[Libya]=$'\U1F1F1\U1F1FE'
emoji_flags[LY]=$'\U1F1F1\U1F1FE'
emoji_flags[LBY]=$'\U1F1F1\U1F1FE'
emoji_flags[libya]=$'\U1F1F1\U1F1FE'
emoji_flags[Morocco]=$'\U1F1F2\U1F1E6'
emoji_flags[MA]=$'\U1F1F2\U1F1E6'
emoji_flags[MAR]=$'\U1F1F2\U1F1E6'
emoji_flags[morocco]=$'\U1F1F2\U1F1E6'
emoji_flags[Monaco]=$'\U1F1F2\U1F1E8'
emoji_flags[MC]=$'\U1F1F2\U1F1E8'
emoji_flags[MCO]=$'\U1F1F2\U1F1E8'
emoji_flags[monaco]=$'\U1F1F2\U1F1E8'
emoji_flags[Moldova]=$'\U1F1F2\U1F1E9'
emoji_flags[MD]=$'\U1F1F2\U1F1E9'
emoji_flags[MDA]=$'\U1F1F2\U1F1E9'
emoji_flags[moldova]=$'\U1F1F2\U1F1E9'
emoji_flags[Montenegro]=$'\U1F1F2\U1F1EA'
emoji_flags[ME]=$'\U1F1F2\U1F1EA'
emoji_flags[MNE]=$'\U1F1F2\U1F1EA'
emoji_flags[montenegro]=$'\U1F1F2\U1F1EA'
emoji_flags[St_Martin]=$'\U1F1F2\U1F1EB'
emoji_flags[MF]=$'\U1F1F2\U1F1EB'
emoji_flags[MAF]=$'\U1F1F2\U1F1EB'
emoji_flags[st_martin]=$'\U1F1F2\U1F1EB'
emoji_flags[Madagascar]=$'\U1F1F2\U1F1EC'
emoji_flags[MG]=$'\U1F1F2\U1F1EC'
emoji_flags[MDG]=$'\U1F1F2\U1F1EC'
emoji_flags[madagascar]=$'\U1F1F2\U1F1EC'
emoji_flags[Marshall_Islands]=$'\U1F1F2\U1F1ED'
emoji_flags[MH]=$'\U1F1F2\U1F1ED'
emoji_flags[MHL]=$'\U1F1F2\U1F1ED'
emoji_flags[marshall_islands]=$'\U1F1F2\U1F1ED'
emoji_flags[Macedonia]=$'\U1F1F2\U1F1F0'
emoji_flags[MK]=$'\U1F1F2\U1F1F0'
emoji_flags[MKD]=$'\U1F1F2\U1F1F0'
emoji_flags[macedonia]=$'\U1F1F2\U1F1F0'
emoji_flags[Mali]=$'\U1F1F2\U1F1F1'
emoji_flags[ML]=$'\U1F1F2\U1F1F1'
emoji_flags[MLI]=$'\U1F1F2\U1F1F1'
emoji_flags[mali]=$'\U1F1F2\U1F1F1'
emoji_flags[Myanmar_Burma_]=$'\U1F1F2\U1F1F2'
emoji_flags[MM]=$'\U1F1F2\U1F1F2'
emoji_flags[MMR]=$'\U1F1F2\U1F1F2'
emoji_flags[myanmar]=$'\U1F1F2\U1F1F2'
emoji_flags[Mongolia]=$'\U1F1F2\U1F1F3'
emoji_flags[MN]=$'\U1F1F2\U1F1F3'
emoji_flags[MNG]=$'\U1F1F2\U1F1F3'
emoji_flags[mongolia]=$'\U1F1F2\U1F1F3'
emoji_flags[Macao_SAR_China]=$'\U1F1F2\U1F1F4'
emoji_flags[MO]=$'\U1F1F2\U1F1F4'
emoji_flags[MAC]=$'\U1F1F2\U1F1F4'
emoji_flags[macau]=$'\U1F1F2\U1F1F4'
emoji_flags[Northern_Mariana_Islands]=$'\U1F1F2\U1F1F5'
emoji_flags[MP]=$'\U1F1F2\U1F1F5'
emoji_flags[MNP]=$'\U1F1F2\U1F1F5'
emoji_flags[northern_mariana_islands]=$'\U1F1F2\U1F1F5'
emoji_flags[Martinique]=$'\U1F1F2\U1F1F6'
emoji_flags[MQ]=$'\U1F1F2\U1F1F6'
emoji_flags[MTQ]=$'\U1F1F2\U1F1F6'
emoji_flags[martinique]=$'\U1F1F2\U1F1F6'
emoji_flags[Mauritania]=$'\U1F1F2\U1F1F7'
emoji_flags[MR]=$'\U1F1F2\U1F1F7'
emoji_flags[MRT]=$'\U1F1F2\U1F1F7'
emoji_flags[mauritania]=$'\U1F1F2\U1F1F7'
emoji_flags[Montserrat]=$'\U1F1F2\U1F1F8'
emoji_flags[MS]=$'\U1F1F2\U1F1F8'
emoji_flags[MSR]=$'\U1F1F2\U1F1F8'
emoji_flags[montserrat]=$'\U1F1F2\U1F1F8'
emoji_flags[Malta]=$'\U1F1F2\U1F1F9'
emoji_flags[MT]=$'\U1F1F2\U1F1F9'
emoji_flags[MLT]=$'\U1F1F2\U1F1F9'
emoji_flags[malta]=$'\U1F1F2\U1F1F9'
emoji_flags[Mauritius]=$'\U1F1F2\U1F1FA'
emoji_flags[MU]=$'\U1F1F2\U1F1FA'
emoji_flags[MUS]=$'\U1F1F2\U1F1FA'
emoji_flags[mauritius]=$'\U1F1F2\U1F1FA'
emoji_flags[Maldives]=$'\U1F1F2\U1F1FB'
emoji_flags[MV]=$'\U1F1F2\U1F1FB'
emoji_flags[MDV]=$'\U1F1F2\U1F1FB'
emoji_flags[maldives]=$'\U1F1F2\U1F1FB'
emoji_flags[Malawi]=$'\U1F1F2\U1F1FC'
emoji_flags[MW]=$'\U1F1F2\U1F1FC'
emoji_flags[MWI]=$'\U1F1F2\U1F1FC'
emoji_flags[malawi]=$'\U1F1F2\U1F1FC'
emoji_flags[Mexico]=$'\U1F1F2\U1F1FD'
emoji_flags[MX]=$'\U1F1F2\U1F1FD'
emoji_flags[MEX]=$'\U1F1F2\U1F1FD'
emoji_flags[mexico]=$'\U1F1F2\U1F1FD'
emoji_flags[Malaysia]=$'\U1F1F2\U1F1FE'
emoji_flags[MY]=$'\U1F1F2\U1F1FE'
emoji_flags[MYS]=$'\U1F1F2\U1F1FE'
emoji_flags[malaysia]=$'\U1F1F2\U1F1FE'
emoji_flags[Mozambique]=$'\U1F1F2\U1F1FF'
emoji_flags[MZ]=$'\U1F1F2\U1F1FF'
emoji_flags[MOZ]=$'\U1F1F2\U1F1FF'
emoji_flags[mozambique]=$'\U1F1F2\U1F1FF'
emoji_flags[Namibia]=$'\U1F1F3\U1F1E6'
emoji_flags[NA]=$'\U1F1F3\U1F1E6'
emoji_flags[NAM]=$'\U1F1F3\U1F1E6'
emoji_flags[namibia]=$'\U1F1F3\U1F1E6'
emoji_flags[New_Caledonia]=$'\U1F1F3\U1F1E8'
emoji_flags[NC]=$'\U1F1F3\U1F1E8'
emoji_flags[NCL]=$'\U1F1F3\U1F1E8'
emoji_flags[new_caledonia]=$'\U1F1F3\U1F1E8'
emoji_flags[Niger]=$'\U1F1F3\U1F1EA'
emoji_flags[NE]=$'\U1F1F3\U1F1EA'
emoji_flags[NER]=$'\U1F1F3\U1F1EA'
emoji_flags[niger]=$'\U1F1F3\U1F1EA'
emoji_flags[Norfolk_Island]=$'\U1F1F3\U1F1EB'
emoji_flags[NF]=$'\U1F1F3\U1F1EB'
emoji_flags[NFK]=$'\U1F1F3\U1F1EB'
emoji_flags[norfolk_island]=$'\U1F1F3\U1F1EB'
emoji_flags[Nigeria]=$'\U1F1F3\U1F1EC'
emoji_flags[NG]=$'\U1F1F3\U1F1EC'
emoji_flags[NGA]=$'\U1F1F3\U1F1EC'
emoji_flags[nigeria]=$'\U1F1F3\U1F1EC'
emoji_flags[Nicaragua]=$'\U1F1F3\U1F1EE'
emoji_flags[NI]=$'\U1F1F3\U1F1EE'
emoji_flags[NIC]=$'\U1F1F3\U1F1EE'
emoji_flags[nicaragua]=$'\U1F1F3\U1F1EE'
emoji_flags[Netherlands]=$'\U1F1F3\U1F1F1'
emoji_flags[NL]=$'\U1F1F3\U1F1F1'
emoji_flags[NLD]=$'\U1F1F3\U1F1F1'
emoji_flags[netherlands]=$'\U1F1F3\U1F1F1'
emoji_flags[Norway]=$'\U1F1F3\U1F1F4'
emoji_flags[NO]=$'\U1F1F3\U1F1F4'
emoji_flags[NOR]=$'\U1F1F3\U1F1F4'
emoji_flags[norway]=$'\U1F1F3\U1F1F4'
emoji_flags[Nepal]=$'\U1F1F3\U1F1F5'
emoji_flags[NP]=$'\U1F1F3\U1F1F5'
emoji_flags[NPL]=$'\U1F1F3\U1F1F5'
emoji_flags[nepal]=$'\U1F1F3\U1F1F5'
emoji_flags[Nauru]=$'\U1F1F3\U1F1F7'
emoji_flags[NR]=$'\U1F1F3\U1F1F7'
emoji_flags[NRU]=$'\U1F1F3\U1F1F7'
emoji_flags[nauru]=$'\U1F1F3\U1F1F7'
emoji_flags[Niue]=$'\U1F1F3\U1F1FA'
emoji_flags[NU]=$'\U1F1F3\U1F1FA'
emoji_flags[NIU]=$'\U1F1F3\U1F1FA'
emoji_flags[niue]=$'\U1F1F3\U1F1FA'
emoji_flags[New_Zealand]=$'\U1F1F3\U1F1FF'
emoji_flags[NZ]=$'\U1F1F3\U1F1FF'
emoji_flags[NZL]=$'\U1F1F3\U1F1FF'
emoji_flags[new_zealand]=$'\U1F1F3\U1F1FF'
emoji_flags[Oman]=$'\U1F1F4\U1F1F2'
emoji_flags[OM]=$'\U1F1F4\U1F1F2'
emoji_flags[OMN]=$'\U1F1F4\U1F1F2'
emoji_flags[oman]=$'\U1F1F4\U1F1F2'
emoji_flags[Panama]=$'\U1F1F5\U1F1E6'
emoji_flags[PA]=$'\U1F1F5\U1F1E6'
emoji_flags[PAN]=$'\U1F1F5\U1F1E6'
emoji_flags[panama]=$'\U1F1F5\U1F1E6'
emoji_flags[Peru]=$'\U1F1F5\U1F1EA'
emoji_flags[PE]=$'\U1F1F5\U1F1EA'
emoji_flags[PER]=$'\U1F1F5\U1F1EA'
emoji_flags[peru]=$'\U1F1F5\U1F1EA'
emoji_flags[French_Polynesia]=$'\U1F1F5\U1F1EB'
emoji_flags[PF]=$'\U1F1F5\U1F1EB'
emoji_flags[PYF]=$'\U1F1F5\U1F1EB'
emoji_flags[french_polynesia]=$'\U1F1F5\U1F1EB'
emoji_flags[Papua_New_Guinea]=$'\U1F1F5\U1F1EC'
emoji_flags[PG]=$'\U1F1F5\U1F1EC'
emoji_flags[PNG]=$'\U1F1F5\U1F1EC'
emoji_flags[papua_new_guinea]=$'\U1F1F5\U1F1EC'
emoji_flags[Philippines]=$'\U1F1F5\U1F1ED'
emoji_flags[PH]=$'\U1F1F5\U1F1ED'
emoji_flags[PHL]=$'\U1F1F5\U1F1ED'
emoji_flags[philippines]=$'\U1F1F5\U1F1ED'
emoji_flags[Pakistan]=$'\U1F1F5\U1F1F0'
emoji_flags[PK]=$'\U1F1F5\U1F1F0'
emoji_flags[PAK]=$'\U1F1F5\U1F1F0'
emoji_flags[pakistan]=$'\U1F1F5\U1F1F0'
emoji_flags[Poland]=$'\U1F1F5\U1F1F1'
emoji_flags[PL]=$'\U1F1F5\U1F1F1'
emoji_flags[POL]=$'\U1F1F5\U1F1F1'
emoji_flags[poland]=$'\U1F1F5\U1F1F1'
emoji_flags[St_Pierre_and_Miquelon]=$'\U1F1F5\U1F1F2'
emoji_flags[PM]=$'\U1F1F5\U1F1F2'
emoji_flags[SPM]=$'\U1F1F5\U1F1F2'
emoji_flags[st_pierre_miquelon]=$'\U1F1F5\U1F1F2'
emoji_flags[Pitcairn_Islands]=$'\U1F1F5\U1F1F3'
emoji_flags[PN]=$'\U1F1F5\U1F1F3'
emoji_flags[PCN]=$'\U1F1F5\U1F1F3'
emoji_flags[pitcairn_islands]=$'\U1F1F5\U1F1F3'
emoji_flags[Puerto_Rico]=$'\U1F1F5\U1F1F7'
emoji_flags[PR]=$'\U1F1F5\U1F1F7'
emoji_flags[PRI]=$'\U1F1F5\U1F1F7'
emoji_flags[puerto_rico]=$'\U1F1F5\U1F1F7'
emoji_flags[Palestinian_Territories]=$'\U1F1F5\U1F1F8'
emoji_flags[PS]=$'\U1F1F5\U1F1F8'
emoji_flags[PSE]=$'\U1F1F5\U1F1F8'
emoji_flags[palestinian_territories]=$'\U1F1F5\U1F1F8'
emoji_flags[Portugal]=$'\U1F1F5\U1F1F9'
emoji_flags[PT]=$'\U1F1F5\U1F1F9'
emoji_flags[PRT]=$'\U1F1F5\U1F1F9'
emoji_flags[portugal]=$'\U1F1F5\U1F1F9'
emoji_flags[Palau]=$'\U1F1F5\U1F1FC'
emoji_flags[PW]=$'\U1F1F5\U1F1FC'
emoji_flags[PLW]=$'\U1F1F5\U1F1FC'
emoji_flags[palau]=$'\U1F1F5\U1F1FC'
emoji_flags[Paraguay]=$'\U1F1F5\U1F1FE'
emoji_flags[PY]=$'\U1F1F5\U1F1FE'
emoji_flags[PRY]=$'\U1F1F5\U1F1FE'
emoji_flags[paraguay]=$'\U1F1F5\U1F1FE'
emoji_flags[Qatar]=$'\U1F1F6\U1F1E6'
emoji_flags[QA]=$'\U1F1F6\U1F1E6'
emoji_flags[QAT]=$'\U1F1F6\U1F1E6'
emoji_flags[qatar]=$'\U1F1F6\U1F1E6'
emoji_flags[Réunion]=$'\U1F1F7\U1F1EA'
emoji_flags[RE]=$'\U1F1F7\U1F1EA'
emoji_flags[REU]=$'\U1F1F7\U1F1EA'
emoji_flags[reunion]=$'\U1F1F7\U1F1EA'
emoji_flags[Romania]=$'\U1F1F7\U1F1F4'
emoji_flags[RO]=$'\U1F1F7\U1F1F4'
emoji_flags[ROU]=$'\U1F1F7\U1F1F4'
emoji_flags[romania]=$'\U1F1F7\U1F1F4'
emoji_flags[Serbia]=$'\U1F1F7\U1F1F8'
emoji_flags[RS]=$'\U1F1F7\U1F1F8'
emoji_flags[SRB]=$'\U1F1F7\U1F1F8'
emoji_flags[serbia]=$'\U1F1F7\U1F1F8'
emoji_flags[Russia]=$'\U1F1F7\U1F1FA'
emoji_flags[RU]=$'\U1F1F7\U1F1FA'
emoji_flags[RUS]=$'\U1F1F7\U1F1FA'
emoji_flags[ru]=$'\U1F1F7\U1F1FA'
emoji_flags[Rwanda]=$'\U1F1F7\U1F1FC'
emoji_flags[RW]=$'\U1F1F7\U1F1FC'
emoji_flags[RWA]=$'\U1F1F7\U1F1FC'
emoji_flags[rwanda]=$'\U1F1F7\U1F1FC'
emoji_flags[Saudi_Arabia]=$'\U1F1F8\U1F1E6'
emoji_flags[SA]=$'\U1F1F8\U1F1E6'
emoji_flags[SAU]=$'\U1F1F8\U1F1E6'
emoji_flags[saudi_arabia]=$'\U1F1F8\U1F1E6'
emoji_flags[Solomon_Islands]=$'\U1F1F8\U1F1E7'
emoji_flags[SB]=$'\U1F1F8\U1F1E7'
emoji_flags[SLB]=$'\U1F1F8\U1F1E7'
emoji_flags[solomon_islands]=$'\U1F1F8\U1F1E7'
emoji_flags[Seychelles]=$'\U1F1F8\U1F1E8'
emoji_flags[SC]=$'\U1F1F8\U1F1E8'
emoji_flags[SYC]=$'\U1F1F8\U1F1E8'
emoji_flags[seychelles]=$'\U1F1F8\U1F1E8'
emoji_flags[Sudan]=$'\U1F1F8\U1F1E9'
emoji_flags[SD]=$'\U1F1F8\U1F1E9'
emoji_flags[SDN]=$'\U1F1F8\U1F1E9'
emoji_flags[sudan]=$'\U1F1F8\U1F1E9'
emoji_flags[Sweden]=$'\U1F1F8\U1F1EA'
emoji_flags[SE]=$'\U1F1F8\U1F1EA'
emoji_flags[SWE]=$'\U1F1F8\U1F1EA'
emoji_flags[sweden]=$'\U1F1F8\U1F1EA'
emoji_flags[Singapore]=$'\U1F1F8\U1F1EC'
emoji_flags[SG]=$'\U1F1F8\U1F1EC'
emoji_flags[SGP]=$'\U1F1F8\U1F1EC'
emoji_flags[singapore]=$'\U1F1F8\U1F1EC'
emoji_flags[St_Helena]=$'\U1F1F8\U1F1ED'
emoji_flags[SH]=$'\U1F1F8\U1F1ED'
emoji_flags[SHN]=$'\U1F1F8\U1F1ED'
emoji_flags[st_helena]=$'\U1F1F8\U1F1ED'
emoji_flags[Slovenia]=$'\U1F1F8\U1F1EE'
emoji_flags[SI]=$'\U1F1F8\U1F1EE'
emoji_flags[SVN]=$'\U1F1F8\U1F1EE'
emoji_flags[slovenia]=$'\U1F1F8\U1F1EE'
emoji_flags[Svalbard_and_Jan_Mayen]=$'\U1F1F8\U1F1EF'
emoji_flags[SJ]=$'\U1F1F8\U1F1EF'
emoji_flags[SJM]=$'\U1F1F8\U1F1EF'
emoji_flags[svalbard_jan_mayen]=$'\U1F1F8\U1F1EF'
emoji_flags[Slovakia]=$'\U1F1F8\U1F1F0'
emoji_flags[SK]=$'\U1F1F8\U1F1F0'
emoji_flags[SVK]=$'\U1F1F8\U1F1F0'
emoji_flags[slovakia]=$'\U1F1F8\U1F1F0'
emoji_flags[Sierra_Leone]=$'\U1F1F8\U1F1F1'
emoji_flags[SL]=$'\U1F1F8\U1F1F1'
emoji_flags[SLE]=$'\U1F1F8\U1F1F1'
emoji_flags[sierra_leone]=$'\U1F1F8\U1F1F1'
emoji_flags[San_Marino]=$'\U1F1F8\U1F1F2'
emoji_flags[SM]=$'\U1F1F8\U1F1F2'
emoji_flags[SMR]=$'\U1F1F8\U1F1F2'
emoji_flags[san_marino]=$'\U1F1F8\U1F1F2'
emoji_flags[Senegal]=$'\U1F1F8\U1F1F3'
emoji_flags[SN]=$'\U1F1F8\U1F1F3'
emoji_flags[SEN]=$'\U1F1F8\U1F1F3'
emoji_flags[senegal]=$'\U1F1F8\U1F1F3'
emoji_flags[Somalia]=$'\U1F1F8\U1F1F4'
emoji_flags[SO]=$'\U1F1F8\U1F1F4'
emoji_flags[SOM]=$'\U1F1F8\U1F1F4'
emoji_flags[somalia]=$'\U1F1F8\U1F1F4'
emoji_flags[Suriname]=$'\U1F1F8\U1F1F7'
emoji_flags[SR]=$'\U1F1F8\U1F1F7'
emoji_flags[SUR]=$'\U1F1F8\U1F1F7'
emoji_flags[suriname]=$'\U1F1F8\U1F1F7'
emoji_flags[South_Sudan]=$'\U1F1F8\U1F1F8'
emoji_flags[SS]=$'\U1F1F8\U1F1F8'
emoji_flags[SSD]=$'\U1F1F8\U1F1F8'
emoji_flags[south_sudan]=$'\U1F1F8\U1F1F8'
emoji_flags[São_Tomé_and_Príncipe]=$'\U1F1F8\U1F1F9'
emoji_flags[sao_tome_principe]=$'\U1F1F8\U1F1F9'
emoji_flags[El_Salvador]=$'\U1F1F8\U1F1FB'
emoji_flags[SV]=$'\U1F1F8\U1F1FB'
emoji_flags[SLV]=$'\U1F1F8\U1F1FB'
emoji_flags[el_salvador]=$'\U1F1F8\U1F1FB'
emoji_flags[Sint_Maarten]=$'\U1F1F8\U1F1FD'
emoji_flags[SX]=$'\U1F1F8\U1F1FD'
emoji_flags[SXM]=$'\U1F1F8\U1F1FD'
emoji_flags[sint_maarten]=$'\U1F1F8\U1F1FD'
emoji_flags[Syria]=$'\U1F1F8\U1F1FE'
emoji_flags[SY]=$'\U1F1F8\U1F1FE'
emoji_flags[SYR]=$'\U1F1F8\U1F1FE'
emoji_flags[syria]=$'\U1F1F8\U1F1FE'
emoji_flags[Eswatini]=$'\U1F1F8\U1F1FF'
emoji_flags[SZ]=$'\U1F1F8\U1F1FF'
emoji_flags[SWZ]=$'\U1F1F8\U1F1FF'
emoji_flags[swaziland]=$'\U1F1F8\U1F1FF'
emoji_flags[Tristan_da_Cunha]=$'\U1F1F9\U1F1E6'
emoji_flags[tristan_da_cunha]=$'\U1F1F9\U1F1E6'
emoji_flags[Turks_and_Caicos_Islands]=$'\U1F1F9\U1F1E8'
emoji_flags[TC]=$'\U1F1F9\U1F1E8'
emoji_flags[TCA]=$'\U1F1F9\U1F1E8'
emoji_flags[turks_caicos_islands]=$'\U1F1F9\U1F1E8'
emoji_flags[Chad]=$'\U1F1F9\U1F1E9'
emoji_flags[TD]=$'\U1F1F9\U1F1E9'
emoji_flags[TCD]=$'\U1F1F9\U1F1E9'
emoji_flags[chad]=$'\U1F1F9\U1F1E9'
emoji_flags[French_Southern_Territories]=$'\U1F1F9\U1F1EB'
emoji_flags[TF]=$'\U1F1F9\U1F1EB'
emoji_flags[ATF]=$'\U1F1F9\U1F1EB'
emoji_flags[french_southern_territories]=$'\U1F1F9\U1F1EB'
emoji_flags[Togo]=$'\U1F1F9\U1F1EC'
emoji_flags[TG]=$'\U1F1F9\U1F1EC'
emoji_flags[TGO]=$'\U1F1F9\U1F1EC'
emoji_flags[togo]=$'\U1F1F9\U1F1EC'
emoji_flags[Thailand]=$'\U1F1F9\U1F1ED'
emoji_flags[TH]=$'\U1F1F9\U1F1ED'
emoji_flags[THA]=$'\U1F1F9\U1F1ED'
emoji_flags[thailand]=$'\U1F1F9\U1F1ED'
emoji_flags[Tajikistan]=$'\U1F1F9\U1F1EF'
emoji_flags[TJ]=$'\U1F1F9\U1F1EF'
emoji_flags[TJK]=$'\U1F1F9\U1F1EF'
emoji_flags[tajikistan]=$'\U1F1F9\U1F1EF'
emoji_flags[Tokelau]=$'\U1F1F9\U1F1F0'
emoji_flags[TK]=$'\U1F1F9\U1F1F0'
emoji_flags[TKL]=$'\U1F1F9\U1F1F0'
emoji_flags[tokelau]=$'\U1F1F9\U1F1F0'
emoji_flags[Timor_Leste]=$'\U1F1F9\U1F1F1'
emoji_flags[TL]=$'\U1F1F9\U1F1F1'
emoji_flags[TLS]=$'\U1F1F9\U1F1F1'
emoji_flags[timor_leste]=$'\U1F1F9\U1F1F1'
emoji_flags[Turkmenistan]=$'\U1F1F9\U1F1F2'
emoji_flags[TM]=$'\U1F1F9\U1F1F2'
emoji_flags[TKM]=$'\U1F1F9\U1F1F2'
emoji_flags[turkmenistan]=$'\U1F1F9\U1F1F2'
emoji_flags[Tunisia]=$'\U1F1F9\U1F1F3'
emoji_flags[TN]=$'\U1F1F9\U1F1F3'
emoji_flags[TUN]=$'\U1F1F9\U1F1F3'
emoji_flags[tunisia]=$'\U1F1F9\U1F1F3'
emoji_flags[Tonga]=$'\U1F1F9\U1F1F4'
emoji_flags[TO]=$'\U1F1F9\U1F1F4'
emoji_flags[TON]=$'\U1F1F9\U1F1F4'
emoji_flags[tonga]=$'\U1F1F9\U1F1F4'
emoji_flags[Turkey]=$'\U1F1F9\U1F1F7'
emoji_flags[TR]=$'\U1F1F9\U1F1F7'
emoji_flags[TUR]=$'\U1F1F9\U1F1F7'
emoji_flags[tr]=$'\U1F1F9\U1F1F7'
emoji_flags[Trinidad_and_Tobago]=$'\U1F1F9\U1F1F9'
emoji_flags[TT]=$'\U1F1F9\U1F1F9'
emoji_flags[TTO]=$'\U1F1F9\U1F1F9'
emoji_flags[trinidad_tobago]=$'\U1F1F9\U1F1F9'
emoji_flags[Tuvalu]=$'\U1F1F9\U1F1FB'
emoji_flags[TV]=$'\U1F1F9\U1F1FB'
emoji_flags[TUV]=$'\U1F1F9\U1F1FB'
emoji_flags[tuvalu]=$'\U1F1F9\U1F1FB'
emoji_flags[Taiwan]=$'\U1F1F9\U1F1FC'
emoji_flags[TW]=$'\U1F1F9\U1F1FC'
emoji_flags[TWN]=$'\U1F1F9\U1F1FC'
emoji_flags[taiwan]=$'\U1F1F9\U1F1FC'
emoji_flags[Tanzania]=$'\U1F1F9\U1F1FF'
emoji_flags[TZ]=$'\U1F1F9\U1F1FF'
emoji_flags[TZA]=$'\U1F1F9\U1F1FF'
emoji_flags[tanzania]=$'\U1F1F9\U1F1FF'
emoji_flags[Ukraine]=$'\U1F1FA\U1F1E6'
emoji_flags[UA]=$'\U1F1FA\U1F1E6'
emoji_flags[UKR]=$'\U1F1FA\U1F1E6'
emoji_flags[ukraine]=$'\U1F1FA\U1F1E6'
emoji_flags[Uganda]=$'\U1F1FA\U1F1EC'
emoji_flags[UG]=$'\U1F1FA\U1F1EC'
emoji_flags[UGA]=$'\U1F1FA\U1F1EC'
emoji_flags[uganda]=$'\U1F1FA\U1F1EC'
emoji_flags[U_S_Outlying_Islands]=$'\U1F1FA\U1F1F2'
emoji_flags[us_outlying_islands]=$'\U1F1FA\U1F1F2'
emoji_flags[United_Nations]=$'\U1F1FA\U1F1F3'
emoji_flags[united_nations]=$'\U1F1FA\U1F1F3'
emoji_flags[United_States]=$'\U1F1FA\U1F1F8'
emoji_flags[US]=$'\U1F1FA\U1F1F8'
emoji_flags[USA]=$'\U1F1FA\U1F1F8'
emoji_flags[us]=$'\U1F1FA\U1F1F8'
emoji_flags[Uruguay]=$'\U1F1FA\U1F1FE'
emoji_flags[UY]=$'\U1F1FA\U1F1FE'
emoji_flags[URY]=$'\U1F1FA\U1F1FE'
emoji_flags[uruguay]=$'\U1F1FA\U1F1FE'
emoji_flags[Uzbekistan]=$'\U1F1FA\U1F1FF'
emoji_flags[UZ]=$'\U1F1FA\U1F1FF'
emoji_flags[UZB]=$'\U1F1FA\U1F1FF'
emoji_flags[uzbekistan]=$'\U1F1FA\U1F1FF'
emoji_flags[Vatican_City]=$'\U1F1FB\U1F1E6'
emoji_flags[VA]=$'\U1F1FB\U1F1E6'
emoji_flags[VAT]=$'\U1F1FB\U1F1E6'
emoji_flags[vatican_city]=$'\U1F1FB\U1F1E6'
emoji_flags[St_Vincent_and_Grenadines]=$'\U1F1FB\U1F1E8'
emoji_flags[VC]=$'\U1F1FB\U1F1E8'
emoji_flags[VCT]=$'\U1F1FB\U1F1E8'
emoji_flags[st_vincent_grenadines]=$'\U1F1FB\U1F1E8'
emoji_flags[Venezuela]=$'\U1F1FB\U1F1EA'
emoji_flags[VE]=$'\U1F1FB\U1F1EA'
emoji_flags[VEN]=$'\U1F1FB\U1F1EA'
emoji_flags[venezuela]=$'\U1F1FB\U1F1EA'
emoji_flags[British_Virgin_Islands]=$'\U1F1FB\U1F1EC'
emoji_flags[VG]=$'\U1F1FB\U1F1EC'
emoji_flags[VGB]=$'\U1F1FB\U1F1EC'
emoji_flags[british_virgin_islands]=$'\U1F1FB\U1F1EC'
emoji_flags[U_S_Virgin_Islands]=$'\U1F1FB\U1F1EE'
emoji_flags[VI]=$'\U1F1FB\U1F1EE'
emoji_flags[VIR]=$'\U1F1FB\U1F1EE'
emoji_flags[us_virgin_islands]=$'\U1F1FB\U1F1EE'
emoji_flags[Vietnam]=$'\U1F1FB\U1F1F3'
emoji_flags[VN]=$'\U1F1FB\U1F1F3'
emoji_flags[VNM]=$'\U1F1FB\U1F1F3'
emoji_flags[vietnam]=$'\U1F1FB\U1F1F3'
emoji_flags[Vanuatu]=$'\U1F1FB\U1F1FA'
emoji_flags[VU]=$'\U1F1FB\U1F1FA'
emoji_flags[VUT]=$'\U1F1FB\U1F1FA'
emoji_flags[vanuatu]=$'\U1F1FB\U1F1FA'
emoji_flags[Wallis_and_Futuna]=$'\U1F1FC\U1F1EB'
emoji_flags[WF]=$'\U1F1FC\U1F1EB'
emoji_flags[WLF]=$'\U1F1FC\U1F1EB'
emoji_flags[wallis_futuna]=$'\U1F1FC\U1F1EB'
emoji_flags[Samoa]=$'\U1F1FC\U1F1F8'
emoji_flags[WS]=$'\U1F1FC\U1F1F8'
emoji_flags[WSM]=$'\U1F1FC\U1F1F8'
emoji_flags[samoa]=$'\U1F1FC\U1F1F8'
emoji_flags[Kosovo]=$'\U1F1FD\U1F1F0'
emoji_flags[XK]=$'\U1F1FD\U1F1F0'
emoji_flags[XKX]=$'\U1F1FD\U1F1F0'
emoji_flags[kosovo]=$'\U1F1FD\U1F1F0'
emoji_flags[Yemen]=$'\U1F1FE\U1F1EA'
emoji_flags[YE]=$'\U1F1FE\U1F1EA'
emoji_flags[YEM]=$'\U1F1FE\U1F1EA'
emoji_flags[yemen]=$'\U1F1FE\U1F1EA'
emoji_flags[Mayotte]=$'\U1F1FE\U1F1F9'
emoji_flags[YT]=$'\U1F1FE\U1F1F9'
emoji_flags[MYT]=$'\U1F1FE\U1F1F9'
emoji_flags[mayotte]=$'\U1F1FE\U1F1F9'
emoji_flags[South_Africa]=$'\U1F1FF\U1F1E6'
emoji_flags[ZA]=$'\U1F1FF\U1F1E6'
emoji_flags[ZAF]=$'\U1F1FF\U1F1E6'
emoji_flags[south_africa]=$'\U1F1FF\U1F1E6'
emoji_flags[Zambia]=$'\U1F1FF\U1F1F2'
emoji_flags[ZM]=$'\U1F1FF\U1F1F2'
emoji_flags[ZMB]=$'\U1F1FF\U1F1F2'
emoji_flags[zambia]=$'\U1F1FF\U1F1F2'
emoji_flags[Zimbabwe]=$'\U1F1FF\U1F1FC'
emoji_flags[ZW]=$'\U1F1FF\U1F1FC'
emoji_flags[ZWE]=$'\U1F1FF\U1F1FC'
emoji_flags[zimbabwe]=$'\U1F1FF\U1F1FC'
emoji_flags[England]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F'
emoji_flags[england]=$'\U1F3F4\UE0067\UE0062\UE0065\UE006E\UE0067\UE007F'
emoji_flags[Scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F'
emoji_flags[scotland]=$'\U1F3F4\UE0067\UE0062\UE0073\UE0063\UE0074\UE007F'
emoji_flags[Wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F'
emoji_flags[wales]=$'\U1F3F4\UE0067\UE0062\UE0077\UE006C\UE0073\UE007F'
emoji_groups[fruits]="
grapes
melon
watermelon
tangerine
lemon
banana
pineapple
mango
red_apple
green_apple
pear
peach
cherries
strawberry
kiwi_fruit
tomato
coconut
"
emoji_groups[vehicles]="
locomotive
railway_car
high_speed_train
bullet_train
bullet_train_1
metro
light_rail
station
tram
monorail
mountain_railway
tram_car
bus
oncoming_bus
trolleybus
minibus
ambulance
fire_engine
police_car
oncoming_police_car
taxi
oncoming_taxi
automobile
oncoming_automobile
sport_utility_vehicle
delivery_truck
articulated_lorry
tractor
racing_car
motorcycle
motor_scooter
manual_wheelchair
motorized_wheelchair
auto_rickshaw
bicycle
kick_scooter
skateboard
bus_stop
motorway
railway_track
oil_drum
fuel_pump
police_car_light
horizontal_traffic_light
vertical_traffic_light
stop_sign
construction
anchor
sailboat
canoe
speedboat
passenger_ship
ferry
motor_boat
ship
airplane
small_airplane
airplane_departure
airplane_arrival
parachute
seat
helicopter
suspension_railway
mountain_cableway
aerial_tramway
satellite
rocket
flying_saucer
ATM_sign
litter_in_bin_sign
potable_water
wheelchair_symbol
men_s_room
women_s_room
restroom
baby_symbol
water_closet
passport_control
customs
baggage_claim
left_luggage
"
emoji_groups[hands]="
waving_hand
waving_hand_light_skin_tone
waving_hand_medium_light_skin_tone
waving_hand_medium_skin_tone
waving_hand_medium_dark_skin_tone
waving_hand_dark_skin_tone
raised_back_of_hand
raised_back_of_hand_light_skin_tone
raised_back_of_hand_medium_light_skin_tone
raised_back_of_hand_medium_skin_tone
raised_back_of_hand_medium_dark_skin_tone
raised_back_of_hand_dark_skin_tone
hand_with_fingers_splayed
hand_with_fingers_splayed_light_skin_tone
hand_with_fingers_splayed_medium_light_skin_tone
hand_with_fingers_splayed_medium_skin_tone
hand_with_fingers_splayed_medium_dark_skin_tone
hand_with_fingers_splayed_dark_skin_tone
raised_hand
raised_hand_light_skin_tone
raised_hand_medium_light_skin_tone
raised_hand_medium_skin_tone
raised_hand_medium_dark_skin_tone
raised_hand_dark_skin_tone
vulcan_salute
vulcan_salute_light_skin_tone
vulcan_salute_medium_light_skin_tone
vulcan_salute_medium_skin_tone
vulcan_salute_medium_dark_skin_tone
vulcan_salute_dark_skin_tone
OK_hand
OK_hand_light_skin_tone
OK_hand_medium_light_skin_tone
OK_hand_medium_skin_tone
OK_hand_medium_dark_skin_tone
OK_hand_dark_skin_tone
pinching_hand
pinching_hand_light_skin_tone
pinching_hand_medium_light_skin_tone
pinching_hand_medium_skin_tone
pinching_hand_medium_dark_skin_tone
pinching_hand_dark_skin_tone
victory_hand
victory_hand_light_skin_tone
victory_hand_medium_light_skin_tone
victory_hand_medium_skin_tone
victory_hand_medium_dark_skin_tone
victory_hand_dark_skin_tone
crossed_fingers
crossed_fingers_light_skin_tone
crossed_fingers_medium_light_skin_tone
crossed_fingers_medium_skin_tone
crossed_fingers_medium_dark_skin_tone
crossed_fingers_dark_skin_tone
love_you_gesture
love_you_gesture_light_skin_tone
love_you_gesture_medium_light_skin_tone
love_you_gesture_medium_skin_tone
love_you_gesture_medium_dark_skin_tone
love_you_gesture_dark_skin_tone
sign_of_the_horns
sign_of_the_horns_light_skin_tone
sign_of_the_horns_medium_light_skin_tone
sign_of_the_horns_medium_skin_tone
sign_of_the_horns_medium_dark_skin_tone
sign_of_the_horns_dark_skin_tone
call_me_hand
call_me_hand_light_skin_tone
call_me_hand_medium_light_skin_tone
call_me_hand_medium_skin_tone
call_me_hand_medium_dark_skin_tone
call_me_hand_dark_skin_tone
backhand_index_pointing_left
backhand_index_pointing_left_light_skin_tone
backhand_index_pointing_left_medium_light_skin_tone
backhand_index_pointing_left_medium_skin_tone
backhand_index_pointing_left_medium_dark_skin_tone
backhand_index_pointing_left_dark_skin_tone
backhand_index_pointing_right
backhand_index_pointing_right_light_skin_tone
backhand_index_pointing_right_medium_light_skin_tone
backhand_index_pointing_right_medium_skin_tone
backhand_index_pointing_right_medium_dark_skin_tone
backhand_index_pointing_right_dark_skin_tone
backhand_index_pointing_up
backhand_index_pointing_up_light_skin_tone
backhand_index_pointing_up_medium_light_skin_tone
backhand_index_pointing_up_medium_skin_tone
backhand_index_pointing_up_medium_dark_skin_tone
backhand_index_pointing_up_dark_skin_tone
middle_finger
middle_finger_light_skin_tone
middle_finger_medium_light_skin_tone
middle_finger_medium_skin_tone
middle_finger_medium_dark_skin_tone
middle_finger_dark_skin_tone
backhand_index_pointing_down
backhand_index_pointing_down_light_skin_tone
backhand_index_pointing_down_medium_light_skin_tone
backhand_index_pointing_down_medium_skin_tone
backhand_index_pointing_down_medium_dark_skin_tone
backhand_index_pointing_down_dark_skin_tone
index_pointing_up
index_pointing_up_light_skin_tone
index_pointing_up_medium_light_skin_tone
index_pointing_up_medium_skin_tone
index_pointing_up_medium_dark_skin_tone
index_pointing_up_dark_skin_tone
thumbs_up
thumbs_up_light_skin_tone
thumbs_up_medium_light_skin_tone
thumbs_up_medium_skin_tone
thumbs_up_medium_dark_skin_tone
thumbs_up_dark_skin_tone
thumbs_down
thumbs_down_light_skin_tone
thumbs_down_medium_light_skin_tone
thumbs_down_medium_skin_tone
thumbs_down_medium_dark_skin_tone
thumbs_down_dark_skin_tone
raised_fist
raised_fist_light_skin_tone
raised_fist_medium_light_skin_tone
raised_fist_medium_skin_tone
raised_fist_medium_dark_skin_tone
raised_fist_dark_skin_tone
oncoming_fist
oncoming_fist_light_skin_tone
oncoming_fist_medium_light_skin_tone
oncoming_fist_medium_skin_tone
oncoming_fist_medium_dark_skin_tone
oncoming_fist_dark_skin_tone
left_facing_fist
left_facing_fist_light_skin_tone
left_facing_fist_medium_light_skin_tone
left_facing_fist_medium_skin_tone
left_facing_fist_medium_dark_skin_tone
left_facing_fist_dark_skin_tone
right_facing_fist
right_facing_fist_light_skin_tone
right_facing_fist_medium_light_skin_tone
right_facing_fist_medium_skin_tone
right_facing_fist_medium_dark_skin_tone
right_facing_fist_dark_skin_tone
writing_hand
writing_hand_light_skin_tone
writing_hand_medium_light_skin_tone
writing_hand_medium_skin_tone
writing_hand_medium_dark_skin_tone
writing_hand_dark_skin_tone
nail_polish
nail_polish_light_skin_tone
nail_polish_medium_light_skin_tone
nail_polish_medium_skin_tone
nail_polish_medium_dark_skin_tone
nail_polish_dark_skin_tone
selfie
selfie_light_skin_tone
selfie_medium_light_skin_tone
selfie_medium_skin_tone
selfie_medium_dark_skin_tone
selfie_dark_skin_tone
"
emoji_groups[people]="
person_frowning
person_frowning_light_skin_tone
person_frowning_medium_light_skin_tone
person_frowning_medium_skin_tone
person_frowning_medium_dark_skin_tone
person_frowning_dark_skin_tone
man_frowning
man_frowning_light_skin_tone
man_frowning_medium_light_skin_tone
man_frowning_medium_skin_tone
man_frowning_medium_dark_skin_tone
man_frowning_dark_skin_tone
woman_frowning
woman_frowning_light_skin_tone
woman_frowning_medium_light_skin_tone
woman_frowning_medium_skin_tone
woman_frowning_medium_dark_skin_tone
woman_frowning_dark_skin_tone
person_pouting
person_pouting_light_skin_tone
person_pouting_medium_light_skin_tone
person_pouting_medium_skin_tone
person_pouting_medium_dark_skin_tone
person_pouting_dark_skin_tone
man_pouting
man_pouting_light_skin_tone
man_pouting_medium_light_skin_tone
man_pouting_medium_skin_tone
man_pouting_medium_dark_skin_tone
man_pouting_dark_skin_tone
woman_pouting
woman_pouting_light_skin_tone
woman_pouting_medium_light_skin_tone
woman_pouting_medium_skin_tone
woman_pouting_medium_dark_skin_tone
woman_pouting_dark_skin_tone
person_gesturing_NO
person_gesturing_NO_light_skin_tone
person_gesturing_NO_medium_light_skin_tone
person_gesturing_NO_medium_skin_tone
person_gesturing_NO_medium_dark_skin_tone
person_gesturing_NO_dark_skin_tone
man_gesturing_NO
man_gesturing_NO_light_skin_tone
man_gesturing_NO_medium_light_skin_tone
man_gesturing_NO_medium_skin_tone
man_gesturing_NO_medium_dark_skin_tone
man_gesturing_NO_dark_skin_tone
woman_gesturing_NO
woman_gesturing_NO_light_skin_tone
woman_gesturing_NO_medium_light_skin_tone
woman_gesturing_NO_medium_skin_tone
woman_gesturing_NO_medium_dark_skin_tone
woman_gesturing_NO_dark_skin_tone
person_gesturing_OK
person_gesturing_OK_light_skin_tone
person_gesturing_OK_medium_light_skin_tone
person_gesturing_OK_medium_skin_tone
person_gesturing_OK_medium_dark_skin_tone
person_gesturing_OK_dark_skin_tone
man_gesturing_OK
man_gesturing_OK_light_skin_tone
man_gesturing_OK_medium_light_skin_tone
man_gesturing_OK_medium_skin_tone
man_gesturing_OK_medium_dark_skin_tone
man_gesturing_OK_dark_skin_tone
woman_gesturing_OK
woman_gesturing_OK_light_skin_tone
woman_gesturing_OK_medium_light_skin_tone
woman_gesturing_OK_medium_skin_tone
woman_gesturing_OK_medium_dark_skin_tone
woman_gesturing_OK_dark_skin_tone
person_tipping_hand
person_tipping_hand_light_skin_tone
person_tipping_hand_medium_light_skin_tone
person_tipping_hand_medium_skin_tone
person_tipping_hand_medium_dark_skin_tone
person_tipping_hand_dark_skin_tone
man_tipping_hand
man_tipping_hand_light_skin_tone
man_tipping_hand_medium_light_skin_tone
man_tipping_hand_medium_skin_tone
man_tipping_hand_medium_dark_skin_tone
man_tipping_hand_dark_skin_tone
woman_tipping_hand
woman_tipping_hand_light_skin_tone
woman_tipping_hand_medium_light_skin_tone
woman_tipping_hand_medium_skin_tone
woman_tipping_hand_medium_dark_skin_tone
woman_tipping_hand_dark_skin_tone
person_raising_hand
person_raising_hand_light_skin_tone
person_raising_hand_medium_light_skin_tone
person_raising_hand_medium_skin_tone
person_raising_hand_medium_dark_skin_tone
person_raising_hand_dark_skin_tone
man_raising_hand
man_raising_hand_light_skin_tone
man_raising_hand_medium_light_skin_tone
man_raising_hand_medium_skin_tone
man_raising_hand_medium_dark_skin_tone
man_raising_hand_dark_skin_tone
woman_raising_hand
woman_raising_hand_light_skin_tone
woman_raising_hand_medium_light_skin_tone
woman_raising_hand_medium_skin_tone
woman_raising_hand_medium_dark_skin_tone
woman_raising_hand_dark_skin_tone
deaf_person
deaf_person_light_skin_tone
deaf_person_medium_light_skin_tone
deaf_person_medium_skin_tone
deaf_person_medium_dark_skin_tone
deaf_person_dark_skin_tone
deaf_man
deaf_man_light_skin_tone
deaf_man_medium_light_skin_tone
deaf_man_medium_skin_tone
deaf_man_medium_dark_skin_tone
deaf_man_dark_skin_tone
deaf_woman
deaf_woman_light_skin_tone
deaf_woman_medium_light_skin_tone
deaf_woman_medium_skin_tone
deaf_woman_medium_dark_skin_tone
deaf_woman_dark_skin_tone
person_bowing
person_bowing_light_skin_tone
person_bowing_medium_light_skin_tone
person_bowing_medium_skin_tone
person_bowing_medium_dark_skin_tone
person_bowing_dark_skin_tone
man_bowing
man_bowing_light_skin_tone
man_bowing_medium_light_skin_tone
man_bowing_medium_skin_tone
man_bowing_medium_dark_skin_tone
man_bowing_dark_skin_tone
woman_bowing
woman_bowing_light_skin_tone
woman_bowing_medium_light_skin_tone
woman_bowing_medium_skin_tone
woman_bowing_medium_dark_skin_tone
woman_bowing_dark_skin_tone
person_facepalming
person_facepalming_light_skin_tone
person_facepalming_medium_light_skin_tone
person_facepalming_medium_skin_tone
person_facepalming_medium_dark_skin_tone
person_facepalming_dark_skin_tone
man_facepalming
man_facepalming_light_skin_tone
man_facepalming_medium_light_skin_tone
man_facepalming_medium_skin_tone
man_facepalming_medium_dark_skin_tone
man_facepalming_dark_skin_tone
woman_facepalming
woman_facepalming_light_skin_tone
woman_facepalming_medium_light_skin_tone
woman_facepalming_medium_skin_tone
woman_facepalming_medium_dark_skin_tone
woman_facepalming_dark_skin_tone
person_shrugging
person_shrugging_light_skin_tone
person_shrugging_medium_light_skin_tone
person_shrugging_medium_skin_tone
person_shrugging_medium_dark_skin_tone
person_shrugging_dark_skin_tone
man_shrugging
man_shrugging_light_skin_tone
man_shrugging_medium_light_skin_tone
man_shrugging_medium_skin_tone
man_shrugging_medium_dark_skin_tone
man_shrugging_dark_skin_tone
woman_shrugging
woman_shrugging_light_skin_tone
woman_shrugging_medium_light_skin_tone
woman_shrugging_medium_skin_tone
woman_shrugging_medium_dark_skin_tone
woman_shrugging_dark_skin_tone
man_health_worker
man_health_worker_light_skin_tone
man_health_worker_medium_light_skin_tone
man_health_worker_medium_skin_tone
man_health_worker_medium_dark_skin_tone
man_health_worker_dark_skin_tone
woman_health_worker
woman_health_worker_light_skin_tone
woman_health_worker_medium_light_skin_tone
woman_health_worker_medium_skin_tone
woman_health_worker_medium_dark_skin_tone
woman_health_worker_dark_skin_tone
man_student
man_student_light_skin_tone
man_student_medium_light_skin_tone
man_student_medium_skin_tone
man_student_medium_dark_skin_tone
man_student_dark_skin_tone
woman_student
woman_student_light_skin_tone
woman_student_medium_light_skin_tone
woman_student_medium_skin_tone
woman_student_medium_dark_skin_tone
woman_student_dark_skin_tone
man_teacher
man_teacher_light_skin_tone
man_teacher_medium_light_skin_tone
man_teacher_medium_skin_tone
man_teacher_medium_dark_skin_tone
man_teacher_dark_skin_tone
woman_teacher
woman_teacher_light_skin_tone
woman_teacher_medium_light_skin_tone
woman_teacher_medium_skin_tone
woman_teacher_medium_dark_skin_tone
woman_teacher_dark_skin_tone
man_judge
man_judge_light_skin_tone
man_judge_medium_light_skin_tone
man_judge_medium_skin_tone
man_judge_medium_dark_skin_tone
man_judge_dark_skin_tone
woman_judge
woman_judge_light_skin_tone
woman_judge_medium_light_skin_tone
woman_judge_medium_skin_tone
woman_judge_medium_dark_skin_tone
woman_judge_dark_skin_tone
man_farmer
man_farmer_light_skin_tone
man_farmer_medium_light_skin_tone
man_farmer_medium_skin_tone
man_farmer_medium_dark_skin_tone
man_farmer_dark_skin_tone
woman_farmer
woman_farmer_light_skin_tone
woman_farmer_medium_light_skin_tone
woman_farmer_medium_skin_tone
woman_farmer_medium_dark_skin_tone
woman_farmer_dark_skin_tone
man_cook
man_cook_light_skin_tone
man_cook_medium_light_skin_tone
man_cook_medium_skin_tone
man_cook_medium_dark_skin_tone
man_cook_dark_skin_tone
woman_cook
woman_cook_light_skin_tone
woman_cook_medium_light_skin_tone
woman_cook_medium_skin_tone
woman_cook_medium_dark_skin_tone
woman_cook_dark_skin_tone
man_mechanic
man_mechanic_light_skin_tone
man_mechanic_medium_light_skin_tone
man_mechanic_medium_skin_tone
man_mechanic_medium_dark_skin_tone
man_mechanic_dark_skin_tone
woman_mechanic
woman_mechanic_light_skin_tone
woman_mechanic_medium_light_skin_tone
woman_mechanic_medium_skin_tone
woman_mechanic_medium_dark_skin_tone
woman_mechanic_dark_skin_tone
man_factory_worker
man_factory_worker_light_skin_tone
man_factory_worker_medium_light_skin_tone
man_factory_worker_medium_skin_tone
man_factory_worker_medium_dark_skin_tone
man_factory_worker_dark_skin_tone
woman_factory_worker
woman_factory_worker_light_skin_tone
woman_factory_worker_medium_light_skin_tone
woman_factory_worker_medium_skin_tone
woman_factory_worker_medium_dark_skin_tone
woman_factory_worker_dark_skin_tone
man_office_worker
man_office_worker_light_skin_tone
man_office_worker_medium_light_skin_tone
man_office_worker_medium_skin_tone
man_office_worker_medium_dark_skin_tone
man_office_worker_dark_skin_tone
woman_office_worker
woman_office_worker_light_skin_tone
woman_office_worker_medium_light_skin_tone
woman_office_worker_medium_skin_tone
woman_office_worker_medium_dark_skin_tone
woman_office_worker_dark_skin_tone
man_scientist
man_scientist_light_skin_tone
man_scientist_medium_light_skin_tone
man_scientist_medium_skin_tone
man_scientist_medium_dark_skin_tone
man_scientist_dark_skin_tone
woman_scientist
woman_scientist_light_skin_tone
woman_scientist_medium_light_skin_tone
woman_scientist_medium_skin_tone
woman_scientist_medium_dark_skin_tone
woman_scientist_dark_skin_tone
man_technologist
man_technologist_light_skin_tone
man_technologist_medium_light_skin_tone
man_technologist_medium_skin_tone
man_technologist_medium_dark_skin_tone
man_technologist_dark_skin_tone
woman_technologist
woman_technologist_light_skin_tone
woman_technologist_medium_light_skin_tone
woman_technologist_medium_skin_tone
woman_technologist_medium_dark_skin_tone
woman_technologist_dark_skin_tone
man_singer
man_singer_light_skin_tone
man_singer_medium_light_skin_tone
man_singer_medium_skin_tone
man_singer_medium_dark_skin_tone
man_singer_dark_skin_tone
woman_singer
woman_singer_light_skin_tone
woman_singer_medium_light_skin_tone
woman_singer_medium_skin_tone
woman_singer_medium_dark_skin_tone
woman_singer_dark_skin_tone
man_artist
man_artist_light_skin_tone
man_artist_medium_light_skin_tone
man_artist_medium_skin_tone
man_artist_medium_dark_skin_tone
man_artist_dark_skin_tone
woman_artist
woman_artist_light_skin_tone
woman_artist_medium_light_skin_tone
woman_artist_medium_skin_tone
woman_artist_medium_dark_skin_tone
woman_artist_dark_skin_tone
man_pilot
man_pilot_light_skin_tone
man_pilot_medium_light_skin_tone
man_pilot_medium_skin_tone
man_pilot_medium_dark_skin_tone
man_pilot_dark_skin_tone
woman_pilot
woman_pilot_light_skin_tone
woman_pilot_medium_light_skin_tone
woman_pilot_medium_skin_tone
woman_pilot_medium_dark_skin_tone
woman_pilot_dark_skin_tone
man_astronaut
man_astronaut_light_skin_tone
man_astronaut_medium_light_skin_tone
man_astronaut_medium_skin_tone
man_astronaut_medium_dark_skin_tone
man_astronaut_dark_skin_tone
woman_astronaut
woman_astronaut_light_skin_tone
woman_astronaut_medium_light_skin_tone
woman_astronaut_medium_skin_tone
woman_astronaut_medium_dark_skin_tone
woman_astronaut_dark_skin_tone
man_firefighter
man_firefighter_light_skin_tone
man_firefighter_medium_light_skin_tone
man_firefighter_medium_skin_tone
man_firefighter_medium_dark_skin_tone
man_firefighter_dark_skin_tone
woman_firefighter
woman_firefighter_light_skin_tone
woman_firefighter_medium_light_skin_tone
woman_firefighter_medium_skin_tone
woman_firefighter_medium_dark_skin_tone
woman_firefighter_dark_skin_tone
police_officer
police_officer_light_skin_tone
police_officer_medium_light_skin_tone
police_officer_medium_skin_tone
police_officer_medium_dark_skin_tone
police_officer_dark_skin_tone
man_police_officer
man_police_officer_light_skin_tone
man_police_officer_medium_light_skin_tone
man_police_officer_medium_skin_tone
man_police_officer_medium_dark_skin_tone
man_police_officer_dark_skin_tone
woman_police_officer
woman_police_officer_light_skin_tone
woman_police_officer_medium_light_skin_tone
woman_police_officer_medium_skin_tone
woman_police_officer_medium_dark_skin_tone
woman_police_officer_dark_skin_tone
detective
detective_light_skin_tone
detective_medium_light_skin_tone
detective_medium_skin_tone
detective_medium_dark_skin_tone
detective_dark_skin_tone
man_detective
man_detective_light_skin_tone
man_detective_medium_light_skin_tone
man_detective_medium_skin_tone
man_detective_medium_dark_skin_tone
man_detective_dark_skin_tone
woman_detective
woman_detective_light_skin_tone
woman_detective_medium_light_skin_tone
woman_detective_medium_skin_tone
woman_detective_medium_dark_skin_tone
woman_detective_dark_skin_tone
guard
guard_light_skin_tone
guard_medium_light_skin_tone
guard_medium_skin_tone
guard_medium_dark_skin_tone
guard_dark_skin_tone
man_guard
man_guard_light_skin_tone
man_guard_medium_light_skin_tone
man_guard_medium_skin_tone
man_guard_medium_dark_skin_tone
man_guard_dark_skin_tone
woman_guard
woman_guard_light_skin_tone
woman_guard_medium_light_skin_tone
woman_guard_medium_skin_tone
woman_guard_medium_dark_skin_tone
woman_guard_dark_skin_tone
construction_worker
construction_worker_light_skin_tone
construction_worker_medium_light_skin_tone
construction_worker_medium_skin_tone
construction_worker_medium_dark_skin_tone
construction_worker_dark_skin_tone
man_construction_worker
man_construction_worker_light_skin_tone
man_construction_worker_medium_light_skin_tone
man_construction_worker_medium_skin_tone
man_construction_worker_medium_dark_skin_tone
man_construction_worker_dark_skin_tone
woman_construction_worker
woman_construction_worker_light_skin_tone
woman_construction_worker_medium_light_skin_tone
woman_construction_worker_medium_skin_tone
woman_construction_worker_medium_dark_skin_tone
woman_construction_worker_dark_skin_tone
prince
prince_light_skin_tone
prince_medium_light_skin_tone
prince_medium_skin_tone
prince_medium_dark_skin_tone
prince_dark_skin_tone
princess
princess_light_skin_tone
princess_medium_light_skin_tone
princess_medium_skin_tone
princess_medium_dark_skin_tone
princess_dark_skin_tone
person_wearing_turban
person_wearing_turban_light_skin_tone
person_wearing_turban_medium_light_skin_tone
person_wearing_turban_medium_skin_tone
person_wearing_turban_medium_dark_skin_tone
person_wearing_turban_dark_skin_tone
man_wearing_turban
man_wearing_turban_light_skin_tone
man_wearing_turban_medium_light_skin_tone
man_wearing_turban_medium_skin_tone
man_wearing_turban_medium_dark_skin_tone
man_wearing_turban_dark_skin_tone
woman_wearing_turban
woman_wearing_turban_light_skin_tone
woman_wearing_turban_medium_light_skin_tone
woman_wearing_turban_medium_skin_tone
woman_wearing_turban_medium_dark_skin_tone
woman_wearing_turban_dark_skin_tone
man_with_Chinese_cap
man_with_Chinese_cap_light_skin_tone
man_with_Chinese_cap_medium_light_skin_tone
man_with_Chinese_cap_medium_skin_tone
man_with_Chinese_cap_medium_dark_skin_tone
man_with_Chinese_cap_dark_skin_tone
woman_with_headscarf
woman_with_headscarf_light_skin_tone
woman_with_headscarf_medium_light_skin_tone
woman_with_headscarf_medium_skin_tone
woman_with_headscarf_medium_dark_skin_tone
woman_with_headscarf_dark_skin_tone
man_in_tuxedo
man_in_tuxedo_light_skin_tone
man_in_tuxedo_medium_light_skin_tone
man_in_tuxedo_medium_skin_tone
man_in_tuxedo_medium_dark_skin_tone
man_in_tuxedo_dark_skin_tone
bride_with_veil
bride_with_veil_light_skin_tone
bride_with_veil_medium_light_skin_tone
bride_with_veil_medium_skin_tone
bride_with_veil_medium_dark_skin_tone
bride_with_veil_dark_skin_tone
pregnant_woman
pregnant_woman_light_skin_tone
pregnant_woman_medium_light_skin_tone
pregnant_woman_medium_skin_tone
pregnant_woman_medium_dark_skin_tone
pregnant_woman_dark_skin_tone
breast_feeding
breast_feeding_light_skin_tone
breast_feeding_medium_light_skin_tone
breast_feeding_medium_skin_tone
breast_feeding_medium_dark_skin_tone
breast_feeding_dark_skin_tone
baby_angel
baby_angel_light_skin_tone
baby_angel_medium_light_skin_tone
baby_angel_medium_skin_tone
baby_angel_medium_dark_skin_tone
baby_angel_dark_skin_tone
Santa_Claus
Santa_Claus_light_skin_tone
Santa_Claus_medium_light_skin_tone
Santa_Claus_medium_skin_tone
Santa_Claus_medium_dark_skin_tone
Santa_Claus_dark_skin_tone
Mrs_Claus
Mrs_Claus_light_skin_tone
Mrs_Claus_medium_light_skin_tone
Mrs_Claus_medium_skin_tone
Mrs_Claus_medium_dark_skin_tone
Mrs_Claus_dark_skin_tone
superhero
superhero_light_skin_tone
superhero_medium_light_skin_tone
superhero_medium_skin_tone
superhero_medium_dark_skin_tone
superhero_dark_skin_tone
man_superhero
man_superhero_light_skin_tone
man_superhero_medium_light_skin_tone
man_superhero_medium_skin_tone
man_superhero_medium_dark_skin_tone
man_superhero_dark_skin_tone
woman_superhero
woman_superhero_light_skin_tone
woman_superhero_medium_light_skin_tone
woman_superhero_medium_skin_tone
woman_superhero_medium_dark_skin_tone
woman_superhero_dark_skin_tone
supervillain
supervillain_light_skin_tone
supervillain_medium_light_skin_tone
supervillain_medium_skin_tone
supervillain_medium_dark_skin_tone
supervillain_dark_skin_tone
man_supervillain
man_supervillain_light_skin_tone
man_supervillain_medium_light_skin_tone
man_supervillain_medium_skin_tone
man_supervillain_medium_dark_skin_tone
man_supervillain_dark_skin_tone
woman_supervillain
woman_supervillain_light_skin_tone
woman_supervillain_medium_light_skin_tone
woman_supervillain_medium_skin_tone
woman_supervillain_medium_dark_skin_tone
woman_supervillain_dark_skin_tone
mage
mage_light_skin_tone
mage_medium_light_skin_tone
mage_medium_skin_tone
mage_medium_dark_skin_tone
mage_dark_skin_tone
man_mage
man_mage_light_skin_tone
man_mage_medium_light_skin_tone
man_mage_medium_skin_tone
man_mage_medium_dark_skin_tone
man_mage_dark_skin_tone
woman_mage
woman_mage_light_skin_tone
woman_mage_medium_light_skin_tone
woman_mage_medium_skin_tone
woman_mage_medium_dark_skin_tone
woman_mage_dark_skin_tone
fairy
fairy_light_skin_tone
fairy_medium_light_skin_tone
fairy_medium_skin_tone
fairy_medium_dark_skin_tone
fairy_dark_skin_tone
man_fairy
man_fairy_light_skin_tone
man_fairy_medium_light_skin_tone
man_fairy_medium_skin_tone
man_fairy_medium_dark_skin_tone
man_fairy_dark_skin_tone
woman_fairy
woman_fairy_light_skin_tone
woman_fairy_medium_light_skin_tone
woman_fairy_medium_skin_tone
woman_fairy_medium_dark_skin_tone
woman_fairy_dark_skin_tone
vampire
vampire_light_skin_tone
vampire_medium_light_skin_tone
vampire_medium_skin_tone
vampire_medium_dark_skin_tone
vampire_dark_skin_tone
man_vampire
man_vampire_light_skin_tone
man_vampire_medium_light_skin_tone
man_vampire_medium_skin_tone
man_vampire_medium_dark_skin_tone
man_vampire_dark_skin_tone
woman_vampire
woman_vampire_light_skin_tone
woman_vampire_medium_light_skin_tone
woman_vampire_medium_skin_tone
woman_vampire_medium_dark_skin_tone
woman_vampire_dark_skin_tone
merperson
merperson_light_skin_tone
merperson_medium_light_skin_tone
merperson_medium_skin_tone
merperson_medium_dark_skin_tone
merperson_dark_skin_tone
merman
merman_light_skin_tone
merman_medium_light_skin_tone
merman_medium_skin_tone
merman_medium_dark_skin_tone
merman_dark_skin_tone
mermaid
mermaid_light_skin_tone
mermaid_medium_light_skin_tone
mermaid_medium_skin_tone
mermaid_medium_dark_skin_tone
mermaid_dark_skin_tone
elf
elf_light_skin_tone
elf_medium_light_skin_tone
elf_medium_skin_tone
elf_medium_dark_skin_tone
elf_dark_skin_tone
man_elf
man_elf_light_skin_tone
man_elf_medium_light_skin_tone
man_elf_medium_skin_tone
man_elf_medium_dark_skin_tone
man_elf_dark_skin_tone
woman_elf
woman_elf_light_skin_tone
woman_elf_medium_light_skin_tone
woman_elf_medium_skin_tone
woman_elf_medium_dark_skin_tone
woman_elf_dark_skin_tone
genie
man_genie
woman_genie
zombie
man_zombie
woman_zombie
person_getting_massage
person_getting_massage_light_skin_tone
person_getting_massage_medium_light_skin_tone
person_getting_massage_medium_skin_tone
person_getting_massage_medium_dark_skin_tone
person_getting_massage_dark_skin_tone
man_getting_massage
man_getting_massage_light_skin_tone
man_getting_massage_medium_light_skin_tone
man_getting_massage_medium_skin_tone
man_getting_massage_medium_dark_skin_tone
man_getting_massage_dark_skin_tone
woman_getting_massage
woman_getting_massage_light_skin_tone
woman_getting_massage_medium_light_skin_tone
woman_getting_massage_medium_skin_tone
woman_getting_massage_medium_dark_skin_tone
woman_getting_massage_dark_skin_tone
person_getting_haircut
person_getting_haircut_light_skin_tone
person_getting_haircut_medium_light_skin_tone
person_getting_haircut_medium_skin_tone
person_getting_haircut_medium_dark_skin_tone
person_getting_haircut_dark_skin_tone
man_getting_haircut
man_getting_haircut_light_skin_tone
man_getting_haircut_medium_light_skin_tone
man_getting_haircut_medium_skin_tone
man_getting_haircut_medium_dark_skin_tone
man_getting_haircut_dark_skin_tone
woman_getting_haircut
woman_getting_haircut_light_skin_tone
woman_getting_haircut_medium_light_skin_tone
woman_getting_haircut_medium_skin_tone
woman_getting_haircut_medium_dark_skin_tone
woman_getting_haircut_dark_skin_tone
person_walking
person_walking_light_skin_tone
person_walking_medium_light_skin_tone
person_walking_medium_skin_tone
person_walking_medium_dark_skin_tone
person_walking_dark_skin_tone
man_walking
man_walking_light_skin_tone
man_walking_medium_light_skin_tone
man_walking_medium_skin_tone
man_walking_medium_dark_skin_tone
man_walking_dark_skin_tone
woman_walking
woman_walking_light_skin_tone
woman_walking_medium_light_skin_tone
woman_walking_medium_skin_tone
woman_walking_medium_dark_skin_tone
woman_walking_dark_skin_tone
person_standing
person_standing_light_skin_tone
person_standing_medium_light_skin_tone
person_standing_medium_skin_tone
person_standing_medium_dark_skin_tone
person_standing_dark_skin_tone
man_standing
man_standing_light_skin_tone
man_standing_medium_light_skin_tone
man_standing_medium_skin_tone
man_standing_medium_dark_skin_tone
man_standing_dark_skin_tone
woman_standing
woman_standing_light_skin_tone
woman_standing_medium_light_skin_tone
woman_standing_medium_skin_tone
woman_standing_medium_dark_skin_tone
woman_standing_dark_skin_tone
person_kneeling
person_kneeling_light_skin_tone
person_kneeling_medium_light_skin_tone
person_kneeling_medium_skin_tone
person_kneeling_medium_dark_skin_tone
person_kneeling_dark_skin_tone
man_kneeling
man_kneeling_light_skin_tone
man_kneeling_medium_light_skin_tone
man_kneeling_medium_skin_tone
man_kneeling_medium_dark_skin_tone
man_kneeling_dark_skin_tone
woman_kneeling
woman_kneeling_light_skin_tone
woman_kneeling_medium_light_skin_tone
woman_kneeling_medium_skin_tone
woman_kneeling_medium_dark_skin_tone
woman_kneeling_dark_skin_tone
man_with_probing_cane
man_with_probing_cane_light_skin_tone
man_with_probing_cane_medium_light_skin_tone
man_with_probing_cane_medium_skin_tone
man_with_probing_cane_medium_dark_skin_tone
man_with_probing_cane_dark_skin_tone
woman_with_probing_cane
woman_with_probing_cane_light_skin_tone
woman_with_probing_cane_medium_light_skin_tone
woman_with_probing_cane_medium_skin_tone
woman_with_probing_cane_medium_dark_skin_tone
woman_with_probing_cane_dark_skin_tone
man_in_motorized_wheelchair
man_in_motorized_wheelchair_light_skin_tone
man_in_motorized_wheelchair_medium_light_skin_tone
man_in_motorized_wheelchair_medium_skin_tone
man_in_motorized_wheelchair_medium_dark_skin_tone
man_in_motorized_wheelchair_dark_skin_tone
woman_in_motorized_wheelchair
woman_in_motorized_wheelchair_light_skin_tone
woman_in_motorized_wheelchair_medium_light_skin_tone
woman_in_motorized_wheelchair_medium_skin_tone
woman_in_motorized_wheelchair_medium_dark_skin_tone
woman_in_motorized_wheelchair_dark_skin_tone
man_in_manual_wheelchair
man_in_manual_wheelchair_light_skin_tone
man_in_manual_wheelchair_medium_light_skin_tone
man_in_manual_wheelchair_medium_skin_tone
man_in_manual_wheelchair_medium_dark_skin_tone
man_in_manual_wheelchair_dark_skin_tone
woman_in_manual_wheelchair
woman_in_manual_wheelchair_light_skin_tone
woman_in_manual_wheelchair_medium_light_skin_tone
woman_in_manual_wheelchair_medium_skin_tone
woman_in_manual_wheelchair_medium_dark_skin_tone
woman_in_manual_wheelchair_dark_skin_tone
person_running
person_running_light_skin_tone
person_running_medium_light_skin_tone
person_running_medium_skin_tone
person_running_medium_dark_skin_tone
person_running_dark_skin_tone
man_running
man_running_light_skin_tone
man_running_medium_light_skin_tone
man_running_medium_skin_tone
man_running_medium_dark_skin_tone
man_running_dark_skin_tone
woman_running
woman_running_light_skin_tone
woman_running_medium_light_skin_tone
woman_running_medium_skin_tone
woman_running_medium_dark_skin_tone
woman_running_dark_skin_tone
woman_dancing
woman_dancing_light_skin_tone
woman_dancing_medium_light_skin_tone
woman_dancing_medium_skin_tone
woman_dancing_medium_dark_skin_tone
woman_dancing_dark_skin_tone
woman_dancing_dark_skin_tone_1
man_dancing_light_skin_tone
man_dancing_medium_light_skin_tone
man_dancing_medium_skin_tone
man_dancing_medium_dark_skin_tone
man_dancing_dark_skin_tone
man_in_suit_levitating
man_in_suit_levitating_light_skin_tone
man_in_suit_levitating_medium_light_skin_tone
man_in_suit_levitating_medium_skin_tone
man_in_suit_levitating_medium_dark_skin_tone
man_in_suit_levitating_dark_skin_tone
people_with_bunny_ears
men_with_bunny_ears
women_with_bunny_ears
person_in_steamy_room
person_in_steamy_room_light_skin_tone
person_in_steamy_room_medium_light_skin_tone
person_in_steamy_room_medium_skin_tone
person_in_steamy_room_medium_dark_skin_tone
person_in_steamy_room_dark_skin_tone
man_in_steamy_room
man_in_steamy_room_light_skin_tone
man_in_steamy_room_medium_light_skin_tone
man_in_steamy_room_medium_skin_tone
man_in_steamy_room_medium_dark_skin_tone
man_in_steamy_room_dark_skin_tone
woman_in_steamy_room
woman_in_steamy_room_light_skin_tone
woman_in_steamy_room_medium_light_skin_tone
woman_in_steamy_room_medium_skin_tone
woman_in_steamy_room_medium_dark_skin_tone
woman_in_steamy_room_dark_skin_tone
person_climbing
person_climbing_light_skin_tone
person_climbing_medium_light_skin_tone
person_climbing_medium_skin_tone
person_climbing_medium_dark_skin_tone
person_climbing_dark_skin_tone
man_climbing
man_climbing_light_skin_tone
man_climbing_medium_light_skin_tone
man_climbing_medium_skin_tone
man_climbing_medium_dark_skin_tone
man_climbing_dark_skin_tone
woman_climbing
woman_climbing_light_skin_tone
woman_climbing_medium_light_skin_tone
woman_climbing_medium_skin_tone
woman_climbing_medium_dark_skin_tone
woman_climbing_dark_skin_tone
person_fencing
horse_racing
horse_racing_light_skin_tone
horse_racing_medium_light_skin_tone
horse_racing_medium_skin_tone
horse_racing_medium_dark_skin_tone
horse_racing_dark_skin_tone
skier
snowboarder
snowboarder_light_skin_tone
snowboarder_medium_light_skin_tone
snowboarder_medium_skin_tone
snowboarder_medium_dark_skin_tone
snowboarder_dark_skin_tone
person_golfing
person_golfing_light_skin_tone
person_golfing_medium_light_skin_tone
person_golfing_medium_skin_tone
person_golfing_medium_dark_skin_tone
person_golfing_dark_skin_tone
man_golfing
man_golfing_light_skin_tone
man_golfing_medium_light_skin_tone
man_golfing_medium_skin_tone
man_golfing_medium_dark_skin_tone
man_golfing_dark_skin_tone
woman_golfing
woman_golfing_light_skin_tone
woman_golfing_medium_light_skin_tone
woman_golfing_medium_skin_tone
woman_golfing_medium_dark_skin_tone
woman_golfing_dark_skin_tone
person_surfing
person_surfing_light_skin_tone
person_surfing_medium_light_skin_tone
person_surfing_medium_skin_tone
person_surfing_medium_dark_skin_tone
person_surfing_dark_skin_tone
man_surfing
man_surfing_light_skin_tone
man_surfing_medium_light_skin_tone
man_surfing_medium_skin_tone
man_surfing_medium_dark_skin_tone
man_surfing_dark_skin_tone
woman_surfing
woman_surfing_light_skin_tone
woman_surfing_medium_light_skin_tone
woman_surfing_medium_skin_tone
woman_surfing_medium_dark_skin_tone
woman_surfing_dark_skin_tone
person_rowing_boat
person_rowing_boat_light_skin_tone
person_rowing_boat_medium_light_skin_tone
person_rowing_boat_medium_skin_tone
person_rowing_boat_medium_dark_skin_tone
person_rowing_boat_dark_skin_tone
man_rowing_boat
man_rowing_boat_light_skin_tone
man_rowing_boat_medium_light_skin_tone
man_rowing_boat_medium_skin_tone
man_rowing_boat_medium_dark_skin_tone
man_rowing_boat_dark_skin_tone
woman_rowing_boat
woman_rowing_boat_light_skin_tone
woman_rowing_boat_medium_light_skin_tone
woman_rowing_boat_medium_skin_tone
woman_rowing_boat_medium_dark_skin_tone
woman_rowing_boat_dark_skin_tone
person_swimming
person_swimming_light_skin_tone
person_swimming_medium_light_skin_tone
person_swimming_medium_skin_tone
person_swimming_medium_dark_skin_tone
person_swimming_dark_skin_tone
man_swimming
man_swimming_light_skin_tone
man_swimming_medium_light_skin_tone
man_swimming_medium_skin_tone
man_swimming_medium_dark_skin_tone
man_swimming_dark_skin_tone
woman_swimming
woman_swimming_light_skin_tone
woman_swimming_medium_light_skin_tone
woman_swimming_medium_skin_tone
woman_swimming_medium_dark_skin_tone
woman_swimming_dark_skin_tone
person_bouncing_ball
person_bouncing_ball_light_skin_tone
person_bouncing_ball_medium_light_skin_tone
person_bouncing_ball_medium_skin_tone
person_bouncing_ball_medium_dark_skin_tone
person_bouncing_ball_dark_skin_tone
man_bouncing_ball
man_bouncing_ball_light_skin_tone
man_bouncing_ball_medium_light_skin_tone
man_bouncing_ball_medium_skin_tone
man_bouncing_ball_medium_dark_skin_tone
man_bouncing_ball_dark_skin_tone
woman_bouncing_ball
woman_bouncing_ball_light_skin_tone
woman_bouncing_ball_medium_light_skin_tone
woman_bouncing_ball_medium_skin_tone
woman_bouncing_ball_medium_dark_skin_tone
woman_bouncing_ball_dark_skin_tone
person_lifting_weights
person_lifting_weights_light_skin_tone
person_lifting_weights_medium_light_skin_tone
person_lifting_weights_medium_skin_tone
person_lifting_weights_medium_dark_skin_tone
person_lifting_weights_dark_skin_tone
man_lifting_weights
man_lifting_weights_light_skin_tone
man_lifting_weights_medium_light_skin_tone
man_lifting_weights_medium_skin_tone
man_lifting_weights_medium_dark_skin_tone
man_lifting_weights_dark_skin_tone
woman_lifting_weights
woman_lifting_weights_light_skin_tone
woman_lifting_weights_medium_light_skin_tone
woman_lifting_weights_medium_skin_tone
woman_lifting_weights_medium_dark_skin_tone
woman_lifting_weights_dark_skin_tone
person_biking
person_biking_light_skin_tone
person_biking_medium_light_skin_tone
person_biking_medium_skin_tone
person_biking_medium_dark_skin_tone
person_biking_dark_skin_tone
man_biking
man_biking_light_skin_tone
man_biking_medium_light_skin_tone
man_biking_medium_skin_tone
man_biking_medium_dark_skin_tone
man_biking_dark_skin_tone
woman_biking
woman_biking_light_skin_tone
woman_biking_medium_light_skin_tone
woman_biking_medium_skin_tone
woman_biking_medium_dark_skin_tone
woman_biking_dark_skin_tone
person_mountain_biking
person_mountain_biking_light_skin_tone
person_mountain_biking_medium_light_skin_tone
person_mountain_biking_medium_skin_tone
person_mountain_biking_medium_dark_skin_tone
person_mountain_biking_dark_skin_tone
man_mountain_biking
man_mountain_biking_light_skin_tone
man_mountain_biking_medium_light_skin_tone
man_mountain_biking_medium_skin_tone
man_mountain_biking_medium_dark_skin_tone
man_mountain_biking_dark_skin_tone
woman_mountain_biking
woman_mountain_biking_light_skin_tone
woman_mountain_biking_medium_light_skin_tone
woman_mountain_biking_medium_skin_tone
woman_mountain_biking_medium_dark_skin_tone
woman_mountain_biking_dark_skin_tone
person_cartwheeling
person_cartwheeling_light_skin_tone
person_cartwheeling_medium_light_skin_tone
person_cartwheeling_medium_skin_tone
person_cartwheeling_medium_dark_skin_tone
person_cartwheeling_dark_skin_tone
man_cartwheeling
man_cartwheeling_light_skin_tone
man_cartwheeling_medium_light_skin_tone
man_cartwheeling_medium_skin_tone
man_cartwheeling_medium_dark_skin_tone
man_cartwheeling_dark_skin_tone
woman_cartwheeling
woman_cartwheeling_light_skin_tone
woman_cartwheeling_medium_light_skin_tone
woman_cartwheeling_medium_skin_tone
woman_cartwheeling_medium_dark_skin_tone
woman_cartwheeling_dark_skin_tone
people_wrestling
men_wrestling
women_wrestling
person_playing_water_polo
person_playing_water_polo_light_skin_tone
person_playing_water_polo_medium_light_skin_tone
person_playing_water_polo_medium_skin_tone
person_playing_water_polo_medium_dark_skin_tone
person_playing_water_polo_dark_skin_tone
man_playing_water_polo
man_playing_water_polo_light_skin_tone
man_playing_water_polo_medium_light_skin_tone
man_playing_water_polo_medium_skin_tone
man_playing_water_polo_medium_dark_skin_tone
man_playing_water_polo_dark_skin_tone
woman_playing_water_polo
woman_playing_water_polo_light_skin_tone
woman_playing_water_polo_medium_light_skin_tone
woman_playing_water_polo_medium_skin_tone
woman_playing_water_polo_medium_dark_skin_tone
woman_playing_water_polo_dark_skin_tone
person_playing_handball
person_playing_handball_light_skin_tone
person_playing_handball_medium_light_skin_tone
person_playing_handball_medium_skin_tone
person_playing_handball_medium_dark_skin_tone
person_playing_handball_dark_skin_tone
man_playing_handball
man_playing_handball_light_skin_tone
man_playing_handball_medium_light_skin_tone
man_playing_handball_medium_skin_tone
man_playing_handball_medium_dark_skin_tone
man_playing_handball_dark_skin_tone
woman_playing_handball
woman_playing_handball_light_skin_tone
woman_playing_handball_medium_light_skin_tone
woman_playing_handball_medium_skin_tone
woman_playing_handball_medium_dark_skin_tone
woman_playing_handball_dark_skin_tone
person_juggling
person_juggling_light_skin_tone
person_juggling_medium_light_skin_tone
person_juggling_medium_skin_tone
person_juggling_medium_dark_skin_tone
person_juggling_dark_skin_tone
man_juggling
man_juggling_light_skin_tone
man_juggling_medium_light_skin_tone
man_juggling_medium_skin_tone
man_juggling_medium_dark_skin_tone
man_juggling_dark_skin_tone
woman_juggling
woman_juggling_light_skin_tone
woman_juggling_medium_light_skin_tone
woman_juggling_medium_skin_tone
woman_juggling_medium_dark_skin_tone
woman_juggling_dark_skin_tone
person_in_lotus_position
person_in_lotus_position_light_skin_tone
person_in_lotus_position_medium_light_skin_tone
person_in_lotus_position_medium_skin_tone
person_in_lotus_position_medium_dark_skin_tone
person_in_lotus_position_dark_skin_tone
man_in_lotus_position
man_in_lotus_position_light_skin_tone
man_in_lotus_position_medium_light_skin_tone
man_in_lotus_position_medium_skin_tone
man_in_lotus_position_medium_dark_skin_tone
man_in_lotus_position_dark_skin_tone
woman_in_lotus_position
woman_in_lotus_position_light_skin_tone
woman_in_lotus_position_medium_light_skin_tone
woman_in_lotus_position_medium_skin_tone
woman_in_lotus_position_medium_dark_skin_tone
woman_in_lotus_position_dark_skin_tone
person_taking_bath
person_taking_bath_light_skin_tone
person_taking_bath_medium_light_skin_tone
person_taking_bath_medium_skin_tone
person_taking_bath_medium_dark_skin_tone
person_taking_bath_dark_skin_tone
person_in_bed
person_in_bed_light_skin_tone
person_in_bed_medium_light_skin_tone
person_in_bed_medium_skin_tone
person_in_bed_medium_dark_skin_tone
person_in_bed_dark_skin_tone
people_holding_hands
people_holding_hands_light_skin_tone
people_holding_hands_medium_light_skin_tone_light_skin_tone
people_holding_hands_medium_light_skin_tone_light_skin_tone_1
people_holding_hands_medium_skin_tone_light_skin_tone
people_holding_hands_medium_skin_tone_medium_light_skin_tone
people_holding_hands_medium_skin_tone_medium_light_skin_tone_1
people_holding_hands_medium_dark_skin_tone_light_skin_tone
people_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
people_holding_hands_medium_dark_skin_tone_medium_skin_tone
people_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
people_holding_hands_dark_skin_tone_light_skin_tone
people_holding_hands_dark_skin_tone_medium_light_skin_tone
people_holding_hands_dark_skin_tone_medium_skin_tone
people_holding_hands_dark_skin_tone_medium_dark_skin_tone
people_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
women_holding_hands
women_holding_hands_light_skin_tone
women_holding_hands_medium_light_skin_tone_light_skin_tone
women_holding_hands_medium_light_skin_tone_light_skin_tone_1
women_holding_hands_medium_skin_tone_light_skin_tone
women_holding_hands_medium_skin_tone_medium_light_skin_tone
women_holding_hands_medium_skin_tone_medium_light_skin_tone_1
women_holding_hands_medium_dark_skin_tone_light_skin_tone
women_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
women_holding_hands_medium_dark_skin_tone_medium_skin_tone
women_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
women_holding_hands_dark_skin_tone_light_skin_tone
women_holding_hands_dark_skin_tone_medium_light_skin_tone
women_holding_hands_dark_skin_tone_medium_skin_tone
women_holding_hands_dark_skin_tone_medium_dark_skin_tone
women_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
woman_and_man_holding_hands
woman_and_man_holding_hands_light_skin_tone
woman_and_man_holding_hands_light_skin_tone_medium_light_skin_tone
woman_and_man_holding_hands_light_skin_tone_medium_skin_tone
woman_and_man_holding_hands_light_skin_tone_medium_dark_skin_tone
woman_and_man_holding_hands_light_skin_tone_dark_skin_tone
woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone
woman_and_man_holding_hands_medium_light_skin_tone_light_skin_tone_1
woman_and_man_holding_hands_medium_light_skin_tone_medium_skin_tone
woman_and_man_holding_hands_medium_light_skin_tone_medium_dark_skin_tone
woman_and_man_holding_hands_medium_light_skin_tone_dark_skin_tone
woman_and_man_holding_hands_medium_skin_tone_light_skin_tone
woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone
woman_and_man_holding_hands_medium_skin_tone_medium_light_skin_tone_1
woman_and_man_holding_hands_medium_skin_tone_medium_dark_skin_tone
woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone
woman_and_man_holding_hands_medium_dark_skin_tone_light_skin_tone
woman_and_man_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone
woman_and_man_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
woman_and_man_holding_hands_medium_dark_skin_tone_dark_skin_tone
woman_and_man_holding_hands_dark_skin_tone_light_skin_tone
woman_and_man_holding_hands_dark_skin_tone_medium_light_skin_tone
woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone
woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone
woman_and_man_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
men_holding_hands
men_holding_hands_light_skin_tone
men_holding_hands_medium_light_skin_tone_light_skin_tone
men_holding_hands_medium_light_skin_tone_light_skin_tone_1
men_holding_hands_medium_skin_tone_light_skin_tone
men_holding_hands_medium_skin_tone_medium_light_skin_tone
men_holding_hands_medium_skin_tone_medium_light_skin_tone_1
men_holding_hands_medium_dark_skin_tone_light_skin_tone
men_holding_hands_medium_dark_skin_tone_medium_light_skin_tone
men_holding_hands_medium_dark_skin_tone_medium_skin_tone
men_holding_hands_medium_dark_skin_tone_medium_skin_tone_1
men_holding_hands_dark_skin_tone_light_skin_tone
men_holding_hands_dark_skin_tone_medium_light_skin_tone
men_holding_hands_dark_skin_tone_medium_skin_tone
men_holding_hands_dark_skin_tone_medium_dark_skin_tone
men_holding_hands_dark_skin_tone_medium_dark_skin_tone_1
kiss
kiss_woman_man
kiss_man_man
kiss_woman_woman
couple_with_heart
couple_with_heart_woman_man
couple_with_heart_man_man
couple_with_heart_woman_woman
family
family_man_woman_boy
family_man_woman_girl
family_man_woman_girl_boy
family_man_woman_boy_boy
family_man_woman_girl_girl
family_man_man_boy
family_man_man_girl
family_man_man_girl_boy
family_man_man_boy_boy
family_man_man_girl_girl
family_woman_woman_boy
family_woman_woman_girl
family_woman_woman_girl_boy
family_woman_woman_boy_boy
family_woman_woman_girl_girl
family_man_boy
family_man_boy_boy
family_man_girl
family_man_girl_boy
family_man_girl_girl
family_woman_boy
family_woman_boy_boy
family_woman_girl
family_woman_girl_boy
family_woman_girl_girl
speaking_head
bust_in_silhouette
busts_in_silhouette
footprints
"
emoji_groups[animals]="
monkey_face
monkey_face_1
gorilla
orangutan
dog_face
dog_face_1
guide_dog
service_dog
poodle
wolf
fox
raccoon
cat_face
cat_face_1
lion
tiger_face
tiger_face_1
leopard
horse_face
horse_face_1
unicorn
zebra
deer
cow_face
ox
water_buffalo
cow
pig_face
pig_face_1
boar
pig_nose
ram
ewe
goat
camel
two_hump_camel
llama
giraffe
elephant
rhinoceros
hippopotamus
mouse_face
mouse_face_1
rat
hamster
rabbit_face
rabbit_face_1
chipmunk
hedgehog
bat
bear
koala
panda
sloth
otter
skunk
kangaroo
badger
paw_prints
turkey
chicken
rooster
hatching_chick
baby_chick
front_facing_baby_chick
bird
penguin
dove
eagle
duck
swan
owl
flamingo
peacock
parrot
frog
crocodile
turtle
lizard
snake
dragon_face
dragon_face_1
sauropod
T_Rex
spouting_whale
spouting_whale_1
dolphin
fish
tropical_fish
blowfish
shark
octopus
spiral_shell
snail
butterfly
bug
ant
honeybee
lady_beetle
cricket
spider
spider_web
scorpion
mosquito
microbe
"
emoji_groups[faces]="
grinning_face
grinning_face_with_big_eyes
grinning_face_with_smiling_eyes
beaming_face_with_smiling_eyes
grinning_squinting_face
grinning_face_with_sweat
rolling_on_the_floor_laughing
face_with_tears_of_joy
slightly_smiling_face
upside_down_face
winking_face
smiling_face_with_smiling_eyes
smiling_face_with_halo
smiling_face_with_hearts
smiling_face_with_heart_eyes
star_struck
face_blowing_a_kiss
kissing_face
smiling_face
kissing_face_with_closed_eyes
kissing_face_with_smiling_eyes
face_savoring_food
face_with_tongue
winking_face_with_tongue
zany_face
squinting_face_with_tongue
money_mouth_face
hugging_face
face_with_hand_over_mouth
shushing_face
thinking_face
zipper_mouth_face
face_with_raised_eyebrow
neutral_face
expressionless_face
face_without_mouth
smirking_face
unamused_face
face_with_rolling_eyes
grimacing_face
lying_face
relieved_face
pensive_face
sleepy_face
drooling_face
sleeping_face
face_with_medical_mask
face_with_thermometer
face_with_head_bandage
nauseated_face
face_vomiting
sneezing_face
hot_face
cold_face
woozy_face
dizzy_face
exploding_head
cowboy_hat_face
partying_face
smiling_face_with_sunglasses
nerd_face
face_with_monocle
confused_face
worried_face
slightly_frowning_face
slightly_frowning_face_1
face_with_open_mouth
hushed_face
astonished_face
flushed_face
pleading_face
frowning_face_with_open_mouth
anguished_face
fearful_face
anxious_face_with_sweat
sad_but_relieved_face
crying_face
loudly_crying_face
face_screaming_in_fear
confounded_face
persevering_face
disappointed_face
downcast_face_with_sweat
weary_face
tired_face
yawning_face
face_with_steam_from_nose
pouting_face
angry_face
face_with_symbols_on_mouth
smiling_face_with_horns
angry_face_with_horns
skull
skull_and_crossbones
pile_of_poo
clown_face
ogre
goblin
ghost
alien
alien_monster
robot
"
emoji_groups[flags]="
chequered_flag
triangular_flag
crossed_flags
black_flag
white_flag
rainbow_flag
pirate_flag
Ascension_Island
Andorra
United_Arab_Emirates
Afghanistan
Antigua_and_Barbuda
Anguilla
Albania
Armenia
Angola
Antarctica
Argentina
American_Samoa
Austria
Australia
Aruba
Åland_Islands
Azerbaijan
Bosnia_and_Herzegovina
Barbados
Bangladesh
Belgium
Burkina_Faso
Bulgaria
Bahrain
Burundi
Benin
St_Barthélemy
Bermuda
Brunei
Bolivia
Caribbean_Netherlands
Brazil
Bahamas
Bhutan
Bouvet_Island
Botswana
Belarus
Belize
Canada
Cocos_Keeling_Islands
Congo__Kinshasa
Central_African_Republic
Congo__Brazzaville
Switzerland
Côte_d_Ivoire
Cook_Islands
Chile
Cameroon
China
Colombia
Clipperton_Island
Costa_Rica
Cuba
Cape_Verde
Curaçao
Christmas_Island
Cyprus
Czechia
Germany
Diego_Garcia
Djibouti
Denmark
Dominica
Dominican_Republic
Algeria
Ceuta_and_Melilla
Ecuador
Estonia
Egypt
Western_Sahara
Eritrea
Spain
Ethiopia
European_Union
Finland
Fiji
Falkland_Islands
Micronesia
Faroe_Islands
France
Gabon
United_Kingdom
Grenada
Georgia
French_Guiana
Guernsey
Ghana
Gibraltar
Greenland
Gambia
Guinea
Guadeloupe
Equatorial_Guinea
Greece
South_Georgia_and_South_Sandwich_Islands
Guatemala
Guam
Guinea_Bissau
Guyana
Hong_Kong_SAR_China
Heard_and_McDonald_Islands
Honduras
Croatia
Haiti
Hungary
Canary_Islands
Indonesia
Ireland
Israel
Isle_of_Man
India
British_Indian_Ocean_Territory
Iraq
Iran
Iceland
Italy
Jersey
Jamaica
Jordan
Japan
Kenya
Kyrgyzstan
Cambodia
Kiribati
Comoros
St_Kitts_and_Nevis
North_Korea
South_Korea
Kuwait
Cayman_Islands
Kazakhstan
Laos
Lebanon
St_Lucia
Liechtenstein
Sri_Lanka
Liberia
Lesotho
Lithuania
Luxembourg
Latvia
Libya
Morocco
Monaco
Moldova
Montenegro
St_Martin
Madagascar
Marshall_Islands
Macedonia
Mali
Myanmar_Burma_
Mongolia
Macao_SAR_China
Northern_Mariana_Islands
Martinique
Mauritania
Montserrat
Malta
Mauritius
Maldives
Malawi
Mexico
Malaysia
Mozambique
Namibia
New_Caledonia
Niger
Norfolk_Island
Nigeria
Nicaragua
Netherlands
Norway
Nepal
Nauru
Niue
New_Zealand
Oman
Panama
Peru
French_Polynesia
Papua_New_Guinea
Philippines
Pakistan
Poland
St_Pierre_and_Miquelon
Pitcairn_Islands
Puerto_Rico
Palestinian_Territories
Portugal
Palau
Paraguay
Qatar
Réunion
Romania
Serbia
Russia
Rwanda
Saudi_Arabia
Solomon_Islands
Seychelles
Sudan
Sweden
Singapore
St_Helena
Slovenia
Svalbard_and_Jan_Mayen
Slovakia
Sierra_Leone
San_Marino
Senegal
Somalia
Suriname
South_Sudan
São_Tomé_and_Príncipe
El_Salvador
Sint_Maarten
Syria
Eswatini
Tristan_da_Cunha
Turks_and_Caicos_Islands
Chad
French_Southern_Territories
Togo
Thailand
Tajikistan
Tokelau
Timor_Leste
Turkmenistan
Tunisia
Tonga
Turkey
Trinidad_and_Tobago
Tuvalu
Taiwan
Tanzania
Ukraine
Uganda
U_S_Outlying_Islands
United_Nations
United_States
Uruguay
Uzbekistan
Vatican_City
St_Vincent_and_Grenadines
Venezuela
British_Virgin_Islands
U_S_Virgin_Islands
Vietnam
Vanuatu
Wallis_and_Futuna
Samoa
Kosovo
Yemen
Mayotte
South_Africa
Zambia
Zimbabwe
England
Scotland
Wales
"

View File

@ -0,0 +1,4122 @@
# emoji-data.txt
# (Originally emoji-test.txt)
# (Retrieved from https://unicode.org/Public/emoji/12.0/emoji-test.txt)
# Date: 2019-01-27, 15:43:01 GMT
# © 2019 Unicode®, Inc.
# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
# For terms of use, see http://www.unicode.org/terms_of_use.html
#
# Emoji Keyboard/Display Test Data for UTS #51
# Version: 12.0
#
# For documentation and usage, see http://www.unicode.org/reports/tr51
#
# This file provides data for testing which emoji forms should be in keyboards and which should also be displayed/processed.
# Format: code points; status # emoji name
# Code points — list of one or more hex code points, separated by spaces
# Status
# component — an Emoji_Component,
# excluding Regional_Indicators, ASCII, and non-Emoji.
# fully-qualified — a fully-qualified emoji (see ED-18 in UTS #51),
# excluding Emoji_Component
# minimally-qualified — a minimally-qualified emoji (see ED-18a in UTS #51)
# unqualified — a unqualified emoji (See ED-19 in UTS #51)
# Notes:
# • This includes the emoji components that need emoji presentation (skin tone and hair)
# when isolated, but omits the components that need not have an emoji
# presentation when isolated.
# • The RGI set is covered by the listed fully-qualified emoji.
# • The listed minimally-qualified and unqualified cover all cases where an
# element of the RGI set is missing one or more emoji presentation selectors.
# • The file is in CLDR order, not codepoint order. This is recommended (but not required!) for keyboard palettes.
# • The groups and subgroups are illustrative. See the Emoji Order chart for more information.
# group: Smileys & Emotion
# subgroup: face-smiling
1F600 ; fully-qualified # 😀 grinning face
1F603 ; fully-qualified # 😃 grinning face with big eyes
1F604 ; fully-qualified # 😄 grinning face with smiling eyes
1F601 ; fully-qualified # 😁 beaming face with smiling eyes
1F606 ; fully-qualified # 😆 grinning squinting face
1F605 ; fully-qualified # 😅 grinning face with sweat
1F923 ; fully-qualified # 🤣 rolling on the floor laughing
1F602 ; fully-qualified # 😂 face with tears of joy
1F642 ; fully-qualified # 🙂 slightly smiling face
1F643 ; fully-qualified # 🙃 upside-down face
1F609 ; fully-qualified # 😉 winking face
1F60A ; fully-qualified # 😊 smiling face with smiling eyes
1F607 ; fully-qualified # 😇 smiling face with halo
# subgroup: face-affection
1F970 ; fully-qualified # 🥰 smiling face with hearts
1F60D ; fully-qualified # 😍 smiling face with heart-eyes
1F929 ; fully-qualified # 🤩 star-struck
1F618 ; fully-qualified # 😘 face blowing a kiss
1F617 ; fully-qualified # 😗 kissing face
263A FE0F ; fully-qualified # ☺️ smiling face
263A ; unqualified # ☺ smiling face
1F61A ; fully-qualified # 😚 kissing face with closed eyes
1F619 ; fully-qualified # 😙 kissing face with smiling eyes
# subgroup: face-tongue
1F60B ; fully-qualified # 😋 face savoring food
1F61B ; fully-qualified # 😛 face with tongue
1F61C ; fully-qualified # 😜 winking face with tongue
1F92A ; fully-qualified # 🤪 zany face
1F61D ; fully-qualified # 😝 squinting face with tongue
1F911 ; fully-qualified # 🤑 money-mouth face
# subgroup: face-hand
1F917 ; fully-qualified # 🤗 hugging face
1F92D ; fully-qualified # 🤭 face with hand over mouth
1F92B ; fully-qualified # 🤫 shushing face
1F914 ; fully-qualified # 🤔 thinking face
# subgroup: face-neutral-skeptical
1F910 ; fully-qualified # 🤐 zipper-mouth face
1F928 ; fully-qualified # 🤨 face with raised eyebrow
1F610 ; fully-qualified # 😐 neutral face
1F611 ; fully-qualified # 😑 expressionless face
1F636 ; fully-qualified # 😶 face without mouth
1F60F ; fully-qualified # 😏 smirking face
1F612 ; fully-qualified # 😒 unamused face
1F644 ; fully-qualified # 🙄 face with rolling eyes
1F62C ; fully-qualified # 😬 grimacing face
1F925 ; fully-qualified # 🤥 lying face
# subgroup: face-sleepy
1F60C ; fully-qualified # 😌 relieved face
1F614 ; fully-qualified # 😔 pensive face
1F62A ; fully-qualified # 😪 sleepy face
1F924 ; fully-qualified # 🤤 drooling face
1F634 ; fully-qualified # 😴 sleeping face
# subgroup: face-unwell
1F637 ; fully-qualified # 😷 face with medical mask
1F912 ; fully-qualified # 🤒 face with thermometer
1F915 ; fully-qualified # 🤕 face with head-bandage
1F922 ; fully-qualified # 🤢 nauseated face
1F92E ; fully-qualified # 🤮 face vomiting
1F927 ; fully-qualified # 🤧 sneezing face
1F975 ; fully-qualified # 🥵 hot face
1F976 ; fully-qualified # 🥶 cold face
1F974 ; fully-qualified # 🥴 woozy face
1F635 ; fully-qualified # 😵 dizzy face
1F92F ; fully-qualified # 🤯 exploding head
# subgroup: face-hat
1F920 ; fully-qualified # 🤠 cowboy hat face
1F973 ; fully-qualified # 🥳 partying face
# subgroup: face-glasses
1F60E ; fully-qualified # 😎 smiling face with sunglasses
1F913 ; fully-qualified # 🤓 nerd face
1F9D0 ; fully-qualified # 🧐 face with monocle
# subgroup: face-concerned
1F615 ; fully-qualified # 😕 confused face
1F61F ; fully-qualified # 😟 worried face
1F641 ; fully-qualified # 🙁 slightly frowning face
2639 FE0F ; fully-qualified # ☹️ frowning face
2639 ; unqualified # ☹ frowning face
1F62E ; fully-qualified # 😮 face with open mouth
1F62F ; fully-qualified # 😯 hushed face
1F632 ; fully-qualified # 😲 astonished face
1F633 ; fully-qualified # 😳 flushed face
1F97A ; fully-qualified # 🥺 pleading face
1F626 ; fully-qualified # 😦 frowning face with open mouth
1F627 ; fully-qualified # 😧 anguished face
1F628 ; fully-qualified # 😨 fearful face
1F630 ; fully-qualified # 😰 anxious face with sweat
1F625 ; fully-qualified # 😥 sad but relieved face
1F622 ; fully-qualified # 😢 crying face
1F62D ; fully-qualified # 😭 loudly crying face
1F631 ; fully-qualified # 😱 face screaming in fear
1F616 ; fully-qualified # 😖 confounded face
1F623 ; fully-qualified # 😣 persevering face
1F61E ; fully-qualified # 😞 disappointed face
1F613 ; fully-qualified # 😓 downcast face with sweat
1F629 ; fully-qualified # 😩 weary face
1F62B ; fully-qualified # 😫 tired face
1F971 ; fully-qualified # 🥱 yawning face
# subgroup: face-negative
1F624 ; fully-qualified # 😤 face with steam from nose
1F621 ; fully-qualified # 😡 pouting face
1F620 ; fully-qualified # 😠 angry face
1F92C ; fully-qualified # 🤬 face with symbols on mouth
1F608 ; fully-qualified # 😈 smiling face with horns
1F47F ; fully-qualified # 👿 angry face with horns
1F480 ; fully-qualified # 💀 skull
2620 FE0F ; fully-qualified # ☠️ skull and crossbones
2620 ; unqualified # ☠ skull and crossbones
# subgroup: face-costume
1F4A9 ; fully-qualified # 💩 pile of poo
1F921 ; fully-qualified # 🤡 clown face
1F479 ; fully-qualified # 👹 ogre
1F47A ; fully-qualified # 👺 goblin
1F47B ; fully-qualified # 👻 ghost
1F47D ; fully-qualified # 👽 alien
1F47E ; fully-qualified # 👾 alien monster
1F916 ; fully-qualified # 🤖 robot
# subgroup: cat-face
1F63A ; fully-qualified # 😺 grinning cat
1F638 ; fully-qualified # 😸 grinning cat with smiling eyes
1F639 ; fully-qualified # 😹 cat with tears of joy
1F63B ; fully-qualified # 😻 smiling cat with heart-eyes
1F63C ; fully-qualified # 😼 cat with wry smile
1F63D ; fully-qualified # 😽 kissing cat
1F640 ; fully-qualified # 🙀 weary cat
1F63F ; fully-qualified # 😿 crying cat
1F63E ; fully-qualified # 😾 pouting cat
# subgroup: monkey-face
1F648 ; fully-qualified # 🙈 see-no-evil monkey
1F649 ; fully-qualified # 🙉 hear-no-evil monkey
1F64A ; fully-qualified # 🙊 speak-no-evil monkey
# subgroup: emotion
1F48B ; fully-qualified # 💋 kiss mark
1F48C ; fully-qualified # 💌 love letter
1F498 ; fully-qualified # 💘 heart with arrow
1F49D ; fully-qualified # 💝 heart with ribbon
1F496 ; fully-qualified # 💖 sparkling heart
1F497 ; fully-qualified # 💗 growing heart
1F493 ; fully-qualified # 💓 beating heart
1F49E ; fully-qualified # 💞 revolving hearts
1F495 ; fully-qualified # 💕 two hearts
1F49F ; fully-qualified # 💟 heart decoration
2763 FE0F ; fully-qualified # ❣️ heart exclamation
2763 ; unqualified # ❣ heart exclamation
1F494 ; fully-qualified # 💔 broken heart
2764 FE0F ; fully-qualified # ❤️ red heart
2764 ; unqualified # ❤ red heart
1F9E1 ; fully-qualified # 🧡 orange heart
1F49B ; fully-qualified # 💛 yellow heart
1F49A ; fully-qualified # 💚 green heart
1F499 ; fully-qualified # 💙 blue heart
1F49C ; fully-qualified # 💜 purple heart
1F90E ; fully-qualified # 🤎 brown heart
1F5A4 ; fully-qualified # 🖤 black heart
1F90D ; fully-qualified # 🤍 white heart
1F4AF ; fully-qualified # 💯 hundred points
1F4A2 ; fully-qualified # 💢 anger symbol
1F4A5 ; fully-qualified # 💥 collision
1F4AB ; fully-qualified # 💫 dizzy
1F4A6 ; fully-qualified # 💦 sweat droplets
1F4A8 ; fully-qualified # 💨 dashing away
1F573 FE0F ; fully-qualified # 🕳️ hole
1F573 ; unqualified # 🕳 hole
1F4A3 ; fully-qualified # 💣 bomb
1F4AC ; fully-qualified # 💬 speech balloon
1F441 FE0F 200D 1F5E8 FE0F ; fully-qualified # 👁️‍🗨️ eye in speech bubble
1F441 200D 1F5E8 FE0F ; unqualified # 👁‍🗨️ eye in speech bubble
1F441 FE0F 200D 1F5E8 ; unqualified # 👁️‍🗨 eye in speech bubble
1F441 200D 1F5E8 ; unqualified # 👁‍🗨 eye in speech bubble
1F5E8 FE0F ; fully-qualified # 🗨️ left speech bubble
1F5E8 ; unqualified # 🗨 left speech bubble
1F5EF FE0F ; fully-qualified # 🗯️ right anger bubble
1F5EF ; unqualified # 🗯 right anger bubble
1F4AD ; fully-qualified # 💭 thought balloon
1F4A4 ; fully-qualified # 💤 zzz
# Smileys & Emotion subtotal: 160
# Smileys & Emotion subtotal: 160 w/o modifiers
# group: People & Body
# subgroup: hand-fingers-open
1F44B ; fully-qualified # 👋 waving hand
1F44B 1F3FB ; fully-qualified # 👋🏻 waving hand: light skin tone
1F44B 1F3FC ; fully-qualified # 👋🏼 waving hand: medium-light skin tone
1F44B 1F3FD ; fully-qualified # 👋🏽 waving hand: medium skin tone
1F44B 1F3FE ; fully-qualified # 👋🏾 waving hand: medium-dark skin tone
1F44B 1F3FF ; fully-qualified # 👋🏿 waving hand: dark skin tone
1F91A ; fully-qualified # 🤚 raised back of hand
1F91A 1F3FB ; fully-qualified # 🤚🏻 raised back of hand: light skin tone
1F91A 1F3FC ; fully-qualified # 🤚🏼 raised back of hand: medium-light skin tone
1F91A 1F3FD ; fully-qualified # 🤚🏽 raised back of hand: medium skin tone
1F91A 1F3FE ; fully-qualified # 🤚🏾 raised back of hand: medium-dark skin tone
1F91A 1F3FF ; fully-qualified # 🤚🏿 raised back of hand: dark skin tone
1F590 FE0F ; fully-qualified # 🖐️ hand with fingers splayed
1F590 ; unqualified # 🖐 hand with fingers splayed
1F590 1F3FB ; fully-qualified # 🖐🏻 hand with fingers splayed: light skin tone
1F590 1F3FC ; fully-qualified # 🖐🏼 hand with fingers splayed: medium-light skin tone
1F590 1F3FD ; fully-qualified # 🖐🏽 hand with fingers splayed: medium skin tone
1F590 1F3FE ; fully-qualified # 🖐🏾 hand with fingers splayed: medium-dark skin tone
1F590 1F3FF ; fully-qualified # 🖐🏿 hand with fingers splayed: dark skin tone
270B ; fully-qualified # ✋ raised hand
270B 1F3FB ; fully-qualified # ✋🏻 raised hand: light skin tone
270B 1F3FC ; fully-qualified # ✋🏼 raised hand: medium-light skin tone
270B 1F3FD ; fully-qualified # ✋🏽 raised hand: medium skin tone
270B 1F3FE ; fully-qualified # ✋🏾 raised hand: medium-dark skin tone
270B 1F3FF ; fully-qualified # ✋🏿 raised hand: dark skin tone
1F596 ; fully-qualified # 🖖 vulcan salute
1F596 1F3FB ; fully-qualified # 🖖🏻 vulcan salute: light skin tone
1F596 1F3FC ; fully-qualified # 🖖🏼 vulcan salute: medium-light skin tone
1F596 1F3FD ; fully-qualified # 🖖🏽 vulcan salute: medium skin tone
1F596 1F3FE ; fully-qualified # 🖖🏾 vulcan salute: medium-dark skin tone
1F596 1F3FF ; fully-qualified # 🖖🏿 vulcan salute: dark skin tone
# subgroup: hand-fingers-partial
1F44C ; fully-qualified # 👌 OK hand
1F44C 1F3FB ; fully-qualified # 👌🏻 OK hand: light skin tone
1F44C 1F3FC ; fully-qualified # 👌🏼 OK hand: medium-light skin tone
1F44C 1F3FD ; fully-qualified # 👌🏽 OK hand: medium skin tone
1F44C 1F3FE ; fully-qualified # 👌🏾 OK hand: medium-dark skin tone
1F44C 1F3FF ; fully-qualified # 👌🏿 OK hand: dark skin tone
1F90F ; fully-qualified # 🤏 pinching hand
1F90F 1F3FB ; fully-qualified # 🤏🏻 pinching hand: light skin tone
1F90F 1F3FC ; fully-qualified # 🤏🏼 pinching hand: medium-light skin tone
1F90F 1F3FD ; fully-qualified # 🤏🏽 pinching hand: medium skin tone
1F90F 1F3FE ; fully-qualified # 🤏🏾 pinching hand: medium-dark skin tone
1F90F 1F3FF ; fully-qualified # 🤏🏿 pinching hand: dark skin tone
270C FE0F ; fully-qualified # ✌️ victory hand
270C ; unqualified # ✌ victory hand
270C 1F3FB ; fully-qualified # ✌🏻 victory hand: light skin tone
270C 1F3FC ; fully-qualified # ✌🏼 victory hand: medium-light skin tone
270C 1F3FD ; fully-qualified # ✌🏽 victory hand: medium skin tone
270C 1F3FE ; fully-qualified # ✌🏾 victory hand: medium-dark skin tone
270C 1F3FF ; fully-qualified # ✌🏿 victory hand: dark skin tone
1F91E ; fully-qualified # 🤞 crossed fingers
1F91E 1F3FB ; fully-qualified # 🤞🏻 crossed fingers: light skin tone
1F91E 1F3FC ; fully-qualified # 🤞🏼 crossed fingers: medium-light skin tone
1F91E 1F3FD ; fully-qualified # 🤞🏽 crossed fingers: medium skin tone
1F91E 1F3FE ; fully-qualified # 🤞🏾 crossed fingers: medium-dark skin tone
1F91E 1F3FF ; fully-qualified # 🤞🏿 crossed fingers: dark skin tone
1F91F ; fully-qualified # 🤟 love-you gesture
1F91F 1F3FB ; fully-qualified # 🤟🏻 love-you gesture: light skin tone
1F91F 1F3FC ; fully-qualified # 🤟🏼 love-you gesture: medium-light skin tone
1F91F 1F3FD ; fully-qualified # 🤟🏽 love-you gesture: medium skin tone
1F91F 1F3FE ; fully-qualified # 🤟🏾 love-you gesture: medium-dark skin tone
1F91F 1F3FF ; fully-qualified # 🤟🏿 love-you gesture: dark skin tone
1F918 ; fully-qualified # 🤘 sign of the horns
1F918 1F3FB ; fully-qualified # 🤘🏻 sign of the horns: light skin tone
1F918 1F3FC ; fully-qualified # 🤘🏼 sign of the horns: medium-light skin tone
1F918 1F3FD ; fully-qualified # 🤘🏽 sign of the horns: medium skin tone
1F918 1F3FE ; fully-qualified # 🤘🏾 sign of the horns: medium-dark skin tone
1F918 1F3FF ; fully-qualified # 🤘🏿 sign of the horns: dark skin tone
1F919 ; fully-qualified # 🤙 call me hand
1F919 1F3FB ; fully-qualified # 🤙🏻 call me hand: light skin tone
1F919 1F3FC ; fully-qualified # 🤙🏼 call me hand: medium-light skin tone
1F919 1F3FD ; fully-qualified # 🤙🏽 call me hand: medium skin tone
1F919 1F3FE ; fully-qualified # 🤙🏾 call me hand: medium-dark skin tone
1F919 1F3FF ; fully-qualified # 🤙🏿 call me hand: dark skin tone
# subgroup: hand-single-finger
1F448 ; fully-qualified # 👈 backhand index pointing left
1F448 1F3FB ; fully-qualified # 👈🏻 backhand index pointing left: light skin tone
1F448 1F3FC ; fully-qualified # 👈🏼 backhand index pointing left: medium-light skin tone
1F448 1F3FD ; fully-qualified # 👈🏽 backhand index pointing left: medium skin tone
1F448 1F3FE ; fully-qualified # 👈🏾 backhand index pointing left: medium-dark skin tone
1F448 1F3FF ; fully-qualified # 👈🏿 backhand index pointing left: dark skin tone
1F449 ; fully-qualified # 👉 backhand index pointing right
1F449 1F3FB ; fully-qualified # 👉🏻 backhand index pointing right: light skin tone
1F449 1F3FC ; fully-qualified # 👉🏼 backhand index pointing right: medium-light skin tone
1F449 1F3FD ; fully-qualified # 👉🏽 backhand index pointing right: medium skin tone
1F449 1F3FE ; fully-qualified # 👉🏾 backhand index pointing right: medium-dark skin tone
1F449 1F3FF ; fully-qualified # 👉🏿 backhand index pointing right: dark skin tone
1F446 ; fully-qualified # 👆 backhand index pointing up
1F446 1F3FB ; fully-qualified # 👆🏻 backhand index pointing up: light skin tone
1F446 1F3FC ; fully-qualified # 👆🏼 backhand index pointing up: medium-light skin tone
1F446 1F3FD ; fully-qualified # 👆🏽 backhand index pointing up: medium skin tone
1F446 1F3FE ; fully-qualified # 👆🏾 backhand index pointing up: medium-dark skin tone
1F446 1F3FF ; fully-qualified # 👆🏿 backhand index pointing up: dark skin tone
1F595 ; fully-qualified # 🖕 middle finger
1F595 1F3FB ; fully-qualified # 🖕🏻 middle finger: light skin tone
1F595 1F3FC ; fully-qualified # 🖕🏼 middle finger: medium-light skin tone
1F595 1F3FD ; fully-qualified # 🖕🏽 middle finger: medium skin tone
1F595 1F3FE ; fully-qualified # 🖕🏾 middle finger: medium-dark skin tone
1F595 1F3FF ; fully-qualified # 🖕🏿 middle finger: dark skin tone
1F447 ; fully-qualified # 👇 backhand index pointing down
1F447 1F3FB ; fully-qualified # 👇🏻 backhand index pointing down: light skin tone
1F447 1F3FC ; fully-qualified # 👇🏼 backhand index pointing down: medium-light skin tone
1F447 1F3FD ; fully-qualified # 👇🏽 backhand index pointing down: medium skin tone
1F447 1F3FE ; fully-qualified # 👇🏾 backhand index pointing down: medium-dark skin tone
1F447 1F3FF ; fully-qualified # 👇🏿 backhand index pointing down: dark skin tone
261D FE0F ; fully-qualified # ☝️ index pointing up
261D ; unqualified # ☝ index pointing up
261D 1F3FB ; fully-qualified # ☝🏻 index pointing up: light skin tone
261D 1F3FC ; fully-qualified # ☝🏼 index pointing up: medium-light skin tone
261D 1F3FD ; fully-qualified # ☝🏽 index pointing up: medium skin tone
261D 1F3FE ; fully-qualified # ☝🏾 index pointing up: medium-dark skin tone
261D 1F3FF ; fully-qualified # ☝🏿 index pointing up: dark skin tone
# subgroup: hand-fingers-closed
1F44D ; fully-qualified # 👍 thumbs up
1F44D 1F3FB ; fully-qualified # 👍🏻 thumbs up: light skin tone
1F44D 1F3FC ; fully-qualified # 👍🏼 thumbs up: medium-light skin tone
1F44D 1F3FD ; fully-qualified # 👍🏽 thumbs up: medium skin tone
1F44D 1F3FE ; fully-qualified # 👍🏾 thumbs up: medium-dark skin tone
1F44D 1F3FF ; fully-qualified # 👍🏿 thumbs up: dark skin tone
1F44E ; fully-qualified # 👎 thumbs down
1F44E 1F3FB ; fully-qualified # 👎🏻 thumbs down: light skin tone
1F44E 1F3FC ; fully-qualified # 👎🏼 thumbs down: medium-light skin tone
1F44E 1F3FD ; fully-qualified # 👎🏽 thumbs down: medium skin tone
1F44E 1F3FE ; fully-qualified # 👎🏾 thumbs down: medium-dark skin tone
1F44E 1F3FF ; fully-qualified # 👎🏿 thumbs down: dark skin tone
270A ; fully-qualified # ✊ raised fist
270A 1F3FB ; fully-qualified # ✊🏻 raised fist: light skin tone
270A 1F3FC ; fully-qualified # ✊🏼 raised fist: medium-light skin tone
270A 1F3FD ; fully-qualified # ✊🏽 raised fist: medium skin tone
270A 1F3FE ; fully-qualified # ✊🏾 raised fist: medium-dark skin tone
270A 1F3FF ; fully-qualified # ✊🏿 raised fist: dark skin tone
1F44A ; fully-qualified # 👊 oncoming fist
1F44A 1F3FB ; fully-qualified # 👊🏻 oncoming fist: light skin tone
1F44A 1F3FC ; fully-qualified # 👊🏼 oncoming fist: medium-light skin tone
1F44A 1F3FD ; fully-qualified # 👊🏽 oncoming fist: medium skin tone
1F44A 1F3FE ; fully-qualified # 👊🏾 oncoming fist: medium-dark skin tone
1F44A 1F3FF ; fully-qualified # 👊🏿 oncoming fist: dark skin tone
1F91B ; fully-qualified # 🤛 left-facing fist
1F91B 1F3FB ; fully-qualified # 🤛🏻 left-facing fist: light skin tone
1F91B 1F3FC ; fully-qualified # 🤛🏼 left-facing fist: medium-light skin tone
1F91B 1F3FD ; fully-qualified # 🤛🏽 left-facing fist: medium skin tone
1F91B 1F3FE ; fully-qualified # 🤛🏾 left-facing fist: medium-dark skin tone
1F91B 1F3FF ; fully-qualified # 🤛🏿 left-facing fist: dark skin tone
1F91C ; fully-qualified # 🤜 right-facing fist
1F91C 1F3FB ; fully-qualified # 🤜🏻 right-facing fist: light skin tone
1F91C 1F3FC ; fully-qualified # 🤜🏼 right-facing fist: medium-light skin tone
1F91C 1F3FD ; fully-qualified # 🤜🏽 right-facing fist: medium skin tone
1F91C 1F3FE ; fully-qualified # 🤜🏾 right-facing fist: medium-dark skin tone
1F91C 1F3FF ; fully-qualified # 🤜🏿 right-facing fist: dark skin tone
# subgroup: hands
1F44F ; fully-qualified # 👏 clapping hands
1F44F 1F3FB ; fully-qualified # 👏🏻 clapping hands: light skin tone
1F44F 1F3FC ; fully-qualified # 👏🏼 clapping hands: medium-light skin tone
1F44F 1F3FD ; fully-qualified # 👏🏽 clapping hands: medium skin tone
1F44F 1F3FE ; fully-qualified # 👏🏾 clapping hands: medium-dark skin tone
1F44F 1F3FF ; fully-qualified # 👏🏿 clapping hands: dark skin tone
1F64C ; fully-qualified # 🙌 raising hands
1F64C 1F3FB ; fully-qualified # 🙌🏻 raising hands: light skin tone
1F64C 1F3FC ; fully-qualified # 🙌🏼 raising hands: medium-light skin tone
1F64C 1F3FD ; fully-qualified # 🙌🏽 raising hands: medium skin tone
1F64C 1F3FE ; fully-qualified # 🙌🏾 raising hands: medium-dark skin tone
1F64C 1F3FF ; fully-qualified # 🙌🏿 raising hands: dark skin tone
1F450 ; fully-qualified # 👐 open hands
1F450 1F3FB ; fully-qualified # 👐🏻 open hands: light skin tone
1F450 1F3FC ; fully-qualified # 👐🏼 open hands: medium-light skin tone
1F450 1F3FD ; fully-qualified # 👐🏽 open hands: medium skin tone
1F450 1F3FE ; fully-qualified # 👐🏾 open hands: medium-dark skin tone
1F450 1F3FF ; fully-qualified # 👐🏿 open hands: dark skin tone
1F932 ; fully-qualified # 🤲 palms up together
1F932 1F3FB ; fully-qualified # 🤲🏻 palms up together: light skin tone
1F932 1F3FC ; fully-qualified # 🤲🏼 palms up together: medium-light skin tone
1F932 1F3FD ; fully-qualified # 🤲🏽 palms up together: medium skin tone
1F932 1F3FE ; fully-qualified # 🤲🏾 palms up together: medium-dark skin tone
1F932 1F3FF ; fully-qualified # 🤲🏿 palms up together: dark skin tone
1F91D ; fully-qualified # 🤝 handshake
1F64F ; fully-qualified # 🙏 folded hands
1F64F 1F3FB ; fully-qualified # 🙏🏻 folded hands: light skin tone
1F64F 1F3FC ; fully-qualified # 🙏🏼 folded hands: medium-light skin tone
1F64F 1F3FD ; fully-qualified # 🙏🏽 folded hands: medium skin tone
1F64F 1F3FE ; fully-qualified # 🙏🏾 folded hands: medium-dark skin tone
1F64F 1F3FF ; fully-qualified # 🙏🏿 folded hands: dark skin tone
# subgroup: hand-prop
270D FE0F ; fully-qualified # ✍️ writing hand
270D ; unqualified # ✍ writing hand
270D 1F3FB ; fully-qualified # ✍🏻 writing hand: light skin tone
270D 1F3FC ; fully-qualified # ✍🏼 writing hand: medium-light skin tone
270D 1F3FD ; fully-qualified # ✍🏽 writing hand: medium skin tone
270D 1F3FE ; fully-qualified # ✍🏾 writing hand: medium-dark skin tone
270D 1F3FF ; fully-qualified # ✍🏿 writing hand: dark skin tone
1F485 ; fully-qualified # 💅 nail polish
1F485 1F3FB ; fully-qualified # 💅🏻 nail polish: light skin tone
1F485 1F3FC ; fully-qualified # 💅🏼 nail polish: medium-light skin tone
1F485 1F3FD ; fully-qualified # 💅🏽 nail polish: medium skin tone
1F485 1F3FE ; fully-qualified # 💅🏾 nail polish: medium-dark skin tone
1F485 1F3FF ; fully-qualified # 💅🏿 nail polish: dark skin tone
1F933 ; fully-qualified # 🤳 selfie
1F933 1F3FB ; fully-qualified # 🤳🏻 selfie: light skin tone
1F933 1F3FC ; fully-qualified # 🤳🏼 selfie: medium-light skin tone
1F933 1F3FD ; fully-qualified # 🤳🏽 selfie: medium skin tone
1F933 1F3FE ; fully-qualified # 🤳🏾 selfie: medium-dark skin tone
1F933 1F3FF ; fully-qualified # 🤳🏿 selfie: dark skin tone
# subgroup: body-parts
1F4AA ; fully-qualified # 💪 flexed biceps
1F4AA 1F3FB ; fully-qualified # 💪🏻 flexed biceps: light skin tone
1F4AA 1F3FC ; fully-qualified # 💪🏼 flexed biceps: medium-light skin tone
1F4AA 1F3FD ; fully-qualified # 💪🏽 flexed biceps: medium skin tone
1F4AA 1F3FE ; fully-qualified # 💪🏾 flexed biceps: medium-dark skin tone
1F4AA 1F3FF ; fully-qualified # 💪🏿 flexed biceps: dark skin tone
1F9BE ; fully-qualified # 🦾 mechanical arm
1F9BF ; fully-qualified # 🦿 mechanical leg
1F9B5 ; fully-qualified # 🦵 leg
1F9B5 1F3FB ; fully-qualified # 🦵🏻 leg: light skin tone
1F9B5 1F3FC ; fully-qualified # 🦵🏼 leg: medium-light skin tone
1F9B5 1F3FD ; fully-qualified # 🦵🏽 leg: medium skin tone
1F9B5 1F3FE ; fully-qualified # 🦵🏾 leg: medium-dark skin tone
1F9B5 1F3FF ; fully-qualified # 🦵🏿 leg: dark skin tone
1F9B6 ; fully-qualified # 🦶 foot
1F9B6 1F3FB ; fully-qualified # 🦶🏻 foot: light skin tone
1F9B6 1F3FC ; fully-qualified # 🦶🏼 foot: medium-light skin tone
1F9B6 1F3FD ; fully-qualified # 🦶🏽 foot: medium skin tone
1F9B6 1F3FE ; fully-qualified # 🦶🏾 foot: medium-dark skin tone
1F9B6 1F3FF ; fully-qualified # 🦶🏿 foot: dark skin tone
1F442 ; fully-qualified # 👂 ear
1F442 1F3FB ; fully-qualified # 👂🏻 ear: light skin tone
1F442 1F3FC ; fully-qualified # 👂🏼 ear: medium-light skin tone
1F442 1F3FD ; fully-qualified # 👂🏽 ear: medium skin tone
1F442 1F3FE ; fully-qualified # 👂🏾 ear: medium-dark skin tone
1F442 1F3FF ; fully-qualified # 👂🏿 ear: dark skin tone
1F9BB ; fully-qualified # 🦻 ear with hearing aid
1F9BB 1F3FB ; fully-qualified # 🦻🏻 ear with hearing aid: light skin tone
1F9BB 1F3FC ; fully-qualified # 🦻🏼 ear with hearing aid: medium-light skin tone
1F9BB 1F3FD ; fully-qualified # 🦻🏽 ear with hearing aid: medium skin tone
1F9BB 1F3FE ; fully-qualified # 🦻🏾 ear with hearing aid: medium-dark skin tone
1F9BB 1F3FF ; fully-qualified # 🦻🏿 ear with hearing aid: dark skin tone
1F443 ; fully-qualified # 👃 nose
1F443 1F3FB ; fully-qualified # 👃🏻 nose: light skin tone
1F443 1F3FC ; fully-qualified # 👃🏼 nose: medium-light skin tone
1F443 1F3FD ; fully-qualified # 👃🏽 nose: medium skin tone
1F443 1F3FE ; fully-qualified # 👃🏾 nose: medium-dark skin tone
1F443 1F3FF ; fully-qualified # 👃🏿 nose: dark skin tone
1F9E0 ; fully-qualified # 🧠 brain
1F9B7 ; fully-qualified # 🦷 tooth
1F9B4 ; fully-qualified # 🦴 bone
1F440 ; fully-qualified # 👀 eyes
1F441 FE0F ; fully-qualified # 👁️ eye
1F441 ; unqualified # 👁 eye
1F445 ; fully-qualified # 👅 tongue
1F444 ; fully-qualified # 👄 mouth
# subgroup: person
1F476 ; fully-qualified # 👶 baby
1F476 1F3FB ; fully-qualified # 👶🏻 baby: light skin tone
1F476 1F3FC ; fully-qualified # 👶🏼 baby: medium-light skin tone
1F476 1F3FD ; fully-qualified # 👶🏽 baby: medium skin tone
1F476 1F3FE ; fully-qualified # 👶🏾 baby: medium-dark skin tone
1F476 1F3FF ; fully-qualified # 👶🏿 baby: dark skin tone
1F9D2 ; fully-qualified # 🧒 child
1F9D2 1F3FB ; fully-qualified # 🧒🏻 child: light skin tone
1F9D2 1F3FC ; fully-qualified # 🧒🏼 child: medium-light skin tone
1F9D2 1F3FD ; fully-qualified # 🧒🏽 child: medium skin tone
1F9D2 1F3FE ; fully-qualified # 🧒🏾 child: medium-dark skin tone
1F9D2 1F3FF ; fully-qualified # 🧒🏿 child: dark skin tone
1F466 ; fully-qualified # 👦 boy
1F466 1F3FB ; fully-qualified # 👦🏻 boy: light skin tone
1F466 1F3FC ; fully-qualified # 👦🏼 boy: medium-light skin tone
1F466 1F3FD ; fully-qualified # 👦🏽 boy: medium skin tone
1F466 1F3FE ; fully-qualified # 👦🏾 boy: medium-dark skin tone
1F466 1F3FF ; fully-qualified # 👦🏿 boy: dark skin tone
1F467 ; fully-qualified # 👧 girl
1F467 1F3FB ; fully-qualified # 👧🏻 girl: light skin tone
1F467 1F3FC ; fully-qualified # 👧🏼 girl: medium-light skin tone
1F467 1F3FD ; fully-qualified # 👧🏽 girl: medium skin tone
1F467 1F3FE ; fully-qualified # 👧🏾 girl: medium-dark skin tone
1F467 1F3FF ; fully-qualified # 👧🏿 girl: dark skin tone
1F9D1 ; fully-qualified # 🧑 person
1F9D1 1F3FB ; fully-qualified # 🧑🏻 person: light skin tone
1F9D1 1F3FC ; fully-qualified # 🧑🏼 person: medium-light skin tone
1F9D1 1F3FD ; fully-qualified # 🧑🏽 person: medium skin tone
1F9D1 1F3FE ; fully-qualified # 🧑🏾 person: medium-dark skin tone
1F9D1 1F3FF ; fully-qualified # 🧑🏿 person: dark skin tone
1F471 ; fully-qualified # 👱 person: blond hair
1F471 1F3FB ; fully-qualified # 👱🏻 person: light skin tone, blond hair
1F471 1F3FC ; fully-qualified # 👱🏼 person: medium-light skin tone, blond hair
1F471 1F3FD ; fully-qualified # 👱🏽 person: medium skin tone, blond hair
1F471 1F3FE ; fully-qualified # 👱🏾 person: medium-dark skin tone, blond hair
1F471 1F3FF ; fully-qualified # 👱🏿 person: dark skin tone, blond hair
1F468 ; fully-qualified # 👨 man
1F468 1F3FB ; fully-qualified # 👨🏻 man: light skin tone
1F468 1F3FC ; fully-qualified # 👨🏼 man: medium-light skin tone
1F468 1F3FD ; fully-qualified # 👨🏽 man: medium skin tone
1F468 1F3FE ; fully-qualified # 👨🏾 man: medium-dark skin tone
1F468 1F3FF ; fully-qualified # 👨🏿 man: dark skin tone
1F9D4 ; fully-qualified # 🧔 man: beard
1F9D4 1F3FB ; fully-qualified # 🧔🏻 man: light skin tone, beard
1F9D4 1F3FC ; fully-qualified # 🧔🏼 man: medium-light skin tone, beard
1F9D4 1F3FD ; fully-qualified # 🧔🏽 man: medium skin tone, beard
1F9D4 1F3FE ; fully-qualified # 🧔🏾 man: medium-dark skin tone, beard
1F9D4 1F3FF ; fully-qualified # 🧔🏿 man: dark skin tone, beard
1F471 200D 2642 FE0F ; fully-qualified # 👱‍♂️ man: blond hair
1F471 200D 2642 ; minimally-qualified # 👱‍♂ man: blond hair
1F471 1F3FB 200D 2642 FE0F ; fully-qualified # 👱🏻‍♂️ man: light skin tone, blond hair
1F471 1F3FB 200D 2642 ; minimally-qualified # 👱🏻‍♂ man: light skin tone, blond hair
1F471 1F3FC 200D 2642 FE0F ; fully-qualified # 👱🏼‍♂️ man: medium-light skin tone, blond hair
1F471 1F3FC 200D 2642 ; minimally-qualified # 👱🏼‍♂ man: medium-light skin tone, blond hair
1F471 1F3FD 200D 2642 FE0F ; fully-qualified # 👱🏽‍♂️ man: medium skin tone, blond hair
1F471 1F3FD 200D 2642 ; minimally-qualified # 👱🏽‍♂ man: medium skin tone, blond hair
1F471 1F3FE 200D 2642 FE0F ; fully-qualified # 👱🏾‍♂️ man: medium-dark skin tone, blond hair
1F471 1F3FE 200D 2642 ; minimally-qualified # 👱🏾‍♂ man: medium-dark skin tone, blond hair
1F471 1F3FF 200D 2642 FE0F ; fully-qualified # 👱🏿‍♂️ man: dark skin tone, blond hair
1F471 1F3FF 200D 2642 ; minimally-qualified # 👱🏿‍♂ man: dark skin tone, blond hair
1F468 200D 1F9B0 ; fully-qualified # 👨‍🦰 man: red hair
1F468 1F3FB 200D 1F9B0 ; fully-qualified # 👨🏻‍🦰 man: light skin tone, red hair
1F468 1F3FC 200D 1F9B0 ; fully-qualified # 👨🏼‍🦰 man: medium-light skin tone, red hair
1F468 1F3FD 200D 1F9B0 ; fully-qualified # 👨🏽‍🦰 man: medium skin tone, red hair
1F468 1F3FE 200D 1F9B0 ; fully-qualified # 👨🏾‍🦰 man: medium-dark skin tone, red hair
1F468 1F3FF 200D 1F9B0 ; fully-qualified # 👨🏿‍🦰 man: dark skin tone, red hair
1F468 200D 1F9B1 ; fully-qualified # 👨‍🦱 man: curly hair
1F468 1F3FB 200D 1F9B1 ; fully-qualified # 👨🏻‍🦱 man: light skin tone, curly hair
1F468 1F3FC 200D 1F9B1 ; fully-qualified # 👨🏼‍🦱 man: medium-light skin tone, curly hair
1F468 1F3FD 200D 1F9B1 ; fully-qualified # 👨🏽‍🦱 man: medium skin tone, curly hair
1F468 1F3FE 200D 1F9B1 ; fully-qualified # 👨🏾‍🦱 man: medium-dark skin tone, curly hair
1F468 1F3FF 200D 1F9B1 ; fully-qualified # 👨🏿‍🦱 man: dark skin tone, curly hair
1F468 200D 1F9B3 ; fully-qualified # 👨‍🦳 man: white hair
1F468 1F3FB 200D 1F9B3 ; fully-qualified # 👨🏻‍🦳 man: light skin tone, white hair
1F468 1F3FC 200D 1F9B3 ; fully-qualified # 👨🏼‍🦳 man: medium-light skin tone, white hair
1F468 1F3FD 200D 1F9B3 ; fully-qualified # 👨🏽‍🦳 man: medium skin tone, white hair
1F468 1F3FE 200D 1F9B3 ; fully-qualified # 👨🏾‍🦳 man: medium-dark skin tone, white hair
1F468 1F3FF 200D 1F9B3 ; fully-qualified # 👨🏿‍🦳 man: dark skin tone, white hair
1F468 200D 1F9B2 ; fully-qualified # 👨‍🦲 man: bald
1F468 1F3FB 200D 1F9B2 ; fully-qualified # 👨🏻‍🦲 man: light skin tone, bald
1F468 1F3FC 200D 1F9B2 ; fully-qualified # 👨🏼‍🦲 man: medium-light skin tone, bald
1F468 1F3FD 200D 1F9B2 ; fully-qualified # 👨🏽‍🦲 man: medium skin tone, bald
1F468 1F3FE 200D 1F9B2 ; fully-qualified # 👨🏾‍🦲 man: medium-dark skin tone, bald
1F468 1F3FF 200D 1F9B2 ; fully-qualified # 👨🏿‍🦲 man: dark skin tone, bald
1F469 ; fully-qualified # 👩 woman
1F469 1F3FB ; fully-qualified # 👩🏻 woman: light skin tone
1F469 1F3FC ; fully-qualified # 👩🏼 woman: medium-light skin tone
1F469 1F3FD ; fully-qualified # 👩🏽 woman: medium skin tone
1F469 1F3FE ; fully-qualified # 👩🏾 woman: medium-dark skin tone
1F469 1F3FF ; fully-qualified # 👩🏿 woman: dark skin tone
1F471 200D 2640 FE0F ; fully-qualified # 👱‍♀️ woman: blond hair
1F471 200D 2640 ; minimally-qualified # 👱‍♀ woman: blond hair
1F471 1F3FB 200D 2640 FE0F ; fully-qualified # 👱🏻‍♀️ woman: light skin tone, blond hair
1F471 1F3FB 200D 2640 ; minimally-qualified # 👱🏻‍♀ woman: light skin tone, blond hair
1F471 1F3FC 200D 2640 FE0F ; fully-qualified # 👱🏼‍♀️ woman: medium-light skin tone, blond hair
1F471 1F3FC 200D 2640 ; minimally-qualified # 👱🏼‍♀ woman: medium-light skin tone, blond hair
1F471 1F3FD 200D 2640 FE0F ; fully-qualified # 👱🏽‍♀️ woman: medium skin tone, blond hair
1F471 1F3FD 200D 2640 ; minimally-qualified # 👱🏽‍♀ woman: medium skin tone, blond hair
1F471 1F3FE 200D 2640 FE0F ; fully-qualified # 👱🏾‍♀️ woman: medium-dark skin tone, blond hair
1F471 1F3FE 200D 2640 ; minimally-qualified # 👱🏾‍♀ woman: medium-dark skin tone, blond hair
1F471 1F3FF 200D 2640 FE0F ; fully-qualified # 👱🏿‍♀️ woman: dark skin tone, blond hair
1F471 1F3FF 200D 2640 ; minimally-qualified # 👱🏿‍♀ woman: dark skin tone, blond hair
1F469 200D 1F9B0 ; fully-qualified # 👩‍🦰 woman: red hair
1F469 1F3FB 200D 1F9B0 ; fully-qualified # 👩🏻‍🦰 woman: light skin tone, red hair
1F469 1F3FC 200D 1F9B0 ; fully-qualified # 👩🏼‍🦰 woman: medium-light skin tone, red hair
1F469 1F3FD 200D 1F9B0 ; fully-qualified # 👩🏽‍🦰 woman: medium skin tone, red hair
1F469 1F3FE 200D 1F9B0 ; fully-qualified # 👩🏾‍🦰 woman: medium-dark skin tone, red hair
1F469 1F3FF 200D 1F9B0 ; fully-qualified # 👩🏿‍🦰 woman: dark skin tone, red hair
1F469 200D 1F9B1 ; fully-qualified # 👩‍🦱 woman: curly hair
1F469 1F3FB 200D 1F9B1 ; fully-qualified # 👩🏻‍🦱 woman: light skin tone, curly hair
1F469 1F3FC 200D 1F9B1 ; fully-qualified # 👩🏼‍🦱 woman: medium-light skin tone, curly hair
1F469 1F3FD 200D 1F9B1 ; fully-qualified # 👩🏽‍🦱 woman: medium skin tone, curly hair
1F469 1F3FE 200D 1F9B1 ; fully-qualified # 👩🏾‍🦱 woman: medium-dark skin tone, curly hair
1F469 1F3FF 200D 1F9B1 ; fully-qualified # 👩🏿‍🦱 woman: dark skin tone, curly hair
1F469 200D 1F9B3 ; fully-qualified # 👩‍🦳 woman: white hair
1F469 1F3FB 200D 1F9B3 ; fully-qualified # 👩🏻‍🦳 woman: light skin tone, white hair
1F469 1F3FC 200D 1F9B3 ; fully-qualified # 👩🏼‍🦳 woman: medium-light skin tone, white hair
1F469 1F3FD 200D 1F9B3 ; fully-qualified # 👩🏽‍🦳 woman: medium skin tone, white hair
1F469 1F3FE 200D 1F9B3 ; fully-qualified # 👩🏾‍🦳 woman: medium-dark skin tone, white hair
1F469 1F3FF 200D 1F9B3 ; fully-qualified # 👩🏿‍🦳 woman: dark skin tone, white hair
1F469 200D 1F9B2 ; fully-qualified # 👩‍🦲 woman: bald
1F469 1F3FB 200D 1F9B2 ; fully-qualified # 👩🏻‍🦲 woman: light skin tone, bald
1F469 1F3FC 200D 1F9B2 ; fully-qualified # 👩🏼‍🦲 woman: medium-light skin tone, bald
1F469 1F3FD 200D 1F9B2 ; fully-qualified # 👩🏽‍🦲 woman: medium skin tone, bald
1F469 1F3FE 200D 1F9B2 ; fully-qualified # 👩🏾‍🦲 woman: medium-dark skin tone, bald
1F469 1F3FF 200D 1F9B2 ; fully-qualified # 👩🏿‍🦲 woman: dark skin tone, bald
1F9D3 ; fully-qualified # 🧓 older person
1F9D3 1F3FB ; fully-qualified # 🧓🏻 older person: light skin tone
1F9D3 1F3FC ; fully-qualified # 🧓🏼 older person: medium-light skin tone
1F9D3 1F3FD ; fully-qualified # 🧓🏽 older person: medium skin tone
1F9D3 1F3FE ; fully-qualified # 🧓🏾 older person: medium-dark skin tone
1F9D3 1F3FF ; fully-qualified # 🧓🏿 older person: dark skin tone
1F474 ; fully-qualified # 👴 old man
1F474 1F3FB ; fully-qualified # 👴🏻 old man: light skin tone
1F474 1F3FC ; fully-qualified # 👴🏼 old man: medium-light skin tone
1F474 1F3FD ; fully-qualified # 👴🏽 old man: medium skin tone
1F474 1F3FE ; fully-qualified # 👴🏾 old man: medium-dark skin tone
1F474 1F3FF ; fully-qualified # 👴🏿 old man: dark skin tone
1F475 ; fully-qualified # 👵 old woman
1F475 1F3FB ; fully-qualified # 👵🏻 old woman: light skin tone
1F475 1F3FC ; fully-qualified # 👵🏼 old woman: medium-light skin tone
1F475 1F3FD ; fully-qualified # 👵🏽 old woman: medium skin tone
1F475 1F3FE ; fully-qualified # 👵🏾 old woman: medium-dark skin tone
1F475 1F3FF ; fully-qualified # 👵🏿 old woman: dark skin tone
# subgroup: person-gesture
1F64D ; fully-qualified # 🙍 person frowning
1F64D 1F3FB ; fully-qualified # 🙍🏻 person frowning: light skin tone
1F64D 1F3FC ; fully-qualified # 🙍🏼 person frowning: medium-light skin tone
1F64D 1F3FD ; fully-qualified # 🙍🏽 person frowning: medium skin tone
1F64D 1F3FE ; fully-qualified # 🙍🏾 person frowning: medium-dark skin tone
1F64D 1F3FF ; fully-qualified # 🙍🏿 person frowning: dark skin tone
1F64D 200D 2642 FE0F ; fully-qualified # 🙍‍♂️ man frowning
1F64D 200D 2642 ; minimally-qualified # 🙍‍♂ man frowning
1F64D 1F3FB 200D 2642 FE0F ; fully-qualified # 🙍🏻‍♂️ man frowning: light skin tone
1F64D 1F3FB 200D 2642 ; minimally-qualified # 🙍🏻‍♂ man frowning: light skin tone
1F64D 1F3FC 200D 2642 FE0F ; fully-qualified # 🙍🏼‍♂️ man frowning: medium-light skin tone
1F64D 1F3FC 200D 2642 ; minimally-qualified # 🙍🏼‍♂ man frowning: medium-light skin tone
1F64D 1F3FD 200D 2642 FE0F ; fully-qualified # 🙍🏽‍♂️ man frowning: medium skin tone
1F64D 1F3FD 200D 2642 ; minimally-qualified # 🙍🏽‍♂ man frowning: medium skin tone
1F64D 1F3FE 200D 2642 FE0F ; fully-qualified # 🙍🏾‍♂️ man frowning: medium-dark skin tone
1F64D 1F3FE 200D 2642 ; minimally-qualified # 🙍🏾‍♂ man frowning: medium-dark skin tone
1F64D 1F3FF 200D 2642 FE0F ; fully-qualified # 🙍🏿‍♂️ man frowning: dark skin tone
1F64D 1F3FF 200D 2642 ; minimally-qualified # 🙍🏿‍♂ man frowning: dark skin tone
1F64D 200D 2640 FE0F ; fully-qualified # 🙍‍♀️ woman frowning
1F64D 200D 2640 ; minimally-qualified # 🙍‍♀ woman frowning
1F64D 1F3FB 200D 2640 FE0F ; fully-qualified # 🙍🏻‍♀️ woman frowning: light skin tone
1F64D 1F3FB 200D 2640 ; minimally-qualified # 🙍🏻‍♀ woman frowning: light skin tone
1F64D 1F3FC 200D 2640 FE0F ; fully-qualified # 🙍🏼‍♀️ woman frowning: medium-light skin tone
1F64D 1F3FC 200D 2640 ; minimally-qualified # 🙍🏼‍♀ woman frowning: medium-light skin tone
1F64D 1F3FD 200D 2640 FE0F ; fully-qualified # 🙍🏽‍♀️ woman frowning: medium skin tone
1F64D 1F3FD 200D 2640 ; minimally-qualified # 🙍🏽‍♀ woman frowning: medium skin tone
1F64D 1F3FE 200D 2640 FE0F ; fully-qualified # 🙍🏾‍♀️ woman frowning: medium-dark skin tone
1F64D 1F3FE 200D 2640 ; minimally-qualified # 🙍🏾‍♀ woman frowning: medium-dark skin tone
1F64D 1F3FF 200D 2640 FE0F ; fully-qualified # 🙍🏿‍♀️ woman frowning: dark skin tone
1F64D 1F3FF 200D 2640 ; minimally-qualified # 🙍🏿‍♀ woman frowning: dark skin tone
1F64E ; fully-qualified # 🙎 person pouting
1F64E 1F3FB ; fully-qualified # 🙎🏻 person pouting: light skin tone
1F64E 1F3FC ; fully-qualified # 🙎🏼 person pouting: medium-light skin tone
1F64E 1F3FD ; fully-qualified # 🙎🏽 person pouting: medium skin tone
1F64E 1F3FE ; fully-qualified # 🙎🏾 person pouting: medium-dark skin tone
1F64E 1F3FF ; fully-qualified # 🙎🏿 person pouting: dark skin tone
1F64E 200D 2642 FE0F ; fully-qualified # 🙎‍♂️ man pouting
1F64E 200D 2642 ; minimally-qualified # 🙎‍♂ man pouting
1F64E 1F3FB 200D 2642 FE0F ; fully-qualified # 🙎🏻‍♂️ man pouting: light skin tone
1F64E 1F3FB 200D 2642 ; minimally-qualified # 🙎🏻‍♂ man pouting: light skin tone
1F64E 1F3FC 200D 2642 FE0F ; fully-qualified # 🙎🏼‍♂️ man pouting: medium-light skin tone
1F64E 1F3FC 200D 2642 ; minimally-qualified # 🙎🏼‍♂ man pouting: medium-light skin tone
1F64E 1F3FD 200D 2642 FE0F ; fully-qualified # 🙎🏽‍♂️ man pouting: medium skin tone
1F64E 1F3FD 200D 2642 ; minimally-qualified # 🙎🏽‍♂ man pouting: medium skin tone
1F64E 1F3FE 200D 2642 FE0F ; fully-qualified # 🙎🏾‍♂️ man pouting: medium-dark skin tone
1F64E 1F3FE 200D 2642 ; minimally-qualified # 🙎🏾‍♂ man pouting: medium-dark skin tone
1F64E 1F3FF 200D 2642 FE0F ; fully-qualified # 🙎🏿‍♂️ man pouting: dark skin tone
1F64E 1F3FF 200D 2642 ; minimally-qualified # 🙎🏿‍♂ man pouting: dark skin tone
1F64E 200D 2640 FE0F ; fully-qualified # 🙎‍♀️ woman pouting
1F64E 200D 2640 ; minimally-qualified # 🙎‍♀ woman pouting
1F64E 1F3FB 200D 2640 FE0F ; fully-qualified # 🙎🏻‍♀️ woman pouting: light skin tone
1F64E 1F3FB 200D 2640 ; minimally-qualified # 🙎🏻‍♀ woman pouting: light skin tone
1F64E 1F3FC 200D 2640 FE0F ; fully-qualified # 🙎🏼‍♀️ woman pouting: medium-light skin tone
1F64E 1F3FC 200D 2640 ; minimally-qualified # 🙎🏼‍♀ woman pouting: medium-light skin tone
1F64E 1F3FD 200D 2640 FE0F ; fully-qualified # 🙎🏽‍♀️ woman pouting: medium skin tone
1F64E 1F3FD 200D 2640 ; minimally-qualified # 🙎🏽‍♀ woman pouting: medium skin tone
1F64E 1F3FE 200D 2640 FE0F ; fully-qualified # 🙎🏾‍♀️ woman pouting: medium-dark skin tone
1F64E 1F3FE 200D 2640 ; minimally-qualified # 🙎🏾‍♀ woman pouting: medium-dark skin tone
1F64E 1F3FF 200D 2640 FE0F ; fully-qualified # 🙎🏿‍♀️ woman pouting: dark skin tone
1F64E 1F3FF 200D 2640 ; minimally-qualified # 🙎🏿‍♀ woman pouting: dark skin tone
1F645 ; fully-qualified # 🙅 person gesturing NO
1F645 1F3FB ; fully-qualified # 🙅🏻 person gesturing NO: light skin tone
1F645 1F3FC ; fully-qualified # 🙅🏼 person gesturing NO: medium-light skin tone
1F645 1F3FD ; fully-qualified # 🙅🏽 person gesturing NO: medium skin tone
1F645 1F3FE ; fully-qualified # 🙅🏾 person gesturing NO: medium-dark skin tone
1F645 1F3FF ; fully-qualified # 🙅🏿 person gesturing NO: dark skin tone
1F645 200D 2642 FE0F ; fully-qualified # 🙅‍♂️ man gesturing NO
1F645 200D 2642 ; minimally-qualified # 🙅‍♂ man gesturing NO
1F645 1F3FB 200D 2642 FE0F ; fully-qualified # 🙅🏻‍♂️ man gesturing NO: light skin tone
1F645 1F3FB 200D 2642 ; minimally-qualified # 🙅🏻‍♂ man gesturing NO: light skin tone
1F645 1F3FC 200D 2642 FE0F ; fully-qualified # 🙅🏼‍♂️ man gesturing NO: medium-light skin tone
1F645 1F3FC 200D 2642 ; minimally-qualified # 🙅🏼‍♂ man gesturing NO: medium-light skin tone
1F645 1F3FD 200D 2642 FE0F ; fully-qualified # 🙅🏽‍♂️ man gesturing NO: medium skin tone
1F645 1F3FD 200D 2642 ; minimally-qualified # 🙅🏽‍♂ man gesturing NO: medium skin tone
1F645 1F3FE 200D 2642 FE0F ; fully-qualified # 🙅🏾‍♂️ man gesturing NO: medium-dark skin tone
1F645 1F3FE 200D 2642 ; minimally-qualified # 🙅🏾‍♂ man gesturing NO: medium-dark skin tone
1F645 1F3FF 200D 2642 FE0F ; fully-qualified # 🙅🏿‍♂️ man gesturing NO: dark skin tone
1F645 1F3FF 200D 2642 ; minimally-qualified # 🙅🏿‍♂ man gesturing NO: dark skin tone
1F645 200D 2640 FE0F ; fully-qualified # 🙅‍♀️ woman gesturing NO
1F645 200D 2640 ; minimally-qualified # 🙅‍♀ woman gesturing NO
1F645 1F3FB 200D 2640 FE0F ; fully-qualified # 🙅🏻‍♀️ woman gesturing NO: light skin tone
1F645 1F3FB 200D 2640 ; minimally-qualified # 🙅🏻‍♀ woman gesturing NO: light skin tone
1F645 1F3FC 200D 2640 FE0F ; fully-qualified # 🙅🏼‍♀️ woman gesturing NO: medium-light skin tone
1F645 1F3FC 200D 2640 ; minimally-qualified # 🙅🏼‍♀ woman gesturing NO: medium-light skin tone
1F645 1F3FD 200D 2640 FE0F ; fully-qualified # 🙅🏽‍♀️ woman gesturing NO: medium skin tone
1F645 1F3FD 200D 2640 ; minimally-qualified # 🙅🏽‍♀ woman gesturing NO: medium skin tone
1F645 1F3FE 200D 2640 FE0F ; fully-qualified # 🙅🏾‍♀️ woman gesturing NO: medium-dark skin tone
1F645 1F3FE 200D 2640 ; minimally-qualified # 🙅🏾‍♀ woman gesturing NO: medium-dark skin tone
1F645 1F3FF 200D 2640 FE0F ; fully-qualified # 🙅🏿‍♀️ woman gesturing NO: dark skin tone
1F645 1F3FF 200D 2640 ; minimally-qualified # 🙅🏿‍♀ woman gesturing NO: dark skin tone
1F646 ; fully-qualified # 🙆 person gesturing OK
1F646 1F3FB ; fully-qualified # 🙆🏻 person gesturing OK: light skin tone
1F646 1F3FC ; fully-qualified # 🙆🏼 person gesturing OK: medium-light skin tone
1F646 1F3FD ; fully-qualified # 🙆🏽 person gesturing OK: medium skin tone
1F646 1F3FE ; fully-qualified # 🙆🏾 person gesturing OK: medium-dark skin tone
1F646 1F3FF ; fully-qualified # 🙆🏿 person gesturing OK: dark skin tone
1F646 200D 2642 FE0F ; fully-qualified # 🙆‍♂️ man gesturing OK
1F646 200D 2642 ; minimally-qualified # 🙆‍♂ man gesturing OK
1F646 1F3FB 200D 2642 FE0F ; fully-qualified # 🙆🏻‍♂️ man gesturing OK: light skin tone
1F646 1F3FB 200D 2642 ; minimally-qualified # 🙆🏻‍♂ man gesturing OK: light skin tone
1F646 1F3FC 200D 2642 FE0F ; fully-qualified # 🙆🏼‍♂️ man gesturing OK: medium-light skin tone
1F646 1F3FC 200D 2642 ; minimally-qualified # 🙆🏼‍♂ man gesturing OK: medium-light skin tone
1F646 1F3FD 200D 2642 FE0F ; fully-qualified # 🙆🏽‍♂️ man gesturing OK: medium skin tone
1F646 1F3FD 200D 2642 ; minimally-qualified # 🙆🏽‍♂ man gesturing OK: medium skin tone
1F646 1F3FE 200D 2642 FE0F ; fully-qualified # 🙆🏾‍♂️ man gesturing OK: medium-dark skin tone
1F646 1F3FE 200D 2642 ; minimally-qualified # 🙆🏾‍♂ man gesturing OK: medium-dark skin tone
1F646 1F3FF 200D 2642 FE0F ; fully-qualified # 🙆🏿‍♂️ man gesturing OK: dark skin tone
1F646 1F3FF 200D 2642 ; minimally-qualified # 🙆🏿‍♂ man gesturing OK: dark skin tone
1F646 200D 2640 FE0F ; fully-qualified # 🙆‍♀️ woman gesturing OK
1F646 200D 2640 ; minimally-qualified # 🙆‍♀ woman gesturing OK
1F646 1F3FB 200D 2640 FE0F ; fully-qualified # 🙆🏻‍♀️ woman gesturing OK: light skin tone
1F646 1F3FB 200D 2640 ; minimally-qualified # 🙆🏻‍♀ woman gesturing OK: light skin tone
1F646 1F3FC 200D 2640 FE0F ; fully-qualified # 🙆🏼‍♀️ woman gesturing OK: medium-light skin tone
1F646 1F3FC 200D 2640 ; minimally-qualified # 🙆🏼‍♀ woman gesturing OK: medium-light skin tone
1F646 1F3FD 200D 2640 FE0F ; fully-qualified # 🙆🏽‍♀️ woman gesturing OK: medium skin tone
1F646 1F3FD 200D 2640 ; minimally-qualified # 🙆🏽‍♀ woman gesturing OK: medium skin tone
1F646 1F3FE 200D 2640 FE0F ; fully-qualified # 🙆🏾‍♀️ woman gesturing OK: medium-dark skin tone
1F646 1F3FE 200D 2640 ; minimally-qualified # 🙆🏾‍♀ woman gesturing OK: medium-dark skin tone
1F646 1F3FF 200D 2640 FE0F ; fully-qualified # 🙆🏿‍♀️ woman gesturing OK: dark skin tone
1F646 1F3FF 200D 2640 ; minimally-qualified # 🙆🏿‍♀ woman gesturing OK: dark skin tone
1F481 ; fully-qualified # 💁 person tipping hand
1F481 1F3FB ; fully-qualified # 💁🏻 person tipping hand: light skin tone
1F481 1F3FC ; fully-qualified # 💁🏼 person tipping hand: medium-light skin tone
1F481 1F3FD ; fully-qualified # 💁🏽 person tipping hand: medium skin tone
1F481 1F3FE ; fully-qualified # 💁🏾 person tipping hand: medium-dark skin tone
1F481 1F3FF ; fully-qualified # 💁🏿 person tipping hand: dark skin tone
1F481 200D 2642 FE0F ; fully-qualified # 💁‍♂️ man tipping hand
1F481 200D 2642 ; minimally-qualified # 💁‍♂ man tipping hand
1F481 1F3FB 200D 2642 FE0F ; fully-qualified # 💁🏻‍♂️ man tipping hand: light skin tone
1F481 1F3FB 200D 2642 ; minimally-qualified # 💁🏻‍♂ man tipping hand: light skin tone
1F481 1F3FC 200D 2642 FE0F ; fully-qualified # 💁🏼‍♂️ man tipping hand: medium-light skin tone
1F481 1F3FC 200D 2642 ; minimally-qualified # 💁🏼‍♂ man tipping hand: medium-light skin tone
1F481 1F3FD 200D 2642 FE0F ; fully-qualified # 💁🏽‍♂️ man tipping hand: medium skin tone
1F481 1F3FD 200D 2642 ; minimally-qualified # 💁🏽‍♂ man tipping hand: medium skin tone
1F481 1F3FE 200D 2642 FE0F ; fully-qualified # 💁🏾‍♂️ man tipping hand: medium-dark skin tone
1F481 1F3FE 200D 2642 ; minimally-qualified # 💁🏾‍♂ man tipping hand: medium-dark skin tone
1F481 1F3FF 200D 2642 FE0F ; fully-qualified # 💁🏿‍♂️ man tipping hand: dark skin tone
1F481 1F3FF 200D 2642 ; minimally-qualified # 💁🏿‍♂ man tipping hand: dark skin tone
1F481 200D 2640 FE0F ; fully-qualified # 💁‍♀️ woman tipping hand
1F481 200D 2640 ; minimally-qualified # 💁‍♀ woman tipping hand
1F481 1F3FB 200D 2640 FE0F ; fully-qualified # 💁🏻‍♀️ woman tipping hand: light skin tone
1F481 1F3FB 200D 2640 ; minimally-qualified # 💁🏻‍♀ woman tipping hand: light skin tone
1F481 1F3FC 200D 2640 FE0F ; fully-qualified # 💁🏼‍♀️ woman tipping hand: medium-light skin tone
1F481 1F3FC 200D 2640 ; minimally-qualified # 💁🏼‍♀ woman tipping hand: medium-light skin tone
1F481 1F3FD 200D 2640 FE0F ; fully-qualified # 💁🏽‍♀️ woman tipping hand: medium skin tone
1F481 1F3FD 200D 2640 ; minimally-qualified # 💁🏽‍♀ woman tipping hand: medium skin tone
1F481 1F3FE 200D 2640 FE0F ; fully-qualified # 💁🏾‍♀️ woman tipping hand: medium-dark skin tone
1F481 1F3FE 200D 2640 ; minimally-qualified # 💁🏾‍♀ woman tipping hand: medium-dark skin tone
1F481 1F3FF 200D 2640 FE0F ; fully-qualified # 💁🏿‍♀️ woman tipping hand: dark skin tone
1F481 1F3FF 200D 2640 ; minimally-qualified # 💁🏿‍♀ woman tipping hand: dark skin tone
1F64B ; fully-qualified # 🙋 person raising hand
1F64B 1F3FB ; fully-qualified # 🙋🏻 person raising hand: light skin tone
1F64B 1F3FC ; fully-qualified # 🙋🏼 person raising hand: medium-light skin tone
1F64B 1F3FD ; fully-qualified # 🙋🏽 person raising hand: medium skin tone
1F64B 1F3FE ; fully-qualified # 🙋🏾 person raising hand: medium-dark skin tone
1F64B 1F3FF ; fully-qualified # 🙋🏿 person raising hand: dark skin tone
1F64B 200D 2642 FE0F ; fully-qualified # 🙋‍♂️ man raising hand
1F64B 200D 2642 ; minimally-qualified # 🙋‍♂ man raising hand
1F64B 1F3FB 200D 2642 FE0F ; fully-qualified # 🙋🏻‍♂️ man raising hand: light skin tone
1F64B 1F3FB 200D 2642 ; minimally-qualified # 🙋🏻‍♂ man raising hand: light skin tone
1F64B 1F3FC 200D 2642 FE0F ; fully-qualified # 🙋🏼‍♂️ man raising hand: medium-light skin tone
1F64B 1F3FC 200D 2642 ; minimally-qualified # 🙋🏼‍♂ man raising hand: medium-light skin tone
1F64B 1F3FD 200D 2642 FE0F ; fully-qualified # 🙋🏽‍♂️ man raising hand: medium skin tone
1F64B 1F3FD 200D 2642 ; minimally-qualified # 🙋🏽‍♂ man raising hand: medium skin tone
1F64B 1F3FE 200D 2642 FE0F ; fully-qualified # 🙋🏾‍♂️ man raising hand: medium-dark skin tone
1F64B 1F3FE 200D 2642 ; minimally-qualified # 🙋🏾‍♂ man raising hand: medium-dark skin tone
1F64B 1F3FF 200D 2642 FE0F ; fully-qualified # 🙋🏿‍♂️ man raising hand: dark skin tone
1F64B 1F3FF 200D 2642 ; minimally-qualified # 🙋🏿‍♂ man raising hand: dark skin tone
1F64B 200D 2640 FE0F ; fully-qualified # 🙋‍♀️ woman raising hand
1F64B 200D 2640 ; minimally-qualified # 🙋‍♀ woman raising hand
1F64B 1F3FB 200D 2640 FE0F ; fully-qualified # 🙋🏻‍♀️ woman raising hand: light skin tone
1F64B 1F3FB 200D 2640 ; minimally-qualified # 🙋🏻‍♀ woman raising hand: light skin tone
1F64B 1F3FC 200D 2640 FE0F ; fully-qualified # 🙋🏼‍♀️ woman raising hand: medium-light skin tone
1F64B 1F3FC 200D 2640 ; minimally-qualified # 🙋🏼‍♀ woman raising hand: medium-light skin tone
1F64B 1F3FD 200D 2640 FE0F ; fully-qualified # 🙋🏽‍♀️ woman raising hand: medium skin tone
1F64B 1F3FD 200D 2640 ; minimally-qualified # 🙋🏽‍♀ woman raising hand: medium skin tone
1F64B 1F3FE 200D 2640 FE0F ; fully-qualified # 🙋🏾‍♀️ woman raising hand: medium-dark skin tone
1F64B 1F3FE 200D 2640 ; minimally-qualified # 🙋🏾‍♀ woman raising hand: medium-dark skin tone
1F64B 1F3FF 200D 2640 FE0F ; fully-qualified # 🙋🏿‍♀️ woman raising hand: dark skin tone
1F64B 1F3FF 200D 2640 ; minimally-qualified # 🙋🏿‍♀ woman raising hand: dark skin tone
1F9CF ; fully-qualified # 🧏 deaf person
1F9CF 1F3FB ; fully-qualified # 🧏🏻 deaf person: light skin tone
1F9CF 1F3FC ; fully-qualified # 🧏🏼 deaf person: medium-light skin tone
1F9CF 1F3FD ; fully-qualified # 🧏🏽 deaf person: medium skin tone
1F9CF 1F3FE ; fully-qualified # 🧏🏾 deaf person: medium-dark skin tone
1F9CF 1F3FF ; fully-qualified # 🧏🏿 deaf person: dark skin tone
1F9CF 200D 2642 FE0F ; fully-qualified # 🧏‍♂️ deaf man
1F9CF 200D 2642 ; minimally-qualified # 🧏‍♂ deaf man
1F9CF 1F3FB 200D 2642 FE0F ; fully-qualified # 🧏🏻‍♂️ deaf man: light skin tone
1F9CF 1F3FB 200D 2642 ; minimally-qualified # 🧏🏻‍♂ deaf man: light skin tone
1F9CF 1F3FC 200D 2642 FE0F ; fully-qualified # 🧏🏼‍♂️ deaf man: medium-light skin tone
1F9CF 1F3FC 200D 2642 ; minimally-qualified # 🧏🏼‍♂ deaf man: medium-light skin tone
1F9CF 1F3FD 200D 2642 FE0F ; fully-qualified # 🧏🏽‍♂️ deaf man: medium skin tone
1F9CF 1F3FD 200D 2642 ; minimally-qualified # 🧏🏽‍♂ deaf man: medium skin tone
1F9CF 1F3FE 200D 2642 FE0F ; fully-qualified # 🧏🏾‍♂️ deaf man: medium-dark skin tone
1F9CF 1F3FE 200D 2642 ; minimally-qualified # 🧏🏾‍♂ deaf man: medium-dark skin tone
1F9CF 1F3FF 200D 2642 FE0F ; fully-qualified # 🧏🏿‍♂️ deaf man: dark skin tone
1F9CF 1F3FF 200D 2642 ; minimally-qualified # 🧏🏿‍♂ deaf man: dark skin tone
1F9CF 200D 2640 FE0F ; fully-qualified # 🧏‍♀️ deaf woman
1F9CF 200D 2640 ; minimally-qualified # 🧏‍♀ deaf woman
1F9CF 1F3FB 200D 2640 FE0F ; fully-qualified # 🧏🏻‍♀️ deaf woman: light skin tone
1F9CF 1F3FB 200D 2640 ; minimally-qualified # 🧏🏻‍♀ deaf woman: light skin tone
1F9CF 1F3FC 200D 2640 FE0F ; fully-qualified # 🧏🏼‍♀️ deaf woman: medium-light skin tone
1F9CF 1F3FC 200D 2640 ; minimally-qualified # 🧏🏼‍♀ deaf woman: medium-light skin tone
1F9CF 1F3FD 200D 2640 FE0F ; fully-qualified # 🧏🏽‍♀️ deaf woman: medium skin tone
1F9CF 1F3FD 200D 2640 ; minimally-qualified # 🧏🏽‍♀ deaf woman: medium skin tone
1F9CF 1F3FE 200D 2640 FE0F ; fully-qualified # 🧏🏾‍♀️ deaf woman: medium-dark skin tone
1F9CF 1F3FE 200D 2640 ; minimally-qualified # 🧏🏾‍♀ deaf woman: medium-dark skin tone
1F9CF 1F3FF 200D 2640 FE0F ; fully-qualified # 🧏🏿‍♀️ deaf woman: dark skin tone
1F9CF 1F3FF 200D 2640 ; minimally-qualified # 🧏🏿‍♀ deaf woman: dark skin tone
1F647 ; fully-qualified # 🙇 person bowing
1F647 1F3FB ; fully-qualified # 🙇🏻 person bowing: light skin tone
1F647 1F3FC ; fully-qualified # 🙇🏼 person bowing: medium-light skin tone
1F647 1F3FD ; fully-qualified # 🙇🏽 person bowing: medium skin tone
1F647 1F3FE ; fully-qualified # 🙇🏾 person bowing: medium-dark skin tone
1F647 1F3FF ; fully-qualified # 🙇🏿 person bowing: dark skin tone
1F647 200D 2642 FE0F ; fully-qualified # 🙇‍♂️ man bowing
1F647 200D 2642 ; minimally-qualified # 🙇‍♂ man bowing
1F647 1F3FB 200D 2642 FE0F ; fully-qualified # 🙇🏻‍♂️ man bowing: light skin tone
1F647 1F3FB 200D 2642 ; minimally-qualified # 🙇🏻‍♂ man bowing: light skin tone
1F647 1F3FC 200D 2642 FE0F ; fully-qualified # 🙇🏼‍♂️ man bowing: medium-light skin tone
1F647 1F3FC 200D 2642 ; minimally-qualified # 🙇🏼‍♂ man bowing: medium-light skin tone
1F647 1F3FD 200D 2642 FE0F ; fully-qualified # 🙇🏽‍♂️ man bowing: medium skin tone
1F647 1F3FD 200D 2642 ; minimally-qualified # 🙇🏽‍♂ man bowing: medium skin tone
1F647 1F3FE 200D 2642 FE0F ; fully-qualified # 🙇🏾‍♂️ man bowing: medium-dark skin tone
1F647 1F3FE 200D 2642 ; minimally-qualified # 🙇🏾‍♂ man bowing: medium-dark skin tone
1F647 1F3FF 200D 2642 FE0F ; fully-qualified # 🙇🏿‍♂️ man bowing: dark skin tone
1F647 1F3FF 200D 2642 ; minimally-qualified # 🙇🏿‍♂ man bowing: dark skin tone
1F647 200D 2640 FE0F ; fully-qualified # 🙇‍♀️ woman bowing
1F647 200D 2640 ; minimally-qualified # 🙇‍♀ woman bowing
1F647 1F3FB 200D 2640 FE0F ; fully-qualified # 🙇🏻‍♀️ woman bowing: light skin tone
1F647 1F3FB 200D 2640 ; minimally-qualified # 🙇🏻‍♀ woman bowing: light skin tone
1F647 1F3FC 200D 2640 FE0F ; fully-qualified # 🙇🏼‍♀️ woman bowing: medium-light skin tone
1F647 1F3FC 200D 2640 ; minimally-qualified # 🙇🏼‍♀ woman bowing: medium-light skin tone
1F647 1F3FD 200D 2640 FE0F ; fully-qualified # 🙇🏽‍♀️ woman bowing: medium skin tone
1F647 1F3FD 200D 2640 ; minimally-qualified # 🙇🏽‍♀ woman bowing: medium skin tone
1F647 1F3FE 200D 2640 FE0F ; fully-qualified # 🙇🏾‍♀️ woman bowing: medium-dark skin tone
1F647 1F3FE 200D 2640 ; minimally-qualified # 🙇🏾‍♀ woman bowing: medium-dark skin tone
1F647 1F3FF 200D 2640 FE0F ; fully-qualified # 🙇🏿‍♀️ woman bowing: dark skin tone
1F647 1F3FF 200D 2640 ; minimally-qualified # 🙇🏿‍♀ woman bowing: dark skin tone
1F926 ; fully-qualified # 🤦 person facepalming
1F926 1F3FB ; fully-qualified # 🤦🏻 person facepalming: light skin tone
1F926 1F3FC ; fully-qualified # 🤦🏼 person facepalming: medium-light skin tone
1F926 1F3FD ; fully-qualified # 🤦🏽 person facepalming: medium skin tone
1F926 1F3FE ; fully-qualified # 🤦🏾 person facepalming: medium-dark skin tone
1F926 1F3FF ; fully-qualified # 🤦🏿 person facepalming: dark skin tone
1F926 200D 2642 FE0F ; fully-qualified # 🤦‍♂️ man facepalming
1F926 200D 2642 ; minimally-qualified # 🤦‍♂ man facepalming
1F926 1F3FB 200D 2642 FE0F ; fully-qualified # 🤦🏻‍♂️ man facepalming: light skin tone
1F926 1F3FB 200D 2642 ; minimally-qualified # 🤦🏻‍♂ man facepalming: light skin tone
1F926 1F3FC 200D 2642 FE0F ; fully-qualified # 🤦🏼‍♂️ man facepalming: medium-light skin tone
1F926 1F3FC 200D 2642 ; minimally-qualified # 🤦🏼‍♂ man facepalming: medium-light skin tone
1F926 1F3FD 200D 2642 FE0F ; fully-qualified # 🤦🏽‍♂️ man facepalming: medium skin tone
1F926 1F3FD 200D 2642 ; minimally-qualified # 🤦🏽‍♂ man facepalming: medium skin tone
1F926 1F3FE 200D 2642 FE0F ; fully-qualified # 🤦🏾‍♂️ man facepalming: medium-dark skin tone
1F926 1F3FE 200D 2642 ; minimally-qualified # 🤦🏾‍♂ man facepalming: medium-dark skin tone
1F926 1F3FF 200D 2642 FE0F ; fully-qualified # 🤦🏿‍♂️ man facepalming: dark skin tone
1F926 1F3FF 200D 2642 ; minimally-qualified # 🤦🏿‍♂ man facepalming: dark skin tone
1F926 200D 2640 FE0F ; fully-qualified # 🤦‍♀️ woman facepalming
1F926 200D 2640 ; minimally-qualified # 🤦‍♀ woman facepalming
1F926 1F3FB 200D 2640 FE0F ; fully-qualified # 🤦🏻‍♀️ woman facepalming: light skin tone
1F926 1F3FB 200D 2640 ; minimally-qualified # 🤦🏻‍♀ woman facepalming: light skin tone
1F926 1F3FC 200D 2640 FE0F ; fully-qualified # 🤦🏼‍♀️ woman facepalming: medium-light skin tone
1F926 1F3FC 200D 2640 ; minimally-qualified # 🤦🏼‍♀ woman facepalming: medium-light skin tone
1F926 1F3FD 200D 2640 FE0F ; fully-qualified # 🤦🏽‍♀️ woman facepalming: medium skin tone
1F926 1F3FD 200D 2640 ; minimally-qualified # 🤦🏽‍♀ woman facepalming: medium skin tone
1F926 1F3FE 200D 2640 FE0F ; fully-qualified # 🤦🏾‍♀️ woman facepalming: medium-dark skin tone
1F926 1F3FE 200D 2640 ; minimally-qualified # 🤦🏾‍♀ woman facepalming: medium-dark skin tone
1F926 1F3FF 200D 2640 FE0F ; fully-qualified # 🤦🏿‍♀️ woman facepalming: dark skin tone
1F926 1F3FF 200D 2640 ; minimally-qualified # 🤦🏿‍♀ woman facepalming: dark skin tone
1F937 ; fully-qualified # 🤷 person shrugging
1F937 1F3FB ; fully-qualified # 🤷🏻 person shrugging: light skin tone
1F937 1F3FC ; fully-qualified # 🤷🏼 person shrugging: medium-light skin tone
1F937 1F3FD ; fully-qualified # 🤷🏽 person shrugging: medium skin tone
1F937 1F3FE ; fully-qualified # 🤷🏾 person shrugging: medium-dark skin tone
1F937 1F3FF ; fully-qualified # 🤷🏿 person shrugging: dark skin tone
1F937 200D 2642 FE0F ; fully-qualified # 🤷‍♂️ man shrugging
1F937 200D 2642 ; minimally-qualified # 🤷‍♂ man shrugging
1F937 1F3FB 200D 2642 FE0F ; fully-qualified # 🤷🏻‍♂️ man shrugging: light skin tone
1F937 1F3FB 200D 2642 ; minimally-qualified # 🤷🏻‍♂ man shrugging: light skin tone
1F937 1F3FC 200D 2642 FE0F ; fully-qualified # 🤷🏼‍♂️ man shrugging: medium-light skin tone
1F937 1F3FC 200D 2642 ; minimally-qualified # 🤷🏼‍♂ man shrugging: medium-light skin tone
1F937 1F3FD 200D 2642 FE0F ; fully-qualified # 🤷🏽‍♂️ man shrugging: medium skin tone
1F937 1F3FD 200D 2642 ; minimally-qualified # 🤷🏽‍♂ man shrugging: medium skin tone
1F937 1F3FE 200D 2642 FE0F ; fully-qualified # 🤷🏾‍♂️ man shrugging: medium-dark skin tone
1F937 1F3FE 200D 2642 ; minimally-qualified # 🤷🏾‍♂ man shrugging: medium-dark skin tone
1F937 1F3FF 200D 2642 FE0F ; fully-qualified # 🤷🏿‍♂️ man shrugging: dark skin tone
1F937 1F3FF 200D 2642 ; minimally-qualified # 🤷🏿‍♂ man shrugging: dark skin tone
1F937 200D 2640 FE0F ; fully-qualified # 🤷‍♀️ woman shrugging
1F937 200D 2640 ; minimally-qualified # 🤷‍♀ woman shrugging
1F937 1F3FB 200D 2640 FE0F ; fully-qualified # 🤷🏻‍♀️ woman shrugging: light skin tone
1F937 1F3FB 200D 2640 ; minimally-qualified # 🤷🏻‍♀ woman shrugging: light skin tone
1F937 1F3FC 200D 2640 FE0F ; fully-qualified # 🤷🏼‍♀️ woman shrugging: medium-light skin tone
1F937 1F3FC 200D 2640 ; minimally-qualified # 🤷🏼‍♀ woman shrugging: medium-light skin tone
1F937 1F3FD 200D 2640 FE0F ; fully-qualified # 🤷🏽‍♀️ woman shrugging: medium skin tone
1F937 1F3FD 200D 2640 ; minimally-qualified # 🤷🏽‍♀ woman shrugging: medium skin tone
1F937 1F3FE 200D 2640 FE0F ; fully-qualified # 🤷🏾‍♀️ woman shrugging: medium-dark skin tone
1F937 1F3FE 200D 2640 ; minimally-qualified # 🤷🏾‍♀ woman shrugging: medium-dark skin tone
1F937 1F3FF 200D 2640 FE0F ; fully-qualified # 🤷🏿‍♀️ woman shrugging: dark skin tone
1F937 1F3FF 200D 2640 ; minimally-qualified # 🤷🏿‍♀ woman shrugging: dark skin tone
# subgroup: person-role
1F468 200D 2695 FE0F ; fully-qualified # 👨‍⚕️ man health worker
1F468 200D 2695 ; minimally-qualified # 👨‍⚕ man health worker
1F468 1F3FB 200D 2695 FE0F ; fully-qualified # 👨🏻‍⚕️ man health worker: light skin tone
1F468 1F3FB 200D 2695 ; minimally-qualified # 👨🏻‍⚕ man health worker: light skin tone
1F468 1F3FC 200D 2695 FE0F ; fully-qualified # 👨🏼‍⚕️ man health worker: medium-light skin tone
1F468 1F3FC 200D 2695 ; minimally-qualified # 👨🏼‍⚕ man health worker: medium-light skin tone
1F468 1F3FD 200D 2695 FE0F ; fully-qualified # 👨🏽‍⚕️ man health worker: medium skin tone
1F468 1F3FD 200D 2695 ; minimally-qualified # 👨🏽‍⚕ man health worker: medium skin tone
1F468 1F3FE 200D 2695 FE0F ; fully-qualified # 👨🏾‍⚕️ man health worker: medium-dark skin tone
1F468 1F3FE 200D 2695 ; minimally-qualified # 👨🏾‍⚕ man health worker: medium-dark skin tone
1F468 1F3FF 200D 2695 FE0F ; fully-qualified # 👨🏿‍⚕️ man health worker: dark skin tone
1F468 1F3FF 200D 2695 ; minimally-qualified # 👨🏿‍⚕ man health worker: dark skin tone
1F469 200D 2695 FE0F ; fully-qualified # 👩‍⚕️ woman health worker
1F469 200D 2695 ; minimally-qualified # 👩‍⚕ woman health worker
1F469 1F3FB 200D 2695 FE0F ; fully-qualified # 👩🏻‍⚕️ woman health worker: light skin tone
1F469 1F3FB 200D 2695 ; minimally-qualified # 👩🏻‍⚕ woman health worker: light skin tone
1F469 1F3FC 200D 2695 FE0F ; fully-qualified # 👩🏼‍⚕️ woman health worker: medium-light skin tone
1F469 1F3FC 200D 2695 ; minimally-qualified # 👩🏼‍⚕ woman health worker: medium-light skin tone
1F469 1F3FD 200D 2695 FE0F ; fully-qualified # 👩🏽‍⚕️ woman health worker: medium skin tone
1F469 1F3FD 200D 2695 ; minimally-qualified # 👩🏽‍⚕ woman health worker: medium skin tone
1F469 1F3FE 200D 2695 FE0F ; fully-qualified # 👩🏾‍⚕️ woman health worker: medium-dark skin tone
1F469 1F3FE 200D 2695 ; minimally-qualified # 👩🏾‍⚕ woman health worker: medium-dark skin tone
1F469 1F3FF 200D 2695 FE0F ; fully-qualified # 👩🏿‍⚕️ woman health worker: dark skin tone
1F469 1F3FF 200D 2695 ; minimally-qualified # 👩🏿‍⚕ woman health worker: dark skin tone
1F468 200D 1F393 ; fully-qualified # 👨‍🎓 man student
1F468 1F3FB 200D 1F393 ; fully-qualified # 👨🏻‍🎓 man student: light skin tone
1F468 1F3FC 200D 1F393 ; fully-qualified # 👨🏼‍🎓 man student: medium-light skin tone
1F468 1F3FD 200D 1F393 ; fully-qualified # 👨🏽‍🎓 man student: medium skin tone
1F468 1F3FE 200D 1F393 ; fully-qualified # 👨🏾‍🎓 man student: medium-dark skin tone
1F468 1F3FF 200D 1F393 ; fully-qualified # 👨🏿‍🎓 man student: dark skin tone
1F469 200D 1F393 ; fully-qualified # 👩‍🎓 woman student
1F469 1F3FB 200D 1F393 ; fully-qualified # 👩🏻‍🎓 woman student: light skin tone
1F469 1F3FC 200D 1F393 ; fully-qualified # 👩🏼‍🎓 woman student: medium-light skin tone
1F469 1F3FD 200D 1F393 ; fully-qualified # 👩🏽‍🎓 woman student: medium skin tone
1F469 1F3FE 200D 1F393 ; fully-qualified # 👩🏾‍🎓 woman student: medium-dark skin tone
1F469 1F3FF 200D 1F393 ; fully-qualified # 👩🏿‍🎓 woman student: dark skin tone
1F468 200D 1F3EB ; fully-qualified # 👨‍🏫 man teacher
1F468 1F3FB 200D 1F3EB ; fully-qualified # 👨🏻‍🏫 man teacher: light skin tone
1F468 1F3FC 200D 1F3EB ; fully-qualified # 👨🏼‍🏫 man teacher: medium-light skin tone
1F468 1F3FD 200D 1F3EB ; fully-qualified # 👨🏽‍🏫 man teacher: medium skin tone
1F468 1F3FE 200D 1F3EB ; fully-qualified # 👨🏾‍🏫 man teacher: medium-dark skin tone
1F468 1F3FF 200D 1F3EB ; fully-qualified # 👨🏿‍🏫 man teacher: dark skin tone
1F469 200D 1F3EB ; fully-qualified # 👩‍🏫 woman teacher
1F469 1F3FB 200D 1F3EB ; fully-qualified # 👩🏻‍🏫 woman teacher: light skin tone
1F469 1F3FC 200D 1F3EB ; fully-qualified # 👩🏼‍🏫 woman teacher: medium-light skin tone
1F469 1F3FD 200D 1F3EB ; fully-qualified # 👩🏽‍🏫 woman teacher: medium skin tone
1F469 1F3FE 200D 1F3EB ; fully-qualified # 👩🏾‍🏫 woman teacher: medium-dark skin tone
1F469 1F3FF 200D 1F3EB ; fully-qualified # 👩🏿‍🏫 woman teacher: dark skin tone
1F468 200D 2696 FE0F ; fully-qualified # 👨‍⚖️ man judge
1F468 200D 2696 ; minimally-qualified # 👨‍⚖ man judge
1F468 1F3FB 200D 2696 FE0F ; fully-qualified # 👨🏻‍⚖️ man judge: light skin tone
1F468 1F3FB 200D 2696 ; minimally-qualified # 👨🏻‍⚖ man judge: light skin tone
1F468 1F3FC 200D 2696 FE0F ; fully-qualified # 👨🏼‍⚖️ man judge: medium-light skin tone
1F468 1F3FC 200D 2696 ; minimally-qualified # 👨🏼‍⚖ man judge: medium-light skin tone
1F468 1F3FD 200D 2696 FE0F ; fully-qualified # 👨🏽‍⚖️ man judge: medium skin tone
1F468 1F3FD 200D 2696 ; minimally-qualified # 👨🏽‍⚖ man judge: medium skin tone
1F468 1F3FE 200D 2696 FE0F ; fully-qualified # 👨🏾‍⚖️ man judge: medium-dark skin tone
1F468 1F3FE 200D 2696 ; minimally-qualified # 👨🏾‍⚖ man judge: medium-dark skin tone
1F468 1F3FF 200D 2696 FE0F ; fully-qualified # 👨🏿‍⚖️ man judge: dark skin tone
1F468 1F3FF 200D 2696 ; minimally-qualified # 👨🏿‍⚖ man judge: dark skin tone
1F469 200D 2696 FE0F ; fully-qualified # 👩‍⚖️ woman judge
1F469 200D 2696 ; minimally-qualified # 👩‍⚖ woman judge
1F469 1F3FB 200D 2696 FE0F ; fully-qualified # 👩🏻‍⚖️ woman judge: light skin tone
1F469 1F3FB 200D 2696 ; minimally-qualified # 👩🏻‍⚖ woman judge: light skin tone
1F469 1F3FC 200D 2696 FE0F ; fully-qualified # 👩🏼‍⚖️ woman judge: medium-light skin tone
1F469 1F3FC 200D 2696 ; minimally-qualified # 👩🏼‍⚖ woman judge: medium-light skin tone
1F469 1F3FD 200D 2696 FE0F ; fully-qualified # 👩🏽‍⚖️ woman judge: medium skin tone
1F469 1F3FD 200D 2696 ; minimally-qualified # 👩🏽‍⚖ woman judge: medium skin tone
1F469 1F3FE 200D 2696 FE0F ; fully-qualified # 👩🏾‍⚖️ woman judge: medium-dark skin tone
1F469 1F3FE 200D 2696 ; minimally-qualified # 👩🏾‍⚖ woman judge: medium-dark skin tone
1F469 1F3FF 200D 2696 FE0F ; fully-qualified # 👩🏿‍⚖️ woman judge: dark skin tone
1F469 1F3FF 200D 2696 ; minimally-qualified # 👩🏿‍⚖ woman judge: dark skin tone
1F468 200D 1F33E ; fully-qualified # 👨‍🌾 man farmer
1F468 1F3FB 200D 1F33E ; fully-qualified # 👨🏻‍🌾 man farmer: light skin tone
1F468 1F3FC 200D 1F33E ; fully-qualified # 👨🏼‍🌾 man farmer: medium-light skin tone
1F468 1F3FD 200D 1F33E ; fully-qualified # 👨🏽‍🌾 man farmer: medium skin tone
1F468 1F3FE 200D 1F33E ; fully-qualified # 👨🏾‍🌾 man farmer: medium-dark skin tone
1F468 1F3FF 200D 1F33E ; fully-qualified # 👨🏿‍🌾 man farmer: dark skin tone
1F469 200D 1F33E ; fully-qualified # 👩‍🌾 woman farmer
1F469 1F3FB 200D 1F33E ; fully-qualified # 👩🏻‍🌾 woman farmer: light skin tone
1F469 1F3FC 200D 1F33E ; fully-qualified # 👩🏼‍🌾 woman farmer: medium-light skin tone
1F469 1F3FD 200D 1F33E ; fully-qualified # 👩🏽‍🌾 woman farmer: medium skin tone
1F469 1F3FE 200D 1F33E ; fully-qualified # 👩🏾‍🌾 woman farmer: medium-dark skin tone
1F469 1F3FF 200D 1F33E ; fully-qualified # 👩🏿‍🌾 woman farmer: dark skin tone
1F468 200D 1F373 ; fully-qualified # 👨‍🍳 man cook
1F468 1F3FB 200D 1F373 ; fully-qualified # 👨🏻‍🍳 man cook: light skin tone
1F468 1F3FC 200D 1F373 ; fully-qualified # 👨🏼‍🍳 man cook: medium-light skin tone
1F468 1F3FD 200D 1F373 ; fully-qualified # 👨🏽‍🍳 man cook: medium skin tone
1F468 1F3FE 200D 1F373 ; fully-qualified # 👨🏾‍🍳 man cook: medium-dark skin tone
1F468 1F3FF 200D 1F373 ; fully-qualified # 👨🏿‍🍳 man cook: dark skin tone
1F469 200D 1F373 ; fully-qualified # 👩‍🍳 woman cook
1F469 1F3FB 200D 1F373 ; fully-qualified # 👩🏻‍🍳 woman cook: light skin tone
1F469 1F3FC 200D 1F373 ; fully-qualified # 👩🏼‍🍳 woman cook: medium-light skin tone
1F469 1F3FD 200D 1F373 ; fully-qualified # 👩🏽‍🍳 woman cook: medium skin tone
1F469 1F3FE 200D 1F373 ; fully-qualified # 👩🏾‍🍳 woman cook: medium-dark skin tone
1F469 1F3FF 200D 1F373 ; fully-qualified # 👩🏿‍🍳 woman cook: dark skin tone
1F468 200D 1F527 ; fully-qualified # 👨‍🔧 man mechanic
1F468 1F3FB 200D 1F527 ; fully-qualified # 👨🏻‍🔧 man mechanic: light skin tone
1F468 1F3FC 200D 1F527 ; fully-qualified # 👨🏼‍🔧 man mechanic: medium-light skin tone
1F468 1F3FD 200D 1F527 ; fully-qualified # 👨🏽‍🔧 man mechanic: medium skin tone
1F468 1F3FE 200D 1F527 ; fully-qualified # 👨🏾‍🔧 man mechanic: medium-dark skin tone
1F468 1F3FF 200D 1F527 ; fully-qualified # 👨🏿‍🔧 man mechanic: dark skin tone
1F469 200D 1F527 ; fully-qualified # 👩‍🔧 woman mechanic
1F469 1F3FB 200D 1F527 ; fully-qualified # 👩🏻‍🔧 woman mechanic: light skin tone
1F469 1F3FC 200D 1F527 ; fully-qualified # 👩🏼‍🔧 woman mechanic: medium-light skin tone
1F469 1F3FD 200D 1F527 ; fully-qualified # 👩🏽‍🔧 woman mechanic: medium skin tone
1F469 1F3FE 200D 1F527 ; fully-qualified # 👩🏾‍🔧 woman mechanic: medium-dark skin tone
1F469 1F3FF 200D 1F527 ; fully-qualified # 👩🏿‍🔧 woman mechanic: dark skin tone
1F468 200D 1F3ED ; fully-qualified # 👨‍🏭 man factory worker
1F468 1F3FB 200D 1F3ED ; fully-qualified # 👨🏻‍🏭 man factory worker: light skin tone
1F468 1F3FC 200D 1F3ED ; fully-qualified # 👨🏼‍🏭 man factory worker: medium-light skin tone
1F468 1F3FD 200D 1F3ED ; fully-qualified # 👨🏽‍🏭 man factory worker: medium skin tone
1F468 1F3FE 200D 1F3ED ; fully-qualified # 👨🏾‍🏭 man factory worker: medium-dark skin tone
1F468 1F3FF 200D 1F3ED ; fully-qualified # 👨🏿‍🏭 man factory worker: dark skin tone
1F469 200D 1F3ED ; fully-qualified # 👩‍🏭 woman factory worker
1F469 1F3FB 200D 1F3ED ; fully-qualified # 👩🏻‍🏭 woman factory worker: light skin tone
1F469 1F3FC 200D 1F3ED ; fully-qualified # 👩🏼‍🏭 woman factory worker: medium-light skin tone
1F469 1F3FD 200D 1F3ED ; fully-qualified # 👩🏽‍🏭 woman factory worker: medium skin tone
1F469 1F3FE 200D 1F3ED ; fully-qualified # 👩🏾‍🏭 woman factory worker: medium-dark skin tone
1F469 1F3FF 200D 1F3ED ; fully-qualified # 👩🏿‍🏭 woman factory worker: dark skin tone
1F468 200D 1F4BC ; fully-qualified # 👨‍💼 man office worker
1F468 1F3FB 200D 1F4BC ; fully-qualified # 👨🏻‍💼 man office worker: light skin tone
1F468 1F3FC 200D 1F4BC ; fully-qualified # 👨🏼‍💼 man office worker: medium-light skin tone
1F468 1F3FD 200D 1F4BC ; fully-qualified # 👨🏽‍💼 man office worker: medium skin tone
1F468 1F3FE 200D 1F4BC ; fully-qualified # 👨🏾‍💼 man office worker: medium-dark skin tone
1F468 1F3FF 200D 1F4BC ; fully-qualified # 👨🏿‍💼 man office worker: dark skin tone
1F469 200D 1F4BC ; fully-qualified # 👩‍💼 woman office worker
1F469 1F3FB 200D 1F4BC ; fully-qualified # 👩🏻‍💼 woman office worker: light skin tone
1F469 1F3FC 200D 1F4BC ; fully-qualified # 👩🏼‍💼 woman office worker: medium-light skin tone
1F469 1F3FD 200D 1F4BC ; fully-qualified # 👩🏽‍💼 woman office worker: medium skin tone
1F469 1F3FE 200D 1F4BC ; fully-qualified # 👩🏾‍💼 woman office worker: medium-dark skin tone
1F469 1F3FF 200D 1F4BC ; fully-qualified # 👩🏿‍💼 woman office worker: dark skin tone
1F468 200D 1F52C ; fully-qualified # 👨‍🔬 man scientist
1F468 1F3FB 200D 1F52C ; fully-qualified # 👨🏻‍🔬 man scientist: light skin tone
1F468 1F3FC 200D 1F52C ; fully-qualified # 👨🏼‍🔬 man scientist: medium-light skin tone
1F468 1F3FD 200D 1F52C ; fully-qualified # 👨🏽‍🔬 man scientist: medium skin tone
1F468 1F3FE 200D 1F52C ; fully-qualified # 👨🏾‍🔬 man scientist: medium-dark skin tone
1F468 1F3FF 200D 1F52C ; fully-qualified # 👨🏿‍🔬 man scientist: dark skin tone
1F469 200D 1F52C ; fully-qualified # 👩‍🔬 woman scientist
1F469 1F3FB 200D 1F52C ; fully-qualified # 👩🏻‍🔬 woman scientist: light skin tone
1F469 1F3FC 200D 1F52C ; fully-qualified # 👩🏼‍🔬 woman scientist: medium-light skin tone
1F469 1F3FD 200D 1F52C ; fully-qualified # 👩🏽‍🔬 woman scientist: medium skin tone
1F469 1F3FE 200D 1F52C ; fully-qualified # 👩🏾‍🔬 woman scientist: medium-dark skin tone
1F469 1F3FF 200D 1F52C ; fully-qualified # 👩🏿‍🔬 woman scientist: dark skin tone
1F468 200D 1F4BB ; fully-qualified # 👨‍💻 man technologist
1F468 1F3FB 200D 1F4BB ; fully-qualified # 👨🏻‍💻 man technologist: light skin tone
1F468 1F3FC 200D 1F4BB ; fully-qualified # 👨🏼‍💻 man technologist: medium-light skin tone
1F468 1F3FD 200D 1F4BB ; fully-qualified # 👨🏽‍💻 man technologist: medium skin tone
1F468 1F3FE 200D 1F4BB ; fully-qualified # 👨🏾‍💻 man technologist: medium-dark skin tone
1F468 1F3FF 200D 1F4BB ; fully-qualified # 👨🏿‍💻 man technologist: dark skin tone
1F469 200D 1F4BB ; fully-qualified # 👩‍💻 woman technologist
1F469 1F3FB 200D 1F4BB ; fully-qualified # 👩🏻‍💻 woman technologist: light skin tone
1F469 1F3FC 200D 1F4BB ; fully-qualified # 👩🏼‍💻 woman technologist: medium-light skin tone
1F469 1F3FD 200D 1F4BB ; fully-qualified # 👩🏽‍💻 woman technologist: medium skin tone
1F469 1F3FE 200D 1F4BB ; fully-qualified # 👩🏾‍💻 woman technologist: medium-dark skin tone
1F469 1F3FF 200D 1F4BB ; fully-qualified # 👩🏿‍💻 woman technologist: dark skin tone
1F468 200D 1F3A4 ; fully-qualified # 👨‍🎤 man singer
1F468 1F3FB 200D 1F3A4 ; fully-qualified # 👨🏻‍🎤 man singer: light skin tone
1F468 1F3FC 200D 1F3A4 ; fully-qualified # 👨🏼‍🎤 man singer: medium-light skin tone
1F468 1F3FD 200D 1F3A4 ; fully-qualified # 👨🏽‍🎤 man singer: medium skin tone
1F468 1F3FE 200D 1F3A4 ; fully-qualified # 👨🏾‍🎤 man singer: medium-dark skin tone
1F468 1F3FF 200D 1F3A4 ; fully-qualified # 👨🏿‍🎤 man singer: dark skin tone
1F469 200D 1F3A4 ; fully-qualified # 👩‍🎤 woman singer
1F469 1F3FB 200D 1F3A4 ; fully-qualified # 👩🏻‍🎤 woman singer: light skin tone
1F469 1F3FC 200D 1F3A4 ; fully-qualified # 👩🏼‍🎤 woman singer: medium-light skin tone
1F469 1F3FD 200D 1F3A4 ; fully-qualified # 👩🏽‍🎤 woman singer: medium skin tone
1F469 1F3FE 200D 1F3A4 ; fully-qualified # 👩🏾‍🎤 woman singer: medium-dark skin tone
1F469 1F3FF 200D 1F3A4 ; fully-qualified # 👩🏿‍🎤 woman singer: dark skin tone
1F468 200D 1F3A8 ; fully-qualified # 👨‍🎨 man artist
1F468 1F3FB 200D 1F3A8 ; fully-qualified # 👨🏻‍🎨 man artist: light skin tone
1F468 1F3FC 200D 1F3A8 ; fully-qualified # 👨🏼‍🎨 man artist: medium-light skin tone
1F468 1F3FD 200D 1F3A8 ; fully-qualified # 👨🏽‍🎨 man artist: medium skin tone
1F468 1F3FE 200D 1F3A8 ; fully-qualified # 👨🏾‍🎨 man artist: medium-dark skin tone
1F468 1F3FF 200D 1F3A8 ; fully-qualified # 👨🏿‍🎨 man artist: dark skin tone
1F469 200D 1F3A8 ; fully-qualified # 👩‍🎨 woman artist
1F469 1F3FB 200D 1F3A8 ; fully-qualified # 👩🏻‍🎨 woman artist: light skin tone
1F469 1F3FC 200D 1F3A8 ; fully-qualified # 👩🏼‍🎨 woman artist: medium-light skin tone
1F469 1F3FD 200D 1F3A8 ; fully-qualified # 👩🏽‍🎨 woman artist: medium skin tone
1F469 1F3FE 200D 1F3A8 ; fully-qualified # 👩🏾‍🎨 woman artist: medium-dark skin tone
1F469 1F3FF 200D 1F3A8 ; fully-qualified # 👩🏿‍🎨 woman artist: dark skin tone
1F468 200D 2708 FE0F ; fully-qualified # 👨‍✈️ man pilot
1F468 200D 2708 ; minimally-qualified # 👨‍✈ man pilot
1F468 1F3FB 200D 2708 FE0F ; fully-qualified # 👨🏻‍✈️ man pilot: light skin tone
1F468 1F3FB 200D 2708 ; minimally-qualified # 👨🏻‍✈ man pilot: light skin tone
1F468 1F3FC 200D 2708 FE0F ; fully-qualified # 👨🏼‍✈️ man pilot: medium-light skin tone
1F468 1F3FC 200D 2708 ; minimally-qualified # 👨🏼‍✈ man pilot: medium-light skin tone
1F468 1F3FD 200D 2708 FE0F ; fully-qualified # 👨🏽‍✈️ man pilot: medium skin tone
1F468 1F3FD 200D 2708 ; minimally-qualified # 👨🏽‍✈ man pilot: medium skin tone
1F468 1F3FE 200D 2708 FE0F ; fully-qualified # 👨🏾‍✈️ man pilot: medium-dark skin tone
1F468 1F3FE 200D 2708 ; minimally-qualified # 👨🏾‍✈ man pilot: medium-dark skin tone
1F468 1F3FF 200D 2708 FE0F ; fully-qualified # 👨🏿‍✈️ man pilot: dark skin tone
1F468 1F3FF 200D 2708 ; minimally-qualified # 👨🏿‍✈ man pilot: dark skin tone
1F469 200D 2708 FE0F ; fully-qualified # 👩‍✈️ woman pilot
1F469 200D 2708 ; minimally-qualified # 👩‍✈ woman pilot
1F469 1F3FB 200D 2708 FE0F ; fully-qualified # 👩🏻‍✈️ woman pilot: light skin tone
1F469 1F3FB 200D 2708 ; minimally-qualified # 👩🏻‍✈ woman pilot: light skin tone
1F469 1F3FC 200D 2708 FE0F ; fully-qualified # 👩🏼‍✈️ woman pilot: medium-light skin tone
1F469 1F3FC 200D 2708 ; minimally-qualified # 👩🏼‍✈ woman pilot: medium-light skin tone
1F469 1F3FD 200D 2708 FE0F ; fully-qualified # 👩🏽‍✈️ woman pilot: medium skin tone
1F469 1F3FD 200D 2708 ; minimally-qualified # 👩🏽‍✈ woman pilot: medium skin tone
1F469 1F3FE 200D 2708 FE0F ; fully-qualified # 👩🏾‍✈️ woman pilot: medium-dark skin tone
1F469 1F3FE 200D 2708 ; minimally-qualified # 👩🏾‍✈ woman pilot: medium-dark skin tone
1F469 1F3FF 200D 2708 FE0F ; fully-qualified # 👩🏿‍✈️ woman pilot: dark skin tone
1F469 1F3FF 200D 2708 ; minimally-qualified # 👩🏿‍✈ woman pilot: dark skin tone
1F468 200D 1F680 ; fully-qualified # 👨‍🚀 man astronaut
1F468 1F3FB 200D 1F680 ; fully-qualified # 👨🏻‍🚀 man astronaut: light skin tone
1F468 1F3FC 200D 1F680 ; fully-qualified # 👨🏼‍🚀 man astronaut: medium-light skin tone
1F468 1F3FD 200D 1F680 ; fully-qualified # 👨🏽‍🚀 man astronaut: medium skin tone
1F468 1F3FE 200D 1F680 ; fully-qualified # 👨🏾‍🚀 man astronaut: medium-dark skin tone
1F468 1F3FF 200D 1F680 ; fully-qualified # 👨🏿‍🚀 man astronaut: dark skin tone
1F469 200D 1F680 ; fully-qualified # 👩‍🚀 woman astronaut
1F469 1F3FB 200D 1F680 ; fully-qualified # 👩🏻‍🚀 woman astronaut: light skin tone
1F469 1F3FC 200D 1F680 ; fully-qualified # 👩🏼‍🚀 woman astronaut: medium-light skin tone
1F469 1F3FD 200D 1F680 ; fully-qualified # 👩🏽‍🚀 woman astronaut: medium skin tone
1F469 1F3FE 200D 1F680 ; fully-qualified # 👩🏾‍🚀 woman astronaut: medium-dark skin tone
1F469 1F3FF 200D 1F680 ; fully-qualified # 👩🏿‍🚀 woman astronaut: dark skin tone
1F468 200D 1F692 ; fully-qualified # 👨‍🚒 man firefighter
1F468 1F3FB 200D 1F692 ; fully-qualified # 👨🏻‍🚒 man firefighter: light skin tone
1F468 1F3FC 200D 1F692 ; fully-qualified # 👨🏼‍🚒 man firefighter: medium-light skin tone
1F468 1F3FD 200D 1F692 ; fully-qualified # 👨🏽‍🚒 man firefighter: medium skin tone
1F468 1F3FE 200D 1F692 ; fully-qualified # 👨🏾‍🚒 man firefighter: medium-dark skin tone
1F468 1F3FF 200D 1F692 ; fully-qualified # 👨🏿‍🚒 man firefighter: dark skin tone
1F469 200D 1F692 ; fully-qualified # 👩‍🚒 woman firefighter
1F469 1F3FB 200D 1F692 ; fully-qualified # 👩🏻‍🚒 woman firefighter: light skin tone
1F469 1F3FC 200D 1F692 ; fully-qualified # 👩🏼‍🚒 woman firefighter: medium-light skin tone
1F469 1F3FD 200D 1F692 ; fully-qualified # 👩🏽‍🚒 woman firefighter: medium skin tone
1F469 1F3FE 200D 1F692 ; fully-qualified # 👩🏾‍🚒 woman firefighter: medium-dark skin tone
1F469 1F3FF 200D 1F692 ; fully-qualified # 👩🏿‍🚒 woman firefighter: dark skin tone
1F46E ; fully-qualified # 👮 police officer
1F46E 1F3FB ; fully-qualified # 👮🏻 police officer: light skin tone
1F46E 1F3FC ; fully-qualified # 👮🏼 police officer: medium-light skin tone
1F46E 1F3FD ; fully-qualified # 👮🏽 police officer: medium skin tone
1F46E 1F3FE ; fully-qualified # 👮🏾 police officer: medium-dark skin tone
1F46E 1F3FF ; fully-qualified # 👮🏿 police officer: dark skin tone
1F46E 200D 2642 FE0F ; fully-qualified # 👮‍♂️ man police officer
1F46E 200D 2642 ; minimally-qualified # 👮‍♂ man police officer
1F46E 1F3FB 200D 2642 FE0F ; fully-qualified # 👮🏻‍♂️ man police officer: light skin tone
1F46E 1F3FB 200D 2642 ; minimally-qualified # 👮🏻‍♂ man police officer: light skin tone
1F46E 1F3FC 200D 2642 FE0F ; fully-qualified # 👮🏼‍♂️ man police officer: medium-light skin tone
1F46E 1F3FC 200D 2642 ; minimally-qualified # 👮🏼‍♂ man police officer: medium-light skin tone
1F46E 1F3FD 200D 2642 FE0F ; fully-qualified # 👮🏽‍♂️ man police officer: medium skin tone
1F46E 1F3FD 200D 2642 ; minimally-qualified # 👮🏽‍♂ man police officer: medium skin tone
1F46E 1F3FE 200D 2642 FE0F ; fully-qualified # 👮🏾‍♂️ man police officer: medium-dark skin tone
1F46E 1F3FE 200D 2642 ; minimally-qualified # 👮🏾‍♂ man police officer: medium-dark skin tone
1F46E 1F3FF 200D 2642 FE0F ; fully-qualified # 👮🏿‍♂️ man police officer: dark skin tone
1F46E 1F3FF 200D 2642 ; minimally-qualified # 👮🏿‍♂ man police officer: dark skin tone
1F46E 200D 2640 FE0F ; fully-qualified # 👮‍♀️ woman police officer
1F46E 200D 2640 ; minimally-qualified # 👮‍♀ woman police officer
1F46E 1F3FB 200D 2640 FE0F ; fully-qualified # 👮🏻‍♀️ woman police officer: light skin tone
1F46E 1F3FB 200D 2640 ; minimally-qualified # 👮🏻‍♀ woman police officer: light skin tone
1F46E 1F3FC 200D 2640 FE0F ; fully-qualified # 👮🏼‍♀️ woman police officer: medium-light skin tone
1F46E 1F3FC 200D 2640 ; minimally-qualified # 👮🏼‍♀ woman police officer: medium-light skin tone
1F46E 1F3FD 200D 2640 FE0F ; fully-qualified # 👮🏽‍♀️ woman police officer: medium skin tone
1F46E 1F3FD 200D 2640 ; minimally-qualified # 👮🏽‍♀ woman police officer: medium skin tone
1F46E 1F3FE 200D 2640 FE0F ; fully-qualified # 👮🏾‍♀️ woman police officer: medium-dark skin tone
1F46E 1F3FE 200D 2640 ; minimally-qualified # 👮🏾‍♀ woman police officer: medium-dark skin tone
1F46E 1F3FF 200D 2640 FE0F ; fully-qualified # 👮🏿‍♀️ woman police officer: dark skin tone
1F46E 1F3FF 200D 2640 ; minimally-qualified # 👮🏿‍♀ woman police officer: dark skin tone
1F575 FE0F ; fully-qualified # 🕵️ detective
1F575 ; unqualified # 🕵 detective
1F575 1F3FB ; fully-qualified # 🕵🏻 detective: light skin tone
1F575 1F3FC ; fully-qualified # 🕵🏼 detective: medium-light skin tone
1F575 1F3FD ; fully-qualified # 🕵🏽 detective: medium skin tone
1F575 1F3FE ; fully-qualified # 🕵🏾 detective: medium-dark skin tone
1F575 1F3FF ; fully-qualified # 🕵🏿 detective: dark skin tone
1F575 FE0F 200D 2642 FE0F ; fully-qualified # 🕵️‍♂️ man detective
1F575 200D 2642 FE0F ; unqualified # 🕵‍♂️ man detective
1F575 FE0F 200D 2642 ; unqualified # 🕵️‍♂ man detective
1F575 200D 2642 ; unqualified # 🕵‍♂ man detective
1F575 1F3FB 200D 2642 FE0F ; fully-qualified # 🕵🏻‍♂️ man detective: light skin tone
1F575 1F3FB 200D 2642 ; minimally-qualified # 🕵🏻‍♂ man detective: light skin tone
1F575 1F3FC 200D 2642 FE0F ; fully-qualified # 🕵🏼‍♂️ man detective: medium-light skin tone
1F575 1F3FC 200D 2642 ; minimally-qualified # 🕵🏼‍♂ man detective: medium-light skin tone
1F575 1F3FD 200D 2642 FE0F ; fully-qualified # 🕵🏽‍♂️ man detective: medium skin tone
1F575 1F3FD 200D 2642 ; minimally-qualified # 🕵🏽‍♂ man detective: medium skin tone
1F575 1F3FE 200D 2642 FE0F ; fully-qualified # 🕵🏾‍♂️ man detective: medium-dark skin tone
1F575 1F3FE 200D 2642 ; minimally-qualified # 🕵🏾‍♂ man detective: medium-dark skin tone
1F575 1F3FF 200D 2642 FE0F ; fully-qualified # 🕵🏿‍♂️ man detective: dark skin tone
1F575 1F3FF 200D 2642 ; minimally-qualified # 🕵🏿‍♂ man detective: dark skin tone
1F575 FE0F 200D 2640 FE0F ; fully-qualified # 🕵️‍♀️ woman detective
1F575 200D 2640 FE0F ; unqualified # 🕵‍♀️ woman detective
1F575 FE0F 200D 2640 ; unqualified # 🕵️‍♀ woman detective
1F575 200D 2640 ; unqualified # 🕵‍♀ woman detective
1F575 1F3FB 200D 2640 FE0F ; fully-qualified # 🕵🏻‍♀️ woman detective: light skin tone
1F575 1F3FB 200D 2640 ; minimally-qualified # 🕵🏻‍♀ woman detective: light skin tone
1F575 1F3FC 200D 2640 FE0F ; fully-qualified # 🕵🏼‍♀️ woman detective: medium-light skin tone
1F575 1F3FC 200D 2640 ; minimally-qualified # 🕵🏼‍♀ woman detective: medium-light skin tone
1F575 1F3FD 200D 2640 FE0F ; fully-qualified # 🕵🏽‍♀️ woman detective: medium skin tone
1F575 1F3FD 200D 2640 ; minimally-qualified # 🕵🏽‍♀ woman detective: medium skin tone
1F575 1F3FE 200D 2640 FE0F ; fully-qualified # 🕵🏾‍♀️ woman detective: medium-dark skin tone
1F575 1F3FE 200D 2640 ; minimally-qualified # 🕵🏾‍♀ woman detective: medium-dark skin tone
1F575 1F3FF 200D 2640 FE0F ; fully-qualified # 🕵🏿‍♀️ woman detective: dark skin tone
1F575 1F3FF 200D 2640 ; minimally-qualified # 🕵🏿‍♀ woman detective: dark skin tone
1F482 ; fully-qualified # 💂 guard
1F482 1F3FB ; fully-qualified # 💂🏻 guard: light skin tone
1F482 1F3FC ; fully-qualified # 💂🏼 guard: medium-light skin tone
1F482 1F3FD ; fully-qualified # 💂🏽 guard: medium skin tone
1F482 1F3FE ; fully-qualified # 💂🏾 guard: medium-dark skin tone
1F482 1F3FF ; fully-qualified # 💂🏿 guard: dark skin tone
1F482 200D 2642 FE0F ; fully-qualified # 💂‍♂️ man guard
1F482 200D 2642 ; minimally-qualified # 💂‍♂ man guard
1F482 1F3FB 200D 2642 FE0F ; fully-qualified # 💂🏻‍♂️ man guard: light skin tone
1F482 1F3FB 200D 2642 ; minimally-qualified # 💂🏻‍♂ man guard: light skin tone
1F482 1F3FC 200D 2642 FE0F ; fully-qualified # 💂🏼‍♂️ man guard: medium-light skin tone
1F482 1F3FC 200D 2642 ; minimally-qualified # 💂🏼‍♂ man guard: medium-light skin tone
1F482 1F3FD 200D 2642 FE0F ; fully-qualified # 💂🏽‍♂️ man guard: medium skin tone
1F482 1F3FD 200D 2642 ; minimally-qualified # 💂🏽‍♂ man guard: medium skin tone
1F482 1F3FE 200D 2642 FE0F ; fully-qualified # 💂🏾‍♂️ man guard: medium-dark skin tone
1F482 1F3FE 200D 2642 ; minimally-qualified # 💂🏾‍♂ man guard: medium-dark skin tone
1F482 1F3FF 200D 2642 FE0F ; fully-qualified # 💂🏿‍♂️ man guard: dark skin tone
1F482 1F3FF 200D 2642 ; minimally-qualified # 💂🏿‍♂ man guard: dark skin tone
1F482 200D 2640 FE0F ; fully-qualified # 💂‍♀️ woman guard
1F482 200D 2640 ; minimally-qualified # 💂‍♀ woman guard
1F482 1F3FB 200D 2640 FE0F ; fully-qualified # 💂🏻‍♀️ woman guard: light skin tone
1F482 1F3FB 200D 2640 ; minimally-qualified # 💂🏻‍♀ woman guard: light skin tone
1F482 1F3FC 200D 2640 FE0F ; fully-qualified # 💂🏼‍♀️ woman guard: medium-light skin tone
1F482 1F3FC 200D 2640 ; minimally-qualified # 💂🏼‍♀ woman guard: medium-light skin tone
1F482 1F3FD 200D 2640 FE0F ; fully-qualified # 💂🏽‍♀️ woman guard: medium skin tone
1F482 1F3FD 200D 2640 ; minimally-qualified # 💂🏽‍♀ woman guard: medium skin tone
1F482 1F3FE 200D 2640 FE0F ; fully-qualified # 💂🏾‍♀️ woman guard: medium-dark skin tone
1F482 1F3FE 200D 2640 ; minimally-qualified # 💂🏾‍♀ woman guard: medium-dark skin tone
1F482 1F3FF 200D 2640 FE0F ; fully-qualified # 💂🏿‍♀️ woman guard: dark skin tone
1F482 1F3FF 200D 2640 ; minimally-qualified # 💂🏿‍♀ woman guard: dark skin tone
1F477 ; fully-qualified # 👷 construction worker
1F477 1F3FB ; fully-qualified # 👷🏻 construction worker: light skin tone
1F477 1F3FC ; fully-qualified # 👷🏼 construction worker: medium-light skin tone
1F477 1F3FD ; fully-qualified # 👷🏽 construction worker: medium skin tone
1F477 1F3FE ; fully-qualified # 👷🏾 construction worker: medium-dark skin tone
1F477 1F3FF ; fully-qualified # 👷🏿 construction worker: dark skin tone
1F477 200D 2642 FE0F ; fully-qualified # 👷‍♂️ man construction worker
1F477 200D 2642 ; minimally-qualified # 👷‍♂ man construction worker
1F477 1F3FB 200D 2642 FE0F ; fully-qualified # 👷🏻‍♂️ man construction worker: light skin tone
1F477 1F3FB 200D 2642 ; minimally-qualified # 👷🏻‍♂ man construction worker: light skin tone
1F477 1F3FC 200D 2642 FE0F ; fully-qualified # 👷🏼‍♂️ man construction worker: medium-light skin tone
1F477 1F3FC 200D 2642 ; minimally-qualified # 👷🏼‍♂ man construction worker: medium-light skin tone
1F477 1F3FD 200D 2642 FE0F ; fully-qualified # 👷🏽‍♂️ man construction worker: medium skin tone
1F477 1F3FD 200D 2642 ; minimally-qualified # 👷🏽‍♂ man construction worker: medium skin tone
1F477 1F3FE 200D 2642 FE0F ; fully-qualified # 👷🏾‍♂️ man construction worker: medium-dark skin tone
1F477 1F3FE 200D 2642 ; minimally-qualified # 👷🏾‍♂ man construction worker: medium-dark skin tone
1F477 1F3FF 200D 2642 FE0F ; fully-qualified # 👷🏿‍♂️ man construction worker: dark skin tone
1F477 1F3FF 200D 2642 ; minimally-qualified # 👷🏿‍♂ man construction worker: dark skin tone
1F477 200D 2640 FE0F ; fully-qualified # 👷‍♀️ woman construction worker
1F477 200D 2640 ; minimally-qualified # 👷‍♀ woman construction worker
1F477 1F3FB 200D 2640 FE0F ; fully-qualified # 👷🏻‍♀️ woman construction worker: light skin tone
1F477 1F3FB 200D 2640 ; minimally-qualified # 👷🏻‍♀ woman construction worker: light skin tone
1F477 1F3FC 200D 2640 FE0F ; fully-qualified # 👷🏼‍♀️ woman construction worker: medium-light skin tone
1F477 1F3FC 200D 2640 ; minimally-qualified # 👷🏼‍♀ woman construction worker: medium-light skin tone
1F477 1F3FD 200D 2640 FE0F ; fully-qualified # 👷🏽‍♀️ woman construction worker: medium skin tone
1F477 1F3FD 200D 2640 ; minimally-qualified # 👷🏽‍♀ woman construction worker: medium skin tone
1F477 1F3FE 200D 2640 FE0F ; fully-qualified # 👷🏾‍♀️ woman construction worker: medium-dark skin tone
1F477 1F3FE 200D 2640 ; minimally-qualified # 👷🏾‍♀ woman construction worker: medium-dark skin tone
1F477 1F3FF 200D 2640 FE0F ; fully-qualified # 👷🏿‍♀️ woman construction worker: dark skin tone
1F477 1F3FF 200D 2640 ; minimally-qualified # 👷🏿‍♀ woman construction worker: dark skin tone
1F934 ; fully-qualified # 🤴 prince
1F934 1F3FB ; fully-qualified # 🤴🏻 prince: light skin tone
1F934 1F3FC ; fully-qualified # 🤴🏼 prince: medium-light skin tone
1F934 1F3FD ; fully-qualified # 🤴🏽 prince: medium skin tone
1F934 1F3FE ; fully-qualified # 🤴🏾 prince: medium-dark skin tone
1F934 1F3FF ; fully-qualified # 🤴🏿 prince: dark skin tone
1F478 ; fully-qualified # 👸 princess
1F478 1F3FB ; fully-qualified # 👸🏻 princess: light skin tone
1F478 1F3FC ; fully-qualified # 👸🏼 princess: medium-light skin tone
1F478 1F3FD ; fully-qualified # 👸🏽 princess: medium skin tone
1F478 1F3FE ; fully-qualified # 👸🏾 princess: medium-dark skin tone
1F478 1F3FF ; fully-qualified # 👸🏿 princess: dark skin tone
1F473 ; fully-qualified # 👳 person wearing turban
1F473 1F3FB ; fully-qualified # 👳🏻 person wearing turban: light skin tone
1F473 1F3FC ; fully-qualified # 👳🏼 person wearing turban: medium-light skin tone
1F473 1F3FD ; fully-qualified # 👳🏽 person wearing turban: medium skin tone
1F473 1F3FE ; fully-qualified # 👳🏾 person wearing turban: medium-dark skin tone
1F473 1F3FF ; fully-qualified # 👳🏿 person wearing turban: dark skin tone
1F473 200D 2642 FE0F ; fully-qualified # 👳‍♂️ man wearing turban
1F473 200D 2642 ; minimally-qualified # 👳‍♂ man wearing turban
1F473 1F3FB 200D 2642 FE0F ; fully-qualified # 👳🏻‍♂️ man wearing turban: light skin tone
1F473 1F3FB 200D 2642 ; minimally-qualified # 👳🏻‍♂ man wearing turban: light skin tone
1F473 1F3FC 200D 2642 FE0F ; fully-qualified # 👳🏼‍♂️ man wearing turban: medium-light skin tone
1F473 1F3FC 200D 2642 ; minimally-qualified # 👳🏼‍♂ man wearing turban: medium-light skin tone
1F473 1F3FD 200D 2642 FE0F ; fully-qualified # 👳🏽‍♂️ man wearing turban: medium skin tone
1F473 1F3FD 200D 2642 ; minimally-qualified # 👳🏽‍♂ man wearing turban: medium skin tone
1F473 1F3FE 200D 2642 FE0F ; fully-qualified # 👳🏾‍♂️ man wearing turban: medium-dark skin tone
1F473 1F3FE 200D 2642 ; minimally-qualified # 👳🏾‍♂ man wearing turban: medium-dark skin tone
1F473 1F3FF 200D 2642 FE0F ; fully-qualified # 👳🏿‍♂️ man wearing turban: dark skin tone
1F473 1F3FF 200D 2642 ; minimally-qualified # 👳🏿‍♂ man wearing turban: dark skin tone
1F473 200D 2640 FE0F ; fully-qualified # 👳‍♀️ woman wearing turban
1F473 200D 2640 ; minimally-qualified # 👳‍♀ woman wearing turban
1F473 1F3FB 200D 2640 FE0F ; fully-qualified # 👳🏻‍♀️ woman wearing turban: light skin tone
1F473 1F3FB 200D 2640 ; minimally-qualified # 👳🏻‍♀ woman wearing turban: light skin tone
1F473 1F3FC 200D 2640 FE0F ; fully-qualified # 👳🏼‍♀️ woman wearing turban: medium-light skin tone
1F473 1F3FC 200D 2640 ; minimally-qualified # 👳🏼‍♀ woman wearing turban: medium-light skin tone
1F473 1F3FD 200D 2640 FE0F ; fully-qualified # 👳🏽‍♀️ woman wearing turban: medium skin tone
1F473 1F3FD 200D 2640 ; minimally-qualified # 👳🏽‍♀ woman wearing turban: medium skin tone
1F473 1F3FE 200D 2640 FE0F ; fully-qualified # 👳🏾‍♀️ woman wearing turban: medium-dark skin tone
1F473 1F3FE 200D 2640 ; minimally-qualified # 👳🏾‍♀ woman wearing turban: medium-dark skin tone
1F473 1F3FF 200D 2640 FE0F ; fully-qualified # 👳🏿‍♀️ woman wearing turban: dark skin tone
1F473 1F3FF 200D 2640 ; minimally-qualified # 👳🏿‍♀ woman wearing turban: dark skin tone
1F472 ; fully-qualified # 👲 man with Chinese cap
1F472 1F3FB ; fully-qualified # 👲🏻 man with Chinese cap: light skin tone
1F472 1F3FC ; fully-qualified # 👲🏼 man with Chinese cap: medium-light skin tone
1F472 1F3FD ; fully-qualified # 👲🏽 man with Chinese cap: medium skin tone
1F472 1F3FE ; fully-qualified # 👲🏾 man with Chinese cap: medium-dark skin tone
1F472 1F3FF ; fully-qualified # 👲🏿 man with Chinese cap: dark skin tone
1F9D5 ; fully-qualified # 🧕 woman with headscarf
1F9D5 1F3FB ; fully-qualified # 🧕🏻 woman with headscarf: light skin tone
1F9D5 1F3FC ; fully-qualified # 🧕🏼 woman with headscarf: medium-light skin tone
1F9D5 1F3FD ; fully-qualified # 🧕🏽 woman with headscarf: medium skin tone
1F9D5 1F3FE ; fully-qualified # 🧕🏾 woman with headscarf: medium-dark skin tone
1F9D5 1F3FF ; fully-qualified # 🧕🏿 woman with headscarf: dark skin tone
1F935 ; fully-qualified # 🤵 man in tuxedo
1F935 1F3FB ; fully-qualified # 🤵🏻 man in tuxedo: light skin tone
1F935 1F3FC ; fully-qualified # 🤵🏼 man in tuxedo: medium-light skin tone
1F935 1F3FD ; fully-qualified # 🤵🏽 man in tuxedo: medium skin tone
1F935 1F3FE ; fully-qualified # 🤵🏾 man in tuxedo: medium-dark skin tone
1F935 1F3FF ; fully-qualified # 🤵🏿 man in tuxedo: dark skin tone
1F470 ; fully-qualified # 👰 bride with veil
1F470 1F3FB ; fully-qualified # 👰🏻 bride with veil: light skin tone
1F470 1F3FC ; fully-qualified # 👰🏼 bride with veil: medium-light skin tone
1F470 1F3FD ; fully-qualified # 👰🏽 bride with veil: medium skin tone
1F470 1F3FE ; fully-qualified # 👰🏾 bride with veil: medium-dark skin tone
1F470 1F3FF ; fully-qualified # 👰🏿 bride with veil: dark skin tone
1F930 ; fully-qualified # 🤰 pregnant woman
1F930 1F3FB ; fully-qualified # 🤰🏻 pregnant woman: light skin tone
1F930 1F3FC ; fully-qualified # 🤰🏼 pregnant woman: medium-light skin tone
1F930 1F3FD ; fully-qualified # 🤰🏽 pregnant woman: medium skin tone
1F930 1F3FE ; fully-qualified # 🤰🏾 pregnant woman: medium-dark skin tone
1F930 1F3FF ; fully-qualified # 🤰🏿 pregnant woman: dark skin tone
1F931 ; fully-qualified # 🤱 breast-feeding
1F931 1F3FB ; fully-qualified # 🤱🏻 breast-feeding: light skin tone
1F931 1F3FC ; fully-qualified # 🤱🏼 breast-feeding: medium-light skin tone
1F931 1F3FD ; fully-qualified # 🤱🏽 breast-feeding: medium skin tone
1F931 1F3FE ; fully-qualified # 🤱🏾 breast-feeding: medium-dark skin tone
1F931 1F3FF ; fully-qualified # 🤱🏿 breast-feeding: dark skin tone
# subgroup: person-fantasy
1F47C ; fully-qualified # 👼 baby angel
1F47C 1F3FB ; fully-qualified # 👼🏻 baby angel: light skin tone
1F47C 1F3FC ; fully-qualified # 👼🏼 baby angel: medium-light skin tone
1F47C 1F3FD ; fully-qualified # 👼🏽 baby angel: medium skin tone
1F47C 1F3FE ; fully-qualified # 👼🏾 baby angel: medium-dark skin tone
1F47C 1F3FF ; fully-qualified # 👼🏿 baby angel: dark skin tone
1F385 ; fully-qualified # 🎅 Santa Claus
1F385 1F3FB ; fully-qualified # 🎅🏻 Santa Claus: light skin tone
1F385 1F3FC ; fully-qualified # 🎅🏼 Santa Claus: medium-light skin tone
1F385 1F3FD ; fully-qualified # 🎅🏽 Santa Claus: medium skin tone
1F385 1F3FE ; fully-qualified # 🎅🏾 Santa Claus: medium-dark skin tone
1F385 1F3FF ; fully-qualified # 🎅🏿 Santa Claus: dark skin tone
1F936 ; fully-qualified # 🤶 Mrs. Claus
1F936 1F3FB ; fully-qualified # 🤶🏻 Mrs. Claus: light skin tone
1F936 1F3FC ; fully-qualified # 🤶🏼 Mrs. Claus: medium-light skin tone
1F936 1F3FD ; fully-qualified # 🤶🏽 Mrs. Claus: medium skin tone
1F936 1F3FE ; fully-qualified # 🤶🏾 Mrs. Claus: medium-dark skin tone
1F936 1F3FF ; fully-qualified # 🤶🏿 Mrs. Claus: dark skin tone
1F9B8 ; fully-qualified # 🦸 superhero
1F9B8 1F3FB ; fully-qualified # 🦸🏻 superhero: light skin tone
1F9B8 1F3FC ; fully-qualified # 🦸🏼 superhero: medium-light skin tone
1F9B8 1F3FD ; fully-qualified # 🦸🏽 superhero: medium skin tone
1F9B8 1F3FE ; fully-qualified # 🦸🏾 superhero: medium-dark skin tone
1F9B8 1F3FF ; fully-qualified # 🦸🏿 superhero: dark skin tone
1F9B8 200D 2642 FE0F ; fully-qualified # 🦸‍♂️ man superhero
1F9B8 200D 2642 ; minimally-qualified # 🦸‍♂ man superhero
1F9B8 1F3FB 200D 2642 FE0F ; fully-qualified # 🦸🏻‍♂️ man superhero: light skin tone
1F9B8 1F3FB 200D 2642 ; minimally-qualified # 🦸🏻‍♂ man superhero: light skin tone
1F9B8 1F3FC 200D 2642 FE0F ; fully-qualified # 🦸🏼‍♂️ man superhero: medium-light skin tone
1F9B8 1F3FC 200D 2642 ; minimally-qualified # 🦸🏼‍♂ man superhero: medium-light skin tone
1F9B8 1F3FD 200D 2642 FE0F ; fully-qualified # 🦸🏽‍♂️ man superhero: medium skin tone
1F9B8 1F3FD 200D 2642 ; minimally-qualified # 🦸🏽‍♂ man superhero: medium skin tone
1F9B8 1F3FE 200D 2642 FE0F ; fully-qualified # 🦸🏾‍♂️ man superhero: medium-dark skin tone
1F9B8 1F3FE 200D 2642 ; minimally-qualified # 🦸🏾‍♂ man superhero: medium-dark skin tone
1F9B8 1F3FF 200D 2642 FE0F ; fully-qualified # 🦸🏿‍♂️ man superhero: dark skin tone
1F9B8 1F3FF 200D 2642 ; minimally-qualified # 🦸🏿‍♂ man superhero: dark skin tone
1F9B8 200D 2640 FE0F ; fully-qualified # 🦸‍♀️ woman superhero
1F9B8 200D 2640 ; minimally-qualified # 🦸‍♀ woman superhero
1F9B8 1F3FB 200D 2640 FE0F ; fully-qualified # 🦸🏻‍♀️ woman superhero: light skin tone
1F9B8 1F3FB 200D 2640 ; minimally-qualified # 🦸🏻‍♀ woman superhero: light skin tone
1F9B8 1F3FC 200D 2640 FE0F ; fully-qualified # 🦸🏼‍♀️ woman superhero: medium-light skin tone
1F9B8 1F3FC 200D 2640 ; minimally-qualified # 🦸🏼‍♀ woman superhero: medium-light skin tone
1F9B8 1F3FD 200D 2640 FE0F ; fully-qualified # 🦸🏽‍♀️ woman superhero: medium skin tone
1F9B8 1F3FD 200D 2640 ; minimally-qualified # 🦸🏽‍♀ woman superhero: medium skin tone
1F9B8 1F3FE 200D 2640 FE0F ; fully-qualified # 🦸🏾‍♀️ woman superhero: medium-dark skin tone
1F9B8 1F3FE 200D 2640 ; minimally-qualified # 🦸🏾‍♀ woman superhero: medium-dark skin tone
1F9B8 1F3FF 200D 2640 FE0F ; fully-qualified # 🦸🏿‍♀️ woman superhero: dark skin tone
1F9B8 1F3FF 200D 2640 ; minimally-qualified # 🦸🏿‍♀ woman superhero: dark skin tone
1F9B9 ; fully-qualified # 🦹 supervillain
1F9B9 1F3FB ; fully-qualified # 🦹🏻 supervillain: light skin tone
1F9B9 1F3FC ; fully-qualified # 🦹🏼 supervillain: medium-light skin tone
1F9B9 1F3FD ; fully-qualified # 🦹🏽 supervillain: medium skin tone
1F9B9 1F3FE ; fully-qualified # 🦹🏾 supervillain: medium-dark skin tone
1F9B9 1F3FF ; fully-qualified # 🦹🏿 supervillain: dark skin tone
1F9B9 200D 2642 FE0F ; fully-qualified # 🦹‍♂️ man supervillain
1F9B9 200D 2642 ; minimally-qualified # 🦹‍♂ man supervillain
1F9B9 1F3FB 200D 2642 FE0F ; fully-qualified # 🦹🏻‍♂️ man supervillain: light skin tone
1F9B9 1F3FB 200D 2642 ; minimally-qualified # 🦹🏻‍♂ man supervillain: light skin tone
1F9B9 1F3FC 200D 2642 FE0F ; fully-qualified # 🦹🏼‍♂️ man supervillain: medium-light skin tone
1F9B9 1F3FC 200D 2642 ; minimally-qualified # 🦹🏼‍♂ man supervillain: medium-light skin tone
1F9B9 1F3FD 200D 2642 FE0F ; fully-qualified # 🦹🏽‍♂️ man supervillain: medium skin tone
1F9B9 1F3FD 200D 2642 ; minimally-qualified # 🦹🏽‍♂ man supervillain: medium skin tone
1F9B9 1F3FE 200D 2642 FE0F ; fully-qualified # 🦹🏾‍♂️ man supervillain: medium-dark skin tone
1F9B9 1F3FE 200D 2642 ; minimally-qualified # 🦹🏾‍♂ man supervillain: medium-dark skin tone
1F9B9 1F3FF 200D 2642 FE0F ; fully-qualified # 🦹🏿‍♂️ man supervillain: dark skin tone
1F9B9 1F3FF 200D 2642 ; minimally-qualified # 🦹🏿‍♂ man supervillain: dark skin tone
1F9B9 200D 2640 FE0F ; fully-qualified # 🦹‍♀️ woman supervillain
1F9B9 200D 2640 ; minimally-qualified # 🦹‍♀ woman supervillain
1F9B9 1F3FB 200D 2640 FE0F ; fully-qualified # 🦹🏻‍♀️ woman supervillain: light skin tone
1F9B9 1F3FB 200D 2640 ; minimally-qualified # 🦹🏻‍♀ woman supervillain: light skin tone
1F9B9 1F3FC 200D 2640 FE0F ; fully-qualified # 🦹🏼‍♀️ woman supervillain: medium-light skin tone
1F9B9 1F3FC 200D 2640 ; minimally-qualified # 🦹🏼‍♀ woman supervillain: medium-light skin tone
1F9B9 1F3FD 200D 2640 FE0F ; fully-qualified # 🦹🏽‍♀️ woman supervillain: medium skin tone
1F9B9 1F3FD 200D 2640 ; minimally-qualified # 🦹🏽‍♀ woman supervillain: medium skin tone
1F9B9 1F3FE 200D 2640 FE0F ; fully-qualified # 🦹🏾‍♀️ woman supervillain: medium-dark skin tone
1F9B9 1F3FE 200D 2640 ; minimally-qualified # 🦹🏾‍♀ woman supervillain: medium-dark skin tone
1F9B9 1F3FF 200D 2640 FE0F ; fully-qualified # 🦹🏿‍♀️ woman supervillain: dark skin tone
1F9B9 1F3FF 200D 2640 ; minimally-qualified # 🦹🏿‍♀ woman supervillain: dark skin tone
1F9D9 ; fully-qualified # 🧙 mage
1F9D9 1F3FB ; fully-qualified # 🧙🏻 mage: light skin tone
1F9D9 1F3FC ; fully-qualified # 🧙🏼 mage: medium-light skin tone
1F9D9 1F3FD ; fully-qualified # 🧙🏽 mage: medium skin tone
1F9D9 1F3FE ; fully-qualified # 🧙🏾 mage: medium-dark skin tone
1F9D9 1F3FF ; fully-qualified # 🧙🏿 mage: dark skin tone
1F9D9 200D 2642 FE0F ; fully-qualified # 🧙‍♂️ man mage
1F9D9 200D 2642 ; minimally-qualified # 🧙‍♂ man mage
1F9D9 1F3FB 200D 2642 FE0F ; fully-qualified # 🧙🏻‍♂️ man mage: light skin tone
1F9D9 1F3FB 200D 2642 ; minimally-qualified # 🧙🏻‍♂ man mage: light skin tone
1F9D9 1F3FC 200D 2642 FE0F ; fully-qualified # 🧙🏼‍♂️ man mage: medium-light skin tone
1F9D9 1F3FC 200D 2642 ; minimally-qualified # 🧙🏼‍♂ man mage: medium-light skin tone
1F9D9 1F3FD 200D 2642 FE0F ; fully-qualified # 🧙🏽‍♂️ man mage: medium skin tone
1F9D9 1F3FD 200D 2642 ; minimally-qualified # 🧙🏽‍♂ man mage: medium skin tone
1F9D9 1F3FE 200D 2642 FE0F ; fully-qualified # 🧙🏾‍♂️ man mage: medium-dark skin tone
1F9D9 1F3FE 200D 2642 ; minimally-qualified # 🧙🏾‍♂ man mage: medium-dark skin tone
1F9D9 1F3FF 200D 2642 FE0F ; fully-qualified # 🧙🏿‍♂️ man mage: dark skin tone
1F9D9 1F3FF 200D 2642 ; minimally-qualified # 🧙🏿‍♂ man mage: dark skin tone
1F9D9 200D 2640 FE0F ; fully-qualified # 🧙‍♀️ woman mage
1F9D9 200D 2640 ; minimally-qualified # 🧙‍♀ woman mage
1F9D9 1F3FB 200D 2640 FE0F ; fully-qualified # 🧙🏻‍♀️ woman mage: light skin tone
1F9D9 1F3FB 200D 2640 ; minimally-qualified # 🧙🏻‍♀ woman mage: light skin tone
1F9D9 1F3FC 200D 2640 FE0F ; fully-qualified # 🧙🏼‍♀️ woman mage: medium-light skin tone
1F9D9 1F3FC 200D 2640 ; minimally-qualified # 🧙🏼‍♀ woman mage: medium-light skin tone
1F9D9 1F3FD 200D 2640 FE0F ; fully-qualified # 🧙🏽‍♀️ woman mage: medium skin tone
1F9D9 1F3FD 200D 2640 ; minimally-qualified # 🧙🏽‍♀ woman mage: medium skin tone
1F9D9 1F3FE 200D 2640 FE0F ; fully-qualified # 🧙🏾‍♀️ woman mage: medium-dark skin tone
1F9D9 1F3FE 200D 2640 ; minimally-qualified # 🧙🏾‍♀ woman mage: medium-dark skin tone
1F9D9 1F3FF 200D 2640 FE0F ; fully-qualified # 🧙🏿‍♀️ woman mage: dark skin tone
1F9D9 1F3FF 200D 2640 ; minimally-qualified # 🧙🏿‍♀ woman mage: dark skin tone
1F9DA ; fully-qualified # 🧚 fairy
1F9DA 1F3FB ; fully-qualified # 🧚🏻 fairy: light skin tone
1F9DA 1F3FC ; fully-qualified # 🧚🏼 fairy: medium-light skin tone
1F9DA 1F3FD ; fully-qualified # 🧚🏽 fairy: medium skin tone
1F9DA 1F3FE ; fully-qualified # 🧚🏾 fairy: medium-dark skin tone
1F9DA 1F3FF ; fully-qualified # 🧚🏿 fairy: dark skin tone
1F9DA 200D 2642 FE0F ; fully-qualified # 🧚‍♂️ man fairy
1F9DA 200D 2642 ; minimally-qualified # 🧚‍♂ man fairy
1F9DA 1F3FB 200D 2642 FE0F ; fully-qualified # 🧚🏻‍♂️ man fairy: light skin tone
1F9DA 1F3FB 200D 2642 ; minimally-qualified # 🧚🏻‍♂ man fairy: light skin tone
1F9DA 1F3FC 200D 2642 FE0F ; fully-qualified # 🧚🏼‍♂️ man fairy: medium-light skin tone
1F9DA 1F3FC 200D 2642 ; minimally-qualified # 🧚🏼‍♂ man fairy: medium-light skin tone
1F9DA 1F3FD 200D 2642 FE0F ; fully-qualified # 🧚🏽‍♂️ man fairy: medium skin tone
1F9DA 1F3FD 200D 2642 ; minimally-qualified # 🧚🏽‍♂ man fairy: medium skin tone
1F9DA 1F3FE 200D 2642 FE0F ; fully-qualified # 🧚🏾‍♂️ man fairy: medium-dark skin tone
1F9DA 1F3FE 200D 2642 ; minimally-qualified # 🧚🏾‍♂ man fairy: medium-dark skin tone
1F9DA 1F3FF 200D 2642 FE0F ; fully-qualified # 🧚🏿‍♂️ man fairy: dark skin tone
1F9DA 1F3FF 200D 2642 ; minimally-qualified # 🧚🏿‍♂ man fairy: dark skin tone
1F9DA 200D 2640 FE0F ; fully-qualified # 🧚‍♀️ woman fairy
1F9DA 200D 2640 ; minimally-qualified # 🧚‍♀ woman fairy
1F9DA 1F3FB 200D 2640 FE0F ; fully-qualified # 🧚🏻‍♀️ woman fairy: light skin tone
1F9DA 1F3FB 200D 2640 ; minimally-qualified # 🧚🏻‍♀ woman fairy: light skin tone
1F9DA 1F3FC 200D 2640 FE0F ; fully-qualified # 🧚🏼‍♀️ woman fairy: medium-light skin tone
1F9DA 1F3FC 200D 2640 ; minimally-qualified # 🧚🏼‍♀ woman fairy: medium-light skin tone
1F9DA 1F3FD 200D 2640 FE0F ; fully-qualified # 🧚🏽‍♀️ woman fairy: medium skin tone
1F9DA 1F3FD 200D 2640 ; minimally-qualified # 🧚🏽‍♀ woman fairy: medium skin tone
1F9DA 1F3FE 200D 2640 FE0F ; fully-qualified # 🧚🏾‍♀️ woman fairy: medium-dark skin tone
1F9DA 1F3FE 200D 2640 ; minimally-qualified # 🧚🏾‍♀ woman fairy: medium-dark skin tone
1F9DA 1F3FF 200D 2640 FE0F ; fully-qualified # 🧚🏿‍♀️ woman fairy: dark skin tone
1F9DA 1F3FF 200D 2640 ; minimally-qualified # 🧚🏿‍♀ woman fairy: dark skin tone
1F9DB ; fully-qualified # 🧛 vampire
1F9DB 1F3FB ; fully-qualified # 🧛🏻 vampire: light skin tone
1F9DB 1F3FC ; fully-qualified # 🧛🏼 vampire: medium-light skin tone
1F9DB 1F3FD ; fully-qualified # 🧛🏽 vampire: medium skin tone
1F9DB 1F3FE ; fully-qualified # 🧛🏾 vampire: medium-dark skin tone
1F9DB 1F3FF ; fully-qualified # 🧛🏿 vampire: dark skin tone
1F9DB 200D 2642 FE0F ; fully-qualified # 🧛‍♂️ man vampire
1F9DB 200D 2642 ; minimally-qualified # 🧛‍♂ man vampire
1F9DB 1F3FB 200D 2642 FE0F ; fully-qualified # 🧛🏻‍♂️ man vampire: light skin tone
1F9DB 1F3FB 200D 2642 ; minimally-qualified # 🧛🏻‍♂ man vampire: light skin tone
1F9DB 1F3FC 200D 2642 FE0F ; fully-qualified # 🧛🏼‍♂️ man vampire: medium-light skin tone
1F9DB 1F3FC 200D 2642 ; minimally-qualified # 🧛🏼‍♂ man vampire: medium-light skin tone
1F9DB 1F3FD 200D 2642 FE0F ; fully-qualified # 🧛🏽‍♂️ man vampire: medium skin tone
1F9DB 1F3FD 200D 2642 ; minimally-qualified # 🧛🏽‍♂ man vampire: medium skin tone
1F9DB 1F3FE 200D 2642 FE0F ; fully-qualified # 🧛🏾‍♂️ man vampire: medium-dark skin tone
1F9DB 1F3FE 200D 2642 ; minimally-qualified # 🧛🏾‍♂ man vampire: medium-dark skin tone
1F9DB 1F3FF 200D 2642 FE0F ; fully-qualified # 🧛🏿‍♂️ man vampire: dark skin tone
1F9DB 1F3FF 200D 2642 ; minimally-qualified # 🧛🏿‍♂ man vampire: dark skin tone
1F9DB 200D 2640 FE0F ; fully-qualified # 🧛‍♀️ woman vampire
1F9DB 200D 2640 ; minimally-qualified # 🧛‍♀ woman vampire
1F9DB 1F3FB 200D 2640 FE0F ; fully-qualified # 🧛🏻‍♀️ woman vampire: light skin tone
1F9DB 1F3FB 200D 2640 ; minimally-qualified # 🧛🏻‍♀ woman vampire: light skin tone
1F9DB 1F3FC 200D 2640 FE0F ; fully-qualified # 🧛🏼‍♀️ woman vampire: medium-light skin tone
1F9DB 1F3FC 200D 2640 ; minimally-qualified # 🧛🏼‍♀ woman vampire: medium-light skin tone
1F9DB 1F3FD 200D 2640 FE0F ; fully-qualified # 🧛🏽‍♀️ woman vampire: medium skin tone
1F9DB 1F3FD 200D 2640 ; minimally-qualified # 🧛🏽‍♀ woman vampire: medium skin tone
1F9DB 1F3FE 200D 2640 FE0F ; fully-qualified # 🧛🏾‍♀️ woman vampire: medium-dark skin tone
1F9DB 1F3FE 200D 2640 ; minimally-qualified # 🧛🏾‍♀ woman vampire: medium-dark skin tone
1F9DB 1F3FF 200D 2640 FE0F ; fully-qualified # 🧛🏿‍♀️ woman vampire: dark skin tone
1F9DB 1F3FF 200D 2640 ; minimally-qualified # 🧛🏿‍♀ woman vampire: dark skin tone
1F9DC ; fully-qualified # 🧜 merperson
1F9DC 1F3FB ; fully-qualified # 🧜🏻 merperson: light skin tone
1F9DC 1F3FC ; fully-qualified # 🧜🏼 merperson: medium-light skin tone
1F9DC 1F3FD ; fully-qualified # 🧜🏽 merperson: medium skin tone
1F9DC 1F3FE ; fully-qualified # 🧜🏾 merperson: medium-dark skin tone
1F9DC 1F3FF ; fully-qualified # 🧜🏿 merperson: dark skin tone
1F9DC 200D 2642 FE0F ; fully-qualified # 🧜‍♂️ merman
1F9DC 200D 2642 ; minimally-qualified # 🧜‍♂ merman
1F9DC 1F3FB 200D 2642 FE0F ; fully-qualified # 🧜🏻‍♂️ merman: light skin tone
1F9DC 1F3FB 200D 2642 ; minimally-qualified # 🧜🏻‍♂ merman: light skin tone
1F9DC 1F3FC 200D 2642 FE0F ; fully-qualified # 🧜🏼‍♂️ merman: medium-light skin tone
1F9DC 1F3FC 200D 2642 ; minimally-qualified # 🧜🏼‍♂ merman: medium-light skin tone
1F9DC 1F3FD 200D 2642 FE0F ; fully-qualified # 🧜🏽‍♂️ merman: medium skin tone
1F9DC 1F3FD 200D 2642 ; minimally-qualified # 🧜🏽‍♂ merman: medium skin tone
1F9DC 1F3FE 200D 2642 FE0F ; fully-qualified # 🧜🏾‍♂️ merman: medium-dark skin tone
1F9DC 1F3FE 200D 2642 ; minimally-qualified # 🧜🏾‍♂ merman: medium-dark skin tone
1F9DC 1F3FF 200D 2642 FE0F ; fully-qualified # 🧜🏿‍♂️ merman: dark skin tone
1F9DC 1F3FF 200D 2642 ; minimally-qualified # 🧜🏿‍♂ merman: dark skin tone
1F9DC 200D 2640 FE0F ; fully-qualified # 🧜‍♀️ mermaid
1F9DC 200D 2640 ; minimally-qualified # 🧜‍♀ mermaid
1F9DC 1F3FB 200D 2640 FE0F ; fully-qualified # 🧜🏻‍♀️ mermaid: light skin tone
1F9DC 1F3FB 200D 2640 ; minimally-qualified # 🧜🏻‍♀ mermaid: light skin tone
1F9DC 1F3FC 200D 2640 FE0F ; fully-qualified # 🧜🏼‍♀️ mermaid: medium-light skin tone
1F9DC 1F3FC 200D 2640 ; minimally-qualified # 🧜🏼‍♀ mermaid: medium-light skin tone
1F9DC 1F3FD 200D 2640 FE0F ; fully-qualified # 🧜🏽‍♀️ mermaid: medium skin tone
1F9DC 1F3FD 200D 2640 ; minimally-qualified # 🧜🏽‍♀ mermaid: medium skin tone
1F9DC 1F3FE 200D 2640 FE0F ; fully-qualified # 🧜🏾‍♀️ mermaid: medium-dark skin tone
1F9DC 1F3FE 200D 2640 ; minimally-qualified # 🧜🏾‍♀ mermaid: medium-dark skin tone
1F9DC 1F3FF 200D 2640 FE0F ; fully-qualified # 🧜🏿‍♀️ mermaid: dark skin tone
1F9DC 1F3FF 200D 2640 ; minimally-qualified # 🧜🏿‍♀ mermaid: dark skin tone
1F9DD ; fully-qualified # 🧝 elf
1F9DD 1F3FB ; fully-qualified # 🧝🏻 elf: light skin tone
1F9DD 1F3FC ; fully-qualified # 🧝🏼 elf: medium-light skin tone
1F9DD 1F3FD ; fully-qualified # 🧝🏽 elf: medium skin tone
1F9DD 1F3FE ; fully-qualified # 🧝🏾 elf: medium-dark skin tone
1F9DD 1F3FF ; fully-qualified # 🧝🏿 elf: dark skin tone
1F9DD 200D 2642 FE0F ; fully-qualified # 🧝‍♂️ man elf
1F9DD 200D 2642 ; minimally-qualified # 🧝‍♂ man elf
1F9DD 1F3FB 200D 2642 FE0F ; fully-qualified # 🧝🏻‍♂️ man elf: light skin tone
1F9DD 1F3FB 200D 2642 ; minimally-qualified # 🧝🏻‍♂ man elf: light skin tone
1F9DD 1F3FC 200D 2642 FE0F ; fully-qualified # 🧝🏼‍♂️ man elf: medium-light skin tone
1F9DD 1F3FC 200D 2642 ; minimally-qualified # 🧝🏼‍♂ man elf: medium-light skin tone
1F9DD 1F3FD 200D 2642 FE0F ; fully-qualified # 🧝🏽‍♂️ man elf: medium skin tone
1F9DD 1F3FD 200D 2642 ; minimally-qualified # 🧝🏽‍♂ man elf: medium skin tone
1F9DD 1F3FE 200D 2642 FE0F ; fully-qualified # 🧝🏾‍♂️ man elf: medium-dark skin tone
1F9DD 1F3FE 200D 2642 ; minimally-qualified # 🧝🏾‍♂ man elf: medium-dark skin tone
1F9DD 1F3FF 200D 2642 FE0F ; fully-qualified # 🧝🏿‍♂️ man elf: dark skin tone
1F9DD 1F3FF 200D 2642 ; minimally-qualified # 🧝🏿‍♂ man elf: dark skin tone
1F9DD 200D 2640 FE0F ; fully-qualified # 🧝‍♀️ woman elf
1F9DD 200D 2640 ; minimally-qualified # 🧝‍♀ woman elf
1F9DD 1F3FB 200D 2640 FE0F ; fully-qualified # 🧝🏻‍♀️ woman elf: light skin tone
1F9DD 1F3FB 200D 2640 ; minimally-qualified # 🧝🏻‍♀ woman elf: light skin tone
1F9DD 1F3FC 200D 2640 FE0F ; fully-qualified # 🧝🏼‍♀️ woman elf: medium-light skin tone
1F9DD 1F3FC 200D 2640 ; minimally-qualified # 🧝🏼‍♀ woman elf: medium-light skin tone
1F9DD 1F3FD 200D 2640 FE0F ; fully-qualified # 🧝🏽‍♀️ woman elf: medium skin tone
1F9DD 1F3FD 200D 2640 ; minimally-qualified # 🧝🏽‍♀ woman elf: medium skin tone
1F9DD 1F3FE 200D 2640 FE0F ; fully-qualified # 🧝🏾‍♀️ woman elf: medium-dark skin tone
1F9DD 1F3FE 200D 2640 ; minimally-qualified # 🧝🏾‍♀ woman elf: medium-dark skin tone
1F9DD 1F3FF 200D 2640 FE0F ; fully-qualified # 🧝🏿‍♀️ woman elf: dark skin tone
1F9DD 1F3FF 200D 2640 ; minimally-qualified # 🧝🏿‍♀ woman elf: dark skin tone
1F9DE ; fully-qualified # 🧞 genie
1F9DE 200D 2642 FE0F ; fully-qualified # 🧞‍♂️ man genie
1F9DE 200D 2642 ; minimally-qualified # 🧞‍♂ man genie
1F9DE 200D 2640 FE0F ; fully-qualified # 🧞‍♀️ woman genie
1F9DE 200D 2640 ; minimally-qualified # 🧞‍♀ woman genie
1F9DF ; fully-qualified # 🧟 zombie
1F9DF 200D 2642 FE0F ; fully-qualified # 🧟‍♂️ man zombie
1F9DF 200D 2642 ; minimally-qualified # 🧟‍♂ man zombie
1F9DF 200D 2640 FE0F ; fully-qualified # 🧟‍♀️ woman zombie
1F9DF 200D 2640 ; minimally-qualified # 🧟‍♀ woman zombie
# subgroup: person-activity
1F486 ; fully-qualified # 💆 person getting massage
1F486 1F3FB ; fully-qualified # 💆🏻 person getting massage: light skin tone
1F486 1F3FC ; fully-qualified # 💆🏼 person getting massage: medium-light skin tone
1F486 1F3FD ; fully-qualified # 💆🏽 person getting massage: medium skin tone
1F486 1F3FE ; fully-qualified # 💆🏾 person getting massage: medium-dark skin tone
1F486 1F3FF ; fully-qualified # 💆🏿 person getting massage: dark skin tone
1F486 200D 2642 FE0F ; fully-qualified # 💆‍♂️ man getting massage
1F486 200D 2642 ; minimally-qualified # 💆‍♂ man getting massage
1F486 1F3FB 200D 2642 FE0F ; fully-qualified # 💆🏻‍♂️ man getting massage: light skin tone
1F486 1F3FB 200D 2642 ; minimally-qualified # 💆🏻‍♂ man getting massage: light skin tone
1F486 1F3FC 200D 2642 FE0F ; fully-qualified # 💆🏼‍♂️ man getting massage: medium-light skin tone
1F486 1F3FC 200D 2642 ; minimally-qualified # 💆🏼‍♂ man getting massage: medium-light skin tone
1F486 1F3FD 200D 2642 FE0F ; fully-qualified # 💆🏽‍♂️ man getting massage: medium skin tone
1F486 1F3FD 200D 2642 ; minimally-qualified # 💆🏽‍♂ man getting massage: medium skin tone
1F486 1F3FE 200D 2642 FE0F ; fully-qualified # 💆🏾‍♂️ man getting massage: medium-dark skin tone
1F486 1F3FE 200D 2642 ; minimally-qualified # 💆🏾‍♂ man getting massage: medium-dark skin tone
1F486 1F3FF 200D 2642 FE0F ; fully-qualified # 💆🏿‍♂️ man getting massage: dark skin tone
1F486 1F3FF 200D 2642 ; minimally-qualified # 💆🏿‍♂ man getting massage: dark skin tone
1F486 200D 2640 FE0F ; fully-qualified # 💆‍♀️ woman getting massage
1F486 200D 2640 ; minimally-qualified # 💆‍♀ woman getting massage
1F486 1F3FB 200D 2640 FE0F ; fully-qualified # 💆🏻‍♀️ woman getting massage: light skin tone
1F486 1F3FB 200D 2640 ; minimally-qualified # 💆🏻‍♀ woman getting massage: light skin tone
1F486 1F3FC 200D 2640 FE0F ; fully-qualified # 💆🏼‍♀️ woman getting massage: medium-light skin tone
1F486 1F3FC 200D 2640 ; minimally-qualified # 💆🏼‍♀ woman getting massage: medium-light skin tone
1F486 1F3FD 200D 2640 FE0F ; fully-qualified # 💆🏽‍♀️ woman getting massage: medium skin tone
1F486 1F3FD 200D 2640 ; minimally-qualified # 💆🏽‍♀ woman getting massage: medium skin tone
1F486 1F3FE 200D 2640 FE0F ; fully-qualified # 💆🏾‍♀️ woman getting massage: medium-dark skin tone
1F486 1F3FE 200D 2640 ; minimally-qualified # 💆🏾‍♀ woman getting massage: medium-dark skin tone
1F486 1F3FF 200D 2640 FE0F ; fully-qualified # 💆🏿‍♀️ woman getting massage: dark skin tone
1F486 1F3FF 200D 2640 ; minimally-qualified # 💆🏿‍♀ woman getting massage: dark skin tone
1F487 ; fully-qualified # 💇 person getting haircut
1F487 1F3FB ; fully-qualified # 💇🏻 person getting haircut: light skin tone
1F487 1F3FC ; fully-qualified # 💇🏼 person getting haircut: medium-light skin tone
1F487 1F3FD ; fully-qualified # 💇🏽 person getting haircut: medium skin tone
1F487 1F3FE ; fully-qualified # 💇🏾 person getting haircut: medium-dark skin tone
1F487 1F3FF ; fully-qualified # 💇🏿 person getting haircut: dark skin tone
1F487 200D 2642 FE0F ; fully-qualified # 💇‍♂️ man getting haircut
1F487 200D 2642 ; minimally-qualified # 💇‍♂ man getting haircut
1F487 1F3FB 200D 2642 FE0F ; fully-qualified # 💇🏻‍♂️ man getting haircut: light skin tone
1F487 1F3FB 200D 2642 ; minimally-qualified # 💇🏻‍♂ man getting haircut: light skin tone
1F487 1F3FC 200D 2642 FE0F ; fully-qualified # 💇🏼‍♂️ man getting haircut: medium-light skin tone
1F487 1F3FC 200D 2642 ; minimally-qualified # 💇🏼‍♂ man getting haircut: medium-light skin tone
1F487 1F3FD 200D 2642 FE0F ; fully-qualified # 💇🏽‍♂️ man getting haircut: medium skin tone
1F487 1F3FD 200D 2642 ; minimally-qualified # 💇🏽‍♂ man getting haircut: medium skin tone
1F487 1F3FE 200D 2642 FE0F ; fully-qualified # 💇🏾‍♂️ man getting haircut: medium-dark skin tone
1F487 1F3FE 200D 2642 ; minimally-qualified # 💇🏾‍♂ man getting haircut: medium-dark skin tone
1F487 1F3FF 200D 2642 FE0F ; fully-qualified # 💇🏿‍♂️ man getting haircut: dark skin tone
1F487 1F3FF 200D 2642 ; minimally-qualified # 💇🏿‍♂ man getting haircut: dark skin tone
1F487 200D 2640 FE0F ; fully-qualified # 💇‍♀️ woman getting haircut
1F487 200D 2640 ; minimally-qualified # 💇‍♀ woman getting haircut
1F487 1F3FB 200D 2640 FE0F ; fully-qualified # 💇🏻‍♀️ woman getting haircut: light skin tone
1F487 1F3FB 200D 2640 ; minimally-qualified # 💇🏻‍♀ woman getting haircut: light skin tone
1F487 1F3FC 200D 2640 FE0F ; fully-qualified # 💇🏼‍♀️ woman getting haircut: medium-light skin tone
1F487 1F3FC 200D 2640 ; minimally-qualified # 💇🏼‍♀ woman getting haircut: medium-light skin tone
1F487 1F3FD 200D 2640 FE0F ; fully-qualified # 💇🏽‍♀️ woman getting haircut: medium skin tone
1F487 1F3FD 200D 2640 ; minimally-qualified # 💇🏽‍♀ woman getting haircut: medium skin tone
1F487 1F3FE 200D 2640 FE0F ; fully-qualified # 💇🏾‍♀️ woman getting haircut: medium-dark skin tone
1F487 1F3FE 200D 2640 ; minimally-qualified # 💇🏾‍♀ woman getting haircut: medium-dark skin tone
1F487 1F3FF 200D 2640 FE0F ; fully-qualified # 💇🏿‍♀️ woman getting haircut: dark skin tone
1F487 1F3FF 200D 2640 ; minimally-qualified # 💇🏿‍♀ woman getting haircut: dark skin tone
1F6B6 ; fully-qualified # 🚶 person walking
1F6B6 1F3FB ; fully-qualified # 🚶🏻 person walking: light skin tone
1F6B6 1F3FC ; fully-qualified # 🚶🏼 person walking: medium-light skin tone
1F6B6 1F3FD ; fully-qualified # 🚶🏽 person walking: medium skin tone
1F6B6 1F3FE ; fully-qualified # 🚶🏾 person walking: medium-dark skin tone
1F6B6 1F3FF ; fully-qualified # 🚶🏿 person walking: dark skin tone
1F6B6 200D 2642 FE0F ; fully-qualified # 🚶‍♂️ man walking
1F6B6 200D 2642 ; minimally-qualified # 🚶‍♂ man walking
1F6B6 1F3FB 200D 2642 FE0F ; fully-qualified # 🚶🏻‍♂️ man walking: light skin tone
1F6B6 1F3FB 200D 2642 ; minimally-qualified # 🚶🏻‍♂ man walking: light skin tone
1F6B6 1F3FC 200D 2642 FE0F ; fully-qualified # 🚶🏼‍♂️ man walking: medium-light skin tone
1F6B6 1F3FC 200D 2642 ; minimally-qualified # 🚶🏼‍♂ man walking: medium-light skin tone
1F6B6 1F3FD 200D 2642 FE0F ; fully-qualified # 🚶🏽‍♂️ man walking: medium skin tone
1F6B6 1F3FD 200D 2642 ; minimally-qualified # 🚶🏽‍♂ man walking: medium skin tone
1F6B6 1F3FE 200D 2642 FE0F ; fully-qualified # 🚶🏾‍♂️ man walking: medium-dark skin tone
1F6B6 1F3FE 200D 2642 ; minimally-qualified # 🚶🏾‍♂ man walking: medium-dark skin tone
1F6B6 1F3FF 200D 2642 FE0F ; fully-qualified # 🚶🏿‍♂️ man walking: dark skin tone
1F6B6 1F3FF 200D 2642 ; minimally-qualified # 🚶🏿‍♂ man walking: dark skin tone
1F6B6 200D 2640 FE0F ; fully-qualified # 🚶‍♀️ woman walking
1F6B6 200D 2640 ; minimally-qualified # 🚶‍♀ woman walking
1F6B6 1F3FB 200D 2640 FE0F ; fully-qualified # 🚶🏻‍♀️ woman walking: light skin tone
1F6B6 1F3FB 200D 2640 ; minimally-qualified # 🚶🏻‍♀ woman walking: light skin tone
1F6B6 1F3FC 200D 2640 FE0F ; fully-qualified # 🚶🏼‍♀️ woman walking: medium-light skin tone
1F6B6 1F3FC 200D 2640 ; minimally-qualified # 🚶🏼‍♀ woman walking: medium-light skin tone
1F6B6 1F3FD 200D 2640 FE0F ; fully-qualified # 🚶🏽‍♀️ woman walking: medium skin tone
1F6B6 1F3FD 200D 2640 ; minimally-qualified # 🚶🏽‍♀ woman walking: medium skin tone
1F6B6 1F3FE 200D 2640 FE0F ; fully-qualified # 🚶🏾‍♀️ woman walking: medium-dark skin tone
1F6B6 1F3FE 200D 2640 ; minimally-qualified # 🚶🏾‍♀ woman walking: medium-dark skin tone
1F6B6 1F3FF 200D 2640 FE0F ; fully-qualified # 🚶🏿‍♀️ woman walking: dark skin tone
1F6B6 1F3FF 200D 2640 ; minimally-qualified # 🚶🏿‍♀ woman walking: dark skin tone
1F9CD ; fully-qualified # 🧍 person standing
1F9CD 1F3FB ; fully-qualified # 🧍🏻 person standing: light skin tone
1F9CD 1F3FC ; fully-qualified # 🧍🏼 person standing: medium-light skin tone
1F9CD 1F3FD ; fully-qualified # 🧍🏽 person standing: medium skin tone
1F9CD 1F3FE ; fully-qualified # 🧍🏾 person standing: medium-dark skin tone
1F9CD 1F3FF ; fully-qualified # 🧍🏿 person standing: dark skin tone
1F9CD 200D 2642 FE0F ; fully-qualified # 🧍‍♂️ man standing
1F9CD 200D 2642 ; minimally-qualified # 🧍‍♂ man standing
1F9CD 1F3FB 200D 2642 FE0F ; fully-qualified # 🧍🏻‍♂️ man standing: light skin tone
1F9CD 1F3FB 200D 2642 ; minimally-qualified # 🧍🏻‍♂ man standing: light skin tone
1F9CD 1F3FC 200D 2642 FE0F ; fully-qualified # 🧍🏼‍♂️ man standing: medium-light skin tone
1F9CD 1F3FC 200D 2642 ; minimally-qualified # 🧍🏼‍♂ man standing: medium-light skin tone
1F9CD 1F3FD 200D 2642 FE0F ; fully-qualified # 🧍🏽‍♂️ man standing: medium skin tone
1F9CD 1F3FD 200D 2642 ; minimally-qualified # 🧍🏽‍♂ man standing: medium skin tone
1F9CD 1F3FE 200D 2642 FE0F ; fully-qualified # 🧍🏾‍♂️ man standing: medium-dark skin tone
1F9CD 1F3FE 200D 2642 ; minimally-qualified # 🧍🏾‍♂ man standing: medium-dark skin tone
1F9CD 1F3FF 200D 2642 FE0F ; fully-qualified # 🧍🏿‍♂️ man standing: dark skin tone
1F9CD 1F3FF 200D 2642 ; minimally-qualified # 🧍🏿‍♂ man standing: dark skin tone
1F9CD 200D 2640 FE0F ; fully-qualified # 🧍‍♀️ woman standing
1F9CD 200D 2640 ; minimally-qualified # 🧍‍♀ woman standing
1F9CD 1F3FB 200D 2640 FE0F ; fully-qualified # 🧍🏻‍♀️ woman standing: light skin tone
1F9CD 1F3FB 200D 2640 ; minimally-qualified # 🧍🏻‍♀ woman standing: light skin tone
1F9CD 1F3FC 200D 2640 FE0F ; fully-qualified # 🧍🏼‍♀️ woman standing: medium-light skin tone
1F9CD 1F3FC 200D 2640 ; minimally-qualified # 🧍🏼‍♀ woman standing: medium-light skin tone
1F9CD 1F3FD 200D 2640 FE0F ; fully-qualified # 🧍🏽‍♀️ woman standing: medium skin tone
1F9CD 1F3FD 200D 2640 ; minimally-qualified # 🧍🏽‍♀ woman standing: medium skin tone
1F9CD 1F3FE 200D 2640 FE0F ; fully-qualified # 🧍🏾‍♀️ woman standing: medium-dark skin tone
1F9CD 1F3FE 200D 2640 ; minimally-qualified # 🧍🏾‍♀ woman standing: medium-dark skin tone
1F9CD 1F3FF 200D 2640 FE0F ; fully-qualified # 🧍🏿‍♀️ woman standing: dark skin tone
1F9CD 1F3FF 200D 2640 ; minimally-qualified # 🧍🏿‍♀ woman standing: dark skin tone
1F9CE ; fully-qualified # 🧎 person kneeling
1F9CE 1F3FB ; fully-qualified # 🧎🏻 person kneeling: light skin tone
1F9CE 1F3FC ; fully-qualified # 🧎🏼 person kneeling: medium-light skin tone
1F9CE 1F3FD ; fully-qualified # 🧎🏽 person kneeling: medium skin tone
1F9CE 1F3FE ; fully-qualified # 🧎🏾 person kneeling: medium-dark skin tone
1F9CE 1F3FF ; fully-qualified # 🧎🏿 person kneeling: dark skin tone
1F9CE 200D 2642 FE0F ; fully-qualified # 🧎‍♂️ man kneeling
1F9CE 200D 2642 ; minimally-qualified # 🧎‍♂ man kneeling
1F9CE 1F3FB 200D 2642 FE0F ; fully-qualified # 🧎🏻‍♂️ man kneeling: light skin tone
1F9CE 1F3FB 200D 2642 ; minimally-qualified # 🧎🏻‍♂ man kneeling: light skin tone
1F9CE 1F3FC 200D 2642 FE0F ; fully-qualified # 🧎🏼‍♂️ man kneeling: medium-light skin tone
1F9CE 1F3FC 200D 2642 ; minimally-qualified # 🧎🏼‍♂ man kneeling: medium-light skin tone
1F9CE 1F3FD 200D 2642 FE0F ; fully-qualified # 🧎🏽‍♂️ man kneeling: medium skin tone
1F9CE 1F3FD 200D 2642 ; minimally-qualified # 🧎🏽‍♂ man kneeling: medium skin tone
1F9CE 1F3FE 200D 2642 FE0F ; fully-qualified # 🧎🏾‍♂️ man kneeling: medium-dark skin tone
1F9CE 1F3FE 200D 2642 ; minimally-qualified # 🧎🏾‍♂ man kneeling: medium-dark skin tone
1F9CE 1F3FF 200D 2642 FE0F ; fully-qualified # 🧎🏿‍♂️ man kneeling: dark skin tone
1F9CE 1F3FF 200D 2642 ; minimally-qualified # 🧎🏿‍♂ man kneeling: dark skin tone
1F9CE 200D 2640 FE0F ; fully-qualified # 🧎‍♀️ woman kneeling
1F9CE 200D 2640 ; minimally-qualified # 🧎‍♀ woman kneeling
1F9CE 1F3FB 200D 2640 FE0F ; fully-qualified # 🧎🏻‍♀️ woman kneeling: light skin tone
1F9CE 1F3FB 200D 2640 ; minimally-qualified # 🧎🏻‍♀ woman kneeling: light skin tone
1F9CE 1F3FC 200D 2640 FE0F ; fully-qualified # 🧎🏼‍♀️ woman kneeling: medium-light skin tone
1F9CE 1F3FC 200D 2640 ; minimally-qualified # 🧎🏼‍♀ woman kneeling: medium-light skin tone
1F9CE 1F3FD 200D 2640 FE0F ; fully-qualified # 🧎🏽‍♀️ woman kneeling: medium skin tone
1F9CE 1F3FD 200D 2640 ; minimally-qualified # 🧎🏽‍♀ woman kneeling: medium skin tone
1F9CE 1F3FE 200D 2640 FE0F ; fully-qualified # 🧎🏾‍♀️ woman kneeling: medium-dark skin tone
1F9CE 1F3FE 200D 2640 ; minimally-qualified # 🧎🏾‍♀ woman kneeling: medium-dark skin tone
1F9CE 1F3FF 200D 2640 FE0F ; fully-qualified # 🧎🏿‍♀️ woman kneeling: dark skin tone
1F9CE 1F3FF 200D 2640 ; minimally-qualified # 🧎🏿‍♀ woman kneeling: dark skin tone
1F468 200D 1F9AF ; fully-qualified # 👨‍🦯 man with probing cane
1F468 1F3FB 200D 1F9AF ; fully-qualified # 👨🏻‍🦯 man with probing cane: light skin tone
1F468 1F3FC 200D 1F9AF ; fully-qualified # 👨🏼‍🦯 man with probing cane: medium-light skin tone
1F468 1F3FD 200D 1F9AF ; fully-qualified # 👨🏽‍🦯 man with probing cane: medium skin tone
1F468 1F3FE 200D 1F9AF ; fully-qualified # 👨🏾‍🦯 man with probing cane: medium-dark skin tone
1F468 1F3FF 200D 1F9AF ; fully-qualified # 👨🏿‍🦯 man with probing cane: dark skin tone
1F469 200D 1F9AF ; fully-qualified # 👩‍🦯 woman with probing cane
1F469 1F3FB 200D 1F9AF ; fully-qualified # 👩🏻‍🦯 woman with probing cane: light skin tone
1F469 1F3FC 200D 1F9AF ; fully-qualified # 👩🏼‍🦯 woman with probing cane: medium-light skin tone
1F469 1F3FD 200D 1F9AF ; fully-qualified # 👩🏽‍🦯 woman with probing cane: medium skin tone
1F469 1F3FE 200D 1F9AF ; fully-qualified # 👩🏾‍🦯 woman with probing cane: medium-dark skin tone
1F469 1F3FF 200D 1F9AF ; fully-qualified # 👩🏿‍🦯 woman with probing cane: dark skin tone
1F468 200D 1F9BC ; fully-qualified # 👨‍🦼 man in motorized wheelchair
1F468 1F3FB 200D 1F9BC ; fully-qualified # 👨🏻‍🦼 man in motorized wheelchair: light skin tone
1F468 1F3FC 200D 1F9BC ; fully-qualified # 👨🏼‍🦼 man in motorized wheelchair: medium-light skin tone
1F468 1F3FD 200D 1F9BC ; fully-qualified # 👨🏽‍🦼 man in motorized wheelchair: medium skin tone
1F468 1F3FE 200D 1F9BC ; fully-qualified # 👨🏾‍🦼 man in motorized wheelchair: medium-dark skin tone
1F468 1F3FF 200D 1F9BC ; fully-qualified # 👨🏿‍🦼 man in motorized wheelchair: dark skin tone
1F469 200D 1F9BC ; fully-qualified # 👩‍🦼 woman in motorized wheelchair
1F469 1F3FB 200D 1F9BC ; fully-qualified # 👩🏻‍🦼 woman in motorized wheelchair: light skin tone
1F469 1F3FC 200D 1F9BC ; fully-qualified # 👩🏼‍🦼 woman in motorized wheelchair: medium-light skin tone
1F469 1F3FD 200D 1F9BC ; fully-qualified # 👩🏽‍🦼 woman in motorized wheelchair: medium skin tone
1F469 1F3FE 200D 1F9BC ; fully-qualified # 👩🏾‍🦼 woman in motorized wheelchair: medium-dark skin tone
1F469 1F3FF 200D 1F9BC ; fully-qualified # 👩🏿‍🦼 woman in motorized wheelchair: dark skin tone
1F468 200D 1F9BD ; fully-qualified # 👨‍🦽 man in manual wheelchair
1F468 1F3FB 200D 1F9BD ; fully-qualified # 👨🏻‍🦽 man in manual wheelchair: light skin tone
1F468 1F3FC 200D 1F9BD ; fully-qualified # 👨🏼‍🦽 man in manual wheelchair: medium-light skin tone
1F468 1F3FD 200D 1F9BD ; fully-qualified # 👨🏽‍🦽 man in manual wheelchair: medium skin tone
1F468 1F3FE 200D 1F9BD ; fully-qualified # 👨🏾‍🦽 man in manual wheelchair: medium-dark skin tone
1F468 1F3FF 200D 1F9BD ; fully-qualified # 👨🏿‍🦽 man in manual wheelchair: dark skin tone
1F469 200D 1F9BD ; fully-qualified # 👩‍🦽 woman in manual wheelchair
1F469 1F3FB 200D 1F9BD ; fully-qualified # 👩🏻‍🦽 woman in manual wheelchair: light skin tone
1F469 1F3FC 200D 1F9BD ; fully-qualified # 👩🏼‍🦽 woman in manual wheelchair: medium-light skin tone
1F469 1F3FD 200D 1F9BD ; fully-qualified # 👩🏽‍🦽 woman in manual wheelchair: medium skin tone
1F469 1F3FE 200D 1F9BD ; fully-qualified # 👩🏾‍🦽 woman in manual wheelchair: medium-dark skin tone
1F469 1F3FF 200D 1F9BD ; fully-qualified # 👩🏿‍🦽 woman in manual wheelchair: dark skin tone
1F3C3 ; fully-qualified # 🏃 person running
1F3C3 1F3FB ; fully-qualified # 🏃🏻 person running: light skin tone
1F3C3 1F3FC ; fully-qualified # 🏃🏼 person running: medium-light skin tone
1F3C3 1F3FD ; fully-qualified # 🏃🏽 person running: medium skin tone
1F3C3 1F3FE ; fully-qualified # 🏃🏾 person running: medium-dark skin tone
1F3C3 1F3FF ; fully-qualified # 🏃🏿 person running: dark skin tone
1F3C3 200D 2642 FE0F ; fully-qualified # 🏃‍♂️ man running
1F3C3 200D 2642 ; minimally-qualified # 🏃‍♂ man running
1F3C3 1F3FB 200D 2642 FE0F ; fully-qualified # 🏃🏻‍♂️ man running: light skin tone
1F3C3 1F3FB 200D 2642 ; minimally-qualified # 🏃🏻‍♂ man running: light skin tone
1F3C3 1F3FC 200D 2642 FE0F ; fully-qualified # 🏃🏼‍♂️ man running: medium-light skin tone
1F3C3 1F3FC 200D 2642 ; minimally-qualified # 🏃🏼‍♂ man running: medium-light skin tone
1F3C3 1F3FD 200D 2642 FE0F ; fully-qualified # 🏃🏽‍♂️ man running: medium skin tone
1F3C3 1F3FD 200D 2642 ; minimally-qualified # 🏃🏽‍♂ man running: medium skin tone
1F3C3 1F3FE 200D 2642 FE0F ; fully-qualified # 🏃🏾‍♂️ man running: medium-dark skin tone
1F3C3 1F3FE 200D 2642 ; minimally-qualified # 🏃🏾‍♂ man running: medium-dark skin tone
1F3C3 1F3FF 200D 2642 FE0F ; fully-qualified # 🏃🏿‍♂️ man running: dark skin tone
1F3C3 1F3FF 200D 2642 ; minimally-qualified # 🏃🏿‍♂ man running: dark skin tone
1F3C3 200D 2640 FE0F ; fully-qualified # 🏃‍♀️ woman running
1F3C3 200D 2640 ; minimally-qualified # 🏃‍♀ woman running
1F3C3 1F3FB 200D 2640 FE0F ; fully-qualified # 🏃🏻‍♀️ woman running: light skin tone
1F3C3 1F3FB 200D 2640 ; minimally-qualified # 🏃🏻‍♀ woman running: light skin tone
1F3C3 1F3FC 200D 2640 FE0F ; fully-qualified # 🏃🏼‍♀️ woman running: medium-light skin tone
1F3C3 1F3FC 200D 2640 ; minimally-qualified # 🏃🏼‍♀ woman running: medium-light skin tone
1F3C3 1F3FD 200D 2640 FE0F ; fully-qualified # 🏃🏽‍♀️ woman running: medium skin tone
1F3C3 1F3FD 200D 2640 ; minimally-qualified # 🏃🏽‍♀ woman running: medium skin tone
1F3C3 1F3FE 200D 2640 FE0F ; fully-qualified # 🏃🏾‍♀️ woman running: medium-dark skin tone
1F3C3 1F3FE 200D 2640 ; minimally-qualified # 🏃🏾‍♀ woman running: medium-dark skin tone
1F3C3 1F3FF 200D 2640 FE0F ; fully-qualified # 🏃🏿‍♀️ woman running: dark skin tone
1F3C3 1F3FF 200D 2640 ; minimally-qualified # 🏃🏿‍♀ woman running: dark skin tone
1F483 ; fully-qualified # 💃 woman dancing
1F483 1F3FB ; fully-qualified # 💃🏻 woman dancing: light skin tone
1F483 1F3FC ; fully-qualified # 💃🏼 woman dancing: medium-light skin tone
1F483 1F3FD ; fully-qualified # 💃🏽 woman dancing: medium skin tone
1F483 1F3FE ; fully-qualified # 💃🏾 woman dancing: medium-dark skin tone
1F483 1F3FF ; fully-qualified # 💃🏿 woman dancing: dark skin tone
1F57A ; fully-qualified # 🕺 man dancing
1F57A 1F3FB ; fully-qualified # 🕺🏻 man dancing: light skin tone
1F57A 1F3FC ; fully-qualified # 🕺🏼 man dancing: medium-light skin tone
1F57A 1F3FD ; fully-qualified # 🕺🏽 man dancing: medium skin tone
1F57A 1F3FE ; fully-qualified # 🕺🏾 man dancing: medium-dark skin tone
1F57A 1F3FF ; fully-qualified # 🕺🏿 man dancing: dark skin tone
1F574 FE0F ; fully-qualified # 🕴️ man in suit levitating
1F574 ; unqualified # 🕴 man in suit levitating
1F574 1F3FB ; fully-qualified # 🕴🏻 man in suit levitating: light skin tone
1F574 1F3FC ; fully-qualified # 🕴🏼 man in suit levitating: medium-light skin tone
1F574 1F3FD ; fully-qualified # 🕴🏽 man in suit levitating: medium skin tone
1F574 1F3FE ; fully-qualified # 🕴🏾 man in suit levitating: medium-dark skin tone
1F574 1F3FF ; fully-qualified # 🕴🏿 man in suit levitating: dark skin tone
1F46F ; fully-qualified # 👯 people with bunny ears
1F46F 200D 2642 FE0F ; fully-qualified # 👯‍♂️ men with bunny ears
1F46F 200D 2642 ; minimally-qualified # 👯‍♂ men with bunny ears
1F46F 200D 2640 FE0F ; fully-qualified # 👯‍♀️ women with bunny ears
1F46F 200D 2640 ; minimally-qualified # 👯‍♀ women with bunny ears
1F9D6 ; fully-qualified # 🧖 person in steamy room
1F9D6 1F3FB ; fully-qualified # 🧖🏻 person in steamy room: light skin tone
1F9D6 1F3FC ; fully-qualified # 🧖🏼 person in steamy room: medium-light skin tone
1F9D6 1F3FD ; fully-qualified # 🧖🏽 person in steamy room: medium skin tone
1F9D6 1F3FE ; fully-qualified # 🧖🏾 person in steamy room: medium-dark skin tone
1F9D6 1F3FF ; fully-qualified # 🧖🏿 person in steamy room: dark skin tone
1F9D6 200D 2642 FE0F ; fully-qualified # 🧖‍♂️ man in steamy room
1F9D6 200D 2642 ; minimally-qualified # 🧖‍♂ man in steamy room
1F9D6 1F3FB 200D 2642 FE0F ; fully-qualified # 🧖🏻‍♂️ man in steamy room: light skin tone
1F9D6 1F3FB 200D 2642 ; minimally-qualified # 🧖🏻‍♂ man in steamy room: light skin tone
1F9D6 1F3FC 200D 2642 FE0F ; fully-qualified # 🧖🏼‍♂️ man in steamy room: medium-light skin tone
1F9D6 1F3FC 200D 2642 ; minimally-qualified # 🧖🏼‍♂ man in steamy room: medium-light skin tone
1F9D6 1F3FD 200D 2642 FE0F ; fully-qualified # 🧖🏽‍♂️ man in steamy room: medium skin tone
1F9D6 1F3FD 200D 2642 ; minimally-qualified # 🧖🏽‍♂ man in steamy room: medium skin tone
1F9D6 1F3FE 200D 2642 FE0F ; fully-qualified # 🧖🏾‍♂️ man in steamy room: medium-dark skin tone
1F9D6 1F3FE 200D 2642 ; minimally-qualified # 🧖🏾‍♂ man in steamy room: medium-dark skin tone
1F9D6 1F3FF 200D 2642 FE0F ; fully-qualified # 🧖🏿‍♂️ man in steamy room: dark skin tone
1F9D6 1F3FF 200D 2642 ; minimally-qualified # 🧖🏿‍♂ man in steamy room: dark skin tone
1F9D6 200D 2640 FE0F ; fully-qualified # 🧖‍♀️ woman in steamy room
1F9D6 200D 2640 ; minimally-qualified # 🧖‍♀ woman in steamy room
1F9D6 1F3FB 200D 2640 FE0F ; fully-qualified # 🧖🏻‍♀️ woman in steamy room: light skin tone
1F9D6 1F3FB 200D 2640 ; minimally-qualified # 🧖🏻‍♀ woman in steamy room: light skin tone
1F9D6 1F3FC 200D 2640 FE0F ; fully-qualified # 🧖🏼‍♀️ woman in steamy room: medium-light skin tone
1F9D6 1F3FC 200D 2640 ; minimally-qualified # 🧖🏼‍♀ woman in steamy room: medium-light skin tone
1F9D6 1F3FD 200D 2640 FE0F ; fully-qualified # 🧖🏽‍♀️ woman in steamy room: medium skin tone
1F9D6 1F3FD 200D 2640 ; minimally-qualified # 🧖🏽‍♀ woman in steamy room: medium skin tone
1F9D6 1F3FE 200D 2640 FE0F ; fully-qualified # 🧖🏾‍♀️ woman in steamy room: medium-dark skin tone
1F9D6 1F3FE 200D 2640 ; minimally-qualified # 🧖🏾‍♀ woman in steamy room: medium-dark skin tone
1F9D6 1F3FF 200D 2640 FE0F ; fully-qualified # 🧖🏿‍♀️ woman in steamy room: dark skin tone
1F9D6 1F3FF 200D 2640 ; minimally-qualified # 🧖🏿‍♀ woman in steamy room: dark skin tone
1F9D7 ; fully-qualified # 🧗 person climbing
1F9D7 1F3FB ; fully-qualified # 🧗🏻 person climbing: light skin tone
1F9D7 1F3FC ; fully-qualified # 🧗🏼 person climbing: medium-light skin tone
1F9D7 1F3FD ; fully-qualified # 🧗🏽 person climbing: medium skin tone
1F9D7 1F3FE ; fully-qualified # 🧗🏾 person climbing: medium-dark skin tone
1F9D7 1F3FF ; fully-qualified # 🧗🏿 person climbing: dark skin tone
1F9D7 200D 2642 FE0F ; fully-qualified # 🧗‍♂️ man climbing
1F9D7 200D 2642 ; minimally-qualified # 🧗‍♂ man climbing
1F9D7 1F3FB 200D 2642 FE0F ; fully-qualified # 🧗🏻‍♂️ man climbing: light skin tone
1F9D7 1F3FB 200D 2642 ; minimally-qualified # 🧗🏻‍♂ man climbing: light skin tone
1F9D7 1F3FC 200D 2642 FE0F ; fully-qualified # 🧗🏼‍♂️ man climbing: medium-light skin tone
1F9D7 1F3FC 200D 2642 ; minimally-qualified # 🧗🏼‍♂ man climbing: medium-light skin tone
1F9D7 1F3FD 200D 2642 FE0F ; fully-qualified # 🧗🏽‍♂️ man climbing: medium skin tone
1F9D7 1F3FD 200D 2642 ; minimally-qualified # 🧗🏽‍♂ man climbing: medium skin tone
1F9D7 1F3FE 200D 2642 FE0F ; fully-qualified # 🧗🏾‍♂️ man climbing: medium-dark skin tone
1F9D7 1F3FE 200D 2642 ; minimally-qualified # 🧗🏾‍♂ man climbing: medium-dark skin tone
1F9D7 1F3FF 200D 2642 FE0F ; fully-qualified # 🧗🏿‍♂️ man climbing: dark skin tone
1F9D7 1F3FF 200D 2642 ; minimally-qualified # 🧗🏿‍♂ man climbing: dark skin tone
1F9D7 200D 2640 FE0F ; fully-qualified # 🧗‍♀️ woman climbing
1F9D7 200D 2640 ; minimally-qualified # 🧗‍♀ woman climbing
1F9D7 1F3FB 200D 2640 FE0F ; fully-qualified # 🧗🏻‍♀️ woman climbing: light skin tone
1F9D7 1F3FB 200D 2640 ; minimally-qualified # 🧗🏻‍♀ woman climbing: light skin tone
1F9D7 1F3FC 200D 2640 FE0F ; fully-qualified # 🧗🏼‍♀️ woman climbing: medium-light skin tone
1F9D7 1F3FC 200D 2640 ; minimally-qualified # 🧗🏼‍♀ woman climbing: medium-light skin tone
1F9D7 1F3FD 200D 2640 FE0F ; fully-qualified # 🧗🏽‍♀️ woman climbing: medium skin tone
1F9D7 1F3FD 200D 2640 ; minimally-qualified # 🧗🏽‍♀ woman climbing: medium skin tone
1F9D7 1F3FE 200D 2640 FE0F ; fully-qualified # 🧗🏾‍♀️ woman climbing: medium-dark skin tone
1F9D7 1F3FE 200D 2640 ; minimally-qualified # 🧗🏾‍♀ woman climbing: medium-dark skin tone
1F9D7 1F3FF 200D 2640 FE0F ; fully-qualified # 🧗🏿‍♀️ woman climbing: dark skin tone
1F9D7 1F3FF 200D 2640 ; minimally-qualified # 🧗🏿‍♀ woman climbing: dark skin tone
# subgroup: person-sport
1F93A ; fully-qualified # 🤺 person fencing
1F3C7 ; fully-qualified # 🏇 horse racing
1F3C7 1F3FB ; fully-qualified # 🏇🏻 horse racing: light skin tone
1F3C7 1F3FC ; fully-qualified # 🏇🏼 horse racing: medium-light skin tone
1F3C7 1F3FD ; fully-qualified # 🏇🏽 horse racing: medium skin tone
1F3C7 1F3FE ; fully-qualified # 🏇🏾 horse racing: medium-dark skin tone
1F3C7 1F3FF ; fully-qualified # 🏇🏿 horse racing: dark skin tone
26F7 FE0F ; fully-qualified # ⛷️ skier
26F7 ; unqualified # ⛷ skier
1F3C2 ; fully-qualified # 🏂 snowboarder
1F3C2 1F3FB ; fully-qualified # 🏂🏻 snowboarder: light skin tone
1F3C2 1F3FC ; fully-qualified # 🏂🏼 snowboarder: medium-light skin tone
1F3C2 1F3FD ; fully-qualified # 🏂🏽 snowboarder: medium skin tone
1F3C2 1F3FE ; fully-qualified # 🏂🏾 snowboarder: medium-dark skin tone
1F3C2 1F3FF ; fully-qualified # 🏂🏿 snowboarder: dark skin tone
1F3CC FE0F ; fully-qualified # 🏌️ person golfing
1F3CC ; unqualified # 🏌 person golfing
1F3CC 1F3FB ; fully-qualified # 🏌🏻 person golfing: light skin tone
1F3CC 1F3FC ; fully-qualified # 🏌🏼 person golfing: medium-light skin tone
1F3CC 1F3FD ; fully-qualified # 🏌🏽 person golfing: medium skin tone
1F3CC 1F3FE ; fully-qualified # 🏌🏾 person golfing: medium-dark skin tone
1F3CC 1F3FF ; fully-qualified # 🏌🏿 person golfing: dark skin tone
1F3CC FE0F 200D 2642 FE0F ; fully-qualified # 🏌️‍♂️ man golfing
1F3CC 200D 2642 FE0F ; unqualified # 🏌‍♂️ man golfing
1F3CC FE0F 200D 2642 ; unqualified # 🏌️‍♂ man golfing
1F3CC 200D 2642 ; unqualified # 🏌‍♂ man golfing
1F3CC 1F3FB 200D 2642 FE0F ; fully-qualified # 🏌🏻‍♂️ man golfing: light skin tone
1F3CC 1F3FB 200D 2642 ; minimally-qualified # 🏌🏻‍♂ man golfing: light skin tone
1F3CC 1F3FC 200D 2642 FE0F ; fully-qualified # 🏌🏼‍♂️ man golfing: medium-light skin tone
1F3CC 1F3FC 200D 2642 ; minimally-qualified # 🏌🏼‍♂ man golfing: medium-light skin tone
1F3CC 1F3FD 200D 2642 FE0F ; fully-qualified # 🏌🏽‍♂️ man golfing: medium skin tone
1F3CC 1F3FD 200D 2642 ; minimally-qualified # 🏌🏽‍♂ man golfing: medium skin tone
1F3CC 1F3FE 200D 2642 FE0F ; fully-qualified # 🏌🏾‍♂️ man golfing: medium-dark skin tone
1F3CC 1F3FE 200D 2642 ; minimally-qualified # 🏌🏾‍♂ man golfing: medium-dark skin tone
1F3CC 1F3FF 200D 2642 FE0F ; fully-qualified # 🏌🏿‍♂️ man golfing: dark skin tone
1F3CC 1F3FF 200D 2642 ; minimally-qualified # 🏌🏿‍♂ man golfing: dark skin tone
1F3CC FE0F 200D 2640 FE0F ; fully-qualified # 🏌️‍♀️ woman golfing
1F3CC 200D 2640 FE0F ; unqualified # 🏌‍♀️ woman golfing
1F3CC FE0F 200D 2640 ; unqualified # 🏌️‍♀ woman golfing
1F3CC 200D 2640 ; unqualified # 🏌‍♀ woman golfing
1F3CC 1F3FB 200D 2640 FE0F ; fully-qualified # 🏌🏻‍♀️ woman golfing: light skin tone
1F3CC 1F3FB 200D 2640 ; minimally-qualified # 🏌🏻‍♀ woman golfing: light skin tone
1F3CC 1F3FC 200D 2640 FE0F ; fully-qualified # 🏌🏼‍♀️ woman golfing: medium-light skin tone
1F3CC 1F3FC 200D 2640 ; minimally-qualified # 🏌🏼‍♀ woman golfing: medium-light skin tone
1F3CC 1F3FD 200D 2640 FE0F ; fully-qualified # 🏌🏽‍♀️ woman golfing: medium skin tone
1F3CC 1F3FD 200D 2640 ; minimally-qualified # 🏌🏽‍♀ woman golfing: medium skin tone
1F3CC 1F3FE 200D 2640 FE0F ; fully-qualified # 🏌🏾‍♀️ woman golfing: medium-dark skin tone
1F3CC 1F3FE 200D 2640 ; minimally-qualified # 🏌🏾‍♀ woman golfing: medium-dark skin tone
1F3CC 1F3FF 200D 2640 FE0F ; fully-qualified # 🏌🏿‍♀️ woman golfing: dark skin tone
1F3CC 1F3FF 200D 2640 ; minimally-qualified # 🏌🏿‍♀ woman golfing: dark skin tone
1F3C4 ; fully-qualified # 🏄 person surfing
1F3C4 1F3FB ; fully-qualified # 🏄🏻 person surfing: light skin tone
1F3C4 1F3FC ; fully-qualified # 🏄🏼 person surfing: medium-light skin tone
1F3C4 1F3FD ; fully-qualified # 🏄🏽 person surfing: medium skin tone
1F3C4 1F3FE ; fully-qualified # 🏄🏾 person surfing: medium-dark skin tone
1F3C4 1F3FF ; fully-qualified # 🏄🏿 person surfing: dark skin tone
1F3C4 200D 2642 FE0F ; fully-qualified # 🏄‍♂️ man surfing
1F3C4 200D 2642 ; minimally-qualified # 🏄‍♂ man surfing
1F3C4 1F3FB 200D 2642 FE0F ; fully-qualified # 🏄🏻‍♂️ man surfing: light skin tone
1F3C4 1F3FB 200D 2642 ; minimally-qualified # 🏄🏻‍♂ man surfing: light skin tone
1F3C4 1F3FC 200D 2642 FE0F ; fully-qualified # 🏄🏼‍♂️ man surfing: medium-light skin tone
1F3C4 1F3FC 200D 2642 ; minimally-qualified # 🏄🏼‍♂ man surfing: medium-light skin tone
1F3C4 1F3FD 200D 2642 FE0F ; fully-qualified # 🏄🏽‍♂️ man surfing: medium skin tone
1F3C4 1F3FD 200D 2642 ; minimally-qualified # 🏄🏽‍♂ man surfing: medium skin tone
1F3C4 1F3FE 200D 2642 FE0F ; fully-qualified # 🏄🏾‍♂️ man surfing: medium-dark skin tone
1F3C4 1F3FE 200D 2642 ; minimally-qualified # 🏄🏾‍♂ man surfing: medium-dark skin tone
1F3C4 1F3FF 200D 2642 FE0F ; fully-qualified # 🏄🏿‍♂️ man surfing: dark skin tone
1F3C4 1F3FF 200D 2642 ; minimally-qualified # 🏄🏿‍♂ man surfing: dark skin tone
1F3C4 200D 2640 FE0F ; fully-qualified # 🏄‍♀️ woman surfing
1F3C4 200D 2640 ; minimally-qualified # 🏄‍♀ woman surfing
1F3C4 1F3FB 200D 2640 FE0F ; fully-qualified # 🏄🏻‍♀️ woman surfing: light skin tone
1F3C4 1F3FB 200D 2640 ; minimally-qualified # 🏄🏻‍♀ woman surfing: light skin tone
1F3C4 1F3FC 200D 2640 FE0F ; fully-qualified # 🏄🏼‍♀️ woman surfing: medium-light skin tone
1F3C4 1F3FC 200D 2640 ; minimally-qualified # 🏄🏼‍♀ woman surfing: medium-light skin tone
1F3C4 1F3FD 200D 2640 FE0F ; fully-qualified # 🏄🏽‍♀️ woman surfing: medium skin tone
1F3C4 1F3FD 200D 2640 ; minimally-qualified # 🏄🏽‍♀ woman surfing: medium skin tone
1F3C4 1F3FE 200D 2640 FE0F ; fully-qualified # 🏄🏾‍♀️ woman surfing: medium-dark skin tone
1F3C4 1F3FE 200D 2640 ; minimally-qualified # 🏄🏾‍♀ woman surfing: medium-dark skin tone
1F3C4 1F3FF 200D 2640 FE0F ; fully-qualified # 🏄🏿‍♀️ woman surfing: dark skin tone
1F3C4 1F3FF 200D 2640 ; minimally-qualified # 🏄🏿‍♀ woman surfing: dark skin tone
1F6A3 ; fully-qualified # 🚣 person rowing boat
1F6A3 1F3FB ; fully-qualified # 🚣🏻 person rowing boat: light skin tone
1F6A3 1F3FC ; fully-qualified # 🚣🏼 person rowing boat: medium-light skin tone
1F6A3 1F3FD ; fully-qualified # 🚣🏽 person rowing boat: medium skin tone
1F6A3 1F3FE ; fully-qualified # 🚣🏾 person rowing boat: medium-dark skin tone
1F6A3 1F3FF ; fully-qualified # 🚣🏿 person rowing boat: dark skin tone
1F6A3 200D 2642 FE0F ; fully-qualified # 🚣‍♂️ man rowing boat
1F6A3 200D 2642 ; minimally-qualified # 🚣‍♂ man rowing boat
1F6A3 1F3FB 200D 2642 FE0F ; fully-qualified # 🚣🏻‍♂️ man rowing boat: light skin tone
1F6A3 1F3FB 200D 2642 ; minimally-qualified # 🚣🏻‍♂ man rowing boat: light skin tone
1F6A3 1F3FC 200D 2642 FE0F ; fully-qualified # 🚣🏼‍♂️ man rowing boat: medium-light skin tone
1F6A3 1F3FC 200D 2642 ; minimally-qualified # 🚣🏼‍♂ man rowing boat: medium-light skin tone
1F6A3 1F3FD 200D 2642 FE0F ; fully-qualified # 🚣🏽‍♂️ man rowing boat: medium skin tone
1F6A3 1F3FD 200D 2642 ; minimally-qualified # 🚣🏽‍♂ man rowing boat: medium skin tone
1F6A3 1F3FE 200D 2642 FE0F ; fully-qualified # 🚣🏾‍♂️ man rowing boat: medium-dark skin tone
1F6A3 1F3FE 200D 2642 ; minimally-qualified # 🚣🏾‍♂ man rowing boat: medium-dark skin tone
1F6A3 1F3FF 200D 2642 FE0F ; fully-qualified # 🚣🏿‍♂️ man rowing boat: dark skin tone
1F6A3 1F3FF 200D 2642 ; minimally-qualified # 🚣🏿‍♂ man rowing boat: dark skin tone
1F6A3 200D 2640 FE0F ; fully-qualified # 🚣‍♀️ woman rowing boat
1F6A3 200D 2640 ; minimally-qualified # 🚣‍♀ woman rowing boat
1F6A3 1F3FB 200D 2640 FE0F ; fully-qualified # 🚣🏻‍♀️ woman rowing boat: light skin tone
1F6A3 1F3FB 200D 2640 ; minimally-qualified # 🚣🏻‍♀ woman rowing boat: light skin tone
1F6A3 1F3FC 200D 2640 FE0F ; fully-qualified # 🚣🏼‍♀️ woman rowing boat: medium-light skin tone
1F6A3 1F3FC 200D 2640 ; minimally-qualified # 🚣🏼‍♀ woman rowing boat: medium-light skin tone
1F6A3 1F3FD 200D 2640 FE0F ; fully-qualified # 🚣🏽‍♀️ woman rowing boat: medium skin tone
1F6A3 1F3FD 200D 2640 ; minimally-qualified # 🚣🏽‍♀ woman rowing boat: medium skin tone
1F6A3 1F3FE 200D 2640 FE0F ; fully-qualified # 🚣🏾‍♀️ woman rowing boat: medium-dark skin tone
1F6A3 1F3FE 200D 2640 ; minimally-qualified # 🚣🏾‍♀ woman rowing boat: medium-dark skin tone
1F6A3 1F3FF 200D 2640 FE0F ; fully-qualified # 🚣🏿‍♀️ woman rowing boat: dark skin tone
1F6A3 1F3FF 200D 2640 ; minimally-qualified # 🚣🏿‍♀ woman rowing boat: dark skin tone
1F3CA ; fully-qualified # 🏊 person swimming
1F3CA 1F3FB ; fully-qualified # 🏊🏻 person swimming: light skin tone
1F3CA 1F3FC ; fully-qualified # 🏊🏼 person swimming: medium-light skin tone
1F3CA 1F3FD ; fully-qualified # 🏊🏽 person swimming: medium skin tone
1F3CA 1F3FE ; fully-qualified # 🏊🏾 person swimming: medium-dark skin tone
1F3CA 1F3FF ; fully-qualified # 🏊🏿 person swimming: dark skin tone
1F3CA 200D 2642 FE0F ; fully-qualified # 🏊‍♂️ man swimming
1F3CA 200D 2642 ; minimally-qualified # 🏊‍♂ man swimming
1F3CA 1F3FB 200D 2642 FE0F ; fully-qualified # 🏊🏻‍♂️ man swimming: light skin tone
1F3CA 1F3FB 200D 2642 ; minimally-qualified # 🏊🏻‍♂ man swimming: light skin tone
1F3CA 1F3FC 200D 2642 FE0F ; fully-qualified # 🏊🏼‍♂️ man swimming: medium-light skin tone
1F3CA 1F3FC 200D 2642 ; minimally-qualified # 🏊🏼‍♂ man swimming: medium-light skin tone
1F3CA 1F3FD 200D 2642 FE0F ; fully-qualified # 🏊🏽‍♂️ man swimming: medium skin tone
1F3CA 1F3FD 200D 2642 ; minimally-qualified # 🏊🏽‍♂ man swimming: medium skin tone
1F3CA 1F3FE 200D 2642 FE0F ; fully-qualified # 🏊🏾‍♂️ man swimming: medium-dark skin tone
1F3CA 1F3FE 200D 2642 ; minimally-qualified # 🏊🏾‍♂ man swimming: medium-dark skin tone
1F3CA 1F3FF 200D 2642 FE0F ; fully-qualified # 🏊🏿‍♂️ man swimming: dark skin tone
1F3CA 1F3FF 200D 2642 ; minimally-qualified # 🏊🏿‍♂ man swimming: dark skin tone
1F3CA 200D 2640 FE0F ; fully-qualified # 🏊‍♀️ woman swimming
1F3CA 200D 2640 ; minimally-qualified # 🏊‍♀ woman swimming
1F3CA 1F3FB 200D 2640 FE0F ; fully-qualified # 🏊🏻‍♀️ woman swimming: light skin tone
1F3CA 1F3FB 200D 2640 ; minimally-qualified # 🏊🏻‍♀ woman swimming: light skin tone
1F3CA 1F3FC 200D 2640 FE0F ; fully-qualified # 🏊🏼‍♀️ woman swimming: medium-light skin tone
1F3CA 1F3FC 200D 2640 ; minimally-qualified # 🏊🏼‍♀ woman swimming: medium-light skin tone
1F3CA 1F3FD 200D 2640 FE0F ; fully-qualified # 🏊🏽‍♀️ woman swimming: medium skin tone
1F3CA 1F3FD 200D 2640 ; minimally-qualified # 🏊🏽‍♀ woman swimming: medium skin tone
1F3CA 1F3FE 200D 2640 FE0F ; fully-qualified # 🏊🏾‍♀️ woman swimming: medium-dark skin tone
1F3CA 1F3FE 200D 2640 ; minimally-qualified # 🏊🏾‍♀ woman swimming: medium-dark skin tone
1F3CA 1F3FF 200D 2640 FE0F ; fully-qualified # 🏊🏿‍♀️ woman swimming: dark skin tone
1F3CA 1F3FF 200D 2640 ; minimally-qualified # 🏊🏿‍♀ woman swimming: dark skin tone
26F9 FE0F ; fully-qualified # ⛹️ person bouncing ball
26F9 ; unqualified # ⛹ person bouncing ball
26F9 1F3FB ; fully-qualified # ⛹🏻 person bouncing ball: light skin tone
26F9 1F3FC ; fully-qualified # ⛹🏼 person bouncing ball: medium-light skin tone
26F9 1F3FD ; fully-qualified # ⛹🏽 person bouncing ball: medium skin tone
26F9 1F3FE ; fully-qualified # ⛹🏾 person bouncing ball: medium-dark skin tone
26F9 1F3FF ; fully-qualified # ⛹🏿 person bouncing ball: dark skin tone
26F9 FE0F 200D 2642 FE0F ; fully-qualified # ⛹️‍♂️ man bouncing ball
26F9 200D 2642 FE0F ; unqualified # ⛹‍♂️ man bouncing ball
26F9 FE0F 200D 2642 ; unqualified # ⛹️‍♂ man bouncing ball
26F9 200D 2642 ; unqualified # ⛹‍♂ man bouncing ball
26F9 1F3FB 200D 2642 FE0F ; fully-qualified # ⛹🏻‍♂️ man bouncing ball: light skin tone
26F9 1F3FB 200D 2642 ; minimally-qualified # ⛹🏻‍♂ man bouncing ball: light skin tone
26F9 1F3FC 200D 2642 FE0F ; fully-qualified # ⛹🏼‍♂️ man bouncing ball: medium-light skin tone
26F9 1F3FC 200D 2642 ; minimally-qualified # ⛹🏼‍♂ man bouncing ball: medium-light skin tone
26F9 1F3FD 200D 2642 FE0F ; fully-qualified # ⛹🏽‍♂️ man bouncing ball: medium skin tone
26F9 1F3FD 200D 2642 ; minimally-qualified # ⛹🏽‍♂ man bouncing ball: medium skin tone
26F9 1F3FE 200D 2642 FE0F ; fully-qualified # ⛹🏾‍♂️ man bouncing ball: medium-dark skin tone
26F9 1F3FE 200D 2642 ; minimally-qualified # ⛹🏾‍♂ man bouncing ball: medium-dark skin tone
26F9 1F3FF 200D 2642 FE0F ; fully-qualified # ⛹🏿‍♂️ man bouncing ball: dark skin tone
26F9 1F3FF 200D 2642 ; minimally-qualified # ⛹🏿‍♂ man bouncing ball: dark skin tone
26F9 FE0F 200D 2640 FE0F ; fully-qualified # ⛹️‍♀️ woman bouncing ball
26F9 200D 2640 FE0F ; unqualified # ⛹‍♀️ woman bouncing ball
26F9 FE0F 200D 2640 ; unqualified # ⛹️‍♀ woman bouncing ball
26F9 200D 2640 ; unqualified # ⛹‍♀ woman bouncing ball
26F9 1F3FB 200D 2640 FE0F ; fully-qualified # ⛹🏻‍♀️ woman bouncing ball: light skin tone
26F9 1F3FB 200D 2640 ; minimally-qualified # ⛹🏻‍♀ woman bouncing ball: light skin tone
26F9 1F3FC 200D 2640 FE0F ; fully-qualified # ⛹🏼‍♀️ woman bouncing ball: medium-light skin tone
26F9 1F3FC 200D 2640 ; minimally-qualified # ⛹🏼‍♀ woman bouncing ball: medium-light skin tone
26F9 1F3FD 200D 2640 FE0F ; fully-qualified # ⛹🏽‍♀️ woman bouncing ball: medium skin tone
26F9 1F3FD 200D 2640 ; minimally-qualified # ⛹🏽‍♀ woman bouncing ball: medium skin tone
26F9 1F3FE 200D 2640 FE0F ; fully-qualified # ⛹🏾‍♀️ woman bouncing ball: medium-dark skin tone
26F9 1F3FE 200D 2640 ; minimally-qualified # ⛹🏾‍♀ woman bouncing ball: medium-dark skin tone
26F9 1F3FF 200D 2640 FE0F ; fully-qualified # ⛹🏿‍♀️ woman bouncing ball: dark skin tone
26F9 1F3FF 200D 2640 ; minimally-qualified # ⛹🏿‍♀ woman bouncing ball: dark skin tone
1F3CB FE0F ; fully-qualified # 🏋️ person lifting weights
1F3CB ; unqualified # 🏋 person lifting weights
1F3CB 1F3FB ; fully-qualified # 🏋🏻 person lifting weights: light skin tone
1F3CB 1F3FC ; fully-qualified # 🏋🏼 person lifting weights: medium-light skin tone
1F3CB 1F3FD ; fully-qualified # 🏋🏽 person lifting weights: medium skin tone
1F3CB 1F3FE ; fully-qualified # 🏋🏾 person lifting weights: medium-dark skin tone
1F3CB 1F3FF ; fully-qualified # 🏋🏿 person lifting weights: dark skin tone
1F3CB FE0F 200D 2642 FE0F ; fully-qualified # 🏋️‍♂️ man lifting weights
1F3CB 200D 2642 FE0F ; unqualified # 🏋‍♂️ man lifting weights
1F3CB FE0F 200D 2642 ; unqualified # 🏋️‍♂ man lifting weights
1F3CB 200D 2642 ; unqualified # 🏋‍♂ man lifting weights
1F3CB 1F3FB 200D 2642 FE0F ; fully-qualified # 🏋🏻‍♂️ man lifting weights: light skin tone
1F3CB 1F3FB 200D 2642 ; minimally-qualified # 🏋🏻‍♂ man lifting weights: light skin tone
1F3CB 1F3FC 200D 2642 FE0F ; fully-qualified # 🏋🏼‍♂️ man lifting weights: medium-light skin tone
1F3CB 1F3FC 200D 2642 ; minimally-qualified # 🏋🏼‍♂ man lifting weights: medium-light skin tone
1F3CB 1F3FD 200D 2642 FE0F ; fully-qualified # 🏋🏽‍♂️ man lifting weights: medium skin tone
1F3CB 1F3FD 200D 2642 ; minimally-qualified # 🏋🏽‍♂ man lifting weights: medium skin tone
1F3CB 1F3FE 200D 2642 FE0F ; fully-qualified # 🏋🏾‍♂️ man lifting weights: medium-dark skin tone
1F3CB 1F3FE 200D 2642 ; minimally-qualified # 🏋🏾‍♂ man lifting weights: medium-dark skin tone
1F3CB 1F3FF 200D 2642 FE0F ; fully-qualified # 🏋🏿‍♂️ man lifting weights: dark skin tone
1F3CB 1F3FF 200D 2642 ; minimally-qualified # 🏋🏿‍♂ man lifting weights: dark skin tone
1F3CB FE0F 200D 2640 FE0F ; fully-qualified # 🏋️‍♀️ woman lifting weights
1F3CB 200D 2640 FE0F ; unqualified # 🏋‍♀️ woman lifting weights
1F3CB FE0F 200D 2640 ; unqualified # 🏋️‍♀ woman lifting weights
1F3CB 200D 2640 ; unqualified # 🏋‍♀ woman lifting weights
1F3CB 1F3FB 200D 2640 FE0F ; fully-qualified # 🏋🏻‍♀️ woman lifting weights: light skin tone
1F3CB 1F3FB 200D 2640 ; minimally-qualified # 🏋🏻‍♀ woman lifting weights: light skin tone
1F3CB 1F3FC 200D 2640 FE0F ; fully-qualified # 🏋🏼‍♀️ woman lifting weights: medium-light skin tone
1F3CB 1F3FC 200D 2640 ; minimally-qualified # 🏋🏼‍♀ woman lifting weights: medium-light skin tone
1F3CB 1F3FD 200D 2640 FE0F ; fully-qualified # 🏋🏽‍♀️ woman lifting weights: medium skin tone
1F3CB 1F3FD 200D 2640 ; minimally-qualified # 🏋🏽‍♀ woman lifting weights: medium skin tone
1F3CB 1F3FE 200D 2640 FE0F ; fully-qualified # 🏋🏾‍♀️ woman lifting weights: medium-dark skin tone
1F3CB 1F3FE 200D 2640 ; minimally-qualified # 🏋🏾‍♀ woman lifting weights: medium-dark skin tone
1F3CB 1F3FF 200D 2640 FE0F ; fully-qualified # 🏋🏿‍♀️ woman lifting weights: dark skin tone
1F3CB 1F3FF 200D 2640 ; minimally-qualified # 🏋🏿‍♀ woman lifting weights: dark skin tone
1F6B4 ; fully-qualified # 🚴 person biking
1F6B4 1F3FB ; fully-qualified # 🚴🏻 person biking: light skin tone
1F6B4 1F3FC ; fully-qualified # 🚴🏼 person biking: medium-light skin tone
1F6B4 1F3FD ; fully-qualified # 🚴🏽 person biking: medium skin tone
1F6B4 1F3FE ; fully-qualified # 🚴🏾 person biking: medium-dark skin tone
1F6B4 1F3FF ; fully-qualified # 🚴🏿 person biking: dark skin tone
1F6B4 200D 2642 FE0F ; fully-qualified # 🚴‍♂️ man biking
1F6B4 200D 2642 ; minimally-qualified # 🚴‍♂ man biking
1F6B4 1F3FB 200D 2642 FE0F ; fully-qualified # 🚴🏻‍♂️ man biking: light skin tone
1F6B4 1F3FB 200D 2642 ; minimally-qualified # 🚴🏻‍♂ man biking: light skin tone
1F6B4 1F3FC 200D 2642 FE0F ; fully-qualified # 🚴🏼‍♂️ man biking: medium-light skin tone
1F6B4 1F3FC 200D 2642 ; minimally-qualified # 🚴🏼‍♂ man biking: medium-light skin tone
1F6B4 1F3FD 200D 2642 FE0F ; fully-qualified # 🚴🏽‍♂️ man biking: medium skin tone
1F6B4 1F3FD 200D 2642 ; minimally-qualified # 🚴🏽‍♂ man biking: medium skin tone
1F6B4 1F3FE 200D 2642 FE0F ; fully-qualified # 🚴🏾‍♂️ man biking: medium-dark skin tone
1F6B4 1F3FE 200D 2642 ; minimally-qualified # 🚴🏾‍♂ man biking: medium-dark skin tone
1F6B4 1F3FF 200D 2642 FE0F ; fully-qualified # 🚴🏿‍♂️ man biking: dark skin tone
1F6B4 1F3FF 200D 2642 ; minimally-qualified # 🚴🏿‍♂ man biking: dark skin tone
1F6B4 200D 2640 FE0F ; fully-qualified # 🚴‍♀️ woman biking
1F6B4 200D 2640 ; minimally-qualified # 🚴‍♀ woman biking
1F6B4 1F3FB 200D 2640 FE0F ; fully-qualified # 🚴🏻‍♀️ woman biking: light skin tone
1F6B4 1F3FB 200D 2640 ; minimally-qualified # 🚴🏻‍♀ woman biking: light skin tone
1F6B4 1F3FC 200D 2640 FE0F ; fully-qualified # 🚴🏼‍♀️ woman biking: medium-light skin tone
1F6B4 1F3FC 200D 2640 ; minimally-qualified # 🚴🏼‍♀ woman biking: medium-light skin tone
1F6B4 1F3FD 200D 2640 FE0F ; fully-qualified # 🚴🏽‍♀️ woman biking: medium skin tone
1F6B4 1F3FD 200D 2640 ; minimally-qualified # 🚴🏽‍♀ woman biking: medium skin tone
1F6B4 1F3FE 200D 2640 FE0F ; fully-qualified # 🚴🏾‍♀️ woman biking: medium-dark skin tone
1F6B4 1F3FE 200D 2640 ; minimally-qualified # 🚴🏾‍♀ woman biking: medium-dark skin tone
1F6B4 1F3FF 200D 2640 FE0F ; fully-qualified # 🚴🏿‍♀️ woman biking: dark skin tone
1F6B4 1F3FF 200D 2640 ; minimally-qualified # 🚴🏿‍♀ woman biking: dark skin tone
1F6B5 ; fully-qualified # 🚵 person mountain biking
1F6B5 1F3FB ; fully-qualified # 🚵🏻 person mountain biking: light skin tone
1F6B5 1F3FC ; fully-qualified # 🚵🏼 person mountain biking: medium-light skin tone
1F6B5 1F3FD ; fully-qualified # 🚵🏽 person mountain biking: medium skin tone
1F6B5 1F3FE ; fully-qualified # 🚵🏾 person mountain biking: medium-dark skin tone
1F6B5 1F3FF ; fully-qualified # 🚵🏿 person mountain biking: dark skin tone
1F6B5 200D 2642 FE0F ; fully-qualified # 🚵‍♂️ man mountain biking
1F6B5 200D 2642 ; minimally-qualified # 🚵‍♂ man mountain biking
1F6B5 1F3FB 200D 2642 FE0F ; fully-qualified # 🚵🏻‍♂️ man mountain biking: light skin tone
1F6B5 1F3FB 200D 2642 ; minimally-qualified # 🚵🏻‍♂ man mountain biking: light skin tone
1F6B5 1F3FC 200D 2642 FE0F ; fully-qualified # 🚵🏼‍♂️ man mountain biking: medium-light skin tone
1F6B5 1F3FC 200D 2642 ; minimally-qualified # 🚵🏼‍♂ man mountain biking: medium-light skin tone
1F6B5 1F3FD 200D 2642 FE0F ; fully-qualified # 🚵🏽‍♂️ man mountain biking: medium skin tone
1F6B5 1F3FD 200D 2642 ; minimally-qualified # 🚵🏽‍♂ man mountain biking: medium skin tone
1F6B5 1F3FE 200D 2642 FE0F ; fully-qualified # 🚵🏾‍♂️ man mountain biking: medium-dark skin tone
1F6B5 1F3FE 200D 2642 ; minimally-qualified # 🚵🏾‍♂ man mountain biking: medium-dark skin tone
1F6B5 1F3FF 200D 2642 FE0F ; fully-qualified # 🚵🏿‍♂️ man mountain biking: dark skin tone
1F6B5 1F3FF 200D 2642 ; minimally-qualified # 🚵🏿‍♂ man mountain biking: dark skin tone
1F6B5 200D 2640 FE0F ; fully-qualified # 🚵‍♀️ woman mountain biking
1F6B5 200D 2640 ; minimally-qualified # 🚵‍♀ woman mountain biking
1F6B5 1F3FB 200D 2640 FE0F ; fully-qualified # 🚵🏻‍♀️ woman mountain biking: light skin tone
1F6B5 1F3FB 200D 2640 ; minimally-qualified # 🚵🏻‍♀ woman mountain biking: light skin tone
1F6B5 1F3FC 200D 2640 FE0F ; fully-qualified # 🚵🏼‍♀️ woman mountain biking: medium-light skin tone
1F6B5 1F3FC 200D 2640 ; minimally-qualified # 🚵🏼‍♀ woman mountain biking: medium-light skin tone
1F6B5 1F3FD 200D 2640 FE0F ; fully-qualified # 🚵🏽‍♀️ woman mountain biking: medium skin tone
1F6B5 1F3FD 200D 2640 ; minimally-qualified # 🚵🏽‍♀ woman mountain biking: medium skin tone
1F6B5 1F3FE 200D 2640 FE0F ; fully-qualified # 🚵🏾‍♀️ woman mountain biking: medium-dark skin tone
1F6B5 1F3FE 200D 2640 ; minimally-qualified # 🚵🏾‍♀ woman mountain biking: medium-dark skin tone
1F6B5 1F3FF 200D 2640 FE0F ; fully-qualified # 🚵🏿‍♀️ woman mountain biking: dark skin tone
1F6B5 1F3FF 200D 2640 ; minimally-qualified # 🚵🏿‍♀ woman mountain biking: dark skin tone
1F938 ; fully-qualified # 🤸 person cartwheeling
1F938 1F3FB ; fully-qualified # 🤸🏻 person cartwheeling: light skin tone
1F938 1F3FC ; fully-qualified # 🤸🏼 person cartwheeling: medium-light skin tone
1F938 1F3FD ; fully-qualified # 🤸🏽 person cartwheeling: medium skin tone
1F938 1F3FE ; fully-qualified # 🤸🏾 person cartwheeling: medium-dark skin tone
1F938 1F3FF ; fully-qualified # 🤸🏿 person cartwheeling: dark skin tone
1F938 200D 2642 FE0F ; fully-qualified # 🤸‍♂️ man cartwheeling
1F938 200D 2642 ; minimally-qualified # 🤸‍♂ man cartwheeling
1F938 1F3FB 200D 2642 FE0F ; fully-qualified # 🤸🏻‍♂️ man cartwheeling: light skin tone
1F938 1F3FB 200D 2642 ; minimally-qualified # 🤸🏻‍♂ man cartwheeling: light skin tone
1F938 1F3FC 200D 2642 FE0F ; fully-qualified # 🤸🏼‍♂️ man cartwheeling: medium-light skin tone
1F938 1F3FC 200D 2642 ; minimally-qualified # 🤸🏼‍♂ man cartwheeling: medium-light skin tone
1F938 1F3FD 200D 2642 FE0F ; fully-qualified # 🤸🏽‍♂️ man cartwheeling: medium skin tone
1F938 1F3FD 200D 2642 ; minimally-qualified # 🤸🏽‍♂ man cartwheeling: medium skin tone
1F938 1F3FE 200D 2642 FE0F ; fully-qualified # 🤸🏾‍♂️ man cartwheeling: medium-dark skin tone
1F938 1F3FE 200D 2642 ; minimally-qualified # 🤸🏾‍♂ man cartwheeling: medium-dark skin tone
1F938 1F3FF 200D 2642 FE0F ; fully-qualified # 🤸🏿‍♂️ man cartwheeling: dark skin tone
1F938 1F3FF 200D 2642 ; minimally-qualified # 🤸🏿‍♂ man cartwheeling: dark skin tone
1F938 200D 2640 FE0F ; fully-qualified # 🤸‍♀️ woman cartwheeling
1F938 200D 2640 ; minimally-qualified # 🤸‍♀ woman cartwheeling
1F938 1F3FB 200D 2640 FE0F ; fully-qualified # 🤸🏻‍♀️ woman cartwheeling: light skin tone
1F938 1F3FB 200D 2640 ; minimally-qualified # 🤸🏻‍♀ woman cartwheeling: light skin tone
1F938 1F3FC 200D 2640 FE0F ; fully-qualified # 🤸🏼‍♀️ woman cartwheeling: medium-light skin tone
1F938 1F3FC 200D 2640 ; minimally-qualified # 🤸🏼‍♀ woman cartwheeling: medium-light skin tone
1F938 1F3FD 200D 2640 FE0F ; fully-qualified # 🤸🏽‍♀️ woman cartwheeling: medium skin tone
1F938 1F3FD 200D 2640 ; minimally-qualified # 🤸🏽‍♀ woman cartwheeling: medium skin tone
1F938 1F3FE 200D 2640 FE0F ; fully-qualified # 🤸🏾‍♀️ woman cartwheeling: medium-dark skin tone
1F938 1F3FE 200D 2640 ; minimally-qualified # 🤸🏾‍♀ woman cartwheeling: medium-dark skin tone
1F938 1F3FF 200D 2640 FE0F ; fully-qualified # 🤸🏿‍♀️ woman cartwheeling: dark skin tone
1F938 1F3FF 200D 2640 ; minimally-qualified # 🤸🏿‍♀ woman cartwheeling: dark skin tone
1F93C ; fully-qualified # 🤼 people wrestling
1F93C 200D 2642 FE0F ; fully-qualified # 🤼‍♂️ men wrestling
1F93C 200D 2642 ; minimally-qualified # 🤼‍♂ men wrestling
1F93C 200D 2640 FE0F ; fully-qualified # 🤼‍♀️ women wrestling
1F93C 200D 2640 ; minimally-qualified # 🤼‍♀ women wrestling
1F93D ; fully-qualified # 🤽 person playing water polo
1F93D 1F3FB ; fully-qualified # 🤽🏻 person playing water polo: light skin tone
1F93D 1F3FC ; fully-qualified # 🤽🏼 person playing water polo: medium-light skin tone
1F93D 1F3FD ; fully-qualified # 🤽🏽 person playing water polo: medium skin tone
1F93D 1F3FE ; fully-qualified # 🤽🏾 person playing water polo: medium-dark skin tone
1F93D 1F3FF ; fully-qualified # 🤽🏿 person playing water polo: dark skin tone
1F93D 200D 2642 FE0F ; fully-qualified # 🤽‍♂️ man playing water polo
1F93D 200D 2642 ; minimally-qualified # 🤽‍♂ man playing water polo
1F93D 1F3FB 200D 2642 FE0F ; fully-qualified # 🤽🏻‍♂️ man playing water polo: light skin tone
1F93D 1F3FB 200D 2642 ; minimally-qualified # 🤽🏻‍♂ man playing water polo: light skin tone
1F93D 1F3FC 200D 2642 FE0F ; fully-qualified # 🤽🏼‍♂️ man playing water polo: medium-light skin tone
1F93D 1F3FC 200D 2642 ; minimally-qualified # 🤽🏼‍♂ man playing water polo: medium-light skin tone
1F93D 1F3FD 200D 2642 FE0F ; fully-qualified # 🤽🏽‍♂️ man playing water polo: medium skin tone
1F93D 1F3FD 200D 2642 ; minimally-qualified # 🤽🏽‍♂ man playing water polo: medium skin tone
1F93D 1F3FE 200D 2642 FE0F ; fully-qualified # 🤽🏾‍♂️ man playing water polo: medium-dark skin tone
1F93D 1F3FE 200D 2642 ; minimally-qualified # 🤽🏾‍♂ man playing water polo: medium-dark skin tone
1F93D 1F3FF 200D 2642 FE0F ; fully-qualified # 🤽🏿‍♂️ man playing water polo: dark skin tone
1F93D 1F3FF 200D 2642 ; minimally-qualified # 🤽🏿‍♂ man playing water polo: dark skin tone
1F93D 200D 2640 FE0F ; fully-qualified # 🤽‍♀️ woman playing water polo
1F93D 200D 2640 ; minimally-qualified # 🤽‍♀ woman playing water polo
1F93D 1F3FB 200D 2640 FE0F ; fully-qualified # 🤽🏻‍♀️ woman playing water polo: light skin tone
1F93D 1F3FB 200D 2640 ; minimally-qualified # 🤽🏻‍♀ woman playing water polo: light skin tone
1F93D 1F3FC 200D 2640 FE0F ; fully-qualified # 🤽🏼‍♀️ woman playing water polo: medium-light skin tone
1F93D 1F3FC 200D 2640 ; minimally-qualified # 🤽🏼‍♀ woman playing water polo: medium-light skin tone
1F93D 1F3FD 200D 2640 FE0F ; fully-qualified # 🤽🏽‍♀️ woman playing water polo: medium skin tone
1F93D 1F3FD 200D 2640 ; minimally-qualified # 🤽🏽‍♀ woman playing water polo: medium skin tone
1F93D 1F3FE 200D 2640 FE0F ; fully-qualified # 🤽🏾‍♀️ woman playing water polo: medium-dark skin tone
1F93D 1F3FE 200D 2640 ; minimally-qualified # 🤽🏾‍♀ woman playing water polo: medium-dark skin tone
1F93D 1F3FF 200D 2640 FE0F ; fully-qualified # 🤽🏿‍♀️ woman playing water polo: dark skin tone
1F93D 1F3FF 200D 2640 ; minimally-qualified # 🤽🏿‍♀ woman playing water polo: dark skin tone
1F93E ; fully-qualified # 🤾 person playing handball
1F93E 1F3FB ; fully-qualified # 🤾🏻 person playing handball: light skin tone
1F93E 1F3FC ; fully-qualified # 🤾🏼 person playing handball: medium-light skin tone
1F93E 1F3FD ; fully-qualified # 🤾🏽 person playing handball: medium skin tone
1F93E 1F3FE ; fully-qualified # 🤾🏾 person playing handball: medium-dark skin tone
1F93E 1F3FF ; fully-qualified # 🤾🏿 person playing handball: dark skin tone
1F93E 200D 2642 FE0F ; fully-qualified # 🤾‍♂️ man playing handball
1F93E 200D 2642 ; minimally-qualified # 🤾‍♂ man playing handball
1F93E 1F3FB 200D 2642 FE0F ; fully-qualified # 🤾🏻‍♂️ man playing handball: light skin tone
1F93E 1F3FB 200D 2642 ; minimally-qualified # 🤾🏻‍♂ man playing handball: light skin tone
1F93E 1F3FC 200D 2642 FE0F ; fully-qualified # 🤾🏼‍♂️ man playing handball: medium-light skin tone
1F93E 1F3FC 200D 2642 ; minimally-qualified # 🤾🏼‍♂ man playing handball: medium-light skin tone
1F93E 1F3FD 200D 2642 FE0F ; fully-qualified # 🤾🏽‍♂️ man playing handball: medium skin tone
1F93E 1F3FD 200D 2642 ; minimally-qualified # 🤾🏽‍♂ man playing handball: medium skin tone
1F93E 1F3FE 200D 2642 FE0F ; fully-qualified # 🤾🏾‍♂️ man playing handball: medium-dark skin tone
1F93E 1F3FE 200D 2642 ; minimally-qualified # 🤾🏾‍♂ man playing handball: medium-dark skin tone
1F93E 1F3FF 200D 2642 FE0F ; fully-qualified # 🤾🏿‍♂️ man playing handball: dark skin tone
1F93E 1F3FF 200D 2642 ; minimally-qualified # 🤾🏿‍♂ man playing handball: dark skin tone
1F93E 200D 2640 FE0F ; fully-qualified # 🤾‍♀️ woman playing handball
1F93E 200D 2640 ; minimally-qualified # 🤾‍♀ woman playing handball
1F93E 1F3FB 200D 2640 FE0F ; fully-qualified # 🤾🏻‍♀️ woman playing handball: light skin tone
1F93E 1F3FB 200D 2640 ; minimally-qualified # 🤾🏻‍♀ woman playing handball: light skin tone
1F93E 1F3FC 200D 2640 FE0F ; fully-qualified # 🤾🏼‍♀️ woman playing handball: medium-light skin tone
1F93E 1F3FC 200D 2640 ; minimally-qualified # 🤾🏼‍♀ woman playing handball: medium-light skin tone
1F93E 1F3FD 200D 2640 FE0F ; fully-qualified # 🤾🏽‍♀️ woman playing handball: medium skin tone
1F93E 1F3FD 200D 2640 ; minimally-qualified # 🤾🏽‍♀ woman playing handball: medium skin tone
1F93E 1F3FE 200D 2640 FE0F ; fully-qualified # 🤾🏾‍♀️ woman playing handball: medium-dark skin tone
1F93E 1F3FE 200D 2640 ; minimally-qualified # 🤾🏾‍♀ woman playing handball: medium-dark skin tone
1F93E 1F3FF 200D 2640 FE0F ; fully-qualified # 🤾🏿‍♀️ woman playing handball: dark skin tone
1F93E 1F3FF 200D 2640 ; minimally-qualified # 🤾🏿‍♀ woman playing handball: dark skin tone
1F939 ; fully-qualified # 🤹 person juggling
1F939 1F3FB ; fully-qualified # 🤹🏻 person juggling: light skin tone
1F939 1F3FC ; fully-qualified # 🤹🏼 person juggling: medium-light skin tone
1F939 1F3FD ; fully-qualified # 🤹🏽 person juggling: medium skin tone
1F939 1F3FE ; fully-qualified # 🤹🏾 person juggling: medium-dark skin tone
1F939 1F3FF ; fully-qualified # 🤹🏿 person juggling: dark skin tone
1F939 200D 2642 FE0F ; fully-qualified # 🤹‍♂️ man juggling
1F939 200D 2642 ; minimally-qualified # 🤹‍♂ man juggling
1F939 1F3FB 200D 2642 FE0F ; fully-qualified # 🤹🏻‍♂️ man juggling: light skin tone
1F939 1F3FB 200D 2642 ; minimally-qualified # 🤹🏻‍♂ man juggling: light skin tone
1F939 1F3FC 200D 2642 FE0F ; fully-qualified # 🤹🏼‍♂️ man juggling: medium-light skin tone
1F939 1F3FC 200D 2642 ; minimally-qualified # 🤹🏼‍♂ man juggling: medium-light skin tone
1F939 1F3FD 200D 2642 FE0F ; fully-qualified # 🤹🏽‍♂️ man juggling: medium skin tone
1F939 1F3FD 200D 2642 ; minimally-qualified # 🤹🏽‍♂ man juggling: medium skin tone
1F939 1F3FE 200D 2642 FE0F ; fully-qualified # 🤹🏾‍♂️ man juggling: medium-dark skin tone
1F939 1F3FE 200D 2642 ; minimally-qualified # 🤹🏾‍♂ man juggling: medium-dark skin tone
1F939 1F3FF 200D 2642 FE0F ; fully-qualified # 🤹🏿‍♂️ man juggling: dark skin tone
1F939 1F3FF 200D 2642 ; minimally-qualified # 🤹🏿‍♂ man juggling: dark skin tone
1F939 200D 2640 FE0F ; fully-qualified # 🤹‍♀️ woman juggling
1F939 200D 2640 ; minimally-qualified # 🤹‍♀ woman juggling
1F939 1F3FB 200D 2640 FE0F ; fully-qualified # 🤹🏻‍♀️ woman juggling: light skin tone
1F939 1F3FB 200D 2640 ; minimally-qualified # 🤹🏻‍♀ woman juggling: light skin tone
1F939 1F3FC 200D 2640 FE0F ; fully-qualified # 🤹🏼‍♀️ woman juggling: medium-light skin tone
1F939 1F3FC 200D 2640 ; minimally-qualified # 🤹🏼‍♀ woman juggling: medium-light skin tone
1F939 1F3FD 200D 2640 FE0F ; fully-qualified # 🤹🏽‍♀️ woman juggling: medium skin tone
1F939 1F3FD 200D 2640 ; minimally-qualified # 🤹🏽‍♀ woman juggling: medium skin tone
1F939 1F3FE 200D 2640 FE0F ; fully-qualified # 🤹🏾‍♀️ woman juggling: medium-dark skin tone
1F939 1F3FE 200D 2640 ; minimally-qualified # 🤹🏾‍♀ woman juggling: medium-dark skin tone
1F939 1F3FF 200D 2640 FE0F ; fully-qualified # 🤹🏿‍♀️ woman juggling: dark skin tone
1F939 1F3FF 200D 2640 ; minimally-qualified # 🤹🏿‍♀ woman juggling: dark skin tone
# subgroup: person-resting
1F9D8 ; fully-qualified # 🧘 person in lotus position
1F9D8 1F3FB ; fully-qualified # 🧘🏻 person in lotus position: light skin tone
1F9D8 1F3FC ; fully-qualified # 🧘🏼 person in lotus position: medium-light skin tone
1F9D8 1F3FD ; fully-qualified # 🧘🏽 person in lotus position: medium skin tone
1F9D8 1F3FE ; fully-qualified # 🧘🏾 person in lotus position: medium-dark skin tone
1F9D8 1F3FF ; fully-qualified # 🧘🏿 person in lotus position: dark skin tone
1F9D8 200D 2642 FE0F ; fully-qualified # 🧘‍♂️ man in lotus position
1F9D8 200D 2642 ; minimally-qualified # 🧘‍♂ man in lotus position
1F9D8 1F3FB 200D 2642 FE0F ; fully-qualified # 🧘🏻‍♂️ man in lotus position: light skin tone
1F9D8 1F3FB 200D 2642 ; minimally-qualified # 🧘🏻‍♂ man in lotus position: light skin tone
1F9D8 1F3FC 200D 2642 FE0F ; fully-qualified # 🧘🏼‍♂️ man in lotus position: medium-light skin tone
1F9D8 1F3FC 200D 2642 ; minimally-qualified # 🧘🏼‍♂ man in lotus position: medium-light skin tone
1F9D8 1F3FD 200D 2642 FE0F ; fully-qualified # 🧘🏽‍♂️ man in lotus position: medium skin tone
1F9D8 1F3FD 200D 2642 ; minimally-qualified # 🧘🏽‍♂ man in lotus position: medium skin tone
1F9D8 1F3FE 200D 2642 FE0F ; fully-qualified # 🧘🏾‍♂️ man in lotus position: medium-dark skin tone
1F9D8 1F3FE 200D 2642 ; minimally-qualified # 🧘🏾‍♂ man in lotus position: medium-dark skin tone
1F9D8 1F3FF 200D 2642 FE0F ; fully-qualified # 🧘🏿‍♂️ man in lotus position: dark skin tone
1F9D8 1F3FF 200D 2642 ; minimally-qualified # 🧘🏿‍♂ man in lotus position: dark skin tone
1F9D8 200D 2640 FE0F ; fully-qualified # 🧘‍♀️ woman in lotus position
1F9D8 200D 2640 ; minimally-qualified # 🧘‍♀ woman in lotus position
1F9D8 1F3FB 200D 2640 FE0F ; fully-qualified # 🧘🏻‍♀️ woman in lotus position: light skin tone
1F9D8 1F3FB 200D 2640 ; minimally-qualified # 🧘🏻‍♀ woman in lotus position: light skin tone
1F9D8 1F3FC 200D 2640 FE0F ; fully-qualified # 🧘🏼‍♀️ woman in lotus position: medium-light skin tone
1F9D8 1F3FC 200D 2640 ; minimally-qualified # 🧘🏼‍♀ woman in lotus position: medium-light skin tone
1F9D8 1F3FD 200D 2640 FE0F ; fully-qualified # 🧘🏽‍♀️ woman in lotus position: medium skin tone
1F9D8 1F3FD 200D 2640 ; minimally-qualified # 🧘🏽‍♀ woman in lotus position: medium skin tone
1F9D8 1F3FE 200D 2640 FE0F ; fully-qualified # 🧘🏾‍♀️ woman in lotus position: medium-dark skin tone
1F9D8 1F3FE 200D 2640 ; minimally-qualified # 🧘🏾‍♀ woman in lotus position: medium-dark skin tone
1F9D8 1F3FF 200D 2640 FE0F ; fully-qualified # 🧘🏿‍♀️ woman in lotus position: dark skin tone
1F9D8 1F3FF 200D 2640 ; minimally-qualified # 🧘🏿‍♀ woman in lotus position: dark skin tone
1F6C0 ; fully-qualified # 🛀 person taking bath
1F6C0 1F3FB ; fully-qualified # 🛀🏻 person taking bath: light skin tone
1F6C0 1F3FC ; fully-qualified # 🛀🏼 person taking bath: medium-light skin tone
1F6C0 1F3FD ; fully-qualified # 🛀🏽 person taking bath: medium skin tone
1F6C0 1F3FE ; fully-qualified # 🛀🏾 person taking bath: medium-dark skin tone
1F6C0 1F3FF ; fully-qualified # 🛀🏿 person taking bath: dark skin tone
1F6CC ; fully-qualified # 🛌 person in bed
1F6CC 1F3FB ; fully-qualified # 🛌🏻 person in bed: light skin tone
1F6CC 1F3FC ; fully-qualified # 🛌🏼 person in bed: medium-light skin tone
1F6CC 1F3FD ; fully-qualified # 🛌🏽 person in bed: medium skin tone
1F6CC 1F3FE ; fully-qualified # 🛌🏾 person in bed: medium-dark skin tone
1F6CC 1F3FF ; fully-qualified # 🛌🏿 person in bed: dark skin tone
# subgroup: family
1F9D1 200D 1F91D 200D 1F9D1 ; fully-qualified # 🧑‍🤝‍🧑 people holding hands
1F9D1 1F3FB 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏻‍🤝‍🧑🏻 people holding hands: light skin tone
1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏼‍🤝‍🧑🏻 people holding hands: medium-light skin tone, light skin tone
1F9D1 1F3FC 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏼‍🤝‍🧑🏼 people holding hands: medium-light skin tone
1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏽‍🤝‍🧑🏻 people holding hands: medium skin tone, light skin tone
1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏽‍🤝‍🧑🏼 people holding hands: medium skin tone, medium-light skin tone
1F9D1 1F3FD 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # 🧑🏽‍🤝‍🧑🏽 people holding hands: medium skin tone
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏾‍🤝‍🧑🏻 people holding hands: medium-dark skin tone, light skin tone
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏾‍🤝‍🧑🏼 people holding hands: medium-dark skin tone, medium-light skin tone
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # 🧑🏾‍🤝‍🧑🏽 people holding hands: medium-dark skin tone, medium skin tone
1F9D1 1F3FE 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # 🧑🏾‍🤝‍🧑🏾 people holding hands: medium-dark skin tone
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FB ; fully-qualified # 🧑🏿‍🤝‍🧑🏻 people holding hands: dark skin tone, light skin tone
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FC ; fully-qualified # 🧑🏿‍🤝‍🧑🏼 people holding hands: dark skin tone, medium-light skin tone
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FD ; fully-qualified # 🧑🏿‍🤝‍🧑🏽 people holding hands: dark skin tone, medium skin tone
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FE ; fully-qualified # 🧑🏿‍🤝‍🧑🏾 people holding hands: dark skin tone, medium-dark skin tone
1F9D1 1F3FF 200D 1F91D 200D 1F9D1 1F3FF ; fully-qualified # 🧑🏿‍🤝‍🧑🏿 people holding hands: dark skin tone
1F46D ; fully-qualified # 👭 women holding hands
1F46D 1F3FB ; fully-qualified # 👭🏻 women holding hands: light skin tone
1F469 1F3FC 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏼‍🤝‍👩🏻 women holding hands: medium-light skin tone, light skin tone
1F46D 1F3FC ; fully-qualified # 👭🏼 women holding hands: medium-light skin tone
1F469 1F3FD 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏽‍🤝‍👩🏻 women holding hands: medium skin tone, light skin tone
1F469 1F3FD 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # 👩🏽‍🤝‍👩🏼 women holding hands: medium skin tone, medium-light skin tone
1F46D 1F3FD ; fully-qualified # 👭🏽 women holding hands: medium skin tone
1F469 1F3FE 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏾‍🤝‍👩🏻 women holding hands: medium-dark skin tone, light skin tone
1F469 1F3FE 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # 👩🏾‍🤝‍👩🏼 women holding hands: medium-dark skin tone, medium-light skin tone
1F469 1F3FE 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # 👩🏾‍🤝‍👩🏽 women holding hands: medium-dark skin tone, medium skin tone
1F46D 1F3FE ; fully-qualified # 👭🏾 women holding hands: medium-dark skin tone
1F469 1F3FF 200D 1F91D 200D 1F469 1F3FB ; fully-qualified # 👩🏿‍🤝‍👩🏻 women holding hands: dark skin tone, light skin tone
1F469 1F3FF 200D 1F91D 200D 1F469 1F3FC ; fully-qualified # 👩🏿‍🤝‍👩🏼 women holding hands: dark skin tone, medium-light skin tone
1F469 1F3FF 200D 1F91D 200D 1F469 1F3FD ; fully-qualified # 👩🏿‍🤝‍👩🏽 women holding hands: dark skin tone, medium skin tone
1F469 1F3FF 200D 1F91D 200D 1F469 1F3FE ; fully-qualified # 👩🏿‍🤝‍👩🏾 women holding hands: dark skin tone, medium-dark skin tone
1F46D 1F3FF ; fully-qualified # 👭🏿 women holding hands: dark skin tone
1F46B ; fully-qualified # 👫 woman and man holding hands
1F46B 1F3FB ; fully-qualified # 👫🏻 woman and man holding hands: light skin tone
1F469 1F3FB 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏻‍🤝‍👨🏼 woman and man holding hands: light skin tone, medium-light skin tone
1F469 1F3FB 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏻‍🤝‍👨🏽 woman and man holding hands: light skin tone, medium skin tone
1F469 1F3FB 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏻‍🤝‍👨🏾 woman and man holding hands: light skin tone, medium-dark skin tone
1F469 1F3FB 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏻‍🤝‍👨🏿 woman and man holding hands: light skin tone, dark skin tone
1F469 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏼‍🤝‍👨🏻 woman and man holding hands: medium-light skin tone, light skin tone
1F46B 1F3FC ; fully-qualified # 👫🏼 woman and man holding hands: medium-light skin tone
1F469 1F3FC 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏼‍🤝‍👨🏽 woman and man holding hands: medium-light skin tone, medium skin tone
1F469 1F3FC 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏼‍🤝‍👨🏾 woman and man holding hands: medium-light skin tone, medium-dark skin tone
1F469 1F3FC 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏼‍🤝‍👨🏿 woman and man holding hands: medium-light skin tone, dark skin tone
1F469 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏽‍🤝‍👨🏻 woman and man holding hands: medium skin tone, light skin tone
1F469 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏽‍🤝‍👨🏼 woman and man holding hands: medium skin tone, medium-light skin tone
1F46B 1F3FD ; fully-qualified # 👫🏽 woman and man holding hands: medium skin tone
1F469 1F3FD 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏽‍🤝‍👨🏾 woman and man holding hands: medium skin tone, medium-dark skin tone
1F469 1F3FD 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏽‍🤝‍👨🏿 woman and man holding hands: medium skin tone, dark skin tone
1F469 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏾‍🤝‍👨🏻 woman and man holding hands: medium-dark skin tone, light skin tone
1F469 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏾‍🤝‍👨🏼 woman and man holding hands: medium-dark skin tone, medium-light skin tone
1F469 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏾‍🤝‍👨🏽 woman and man holding hands: medium-dark skin tone, medium skin tone
1F46B 1F3FE ; fully-qualified # 👫🏾 woman and man holding hands: medium-dark skin tone
1F469 1F3FE 200D 1F91D 200D 1F468 1F3FF ; fully-qualified # 👩🏾‍🤝‍👨🏿 woman and man holding hands: medium-dark skin tone, dark skin tone
1F469 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👩🏿‍🤝‍👨🏻 woman and man holding hands: dark skin tone, light skin tone
1F469 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👩🏿‍🤝‍👨🏼 woman and man holding hands: dark skin tone, medium-light skin tone
1F469 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👩🏿‍🤝‍👨🏽 woman and man holding hands: dark skin tone, medium skin tone
1F469 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👩🏿‍🤝‍👨🏾 woman and man holding hands: dark skin tone, medium-dark skin tone
1F46B 1F3FF ; fully-qualified # 👫🏿 woman and man holding hands: dark skin tone
1F46C ; fully-qualified # 👬 men holding hands
1F46C 1F3FB ; fully-qualified # 👬🏻 men holding hands: light skin tone
1F468 1F3FC 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏼‍🤝‍👨🏻 men holding hands: medium-light skin tone, light skin tone
1F46C 1F3FC ; fully-qualified # 👬🏼 men holding hands: medium-light skin tone
1F468 1F3FD 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏽‍🤝‍👨🏻 men holding hands: medium skin tone, light skin tone
1F468 1F3FD 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👨🏽‍🤝‍👨🏼 men holding hands: medium skin tone, medium-light skin tone
1F46C 1F3FD ; fully-qualified # 👬🏽 men holding hands: medium skin tone
1F468 1F3FE 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏾‍🤝‍👨🏻 men holding hands: medium-dark skin tone, light skin tone
1F468 1F3FE 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👨🏾‍🤝‍👨🏼 men holding hands: medium-dark skin tone, medium-light skin tone
1F468 1F3FE 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👨🏾‍🤝‍👨🏽 men holding hands: medium-dark skin tone, medium skin tone
1F46C 1F3FE ; fully-qualified # 👬🏾 men holding hands: medium-dark skin tone
1F468 1F3FF 200D 1F91D 200D 1F468 1F3FB ; fully-qualified # 👨🏿‍🤝‍👨🏻 men holding hands: dark skin tone, light skin tone
1F468 1F3FF 200D 1F91D 200D 1F468 1F3FC ; fully-qualified # 👨🏿‍🤝‍👨🏼 men holding hands: dark skin tone, medium-light skin tone
1F468 1F3FF 200D 1F91D 200D 1F468 1F3FD ; fully-qualified # 👨🏿‍🤝‍👨🏽 men holding hands: dark skin tone, medium skin tone
1F468 1F3FF 200D 1F91D 200D 1F468 1F3FE ; fully-qualified # 👨🏿‍🤝‍👨🏾 men holding hands: dark skin tone, medium-dark skin tone
1F46C 1F3FF ; fully-qualified # 👬🏿 men holding hands: dark skin tone
1F48F ; fully-qualified # 💏 kiss
1F469 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # 👩‍❤️‍💋‍👨 kiss: woman, man
1F469 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # 👩‍❤‍💋‍👨 kiss: woman, man
1F468 200D 2764 FE0F 200D 1F48B 200D 1F468 ; fully-qualified # 👨‍❤️‍💋‍👨 kiss: man, man
1F468 200D 2764 200D 1F48B 200D 1F468 ; minimally-qualified # 👨‍❤‍💋‍👨 kiss: man, man
1F469 200D 2764 FE0F 200D 1F48B 200D 1F469 ; fully-qualified # 👩‍❤️‍💋‍👩 kiss: woman, woman
1F469 200D 2764 200D 1F48B 200D 1F469 ; minimally-qualified # 👩‍❤‍💋‍👩 kiss: woman, woman
1F491 ; fully-qualified # 💑 couple with heart
1F469 200D 2764 FE0F 200D 1F468 ; fully-qualified # 👩‍❤️‍👨 couple with heart: woman, man
1F469 200D 2764 200D 1F468 ; minimally-qualified # 👩‍❤‍👨 couple with heart: woman, man
1F468 200D 2764 FE0F 200D 1F468 ; fully-qualified # 👨‍❤️‍👨 couple with heart: man, man
1F468 200D 2764 200D 1F468 ; minimally-qualified # 👨‍❤‍👨 couple with heart: man, man
1F469 200D 2764 FE0F 200D 1F469 ; fully-qualified # 👩‍❤️‍👩 couple with heart: woman, woman
1F469 200D 2764 200D 1F469 ; minimally-qualified # 👩‍❤‍👩 couple with heart: woman, woman
1F46A ; fully-qualified # 👪 family
1F468 200D 1F469 200D 1F466 ; fully-qualified # 👨‍👩‍👦 family: man, woman, boy
1F468 200D 1F469 200D 1F467 ; fully-qualified # 👨‍👩‍👧 family: man, woman, girl
1F468 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # 👨‍👩‍👧‍👦 family: man, woman, girl, boy
1F468 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # 👨‍👩‍👦‍👦 family: man, woman, boy, boy
1F468 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # 👨‍👩‍👧‍👧 family: man, woman, girl, girl
1F468 200D 1F468 200D 1F466 ; fully-qualified # 👨‍👨‍👦 family: man, man, boy
1F468 200D 1F468 200D 1F467 ; fully-qualified # 👨‍👨‍👧 family: man, man, girl
1F468 200D 1F468 200D 1F467 200D 1F466 ; fully-qualified # 👨‍👨‍👧‍👦 family: man, man, girl, boy
1F468 200D 1F468 200D 1F466 200D 1F466 ; fully-qualified # 👨‍👨‍👦‍👦 family: man, man, boy, boy
1F468 200D 1F468 200D 1F467 200D 1F467 ; fully-qualified # 👨‍👨‍👧‍👧 family: man, man, girl, girl
1F469 200D 1F469 200D 1F466 ; fully-qualified # 👩‍👩‍👦 family: woman, woman, boy
1F469 200D 1F469 200D 1F467 ; fully-qualified # 👩‍👩‍👧 family: woman, woman, girl
1F469 200D 1F469 200D 1F467 200D 1F466 ; fully-qualified # 👩‍👩‍👧‍👦 family: woman, woman, girl, boy
1F469 200D 1F469 200D 1F466 200D 1F466 ; fully-qualified # 👩‍👩‍👦‍👦 family: woman, woman, boy, boy
1F469 200D 1F469 200D 1F467 200D 1F467 ; fully-qualified # 👩‍👩‍👧‍👧 family: woman, woman, girl, girl
1F468 200D 1F466 ; fully-qualified # 👨‍👦 family: man, boy
1F468 200D 1F466 200D 1F466 ; fully-qualified # 👨‍👦‍👦 family: man, boy, boy
1F468 200D 1F467 ; fully-qualified # 👨‍👧 family: man, girl
1F468 200D 1F467 200D 1F466 ; fully-qualified # 👨‍👧‍👦 family: man, girl, boy
1F468 200D 1F467 200D 1F467 ; fully-qualified # 👨‍👧‍👧 family: man, girl, girl
1F469 200D 1F466 ; fully-qualified # 👩‍👦 family: woman, boy
1F469 200D 1F466 200D 1F466 ; fully-qualified # 👩‍👦‍👦 family: woman, boy, boy
1F469 200D 1F467 ; fully-qualified # 👩‍👧 family: woman, girl
1F469 200D 1F467 200D 1F466 ; fully-qualified # 👩‍👧‍👦 family: woman, girl, boy
1F469 200D 1F467 200D 1F467 ; fully-qualified # 👩‍👧‍👧 family: woman, girl, girl
# subgroup: person-symbol
1F5E3 FE0F ; fully-qualified # 🗣️ speaking head
1F5E3 ; unqualified # 🗣 speaking head
1F464 ; fully-qualified # 👤 bust in silhouette
1F465 ; fully-qualified # 👥 busts in silhouette
1F463 ; fully-qualified # 👣 footprints
# People & Body subtotal: 2212
# People & Body subtotal: 447 w/o modifiers
# group: Component
# subgroup: skin-tone
1F3FB ; component # 🏻 light skin tone
1F3FC ; component # 🏼 medium-light skin tone
1F3FD ; component # 🏽 medium skin tone
1F3FE ; component # 🏾 medium-dark skin tone
1F3FF ; component # 🏿 dark skin tone
# subgroup: hair-style
1F9B0 ; component # 🦰 red hair
1F9B1 ; component # 🦱 curly hair
1F9B3 ; component # 🦳 white hair
1F9B2 ; component # 🦲 bald
# Component subtotal: 9
# Component subtotal: 4 w/o modifiers
# group: Animals & Nature
# subgroup: animal-mammal
1F435 ; fully-qualified # 🐵 monkey face
1F412 ; fully-qualified # 🐒 monkey
1F98D ; fully-qualified # 🦍 gorilla
1F9A7 ; fully-qualified # 🦧 orangutan
1F436 ; fully-qualified # 🐶 dog face
1F415 ; fully-qualified # 🐕 dog
1F9AE ; fully-qualified # 🦮 guide dog
1F415 200D 1F9BA ; fully-qualified # 🐕‍🦺 service dog
1F429 ; fully-qualified # 🐩 poodle
1F43A ; fully-qualified # 🐺 wolf
1F98A ; fully-qualified # 🦊 fox
1F99D ; fully-qualified # 🦝 raccoon
1F431 ; fully-qualified # 🐱 cat face
1F408 ; fully-qualified # 🐈 cat
1F981 ; fully-qualified # 🦁 lion
1F42F ; fully-qualified # 🐯 tiger face
1F405 ; fully-qualified # 🐅 tiger
1F406 ; fully-qualified # 🐆 leopard
1F434 ; fully-qualified # 🐴 horse face
1F40E ; fully-qualified # 🐎 horse
1F984 ; fully-qualified # 🦄 unicorn
1F993 ; fully-qualified # 🦓 zebra
1F98C ; fully-qualified # 🦌 deer
1F42E ; fully-qualified # 🐮 cow face
1F402 ; fully-qualified # 🐂 ox
1F403 ; fully-qualified # 🐃 water buffalo
1F404 ; fully-qualified # 🐄 cow
1F437 ; fully-qualified # 🐷 pig face
1F416 ; fully-qualified # 🐖 pig
1F417 ; fully-qualified # 🐗 boar
1F43D ; fully-qualified # 🐽 pig nose
1F40F ; fully-qualified # 🐏 ram
1F411 ; fully-qualified # 🐑 ewe
1F410 ; fully-qualified # 🐐 goat
1F42A ; fully-qualified # 🐪 camel
1F42B ; fully-qualified # 🐫 two-hump camel
1F999 ; fully-qualified # 🦙 llama
1F992 ; fully-qualified # 🦒 giraffe
1F418 ; fully-qualified # 🐘 elephant
1F98F ; fully-qualified # 🦏 rhinoceros
1F99B ; fully-qualified # 🦛 hippopotamus
1F42D ; fully-qualified # 🐭 mouse face
1F401 ; fully-qualified # 🐁 mouse
1F400 ; fully-qualified # 🐀 rat
1F439 ; fully-qualified # 🐹 hamster
1F430 ; fully-qualified # 🐰 rabbit face
1F407 ; fully-qualified # 🐇 rabbit
1F43F FE0F ; fully-qualified # 🐿️ chipmunk
1F43F ; unqualified # 🐿 chipmunk
1F994 ; fully-qualified # 🦔 hedgehog
1F987 ; fully-qualified # 🦇 bat
1F43B ; fully-qualified # 🐻 bear
1F428 ; fully-qualified # 🐨 koala
1F43C ; fully-qualified # 🐼 panda
1F9A5 ; fully-qualified # 🦥 sloth
1F9A6 ; fully-qualified # 🦦 otter
1F9A8 ; fully-qualified # 🦨 skunk
1F998 ; fully-qualified # 🦘 kangaroo
1F9A1 ; fully-qualified # 🦡 badger
1F43E ; fully-qualified # 🐾 paw prints
# subgroup: animal-bird
1F983 ; fully-qualified # 🦃 turkey
1F414 ; fully-qualified # 🐔 chicken
1F413 ; fully-qualified # 🐓 rooster
1F423 ; fully-qualified # 🐣 hatching chick
1F424 ; fully-qualified # 🐤 baby chick
1F425 ; fully-qualified # 🐥 front-facing baby chick
1F426 ; fully-qualified # 🐦 bird
1F427 ; fully-qualified # 🐧 penguin
1F54A FE0F ; fully-qualified # 🕊️ dove
1F54A ; unqualified # 🕊 dove
1F985 ; fully-qualified # 🦅 eagle
1F986 ; fully-qualified # 🦆 duck
1F9A2 ; fully-qualified # 🦢 swan
1F989 ; fully-qualified # 🦉 owl
1F9A9 ; fully-qualified # 🦩 flamingo
1F99A ; fully-qualified # 🦚 peacock
1F99C ; fully-qualified # 🦜 parrot
# subgroup: animal-amphibian
1F438 ; fully-qualified # 🐸 frog
# subgroup: animal-reptile
1F40A ; fully-qualified # 🐊 crocodile
1F422 ; fully-qualified # 🐢 turtle
1F98E ; fully-qualified # 🦎 lizard
1F40D ; fully-qualified # 🐍 snake
1F432 ; fully-qualified # 🐲 dragon face
1F409 ; fully-qualified # 🐉 dragon
1F995 ; fully-qualified # 🦕 sauropod
1F996 ; fully-qualified # 🦖 T-Rex
# subgroup: animal-marine
1F433 ; fully-qualified # 🐳 spouting whale
1F40B ; fully-qualified # 🐋 whale
1F42C ; fully-qualified # 🐬 dolphin
1F41F ; fully-qualified # 🐟 fish
1F420 ; fully-qualified # 🐠 tropical fish
1F421 ; fully-qualified # 🐡 blowfish
1F988 ; fully-qualified # 🦈 shark
1F419 ; fully-qualified # 🐙 octopus
1F41A ; fully-qualified # 🐚 spiral shell
# subgroup: animal-bug
1F40C ; fully-qualified # 🐌 snail
1F98B ; fully-qualified # 🦋 butterfly
1F41B ; fully-qualified # 🐛 bug
1F41C ; fully-qualified # 🐜 ant
1F41D ; fully-qualified # 🐝 honeybee
1F41E ; fully-qualified # 🐞 lady beetle
1F997 ; fully-qualified # 🦗 cricket
1F577 FE0F ; fully-qualified # 🕷️ spider
1F577 ; unqualified # 🕷 spider
1F578 FE0F ; fully-qualified # 🕸️ spider web
1F578 ; unqualified # 🕸 spider web
1F982 ; fully-qualified # 🦂 scorpion
1F99F ; fully-qualified # 🦟 mosquito
1F9A0 ; fully-qualified # 🦠 microbe
# subgroup: plant-flower
1F490 ; fully-qualified # 💐 bouquet
1F338 ; fully-qualified # 🌸 cherry blossom
1F4AE ; fully-qualified # 💮 white flower
1F3F5 FE0F ; fully-qualified # 🏵️ rosette
1F3F5 ; unqualified # 🏵 rosette
1F339 ; fully-qualified # 🌹 rose
1F940 ; fully-qualified # 🥀 wilted flower
1F33A ; fully-qualified # 🌺 hibiscus
1F33B ; fully-qualified # 🌻 sunflower
1F33C ; fully-qualified # 🌼 blossom
1F337 ; fully-qualified # 🌷 tulip
# subgroup: plant-other
1F331 ; fully-qualified # 🌱 seedling
1F332 ; fully-qualified # 🌲 evergreen tree
1F333 ; fully-qualified # 🌳 deciduous tree
1F334 ; fully-qualified # 🌴 palm tree
1F335 ; fully-qualified # 🌵 cactus
1F33E ; fully-qualified # 🌾 sheaf of rice
1F33F ; fully-qualified # 🌿 herb
2618 FE0F ; fully-qualified # ☘️ shamrock
2618 ; unqualified # ☘ shamrock
1F340 ; fully-qualified # 🍀 four leaf clover
1F341 ; fully-qualified # 🍁 maple leaf
1F342 ; fully-qualified # 🍂 fallen leaf
1F343 ; fully-qualified # 🍃 leaf fluttering in wind
# Animals & Nature subtotal: 133
# Animals & Nature subtotal: 133 w/o modifiers
# group: Food & Drink
# subgroup: food-fruit
1F347 ; fully-qualified # 🍇 grapes
1F348 ; fully-qualified # 🍈 melon
1F349 ; fully-qualified # 🍉 watermelon
1F34A ; fully-qualified # 🍊 tangerine
1F34B ; fully-qualified # 🍋 lemon
1F34C ; fully-qualified # 🍌 banana
1F34D ; fully-qualified # 🍍 pineapple
1F96D ; fully-qualified # 🥭 mango
1F34E ; fully-qualified # 🍎 red apple
1F34F ; fully-qualified # 🍏 green apple
1F350 ; fully-qualified # 🍐 pear
1F351 ; fully-qualified # 🍑 peach
1F352 ; fully-qualified # 🍒 cherries
1F353 ; fully-qualified # 🍓 strawberry
1F95D ; fully-qualified # 🥝 kiwi fruit
1F345 ; fully-qualified # 🍅 tomato
1F965 ; fully-qualified # 🥥 coconut
# subgroup: food-vegetable
1F951 ; fully-qualified # 🥑 avocado
1F346 ; fully-qualified # 🍆 eggplant
1F954 ; fully-qualified # 🥔 potato
1F955 ; fully-qualified # 🥕 carrot
1F33D ; fully-qualified # 🌽 ear of corn
1F336 FE0F ; fully-qualified # 🌶️ hot pepper
1F336 ; unqualified # 🌶 hot pepper
1F952 ; fully-qualified # 🥒 cucumber
1F96C ; fully-qualified # 🥬 leafy green
1F966 ; fully-qualified # 🥦 broccoli
1F9C4 ; fully-qualified # 🧄 garlic
1F9C5 ; fully-qualified # 🧅 onion
1F344 ; fully-qualified # 🍄 mushroom
1F95C ; fully-qualified # 🥜 peanuts
1F330 ; fully-qualified # 🌰 chestnut
# subgroup: food-prepared
1F35E ; fully-qualified # 🍞 bread
1F950 ; fully-qualified # 🥐 croissant
1F956 ; fully-qualified # 🥖 baguette bread
1F968 ; fully-qualified # 🥨 pretzel
1F96F ; fully-qualified # 🥯 bagel
1F95E ; fully-qualified # 🥞 pancakes
1F9C7 ; fully-qualified # 🧇 waffle
1F9C0 ; fully-qualified # 🧀 cheese wedge
1F356 ; fully-qualified # 🍖 meat on bone
1F357 ; fully-qualified # 🍗 poultry leg
1F969 ; fully-qualified # 🥩 cut of meat
1F953 ; fully-qualified # 🥓 bacon
1F354 ; fully-qualified # 🍔 hamburger
1F35F ; fully-qualified # 🍟 french fries
1F355 ; fully-qualified # 🍕 pizza
1F32D ; fully-qualified # 🌭 hot dog
1F96A ; fully-qualified # 🥪 sandwich
1F32E ; fully-qualified # 🌮 taco
1F32F ; fully-qualified # 🌯 burrito
1F959 ; fully-qualified # 🥙 stuffed flatbread
1F9C6 ; fully-qualified # 🧆 falafel
1F95A ; fully-qualified # 🥚 egg
1F373 ; fully-qualified # 🍳 cooking
1F958 ; fully-qualified # 🥘 shallow pan of food
1F372 ; fully-qualified # 🍲 pot of food
1F963 ; fully-qualified # 🥣 bowl with spoon
1F957 ; fully-qualified # 🥗 green salad
1F37F ; fully-qualified # 🍿 popcorn
1F9C8 ; fully-qualified # 🧈 butter
1F9C2 ; fully-qualified # 🧂 salt
1F96B ; fully-qualified # 🥫 canned food
# subgroup: food-asian
1F371 ; fully-qualified # 🍱 bento box
1F358 ; fully-qualified # 🍘 rice cracker
1F359 ; fully-qualified # 🍙 rice ball
1F35A ; fully-qualified # 🍚 cooked rice
1F35B ; fully-qualified # 🍛 curry rice
1F35C ; fully-qualified # 🍜 steaming bowl
1F35D ; fully-qualified # 🍝 spaghetti
1F360 ; fully-qualified # 🍠 roasted sweet potato
1F362 ; fully-qualified # 🍢 oden
1F363 ; fully-qualified # 🍣 sushi
1F364 ; fully-qualified # 🍤 fried shrimp
1F365 ; fully-qualified # 🍥 fish cake with swirl
1F96E ; fully-qualified # 🥮 moon cake
1F361 ; fully-qualified # 🍡 dango
1F95F ; fully-qualified # 🥟 dumpling
1F960 ; fully-qualified # 🥠 fortune cookie
1F961 ; fully-qualified # 🥡 takeout box
# subgroup: food-marine
1F980 ; fully-qualified # 🦀 crab
1F99E ; fully-qualified # 🦞 lobster
1F990 ; fully-qualified # 🦐 shrimp
1F991 ; fully-qualified # 🦑 squid
1F9AA ; fully-qualified # 🦪 oyster
# subgroup: food-sweet
1F366 ; fully-qualified # 🍦 soft ice cream
1F367 ; fully-qualified # 🍧 shaved ice
1F368 ; fully-qualified # 🍨 ice cream
1F369 ; fully-qualified # 🍩 doughnut
1F36A ; fully-qualified # 🍪 cookie
1F382 ; fully-qualified # 🎂 birthday cake
1F370 ; fully-qualified # 🍰 shortcake
1F9C1 ; fully-qualified # 🧁 cupcake
1F967 ; fully-qualified # 🥧 pie
1F36B ; fully-qualified # 🍫 chocolate bar
1F36C ; fully-qualified # 🍬 candy
1F36D ; fully-qualified # 🍭 lollipop
1F36E ; fully-qualified # 🍮 custard
1F36F ; fully-qualified # 🍯 honey pot
# subgroup: drink
1F37C ; fully-qualified # 🍼 baby bottle
1F95B ; fully-qualified # 🥛 glass of milk
2615 ; fully-qualified # ☕ hot beverage
1F375 ; fully-qualified # 🍵 teacup without handle
1F376 ; fully-qualified # 🍶 sake
1F37E ; fully-qualified # 🍾 bottle with popping cork
1F377 ; fully-qualified # 🍷 wine glass
1F378 ; fully-qualified # 🍸 cocktail glass
1F379 ; fully-qualified # 🍹 tropical drink
1F37A ; fully-qualified # 🍺 beer mug
1F37B ; fully-qualified # 🍻 clinking beer mugs
1F942 ; fully-qualified # 🥂 clinking glasses
1F943 ; fully-qualified # 🥃 tumbler glass
1F964 ; fully-qualified # 🥤 cup with straw
1F9C3 ; fully-qualified # 🧃 beverage box
1F9C9 ; fully-qualified # 🧉 mate
1F9CA ; fully-qualified # 🧊 ice cube
# subgroup: dishware
1F962 ; fully-qualified # 🥢 chopsticks
1F37D FE0F ; fully-qualified # 🍽️ fork and knife with plate
1F37D ; unqualified # 🍽 fork and knife with plate
1F374 ; fully-qualified # 🍴 fork and knife
1F944 ; fully-qualified # 🥄 spoon
1F52A ; fully-qualified # 🔪 kitchen knife
1F3FA ; fully-qualified # 🏺 amphora
# Food & Drink subtotal: 123
# Food & Drink subtotal: 123 w/o modifiers
# group: Travel & Places
# subgroup: place-map
1F30D ; fully-qualified # 🌍 globe showing Europe-Africa
1F30E ; fully-qualified # 🌎 globe showing Americas
1F30F ; fully-qualified # 🌏 globe showing Asia-Australia
1F310 ; fully-qualified # 🌐 globe with meridians
1F5FA FE0F ; fully-qualified # 🗺️ world map
1F5FA ; unqualified # 🗺 world map
1F5FE ; fully-qualified # 🗾 map of Japan
1F9ED ; fully-qualified # 🧭 compass
# subgroup: place-geographic
1F3D4 FE0F ; fully-qualified # 🏔️ snow-capped mountain
1F3D4 ; unqualified # 🏔 snow-capped mountain
26F0 FE0F ; fully-qualified # ⛰️ mountain
26F0 ; unqualified # ⛰ mountain
1F30B ; fully-qualified # 🌋 volcano
1F5FB ; fully-qualified # 🗻 mount fuji
1F3D5 FE0F ; fully-qualified # 🏕️ camping
1F3D5 ; unqualified # 🏕 camping
1F3D6 FE0F ; fully-qualified # 🏖️ beach with umbrella
1F3D6 ; unqualified # 🏖 beach with umbrella
1F3DC FE0F ; fully-qualified # 🏜️ desert
1F3DC ; unqualified # 🏜 desert
1F3DD FE0F ; fully-qualified # 🏝️ desert island
1F3DD ; unqualified # 🏝 desert island
1F3DE FE0F ; fully-qualified # 🏞️ national park
1F3DE ; unqualified # 🏞 national park
# subgroup: place-building
1F3DF FE0F ; fully-qualified # 🏟️ stadium
1F3DF ; unqualified # 🏟 stadium
1F3DB FE0F ; fully-qualified # 🏛️ classical building
1F3DB ; unqualified # 🏛 classical building
1F3D7 FE0F ; fully-qualified # 🏗️ building construction
1F3D7 ; unqualified # 🏗 building construction
1F9F1 ; fully-qualified # 🧱 brick
1F3D8 FE0F ; fully-qualified # 🏘️ houses
1F3D8 ; unqualified # 🏘 houses
1F3DA FE0F ; fully-qualified # 🏚️ derelict house
1F3DA ; unqualified # 🏚 derelict house
1F3E0 ; fully-qualified # 🏠 house
1F3E1 ; fully-qualified # 🏡 house with garden
1F3E2 ; fully-qualified # 🏢 office building
1F3E3 ; fully-qualified # 🏣 Japanese post office
1F3E4 ; fully-qualified # 🏤 post office
1F3E5 ; fully-qualified # 🏥 hospital
1F3E6 ; fully-qualified # 🏦 bank
1F3E8 ; fully-qualified # 🏨 hotel
1F3E9 ; fully-qualified # 🏩 love hotel
1F3EA ; fully-qualified # 🏪 convenience store
1F3EB ; fully-qualified # 🏫 school
1F3EC ; fully-qualified # 🏬 department store
1F3ED ; fully-qualified # 🏭 factory
1F3EF ; fully-qualified # 🏯 Japanese castle
1F3F0 ; fully-qualified # 🏰 castle
1F492 ; fully-qualified # 💒 wedding
1F5FC ; fully-qualified # 🗼 Tokyo tower
1F5FD ; fully-qualified # 🗽 Statue of Liberty
# subgroup: place-religious
26EA ; fully-qualified # ⛪ church
1F54C ; fully-qualified # 🕌 mosque
1F6D5 ; fully-qualified # 🛕 hindu temple
1F54D ; fully-qualified # 🕍 synagogue
26E9 FE0F ; fully-qualified # ⛩️ shinto shrine
26E9 ; unqualified # ⛩ shinto shrine
1F54B ; fully-qualified # 🕋 kaaba
# subgroup: place-other
26F2 ; fully-qualified # ⛲ fountain
26FA ; fully-qualified # ⛺ tent
1F301 ; fully-qualified # 🌁 foggy
1F303 ; fully-qualified # 🌃 night with stars
1F3D9 FE0F ; fully-qualified # 🏙️ cityscape
1F3D9 ; unqualified # 🏙 cityscape
1F304 ; fully-qualified # 🌄 sunrise over mountains
1F305 ; fully-qualified # 🌅 sunrise
1F306 ; fully-qualified # 🌆 cityscape at dusk
1F307 ; fully-qualified # 🌇 sunset
1F309 ; fully-qualified # 🌉 bridge at night
2668 FE0F ; fully-qualified # ♨️ hot springs
2668 ; unqualified # ♨ hot springs
1F3A0 ; fully-qualified # 🎠 carousel horse
1F3A1 ; fully-qualified # 🎡 ferris wheel
1F3A2 ; fully-qualified # 🎢 roller coaster
1F488 ; fully-qualified # 💈 barber pole
1F3AA ; fully-qualified # 🎪 circus tent
# subgroup: transport-ground
1F682 ; fully-qualified # 🚂 locomotive
1F683 ; fully-qualified # 🚃 railway car
1F684 ; fully-qualified # 🚄 high-speed train
1F685 ; fully-qualified # 🚅 bullet train
1F686 ; fully-qualified # 🚆 train
1F687 ; fully-qualified # 🚇 metro
1F688 ; fully-qualified # 🚈 light rail
1F689 ; fully-qualified # 🚉 station
1F68A ; fully-qualified # 🚊 tram
1F69D ; fully-qualified # 🚝 monorail
1F69E ; fully-qualified # 🚞 mountain railway
1F68B ; fully-qualified # 🚋 tram car
1F68C ; fully-qualified # 🚌 bus
1F68D ; fully-qualified # 🚍 oncoming bus
1F68E ; fully-qualified # 🚎 trolleybus
1F690 ; fully-qualified # 🚐 minibus
1F691 ; fully-qualified # 🚑 ambulance
1F692 ; fully-qualified # 🚒 fire engine
1F693 ; fully-qualified # 🚓 police car
1F694 ; fully-qualified # 🚔 oncoming police car
1F695 ; fully-qualified # 🚕 taxi
1F696 ; fully-qualified # 🚖 oncoming taxi
1F697 ; fully-qualified # 🚗 automobile
1F698 ; fully-qualified # 🚘 oncoming automobile
1F699 ; fully-qualified # 🚙 sport utility vehicle
1F69A ; fully-qualified # 🚚 delivery truck
1F69B ; fully-qualified # 🚛 articulated lorry
1F69C ; fully-qualified # 🚜 tractor
1F3CE FE0F ; fully-qualified # 🏎️ racing car
1F3CE ; unqualified # 🏎 racing car
1F3CD FE0F ; fully-qualified # 🏍️ motorcycle
1F3CD ; unqualified # 🏍 motorcycle
1F6F5 ; fully-qualified # 🛵 motor scooter
1F9BD ; fully-qualified # 🦽 manual wheelchair
1F9BC ; fully-qualified # 🦼 motorized wheelchair
1F6FA ; fully-qualified # 🛺 auto rickshaw
1F6B2 ; fully-qualified # 🚲 bicycle
1F6F4 ; fully-qualified # 🛴 kick scooter
1F6F9 ; fully-qualified # 🛹 skateboard
1F68F ; fully-qualified # 🚏 bus stop
1F6E3 FE0F ; fully-qualified # 🛣️ motorway
1F6E3 ; unqualified # 🛣 motorway
1F6E4 FE0F ; fully-qualified # 🛤️ railway track
1F6E4 ; unqualified # 🛤 railway track
1F6E2 FE0F ; fully-qualified # 🛢️ oil drum
1F6E2 ; unqualified # 🛢 oil drum
26FD ; fully-qualified # ⛽ fuel pump
1F6A8 ; fully-qualified # 🚨 police car light
1F6A5 ; fully-qualified # 🚥 horizontal traffic light
1F6A6 ; fully-qualified # 🚦 vertical traffic light
1F6D1 ; fully-qualified # 🛑 stop sign
1F6A7 ; fully-qualified # 🚧 construction
# subgroup: transport-water
2693 ; fully-qualified # ⚓ anchor
26F5 ; fully-qualified # ⛵ sailboat
1F6F6 ; fully-qualified # 🛶 canoe
1F6A4 ; fully-qualified # 🚤 speedboat
1F6F3 FE0F ; fully-qualified # 🛳️ passenger ship
1F6F3 ; unqualified # 🛳 passenger ship
26F4 FE0F ; fully-qualified # ⛴️ ferry
26F4 ; unqualified # ⛴ ferry
1F6E5 FE0F ; fully-qualified # 🛥️ motor boat
1F6E5 ; unqualified # 🛥 motor boat
1F6A2 ; fully-qualified # 🚢 ship
# subgroup: transport-air
2708 FE0F ; fully-qualified # ✈️ airplane
2708 ; unqualified # ✈ airplane
1F6E9 FE0F ; fully-qualified # 🛩️ small airplane
1F6E9 ; unqualified # 🛩 small airplane
1F6EB ; fully-qualified # 🛫 airplane departure
1F6EC ; fully-qualified # 🛬 airplane arrival
1FA82 ; fully-qualified # 🪂 parachute
1F4BA ; fully-qualified # 💺 seat
1F681 ; fully-qualified # 🚁 helicopter
1F69F ; fully-qualified # 🚟 suspension railway
1F6A0 ; fully-qualified # 🚠 mountain cableway
1F6A1 ; fully-qualified # 🚡 aerial tramway
1F6F0 FE0F ; fully-qualified # 🛰️ satellite
1F6F0 ; unqualified # 🛰 satellite
1F680 ; fully-qualified # 🚀 rocket
1F6F8 ; fully-qualified # 🛸 flying saucer
# subgroup: hotel
1F6CE FE0F ; fully-qualified # 🛎️ bellhop bell
1F6CE ; unqualified # 🛎 bellhop bell
1F9F3 ; fully-qualified # 🧳 luggage
# subgroup: time
231B ; fully-qualified # ⌛ hourglass done
23F3 ; fully-qualified # ⏳ hourglass not done
231A ; fully-qualified # ⌚ watch
23F0 ; fully-qualified # ⏰ alarm clock
23F1 FE0F ; fully-qualified # ⏱️ stopwatch
23F1 ; unqualified # ⏱ stopwatch
23F2 FE0F ; fully-qualified # ⏲️ timer clock
23F2 ; unqualified # ⏲ timer clock
1F570 FE0F ; fully-qualified # 🕰️ mantelpiece clock
1F570 ; unqualified # 🕰 mantelpiece clock
1F55B ; fully-qualified # 🕛 twelve oclock
1F567 ; fully-qualified # 🕧 twelve-thirty
1F550 ; fully-qualified # 🕐 one oclock
1F55C ; fully-qualified # 🕜 one-thirty
1F551 ; fully-qualified # 🕑 two oclock
1F55D ; fully-qualified # 🕝 two-thirty
1F552 ; fully-qualified # 🕒 three oclock
1F55E ; fully-qualified # 🕞 three-thirty
1F553 ; fully-qualified # 🕓 four oclock
1F55F ; fully-qualified # 🕟 four-thirty
1F554 ; fully-qualified # 🕔 five oclock
1F560 ; fully-qualified # 🕠 five-thirty
1F555 ; fully-qualified # 🕕 six oclock
1F561 ; fully-qualified # 🕡 six-thirty
1F556 ; fully-qualified # 🕖 seven oclock
1F562 ; fully-qualified # 🕢 seven-thirty
1F557 ; fully-qualified # 🕗 eight oclock
1F563 ; fully-qualified # 🕣 eight-thirty
1F558 ; fully-qualified # 🕘 nine oclock
1F564 ; fully-qualified # 🕤 nine-thirty
1F559 ; fully-qualified # 🕙 ten oclock
1F565 ; fully-qualified # 🕥 ten-thirty
1F55A ; fully-qualified # 🕚 eleven oclock
1F566 ; fully-qualified # 🕦 eleven-thirty
# subgroup: sky & weather
1F311 ; fully-qualified # 🌑 new moon
1F312 ; fully-qualified # 🌒 waxing crescent moon
1F313 ; fully-qualified # 🌓 first quarter moon
1F314 ; fully-qualified # 🌔 waxing gibbous moon
1F315 ; fully-qualified # 🌕 full moon
1F316 ; fully-qualified # 🌖 waning gibbous moon
1F317 ; fully-qualified # 🌗 last quarter moon
1F318 ; fully-qualified # 🌘 waning crescent moon
1F319 ; fully-qualified # 🌙 crescent moon
1F31A ; fully-qualified # 🌚 new moon face
1F31B ; fully-qualified # 🌛 first quarter moon face
1F31C ; fully-qualified # 🌜 last quarter moon face
1F321 FE0F ; fully-qualified # 🌡️ thermometer
1F321 ; unqualified # 🌡 thermometer
2600 FE0F ; fully-qualified # ☀️ sun
2600 ; unqualified # ☀ sun
1F31D ; fully-qualified # 🌝 full moon face
1F31E ; fully-qualified # 🌞 sun with face
1FA90 ; fully-qualified # 🪐 ringed planet
2B50 ; fully-qualified # ⭐ star
1F31F ; fully-qualified # 🌟 glowing star
1F320 ; fully-qualified # 🌠 shooting star
1F30C ; fully-qualified # 🌌 milky way
2601 FE0F ; fully-qualified # ☁️ cloud
2601 ; unqualified # ☁ cloud
26C5 ; fully-qualified # ⛅ sun behind cloud
26C8 FE0F ; fully-qualified # ⛈️ cloud with lightning and rain
26C8 ; unqualified # ⛈ cloud with lightning and rain
1F324 FE0F ; fully-qualified # 🌤️ sun behind small cloud
1F324 ; unqualified # 🌤 sun behind small cloud
1F325 FE0F ; fully-qualified # 🌥️ sun behind large cloud
1F325 ; unqualified # 🌥 sun behind large cloud
1F326 FE0F ; fully-qualified # 🌦️ sun behind rain cloud
1F326 ; unqualified # 🌦 sun behind rain cloud
1F327 FE0F ; fully-qualified # 🌧️ cloud with rain
1F327 ; unqualified # 🌧 cloud with rain
1F328 FE0F ; fully-qualified # 🌨️ cloud with snow
1F328 ; unqualified # 🌨 cloud with snow
1F329 FE0F ; fully-qualified # 🌩️ cloud with lightning
1F329 ; unqualified # 🌩 cloud with lightning
1F32A FE0F ; fully-qualified # 🌪️ tornado
1F32A ; unqualified # 🌪 tornado
1F32B FE0F ; fully-qualified # 🌫️ fog
1F32B ; unqualified # 🌫 fog
1F32C FE0F ; fully-qualified # 🌬️ wind face
1F32C ; unqualified # 🌬 wind face
1F300 ; fully-qualified # 🌀 cyclone
1F308 ; fully-qualified # 🌈 rainbow
1F302 ; fully-qualified # 🌂 closed umbrella
2602 FE0F ; fully-qualified # ☂️ umbrella
2602 ; unqualified # ☂ umbrella
2614 ; fully-qualified # ☔ umbrella with rain drops
26F1 FE0F ; fully-qualified # ⛱️ umbrella on ground
26F1 ; unqualified # ⛱ umbrella on ground
26A1 ; fully-qualified # ⚡ high voltage
2744 FE0F ; fully-qualified # ❄️ snowflake
2744 ; unqualified # ❄ snowflake
2603 FE0F ; fully-qualified # ☃️ snowman
2603 ; unqualified # ☃ snowman
26C4 ; fully-qualified # ⛄ snowman without snow
2604 FE0F ; fully-qualified # ☄️ comet
2604 ; unqualified # ☄ comet
1F525 ; fully-qualified # 🔥 fire
1F4A7 ; fully-qualified # 💧 droplet
1F30A ; fully-qualified # 🌊 water wave
# Travel & Places subtotal: 259
# Travel & Places subtotal: 259 w/o modifiers
# group: Activities
# subgroup: event
1F383 ; fully-qualified # 🎃 jack-o-lantern
1F384 ; fully-qualified # 🎄 Christmas tree
1F386 ; fully-qualified # 🎆 fireworks
1F387 ; fully-qualified # 🎇 sparkler
1F9E8 ; fully-qualified # 🧨 firecracker
2728 ; fully-qualified # ✨ sparkles
1F388 ; fully-qualified # 🎈 balloon
1F389 ; fully-qualified # 🎉 party popper
1F38A ; fully-qualified # 🎊 confetti ball
1F38B ; fully-qualified # 🎋 tanabata tree
1F38D ; fully-qualified # 🎍 pine decoration
1F38E ; fully-qualified # 🎎 Japanese dolls
1F38F ; fully-qualified # 🎏 carp streamer
1F390 ; fully-qualified # 🎐 wind chime
1F391 ; fully-qualified # 🎑 moon viewing ceremony
1F9E7 ; fully-qualified # 🧧 red envelope
1F380 ; fully-qualified # 🎀 ribbon
1F381 ; fully-qualified # 🎁 wrapped gift
1F397 FE0F ; fully-qualified # 🎗️ reminder ribbon
1F397 ; unqualified # 🎗 reminder ribbon
1F39F FE0F ; fully-qualified # 🎟️ admission tickets
1F39F ; unqualified # 🎟 admission tickets
1F3AB ; fully-qualified # 🎫 ticket
# subgroup: award-medal
1F396 FE0F ; fully-qualified # 🎖️ military medal
1F396 ; unqualified # 🎖 military medal
1F3C6 ; fully-qualified # 🏆 trophy
1F3C5 ; fully-qualified # 🏅 sports medal
1F947 ; fully-qualified # 🥇 1st place medal
1F948 ; fully-qualified # 🥈 2nd place medal
1F949 ; fully-qualified # 🥉 3rd place medal
# subgroup: sport
26BD ; fully-qualified # ⚽ soccer ball
26BE ; fully-qualified # ⚾ baseball
1F94E ; fully-qualified # 🥎 softball
1F3C0 ; fully-qualified # 🏀 basketball
1F3D0 ; fully-qualified # 🏐 volleyball
1F3C8 ; fully-qualified # 🏈 american football
1F3C9 ; fully-qualified # 🏉 rugby football
1F3BE ; fully-qualified # 🎾 tennis
1F94F ; fully-qualified # 🥏 flying disc
1F3B3 ; fully-qualified # 🎳 bowling
1F3CF ; fully-qualified # 🏏 cricket game
1F3D1 ; fully-qualified # 🏑 field hockey
1F3D2 ; fully-qualified # 🏒 ice hockey
1F94D ; fully-qualified # 🥍 lacrosse
1F3D3 ; fully-qualified # 🏓 ping pong
1F3F8 ; fully-qualified # 🏸 badminton
1F94A ; fully-qualified # 🥊 boxing glove
1F94B ; fully-qualified # 🥋 martial arts uniform
1F945 ; fully-qualified # 🥅 goal net
26F3 ; fully-qualified # ⛳ flag in hole
26F8 FE0F ; fully-qualified # ⛸️ ice skate
26F8 ; unqualified # ⛸ ice skate
1F3A3 ; fully-qualified # 🎣 fishing pole
1F93F ; fully-qualified # 🤿 diving mask
1F3BD ; fully-qualified # 🎽 running shirt
1F3BF ; fully-qualified # 🎿 skis
1F6F7 ; fully-qualified # 🛷 sled
1F94C ; fully-qualified # 🥌 curling stone
# subgroup: game
1F3AF ; fully-qualified # 🎯 direct hit
1FA80 ; fully-qualified # 🪀 yo-yo
1FA81 ; fully-qualified # 🪁 kite
1F3B1 ; fully-qualified # 🎱 pool 8 ball
1F52E ; fully-qualified # 🔮 crystal ball
1F9FF ; fully-qualified # 🧿 nazar amulet
1F3AE ; fully-qualified # 🎮 video game
1F579 FE0F ; fully-qualified # 🕹️ joystick
1F579 ; unqualified # 🕹 joystick
1F3B0 ; fully-qualified # 🎰 slot machine
1F3B2 ; fully-qualified # 🎲 game die
1F9E9 ; fully-qualified # 🧩 puzzle piece
1F9F8 ; fully-qualified # 🧸 teddy bear
2660 FE0F ; fully-qualified # ♠️ spade suit
2660 ; unqualified # ♠ spade suit
2665 FE0F ; fully-qualified # ♥️ heart suit
2665 ; unqualified # ♥ heart suit
2666 FE0F ; fully-qualified # ♦️ diamond suit
2666 ; unqualified # ♦ diamond suit
2663 FE0F ; fully-qualified # ♣️ club suit
2663 ; unqualified # ♣ club suit
265F FE0F ; fully-qualified # ♟️ chess pawn
265F ; unqualified # ♟ chess pawn
1F0CF ; fully-qualified # 🃏 joker
1F004 ; fully-qualified # 🀄 mahjong red dragon
1F3B4 ; fully-qualified # 🎴 flower playing cards
# subgroup: arts & crafts
1F3AD ; fully-qualified # 🎭 performing arts
1F5BC FE0F ; fully-qualified # 🖼️ framed picture
1F5BC ; unqualified # 🖼 framed picture
1F3A8 ; fully-qualified # 🎨 artist palette
1F9F5 ; fully-qualified # 🧵 thread
1F9F6 ; fully-qualified # 🧶 yarn
# Activities subtotal: 90
# Activities subtotal: 90 w/o modifiers
# group: Objects
# subgroup: clothing
1F453 ; fully-qualified # 👓 glasses
1F576 FE0F ; fully-qualified # 🕶️ sunglasses
1F576 ; unqualified # 🕶 sunglasses
1F97D ; fully-qualified # 🥽 goggles
1F97C ; fully-qualified # 🥼 lab coat
1F9BA ; fully-qualified # 🦺 safety vest
1F454 ; fully-qualified # 👔 necktie
1F455 ; fully-qualified # 👕 t-shirt
1F456 ; fully-qualified # 👖 jeans
1F9E3 ; fully-qualified # 🧣 scarf
1F9E4 ; fully-qualified # 🧤 gloves
1F9E5 ; fully-qualified # 🧥 coat
1F9E6 ; fully-qualified # 🧦 socks
1F457 ; fully-qualified # 👗 dress
1F458 ; fully-qualified # 👘 kimono
1F97B ; fully-qualified # 🥻 sari
1FA71 ; fully-qualified # 🩱 one-piece swimsuit
1FA72 ; fully-qualified # 🩲 swim brief
1FA73 ; fully-qualified # 🩳 shorts
1F459 ; fully-qualified # 👙 bikini
1F45A ; fully-qualified # 👚 womans clothes
1F45B ; fully-qualified # 👛 purse
1F45C ; fully-qualified # 👜 handbag
1F45D ; fully-qualified # 👝 clutch bag
1F6CD FE0F ; fully-qualified # 🛍️ shopping bags
1F6CD ; unqualified # 🛍 shopping bags
1F392 ; fully-qualified # 🎒 backpack
1F45E ; fully-qualified # 👞 mans shoe
1F45F ; fully-qualified # 👟 running shoe
1F97E ; fully-qualified # 🥾 hiking boot
1F97F ; fully-qualified # 🥿 flat shoe
1F460 ; fully-qualified # 👠 high-heeled shoe
1F461 ; fully-qualified # 👡 womans sandal
1FA70 ; fully-qualified # 🩰 ballet shoes
1F462 ; fully-qualified # 👢 womans boot
1F451 ; fully-qualified # 👑 crown
1F452 ; fully-qualified # 👒 womans hat
1F3A9 ; fully-qualified # 🎩 top hat
1F393 ; fully-qualified # 🎓 graduation cap
1F9E2 ; fully-qualified # 🧢 billed cap
26D1 FE0F ; fully-qualified # ⛑️ rescue workers helmet
26D1 ; unqualified # ⛑ rescue workers helmet
1F4FF ; fully-qualified # 📿 prayer beads
1F484 ; fully-qualified # 💄 lipstick
1F48D ; fully-qualified # 💍 ring
1F48E ; fully-qualified # 💎 gem stone
# subgroup: sound
1F507 ; fully-qualified # 🔇 muted speaker
1F508 ; fully-qualified # 🔈 speaker low volume
1F509 ; fully-qualified # 🔉 speaker medium volume
1F50A ; fully-qualified # 🔊 speaker high volume
1F4E2 ; fully-qualified # 📢 loudspeaker
1F4E3 ; fully-qualified # 📣 megaphone
1F4EF ; fully-qualified # 📯 postal horn
1F514 ; fully-qualified # 🔔 bell
1F515 ; fully-qualified # 🔕 bell with slash
# subgroup: music
1F3BC ; fully-qualified # 🎼 musical score
1F3B5 ; fully-qualified # 🎵 musical note
1F3B6 ; fully-qualified # 🎶 musical notes
1F399 FE0F ; fully-qualified # 🎙️ studio microphone
1F399 ; unqualified # 🎙 studio microphone
1F39A FE0F ; fully-qualified # 🎚️ level slider
1F39A ; unqualified # 🎚 level slider
1F39B FE0F ; fully-qualified # 🎛️ control knobs
1F39B ; unqualified # 🎛 control knobs
1F3A4 ; fully-qualified # 🎤 microphone
1F3A7 ; fully-qualified # 🎧 headphone
1F4FB ; fully-qualified # 📻 radio
# subgroup: musical-instrument
1F3B7 ; fully-qualified # 🎷 saxophone
1F3B8 ; fully-qualified # 🎸 guitar
1F3B9 ; fully-qualified # 🎹 musical keyboard
1F3BA ; fully-qualified # 🎺 trumpet
1F3BB ; fully-qualified # 🎻 violin
1FA95 ; fully-qualified # 🪕 banjo
1F941 ; fully-qualified # 🥁 drum
# subgroup: phone
1F4F1 ; fully-qualified # 📱 mobile phone
1F4F2 ; fully-qualified # 📲 mobile phone with arrow
260E FE0F ; fully-qualified # ☎️ telephone
260E ; unqualified # ☎ telephone
1F4DE ; fully-qualified # 📞 telephone receiver
1F4DF ; fully-qualified # 📟 pager
1F4E0 ; fully-qualified # 📠 fax machine
# subgroup: computer
1F50B ; fully-qualified # 🔋 battery
1F50C ; fully-qualified # 🔌 electric plug
1F4BB ; fully-qualified # 💻 laptop computer
1F5A5 FE0F ; fully-qualified # 🖥️ desktop computer
1F5A5 ; unqualified # 🖥 desktop computer
1F5A8 FE0F ; fully-qualified # 🖨️ printer
1F5A8 ; unqualified # 🖨 printer
2328 FE0F ; fully-qualified # ⌨️ keyboard
2328 ; unqualified # ⌨ keyboard
1F5B1 FE0F ; fully-qualified # 🖱️ computer mouse
1F5B1 ; unqualified # 🖱 computer mouse
1F5B2 FE0F ; fully-qualified # 🖲️ trackball
1F5B2 ; unqualified # 🖲 trackball
1F4BD ; fully-qualified # 💽 computer disk
1F4BE ; fully-qualified # 💾 floppy disk
1F4BF ; fully-qualified # 💿 optical disk
1F4C0 ; fully-qualified # 📀 dvd
1F9EE ; fully-qualified # 🧮 abacus
# subgroup: light & video
1F3A5 ; fully-qualified # 🎥 movie camera
1F39E FE0F ; fully-qualified # 🎞️ film frames
1F39E ; unqualified # 🎞 film frames
1F4FD FE0F ; fully-qualified # 📽️ film projector
1F4FD ; unqualified # 📽 film projector
1F3AC ; fully-qualified # 🎬 clapper board
1F4FA ; fully-qualified # 📺 television
1F4F7 ; fully-qualified # 📷 camera
1F4F8 ; fully-qualified # 📸 camera with flash
1F4F9 ; fully-qualified # 📹 video camera
1F4FC ; fully-qualified # 📼 videocassette
1F50D ; fully-qualified # 🔍 magnifying glass tilted left
1F50E ; fully-qualified # 🔎 magnifying glass tilted right
1F56F FE0F ; fully-qualified # 🕯️ candle
1F56F ; unqualified # 🕯 candle
1F4A1 ; fully-qualified # 💡 light bulb
1F526 ; fully-qualified # 🔦 flashlight
1F3EE ; fully-qualified # 🏮 red paper lantern
1FA94 ; fully-qualified # 🪔 diya lamp
# subgroup: book-paper
1F4D4 ; fully-qualified # 📔 notebook with decorative cover
1F4D5 ; fully-qualified # 📕 closed book
1F4D6 ; fully-qualified # 📖 open book
1F4D7 ; fully-qualified # 📗 green book
1F4D8 ; fully-qualified # 📘 blue book
1F4D9 ; fully-qualified # 📙 orange book
1F4DA ; fully-qualified # 📚 books
1F4D3 ; fully-qualified # 📓 notebook
1F4D2 ; fully-qualified # 📒 ledger
1F4C3 ; fully-qualified # 📃 page with curl
1F4DC ; fully-qualified # 📜 scroll
1F4C4 ; fully-qualified # 📄 page facing up
1F4F0 ; fully-qualified # 📰 newspaper
1F5DE FE0F ; fully-qualified # 🗞️ rolled-up newspaper
1F5DE ; unqualified # 🗞 rolled-up newspaper
1F4D1 ; fully-qualified # 📑 bookmark tabs
1F516 ; fully-qualified # 🔖 bookmark
1F3F7 FE0F ; fully-qualified # 🏷️ label
1F3F7 ; unqualified # 🏷 label
# subgroup: money
1F4B0 ; fully-qualified # 💰 money bag
1F4B4 ; fully-qualified # 💴 yen banknote
1F4B5 ; fully-qualified # 💵 dollar banknote
1F4B6 ; fully-qualified # 💶 euro banknote
1F4B7 ; fully-qualified # 💷 pound banknote
1F4B8 ; fully-qualified # 💸 money with wings
1F4B3 ; fully-qualified # 💳 credit card
1F9FE ; fully-qualified # 🧾 receipt
1F4B9 ; fully-qualified # 💹 chart increasing with yen
1F4B1 ; fully-qualified # 💱 currency exchange
1F4B2 ; fully-qualified # 💲 heavy dollar sign
# subgroup: mail
2709 FE0F ; fully-qualified # ✉️ envelope
2709 ; unqualified # ✉ envelope
1F4E7 ; fully-qualified # 📧 e-mail
1F4E8 ; fully-qualified # 📨 incoming envelope
1F4E9 ; fully-qualified # 📩 envelope with arrow
1F4E4 ; fully-qualified # 📤 outbox tray
1F4E5 ; fully-qualified # 📥 inbox tray
1F4E6 ; fully-qualified # 📦 package
1F4EB ; fully-qualified # 📫 closed mailbox with raised flag
1F4EA ; fully-qualified # 📪 closed mailbox with lowered flag
1F4EC ; fully-qualified # 📬 open mailbox with raised flag
1F4ED ; fully-qualified # 📭 open mailbox with lowered flag
1F4EE ; fully-qualified # 📮 postbox
1F5F3 FE0F ; fully-qualified # 🗳️ ballot box with ballot
1F5F3 ; unqualified # 🗳 ballot box with ballot
# subgroup: writing
270F FE0F ; fully-qualified # ✏️ pencil
270F ; unqualified # ✏ pencil
2712 FE0F ; fully-qualified # ✒️ black nib
2712 ; unqualified # ✒ black nib
1F58B FE0F ; fully-qualified # 🖋️ fountain pen
1F58B ; unqualified # 🖋 fountain pen
1F58A FE0F ; fully-qualified # 🖊️ pen
1F58A ; unqualified # 🖊 pen
1F58C FE0F ; fully-qualified # 🖌️ paintbrush
1F58C ; unqualified # 🖌 paintbrush
1F58D FE0F ; fully-qualified # 🖍️ crayon
1F58D ; unqualified # 🖍 crayon
1F4DD ; fully-qualified # 📝 memo
# subgroup: office
1F4BC ; fully-qualified # 💼 briefcase
1F4C1 ; fully-qualified # 📁 file folder
1F4C2 ; fully-qualified # 📂 open file folder
1F5C2 FE0F ; fully-qualified # 🗂️ card index dividers
1F5C2 ; unqualified # 🗂 card index dividers
1F4C5 ; fully-qualified # 📅 calendar
1F4C6 ; fully-qualified # 📆 tear-off calendar
1F5D2 FE0F ; fully-qualified # 🗒️ spiral notepad
1F5D2 ; unqualified # 🗒 spiral notepad
1F5D3 FE0F ; fully-qualified # 🗓️ spiral calendar
1F5D3 ; unqualified # 🗓 spiral calendar
1F4C7 ; fully-qualified # 📇 card index
1F4C8 ; fully-qualified # 📈 chart increasing
1F4C9 ; fully-qualified # 📉 chart decreasing
1F4CA ; fully-qualified # 📊 bar chart
1F4CB ; fully-qualified # 📋 clipboard
1F4CC ; fully-qualified # 📌 pushpin
1F4CD ; fully-qualified # 📍 round pushpin
1F4CE ; fully-qualified # 📎 paperclip
1F587 FE0F ; fully-qualified # 🖇️ linked paperclips
1F587 ; unqualified # 🖇 linked paperclips
1F4CF ; fully-qualified # 📏 straight ruler
1F4D0 ; fully-qualified # 📐 triangular ruler
2702 FE0F ; fully-qualified # ✂️ scissors
2702 ; unqualified # ✂ scissors
1F5C3 FE0F ; fully-qualified # 🗃️ card file box
1F5C3 ; unqualified # 🗃 card file box
1F5C4 FE0F ; fully-qualified # 🗄️ file cabinet
1F5C4 ; unqualified # 🗄 file cabinet
1F5D1 FE0F ; fully-qualified # 🗑️ wastebasket
1F5D1 ; unqualified # 🗑 wastebasket
# subgroup: lock
1F512 ; fully-qualified # 🔒 locked
1F513 ; fully-qualified # 🔓 unlocked
1F50F ; fully-qualified # 🔏 locked with pen
1F510 ; fully-qualified # 🔐 locked with key
1F511 ; fully-qualified # 🔑 key
1F5DD FE0F ; fully-qualified # 🗝️ old key
1F5DD ; unqualified # 🗝 old key
# subgroup: tool
1F528 ; fully-qualified # 🔨 hammer
1FA93 ; fully-qualified # 🪓 axe
26CF FE0F ; fully-qualified # ⛏️ pick
26CF ; unqualified # ⛏ pick
2692 FE0F ; fully-qualified # ⚒️ hammer and pick
2692 ; unqualified # ⚒ hammer and pick
1F6E0 FE0F ; fully-qualified # 🛠️ hammer and wrench
1F6E0 ; unqualified # 🛠 hammer and wrench
1F5E1 FE0F ; fully-qualified # 🗡️ dagger
1F5E1 ; unqualified # 🗡 dagger
2694 FE0F ; fully-qualified # ⚔️ crossed swords
2694 ; unqualified # ⚔ crossed swords
1F52B ; fully-qualified # 🔫 pistol
1F3F9 ; fully-qualified # 🏹 bow and arrow
1F6E1 FE0F ; fully-qualified # 🛡️ shield
1F6E1 ; unqualified # 🛡 shield
1F527 ; fully-qualified # 🔧 wrench
1F529 ; fully-qualified # 🔩 nut and bolt
2699 FE0F ; fully-qualified # ⚙️ gear
2699 ; unqualified # ⚙ gear
1F5DC FE0F ; fully-qualified # 🗜️ clamp
1F5DC ; unqualified # 🗜 clamp
2696 FE0F ; fully-qualified # ⚖️ balance scale
2696 ; unqualified # ⚖ balance scale
1F9AF ; fully-qualified # 🦯 probing cane
1F517 ; fully-qualified # 🔗 link
26D3 FE0F ; fully-qualified # ⛓️ chains
26D3 ; unqualified # ⛓ chains
1F9F0 ; fully-qualified # 🧰 toolbox
1F9F2 ; fully-qualified # 🧲 magnet
# subgroup: science
2697 FE0F ; fully-qualified # ⚗️ alembic
2697 ; unqualified # ⚗ alembic
1F9EA ; fully-qualified # 🧪 test tube
1F9EB ; fully-qualified # 🧫 petri dish
1F9EC ; fully-qualified # 🧬 dna
1F52C ; fully-qualified # 🔬 microscope
1F52D ; fully-qualified # 🔭 telescope
1F4E1 ; fully-qualified # 📡 satellite antenna
# subgroup: medical
1F489 ; fully-qualified # 💉 syringe
1FA78 ; fully-qualified # 🩸 drop of blood
1F48A ; fully-qualified # 💊 pill
1FA79 ; fully-qualified # 🩹 adhesive bandage
1FA7A ; fully-qualified # 🩺 stethoscope
# subgroup: household
1F6AA ; fully-qualified # 🚪 door
1F6CF FE0F ; fully-qualified # 🛏️ bed
1F6CF ; unqualified # 🛏 bed
1F6CB FE0F ; fully-qualified # 🛋️ couch and lamp
1F6CB ; unqualified # 🛋 couch and lamp
1FA91 ; fully-qualified # 🪑 chair
1F6BD ; fully-qualified # 🚽 toilet
1F6BF ; fully-qualified # 🚿 shower
1F6C1 ; fully-qualified # 🛁 bathtub
1FA92 ; fully-qualified # 🪒 razor
1F9F4 ; fully-qualified # 🧴 lotion bottle
1F9F7 ; fully-qualified # 🧷 safety pin
1F9F9 ; fully-qualified # 🧹 broom
1F9FA ; fully-qualified # 🧺 basket
1F9FB ; fully-qualified # 🧻 roll of paper
1F9FC ; fully-qualified # 🧼 soap
1F9FD ; fully-qualified # 🧽 sponge
1F9EF ; fully-qualified # 🧯 fire extinguisher
1F6D2 ; fully-qualified # 🛒 shopping cart
# subgroup: other-object
1F6AC ; fully-qualified # 🚬 cigarette
26B0 FE0F ; fully-qualified # ⚰️ coffin
26B0 ; unqualified # ⚰ coffin
26B1 FE0F ; fully-qualified # ⚱️ funeral urn
26B1 ; unqualified # ⚱ funeral urn
1F5FF ; fully-qualified # 🗿 moai
# Objects subtotal: 282
# Objects subtotal: 282 w/o modifiers
# group: Symbols
# subgroup: transport-sign
1F3E7 ; fully-qualified # 🏧 ATM sign
1F6AE ; fully-qualified # 🚮 litter in bin sign
1F6B0 ; fully-qualified # 🚰 potable water
267F ; fully-qualified # ♿ wheelchair symbol
1F6B9 ; fully-qualified # 🚹 mens room
1F6BA ; fully-qualified # 🚺 womens room
1F6BB ; fully-qualified # 🚻 restroom
1F6BC ; fully-qualified # 🚼 baby symbol
1F6BE ; fully-qualified # 🚾 water closet
1F6C2 ; fully-qualified # 🛂 passport control
1F6C3 ; fully-qualified # 🛃 customs
1F6C4 ; fully-qualified # 🛄 baggage claim
1F6C5 ; fully-qualified # 🛅 left luggage
# subgroup: warning
26A0 FE0F ; fully-qualified # ⚠️ warning
26A0 ; unqualified # ⚠ warning
1F6B8 ; fully-qualified # 🚸 children crossing
26D4 ; fully-qualified # ⛔ no entry
1F6AB ; fully-qualified # 🚫 prohibited
1F6B3 ; fully-qualified # 🚳 no bicycles
1F6AD ; fully-qualified # 🚭 no smoking
1F6AF ; fully-qualified # 🚯 no littering
1F6B1 ; fully-qualified # 🚱 non-potable water
1F6B7 ; fully-qualified # 🚷 no pedestrians
1F4F5 ; fully-qualified # 📵 no mobile phones
1F51E ; fully-qualified # 🔞 no one under eighteen
2622 FE0F ; fully-qualified # ☢️ radioactive
2622 ; unqualified # ☢ radioactive
2623 FE0F ; fully-qualified # ☣️ biohazard
2623 ; unqualified # ☣ biohazard
# subgroup: arrow
2B06 FE0F ; fully-qualified # ⬆️ up arrow
2B06 ; unqualified # ⬆ up arrow
2197 FE0F ; fully-qualified # ↗️ up-right arrow
2197 ; unqualified # ↗ up-right arrow
27A1 FE0F ; fully-qualified # ➡️ right arrow
27A1 ; unqualified # ➡ right arrow
2198 FE0F ; fully-qualified # ↘️ down-right arrow
2198 ; unqualified # ↘ down-right arrow
2B07 FE0F ; fully-qualified # ⬇️ down arrow
2B07 ; unqualified # ⬇ down arrow
2199 FE0F ; fully-qualified # ↙️ down-left arrow
2199 ; unqualified # ↙ down-left arrow
2B05 FE0F ; fully-qualified # ⬅️ left arrow
2B05 ; unqualified # ⬅ left arrow
2196 FE0F ; fully-qualified # ↖️ up-left arrow
2196 ; unqualified # ↖ up-left arrow
2195 FE0F ; fully-qualified # ↕️ up-down arrow
2195 ; unqualified # ↕ up-down arrow
2194 FE0F ; fully-qualified # ↔️ left-right arrow
2194 ; unqualified # ↔ left-right arrow
21A9 FE0F ; fully-qualified # ↩️ right arrow curving left
21A9 ; unqualified # ↩ right arrow curving left
21AA FE0F ; fully-qualified # ↪️ left arrow curving right
21AA ; unqualified # ↪ left arrow curving right
2934 FE0F ; fully-qualified # ⤴️ right arrow curving up
2934 ; unqualified # ⤴ right arrow curving up
2935 FE0F ; fully-qualified # ⤵️ right arrow curving down
2935 ; unqualified # ⤵ right arrow curving down
1F503 ; fully-qualified # 🔃 clockwise vertical arrows
1F504 ; fully-qualified # 🔄 counterclockwise arrows button
1F519 ; fully-qualified # 🔙 BACK arrow
1F51A ; fully-qualified # 🔚 END arrow
1F51B ; fully-qualified # 🔛 ON! arrow
1F51C ; fully-qualified # 🔜 SOON arrow
1F51D ; fully-qualified # 🔝 TOP arrow
# subgroup: religion
1F6D0 ; fully-qualified # 🛐 place of worship
269B FE0F ; fully-qualified # ⚛️ atom symbol
269B ; unqualified # ⚛ atom symbol
1F549 FE0F ; fully-qualified # 🕉️ om
1F549 ; unqualified # 🕉 om
2721 FE0F ; fully-qualified # ✡️ star of David
2721 ; unqualified # ✡ star of David
2638 FE0F ; fully-qualified # ☸️ wheel of dharma
2638 ; unqualified # ☸ wheel of dharma
262F FE0F ; fully-qualified # ☯️ yin yang
262F ; unqualified # ☯ yin yang
271D FE0F ; fully-qualified # ✝️ latin cross
271D ; unqualified # ✝ latin cross
2626 FE0F ; fully-qualified # ☦️ orthodox cross
2626 ; unqualified # ☦ orthodox cross
262A FE0F ; fully-qualified # ☪️ star and crescent
262A ; unqualified # ☪ star and crescent
262E FE0F ; fully-qualified # ☮️ peace symbol
262E ; unqualified # ☮ peace symbol
1F54E ; fully-qualified # 🕎 menorah
1F52F ; fully-qualified # 🔯 dotted six-pointed star
# subgroup: zodiac
2648 ; fully-qualified # ♈ Aries
2649 ; fully-qualified # ♉ Taurus
264A ; fully-qualified # ♊ Gemini
264B ; fully-qualified # ♋ Cancer
264C ; fully-qualified # ♌ Leo
264D ; fully-qualified # ♍ Virgo
264E ; fully-qualified # ♎ Libra
264F ; fully-qualified # ♏ Scorpio
2650 ; fully-qualified # ♐ Sagittarius
2651 ; fully-qualified # ♑ Capricorn
2652 ; fully-qualified # ♒ Aquarius
2653 ; fully-qualified # ♓ Pisces
26CE ; fully-qualified # ⛎ Ophiuchus
# subgroup: av-symbol
1F500 ; fully-qualified # 🔀 shuffle tracks button
1F501 ; fully-qualified # 🔁 repeat button
1F502 ; fully-qualified # 🔂 repeat single button
25B6 FE0F ; fully-qualified # ▶️ play button
25B6 ; unqualified # ▶ play button
23E9 ; fully-qualified # ⏩ fast-forward button
23ED FE0F ; fully-qualified # ⏭️ next track button
23ED ; unqualified # ⏭ next track button
23EF FE0F ; fully-qualified # ⏯️ play or pause button
23EF ; unqualified # ⏯ play or pause button
25C0 FE0F ; fully-qualified # ◀️ reverse button
25C0 ; unqualified # ◀ reverse button
23EA ; fully-qualified # ⏪ fast reverse button
23EE FE0F ; fully-qualified # ⏮️ last track button
23EE ; unqualified # ⏮ last track button
1F53C ; fully-qualified # 🔼 upwards button
23EB ; fully-qualified # ⏫ fast up button
1F53D ; fully-qualified # 🔽 downwards button
23EC ; fully-qualified # ⏬ fast down button
23F8 FE0F ; fully-qualified # ⏸️ pause button
23F8 ; unqualified # ⏸ pause button
23F9 FE0F ; fully-qualified # ⏹️ stop button
23F9 ; unqualified # ⏹ stop button
23FA FE0F ; fully-qualified # ⏺️ record button
23FA ; unqualified # ⏺ record button
23CF FE0F ; fully-qualified # ⏏️ eject button
23CF ; unqualified # ⏏ eject button
1F3A6 ; fully-qualified # 🎦 cinema
1F505 ; fully-qualified # 🔅 dim button
1F506 ; fully-qualified # 🔆 bright button
1F4F6 ; fully-qualified # 📶 antenna bars
1F4F3 ; fully-qualified # 📳 vibration mode
1F4F4 ; fully-qualified # 📴 mobile phone off
# subgroup: gender
2640 FE0F ; fully-qualified # ♀️ female sign
2640 ; unqualified # ♀ female sign
2642 FE0F ; fully-qualified # ♂️ male sign
2642 ; unqualified # ♂ male sign
# subgroup: other-symbol
2695 FE0F ; fully-qualified # ⚕️ medical symbol
2695 ; unqualified # ⚕ medical symbol
267E FE0F ; fully-qualified # ♾️ infinity
267E ; unqualified # ♾ infinity
267B FE0F ; fully-qualified # ♻️ recycling symbol
267B ; unqualified # ♻ recycling symbol
269C FE0F ; fully-qualified # ⚜️ fleur-de-lis
269C ; unqualified # ⚜ fleur-de-lis
1F531 ; fully-qualified # 🔱 trident emblem
1F4DB ; fully-qualified # 📛 name badge
1F530 ; fully-qualified # 🔰 Japanese symbol for beginner
2B55 ; fully-qualified # ⭕ hollow red circle
2705 ; fully-qualified # ✅ check mark button
2611 FE0F ; fully-qualified # ☑️ check box with check
2611 ; unqualified # ☑ check box with check
2714 FE0F ; fully-qualified # ✔️ check mark
2714 ; unqualified # ✔ check mark
2716 FE0F ; fully-qualified # ✖️ multiplication sign
2716 ; unqualified # ✖ multiplication sign
274C ; fully-qualified # ❌ cross mark
274E ; fully-qualified # ❎ cross mark button
2795 ; fully-qualified # plus sign
2796 ; fully-qualified # minus sign
2797 ; fully-qualified # ➗ division sign
27B0 ; fully-qualified # ➰ curly loop
27BF ; fully-qualified # ➿ double curly loop
303D FE0F ; fully-qualified # 〽️ part alternation mark
303D ; unqualified # 〽 part alternation mark
2733 FE0F ; fully-qualified # ✳️ eight-spoked asterisk
2733 ; unqualified # ✳ eight-spoked asterisk
2734 FE0F ; fully-qualified # ✴️ eight-pointed star
2734 ; unqualified # ✴ eight-pointed star
2747 FE0F ; fully-qualified # ❇️ sparkle
2747 ; unqualified # ❇ sparkle
203C FE0F ; fully-qualified # ‼️ double exclamation mark
203C ; unqualified # ‼ double exclamation mark
2049 FE0F ; fully-qualified # ⁉️ exclamation question mark
2049 ; unqualified # ⁉ exclamation question mark
2753 ; fully-qualified # ❓ question mark
2754 ; fully-qualified # ❔ white question mark
2755 ; fully-qualified # ❕ white exclamation mark
2757 ; fully-qualified # ❗ exclamation mark
3030 FE0F ; fully-qualified # 〰️ wavy dash
3030 ; unqualified # 〰 wavy dash
00A9 FE0F ; fully-qualified # ©️ copyright
00A9 ; unqualified # © copyright
00AE FE0F ; fully-qualified # ®️ registered
00AE ; unqualified # ® registered
2122 FE0F ; fully-qualified # ™️ trade mark
2122 ; unqualified # ™ trade mark
# subgroup: keycap
0023 FE0F 20E3 ; fully-qualified # #️⃣ keycap: #
0023 20E3 ; unqualified # #⃣ keycap: #
002A FE0F 20E3 ; fully-qualified # *️⃣ keycap: *
002A 20E3 ; unqualified # *⃣ keycap: *
0030 FE0F 20E3 ; fully-qualified # 0⃣ keycap: 0
0030 20E3 ; unqualified # 0⃣ keycap: 0
0031 FE0F 20E3 ; fully-qualified # 1⃣ keycap: 1
0031 20E3 ; unqualified # 1⃣ keycap: 1
0032 FE0F 20E3 ; fully-qualified # 2⃣ keycap: 2
0032 20E3 ; unqualified # 2⃣ keycap: 2
0033 FE0F 20E3 ; fully-qualified # 3⃣ keycap: 3
0033 20E3 ; unqualified # 3⃣ keycap: 3
0034 FE0F 20E3 ; fully-qualified # 4⃣ keycap: 4
0034 20E3 ; unqualified # 4⃣ keycap: 4
0035 FE0F 20E3 ; fully-qualified # 5⃣ keycap: 5
0035 20E3 ; unqualified # 5⃣ keycap: 5
0036 FE0F 20E3 ; fully-qualified # 6⃣ keycap: 6
0036 20E3 ; unqualified # 6⃣ keycap: 6
0037 FE0F 20E3 ; fully-qualified # 7⃣ keycap: 7
0037 20E3 ; unqualified # 7⃣ keycap: 7
0038 FE0F 20E3 ; fully-qualified # 8⃣ keycap: 8
0038 20E3 ; unqualified # 8⃣ keycap: 8
0039 FE0F 20E3 ; fully-qualified # 9⃣ keycap: 9
0039 20E3 ; unqualified # 9⃣ keycap: 9
1F51F ; fully-qualified # 🔟 keycap: 10
# subgroup: alphanum
1F520 ; fully-qualified # 🔠 input latin uppercase
1F521 ; fully-qualified # 🔡 input latin lowercase
1F522 ; fully-qualified # 🔢 input numbers
1F523 ; fully-qualified # 🔣 input symbols
1F524 ; fully-qualified # 🔤 input latin letters
1F170 FE0F ; fully-qualified # 🅰️ A button (blood type)
1F170 ; unqualified # 🅰 A button (blood type)
1F18E ; fully-qualified # 🆎 AB button (blood type)
1F171 FE0F ; fully-qualified # 🅱️ B button (blood type)
1F171 ; unqualified # 🅱 B button (blood type)
1F191 ; fully-qualified # 🆑 CL button
1F192 ; fully-qualified # 🆒 COOL button
1F193 ; fully-qualified # 🆓 FREE button
2139 FE0F ; fully-qualified # information
2139 ; unqualified # information
1F194 ; fully-qualified # 🆔 ID button
24C2 FE0F ; fully-qualified # Ⓜ️ circled M
24C2 ; unqualified # Ⓜ circled M
1F195 ; fully-qualified # 🆕 NEW button
1F196 ; fully-qualified # 🆖 NG button
1F17E FE0F ; fully-qualified # 🅾️ O button (blood type)
1F17E ; unqualified # 🅾 O button (blood type)
1F197 ; fully-qualified # 🆗 OK button
1F17F FE0F ; fully-qualified # 🅿️ P button
1F17F ; unqualified # 🅿 P button
1F198 ; fully-qualified # 🆘 SOS button
1F199 ; fully-qualified # 🆙 UP! button
1F19A ; fully-qualified # 🆚 VS button
1F201 ; fully-qualified # 🈁 Japanese “here” button
1F202 FE0F ; fully-qualified # 🈂️ Japanese “service charge” button
1F202 ; unqualified # 🈂 Japanese “service charge” button
1F237 FE0F ; fully-qualified # 🈷️ Japanese “monthly amount” button
1F237 ; unqualified # 🈷 Japanese “monthly amount” button
1F236 ; fully-qualified # 🈶 Japanese “not free of charge” button
1F22F ; fully-qualified # 🈯 Japanese “reserved” button
1F250 ; fully-qualified # 🉐 Japanese “bargain” button
1F239 ; fully-qualified # 🈹 Japanese “discount” button
1F21A ; fully-qualified # 🈚 Japanese “free of charge” button
1F232 ; fully-qualified # 🈲 Japanese “prohibited” button
1F251 ; fully-qualified # 🉑 Japanese “acceptable” button
1F238 ; fully-qualified # 🈸 Japanese “application” button
1F234 ; fully-qualified # 🈴 Japanese “passing grade” button
1F233 ; fully-qualified # 🈳 Japanese “vacancy” button
3297 FE0F ; fully-qualified # ㊗️ Japanese “congratulations” button
3297 ; unqualified # ㊗ Japanese “congratulations” button
3299 FE0F ; fully-qualified # ㊙️ Japanese “secret” button
3299 ; unqualified # ㊙ Japanese “secret” button
1F23A ; fully-qualified # 🈺 Japanese “open for business” button
1F235 ; fully-qualified # 🈵 Japanese “no vacancy” button
# subgroup: geometric
1F534 ; fully-qualified # 🔴 red circle
1F7E0 ; fully-qualified # 🟠 orange circle
1F7E1 ; fully-qualified # 🟡 yellow circle
1F7E2 ; fully-qualified # 🟢 green circle
1F535 ; fully-qualified # 🔵 blue circle
1F7E3 ; fully-qualified # 🟣 purple circle
1F7E4 ; fully-qualified # 🟤 brown circle
26AB ; fully-qualified # ⚫ black circle
26AA ; fully-qualified # ⚪ white circle
1F7E5 ; fully-qualified # 🟥 red square
1F7E7 ; fully-qualified # 🟧 orange square
1F7E8 ; fully-qualified # 🟨 yellow square
1F7E9 ; fully-qualified # 🟩 green square
1F7E6 ; fully-qualified # 🟦 blue square
1F7EA ; fully-qualified # 🟪 purple square
1F7EB ; fully-qualified # 🟫 brown square
2B1B ; fully-qualified # ⬛ black large square
2B1C ; fully-qualified # ⬜ white large square
25FC FE0F ; fully-qualified # ◼️ black medium square
25FC ; unqualified # ◼ black medium square
25FB FE0F ; fully-qualified # ◻️ white medium square
25FB ; unqualified # ◻ white medium square
25FE ; fully-qualified # ◾ black medium-small square
25FD ; fully-qualified # ◽ white medium-small square
25AA FE0F ; fully-qualified # ▪️ black small square
25AA ; unqualified # ▪ black small square
25AB FE0F ; fully-qualified # ▫️ white small square
25AB ; unqualified # ▫ white small square
1F536 ; fully-qualified # 🔶 large orange diamond
1F537 ; fully-qualified # 🔷 large blue diamond
1F538 ; fully-qualified # 🔸 small orange diamond
1F539 ; fully-qualified # 🔹 small blue diamond
1F53A ; fully-qualified # 🔺 red triangle pointed up
1F53B ; fully-qualified # 🔻 red triangle pointed down
1F4A0 ; fully-qualified # 💠 diamond with a dot
1F518 ; fully-qualified # 🔘 radio button
1F533 ; fully-qualified # 🔳 white square button
1F532 ; fully-qualified # 🔲 black square button
# Symbols subtotal: 297
# Symbols subtotal: 297 w/o modifiers
# group: Flags
# subgroup: flag
1F3C1 ; fully-qualified # 🏁 chequered flag
1F6A9 ; fully-qualified # 🚩 triangular flag
1F38C ; fully-qualified # 🎌 crossed flags
1F3F4 ; fully-qualified # 🏴 black flag
1F3F3 FE0F ; fully-qualified # 🏳️ white flag
1F3F3 ; unqualified # 🏳 white flag
1F3F3 FE0F 200D 1F308 ; fully-qualified # 🏳️‍🌈 rainbow flag
1F3F3 200D 1F308 ; unqualified # 🏳‍🌈 rainbow flag
1F3F4 200D 2620 FE0F ; fully-qualified # 🏴‍☠️ pirate flag
1F3F4 200D 2620 ; minimally-qualified # 🏴‍☠ pirate flag
# subgroup: country-flag
1F1E6 1F1E8 ; fully-qualified # 🇦🇨 flag: Ascension Island
1F1E6 1F1E9 ; fully-qualified # 🇦🇩 flag: Andorra
1F1E6 1F1EA ; fully-qualified # 🇦🇪 flag: United Arab Emirates
1F1E6 1F1EB ; fully-qualified # 🇦🇫 flag: Afghanistan
1F1E6 1F1EC ; fully-qualified # 🇦🇬 flag: Antigua & Barbuda
1F1E6 1F1EE ; fully-qualified # 🇦🇮 flag: Anguilla
1F1E6 1F1F1 ; fully-qualified # 🇦🇱 flag: Albania
1F1E6 1F1F2 ; fully-qualified # 🇦🇲 flag: Armenia
1F1E6 1F1F4 ; fully-qualified # 🇦🇴 flag: Angola
1F1E6 1F1F6 ; fully-qualified # 🇦🇶 flag: Antarctica
1F1E6 1F1F7 ; fully-qualified # 🇦🇷 flag: Argentina
1F1E6 1F1F8 ; fully-qualified # 🇦🇸 flag: American Samoa
1F1E6 1F1F9 ; fully-qualified # 🇦🇹 flag: Austria
1F1E6 1F1FA ; fully-qualified # 🇦🇺 flag: Australia
1F1E6 1F1FC ; fully-qualified # 🇦🇼 flag: Aruba
1F1E6 1F1FD ; fully-qualified # 🇦🇽 flag: Åland Islands
1F1E6 1F1FF ; fully-qualified # 🇦🇿 flag: Azerbaijan
1F1E7 1F1E6 ; fully-qualified # 🇧🇦 flag: Bosnia & Herzegovina
1F1E7 1F1E7 ; fully-qualified # 🇧🇧 flag: Barbados
1F1E7 1F1E9 ; fully-qualified # 🇧🇩 flag: Bangladesh
1F1E7 1F1EA ; fully-qualified # 🇧🇪 flag: Belgium
1F1E7 1F1EB ; fully-qualified # 🇧🇫 flag: Burkina Faso
1F1E7 1F1EC ; fully-qualified # 🇧🇬 flag: Bulgaria
1F1E7 1F1ED ; fully-qualified # 🇧🇭 flag: Bahrain
1F1E7 1F1EE ; fully-qualified # 🇧🇮 flag: Burundi
1F1E7 1F1EF ; fully-qualified # 🇧🇯 flag: Benin
1F1E7 1F1F1 ; fully-qualified # 🇧🇱 flag: St. Barthélemy
1F1E7 1F1F2 ; fully-qualified # 🇧🇲 flag: Bermuda
1F1E7 1F1F3 ; fully-qualified # 🇧🇳 flag: Brunei
1F1E7 1F1F4 ; fully-qualified # 🇧🇴 flag: Bolivia
1F1E7 1F1F6 ; fully-qualified # 🇧🇶 flag: Caribbean Netherlands
1F1E7 1F1F7 ; fully-qualified # 🇧🇷 flag: Brazil
1F1E7 1F1F8 ; fully-qualified # 🇧🇸 flag: Bahamas
1F1E7 1F1F9 ; fully-qualified # 🇧🇹 flag: Bhutan
1F1E7 1F1FB ; fully-qualified # 🇧🇻 flag: Bouvet Island
1F1E7 1F1FC ; fully-qualified # 🇧🇼 flag: Botswana
1F1E7 1F1FE ; fully-qualified # 🇧🇾 flag: Belarus
1F1E7 1F1FF ; fully-qualified # 🇧🇿 flag: Belize
1F1E8 1F1E6 ; fully-qualified # 🇨🇦 flag: Canada
1F1E8 1F1E8 ; fully-qualified # 🇨🇨 flag: Cocos (Keeling) Islands
1F1E8 1F1E9 ; fully-qualified # 🇨🇩 flag: Congo - Kinshasa
1F1E8 1F1EB ; fully-qualified # 🇨🇫 flag: Central African Republic
1F1E8 1F1EC ; fully-qualified # 🇨🇬 flag: Congo - Brazzaville
1F1E8 1F1ED ; fully-qualified # 🇨🇭 flag: Switzerland
1F1E8 1F1EE ; fully-qualified # 🇨🇮 flag: Côte dIvoire
1F1E8 1F1F0 ; fully-qualified # 🇨🇰 flag: Cook Islands
1F1E8 1F1F1 ; fully-qualified # 🇨🇱 flag: Chile
1F1E8 1F1F2 ; fully-qualified # 🇨🇲 flag: Cameroon
1F1E8 1F1F3 ; fully-qualified # 🇨🇳 flag: China
1F1E8 1F1F4 ; fully-qualified # 🇨🇴 flag: Colombia
1F1E8 1F1F5 ; fully-qualified # 🇨🇵 flag: Clipperton Island
1F1E8 1F1F7 ; fully-qualified # 🇨🇷 flag: Costa Rica
1F1E8 1F1FA ; fully-qualified # 🇨🇺 flag: Cuba
1F1E8 1F1FB ; fully-qualified # 🇨🇻 flag: Cape Verde
1F1E8 1F1FC ; fully-qualified # 🇨🇼 flag: Curaçao
1F1E8 1F1FD ; fully-qualified # 🇨🇽 flag: Christmas Island
1F1E8 1F1FE ; fully-qualified # 🇨🇾 flag: Cyprus
1F1E8 1F1FF ; fully-qualified # 🇨🇿 flag: Czechia
1F1E9 1F1EA ; fully-qualified # 🇩🇪 flag: Germany
1F1E9 1F1EC ; fully-qualified # 🇩🇬 flag: Diego Garcia
1F1E9 1F1EF ; fully-qualified # 🇩🇯 flag: Djibouti
1F1E9 1F1F0 ; fully-qualified # 🇩🇰 flag: Denmark
1F1E9 1F1F2 ; fully-qualified # 🇩🇲 flag: Dominica
1F1E9 1F1F4 ; fully-qualified # 🇩🇴 flag: Dominican Republic
1F1E9 1F1FF ; fully-qualified # 🇩🇿 flag: Algeria
1F1EA 1F1E6 ; fully-qualified # 🇪🇦 flag: Ceuta & Melilla
1F1EA 1F1E8 ; fully-qualified # 🇪🇨 flag: Ecuador
1F1EA 1F1EA ; fully-qualified # 🇪🇪 flag: Estonia
1F1EA 1F1EC ; fully-qualified # 🇪🇬 flag: Egypt
1F1EA 1F1ED ; fully-qualified # 🇪🇭 flag: Western Sahara
1F1EA 1F1F7 ; fully-qualified # 🇪🇷 flag: Eritrea
1F1EA 1F1F8 ; fully-qualified # 🇪🇸 flag: Spain
1F1EA 1F1F9 ; fully-qualified # 🇪🇹 flag: Ethiopia
1F1EA 1F1FA ; fully-qualified # 🇪🇺 flag: European Union
1F1EB 1F1EE ; fully-qualified # 🇫🇮 flag: Finland
1F1EB 1F1EF ; fully-qualified # 🇫🇯 flag: Fiji
1F1EB 1F1F0 ; fully-qualified # 🇫🇰 flag: Falkland Islands
1F1EB 1F1F2 ; fully-qualified # 🇫🇲 flag: Micronesia
1F1EB 1F1F4 ; fully-qualified # 🇫🇴 flag: Faroe Islands
1F1EB 1F1F7 ; fully-qualified # 🇫🇷 flag: France
1F1EC 1F1E6 ; fully-qualified # 🇬🇦 flag: Gabon
1F1EC 1F1E7 ; fully-qualified # 🇬🇧 flag: United Kingdom
1F1EC 1F1E9 ; fully-qualified # 🇬🇩 flag: Grenada
1F1EC 1F1EA ; fully-qualified # 🇬🇪 flag: Georgia
1F1EC 1F1EB ; fully-qualified # 🇬🇫 flag: French Guiana
1F1EC 1F1EC ; fully-qualified # 🇬🇬 flag: Guernsey
1F1EC 1F1ED ; fully-qualified # 🇬🇭 flag: Ghana
1F1EC 1F1EE ; fully-qualified # 🇬🇮 flag: Gibraltar
1F1EC 1F1F1 ; fully-qualified # 🇬🇱 flag: Greenland
1F1EC 1F1F2 ; fully-qualified # 🇬🇲 flag: Gambia
1F1EC 1F1F3 ; fully-qualified # 🇬🇳 flag: Guinea
1F1EC 1F1F5 ; fully-qualified # 🇬🇵 flag: Guadeloupe
1F1EC 1F1F6 ; fully-qualified # 🇬🇶 flag: Equatorial Guinea
1F1EC 1F1F7 ; fully-qualified # 🇬🇷 flag: Greece
1F1EC 1F1F8 ; fully-qualified # 🇬🇸 flag: South Georgia & South Sandwich Islands
1F1EC 1F1F9 ; fully-qualified # 🇬🇹 flag: Guatemala
1F1EC 1F1FA ; fully-qualified # 🇬🇺 flag: Guam
1F1EC 1F1FC ; fully-qualified # 🇬🇼 flag: Guinea-Bissau
1F1EC 1F1FE ; fully-qualified # 🇬🇾 flag: Guyana
1F1ED 1F1F0 ; fully-qualified # 🇭🇰 flag: Hong Kong SAR China
1F1ED 1F1F2 ; fully-qualified # 🇭🇲 flag: Heard & McDonald Islands
1F1ED 1F1F3 ; fully-qualified # 🇭🇳 flag: Honduras
1F1ED 1F1F7 ; fully-qualified # 🇭🇷 flag: Croatia
1F1ED 1F1F9 ; fully-qualified # 🇭🇹 flag: Haiti
1F1ED 1F1FA ; fully-qualified # 🇭🇺 flag: Hungary
1F1EE 1F1E8 ; fully-qualified # 🇮🇨 flag: Canary Islands
1F1EE 1F1E9 ; fully-qualified # 🇮🇩 flag: Indonesia
1F1EE 1F1EA ; fully-qualified # 🇮🇪 flag: Ireland
1F1EE 1F1F1 ; fully-qualified # 🇮🇱 flag: Israel
1F1EE 1F1F2 ; fully-qualified # 🇮🇲 flag: Isle of Man
1F1EE 1F1F3 ; fully-qualified # 🇮🇳 flag: India
1F1EE 1F1F4 ; fully-qualified # 🇮🇴 flag: British Indian Ocean Territory
1F1EE 1F1F6 ; fully-qualified # 🇮🇶 flag: Iraq
1F1EE 1F1F7 ; fully-qualified # 🇮🇷 flag: Iran
1F1EE 1F1F8 ; fully-qualified # 🇮🇸 flag: Iceland
1F1EE 1F1F9 ; fully-qualified # 🇮🇹 flag: Italy
1F1EF 1F1EA ; fully-qualified # 🇯🇪 flag: Jersey
1F1EF 1F1F2 ; fully-qualified # 🇯🇲 flag: Jamaica
1F1EF 1F1F4 ; fully-qualified # 🇯🇴 flag: Jordan
1F1EF 1F1F5 ; fully-qualified # 🇯🇵 flag: Japan
1F1F0 1F1EA ; fully-qualified # 🇰🇪 flag: Kenya
1F1F0 1F1EC ; fully-qualified # 🇰🇬 flag: Kyrgyzstan
1F1F0 1F1ED ; fully-qualified # 🇰🇭 flag: Cambodia
1F1F0 1F1EE ; fully-qualified # 🇰🇮 flag: Kiribati
1F1F0 1F1F2 ; fully-qualified # 🇰🇲 flag: Comoros
1F1F0 1F1F3 ; fully-qualified # 🇰🇳 flag: St. Kitts & Nevis
1F1F0 1F1F5 ; fully-qualified # 🇰🇵 flag: North Korea
1F1F0 1F1F7 ; fully-qualified # 🇰🇷 flag: South Korea
1F1F0 1F1FC ; fully-qualified # 🇰🇼 flag: Kuwait
1F1F0 1F1FE ; fully-qualified # 🇰🇾 flag: Cayman Islands
1F1F0 1F1FF ; fully-qualified # 🇰🇿 flag: Kazakhstan
1F1F1 1F1E6 ; fully-qualified # 🇱🇦 flag: Laos
1F1F1 1F1E7 ; fully-qualified # 🇱🇧 flag: Lebanon
1F1F1 1F1E8 ; fully-qualified # 🇱🇨 flag: St. Lucia
1F1F1 1F1EE ; fully-qualified # 🇱🇮 flag: Liechtenstein
1F1F1 1F1F0 ; fully-qualified # 🇱🇰 flag: Sri Lanka
1F1F1 1F1F7 ; fully-qualified # 🇱🇷 flag: Liberia
1F1F1 1F1F8 ; fully-qualified # 🇱🇸 flag: Lesotho
1F1F1 1F1F9 ; fully-qualified # 🇱🇹 flag: Lithuania
1F1F1 1F1FA ; fully-qualified # 🇱🇺 flag: Luxembourg
1F1F1 1F1FB ; fully-qualified # 🇱🇻 flag: Latvia
1F1F1 1F1FE ; fully-qualified # 🇱🇾 flag: Libya
1F1F2 1F1E6 ; fully-qualified # 🇲🇦 flag: Morocco
1F1F2 1F1E8 ; fully-qualified # 🇲🇨 flag: Monaco
1F1F2 1F1E9 ; fully-qualified # 🇲🇩 flag: Moldova
1F1F2 1F1EA ; fully-qualified # 🇲🇪 flag: Montenegro
1F1F2 1F1EB ; fully-qualified # 🇲🇫 flag: St. Martin
1F1F2 1F1EC ; fully-qualified # 🇲🇬 flag: Madagascar
1F1F2 1F1ED ; fully-qualified # 🇲🇭 flag: Marshall Islands
1F1F2 1F1F0 ; fully-qualified # 🇲🇰 flag: Macedonia
1F1F2 1F1F1 ; fully-qualified # 🇲🇱 flag: Mali
1F1F2 1F1F2 ; fully-qualified # 🇲🇲 flag: Myanmar (Burma)
1F1F2 1F1F3 ; fully-qualified # 🇲🇳 flag: Mongolia
1F1F2 1F1F4 ; fully-qualified # 🇲🇴 flag: Macao SAR China
1F1F2 1F1F5 ; fully-qualified # 🇲🇵 flag: Northern Mariana Islands
1F1F2 1F1F6 ; fully-qualified # 🇲🇶 flag: Martinique
1F1F2 1F1F7 ; fully-qualified # 🇲🇷 flag: Mauritania
1F1F2 1F1F8 ; fully-qualified # 🇲🇸 flag: Montserrat
1F1F2 1F1F9 ; fully-qualified # 🇲🇹 flag: Malta
1F1F2 1F1FA ; fully-qualified # 🇲🇺 flag: Mauritius
1F1F2 1F1FB ; fully-qualified # 🇲🇻 flag: Maldives
1F1F2 1F1FC ; fully-qualified # 🇲🇼 flag: Malawi
1F1F2 1F1FD ; fully-qualified # 🇲🇽 flag: Mexico
1F1F2 1F1FE ; fully-qualified # 🇲🇾 flag: Malaysia
1F1F2 1F1FF ; fully-qualified # 🇲🇿 flag: Mozambique
1F1F3 1F1E6 ; fully-qualified # 🇳🇦 flag: Namibia
1F1F3 1F1E8 ; fully-qualified # 🇳🇨 flag: New Caledonia
1F1F3 1F1EA ; fully-qualified # 🇳🇪 flag: Niger
1F1F3 1F1EB ; fully-qualified # 🇳🇫 flag: Norfolk Island
1F1F3 1F1EC ; fully-qualified # 🇳🇬 flag: Nigeria
1F1F3 1F1EE ; fully-qualified # 🇳🇮 flag: Nicaragua
1F1F3 1F1F1 ; fully-qualified # 🇳🇱 flag: Netherlands
1F1F3 1F1F4 ; fully-qualified # 🇳🇴 flag: Norway
1F1F3 1F1F5 ; fully-qualified # 🇳🇵 flag: Nepal
1F1F3 1F1F7 ; fully-qualified # 🇳🇷 flag: Nauru
1F1F3 1F1FA ; fully-qualified # 🇳🇺 flag: Niue
1F1F3 1F1FF ; fully-qualified # 🇳🇿 flag: New Zealand
1F1F4 1F1F2 ; fully-qualified # 🇴🇲 flag: Oman
1F1F5 1F1E6 ; fully-qualified # 🇵🇦 flag: Panama
1F1F5 1F1EA ; fully-qualified # 🇵🇪 flag: Peru
1F1F5 1F1EB ; fully-qualified # 🇵🇫 flag: French Polynesia
1F1F5 1F1EC ; fully-qualified # 🇵🇬 flag: Papua New Guinea
1F1F5 1F1ED ; fully-qualified # 🇵🇭 flag: Philippines
1F1F5 1F1F0 ; fully-qualified # 🇵🇰 flag: Pakistan
1F1F5 1F1F1 ; fully-qualified # 🇵🇱 flag: Poland
1F1F5 1F1F2 ; fully-qualified # 🇵🇲 flag: St. Pierre & Miquelon
1F1F5 1F1F3 ; fully-qualified # 🇵🇳 flag: Pitcairn Islands
1F1F5 1F1F7 ; fully-qualified # 🇵🇷 flag: Puerto Rico
1F1F5 1F1F8 ; fully-qualified # 🇵🇸 flag: Palestinian Territories
1F1F5 1F1F9 ; fully-qualified # 🇵🇹 flag: Portugal
1F1F5 1F1FC ; fully-qualified # 🇵🇼 flag: Palau
1F1F5 1F1FE ; fully-qualified # 🇵🇾 flag: Paraguay
1F1F6 1F1E6 ; fully-qualified # 🇶🇦 flag: Qatar
1F1F7 1F1EA ; fully-qualified # 🇷🇪 flag: Réunion
1F1F7 1F1F4 ; fully-qualified # 🇷🇴 flag: Romania
1F1F7 1F1F8 ; fully-qualified # 🇷🇸 flag: Serbia
1F1F7 1F1FA ; fully-qualified # 🇷🇺 flag: Russia
1F1F7 1F1FC ; fully-qualified # 🇷🇼 flag: Rwanda
1F1F8 1F1E6 ; fully-qualified # 🇸🇦 flag: Saudi Arabia
1F1F8 1F1E7 ; fully-qualified # 🇸🇧 flag: Solomon Islands
1F1F8 1F1E8 ; fully-qualified # 🇸🇨 flag: Seychelles
1F1F8 1F1E9 ; fully-qualified # 🇸🇩 flag: Sudan
1F1F8 1F1EA ; fully-qualified # 🇸🇪 flag: Sweden
1F1F8 1F1EC ; fully-qualified # 🇸🇬 flag: Singapore
1F1F8 1F1ED ; fully-qualified # 🇸🇭 flag: St. Helena
1F1F8 1F1EE ; fully-qualified # 🇸🇮 flag: Slovenia
1F1F8 1F1EF ; fully-qualified # 🇸🇯 flag: Svalbard & Jan Mayen
1F1F8 1F1F0 ; fully-qualified # 🇸🇰 flag: Slovakia
1F1F8 1F1F1 ; fully-qualified # 🇸🇱 flag: Sierra Leone
1F1F8 1F1F2 ; fully-qualified # 🇸🇲 flag: San Marino
1F1F8 1F1F3 ; fully-qualified # 🇸🇳 flag: Senegal
1F1F8 1F1F4 ; fully-qualified # 🇸🇴 flag: Somalia
1F1F8 1F1F7 ; fully-qualified # 🇸🇷 flag: Suriname
1F1F8 1F1F8 ; fully-qualified # 🇸🇸 flag: South Sudan
1F1F8 1F1F9 ; fully-qualified # 🇸🇹 flag: São Tomé & Príncipe
1F1F8 1F1FB ; fully-qualified # 🇸🇻 flag: El Salvador
1F1F8 1F1FD ; fully-qualified # 🇸🇽 flag: Sint Maarten
1F1F8 1F1FE ; fully-qualified # 🇸🇾 flag: Syria
1F1F8 1F1FF ; fully-qualified # 🇸🇿 flag: Eswatini
1F1F9 1F1E6 ; fully-qualified # 🇹🇦 flag: Tristan da Cunha
1F1F9 1F1E8 ; fully-qualified # 🇹🇨 flag: Turks & Caicos Islands
1F1F9 1F1E9 ; fully-qualified # 🇹🇩 flag: Chad
1F1F9 1F1EB ; fully-qualified # 🇹🇫 flag: French Southern Territories
1F1F9 1F1EC ; fully-qualified # 🇹🇬 flag: Togo
1F1F9 1F1ED ; fully-qualified # 🇹🇭 flag: Thailand
1F1F9 1F1EF ; fully-qualified # 🇹🇯 flag: Tajikistan
1F1F9 1F1F0 ; fully-qualified # 🇹🇰 flag: Tokelau
1F1F9 1F1F1 ; fully-qualified # 🇹🇱 flag: Timor-Leste
1F1F9 1F1F2 ; fully-qualified # 🇹🇲 flag: Turkmenistan
1F1F9 1F1F3 ; fully-qualified # 🇹🇳 flag: Tunisia
1F1F9 1F1F4 ; fully-qualified # 🇹🇴 flag: Tonga
1F1F9 1F1F7 ; fully-qualified # 🇹🇷 flag: Turkey
1F1F9 1F1F9 ; fully-qualified # 🇹🇹 flag: Trinidad & Tobago
1F1F9 1F1FB ; fully-qualified # 🇹🇻 flag: Tuvalu
1F1F9 1F1FC ; fully-qualified # 🇹🇼 flag: Taiwan
1F1F9 1F1FF ; fully-qualified # 🇹🇿 flag: Tanzania
1F1FA 1F1E6 ; fully-qualified # 🇺🇦 flag: Ukraine
1F1FA 1F1EC ; fully-qualified # 🇺🇬 flag: Uganda
1F1FA 1F1F2 ; fully-qualified # 🇺🇲 flag: U.S. Outlying Islands
1F1FA 1F1F3 ; fully-qualified # 🇺🇳 flag: United Nations
1F1FA 1F1F8 ; fully-qualified # 🇺🇸 flag: United States
1F1FA 1F1FE ; fully-qualified # 🇺🇾 flag: Uruguay
1F1FA 1F1FF ; fully-qualified # 🇺🇿 flag: Uzbekistan
1F1FB 1F1E6 ; fully-qualified # 🇻🇦 flag: Vatican City
1F1FB 1F1E8 ; fully-qualified # 🇻🇨 flag: St. Vincent & Grenadines
1F1FB 1F1EA ; fully-qualified # 🇻🇪 flag: Venezuela
1F1FB 1F1EC ; fully-qualified # 🇻🇬 flag: British Virgin Islands
1F1FB 1F1EE ; fully-qualified # 🇻🇮 flag: U.S. Virgin Islands
1F1FB 1F1F3 ; fully-qualified # 🇻🇳 flag: Vietnam
1F1FB 1F1FA ; fully-qualified # 🇻🇺 flag: Vanuatu
1F1FC 1F1EB ; fully-qualified # 🇼🇫 flag: Wallis & Futuna
1F1FC 1F1F8 ; fully-qualified # 🇼🇸 flag: Samoa
1F1FD 1F1F0 ; fully-qualified # 🇽🇰 flag: Kosovo
1F1FE 1F1EA ; fully-qualified # 🇾🇪 flag: Yemen
1F1FE 1F1F9 ; fully-qualified # 🇾🇹 flag: Mayotte
1F1FF 1F1E6 ; fully-qualified # 🇿🇦 flag: South Africa
1F1FF 1F1F2 ; fully-qualified # 🇿🇲 flag: Zambia
1F1FF 1F1FC ; fully-qualified # 🇿🇼 flag: Zimbabwe
# subgroup: subdivision-flag
1F3F4 E0067 E0062 E0065 E006E E0067 E007F ; fully-qualified # 🏴󠁧󠁢󠁥󠁮󠁧󠁿 flag: England
1F3F4 E0067 E0062 E0073 E0063 E0074 E007F ; fully-qualified # 🏴󠁧󠁢󠁳󠁣󠁴󠁿 flag: Scotland
1F3F4 E0067 E0062 E0077 E006C E0073 E007F ; fully-qualified # 🏴󠁧󠁢󠁷󠁬󠁳󠁿 flag: Wales
# Flags subtotal: 271
# Flags subtotal: 271 w/o modifiers
# Status Counts
# fully-qualified : 3010
# minimally-qualified : 571
# unqualified : 246
# component : 9
#EOF

View File

@ -0,0 +1,110 @@
# emoji plugin
#
# Makes emoji support available within ZSH
#
# See the README for documentation.
# Handle $0 according to the standard:
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
_omz_emoji_plugin_dir="${0:h}"
() {
local LC_ALL=en_US.UTF-8
typeset -gAH emoji_skintone
source "$_omz_emoji_plugin_dir/emoji-char-definitions.zsh"
unset _omz_emoji_plugin_dir
# These additional emoji are not in the definition file, but are useful in conjunction with it
# This is a combining character that can be placed after any other character to surround
# it in a "keycap" symbol.
# The digits 0-9 are already in the emoji table as keycap_digit_<N>, keycap_ten, etc.
# It's unclear whether this should be in the $emoji array, because those characters are all ones
# which can be displayed on their own.
emoji[regional_indicator_symbol_letter_d_regional_indicator_symbol_letter_e]=$'\xF0\x9F\x87\xA9\xF0\x9F\x87\xAA'
emoji[regional_indicator_symbol_letter_g_regional_indicator_symbol_letter_b]=$'\xF0\x9F\x87\xAC\xF0\x9F\x87\xA7'
emoji[regional_indicator_symbol_letter_c_regional_indicator_symbol_letter_n]=$'\xF0\x9F\x87\xA8\xF0\x9F\x87\xB3'
emoji[regional_indicator_symbol_letter_j_regional_indicator_symbol_letter_p]=$'\xF0\x9F\x87\xAF\xF0\x9F\x87\xB5'
emoji[regional_indicator_symbol_letter_k_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xB0\xF0\x9F\x87\xB7'
emoji[regional_indicator_symbol_letter_f_regional_indicator_symbol_letter_r]=$'\xF0\x9F\x87\xAB\xF0\x9F\x87\xB7'
emoji[regional_indicator_symbol_letter_e_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xAA\xF0\x9F\x87\xB8'
emoji[regional_indicator_symbol_letter_i_regional_indicator_symbol_letter_t]=$'\xF0\x9F\x87\xAE\xF0\x9F\x87\xB9'
emoji[regional_indicator_symbol_letter_u_regional_indicator_symbol_letter_s]=$'\xF0\x9F\x87\xBA\xF0\x9F\x87\xB8'
emoji[regional_indicator_symbol_letter_r_regional_indicator_symbol_letter_u]=$'\xF0\x9F\x87\xB7\xF0\x9F\x87\xBA'
# Easier access to skin tone modifiers
emoji_skintone[1_2]=$'\U1F3FB'
emoji_skintone[3]=$'\U1F3FC'
emoji_skintone[4]=$'\U1F3FD'
emoji_skintone[5]=$'\U1F3FE'
emoji_skintone[6]=$'\U1F3FF'
}
# Prints a random emoji character
#
# random_emoji [group]
#
function random_emoji() {
local group=$1
local names
if [[ -z "$group" || "$group" == "all" ]]; then
names=(${(k)emoji})
else
names=(${=emoji_groups[$group]})
fi
local list_size=${#names}
[[ $list_size -eq 0 ]] && return 1
local random_index=$(( ( RANDOM % $list_size ) + 1 ))
local name=${names[$random_index]}
if [[ "$group" == "flags" ]]; then
echo ${emoji_flags[$name]}
else
echo ${emoji[$name]}
fi
}
# Displays a listing of emoji with their names
#
# display_emoji [group]
#
function display_emoji() {
local group=$1
local names
if [[ -z "$group" || "$group" == "all" ]]; then
names=(${(k)emoji})
else
names=(${=emoji_groups[$group]})
fi
# The extra spaces in output here are a hack for readability, since some
# terminals treat these emoji chars as single-width.
local counter=1
for i in $names; do
if [[ "$group" == "flags" ]]; then
printf '%s ' "$emoji_flags[$i]"
else
printf '%s ' "$emoji[$i]"
fi
# New line every 20 emoji, to avoid weirdnesses
if (($counter % 20 == 0)); then
printf "\n"
fi
let counter=$counter+1
done
print
for i in $names; do
if [[ "$group" == "flags" ]]; then
echo "${emoji_flags[$i]} = $i"
else
echo "${emoji[$i]} = $i"
fi
done
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,213 @@
"""
Update Emoji.py
Refeshes OMZ emoji database based on the latest Unicode spec
"""
import re
import json
spec = open("emoji-data.txt", "r")
# Regexes
# regex_emoji will return, respectively:
# the code points, its type (status), the actual emoji, and its official name
regex_emoji = r"^([\w ].*?\S)\s*;\s*([\w-]+)\s*#\s*(.*?)\s(\S.*).*$"
# regex_group returns the group of subgroup that a line opens
regex_group = r"^#\s*(group|subgroup):\s*(.*)$"
headers = """
# emoji-char-definitions.zsh - Emoji definitions for oh-my-zsh emoji plugin
#
# This file is auto-generated by update_emoji.py. Do not edit it manually.
#
# This contains the definition for:
# $emoji - which maps character names to Unicode characters
# $emoji_flags - maps country names to Unicode flag characters using region
# indicators
# $emoji_mod - maps modifier components to Unicode characters
# $emoji_groups - a single associative array to avoid cluttering up the
# global namespace, and to allow adding additional group
# definitions at run time. The keys are the group names, and
# the values are whitespace-separated lists of emoji
# character names.
# Main emoji
typeset -gAH emoji
# National flags
typeset -gAH emoji_flags
# Combining modifiers
typeset -gAH emoji_mod
# Emoji groups
typeset -gAH emoji_groups
"""
#######
# Adding country codes
#######
# This is the only part of this script that relies on an external library
# (country_converter), and is hence commented out by default.
# You can uncomment it to have country codes added as aliases for flag
# emojis. (By default, when you install this extension, country codes are
# included as aliases, but not if you re-run this script without uncommenting.)
# Warning: country_converter is very verbose, and will print warnings all over
# your terminal.
# import country_converter as coco # pylint: disable=wrong-import-position
# cc = coco.CountryConverter()
# def country_iso(_all_names, _omz_name):
# """ Using the external library country_converter,
# this function can detect the ISO2 and ISO3 codes
# of the country. It takes as argument the array
# with all the names of the emoji, and returns that array."""
# omz_no_underscore = re.sub(r'_', r' ', _omz_name)
# iso2 = cc.convert(names=[omz_no_underscore], to='ISO2')
# if iso2 != 'not found':
# _all_names.append(iso2)
# iso3 = cc.convert(names=[omz_no_underscore], to='ISO3')
# _all_names.append(iso3)
# return _all_names
#######
# Helper functions
#######
def code_to_omz(_code_points):
""" Returns a ZSH-compatible Unicode string from the code point(s) """
return r'\U' + r'\U'.join(_code_points.split(' '))
def name_to_omz(_name, _group, _subgroup, _status):
""" Returns a reasonable snake_case name for the emoji. """
def snake_case(_string):
""" Does the regex work of snake_case """
remove_dots = re.sub(r'\.\(\)', r'', _string)
replace_ands = re.sub(r'\&', r'and', remove_dots)
remove_whitespace = re.sub(r'[^\#\*\w]', r'_', replace_ands)
return re.sub(r'__', r'_', remove_whitespace)
shortname = ""
split_at_colon = lambda s: s.split(": ")
# Special treatment by group and subgroup
# If the emoji is a flag, we strip "flag" from its name
if _group == "Flags" and len(split_at_colon(_name)) > 1:
shortname = snake_case(split_at_colon(_name)[1])
else:
shortname = snake_case(_name)
# Special treatment by status
# Enables us to have every emoji combination,
# even the one that are not officially sanctionned
# and are implemented by, say, only one vendor
if _status == "unqualified":
shortname += "_unqualified"
elif _status == "minimally-qualified":
shortname += "_minimally"
return shortname
def increment_name(_shortname):
""" Increment the short name by 1. If you get, say,
'woman_detective_unqualified', it returns
'woman_detective_unqualified_1', and then
'woman_detective_unqualified_2', etc. """
last_char = _shortname[-1]
if last_char.isdigit():
num = int(last_char)
return _shortname[:-1] + str(num + 1)
return _shortname + "_1"
########
# Going through every line
########
group, subgroup, short_name_buffer = "", "", ""
emoji_database = []
for line in spec:
# First, test if this line opens a group or subgroup
group_match = re.findall(regex_group, line)
if group_match != []:
gr_or_sub, name = group_match[0]
if gr_or_sub == "group":
group = name
elif gr_or_sub == "subgroup":
subgroup = name
continue # Moving on...
# Second, test if this line references one emoji
emoji_match = re.findall(regex_emoji, line)
if emoji_match != []:
code_points, status, emoji, name = emoji_match[0]
omz_codes = code_to_omz(code_points)
omz_name = name_to_omz(name, group, subgroup, status)
# If this emoji has the same shortname as the preceding one
if omz_name in short_name_buffer:
omz_name = increment_name(short_name_buffer)
short_name_buffer = omz_name
emoji_database.append(
[omz_codes, status, emoji, omz_name, group, subgroup])
spec.close()
########
# Write to emoji-char-definitions.zsh
########
# Aliases for emojis are retrieved through the DB of Gemoji
# Retrieved on Aug 9 2019 from the following URL:
# https://raw.githubusercontent.com/github/gemoji/master/db/emoji.json
gemoji_db = open("gemoji_db.json")
j = json.load(gemoji_db)
aliases_map = {entry['emoji']: entry['aliases'] for entry in j}
all_omz_names = [emoji_data[3] for emoji_data in emoji_database]
# Let's begin writing to this file
output = open("emoji-char-definitions.zsh", "w")
output.write(headers)
emoji_groups = {"fruits": "\n", "vehicles": "\n", "hands": "\n",
"people": "\n", "animals": "\n", "faces": "\n",
"flags": "\n"}
# First, write every emoji down
for _omz_codes, _status, _emoji, _omz_name, _group, _subgroup in emoji_database:
# One emoji can be mapped to multiple names (aliases or country codes)
names_for_this_emoji = [_omz_name]
# Variable that indicates in which map the emoji will be located
emoji_map = "emoji"
if _status == "component":
emoji_map = "emoji_mod"
if _group == "Flags":
emoji_map = "emoji_flags"
# Adding country codes (Optional, see above)
# names_for_this_emoji = country_iso(names_for_this_emoji, _omz_name)
# Check if there is an alias available in the Gemoji DB
if _emoji in aliases_map.keys():
for alias in aliases_map[_emoji]:
if alias not in all_omz_names:
names_for_this_emoji.append(alias)
# And now we write to the definitions file
for one_name in names_for_this_emoji:
output.write(f"{emoji_map}[{one_name}]=$'{_omz_codes}'\n")
# Storing the emoji in defined subgroups for the next step
if _status == "fully-qualified":
if _subgroup == "food-fruit":
emoji_groups["fruits"] += f" {_omz_name}\n"
elif "transport-" in _subgroup:
emoji_groups["vehicles"] += f" {_omz_name}\n"
elif "hand-" in _subgroup:
emoji_groups["hands"] += f" {_omz_name}\n"
elif "person-" in _subgroup or _subgroup == "family":
emoji_groups["people"] += f" {_omz_name}\n"
elif "animal-" in _subgroup:
emoji_groups["animals"] += f" {_omz_name}\n"
elif "face-" in _subgroup:
emoji_groups["faces"] += f" {_omz_name}\n"
elif _group == "Flags":
emoji_groups["flags"] += f" {_omz_name}\n"
# Second, write the subgroups to the end of the file
for name, string in emoji_groups.items():
output.write(f'\nemoji_groups[{name}]="{string}"\n')
output.close()

View File

@ -0,0 +1,39 @@
# emotty plugin
This plugin returns an emoji for the current $TTY number so it can be used
in a prompt.
To use it, add emotty to the plugins array in your zshrc file:
```
plugins=(... emotty)
```
**NOTE:** it requires the [emoji plugin](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/emoji).
## Usage
The function `emotty` displays an emoji from the current character set (default: `emoji`), based
on the number associated to the `$TTY`.
There are different sets of emoji characters available, to choose a different
set, set `$emotty_set` to the name of the set you would like to use, e.g.:
```
emotty_set=nature
```
### Character Sets
- emoji
- loral
- love
- nature
- stellar
- zodiac
Use the `display_emotty` function to list the emojis in the current character set, or
the character set passed as the first argument. For example:
```
$ display_emotty zodiac
<list of all the emojis in the zodiac character set>
```

View File

@ -0,0 +1,55 @@
# ------------------------------------------------------------------------------
# FILE: emotty.plugin.zsh
# DESCRIPTION: Return an emoji for the current $TTY number.
# AUTHOR: Alexis Hildebrandt (afh[at]surryhill.net)
# VERSION: 1.0.0
# DEPENDS: emoji plugin
#
# There are different sets of emoji characters available, to choose a different
# set export emotty_set to the name of the set you would like to use, e.g.:
# % export emotty_set=nature
# ------------------------------------------------------------------------------
# Handle $0 according to the standard:
# https://zdharma-continuum.github.io/Zsh-100-Commits-Club/Zsh-Plugin-Standard.html
0="${${ZERO:-${0:#$ZSH_ARGZERO}}:-${(%):-%N}}"
0="${${(M)0:#/*}:-$PWD/$0}"
typeset -gAH _emotty_sets
local _emotty_plugin_dir="${0:h}"
source "$_emotty_plugin_dir/emotty_stellar_set.zsh"
source "$_emotty_plugin_dir/emotty_floral_set.zsh"
source "$_emotty_plugin_dir/emotty_zodiac_set.zsh"
source "$_emotty_plugin_dir/emotty_nature_set.zsh"
source "$_emotty_plugin_dir/emotty_emoji_set.zsh"
source "$_emotty_plugin_dir/emotty_love_set.zsh"
unset _emotty_plugin_dir
emotty_default_set=emoji
function emotty() {
# Use emotty set defined by user, fallback to default
local emotty=${_emotty_sets[${emotty_set:-$emotty_default_set}]}
# Parse tty number via prompt expansion. %l equals:
# - N if tty = /dev/ttyN
# - pts/N if tty = /dev/pts/N
local tty=${${(%):-%l}##pts/}
# Normalize it to an emotty set index
(( tty = (tty % ${#${=emotty}}) + 1 ))
local character_name=${${=emotty}[tty]}
echo "${emoji[${character_name}]}${emoji2[emoji_style]}"
}
function display_emotty() {
local name=${1:-$emotty_set}
echo $name
for i in ${=_emotty_sets[$name]}; do
printf "${emoji[$i]}${emoji2[emoji_style]} "
done
print
for i in ${=_emotty_sets[$name]}; do
print "${emoji[$i]}${emoji2[emoji_style]} = $i"
done
}

View File

@ -0,0 +1,24 @@
#!/usr/bin/env zsh
# vim:ft=zsh ts=2 sw=2 sts=2
_emotty_sets[emoji]="
crystal_ball
ghost
jack_o_lantern
see_no_evil_monkey
hear_no_evil_monkey
speak_no_evil_monkey
smiling_cat_face_with_open_mouth
extraterrestrial_alien
rocket
billiards
bomb
pill
japanese_symbol_for_beginner
direct_hit
cyclone
diamond_shape_with_a_dot_inside
sparkle
eight_spoked_asterisk
eight_pointed_black_star
"

View File

@ -0,0 +1,18 @@
#!/usr/bin/env zsh
# vim:ft=zsh ts=2 sw=2 sts=2
_emotty_sets[floral]="
hibiscus
cherry_blossom
blossom
sunflower
bouquet
tulip
rose
four_leaf_clover
seedling
herb
palm_tree
evergreen_tree
deciduous_tree
"

View File

@ -0,0 +1,34 @@
#!/usr/bin/env zsh
# vim:ft=zsh ts=2 sw=2 sts=2
# Note: The heavy_black_heart emoji requires $emoji2[emoji_style]
# to be rendered as the emoji red heart.
_emotty_sets[love]="
green_heart
blue_heart
purple_heart
yellow_heart
heavy_black_heart
broken_heart
heart_with_arrow
heart_with_ribbon
sparkling_heart
two_hearts
revolving_hearts
growing_heart
beating_heart
heart_decoration
couple_with_heart
kiss
man_and_woman_holding_hands
two_women_holding_hands
two_men_holding_hands
kiss_mark
smiling_face_with_heart_shaped_eyes
kissing_face
face_throwing_a_kiss
kissing_face_with_smiling_eyes
kissing_face_with_closed_eyes
smiling_cat_face_with_heart_shaped_eyes
kissing_cat_face_with_closed_eyes
"

View File

@ -0,0 +1,58 @@
#!/usr/bin/env zsh
# vim:ft=zsh ts=2 sw=2 sts=2
_emotty_sets[nature]="
mouse_face
hamster_face
rabbit_face
dog_face
cat_face
tiger_face
bear_face
monkey_face
koala
panda_face
chicken
baby_chick
bird
penguin
cow_face
pig_face
frog_face
boar
wolf_face
horse_face
snail
bug
ant
honeybee
lady_beetle
spouting_whale
dolphin
octopus
fish
tropical_fish
snake
turtle
lemon
tangerine
peach
mushroom
tomato
strawberry
red_apple
cherries
grapes
aubergine
watermelon
banana
pineapple
melon
pear
green_apple
ear_of_maize
sunflower
seedling
herb
four_leaf_clover
"

View File

@ -0,0 +1,25 @@
#!/usr/bin/env zsh
# vim:ft=zsh ts=2 sw=2 sts=2
# NOTE: The following emoji show as $'character' in the title
# white_medium_star
# sparkles
# dizzy_symbol
_emotty_sets[stellar]="
full_moon_symbol
waning_gibbous_moon_symbol
waning_crescent_moon_symbol
last_quarter_moon_symbol
new_moon_symbol
new_moon_with_face
waxing_crescent_moon_symbol
first_quarter_moon_symbol
waxing_gibbous_moon_symbol
full_moon_with_face
sun_with_face
glowing_star
crescent_moon
first_quarter_moon_with_face
last_quarter_moon_with_face
"

View File

@ -0,0 +1,29 @@
#!/usr/bin/env zsh
# vim:ft=zsh ts=2 sw=2 sts=2
_emotty_sets[zodiac]="
aries
taurus
gemini
cancer
leo
virgo
libra
scorpius
sagittarius
capricorn
aquarius
pisces
rat
ox
tiger
rabbit
dragon
snake
horse
goat
monkey
rooster
dog
pig
"

View File

@ -0,0 +1,73 @@
# encode64
Alias plugin for encoding or decoding using `base64` command.
To use it, add `encode64` to the plugins array in your zshrc file:
```zsh
plugins=(... encode64)
```
## Functions and Aliases
| Function | Alias | Description |
| -------------- | ------ | -------------------------------------- |
| `encode64` | `e64` | Encodes given data to base64 |
| `encodefile64` | `ef64` | Encodes given file's content to base64 |
| `decode64` | `d64` | Decodes given data from base64 |
## Usage and examples
### Encoding
- From parameter
```console
$ encode64 "oh-my-zsh"
b2gtbXktenNo
$ e64 "oh-my-zsh"
b2gtbXktenNo
```
- From piping
```console
$ echo "oh-my-zsh" | encode64
b2gtbXktenNo==
$ echo "oh-my-zsh" | e64
b2gtbXktenNo==
```
### Encoding a file
Encode a file's contents to base64 and save output to text file.
**NOTE:** Takes provided file and saves encoded content as new file with `.txt` extension
- From parameter
```console
$ encodefile64 ohmyzsh.icn
ohmyzsh.icn's content encoded in base64 and saved as ohmyzsh.icn.txt
$ ef64 "oh-my-zsh"
ohmyzsh.icn's content encoded in base64 and saved as ohmyzsh.icn.txt
```
### Decoding
- From parameter
```console
$ decode64 b2gtbXktenNo
oh-my-zsh%
$ d64 b2gtbXktenNo
oh-my-zsh%
```
- From piping
```console
$ echo "b2gtbXktenNoCg==" | decode64
oh-my-zsh
$ echo "b2gtbXktenNoCg==" | d64
oh-my-zsh
```

View File

@ -0,0 +1,27 @@
encode64() {
if [[ $# -eq 0 ]]; then
cat | base64
else
printf '%s' $1 | base64
fi
}
encodefile64() {
if [[ $# -eq 0 ]]; then
echo "You must provide a filename"
else
base64 -i $1 -o $1.txt
echo "${1}'s content encoded in base64 and saved as ${1}.txt"
fi
}
decode64() {
if [[ $# -eq 0 ]]; then
cat | base64 --decode
else
printf '%s' $1 | base64 --decode
fi
}
alias e64=encode64
alias ef64=encodefile64
alias d64=decode64

View File

@ -0,0 +1,65 @@
# extract plugin
This plugin defines a function called `extract` that extracts the archive file you pass it, and it supports a
wide variety of archive filetypes.
This way you don't have to know what specific command extracts a file, you just do `extract <filename>` and
the function takes care of the rest.
To use it, add `extract` to the plugins array in your zshrc file:
```zsh
plugins=(... extract)
```
## Supported file extensions
| Extension | Description |
| :---------------- | :----------------------------------- |
| `7z` | 7zip file |
| `Z` | Z archive (LZW) |
| `apk` | Android app file |
| `aar` | Android library file |
| `bz2` | Bzip2 file |
| `cab` | Microsoft cabinet archive |
| `cpio` | Cpio archive |
| `deb` | Debian package |
| `ear` | Enterprise Application aRchive |
| `exe` | Windows executable file |
| `gz` | Gzip file |
| `ipa` | iOS app package |
| `ipsw` | iOS firmware file |
| `jar` | Java Archive |
| `lrz` | LRZ archive |
| `lz4` | LZ4 archive |
| `lzma` | LZMA archive |
| `obscpio` | cpio archive used on OBS |
| `rar` | WinRAR archive |
| `rpm` | RPM package |
| `sublime-package` | Sublime Text package |
| `tar` | Tarball |
| `tar.bz2` | Tarball with bzip2 compression |
| `tar.gz` | Tarball with gzip compression |
| `tar.lrz` | Tarball with lrzip compression |
| `tar.lz` | Tarball with lzip compression |
| `tar.lz4` | Tarball with lz4 compression |
| `tar.xz` | Tarball with lzma2 compression |
| `tar.zma` | Tarball with lzma compression |
| `tar.zst` | Tarball with zstd compression |
| `tbz` | Tarball with bzip compression |
| `tbz2` | Tarball with bzip2 compression |
| `tgz` | Tarball with gzip compression |
| `tlz` | Tarball with lzma compression |
| `txz` | Tarball with lzma2 compression |
| `tzst` | Tarball with zstd compression |
| `war` | Web Application archive (Java-based) |
| `whl` | Python wheel file |
| `xpi` | Mozilla XPI module file |
| `xz` | LZMA2 archive |
| `zip` | Zip archive |
| `zlib` | zlib archive |
| `zst` | Zstandard file (zstd) |
| `zpaq` | Zpaq file |
See [list of archive formats](https://en.wikipedia.org/wiki/List_of_archive_formats) for more information
regarding archive formats.

View File

@ -0,0 +1,7 @@
#compdef extract
#autoload
_arguments \
'(-r --remove)'{-r,--remove}'[Remove archive.]' \
"*::archive file:_files -g '(#i)*.(7z|Z|apk|aar|bz2|cab|cpio|deb|ear|gz|ipa|ipsw|jar|lrz|lz4|lzma|obscpio|rar|rpm|sublime-package|tar|tar.bz2|tar.gz|tar.lrz|tar.lz|tar.lz4|tar.xz|tar.zma|tar.zst|tbz|tbz2|tgz|tlz|txz|tzst|war|whl|xpi|xz|zip|zst|zpaq)(-.)'" \
&& return 0

View File

@ -0,0 +1,137 @@
alias x=extract
extract() {
setopt localoptions noautopushd
if (( $# == 0 )); then
cat >&2 <<'EOF'
Usage: extract [-option] [file ...]
Options:
-r, --remove Remove archive after unpacking.
EOF
fi
local remove_archive=1
if [[ "$1" == "-r" ]] || [[ "$1" == "--remove" ]]; then
remove_archive=0
shift
fi
local pwd="$PWD"
while (( $# > 0 )); do
if [[ ! -f "$1" ]]; then
echo "extract: '$1' is not a valid file" >&2
shift
continue
fi
local success=0
local file="$1" full_path="${1:A}"
local extract_dir="${1:t:r}"
# Remove the .tar extension if the file name is .tar.*
if [[ $extract_dir =~ '\.tar$' ]]; then
extract_dir="${extract_dir:r}"
fi
# If there's a file or directory with the same name as the archive
# add a random string to the end of the extract directory
if [[ -e "$extract_dir" ]]; then
local rnd="${(L)"${$(( [##36]$RANDOM*$RANDOM ))}":1:5}"
extract_dir="${extract_dir}-${rnd}"
fi
# Create an extraction directory based on the file name
command mkdir -p "$extract_dir"
builtin cd -q "$extract_dir"
echo "extract: extracting to $extract_dir" >&2
case "${file:l}" in
(*.tar.gz|*.tgz)
(( $+commands[pigz] )) && { tar -I pigz -xvf "$full_path" } || tar zxvf "$full_path" ;;
(*.tar.bz2|*.tbz|*.tbz2)
(( $+commands[pbzip2] )) && { tar -I pbzip2 -xvf "$full_path" } || tar xvjf "$full_path" ;;
(*.tar.xz|*.txz)
(( $+commands[pixz] )) && { tar -I pixz -xvf "$full_path" } || {
tar --xz --help &> /dev/null \
&& tar --xz -xvf "$full_path" \
|| xzcat "$full_path" | tar xvf - } ;;
(*.tar.zma|*.tlz)
tar --lzma --help &> /dev/null \
&& tar --lzma -xvf "$full_path" \
|| lzcat "$full_path" | tar xvf - ;;
(*.tar.zst|*.tzst)
tar --zstd --help &> /dev/null \
&& tar --zstd -xvf "$full_path" \
|| zstdcat "$full_path" | tar xvf - ;;
(*.tar) tar xvf "$full_path" ;;
(*.tar.lz) (( $+commands[lzip] )) && tar xvf "$full_path" ;;
(*.tar.lz4) lz4 -c -d "$full_path" | tar xvf - ;;
(*.tar.lrz) (( $+commands[lrzuntar] )) && lrzuntar "$full_path" ;;
(*.gz) (( $+commands[pigz] )) && pigz -cdk "$full_path" > "${file:t:r}" || gunzip -ck "$full_path" > "${file:t:r}" ;;
(*.bz2) bunzip2 "$full_path" ;;
(*.xz) unxz "$full_path" ;;
(*.lrz) (( $+commands[lrunzip] )) && lrunzip "$full_path" ;;
(*.lz4) lz4 -d "$full_path" ;;
(*.lzma) unlzma "$full_path" ;;
(*.z) uncompress "$full_path" ;;
(*.zip|*.war|*.jar|*.ear|*.sublime-package|*.ipa|*.ipsw|*.xpi|*.apk|*.aar|*.whl) unzip "$full_path" ;;
(*.rar) unrar x -ad "$full_path" ;;
(*.rpm)
rpm2cpio "$full_path" | cpio --quiet -id ;;
(*.7z) 7za x "$full_path" ;;
(*.deb)
command mkdir -p "control" "data"
ar vx "$full_path" > /dev/null
builtin cd -q control; extract ../control.tar.*
builtin cd -q ../data; extract ../data.tar.*
builtin cd -q ..; command rm *.tar.* debian-binary ;;
(*.zst) unzstd "$full_path" ;;
(*.cab|*.exe) cabextract "$full_path" ;;
(*.cpio|*.obscpio) cpio -idmvF "$full_path" ;;
(*.zpaq) zpaq x "$full_path" ;;
(*.zlib) zlib-flate -uncompress < "$full_path" > "${file:r}" ;;
(*)
echo "extract: '$file' cannot be extracted" >&2
success=1 ;;
esac
(( success = success > 0 ? success : $? ))
(( success == 0 && remove_archive == 0 )) && command rm "$full_path"
shift
# Go back to original working directory
builtin cd -q "$pwd"
# If content of extract dir is a single directory, move its contents up
# Glob flags:
# - D: include files starting with .
# - N: no error if directory is empty
# - Y2: at most give 2 files
local -a content
content=("${extract_dir}"/*(DNY2))
if [[ ${#content} -eq 1 && -e "${content[1]}" ]]; then
# The extracted file/folder (${content[1]}) may have the same name as $extract_dir
# If so, we need to rename it to avoid conflicts in a 3-step process
#
# 1. Move and rename the extracted file/folder to a temporary random name
# 2. Delete the empty folder
# 3. Rename the extracted file/folder to the original name
if [[ "${content[1]:t}" == "$extract_dir" ]]; then
# =(:) gives /tmp/zsh<random>, with :t it gives zsh<random>
local tmp_name==(:); tmp_name="${tmp_name:t}"
command mv "${content[1]}" "$tmp_name" \
&& command rmdir "$extract_dir" \
&& command mv "$tmp_name" "$extract_dir"
# Otherwise, if the extracted folder name already exists in the current
# directory (because of a previous file / folder), keep the extract_dir
elif [[ ! -e "${content[1]:t}" ]]; then
command mv "${content[1]}" . \
&& command rmdir "$extract_dir"
fi
elif [[ ${#content} -eq 0 ]]; then
command rmdir "$extract_dir"
fi
done
}

View File

@ -0,0 +1,101 @@
# eza plugin
This provides aliases that invoke the [`eza`](https://github.com/eza-community/eza) utility rather than `ls`
To use it add `eza` to the plugins array in your zshrc file:
```zsh
plugins=(... eza)
```
## Configuration
All configurations are done using the `zstyle` command in the `:omz:plugins:eza` namespace.
**NOTE:** The configuring needs to be done prior to OMZ loading the plugins. When the plugin is loaded,
changing the `zstyle` won't have any effect.
### `dirs-first`
```zsh
zstyle ':omz:plugins:eza' 'dirs-first' yes|no
```
If `yes`, directories will be grouped first.
Default: `no`
### `git-status`
```zsh
zstyle ':omz:plugins:eza' 'git-status' yes|no
```
If `yes`, always add `--git` flag to indicate git status (if tracked / in a git repo).
Default: `no`
### `header`
```zsh
zstyle ':omz:plugins:eza' 'header' yes|no
```
If `yes`, always add `-h` flag to add a header row for each column.
Default: `no`
### `show-group`
```zsh
zstyle ':omz:plugins:eza' 'show-group' yes|no
```
If `yes` (default), always add `-g` flag to show the group ownership.
Default: `yes`
### `size-prefix`
```zsh
zstyle ':omz:plugins:eza' 'size-prefix' (binary|none|si)
```
Choose the prefix to be used in displaying file size:
- `binary` -- use [binary prefixes](https://en.wikipedia.org/wiki/Binary_prefix) such as "Ki", "Mi", "Gi" and
so on
- `none` -- don't use any prefix, show size in bytes
- `si` (default) -- use [Metric/S.I. prefixes](https://en.wikipedia.org/wiki/Metric_prefix)
Default: `si`
### `time-style`
```zsh
zstyle ':omz:plugins:eza' 'time-style' $TIME_STYLE
```
Sets the `--time-style` option of `eza`. (See `man eza` for the options)
Default: Not set, which means the default behavior of `eza` will take place.
## Aliases
**Notes:**
- Aliases may be modified by Configuration
- The term "files" without "only" qualifier means both files & directories
| Alias | Command | Description |
| ------ | ----------------- | -------------------------------------------------------------------------- |
| `la` | `eza -la` | List all files (except . and ..) as a long list |
| `ldot` | `eza -ld .*` | List dotfiles only (directories shown as entries instead of recursed into) |
| `lD` | `eza -lD` | List only directories (excluding dotdirs) as a long list |
| `lDD` | `eza -laD` | List only directories (including dotdirs) as a long list |
| `ll` | `eza -l` | List files as a long list |
| `ls` | `eza` | Plain eza call |
| `lsd` | `eza -d` | List specified files with directories as entries, in a grid |
| `lsdl` | `eza -dl` | List specified files with directories as entries, in a long list |
| `lS` | `eza -l -ssize` | List files as a long list, sorted by size |
| `lT` | `eza -l -snewest` | List files as a long list, sorted by date (newest last) |

View File

@ -0,0 +1,62 @@
if ! (( $+commands[eza] )); then
print "zsh eza plugin: eza not found. Please install eza before using this plugin." >&2
return 1
fi
typeset -a _EZA_HEAD
typeset -a _EZA_TAIL
function _configure_eza() {
local _val
# Get the head flags
if zstyle -T ':omz:plugins:eza' 'show-group'; then
_EZA_HEAD+=("g")
fi
if zstyle -t ':omz:plugins:eza' 'header'; then
_EZA_HEAD+=("h")
fi
zstyle -s ':omz:plugins:eza' 'size-prefix' _val
case "${_val:l}" in
binary)
_EZA_HEAD+=("b")
;;
none)
_EZA_HEAD+=("B")
;;
esac
# Get the tail long-options
if zstyle -t ':omz:plugins:eza' 'dirs-first'; then
_EZA_TAIL+=("--group-directories-first")
fi
if zstyle -t ':omz:plugins:eza' 'git-status'; then
_EZA_TAIL+=("--git")
fi
zstyle -s ':omz:plugins:eza' 'time-style' _val
if [[ $_val ]]; then
_EZA_TAIL+=("--time-style='$_val'")
fi
}
_configure_eza
function _alias_eza() {
local _head="${(j::)_EZA_HEAD}$2"
local _tail="${(j: :)_EZA_TAIL}"
alias "$1"="eza${_head:+ -}${_head}${_tail:+ }${_tail}${3:+ }$3"
}
_alias_eza la la
_alias_eza ldot ld ".*"
_alias_eza lD lD
_alias_eza lDD lDa
_alias_eza ll l
_alias_eza ls
_alias_eza lsd d
_alias_eza lsdl dl
_alias_eza lS "l -ssize"
_alias_eza lT "l -snewest"
unfunction _alias_eza
unfunction _configure_eza
unset _EZA_HEAD
unset _EZA_TAIL

View File

@ -0,0 +1,9 @@
# Fabric
This plugin provides completion for [Fabric](https://www.fabfile.org/).
To use it add fabric to the plugins array in your zshrc file.
```zsh
plugins=(... fabric)
```

View File

@ -0,0 +1,69 @@
#compdef fab
#autoload
local curcontext=$curcontext state line
declare -A opt_args
declare -a target_list
target_list=("${(@f)$(fab -l 2>/dev/null | awk '{
if (NF == 0 || NR == 1) next
if (NF < 2) print $1
else {
docstring=substr($0, index($0,$2))
gsub(":", "\\:", docstring)
print $1":"docstring
}
}')}")
_fab_targets() {
[[ -n "$target_list" ]] || return
_describe -t commands "fabric targets" target_list
}
output_levels=(
'status: Status messages, i.e. noting when Fabric is done running, if the user used a keyboard interrupt, or when servers are disconnected from. These messages are almost always relevant and rarely verbose.'
'aborts: Abort messages. Like status messages, these should really only be turned off when using Fabric as a library, and possibly not even then. Note that even if this output group is turned off, aborts will still occur there just wont be any output about why Fabric aborted!'
'warnings: Warning messages. These are often turned off when one expects a given operation to fail, such as when using grep to test existence of text in a file. If paired with setting env.warn_only to True, this can result in fully silent warnings when remote programs fail. As with aborts, this setting does not control actual warning behavior, only whether warning messages are printed or hidden.'
'running: Printouts of commands being executed or files transferred, e.g. [myserver] run: ls /var/www. Also controls printing of tasks being run, e.g. [myserver] Executing task ''foo''.'
'stdout: Local, or remote, stdout, i.e. non-error output from commands.'
'stderr: Local, or remote, stderr, i.e. error-related output from commands.'
'user: User-generated output, i.e. local output printed by fabfile code via use of the fastprint or puts functions.'
)
_arguments -w -S -C \
'(-)'{-h,--help}'[show this help message and exit]: :->noargs' \
'(-)'{-V,--version}'[show program''s version number and exit]: :->noargs' \
'(-)--list[print list of possible commands and exit]: :->noargs' \
'(-)--shortlist[print non-verbose list of possible commands and exit]: :->noargs' \
'(--reject-unknown-hosts)--reject-unknown-hosts[reject unknown hosts]' \
'(--no-pty)--no-pty[do not use pseudo-terminal in run/sudo]' \
"(-d+ --display=-)"{-d+,--display=-}"[print detailed info about a given command]: :_fab_targets" \
'(-D --disable-known-hosts)'{-D,--disable-known-hosts}'[do not load user known_hosts file]' \
'(-r --reject-unknown-hosts)'{-r,--reject-unknown-hosts}'[reject unknown hosts]' \
'(-u+ --user=-)'{-u+,--user=-}'[username to use when connecting to remote hosts]: :' \
'(-p+ --password=-)'{-p+,--password=-}'[password for use with authentication and/or sudo]: :' \
'(-H+ --hosts=-)'{-H+,--hosts=-}'[comma separated list of hosts to operate on]: :' \
'(-R+ --roles=-)'{-R+,--roles=-}'[comma separated list of roles to operate on]: :' \
'(-a --no-agent)'{-a,--no-agent}'[don''t use the running SSH agent]' \
'(-k --no-keys)'{-k,--no-keys}'[don''t load private key files from ~/.ssh/]' \
'(-w --warn-only)'{-w,--warn-only}'[warn instead of abort, when commands fail]' \
'-i+[path to SSH private key file. May be repeated]: :_files' \
"(-f+ --fabfile=)"{-f+,--fabfile=}"[Python module file to import]: :_files -g *.py" \
'(-c+ --config=-)'{-c+,--config=-}'[specify location of config file to use]: :_files' \
'(-s+ --shell=-)'{-s+,--shell=-}'[specify a new shell, defaults to ''/bin/bash -l -c'']: :' \
'(--hide=-)--hide=-[comma-separated list of output levels to hide]: :->levels' \
'(--show=-)--show=-[comma-separated list of output levels to show]: :->levels' \
'*::: :->subcmds' && return 0
if [[ CURRENT -ge 1 ]]; then
case $state in
noargs)
_message "nothing to complete";;
levels)
_describe -t commands "output levels" output_levels;;
*)
_fab_targets;;
esac
return
fi

View File

@ -0,0 +1,14 @@
# Use Ctrl-Z to switch back to Vim
I frequently need to execute random commands in my shell. To achieve it I pause
Vim by pressing Ctrl-z, type command and press fg<Enter> to switch back to Vim.
The fg part really hurts me. I just wanted to hit Ctrl-z once again to get back
to Vim. I could not find a solution, so I developed one on my own that
works wonderfully with ZSH.
Source: http://sheerun.net/2014/03/21/how-to-boost-your-vim-productivity/
Credits:
- original idea by @sheerun
- added to OMZ by @mbologna

View File

@ -0,0 +1,12 @@
fancy-ctrl-z () {
if [[ $#BUFFER -eq 0 ]]; then
BUFFER="fg"
zle accept-line -w
else
zle push-input -w
zle clear-screen -w
fi
}
zle -N fancy-ctrl-z
bindkey '^Z' fancy-ctrl-z

View File

@ -0,0 +1,21 @@
# fasd
[`Fasd`](https://github.com/clvv/fasd) (pronounced similar to "fast") is a command-line productivity booster. Fasd offers quick access to files and directories for POSIX shells.
To use it, add `fasd` to the plugins array in your zshrc file:
```zsh
plugins=(... fasd)
```
## Installation
Please find detailed installation guide [`here`](https://github.com/whjvenyl/fasd#install)
## Aliases
| Alias | Command | Description |
|-------|-------------------------------------------|-------------------------------------------------------------|
| v | `fasd -f -e "$EDITOR"` | List frequent/recent files matching the given filename. |
| o | `fasd -a -e xdg-open` | List frequent/recent files and directories matching. |
| j | `fasd_cd -d -i` | cd with interactive selection |

View File

@ -0,0 +1,16 @@
# check if fasd is installed
if (( ! ${+commands[fasd]} )); then
return
fi
fasd_cache="${ZSH_CACHE_DIR}/fasd-init-cache"
if [[ "$commands[fasd]" -nt "$fasd_cache" || ! -s "$fasd_cache" ]]; then
fasd --init posix-alias zsh-hook zsh-ccomp zsh-ccomp-install \
zsh-wcomp zsh-wcomp-install >| "$fasd_cache"
fi
source "$fasd_cache"
unset fasd_cache
alias v='f -e "$EDITOR"'
alias o='a -e xdg-open'
alias j='zz'

View File

@ -0,0 +1,85 @@
# Fastfile plugin
This plugin adds a way to reference certain files or folders used frequently using
a global alias or shortcut.
To use it, add `fastfile` to the plugins array in your zshrc file:
```zsh
plugins=(... fastfile)
```
## Usage
Example: you access folder `/code/project/backend/database` very frequently.
First, generate a shortcut with the name `pjdb`:
```zsh
$ fastfile pjdb /code/project/backend/database
```
Next time you want to access it, use `§pjdb`. For example:
```zsh
$ cd §pjdb
$ subl §pjdb
```
where § is the fastfile prefix (see [below](#options) for how to change).
**Note:** shortcuts with spaces in the name are assigned a global alias
where the spaces have been substituted with underscores (`_`). For example:
a shortcut named `"hello world"` corresponds with `§hello_world`.
## Functions
- `fastfile <shortcut_name> [path/to/file/or/folder]`: generate a shortcut.
If the second argument is not provided, the current directory is used.
- `fastfile_print <shortcut_name>`: prints a shortcut, with the format
`<prefix><shortcut_name> -> <shortcut_path>`.
- `fastfile_ls`: lists all shortcuts.
- `fastfile_rm <shortcut_name>`: remove a shortcut.
- `fastfile_sync`: generates the global aliases for the shortcuts.
### Internal functions
- `fastfile_resolv <shortcut_name>`: resolves the location of the shortcut
file, i.e., the file in the fastfile directory where the shortcut path
is stored.
- `fastfile_get <shortcut_name>`: get the real path of the shortcut.
## Aliases
| Alias | Function |
|--------|------------------|
| ff | `fastfile` |
| ffp | `fastfile_print` |
| ffrm | `fastfile_rm` |
| ffls | `fastfile_ls` |
| ffsync | `fastfile_sync` |
## Options
These are options you can set to change certain parts of the plugin. To change
them, add `<variable>=<value>` to your zshrc file, before Oh My Zsh is sourced.
For example: `fastfile_var_prefix='@'`.
- `fastfile_var_prefix`: prefix for the global aliases created. Controls the prefix of the
created global aliases.
**Default:** `§` (section sign), easy to type in a german keyboard via the combination
[`⇧ Shift`+`3`](https://en.wikipedia.org/wiki/German_keyboard_layout#/media/File:KB_Germany.svg),
or using `⌥ Option`+`6` in macOS.
- `fastfile_dir`: directory where the fastfile shortcuts are stored. Needs to end
with a trailing slash.
**Default:** `$HOME/.fastfile/`.
## Author
- [Karolin Varner](https://github.com/koraa)

View File

@ -0,0 +1,128 @@
###########################
# Settings
# These can be overwritten any time.
# If they are not set yet, they will be
# overwritten with their default values
default fastfile_dir "${HOME}/.fastfile"
default fastfile_var_prefix "§"
###########################
# Impl
#
# Generate a shortcut
#
# Arguments:
# 1. name - The name of the shortcut (default: name of the file)
# 2. file - The file or directory to make the shortcut for
# STDOUT:
# => fastfile_print
#
function fastfile() {
test "$2" || 2="."
file=$(readlink -f "$2")
test "$1" || 1="$(basename "$file")"
name=$(echo "$1" | tr " " "_")
mkdir -p "${fastfile_dir}"
echo "$file" > "$(fastfile_resolv "$name")"
fastfile_sync
fastfile_print "$name"
}
#
# Resolve the location of a shortcut file (the database file, where the value is written!)
#
# Arguments:
# 1. name - The name of the shortcut
# STDOUT:
# The path to the shortcut file
#
function fastfile_resolv() {
echo "${fastfile_dir}/${1}"
}
#
# Get the real path of a shortcut
#
# Arguments:
# 1. name - The name of the shortcut
# STDOUT:
# The path
#
function fastfile_get() {
cat "$(fastfile_resolv "$1")"
}
#
# Print a shortcut
#
# Arguments:
# 1. name - The name of the shortcut
# STDOUT:
# Name and value of the shortcut
#
function fastfile_print() {
echo "${fastfile_var_prefix}${1} -> $(fastfile_get "$1")"
}
#
# List all shortcuts
#
# STDOUT:
# (=> fastfile_print) for each shortcut
#
function fastfile_ls() {
for f in "${fastfile_dir}"/*(N); do
file=$(basename "$f") # To enable simpler handling of spaces in file names
varkey=$(echo "$file" | tr " " "_")
# Special format for columns
echo "${fastfile_var_prefix}${varkey}|->|$(fastfile_get "$file")"
done | column -t -s "|"
}
#
# Remove a shortcut
#
# Arguments:
# 1. name - The name of the shortcut (default: name of the file)
# STDOUT:
# => fastfile_print
#
function fastfile_rm() {
fastfile_print "$1"
rm "$(fastfile_resolv "$1")"
unalias "${fastfile_var_prefix}${1}"
}
#
# Generate the aliases for the shortcuts
#
function fastfile_sync() {
for f in "${fastfile_dir}"/*(N); do
file=$(basename "$f") # To enable simpler handling of spaces in file names
varkey=$(echo "$file" | tr " " "_")
alias -g "${fastfile_var_prefix}${varkey}"="'$(fastfile_get "$file")'"
done
}
##################################
# Shortcuts
alias ff=fastfile
alias ffp=fastfile_print
alias ffrm=fastfile_rm
alias ffls=fastfile_ls
alias ffsync=fastfile_sync
##################################
# Init
fastfile_sync

View File

@ -0,0 +1,10 @@
# fbterm
This plugin automatically starts [fbterm](https://github.com/zhangyuanwei/fbterm)
if on a real TTY (`/dev/tty*`).
To use it, add `fbterm` to the plugins array of your zshrc file:
```zsh
plugins=(... fbterm)
```

View File

@ -0,0 +1,7 @@
# start fbterm automatically in /dev/tty*
if (( ${+commands[fbterm]} )); then
if [[ "$TTY" = /dev/tty* ]] ; then
fbterm && exit
fi
fi

Some files were not shown because too many files have changed in this diff Show More