diff options
author | bonespiked <dngreene@gmail.com> | 2017-03-24 09:09:51 -0400 |
---|---|---|
committer | Jason Blais <jason@spinpunch.com> | 2017-03-24 09:09:51 -0400 |
commit | 28ad645153b206ba84ddc4935280eaed94bb0138 (patch) | |
tree | a5ddcc228b5cfdbd479078873a1bfede9f11cb1f /webapp | |
parent | d0af931e6e57b78432d5527b6e7b0be36c538144 (diff) | |
download | chat-28ad645153b206ba84ddc4935280eaed94bb0138.tar.gz chat-28ad645153b206ba84ddc4935280eaed94bb0138.tar.bz2 chat-28ad645153b206ba84ddc4935280eaed94bb0138.zip |
Ticket 4665 - Emoji Picker (#5157)
* #4665 Added EmojiPicker
Work primarily by @broernr-de and @harrison on pre-release.mattermost.com
* Final fixes to handle custom emojis from internal review and single merge error
* ESLint fixes
* CSS changes and other code to support emoji picker in reply window
* Fix for file upload and emoji picker icon positions on post and comment.
RHS emoji picker appearing see-through at this time.
* Fix for two ESLint issues.
* covered most of feedback:
RHS emoji picker looks correct color-wise
RHS emoji picker dynamically positions against height of thread size (post + reply messages)
escape closes emoji window
search box focused on open
ESLint fixes against other files
oversized emoji preview fixes
* Adding in 'outside click' eventing to dismiss the emoji window
* Changing some formatting to fix mismatch between my local eslant rules and jenkins.
* adding alternative import method due to downstream testing errors
* yet another attempt to retain functionality and pass tests - skipping import of browser store
* fix for feedback items 5 and 7:
* move search to float on top with stylistic changes
* whitespace in the header (+1 squashed commit)
Squashed commits:
[6a26d32] changes that address items
1, 2, 6, 8, and 9 of latest feedback
* Fix for attachment preview location on mobile
* Fix for latest rounds of feedback
* fixing eslint issue
* making emojipicker sprite based, fixing alignments
* Fix for emoji quality, fixing some behavior (hover background and cursor settings)
undoing config changes
* Preview feature for emojis
* Adjustments to config file, and changing layout/design of attachment and emoji icon.
* manual revert from master branch for config.json
* reverting paperclip and fixing alignments. Additionally fixing inadvertent display of picker on mobile.
* CSS changes to try to fix the hover behavior - currently working for emoji picker (when enabled), but hover for attachment isn't working
* Made suggested changes by jwilander except for jQuery removal
* Adding hover for both icons
* removal of some usages of jQuery
* Fix for two layout issues on IE11/Edge
* UI improvements for emoji picker
* Fix for many minor display issues
* fix for additional appearance items
* fix to two minor UI items
* A little extra padding for IE11
* fix for IE11 scroll issue, and removing align attribute on img tag which was throwing js error
* fixes some display issues on firefox
* fix for uneven sides of emojis
* fix for eslint issues that I didn't introduce
* fix for missing bottom edge of RHS emojipicker. also fixing text overlapping icons on text area (including RHS)
* Update "emoji selector" to "emoji picker"
* changes for code review
- removal of ..getDOMNode
- use sprite imagery for emoji preview
- remove lastBlurAt from state as it wasn't used
* fixes for:
- fake custom emoji preview in picker
- RHS scrollbar on preview
* fix for minor alignment of preview emoji
Diffstat (limited to 'webapp')
28 files changed, 4827 insertions, 53 deletions
diff --git a/webapp/actions/post_actions.jsx b/webapp/actions/post_actions.jsx index 0c837621f..494cbc454 100644 --- a/webapp/actions/post_actions.jsx +++ b/webapp/actions/post_actions.jsx @@ -417,6 +417,13 @@ export function removePostFromStore(post) { PostStore.emitChange(); } +export function emitEmojiPosted(emoji) { + AppDispatcher.handleServerAction({ + type: ActionTypes.EMOJI_POSTED, + alias: emoji + }); +} + export function deletePost(channelId, post, success, error) { Client.deletePost( channelId, diff --git a/webapp/components/autosize_textarea.jsx b/webapp/components/autosize_textarea.jsx index a55a27aef..e14835737 100644 --- a/webapp/components/autosize_textarea.jsx +++ b/webapp/components/autosize_textarea.jsx @@ -62,6 +62,7 @@ export default class AutosizeTextarea extends React.Component { const { value, placeholder, + id, ...otherProps } = props; @@ -77,12 +78,14 @@ export default class AutosizeTextarea extends React.Component { <div> <textarea ref='textarea' + id={id + '-textarea'} {...heightProps} {...props} /> <div style={{height: 0, overflow: 'hidden'}}> <textarea ref='reference' + id={id + '-reference'} style={{height: 'auto', width: '100%'}} disabled={true} value={value} diff --git a/webapp/components/create_comment.jsx b/webapp/components/create_comment.jsx index 96280bbc1..899609ed0 100644 --- a/webapp/components/create_comment.jsx +++ b/webapp/components/create_comment.jsx @@ -15,6 +15,7 @@ import Textbox from './textbox.jsx'; import MsgTyping from './msg_typing.jsx'; import FileUpload from './file_upload.jsx'; import FilePreview from './file_preview.jsx'; +import EmojiPicker from './emoji_picker/emoji_picker.jsx'; import * as Utils from 'utils/utils.jsx'; import * as UserAgent from 'utils/user_agent.jsx'; import * as GlobalActions from 'actions/global_actions.jsx'; @@ -28,8 +29,7 @@ import {browserHistory} from 'react-router/es6'; const ActionTypes = Constants.ActionTypes; const KeyCodes = Constants.KeyCodes; -import {REACTION_PATTERN} from './create_post.jsx'; - +import {REACTION_PATTERN, EMOJI_PATTERN} from './create_post.jsx'; import React from 'react'; export default class CreateComment extends React.Component { @@ -56,6 +56,10 @@ export default class CreateComment extends React.Component { this.showPostDeletedModal = this.showPostDeletedModal.bind(this); this.hidePostDeletedModal = this.hidePostDeletedModal.bind(this); this.handlePostError = this.handlePostError.bind(this); + this.handleEmojiPickerClick = this.handleEmojiPickerClick.bind(this); + this.handleEmojiClick = this.handleEmojiClick.bind(this); + this.onKeyPress = this.onKeyPress.bind(this); + this.closeEmoji = this.closeEmoji.bind(this); PostStore.clearCommentDraftUploads(); MessageHistoryStore.resetHistoryIndex('comment'); @@ -69,24 +73,85 @@ export default class CreateComment extends React.Component { submitting: false, ctrlSend: PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'), showPostDeletedModal: false, - enableAddButton + enableAddButton, + showEmojiPicker: false, + emojiOffset: 0, + emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW) }; this.lastBlurAt = 0; } + closeEmoji(clickEvent) { + /* + if the user clicked something outside the component, except the RHS emojipicker icon + and the picker is open, then close it + */ + if (clickEvent && clickEvent.srcElement && + clickEvent.srcElement.className !== '' && + clickEvent.srcElement.className.indexOf('emoji-rhs') === -1 && + this.state.showEmojiPicker) { + this.setState({showEmojiPicker: !this.state.showEmojiPicker}); + } + } + + handleEmojiPickerClick() { + const threadHeight = document.getElementById('thread--root') ? document.getElementById('thread--root').offsetHeight : 0; + const messagesHeight = document.querySelector('div.post-right-comments-container') ? document.querySelector('div.post-right-comments-container').offsetHeight : 0; + + const totalHeight = threadHeight + messagesHeight; + let pickerOffset = 0; + if (totalHeight > 361) { + pickerOffset = -361; + } else { + pickerOffset = -1 * totalHeight; + } + this.setState({showEmojiPicker: !this.state.showEmojiPicker, emojiOffset: pickerOffset}); + } + + handleEmojiClick(emoji) { + const emojiAlias = emoji.name || emoji.aliases[0]; + + if (!emojiAlias) { + //Oops.. There went something wrong + return; + } + + if (this.state.message === '') { + this.setState({message: ':' + emojiAlias + ': ', showEmojiPicker: false}); + } else { + //check whether there is already a blank at the end of the current message + const newMessage = (/\s+$/.test(this.state.message)) ? + this.state.message + ':' + emojiAlias + ': ' : this.state.message + ' :' + emojiAlias + ': '; + + this.setState({message: newMessage, showEmojiPicker: false}); + } + + this.focusTextbox(); + } + componentDidMount() { PreferenceStore.addChangeListener(this.onPreferenceChange); + document.addEventListener('keydown', this.onKeyPress); + this.focusTextbox(); } componentWillUnmount() { PreferenceStore.removeChangeListener(this.onPreferenceChange); + document.removeEventListener('keydown', this.onKeyPress); + } + + onKeyPress(e) { + if (e.which === Constants.KeyCodes.ESCAPE && this.state.showEmojiPicker === true) { + this.setState({showEmojiPicker: !this.state.showEmojiPicker}); + } } onPreferenceChange() { this.setState({ - ctrlSend: PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter') + ctrlSend: PreferenceStore.getBool(Constants.Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'), + emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW) }); } @@ -205,6 +270,14 @@ export default class CreateComment extends React.Component { GlobalActions.emitUserCommentedEvent(post); + const emojiResult = post.message.match(EMOJI_PATTERN); + if (emojiResult) { + // parse message and emit emoji event + emojiResult.forEach((emoji) => { + PostActions.emitEmojiPosted(emoji); + }); + } + PostActions.queuePost(post, false, null, (err) => { if (err.id === 'api.post.create_post.root_id.app_error') { @@ -502,6 +575,18 @@ export default class CreateComment extends React.Component { addButtonClass += ' disabled'; } + let emojiPicker = null; + if (this.state.showEmojiPicker) { + emojiPicker = ( + <EmojiPicker + onEmojiClick={this.handleEmojiClick} + topOrBottom='bottom' + emojiOffset={this.state.emojiOffset} + outsideClick={this.closeEmoji} + /> + ); + } + return ( <form onSubmit={this.handleSubmit}> <div className='post-create'> @@ -518,6 +603,7 @@ export default class CreateComment extends React.Component { value={this.state.message} onBlur={this.handleBlur} createMessage={Utils.localizeMessage('create_comment.addComment', 'Add a comment...')} + emojiEnabled={this.state.emojiPickerEnabled} initialText='' channelId={this.props.channelId} id='reply_textbox' @@ -532,7 +618,12 @@ export default class CreateComment extends React.Component { onUploadError={this.handleUploadError} postType='comment' channelId={this.props.channelId} + onEmojiClick={this.handleEmojiPickerClick} + emojiEnabled={this.state.emojiPickerEnabled} + navBarName='rhs' /> + + {emojiPicker} </div> </div> <MsgTyping diff --git a/webapp/components/create_post.jsx b/webapp/components/create_post.jsx index faa880acc..93a299b89 100644 --- a/webapp/components/create_post.jsx +++ b/webapp/components/create_post.jsx @@ -8,6 +8,7 @@ import FileUpload from './file_upload.jsx'; import FilePreview from './file_preview.jsx'; import PostDeletedModal from './post_deleted_modal.jsx'; import TutorialTip from './tutorial/tutorial_tip.jsx'; +import EmojiPicker from './emoji_picker/emoji_picker.jsx'; import AppDispatcher from 'dispatcher/app_dispatcher.jsx'; import * as GlobalActions from 'actions/global_actions.jsx'; @@ -36,6 +37,7 @@ const KeyCodes = Constants.KeyCodes; import React from 'react'; export const REACTION_PATTERN = /^(\+|-):([^:\s]+):\s*$/; +export const EMOJI_PATTERN = /:[A-Za-z-_0-9]*:/g; export default class CreatePost extends React.Component { constructor(props) { @@ -61,7 +63,10 @@ export default class CreatePost extends React.Component { this.showPostDeletedModal = this.showPostDeletedModal.bind(this); this.hidePostDeletedModal = this.hidePostDeletedModal.bind(this); this.showShortcuts = this.showShortcuts.bind(this); + this.handleEmojiClick = this.handleEmojiClick.bind(this); + this.handleEmojiPickerClick = this.handleEmojiPickerClick.bind(this); this.handlePostError = this.handlePostError.bind(this); + this.closeEmoji = this.closeEmoji.bind(this); PostStore.clearDraftUploads(); @@ -77,7 +82,9 @@ export default class CreatePost extends React.Component { fullWidthTextBox: PreferenceStore.get(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN, showTutorialTip: false, showPostDeletedModal: false, - enableSendButton: false + enableSendButton: false, + showEmojiPicker: false, + emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW) }; this.lastBlurAt = 0; @@ -87,6 +94,18 @@ export default class CreatePost extends React.Component { this.setState({postError}); } + closeEmoji(clickEvent) { + /* + if the user clicked something outside the component, except the main emojipicker icon + and the picker is open, then close it + */ + if (clickEvent && clickEvent.srcElement && + clickEvent.srcElement.className.indexOf('emoji-main') === -1 && + this.state.showEmojiPicker) { + this.setState({showEmojiPicker: !this.state.showEmojiPicker}); + } + } + handleSubmit(e) { e.preventDefault(); @@ -185,6 +204,14 @@ export default class CreatePost extends React.Component { GlobalActions.emitUserPostedEvent(post); + // parse message and emit emoji event + const emojiResult = post.message.match(EMOJI_PATTERN); + if (emojiResult) { + emojiResult.forEach((emoji) => { + PostActions.emitEmojiPosted(emoji); + }); + } + PostActions.queuePost(post, false, null, (err) => { if (err.id === 'api.post.create_post.root_id.app_error') { @@ -379,6 +406,10 @@ export default class CreatePost extends React.Component { } showShortcuts(e) { + if (e.which === Constants.KeyCodes.ESCAPE && this.state.showEmojiPicker === true) { + this.setState({showEmojiPicker: !this.state.showEmojiPicker}); + } + if ((e.ctrlKey || e.metaKey) && e.keyCode === Constants.KeyCodes.FORWARD_SLASH) { e.preventDefault(); const args = {}; @@ -411,7 +442,8 @@ export default class CreatePost extends React.Component { this.setState({ showTutorialTip: tutorialStep === TutorialSteps.POST_POPOVER, ctrlSend: PreferenceStore.getBool(Preferences.CATEGORY_ADVANCED_SETTINGS, 'send_on_ctrl_enter'), - fullWidthTextBox: PreferenceStore.get(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN + fullWidthTextBox: PreferenceStore.get(Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.CHANNEL_DISPLAY_MODE, Preferences.CHANNEL_DISPLAY_MODE_DEFAULT) === Preferences.CHANNEL_DISPLAY_MODE_FULL_SCREEN, + emojiPickerEnabled: Utils.isFeatureEnabled(Constants.PRE_RELEASE_FEATURES.EMOJI_PICKER_PREVIEW) }); } @@ -484,6 +516,31 @@ export default class CreatePost extends React.Component { }); } + handleEmojiClick(emoji) { + const emojiAlias = emoji.name || emoji.aliases[0]; + + if (!emojiAlias) { + //Oops.. There went something wrong + return; + } + + if (this.state.message === '') { + this.setState({message: ':' + emojiAlias + ': ', showEmojiPicker: false}); + } else { + //check whether there is already a blank at the end of the current message + const newMessage = (/\s+$/.test(this.state.message)) ? + this.state.message + ':' + emojiAlias + ': ' : this.state.message + ' :' + emojiAlias + ': '; + + this.setState({message: newMessage, showEmojiPicker: false}); + } + + this.focusTextbox(); + } + + handleEmojiPickerClick() { + this.setState({showEmojiPicker: !this.state.showEmojiPicker}); + } + createTutorialTip() { const screens = []; @@ -556,6 +613,17 @@ export default class CreatePost extends React.Component { if (!this.state.enableSendButton) { sendButtonClass += ' disabled'; } + let emojiPicker = null; + if (this.state.showEmojiPicker) { + emojiPicker = ( + <EmojiPicker + onEmojiClick={this.handleEmojiClick} + topOrBottom='top' + outsideClick={this.closeEmoji} + + /> + ); + } return ( <form @@ -575,22 +643,28 @@ export default class CreatePost extends React.Component { handlePostError={this.handlePostError} value={this.state.message} onBlur={this.handleBlur} + emojiEnabled={this.state.emojiPickerEnabled} createMessage={Utils.localizeMessage('create_post.write', 'Write a message...')} channelId={this.state.channelId} id='post_textbox' ref='textbox' /> + <FileUpload + ref='fileUpload' + getFileCount={this.getFileCount} + onFileUploadChange={this.handleFileUploadChange} + onUploadStart={this.handleUploadStart} + onFileUpload={this.handleFileUploadComplete} + onUploadError={this.handleUploadError} + postType='post' + channelId='' + onEmojiClick={this.handleEmojiPickerClick} + emojiEnabled={this.state.emojiPickerEnabled} + navBarName='main' + /> + + {emojiPicker} </div> - <FileUpload - ref='fileUpload' - getFileCount={this.getFileCount} - onFileUploadChange={this.handleFileUploadChange} - onUploadStart={this.handleUploadStart} - onFileUpload={this.handleFileUploadComplete} - onUploadError={this.handleUploadError} - postType='post' - channelId='' - /> <a className={sendButtonClass} onClick={this.handleSubmit} diff --git a/webapp/components/emoji_picker/components/emoji_picker_category.jsx b/webapp/components/emoji_picker/components/emoji_picker_category.jsx new file mode 100644 index 000000000..1d5b12095 --- /dev/null +++ b/webapp/components/emoji_picker/components/emoji_picker_category.jsx @@ -0,0 +1,42 @@ +// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +export default class EmojiPickerCategory extends React.Component { + static propTypes = { + category: React.PropTypes.string.isRequired, + icon: React.PropTypes.node.isRequired, + onCategoryClick: React.PropTypes.func.isRequired, + selected: React.PropTypes.bool.isRequired + } + + constructor(props) { + super(props); + + this.handleClick = this.handleClick.bind(this); + } + + handleClick(e) { + e.preventDefault(); + + this.props.onCategoryClick(this.props.category); + } + + render() { + let className = 'emoji-picker__category'; + if (this.props.selected) { + className += ' emoji-picker__category--selected'; + } + + return ( + <a + className={className} + href='#' + onClick={this.handleClick} + > + {this.props.icon} + </a> + ); + } +}
\ No newline at end of file diff --git a/webapp/components/emoji_picker/components/emoji_picker_item.jsx b/webapp/components/emoji_picker/components/emoji_picker_item.jsx new file mode 100644 index 000000000..3f38343fa --- /dev/null +++ b/webapp/components/emoji_picker/components/emoji_picker_item.jsx @@ -0,0 +1,70 @@ +// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +import EmojiStore from 'stores/emoji_store.jsx'; + +export default class EmojiPickerItem extends React.Component { + static propTypes = { + emoji: React.PropTypes.object.isRequired, + onItemOver: React.PropTypes.func.isRequired, + onItemOut: React.PropTypes.func.isRequired, + onItemClick: React.PropTypes.func.isRequired, + onItemUnmount: React.PropTypes.func.isRequired, + category: React.PropTypes.string.isRequired + } + + constructor(props) { + super(props); + + this.handleMouseOver = this.handleMouseOver.bind(this); + this.handleMouseOut = this.handleMouseOut.bind(this); + this.handleClick = this.handleClick.bind(this); + } + + componentWillUnmount() { + this.props.onItemUnmount(this.props.emoji); + } + + handleMouseOver() { + this.props.onItemOver(this.props.emoji); + } + + handleMouseOut() { + this.props.onItemOut(this.props.emoji); + } + + handleClick() { + this.props.onItemClick(this.props.emoji); + } + + render() { + let item = null; + + if (this.props.category === 'recent' || this.props.category === 'custom') { + item = + (<span> + <img + className='emoji-picker__item emoticon' + onMouseOver={this.handleMouseOver} + onMouseOut={this.handleMouseOut} + onClick={this.handleClick} + src={EmojiStore.getEmojiImageUrl(this.props.emoji)} + /> + </span>); + } else { + item = + (<div > + <img + src='/static/emoji/img_trans.gif' + className={' emojisprite emoji-' + this.props.emoji.filename + ' '} + onMouseOver={this.handleMouseOver} + onMouseOut={this.handleMouseOut} + onClick={this.handleClick} + /> + </div>); + } + return item; + } +} diff --git a/webapp/components/emoji_picker/components/emoji_picker_preview.jsx b/webapp/components/emoji_picker/components/emoji_picker_preview.jsx new file mode 100644 index 000000000..ac3f07025 --- /dev/null +++ b/webapp/components/emoji_picker/components/emoji_picker_preview.jsx @@ -0,0 +1,66 @@ +// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +import EmojiStore from 'stores/emoji_store.jsx'; + +import {FormattedMessage} from 'react-intl'; + +export default class EmojiPickerPreview extends React.Component { + static propTypes = { + emoji: React.PropTypes.object + } + + render() { + const emoji = this.props.emoji; + + if (emoji) { + let name; + let aliases; + let previewImage; + + if (emoji.aliases) { + // This is a system emoji which only has a list of aliases + name = emoji.aliases[0]; + aliases = emoji.aliases; + previewImage = (<span className='sprite-preview'><img + src='/static/emoji/img_trans.gif' + className={' emojisprite-preview emoji-' + emoji.filename + ' '} + align='absmiddle' + /></span>); + } else { + // This is a custom emoji that matches the model on the server + name = emoji.name; + aliases = [emoji.name]; + previewImage = (<img + className='emoji-picker__preview-image' + src={EmojiStore.getEmojiImageUrl(emoji)} + />); + } + + return ( + <div className='emoji-picker__preview'> + <div className='emoji-picker__preview-image-box'> + {previewImage} + </div> + <div className='emoji-picker__preview-image-box'> + <span className='emoji-picker__preview-name'>{name}</span> + <span + className='emoji-picker__preview-aliases' + >{ ':' + aliases[0] + ':'}</span> + </div> + </div> + ); + } + + return ( + <div className='emoji-picker__preview emoji-picker__preview-placeholder'> + <FormattedMessage + id='emoji_picker.emojiPicker' + defaultMessage='Emoji Picker' + /> + </div> + ); + } +} diff --git a/webapp/components/emoji_picker/emoji_picker.jsx b/webapp/components/emoji_picker/emoji_picker.jsx new file mode 100644 index 000000000..e12974054 --- /dev/null +++ b/webapp/components/emoji_picker/emoji_picker.jsx @@ -0,0 +1,417 @@ +// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +import $ from 'jquery'; +import * as Emoji from 'utils/emoji.jsx'; +import EmojiStore from 'stores/emoji_store.jsx'; +import PureRenderMixin from 'react-addons-pure-render-mixin'; +import ReactDOM from 'react-dom'; +import * as Utils from 'utils/utils.jsx'; +import ReactOutsideEvent from 'react-outside-event'; +import {FormattedMessage} from 'react-intl'; + +import EmojiPickerCategory from './components/emoji_picker_category.jsx'; +import EmojiPickerItem from './components/emoji_picker_item.jsx'; +import EmojiPickerPreview from './components/emoji_picker_preview.jsx'; + +// This should include all the categories available in Emoji.CategoryNames +const CATEGORIES = [ + 'recent', + 'people', + 'nature', + 'food', + 'activity', + 'travel', + 'objects', + 'symbols', + 'flags', + 'custom' +]; + +class EmojiPicker extends React.Component { + static propTypes = { + customEmojis: React.PropTypes.object, + onEmojiClick: React.PropTypes.func.isRequired, + topOrBottom: React.PropTypes.string.isRequired, + emojiOffset: React.PropTypes.number, + outsideClick: React.PropTypes.func + } + + constructor(props) { + super(props); + + // All props are primitives or treated as immutable + this.shouldComponentUpdate = PureRenderMixin.shouldComponentUpdate.bind(this); + + this.handleCategoryClick = this.handleCategoryClick.bind(this); + this.handleFilterChange = this.handleFilterChange.bind(this); + this.handleItemOver = this.handleItemOver.bind(this); + this.handleItemOut = this.handleItemOut.bind(this); + this.handleItemClick = this.handleItemClick.bind(this); + this.handleScroll = this.handleScroll.bind(this); + this.handleItemUnmount = this.handleItemUnmount.bind(this); + this.renderCategory = this.renderCategory.bind(this); + this.onOutsideEvent = this.onOutsideEvent.bind(this); + + this.state = { + category: 'recent', + filter: '', + selected: null + }; + } + + componentDidMount() { + this.searchInput.focus(); + } + + onOutsideEvent = (event) => { + // Handle the event. + this.props.outsideClick(event); + } + + handleCategoryClick(category) { + const items = this.refs.items; + + if (category === CATEGORIES[0]) { + // First category includes the search box so just scroll to the top + items.scrollTop = 0; + } else { + const cat = this.refs[category]; + items.scrollTop = cat.offsetTop; + } + } + + handleFilterChange(e) { + this.setState({filter: e.target.value}); + } + + handleItemOver(emoji) { + clearTimeout(this.timeouthandler); + this.setState({selected: emoji}); + } + + handleItemOut() { + this.timeouthandler = setTimeout(() => this.setState({selected: null}), 500); + } + + handleItemUnmount(emoji) { + //Prevent emoji preview from showing emoji which is not present anymore (due to filter) + if (this.state.selected === emoji) { + this.setState({selected: null}); + } + } + + handleItemClick(emoji) { + this.props.onEmojiClick(emoji); + } + + handleScroll() { + const items = $(ReactDOM.findDOMNode(this.refs.items)); + + const contentTop = items.scrollTop(); + const contentTopPadding = parseInt(items.css('padding-top'), 10); + const scrollPct = (contentTop / (items[0].scrollHeight - items[0].clientHeight)) * 100.0; + + if (scrollPct > 99.0) { + this.setState({category: 'custom'}); + return; + } + + for (const category of CATEGORIES) { + const header = $(ReactDOM.findDOMNode(this.refs[category])); + const headerBottomMargin = parseInt(header.css('margin-bottom'), 10) + parseInt(header.css('padding-bottom'), 10); + const headerBottom = header[0].offsetTop + header.height() + headerBottomMargin; + + // If category is the first one visible, highlight it in the bar at the top + if (headerBottom - contentTopPadding >= contentTop) { + if (this.state.category !== category) { + this.setState({category: String(category)}); + } + + break; + } + } + } + renderCategory(category, filter) { + const items = []; + let indices = []; + let recentEmojis = []; + + if (category === 'recent') { + recentEmojis = EmojiStore.getRecentEmojis(); + indices = [...Array(recentEmojis.length).keys()]; + + // reverse indices so most recently added is first + indices.reverse(); + } else { + indices = Emoji.EmojiIndicesByCategory.get(category) || []; + } + + for (const index of indices) { + let emoji = {}; + if (category === 'recent') { + emoji = recentEmojis[index]; + } else { + emoji = Emoji.Emojis[index]; + } + if (filter) { + let matches = false; + + for (const alias of emoji.aliases || [...emoji.name]) { + if (alias.indexOf(filter) !== -1) { + matches = true; + break; + } + } + + if (!matches) { + continue; + } + } + + items.push( + <EmojiPickerItem + key={'system_' + (category === 'recent' ? 'recent_' : '') + (emoji.name || emoji.aliases[0])} + emoji={emoji} + category={category} + onItemOver={this.handleItemOver} + onItemOut={this.handleItemOut} + onItemClick={this.handleItemClick} + onItemUnmount={this.handleItemUnmount} + /> + ); + } + + if (category === 'custom') { + const customEmojis = EmojiStore.getCustomEmojiMap().values(); + + for (const emoji of customEmojis) { + if (filter && emoji.name.indexOf(filter) === -1) { + continue; + } + + items.push( + <EmojiPickerItem + key={'custom_' + emoji.name} + emoji={emoji} + category={category} + onItemOver={this.handleItemOver} + onItemOut={this.handleItemOut} + onItemClick={this.handleItemClick} + onItemUnmount={this.handleItemUnmount} + + /> + ); + } + } + + // Only render the header if there's any visible items + let header = null; + if (items.length > 0) { + header = ( + <div + className='emoji-picker__category-header' + > + <FormattedMessage id={'emoji_picker.' + category}/> + </div> + ); + } + + return ( + <div + key={'category_' + category} + id={'emojipickercat-' + category} + ref={category} + > + {header} + <div className='emoji-picker-items__container'> + {items} + </div> + </div> + ); + } + + renderPreview(selected) { + if (selected) { + let name; + let aliases; + let previewImage; + if (selected.name) { + // This is a custom emoji that matches the model on the server + name = selected.name; + aliases = [selected.name]; + previewImage = (<img + className='emoji-picker__preview-image' + align='absmiddle' + src={EmojiStore.getEmojiImageUrl(selected)} + />); + } else { + // This is a system emoji which only has a list of aliases + name = selected.aliases[0]; + aliases = selected.aliases; + previewImage = (<span ><img + src='/static/emoji/img_trans.gif' + className={' emojisprite-preview emoji-' + selected.filename + ' '} + align='absmiddle' + /></span>); + } + + return ( + <div className='emoji-picker__preview'> + {previewImage} + <span className='emoji-picker__preview-name'>{name}</span> + <span className='emoji-picker__preview-aliases'>{aliases.map((alias) => ':' + alias + ':').join(' ')}</span> + </div> + ); + } + + return ( + <span className='emoji-picker__preview-placeholder'> + <FormattedMessage + id='emoji_picker.emojiPicker' + defaultMessage='Emoji Picker' + /> + </span> + ); + } + + render() { + const items = []; + + for (const category of CATEGORIES) { + if (category === 'custom') { + items.push(this.renderCategory('custom', this.state.filter, this.props.customEmojis)); + } else { + items.push(this.renderCategory(category, this.state.filter)); + } + } + const cssclass = this.props.topOrBottom === 'top' ? 'emoji-picker' : 'emoji-picker-bottom'; + const pickerStyle = this.props.emojiOffset ? {top: this.props.emojiOffset} : {}; + return ( + <div + style={pickerStyle} + className={cssclass} + > + <div className='emoji-picker__categories'> + <EmojiPickerCategory + category='recent' + icon={<i + className='fa fa-clock-o' + title={Utils.localizeMessage('emoji_picker.recent', 'Recently Used')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'recent'} + /> + <EmojiPickerCategory + category='people' + icon={<i + className='fa fa-smile-o' + title={Utils.localizeMessage('emoji_picker.people', 'People')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'people'} + /> + <EmojiPickerCategory + category='nature' + icon={<i + className='fa fa-leaf' + title={Utils.localizeMessage('emoji_picker.nature', 'Nature')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'nature'} + /> + <EmojiPickerCategory + category='food' + icon={<i + className='fa fa-cutlery' + title={Utils.localizeMessage('emoji_picker.food', 'Food')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'food'} + /> + <EmojiPickerCategory + category='activity' + icon={<i + className='fa fa-futbol-o' + title={Utils.localizeMessage('emoji_picker.activity', 'Activity')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'activity'} + /> + <EmojiPickerCategory + category='travel' + icon={<i + className='fa fa-plane' + title={Utils.localizeMessage('emoji_picker.travel', 'Travel')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'travel'} + /> + <EmojiPickerCategory + category='objects' + icon={<i + className='fa fa-lightbulb-o' + title={Utils.localizeMessage('emoji_picker.objects', 'Objects')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'objects'} + /> + <EmojiPickerCategory + category='symbols' + icon={<i + className='fa fa-heart-o' + title={Utils.localizeMessage('emoji_picker.symbols', 'Symbols')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'symbols'} + /> + <EmojiPickerCategory + category='flags' + icon={<i + className='fa fa-flag-o' + title={Utils.localizeMessage('emoji_picker.flags', 'Flags')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'flags'} + /> + <EmojiPickerCategory + category='custom' + icon={<i + className='fa fa-at' + title={Utils.localizeMessage('emoji_picker.custom', 'Custom')} + />} + onCategoryClick={this.handleCategoryClick} + selected={this.state.category === 'custom'} + /> + </div> + <div className='emoji-picker__search-container'> + <span className='fa fa-search emoji-picker__search-icon'/> + <input + ref={(input) => { + this.searchInput = input; + }} + className='emoji-picker__search' + type='text' + onChange={this.handleFilterChange} + placeholder={Utils.localizeMessage('emoji_picker.search', 'search')} + /> + </div> + <div + ref='items' + id='emojipickeritems' + className='emoji-picker__items' + onScroll={this.handleScroll} + > + {items} + </div> + <EmojiPickerPreview emoji={this.state.selected}/> + </div> + ); + } +} + +// disabling eslint check for outslide click handler +// eslint-disable-next-line new-cap +export default ReactOutsideEvent(EmojiPicker, ['click']); diff --git a/webapp/components/emoji_picker/emoji_picker_container.jsx b/webapp/components/emoji_picker/emoji_picker_container.jsx new file mode 100644 index 000000000..7cdc0e4b9 --- /dev/null +++ b/webapp/components/emoji_picker/emoji_picker_container.jsx @@ -0,0 +1,46 @@ +// Copyright (c) 2016 Mattermost, Inc. All Rights Reserved. +// See License.txt for license information. + +import React from 'react'; + +import EmojiStore from 'stores/emoji_store.jsx'; + +import EmojiPicker from './emoji_picker.jsx'; + +export default class EmojiPickerContainer extends React.Component { + static propTypes = { + onEmojiClick: React.PropTypes.func.isRequred + } + + constructor(props) { + super(props); + this.handleEmojiChange = this.handleEmojiChange.bind(this); + + this.state = { + customEmojis: EmojiStore.getCustomEmojiMap().values() ? EmojiStore.getCustomEmojiMap().values() : [] + }; + } + + componentDidMount() { + EmojiStore.addChangeListener(this.handleEmojiChange); + } + + componentWillUnount() { + EmojiStore.removeChangeListener(this.handleEmojiChange); + } + + handleEmojiChange() { + this.setState({ + customEmojis: EmojiStore.getCustomEmojiMap().values() + }); + } + + render() { + return ( + <EmojiPicker + customEmojis={EmojiStore.getCustomEmojiMap().values()} + onEmojiClick={this.props.onEmojiClick} + /> + ); + } +} diff --git a/webapp/components/file_upload.jsx b/webapp/components/file_upload.jsx index e1535c0bb..297095e0a 100644 --- a/webapp/components/file_upload.jsx +++ b/webapp/components/file_upload.jsx @@ -49,6 +49,7 @@ class FileUpload extends React.Component { this.pasteUpload = this.pasteUpload.bind(this); this.keyUpload = this.keyUpload.bind(this); this.handleMaxUploadReached = this.handleMaxUploadReached.bind(this); + this.emojiClick = this.emojiClick.bind(this); this.state = { requests: {} @@ -210,7 +211,9 @@ class FileUpload extends React.Component { // jquery-dragster doesn't provide a function to unregister itself so do it manually target.off('dragenter dragleave dragover drop dragster:enter dragster:leave dragster:over dragster:drop'); } - + emojiClick() { + this.props.onEmojiClick(); + } pasteUpload(e) { var inputDiv = ReactDOM.findDOMNode(this.refs.input); const {formatMessage} = this.props.intl; @@ -347,24 +350,33 @@ class FileUpload extends React.Component { const channelId = this.props.channelId || ChannelStore.getCurrentId(); const uploadsRemaining = Constants.MAX_UPLOAD_FILES - this.props.getFileCount(channelId); + const emojiSpan = (<span + className={'fa fa-smile-o icon--emoji-picker emoji-' + this.props.navBarName} + onClick={this.emojiClick} + />); + const filestyle = {visibility: 'hidden'}; return ( <span ref='input' className={'btn btn-file' + (uploadsRemaining <= 0 ? ' btn-file__disabled' : '')} > - <span - className='icon' - dangerouslySetInnerHTML={{__html: Constants.ATTACHMENT_ICON_SVG}} - /> - <input - ref='fileInput' - type='file' - onChange={this.handleChange} - onClick={uploadsRemaining > 0 ? this.props.onClick : this.handleMaxUploadReached} - multiple={multiple} - accept={accept} - /> + <div className='icon--attachment'> + <span + dangerouslySetInnerHTML={{__html: Constants.ATTACHMENT_ICON_SVG}} + onClick={() => this.refs.fileInput.click()} + /> + <input + ref='fileInput' + type='file' + style={filestyle} + onChange={this.handleChange} + onClick={uploadsRemaining > 0 ? this.props.onClick : this.handleMaxUploadReached} + multiple={multiple} + accept={accept} + /> + </div> + {this.props.emojiEnabled ? emojiSpan : ''} </span> ); } @@ -380,7 +392,10 @@ FileUpload.propTypes = { onFileUploadChange: React.PropTypes.func, onTextDrop: React.PropTypes.func, channelId: React.PropTypes.string, - postType: React.PropTypes.string + postType: React.PropTypes.string, + onEmojiClick: React.PropTypes.func, + navBarName: React.PropTypes.string, + emojiEnabled: React.PropTypes.bool }; export default injectIntl(FileUpload, {withRef: true}); diff --git a/webapp/components/rhs_root_post.jsx b/webapp/components/rhs_root_post.jsx index 83d930bca..231033fb1 100644 --- a/webapp/components/rhs_root_post.jsx +++ b/webapp/components/rhs_root_post.jsx @@ -517,7 +517,10 @@ export default class RhsRootPost extends React.Component { }; return ( - <div className={'post post--root post--thread ' + userCss + ' ' + systemMessageClass + ' ' + compactClass}> + <div + id='thread--root' + className={'post post--root post--thread ' + userCss + ' ' + systemMessageClass + ' ' + compactClass} + > <div className='post-right-channel__name'>{channelName}</div> <div className='post__content'> {profilePicContainer} diff --git a/webapp/components/textbox.jsx b/webapp/components/textbox.jsx index f1f6d2a0a..7f3dc1891 100644 --- a/webapp/components/textbox.jsx +++ b/webapp/components/textbox.jsx @@ -32,7 +32,8 @@ export default class Textbox extends React.Component { onBlur: React.PropTypes.func, supportsCommands: React.PropTypes.bool.isRequired, handlePostError: React.PropTypes.func, - suggestionListStyle: React.PropTypes.string + suggestionListStyle: React.PropTypes.string, + emojiEnabled: React.PropTypes.bool }; static defaultProps = { @@ -249,7 +250,7 @@ export default class Textbox extends React.Component { <SuggestionBox id={this.props.id} ref='message' - className={`form-control custom-textarea ${this.state.connection}`} + className={`form-control custom-textarea${this.props.emojiEnabled ? '-emoji' : ''} ${this.state.connection}`} type='textarea' spellCheck='true' placeholder={this.props.createMessage} diff --git a/webapp/components/user_settings/user_settings_advanced.jsx b/webapp/components/user_settings/user_settings_advanced.jsx index 970856acc..cf05ab402 100644 --- a/webapp/components/user_settings/user_settings_advanced.jsx +++ b/webapp/components/user_settings/user_settings_advanced.jsx @@ -351,6 +351,13 @@ export default class AdvancedSettingsDisplay extends React.Component { defaultMessage='Enable the ability to make and receive one-on-one WebRTC calls' /> ); + case 'EMOJI_PICKER_PREVIEW': + return ( + <FormattedMessage + id='user.settings.advance.emojipicker' + defaultMessage='Enable the emoji picker' + /> + ); default: return null; } diff --git a/webapp/i18n/en.json b/webapp/i18n/en.json index 07cccd65c..05abf6ae2 100755 --- a/webapp/i18n/en.json +++ b/webapp/i18n/en.json @@ -1287,6 +1287,18 @@ "emoji_list.name": "Name", "emoji_list.search": "Search Custom Emoji", "emoji_list.somebody": "Somebody on another team", + "emoji_picker.activity": "Activity", + "emoji_picker.custom": "Custom", + "emoji_picker.emojiPicker": "Emoji Picker", + "emoji_picker.flags": "Flags", + "emoji_picker.food": "Food", + "emoji_picker.nature": "Nature", + "emoji_picker.objects": "Objects", + "emoji_picker.people": "People", + "emoji_picker.recent": "Recently Used", + "emoji_picker.search": "Search", + "emoji_picker.symbols": "Symbols", + "emoji_picker.travel": "Travel", "error.not_found.link_message": "Back to Mattermost", "error.not_found.message": "The page you were trying to reach does not exist", "error.not_found.title": "Page not found", @@ -1989,6 +2001,7 @@ "user.settings.advance.slashCmd_autocmp": "Enable external application to offer slash command autocomplete", "user.settings.advance.title": "Advanced Settings", "user.settings.advance.webrtc_preview": "Enable the ability to make and receive one-on-one WebRTC calls", + "user.settings.advance.emojipicker": "Enable emoji picker in message input box", "user.settings.custom_theme.awayIndicator": "Away Indicator", "user.settings.custom_theme.buttonBg": "Button BG", "user.settings.custom_theme.buttonColor": "Button Text", diff --git a/webapp/images/emoji/emojilarge.png b/webapp/images/emoji/emojilarge.png Binary files differnew file mode 100644 index 000000000..fd230ab6d --- /dev/null +++ b/webapp/images/emoji/emojilarge.png diff --git a/webapp/images/emoji/img_trans.gif b/webapp/images/emoji/img_trans.gif Binary files differnew file mode 100644 index 000000000..35d42e808 --- /dev/null +++ b/webapp/images/emoji/img_trans.gif diff --git a/webapp/package.json b/webapp/package.json index 9f53c848f..0d79b1430 100644 --- a/webapp/package.json +++ b/webapp/package.json @@ -75,6 +75,7 @@ "react-dom": "15.4.2", "sass-loader": "6.0.3", "style-loader": "0.13.2", + "react-outside-event": "1.2.4", "url-loader": "0.5.8", "webpack": "2.2.1", "webpack-node-externals": "1.5.4" diff --git a/webapp/sass/components/_emojisprite.scss b/webapp/sass/components/_emojisprite.scss new file mode 100644 index 000000000..5a2bd0e58 --- /dev/null +++ b/webapp/sass/components/_emojisprite.scss @@ -0,0 +1,3519 @@ +@charset "UTF-8"; + +.emojisprite-preview { + @include transform(scale(.55)); + background-image: url(../images/emoji/emojilarge.png); + background-repeat: no-repeat; + cursor: pointer; + height: 64px; + max-width: none; + transform-origin: 0 0; + width: 64px; + padding: 0 10px 0 0; + + +} + + + + +.emojisprite { + @include transform(scale(.35)); + background-image: url(../images/emoji/emojilarge.png); + background-repeat: no-repeat; + border-radius: 18px; + cursor: pointer; + height: 64px; + max-width: none; + transform-origin: 0 0; + width: 64px; + +} + +.emoji-0023-20e3 { + background-position: -2px -2px; +} + +.emoji-0030-20e3 { + background-position: -70px -2px; +} + +.emoji-0031-20e3 { + background-position: -138px -2px; +} + +.emoji-0032-20e3 { + background-position: -206px -2px; +} + +.emoji-0033-20e3 { + background-position: -274px -2px; +} + +.emoji-0034-20e3 { + background-position: -342px -2px; +} + +.emoji-0035-20e3 { + background-position: -410px -2px; +} + +.emoji-0036-20e3 { + background-position: -478px -2px; +} + +.emoji-0037-20e3 { + background-position: -546px -2px; +} + +.emoji-0038-20e3 { + background-position: -614px -2px; +} + +.emoji-0039-20e3 { + background-position: -682px -2px; +} + +.emoji-00a9 { + background-position: -750px -2px; +} + +.emoji-00ae { + background-position: -818px -2px; +} + +.emoji-1f004 { + background-position: -886px -2px; +} + +.emoji-1f0cf { + background-position: -954px -2px; +} + +.emoji-1f170 { + background-position: -1022px -2px; +} + +.emoji-1f171 { + background-position: -1090px -2px; +} + +.emoji-1f17e { + background-position: -1158px -2px; +} + +.emoji-1f17f { + background-position: -1226px -2px; +} + +.emoji-1f18e { + background-position: -1294px -2px; +} + +.emoji-1f191 { + background-position: -1362px -2px; +} + +.emoji-1f192 { + background-position: -1430px -2px; +} + +.emoji-1f193 { + background-position: -1498px -2px; +} + +.emoji-1f194 { + background-position: -1566px -2px; +} + +.emoji-1f195 { + background-position: -1634px -2px; +} + +.emoji-1f196 { + background-position: -1702px -2px; +} + +.emoji-1f197 { + background-position: -1770px -2px; +} + +.emoji-1f198 { + background-position: -1838px -2px; +} + +.emoji-1f199 { + background-position: -1906px -2px; +} + +.emoji-1f19a { + background-position: -2px -70px; +} + +.emoji-1f1e8-1f1e6 { + background-position: -70px -70px; +} + +.emoji-1f1e8-1f1f3 { + background-position: -138px -70px; +} + +.emoji-1f1e9-1f1ea { + background-position: -206px -70px; +} + +.emoji-1f1ea-1f1f8 { + background-position: -274px -70px; +} + +.emoji-1f1eb-1f1f7 { + background-position: -342px -70px; +} + +.emoji-1f1ec-1f1e7 { + background-position: -410px -70px; +} + +.emoji-1f1ee-1f1f9 { + background-position: -478px -70px; +} + +.emoji-1f1ef-1f1f5 { + background-position: -546px -70px; +} + +.emoji-1f1f0-1f1f7 { + background-position: -614px -70px; +} + +.emoji-1f1f5-1f1f0 { + background-position: -682px -70px; +} + +.emoji-1f1f7-1f1fa { + background-position: -750px -70px; +} + +.emoji-1f1fa-1f1f8 { + background-position: -818px -70px; +} + +.emoji-1f1ff-1f1e6 { + background-position: -886px -70px; +} + +.emoji-1f201 { + background-position: -954px -70px; +} + +.emoji-1f202 { + background-position: -1022px -70px; +} + +.emoji-1f21a { + background-position: -1090px -70px; +} + +.emoji-1f22f { + background-position: -1158px -70px; +} + +.emoji-1f232 { + background-position: -1226px -70px; +} + +.emoji-1f233 { + background-position: -1294px -70px; +} + +.emoji-1f234 { + background-position: -1362px -70px; +} + +.emoji-1f235 { + background-position: -1430px -70px; +} + +.emoji-1f236 { + background-position: -1498px -70px; +} + +.emoji-1f237 { + background-position: -1566px -70px; +} + +.emoji-1f238 { + background-position: -1634px -70px; +} + +.emoji-1f239 { + background-position: -1702px -70px; +} + +.emoji-1f23a { + background-position: -1770px -70px; +} + +.emoji-1f250 { + background-position: -1838px -70px; +} + +.emoji-1f251 { + background-position: -1906px -70px; +} + +.emoji-1f300 { + background-position: -2px -138px; +} + +.emoji-1f301 { + background-position: -70px -138px; +} + +.emoji-1f302 { + background-position: -138px -138px; +} + +.emoji-1f303 { + background-position: -206px -138px; +} + +.emoji-1f304 { + background-position: -274px -138px; +} + +.emoji-1f305 { + background-position: -342px -138px; +} + +.emoji-1f306 { + background-position: -410px -138px; +} + +.emoji-1f307 { + background-position: -478px -138px; +} + +.emoji-1f308 { + background-position: -546px -138px; +} + +.emoji-1f309 { + background-position: -614px -138px; +} + +.emoji-1f30a { + background-position: -682px -138px; +} + +.emoji-1f30b { + background-position: -750px -138px; +} + +.emoji-1f30c { + background-position: -818px -138px; +} + +.emoji-1f30d { + background-position: -886px -138px; +} + +.emoji-1f30e { + background-position: -954px -138px; +} + +.emoji-1f30f { + background-position: -1022px -138px; +} + +.emoji-1f310 { + background-position: -1090px -138px; +} + +.emoji-1f311 { + background-position: -1158px -138px; +} + +.emoji-1f312 { + background-position: -1226px -138px; +} + +.emoji-1f313 { + background-position: -1294px -138px; +} + +.emoji-1f314 { + background-position: -1362px -138px; +} + +.emoji-1f315 { + background-position: -1430px -138px; +} + +.emoji-1f316 { + background-position: -1498px -138px; +} + +.emoji-1f317 { + background-position: -1566px -138px; +} + +.emoji-1f318 { + background-position: -1634px -138px; +} + +.emoji-1f319 { + background-position: -1702px -138px; +} + +.emoji-1f31a { + background-position: -1770px -138px; +} + +.emoji-1f31b { + background-position: -1838px -138px; +} + +.emoji-1f31c { + background-position: -1906px -138px; +} + +.emoji-1f31d { + background-position: -2px -206px; +} + +.emoji-1f31e { + background-position: -70px -206px; +} + +.emoji-1f31f { + background-position: -138px -206px; +} + +.emoji-1f320 { + background-position: -206px -206px; +} + +.emoji-1f330 { + background-position: -274px -206px; +} + +.emoji-1f331 { + background-position: -342px -206px; +} + +.emoji-1f332 { + background-position: -410px -206px; +} + +.emoji-1f333 { + background-position: -478px -206px; +} + +.emoji-1f334 { + background-position: -546px -206px; +} + +.emoji-1f335 { + background-position: -614px -206px; +} + +.emoji-1f337 { + background-position: -682px -206px; +} + +.emoji-1f338 { + background-position: -750px -206px; +} + +.emoji-1f339 { + background-position: -818px -206px; +} + +.emoji-1f33a { + background-position: -886px -206px; +} + +.emoji-1f33b { + background-position: -954px -206px; +} + +.emoji-1f33c { + background-position: -1022px -206px; +} + +.emoji-1f33d { + background-position: -1090px -206px; +} + +.emoji-1f33e { + background-position: -1158px -206px; +} + +.emoji-1f33f { + background-position: -1226px -206px; +} + +.emoji-1f340 { + background-position: -1294px -206px; +} + +.emoji-1f341 { + background-position: -1362px -206px; +} + +.emoji-1f342 { + background-position: -1430px -206px; +} + +.emoji-1f343 { + background-position: -1498px -206px; +} + +.emoji-1f344 { + background-position: -1566px -206px; +} + +.emoji-1f345 { + background-position: -1634px -206px; +} + +.emoji-1f346 { + background-position: -1702px -206px; +} + +.emoji-1f347 { + background-position: -1770px -206px; +} + +.emoji-1f348 { + background-position: -1838px -206px; +} + +.emoji-1f349 { + background-position: -1906px -206px; +} + +.emoji-1f34a { + background-position: -2px -274px; +} + +.emoji-1f34b { + background-position: -70px -274px; +} + +.emoji-1f34c { + background-position: -138px -274px; +} + +.emoji-1f34d { + background-position: -206px -274px; +} + +.emoji-1f34e { + background-position: -274px -274px; +} + +.emoji-1f34f { + background-position: -342px -274px; +} + +.emoji-1f350 { + background-position: -410px -274px; +} + +.emoji-1f351 { + background-position: -478px -274px; +} + +.emoji-1f352 { + background-position: -546px -274px; +} + +.emoji-1f353 { + background-position: -614px -274px; +} + +.emoji-1f354 { + background-position: -682px -274px; +} + +.emoji-1f355 { + background-position: -750px -274px; +} + +.emoji-1f356 { + background-position: -818px -274px; +} + +.emoji-1f357 { + background-position: -886px -274px; +} + +.emoji-1f358 { + background-position: -954px -274px; +} + +.emoji-1f359 { + background-position: -1022px -274px; +} + +.emoji-1f35a { + background-position: -1090px -274px; +} + +.emoji-1f35b { + background-position: -1158px -274px; +} + +.emoji-1f35c { + background-position: -1226px -274px; +} + +.emoji-1f35d { + background-position: -1294px -274px; +} + +.emoji-1f35e { + background-position: -1362px -274px; +} + +.emoji-1f35f { + background-position: -1430px -274px; +} + +.emoji-1f360 { + background-position: -1498px -274px; +} + +.emoji-1f361 { + background-position: -1566px -274px; +} + +.emoji-1f362 { + background-position: -1634px -274px; +} + +.emoji-1f363 { + background-position: -1702px -274px; +} + +.emoji-1f364 { + background-position: -1770px -274px; +} + +.emoji-1f365 { + background-position: -1838px -274px; +} + +.emoji-1f366 { + background-position: -1906px -274px; +} + +.emoji-1f367 { + background-position: -2px -342px; +} + +.emoji-1f368 { + background-position: -70px -342px; +} + +.emoji-1f369 { + background-position: -138px -342px; +} + +.emoji-1f36a { + background-position: -206px -342px; +} + +.emoji-1f36b { + background-position: -274px -342px; +} + +.emoji-1f36c { + background-position: -342px -342px; +} + +.emoji-1f36d { + background-position: -410px -342px; +} + +.emoji-1f36e { + background-position: -478px -342px; +} + +.emoji-1f36f { + background-position: -546px -342px; +} + +.emoji-1f370 { + background-position: -614px -342px; +} + +.emoji-1f371 { + background-position: -682px -342px; +} + +.emoji-1f372 { + background-position: -750px -342px; +} + +.emoji-1f373 { + background-position: -818px -342px; +} + +.emoji-1f374 { + background-position: -886px -342px; +} + +.emoji-1f375 { + background-position: -954px -342px; +} + +.emoji-1f376 { + background-position: -1022px -342px; +} + +.emoji-1f377 { + background-position: -1090px -342px; +} + +.emoji-1f378 { + background-position: -1158px -342px; +} + +.emoji-1f379 { + background-position: -1226px -342px; +} + +.emoji-1f37a { + background-position: -1294px -342px; +} + +.emoji-1f37b { + background-position: -1362px -342px; +} + +.emoji-1f37c { + background-position: -1430px -342px; +} + +.emoji-1f380 { + background-position: -1498px -342px; +} + +.emoji-1f381 { + background-position: -1566px -342px; +} + +.emoji-1f382 { + background-position: -1634px -342px; +} + +.emoji-1f383 { + background-position: -1702px -342px; +} + +.emoji-1f384 { + background-position: -1770px -342px; +} + +.emoji-1f385 { + background-position: -1838px -342px; +} + +.emoji-1f386 { + background-position: -1906px -342px; +} + +.emoji-1f387 { + background-position: -2px -410px; +} + +.emoji-1f388 { + background-position: -70px -410px; +} + +.emoji-1f389 { + background-position: -138px -410px; +} + +.emoji-1f38a { + background-position: -206px -410px; +} + +.emoji-1f38b { + background-position: -274px -410px; +} + +.emoji-1f38c { + background-position: -342px -410px; +} + +.emoji-1f38d { + background-position: -410px -410px; +} + +.emoji-1f38e { + background-position: -478px -410px; +} + +.emoji-1f38f { + background-position: -546px -410px; +} + +.emoji-1f390 { + background-position: -614px -410px; +} + +.emoji-1f391 { + background-position: -682px -410px; +} + +.emoji-1f392 { + background-position: -750px -410px; +} + +.emoji-1f393 { + background-position: -818px -410px; +} + +.emoji-1f3a0 { + background-position: -886px -410px; +} + +.emoji-1f3a1 { + background-position: -954px -410px; +} + +.emoji-1f3a2 { + background-position: -1022px -410px; +} + +.emoji-1f3a3 { + background-position: -1090px -410px; +} + +.emoji-1f3a4 { + background-position: -1158px -410px; +} + +.emoji-1f3a5 { + background-position: -1226px -410px; +} + +.emoji-1f3a6 { + background-position: -1294px -410px; +} + +.emoji-1f3a7 { + background-position: -1362px -410px; +} + +.emoji-1f3a8 { + background-position: -1430px -410px; +} + +.emoji-1f3a9 { + background-position: -1498px -410px; +} + +.emoji-1f3aa { + background-position: -1566px -410px; +} + +.emoji-1f3ab { + background-position: -1634px -410px; +} + +.emoji-1f3ac { + background-position: -1702px -410px; +} + +.emoji-1f3ad { + background-position: -1770px -410px; +} + +.emoji-1f3ae { + background-position: -1838px -410px; +} + +.emoji-1f3af { + background-position: -1906px -410px; +} + +.emoji-1f3b0 { + background-position: -2px -478px; +} + +.emoji-1f3b1 { + background-position: -70px -478px; +} + +.emoji-1f3b2 { + background-position: -138px -478px; +} + +.emoji-1f3b3 { + background-position: -206px -478px; +} + +.emoji-1f3b4 { + background-position: -274px -478px; +} + +.emoji-1f3b5 { + background-position: -342px -478px; +} + +.emoji-1f3b6 { + background-position: -410px -478px; +} + +.emoji-1f3b7 { + background-position: -478px -478px; +} + +.emoji-1f3b8 { + background-position: -546px -478px; +} + +.emoji-1f3b9 { + background-position: -614px -478px; +} + +.emoji-1f3ba { + background-position: -682px -478px; +} + +.emoji-1f3bb { + background-position: -750px -478px; +} + +.emoji-1f3bc { + background-position: -818px -478px; +} + +.emoji-1f3bd { + background-position: -886px -478px; +} + +.emoji-1f3be { + background-position: -954px -478px; +} + +.emoji-1f3bf { + background-position: -1022px -478px; +} + +.emoji-1f3c0 { + background-position: -1090px -478px; +} + +.emoji-1f3c1 { + background-position: -1158px -478px; +} + +.emoji-1f3c2 { + background-position: -1226px -478px; +} + +.emoji-1f3c3 { + background-position: -1294px -478px; +} + +.emoji-1f3c4 { + background-position: -1362px -478px; +} + +.emoji-1f3c6 { + background-position: -1430px -478px; +} + +.emoji-1f3c7 { + background-position: -1498px -478px; +} + +.emoji-1f3c8 { + background-position: -1566px -478px; +} + +.emoji-1f3c9 { + background-position: -1634px -478px; +} + +.emoji-1f3ca { + background-position: -1702px -478px; +} + +.emoji-1f3e0 { + background-position: -1770px -478px; +} + +.emoji-1f3e1 { + background-position: -1838px -478px; +} + +.emoji-1f3e2 { + background-position: -1906px -478px; +} + +.emoji-1f3e3 { + background-position: -2px -546px; +} + +.emoji-1f3e4 { + background-position: -70px -546px; +} + +.emoji-1f3e5 { + background-position: -138px -546px; +} + +.emoji-1f3e6 { + background-position: -206px -546px; +} + +.emoji-1f3e7 { + background-position: -274px -546px; +} + +.emoji-1f3e8 { + background-position: -342px -546px; +} + +.emoji-1f3e9 { + background-position: -410px -546px; +} + +.emoji-1f3ea { + background-position: -478px -546px; +} + +.emoji-1f3eb { + background-position: -546px -546px; +} + +.emoji-1f3ec { + background-position: -614px -546px; +} + +.emoji-1f3ed { + background-position: -682px -546px; +} + +.emoji-1f3ee { + background-position: -750px -546px; +} + +.emoji-1f3ef { + background-position: -818px -546px; +} + +.emoji-1f3f0 { + background-position: -886px -546px; +} + +.emoji-1f400 { + background-position: -954px -546px; +} + +.emoji-1f401 { + background-position: -1022px -546px; +} + +.emoji-1f402 { + background-position: -1090px -546px; +} + +.emoji-1f403 { + background-position: -1158px -546px; +} + +.emoji-1f404 { + background-position: -1226px -546px; +} + +.emoji-1f405 { + background-position: -1294px -546px; +} + +.emoji-1f406 { + background-position: -1362px -546px; +} + +.emoji-1f407 { + background-position: -1430px -546px; +} + +.emoji-1f408 { + background-position: -1498px -546px; +} + +.emoji-1f409 { + background-position: -1566px -546px; +} + +.emoji-1f40a { + background-position: -1634px -546px; +} + +.emoji-1f40b { + background-position: -1702px -546px; +} + +.emoji-1f40c { + background-position: -1770px -546px; +} + +.emoji-1f40d { + background-position: -1838px -546px; +} + +.emoji-1f40e { + background-position: -1906px -546px; +} + +.emoji-1f40f { + background-position: -2px -614px; +} + +.emoji-1f410 { + background-position: -70px -614px; +} + +.emoji-1f411 { + background-position: -138px -614px; +} + +.emoji-1f412 { + background-position: -206px -614px; +} + +.emoji-1f413 { + background-position: -274px -614px; +} + +.emoji-1f414 { + background-position: -342px -614px; +} + +.emoji-1f415 { + background-position: -410px -614px; +} + +.emoji-1f416 { + background-position: -478px -614px; +} + +.emoji-1f417 { + background-position: -546px -614px; +} + +.emoji-1f418 { + background-position: -614px -614px; +} + +.emoji-1f419 { + background-position: -682px -614px; +} + +.emoji-1f41a { + background-position: -750px -614px; +} + +.emoji-1f41b { + background-position: -818px -614px; +} + +.emoji-1f41c { + background-position: -886px -614px; +} + +.emoji-1f41d { + background-position: -954px -614px; +} + +.emoji-1f41e { + background-position: -1022px -614px; +} + +.emoji-1f41f { + background-position: -1090px -614px; +} + +.emoji-1f420 { + background-position: -1158px -614px; +} + +.emoji-1f421 { + background-position: -1226px -614px; +} + +.emoji-1f422 { + background-position: -1294px -614px; +} + +.emoji-1f423 { + background-position: -1362px -614px; +} + +.emoji-1f424 { + background-position: -1430px -614px; +} + +.emoji-1f425 { + background-position: -1498px -614px; +} + +.emoji-1f426 { + background-position: -1566px -614px; +} + +.emoji-1f427 { + background-position: -1634px -614px; +} + +.emoji-1f428 { + background-position: -1702px -614px; +} + +.emoji-1f429 { + background-position: -1770px -614px; +} + +.emoji-1f42a { + background-position: -1838px -614px; +} + +.emoji-1f42b { + background-position: -1906px -614px; +} + +.emoji-1f42c { + background-position: -2px -682px; +} + +.emoji-1f42d { + background-position: -70px -682px; +} + +.emoji-1f42e { + background-position: -138px -682px; +} + +.emoji-1f42f { + background-position: -206px -682px; +} + +.emoji-1f430 { + background-position: -274px -682px; +} + +.emoji-1f431 { + background-position: -342px -682px; +} + +.emoji-1f432 { + background-position: -410px -682px; +} + +.emoji-1f433 { + background-position: -478px -682px; +} + +.emoji-1f434 { + background-position: -546px -682px; +} + +.emoji-1f435 { + background-position: -614px -682px; +} + +.emoji-1f436 { + background-position: -682px -682px; +} + +.emoji-1f437 { + background-position: -750px -682px; +} + +.emoji-1f438 { + background-position: -818px -682px; +} + +.emoji-1f439 { + background-position: -886px -682px; +} + +.emoji-1f43a { + background-position: -954px -682px; +} + +.emoji-1f43b { + background-position: -1022px -682px; +} + +.emoji-1f43c { + background-position: -1090px -682px; +} + +.emoji-1f43d { + background-position: -1158px -682px; +} + +.emoji-1f43e { + background-position: -1226px -682px; +} + +.emoji-1f440 { + background-position: -1294px -682px; +} + +.emoji-1f442 { + background-position: -1362px -682px; +} + +.emoji-1f443 { + background-position: -1430px -682px; +} + +.emoji-1f444 { + background-position: -1498px -682px; +} + +.emoji-1f445 { + background-position: -1566px -682px; +} + +.emoji-1f446 { + background-position: -1634px -682px; +} + +.emoji-1f447 { + background-position: -1702px -682px; +} + +.emoji-1f448 { + background-position: -1770px -682px; +} + +.emoji-1f449 { + background-position: -1838px -682px; +} + +.emoji-1f44a { + background-position: -1906px -682px; +} + +.emoji-1f44b { + background-position: -2px -750px; +} + +.emoji-1f44c { + background-position: -70px -750px; +} + +.emoji-1f44d { + background-position: -138px -750px; +} + +.emoji-1f44e { + background-position: -206px -750px; +} + +.emoji-1f44f { + background-position: -274px -750px; +} + +.emoji-1f450 { + background-position: -342px -750px; +} + +.emoji-1f451 { + background-position: -410px -750px; +} + +.emoji-1f452 { + background-position: -478px -750px; +} + +.emoji-1f453 { + background-position: -546px -750px; +} + +.emoji-1f454 { + background-position: -614px -750px; +} + +.emoji-1f455 { + background-position: -682px -750px; +} + +.emoji-1f456 { + background-position: -750px -750px; +} + +.emoji-1f457 { + background-position: -818px -750px; +} + +.emoji-1f458 { + background-position: -886px -750px; +} + +.emoji-1f459 { + background-position: -954px -750px; +} + +.emoji-1f45a { + background-position: -1022px -750px; +} + +.emoji-1f45b { + background-position: -1090px -750px; +} + +.emoji-1f45c { + background-position: -1158px -750px; +} + +.emoji-1f45d { + background-position: -1226px -750px; +} + +.emoji-1f45e { + background-position: -1294px -750px; +} + +.emoji-1f45f { + background-position: -1362px -750px; +} + +.emoji-1f460 { + background-position: -1430px -750px; +} + +.emoji-1f461 { + background-position: -1498px -750px; +} + +.emoji-1f462 { + background-position: -1566px -750px; +} + +.emoji-1f463 { + background-position: -1634px -750px; +} + +.emoji-1f464 { + background-position: -1702px -750px; +} + +.emoji-1f465 { + background-position: -1770px -750px; +} + +.emoji-1f466 { + background-position: -1838px -750px; +} + +.emoji-1f467 { + background-position: -1906px -750px; +} + +.emoji-1f468 { + background-position: -2px -818px; +} + +.emoji-1f469 { + background-position: -70px -818px; +} + +.emoji-1f46a { + background-position: -138px -818px; +} + +.emoji-1f46b { + background-position: -206px -818px; +} + +.emoji-1f46c { + background-position: -274px -818px; +} + +.emoji-1f46d { + background-position: -342px -818px; +} + +.emoji-1f46e { + background-position: -410px -818px; +} + +.emoji-1f46f { + background-position: -478px -818px; +} + +.emoji-1f470 { + background-position: -546px -818px; +} + +.emoji-1f471 { + background-position: -614px -818px; +} + +.emoji-1f472 { + background-position: -682px -818px; +} + +.emoji-1f473 { + background-position: -750px -818px; +} + +.emoji-1f474 { + background-position: -818px -818px; +} + +.emoji-1f475 { + background-position: -886px -818px; +} + +.emoji-1f476 { + background-position: -954px -818px; +} + +.emoji-1f477 { + background-position: -1022px -818px; +} + +.emoji-1f478 { + background-position: -1090px -818px; +} + +.emoji-1f479 { + background-position: -1158px -818px; +} + +.emoji-1f47a { + background-position: -1226px -818px; +} + +.emoji-1f47b { + background-position: -1294px -818px; +} + +.emoji-1f47c { + background-position: -1362px -818px; +} + +.emoji-1f47d { + background-position: -1430px -818px; +} + +.emoji-1f47e { + background-position: -1498px -818px; +} + +.emoji-1f47f { + background-position: -1566px -818px; +} + +.emoji-1f480 { + background-position: -1634px -818px; +} + +.emoji-1f481 { + background-position: -1702px -818px; +} + +.emoji-1f482 { + background-position: -1770px -818px; +} + +.emoji-1f483 { + background-position: -1838px -818px; +} + +.emoji-1f484 { + background-position: -1906px -818px; +} + +.emoji-1f485 { + background-position: -2px -886px; +} + +.emoji-1f486 { + background-position: -70px -886px; +} + +.emoji-1f487 { + background-position: -138px -886px; +} + +.emoji-1f488 { + background-position: -206px -886px; +} + +.emoji-1f489 { + background-position: -274px -886px; +} + +.emoji-1f48a { + background-position: -342px -886px; +} + +.emoji-1f48b { + background-position: -410px -886px; +} + +.emoji-1f48c { + background-position: -478px -886px; +} + +.emoji-1f48d { + background-position: -546px -886px; +} + +.emoji-1f48e { + background-position: -614px -886px; +} + +.emoji-1f48f { + background-position: -682px -886px; +} + +.emoji-1f490 { + background-position: -750px -886px; +} + +.emoji-1f491 { + background-position: -818px -886px; +} + +.emoji-1f492 { + background-position: -886px -886px; +} + +.emoji-1f493 { + background-position: -954px -886px; +} + +.emoji-1f494 { + background-position: -1022px -886px; +} + +.emoji-1f495 { + background-position: -1090px -886px; +} + +.emoji-1f496 { + background-position: -1158px -886px; +} + +.emoji-1f497 { + background-position: -1226px -886px; +} + +.emoji-1f498 { + background-position: -1294px -886px; +} + +.emoji-1f499 { + background-position: -1362px -886px; +} + +.emoji-1f49a { + background-position: -1430px -886px; +} + +.emoji-1f49b { + background-position: -1498px -886px; +} + +.emoji-1f49c { + background-position: -1566px -886px; +} + +.emoji-1f49d { + background-position: -1634px -886px; +} + +.emoji-1f49e { + background-position: -1702px -886px; +} + +.emoji-1f49f { + background-position: -1770px -886px; +} + +.emoji-1f4a0 { + background-position: -1838px -886px; +} + +.emoji-1f4a1 { + background-position: -1906px -886px; +} + +.emoji-1f4a2 { + background-position: -2px -954px; +} + +.emoji-1f4a3 { + background-position: -70px -954px; +} + +.emoji-1f4a4 { + background-position: -138px -954px; +} + +.emoji-1f4a5 { + background-position: -206px -954px; +} + +.emoji-1f4a6 { + background-position: -274px -954px; +} + +.emoji-1f4a7 { + background-position: -342px -954px; +} + +.emoji-1f4a8 { + background-position: -410px -954px; +} + +.emoji-1f4a9 { + background-position: -478px -954px; +} + +.emoji-1f4aa { + background-position: -546px -954px; +} + +.emoji-1f4ab { + background-position: -614px -954px; +} + +.emoji-1f4ac { + background-position: -682px -954px; +} + +.emoji-1f4ad { + background-position: -750px -954px; +} + +.emoji-1f4ae { + background-position: -818px -954px; +} + +.emoji-1f4af { + background-position: -886px -954px; +} + +.emoji-1f4b0 { + background-position: -954px -954px; +} + +.emoji-1f4b1 { + background-position: -1022px -954px; +} + +.emoji-1f4b2 { + background-position: -1090px -954px; +} + +.emoji-1f4b3 { + background-position: -1158px -954px; +} + +.emoji-1f4b4 { + background-position: -1226px -954px; +} + +.emoji-1f4b5 { + background-position: -1294px -954px; +} + +.emoji-1f4b6 { + background-position: -1362px -954px; +} + +.emoji-1f4b7 { + background-position: -1430px -954px; +} + +.emoji-1f4b8 { + background-position: -1498px -954px; +} + +.emoji-1f4b9 { + background-position: -1566px -954px; +} + +.emoji-1f4ba { + background-position: -1634px -954px; +} + +.emoji-1f4bb { + background-position: -1702px -954px; +} + +.emoji-1f4bc { + background-position: -1770px -954px; +} + +.emoji-1f4bd { + background-position: -1838px -954px; +} + +.emoji-1f4be { + background-position: -1906px -954px; +} + +.emoji-1f4bf { + background-position: -2px -1022px; +} + +.emoji-1f4c0 { + background-position: -70px -1022px; +} + +.emoji-1f4c1 { + background-position: -138px -1022px; +} + +.emoji-1f4c2 { + background-position: -206px -1022px; +} + +.emoji-1f4c3 { + background-position: -274px -1022px; +} + +.emoji-1f4c4 { + background-position: -342px -1022px; +} + +.emoji-1f4c5 { + background-position: -410px -1022px; +} + +.emoji-1f4c6 { + background-position: -478px -1022px; +} + +.emoji-1f4c7 { + background-position: -546px -1022px; +} + +.emoji-1f4c8 { + background-position: -614px -1022px; +} + +.emoji-1f4c9 { + background-position: -682px -1022px; +} + +.emoji-1f4ca { + background-position: -750px -1022px; +} + +.emoji-1f4cb { + background-position: -818px -1022px; +} + +.emoji-1f4cc { + background-position: -886px -1022px; +} + +.emoji-1f4cd { + background-position: -954px -1022px; +} + +.emoji-1f4ce { + background-position: -1022px -1022px; +} + +.emoji-1f4cf { + background-position: -1090px -1022px; +} + +.emoji-1f4d0 { + background-position: -1158px -1022px; +} + +.emoji-1f4d1 { + background-position: -1226px -1022px; +} + +.emoji-1f4d2 { + background-position: -1294px -1022px; +} + +.emoji-1f4d3 { + background-position: -1362px -1022px; +} + +.emoji-1f4d4 { + background-position: -1430px -1022px; +} + +.emoji-1f4d5 { + background-position: -1498px -1022px; +} + +.emoji-1f4d6 { + background-position: -1566px -1022px; +} + +.emoji-1f4d7 { + background-position: -1634px -1022px; +} + +.emoji-1f4d8 { + background-position: -1702px -1022px; +} + +.emoji-1f4d9 { + background-position: -1770px -1022px; +} + +.emoji-1f4da { + background-position: -1838px -1022px; +} + +.emoji-1f4db { + background-position: -1906px -1022px; +} + +.emoji-1f4dc { + background-position: -2px -1090px; +} + +.emoji-1f4dd { + background-position: -70px -1090px; +} + +.emoji-1f4de { + background-position: -138px -1090px; +} + +.emoji-1f4df { + background-position: -206px -1090px; +} + +.emoji-1f4e0 { + background-position: -274px -1090px; +} + +.emoji-1f4e1 { + background-position: -342px -1090px; +} + +.emoji-1f4e2 { + background-position: -410px -1090px; +} + +.emoji-1f4e3 { + background-position: -478px -1090px; +} + +.emoji-1f4e4 { + background-position: -546px -1090px; +} + +.emoji-1f4e5 { + background-position: -614px -1090px; +} + +.emoji-1f4e6 { + background-position: -682px -1090px; +} + +.emoji-1f4e7 { + background-position: -750px -1090px; +} + +.emoji-1f4e8 { + background-position: -818px -1090px; +} + +.emoji-1f4e9 { + background-position: -886px -1090px; +} + +.emoji-1f4ea { + background-position: -954px -1090px; +} + +.emoji-1f4eb { + background-position: -1022px -1090px; +} + +.emoji-1f4ec { + background-position: -1090px -1090px; +} + +.emoji-1f4ed { + background-position: -1158px -1090px; +} + +.emoji-1f4ee { + background-position: -1226px -1090px; +} + +.emoji-1f4ef { + background-position: -1294px -1090px; +} + +.emoji-1f4f0 { + background-position: -1362px -1090px; +} + +.emoji-1f4f1 { + background-position: -1430px -1090px; +} + +.emoji-1f4f2 { + background-position: -1498px -1090px; +} + +.emoji-1f4f3 { + background-position: -1566px -1090px; +} + +.emoji-1f4f4 { + background-position: -1634px -1090px; +} + +.emoji-1f4f5 { + background-position: -1702px -1090px; +} + +.emoji-1f4f6 { + background-position: -1770px -1090px; +} + +.emoji-1f4f7 { + background-position: -1838px -1090px; +} + +.emoji-1f4f9 { + background-position: -1906px -1090px; +} + +.emoji-1f4fa { + background-position: -2px -1158px; +} + +.emoji-1f4fb { + background-position: -70px -1158px; +} + +.emoji-1f4fc { + background-position: -138px -1158px; +} + +.emoji-1f500 { + background-position: -206px -1158px; +} + +.emoji-1f501 { + background-position: -274px -1158px; +} + +.emoji-1f502 { + background-position: -342px -1158px; +} + +.emoji-1f503 { + background-position: -410px -1158px; +} + +.emoji-1f504 { + background-position: -478px -1158px; +} + +.emoji-1f505 { + background-position: -546px -1158px; +} + +.emoji-1f506 { + background-position: -614px -1158px; +} + +.emoji-1f507 { + background-position: -682px -1158px; +} + +.emoji-1f508 { + background-position: -750px -1158px; +} + +.emoji-1f509 { + background-position: -818px -1158px; +} + +.emoji-1f50a { + background-position: -886px -1158px; +} + +.emoji-1f50b { + background-position: -954px -1158px; +} + +.emoji-1f50c { + background-position: -1022px -1158px; +} + +.emoji-1f50d { + background-position: -1090px -1158px; +} + +.emoji-1f50e { + background-position: -1158px -1158px; +} + +.emoji-1f50f { + background-position: -1226px -1158px; +} + +.emoji-1f510 { + background-position: -1294px -1158px; +} + +.emoji-1f511 { + background-position: -1362px -1158px; +} + +.emoji-1f512 { + background-position: -1430px -1158px; +} + +.emoji-1f513 { + background-position: -1498px -1158px; +} + +.emoji-1f514 { + background-position: -1566px -1158px; +} + +.emoji-1f515 { + background-position: -1634px -1158px; +} + +.emoji-1f516 { + background-position: -1702px -1158px; +} + +.emoji-1f517 { + background-position: -1770px -1158px; +} + +.emoji-1f518 { + background-position: -1838px -1158px; +} + +.emoji-1f519 { + background-position: -1906px -1158px; +} + +.emoji-1f51a { + background-position: -2px -1226px; +} + +.emoji-1f51b { + background-position: -70px -1226px; +} + +.emoji-1f51c { + background-position: -138px -1226px; +} + +.emoji-1f51d { + background-position: -206px -1226px; +} + +.emoji-1f51e { + background-position: -274px -1226px; +} + +.emoji-1f51f { + background-position: -342px -1226px; +} + +.emoji-1f520 { + background-position: -410px -1226px; +} + +.emoji-1f521 { + background-position: -478px -1226px; +} + +.emoji-1f522 { + background-position: -546px -1226px; +} + +.emoji-1f523 { + background-position: -614px -1226px; +} + +.emoji-1f524 { + background-position: -682px -1226px; +} + +.emoji-1f525 { + background-position: -750px -1226px; +} + +.emoji-1f526 { + background-position: -818px -1226px; +} + +.emoji-1f527 { + background-position: -886px -1226px; +} + +.emoji-1f528 { + background-position: -954px -1226px; +} + +.emoji-1f529 { + background-position: -1022px -1226px; +} + +.emoji-1f52a { + background-position: -1090px -1226px; +} + +.emoji-1f52b { + background-position: -1158px -1226px; +} + +.emoji-1f52c { + background-position: -1226px -1226px; +} + +.emoji-1f52d { + background-position: -1294px -1226px; +} + +.emoji-1f52e { + background-position: -1362px -1226px; +} + +.emoji-1f52f { + background-position: -1430px -1226px; +} + +.emoji-1f530 { + background-position: -1498px -1226px; +} + +.emoji-1f531 { + background-position: -1566px -1226px; +} + +.emoji-1f532 { + background-position: -1634px -1226px; +} + +.emoji-1f533 { + background-position: -1702px -1226px; +} + +.emoji-1f534 { + background-position: -1770px -1226px; +} + +.emoji-1f535 { + background-position: -1838px -1226px; +} + +.emoji-1f536 { + background-position: -1906px -1226px; +} + +.emoji-1f537 { + background-position: -2px -1294px; +} + +.emoji-1f538 { + background-position: -70px -1294px; +} + +.emoji-1f539 { + background-position: -138px -1294px; +} + +.emoji-1f53a { + background-position: -206px -1294px; +} + +.emoji-1f53b { + background-position: -274px -1294px; +} + +.emoji-1f53c { + background-position: -342px -1294px; +} + +.emoji-1f53d { + background-position: -410px -1294px; +} + +.emoji-1f550 { + background-position: -478px -1294px; +} + +.emoji-1f551 { + background-position: -546px -1294px; +} + +.emoji-1f552 { + background-position: -614px -1294px; +} + +.emoji-1f553 { + background-position: -682px -1294px; +} + +.emoji-1f554 { + background-position: -750px -1294px; +} + +.emoji-1f555 { + background-position: -818px -1294px; +} + +.emoji-1f556 { + background-position: -886px -1294px; +} + +.emoji-1f557 { + background-position: -954px -1294px; +} + +.emoji-1f558 { + background-position: -1022px -1294px; +} + +.emoji-1f559 { + background-position: -1090px -1294px; +} + +.emoji-1f55a { + background-position: -1158px -1294px; +} + +.emoji-1f55b { + background-position: -1226px -1294px; +} + +.emoji-1f55c { + background-position: -1294px -1294px; +} + +.emoji-1f55d { + background-position: -1362px -1294px; +} + +.emoji-1f55e { + background-position: -1430px -1294px; +} + +.emoji-1f55f { + background-position: -1498px -1294px; +} + +.emoji-1f560 { + background-position: -1566px -1294px; +} + +.emoji-1f561 { + background-position: -1634px -1294px; +} + +.emoji-1f562 { + background-position: -1702px -1294px; +} + +.emoji-1f563 { + background-position: -1770px -1294px; +} + +.emoji-1f564 { + background-position: -1838px -1294px; +} + +.emoji-1f565 { + background-position: -1906px -1294px; +} + +.emoji-1f566 { + background-position: -2px -1362px; +} + +.emoji-1f567 { + background-position: -70px -1362px; +} + +.emoji-1f5fb { + background-position: -138px -1362px; +} + +.emoji-1f5fc { + background-position: -206px -1362px; +} + +.emoji-1f5fd { + background-position: -274px -1362px; +} + +.emoji-1f5fe { + background-position: -342px -1362px; +} + +.emoji-1f5ff { + background-position: -410px -1362px; +} + +.emoji-1f600 { + background-position: -478px -1362px; +} + +.emoji-1f601 { + background-position: -546px -1362px; +} + +.emoji-1f602 { + background-position: -614px -1362px; +} + +.emoji-1f603 { + background-position: -682px -1362px; +} + +.emoji-1f604 { + background-position: -750px -1362px; +} + +.emoji-1f605 { + background-position: -818px -1362px; +} + +.emoji-1f606 { + background-position: -886px -1362px; +} + +.emoji-1f607 { + background-position: -954px -1362px; +} + +.emoji-1f608 { + background-position: -1022px -1362px; +} + +.emoji-1f609 { + background-position: -1090px -1362px; +} + +.emoji-1f60a { + background-position: -1158px -1362px; +} + +.emoji-1f60b { + background-position: -1226px -1362px; +} + +.emoji-1f60c { + background-position: -1294px -1362px; +} + +.emoji-1f60d { + background-position: -1362px -1362px; +} + +.emoji-1f60e { + background-position: -1430px -1362px; +} + +.emoji-1f60f { + background-position: -1498px -1362px; +} + +.emoji-1f610 { + background-position: -1566px -1362px; +} + +.emoji-1f611 { + background-position: -1634px -1362px; +} + +.emoji-1f612 { + background-position: -1702px -1362px; +} + +.emoji-1f613 { + background-position: -1770px -1362px; +} + +.emoji-1f614 { + background-position: -1838px -1362px; +} + +.emoji-1f615 { + background-position: -1906px -1362px; +} + +.emoji-1f616 { + background-position: -2px -1430px; +} + +.emoji-1f617 { + background-position: -70px -1430px; +} + +.emoji-1f618 { + background-position: -138px -1430px; +} + +.emoji-1f619 { + background-position: -206px -1430px; +} + +.emoji-1f61a { + background-position: -274px -1430px; +} + +.emoji-1f61b { + background-position: -342px -1430px; +} + +.emoji-1f61c { + background-position: -410px -1430px; +} + +.emoji-1f61d { + background-position: -478px -1430px; +} + +.emoji-1f61e { + background-position: -546px -1430px; +} + +.emoji-1f61f { + background-position: -614px -1430px; +} + +.emoji-1f620 { + background-position: -682px -1430px; +} + +.emoji-1f621 { + background-position: -750px -1430px; +} + +.emoji-1f622 { + background-position: -818px -1430px; +} + +.emoji-1f623 { + background-position: -886px -1430px; +} + +.emoji-1f624 { + background-position: -954px -1430px; +} + +.emoji-1f625 { + background-position: -1022px -1430px; +} + +.emoji-1f626 { + background-position: -1090px -1430px; +} + +.emoji-1f627 { + background-position: -1158px -1430px; +} + +.emoji-1f628 { + background-position: -1226px -1430px; +} + +.emoji-1f629 { + background-position: -1294px -1430px; +} + +.emoji-1f62a { + background-position: -1362px -1430px; +} + +.emoji-1f62b { + background-position: -1430px -1430px; +} + +.emoji-1f62c { + background-position: -1498px -1430px; +} + +.emoji-1f62d { + background-position: -1566px -1430px; +} + +.emoji-1f62e { + background-position: -1634px -1430px; +} + +.emoji-1f62f { + background-position: -1702px -1430px; +} + +.emoji-1f630 { + background-position: -1770px -1430px; +} + +.emoji-1f631 { + background-position: -1838px -1430px; +} + +.emoji-1f632 { + background-position: -1906px -1430px; +} + +.emoji-1f633 { + background-position: -2px -1498px; +} + +.emoji-1f634 { + background-position: -70px -1498px; +} + +.emoji-1f635 { + background-position: -138px -1498px; +} + +.emoji-1f636 { + background-position: -206px -1498px; +} + +.emoji-1f637 { + background-position: -274px -1498px; +} + +.emoji-1f638 { + background-position: -342px -1498px; +} + +.emoji-1f639 { + background-position: -410px -1498px; +} + +.emoji-1f63a { + background-position: -478px -1498px; +} + +.emoji-1f63b { + background-position: -546px -1498px; +} + +.emoji-1f63c { + background-position: -614px -1498px; +} + +.emoji-1f63d { + background-position: -682px -1498px; +} + +.emoji-1f63e { + background-position: -750px -1498px; +} + +.emoji-1f63f { + background-position: -818px -1498px; +} + +.emoji-1f640 { + background-position: -886px -1498px; +} + +.emoji-1f641 { + background-position: -954px -1498px; +} + +.emoji-1f642 { + background-position: -1022px -1498px; +} + +.emoji-1f643 { + background-position: -1090px -1498px; +} + +.emoji-1f645 { + background-position: -1158px -1498px; +} + +.emoji-1f646 { + background-position: -1226px -1498px; +} + +.emoji-1f647 { + background-position: -1294px -1498px; +} + +.emoji-1f648 { + background-position: -1362px -1498px; +} + +.emoji-1f649 { + background-position: -1430px -1498px; +} + +.emoji-1f64a { + background-position: -1498px -1498px; +} + +.emoji-1f64b { + background-position: -1566px -1498px; +} + +.emoji-1f64c { + background-position: -1634px -1498px; +} + +.emoji-1f64d { + background-position: -1702px -1498px; +} + +.emoji-1f64e { + background-position: -1770px -1498px; +} + +.emoji-1f64f { + background-position: -1838px -1498px; +} + +.emoji-1f680 { + background-position: -1906px -1498px; +} + +.emoji-1f681 { + background-position: -2px -1566px; +} + +.emoji-1f682 { + background-position: -70px -1566px; +} + +.emoji-1f683 { + background-position: -138px -1566px; +} + +.emoji-1f684 { + background-position: -206px -1566px; +} + +.emoji-1f685 { + background-position: -274px -1566px; +} + +.emoji-1f686 { + background-position: -342px -1566px; +} + +.emoji-1f687 { + background-position: -410px -1566px; +} + +.emoji-1f688 { + background-position: -478px -1566px; +} + +.emoji-1f689 { + background-position: -546px -1566px; +} + +.emoji-1f68a { + background-position: -614px -1566px; +} + +.emoji-1f68b { + background-position: -682px -1566px; +} + +.emoji-1f68c { + background-position: -750px -1566px; +} + +.emoji-1f68d { + background-position: -818px -1566px; +} + +.emoji-1f68e { + background-position: -886px -1566px; +} + +.emoji-1f68f { + background-position: -954px -1566px; +} + +.emoji-1f690 { + background-position: -1022px -1566px; +} + +.emoji-1f691 { + background-position: -1090px -1566px; +} + +.emoji-1f692 { + background-position: -1158px -1566px; +} + +.emoji-1f693 { + background-position: -1226px -1566px; +} + +.emoji-1f694 { + background-position: -1294px -1566px; +} + +.emoji-1f695 { + background-position: -1362px -1566px; +} + +.emoji-1f696 { + background-position: -1430px -1566px; +} + +.emoji-1f697 { + background-position: -1498px -1566px; +} + +.emoji-1f698 { + background-position: -1566px -1566px; +} + +.emoji-1f699 { + background-position: -1634px -1566px; +} + +.emoji-1f69a { + background-position: -1702px -1566px; +} + +.emoji-1f69b { + background-position: -1770px -1566px; +} + +.emoji-1f69c { + background-position: -1838px -1566px; +} + +.emoji-1f69d { + background-position: -1906px -1566px; +} + +.emoji-1f69e { + background-position: -2px -1634px; +} + +.emoji-1f69f { + background-position: -70px -1634px; +} + +.emoji-1f6a0 { + background-position: -138px -1634px; +} + +.emoji-1f6a1 { + background-position: -206px -1634px; +} + +.emoji-1f6a2 { + background-position: -274px -1634px; +} + +.emoji-1f6a3 { + background-position: -342px -1634px; +} + +.emoji-1f6a4 { + background-position: -410px -1634px; +} + +.emoji-1f6a5 { + background-position: -478px -1634px; +} + +.emoji-1f6a6 { + background-position: -546px -1634px; +} + +.emoji-1f6a7 { + background-position: -614px -1634px; +} + +.emoji-1f6a8 { + background-position: -682px -1634px; +} + +.emoji-1f6a9 { + background-position: -750px -1634px; +} + +.emoji-1f6aa { + background-position: -818px -1634px; +} + +.emoji-1f6ab { + background-position: -886px -1634px; +} + +.emoji-1f6ac { + background-position: -954px -1634px; +} + +.emoji-1f6ad { + background-position: -1022px -1634px; +} + +.emoji-1f6ae { + background-position: -1090px -1634px; +} + +.emoji-1f6af { + background-position: -1158px -1634px; +} + +.emoji-1f6b0 { + background-position: -1226px -1634px; +} + +.emoji-1f6b1 { + background-position: -1294px -1634px; +} + +.emoji-1f6b2 { + background-position: -1362px -1634px; +} + +.emoji-1f6b3 { + background-position: -1430px -1634px; +} + +.emoji-1f6b4 { + background-position: -1498px -1634px; +} + +.emoji-1f6b5 { + background-position: -1566px -1634px; +} + +.emoji-1f6b6 { + background-position: -1634px -1634px; +} + +.emoji-1f6b7 { + background-position: -1702px -1634px; +} + +.emoji-1f6b8 { + background-position: -1770px -1634px; +} + +.emoji-1f6b9 { + background-position: -1838px -1634px; +} + +.emoji-1f6ba { + background-position: -1906px -1634px; +} + +.emoji-1f6bb { + background-position: -2px -1702px; +} + +.emoji-1f6bc { + background-position: -70px -1702px; +} + +.emoji-1f6bd { + background-position: -138px -1702px; +} + +.emoji-1f6be { + background-position: -206px -1702px; +} + +.emoji-1f6bf { + background-position: -274px -1702px; +} + +.emoji-1f6c0 { + background-position: -342px -1702px; +} + +.emoji-1f6c1 { + background-position: -410px -1702px; +} + +.emoji-1f6c2 { + background-position: -478px -1702px; +} + +.emoji-1f6c3 { + background-position: -546px -1702px; +} + +.emoji-1f6c4 { + background-position: -614px -1702px; +} + +.emoji-1f6c5 { + background-position: -682px -1702px; +} + +.emoji-203c { + background-position: -750px -1702px; +} + +.emoji-2049 { + background-position: -818px -1702px; +} + +.emoji-2122 { + background-position: -886px -1702px; +} + +.emoji-2139 { + background-position: -954px -1702px; +} + +.emoji-2194 { + background-position: -1022px -1702px; +} + +.emoji-2195 { + background-position: -1090px -1702px; +} + +.emoji-2196 { + background-position: -1158px -1702px; +} + +.emoji-2197 { + background-position: -1226px -1702px; +} + +.emoji-2198 { + background-position: -1294px -1702px; +} + +.emoji-2199 { + background-position: -1362px -1702px; +} + +.emoji-21a9 { + background-position: -1430px -1702px; +} + +.emoji-21aa { + background-position: -1498px -1702px; +} + +.emoji-231a { + background-position: -1566px -1702px; +} + +.emoji-231b { + background-position: -1634px -1702px; +} + +.emoji-23e9 { + background-position: -1702px -1702px; +} + +.emoji-23ea { + background-position: -1770px -1702px; +} + +.emoji-23eb { + background-position: -1838px -1702px; +} + +.emoji-23ec { + background-position: -1906px -1702px; +} + +.emoji-23f0 { + background-position: -2px -1770px; +} + +.emoji-23f3 { + background-position: -70px -1770px; +} + +.emoji-24c2 { + background-position: -138px -1770px; +} + +.emoji-25aa { + background-position: -206px -1770px; +} + +.emoji-25ab { + background-position: -274px -1770px; +} + +.emoji-25b6 { + background-position: -342px -1770px; +} + +.emoji-25c0 { + background-position: -410px -1770px; +} + +.emoji-25fb { + background-position: -478px -1770px; +} + +.emoji-25fc { + background-position: -546px -1770px; +} + +.emoji-25fd { + background-position: -614px -1770px; +} + +.emoji-25fe { + background-position: -682px -1770px; +} + +.emoji-2600 { + background-position: -750px -1770px; +} + +.emoji-2601 { + background-position: -818px -1770px; +} + +.emoji-260e { + background-position: -886px -1770px; +} + +.emoji-2611 { + background-position: -954px -1770px; +} + +.emoji-2614 { + background-position: -1022px -1770px; +} + +.emoji-2615 { + background-position: -1090px -1770px; +} + +.emoji-261d { + background-position: -1158px -1770px; +} + +.emoji-263a { + background-position: -1226px -1770px; +} + +.emoji-2648 { + background-position: -1294px -1770px; +} + +.emoji-2649 { + background-position: -1362px -1770px; +} + +.emoji-264a { + background-position: -1430px -1770px; +} + +.emoji-264b { + background-position: -1498px -1770px; +} + +.emoji-264c { + background-position: -1566px -1770px; +} + +.emoji-264d { + background-position: -1634px -1770px; +} + +.emoji-264e { + background-position: -1702px -1770px; +} + +.emoji-264f { + background-position: -1770px -1770px; +} + +.emoji-2650 { + background-position: -1838px -1770px; +} + +.emoji-2651 { + background-position: -1906px -1770px; +} + +.emoji-2652 { + background-position: -2px -1838px; +} + +.emoji-2653 { + background-position: -70px -1838px; +} + +.emoji-2660 { + background-position: -138px -1838px; +} + +.emoji-2663 { + background-position: -206px -1838px; +} + +.emoji-2665 { + background-position: -274px -1838px; +} + +.emoji-2666 { + background-position: -342px -1838px; +} + +.emoji-2668 { + background-position: -410px -1838px; +} + +.emoji-267b { + background-position: -478px -1838px; +} + +.emoji-267f { + background-position: -546px -1838px; +} + +.emoji-2693 { + background-position: -614px -1838px; +} + +.emoji-26a0 { + background-position: -682px -1838px; +} + +.emoji-26a1 { + background-position: -750px -1838px; +} + +.emoji-26aa { + background-position: -818px -1838px; +} + +.emoji-26ab { + background-position: -886px -1838px; +} + +.emoji-26bd { + background-position: -954px -1838px; +} + +.emoji-26be { + background-position: -1022px -1838px; +} + +.emoji-26c4 { + background-position: -1090px -1838px; +} + +.emoji-26c5 { + background-position: -1158px -1838px; +} + +.emoji-26ce { + background-position: -1226px -1838px; +} + +.emoji-26d4 { + background-position: -1294px -1838px; +} + +.emoji-26ea { + background-position: -1362px -1838px; +} + +.emoji-26f2 { + background-position: -1430px -1838px; +} + +.emoji-26f3 { + background-position: -1498px -1838px; +} + +.emoji-26f5 { + background-position: -1566px -1838px; +} + +.emoji-26fa { + background-position: -1634px -1838px; +} + +.emoji-26fd { + background-position: -1702px -1838px; +} + +.emoji-2702 { + background-position: -1770px -1838px; +} + +.emoji-2705 { + background-position: -1838px -1838px; +} + +.emoji-2708 { + background-position: -1906px -1838px; +} + +.emoji-2709 { + background-position: -2px -1906px; +} + +.emoji-270a { + background-position: -70px -1906px; +} + +.emoji-270b { + background-position: -138px -1906px; +} + +.emoji-270c { + background-position: -206px -1906px; +} + +.emoji-270f { + background-position: -274px -1906px; +} + +.emoji-2712 { + background-position: -342px -1906px; +} + +.emoji-2714 { + background-position: -410px -1906px; +} + +.emoji-2716 { + background-position: -478px -1906px; +} + +.emoji-2728 { + background-position: -546px -1906px; +} + +.emoji-2733 { + background-position: -614px -1906px; +} + +.emoji-2734 { + background-position: -682px -1906px; +} + +.emoji-2744 { + background-position: -750px -1906px; +} + +.emoji-2747 { + background-position: -818px -1906px; +} + +.emoji-274c { + background-position: -886px -1906px; +} + +.emoji-274e { + background-position: -954px -1906px; +} + +.emoji-2753 { + background-position: -1022px -1906px; +} + +.emoji-2754 { + background-position: -1090px -1906px; +} + +.emoji-2755 { + background-position: -1158px -1906px; +} + +.emoji-2757 { + background-position: -1226px -1906px; +} + +.emoji-2764 { + background-position: -1294px -1906px; +} + +.emoji-2795 { + background-position: -1362px -1906px; +} + +.emoji-2796 { + background-position: -1430px -1906px; +} + +.emoji-2797 { + background-position: -1498px -1906px; +} + +.emoji-27a1 { + background-position: -1566px -1906px; +} + +.emoji-27b0 { + background-position: -1634px -1906px; +} + +.emoji-27bf { + background-position: -1702px -1906px; +} + +.emoji-2934 { + background-position: -1770px -1906px; +} + +.emoji-2935 { + background-position: -1838px -1906px; +} + +.emoji-2b05 { + background-position: -1906px -1906px; +} + +.emoji-2b06 { + background-position: -1974px -2px; +} + +.emoji-2b07 { + background-position: -1974px -70px; +} + +.emoji-2b1b { + background-position: -1974px -138px; +} + +.emoji-2b1c { + background-position: -1974px -206px; +} + +.emoji-2b50 { + background-position: -1974px -274px; +} + +.emoji-2b55 { + background-position: -1974px -342px; +} + +.emoji-3030 { + background-position: -1974px -410px; +} + +.emoji-303d { + background-position: -1974px -478px; +} + +.emoji-3297 { + background-position: -1974px -546px; +} + +.emoji-3299 { + background-position: -1974px -614px; +} + +.emoji-bowtie { + background-position: -1974px -682px; +} + +.emoji-feelsgood { + background-position: -1974px -750px; +} + +.emoji-finnadie { + background-position: -1974px -818px; +} + +.emoji-fu { + background-position: -1974px -886px; +} + +.emoji-goberserk { + background-position: -1974px -954px; +} + +.emoji-godmode { + background-position: -1974px -1022px; +} + +.emoji-hurtrealbad { + background-position: -1974px -1090px; +} + +.emoji-img_trans { + width: 1px; + height: 1px; + background-position: -2042px -2px; +} + +.emoji-mattermost { + background-position: -1974px -1158px; +} + +.emoji-metal { + background-position: -1974px -1226px; +} + +.emoji-neckbeard { + background-position: -1974px -1294px; +} + +.emoji-octocat { + background-position: -1974px -1362px; +} + +.emoji-rage1 { + background-position: -1974px -1430px; +} + +.emoji-rage2 { + background-position: -1974px -1498px; +} + +.emoji-rage3 { + background-position: -1974px -1566px; +} + +.emoji-rage4 { + background-position: -1974px -1634px; +} + +.emoji-shipit { + width: 75px; + height: 75px; + background-position: -1974px -1702px; +} + +.emoji-suspect { + background-position: -1974px -1781px; +} + +.emoji-taco { + background-position: -1974px -1849px; +} + +.emoji-trollface { + background-position: -1974px -1917px; +} diff --git a/webapp/sass/components/_emoticons.scss b/webapp/sass/components/_emoticons.scss index 43d2e8ece..7cf7034d2 100644 --- a/webapp/sass/components/_emoticons.scss +++ b/webapp/sass/components/_emoticons.scss @@ -1,15 +1,15 @@ -@charset 'UTF-8'; +@charset "UTF-8"; .emoticon { background-position: 50% 50%; background-repeat: no-repeat; background-size: contain; display: inline-block; - height: 20px; + height: 21px; min-height: 1em; min-width: 1em; vertical-align: middle; - width: 20px; + width: 21px; } .emoticon-suggestion { @@ -36,3 +36,205 @@ text-align: center; vertical-align: middle; } + +.emoji-picker__popover { + padding: 0px; + + .popover-content { + padding: 0px; + } +} + + + +.emoji-picker-bottom { + display: flex; + flex-direction: column; + @include user-select(none); + position: absolute; + z-index: 40; + right: 0%; + width: 278px; + border: 1px solid; + min-height: 298px; + border-radius: 3px; + + .emoji-picker__search-container { + position: relative; + + .emoji-picker__search-icon { + padding-left: 6px; + padding-top: 6px; + position: absolute; + font-size: 13px; + } + + + } +} + +.emoji-picker__search { + border-width: 1px 0px 1px 0px; + border-style: solid; + padding: 2px 0 2px 25px; + width: 100%; + height: 25px; + font-size: 12px; + + &:focus{ + outline: none; + } +} + +.emoji-picker { + display: flex; + flex-direction: column; + @include user-select(none); + position: absolute; + top: -361px; + right: 0px; + width: 278px; + border: 1px solid; + border-radius: 3px; + + .emoji-picker__search-container { + position: relative; + + .emoji-picker__search-icon { + padding-left: 6px; + padding-top: 6px; + position: absolute; + font-size: 13px; + } + + + } +} + +.emoji-picker__categories { + flex-grow: 0; + flex-shrink: 0; + + .emoji-picker__category { + color: #333333; + display: inline-block; + font-size: 16px; + margin: 3px 6px; + text-align: center; + width: 15px; + + &--selected, + &:hover { + color: #666666; + } + } +} + +.emoji-picker__items { + max-height: 262px; + overflow-x: hidden; + overflow-y: auto; + padding: 0px 8px 8px 8px; + position: relative; + + + + .emoji-picker__category-header { + font-size: 12px; + font-weight: bold; + margin-bottom: 6px; + margin-top: 3px; + padding-top: 3px; + // padding-bottom: 10px; + } + + .emoji-picker__preview_sprite { + isplay: inline-block; + height: 45px; + margin: 3px; + vertical-align: top; + + padding: 3px; + } + + .emoji-picker-items__container { + > div { + display: inline-block; + height: 21px; + margin: 3px; + vertical-align: top; + width: 21px; + padding: 3px; + } + > span { + display: inline-block; + height: 21px; + margin: 3px; + vertical-align: top; + width: 21px; + padding: 0px; + border: 0px; + } + } + + .emoji-picker__item { + border-radius: 6px; + cursor: pointer; + font-size: 18px; + margin: 3px; + } +} +.emojisprite-wrapper { + cursor: pointer; +} + +.emoji-picker__preview { + border-top: 1px solid; + display: table-cell; + vertical-align: middle; + flex-grow: 0; + flex-shrink: 0; + height:45px; + width: 278px; + padding: 3px 10px; + + &.emoji-picker__preview-placeholder { + padding: 12px; + } + + .emoji-picker__preview-image-box { + display: table-cell; + vertical-align: middle; + height: 36px; + width: 42px; + + .sprite-preview { + height: 36px; + width: 36px; + vertical-align: middle; + padding: 0px; + border: 0px; + display: inline-block; + } + } + + .emoji-picker__preview-image { + max-height: 36px; + max-width: 42px; + padding: 0 10px 0 0; + + } + + .emoji-picker__preview-name { + + font-size: 13px; + font-weight: bold; + } + + .emoji-picker__preview-aliases { + display: block; + font-size: 12px; + + font-weight: bold; + } +} diff --git a/webapp/sass/components/_module.scss b/webapp/sass/components/_module.scss index c1114bbcb..2cf310a48 100644 --- a/webapp/sass/components/_module.scss +++ b/webapp/sass/components/_module.scss @@ -3,6 +3,7 @@ @import 'buttons'; @import 'dropdown'; @import 'emoticons'; +@import 'emojisprite'; @import 'error-bar'; @import 'files'; @import 'inputs'; diff --git a/webapp/sass/layout/_post-right.scss b/webapp/sass/layout/_post-right.scss index 9a0f658a2..d4c1daa6e 100644 --- a/webapp/sass/layout/_post-right.scss +++ b/webapp/sass/layout/_post-right.scss @@ -62,10 +62,6 @@ .post-create__container { width: 100%; - .textarea-wrapper { - min-height: 100px; - } - .btn { margin-bottom: 10px; @@ -154,6 +150,7 @@ overflow: auto; position: relative; padding-top: 10px; + min-height: 429px; .file-preview__container { margin-top: 5px; diff --git a/webapp/sass/layout/_post.scss b/webapp/sass/layout/_post.scss index 1e1dd4b08..892eea860 100644 --- a/webapp/sass/layout/_post.scss +++ b/webapp/sass/layout/_post.scss @@ -23,7 +23,7 @@ } .textarea-wrapper { - min-height: 36px; + min-height: 37px; position: relative; .textbox-preview-area { @@ -371,7 +371,15 @@ padding: .5em 15px 0; width: 100%; } + #reply_textbox.custom-textarea-emoji{ + bottom: 0; + max-height: 162px !important; + padding-right: 60px; + padding-top: 6px; + resize: none; + + } .center { max-width: 1028px; } @@ -386,6 +394,25 @@ -ms-overflow-style: auto; overflow: auto; padding-right: 43px; + resize: none; + } + + #post_textbox-reference.custom-textarea-emoji { + padding-right: 43px; + resize: none; + } + + + #reply_textbox.custom-textarea-emoji { + padding-right: 60px; + resize: none; + + } + + #post_textbox.custom-textarea-emoji { + padding-right: 60px; + resize: none; + } } } @@ -425,8 +452,28 @@ max-height: 162px !important; padding-right: 35px; padding-top: 8px; + resize: none; + + } + + #post_textbox-reference.custom-textarea-emoji { + bottom: 0; + max-height: 162px !important; + padding-right: 35px; + padding-top: 8px; + resize: none; + } + + #post_textbox.custom-textarea-emoji { + bottom: 0; + max-height: 162px !important; + padding-right: 60px; + padding-top: 8px; + resize: none; + + } .textarea-div { line-height: 1.5; max-height: 163px !important; @@ -436,13 +483,12 @@ } .btn-file { - @include opacity(.5); @include single-transition(all, .15s); font-size: 16px; - padding: 7px 9px 6px; + padding: 8px 9px 4px; position: absolute; right: 0; - top: 1px; + top: 0; z-index: 5; svg { @@ -452,7 +498,6 @@ &:hover, &:active { - @include opacity(.9); box-shadow: none; } @@ -464,6 +509,48 @@ @include opacity(.1); } } + + .icon--attachment { + @include opacity(.5); + display: inline-block; + position: relative; + vertical-align: top; + + input { + cursor: pointer; + direction: ltr; + filter: alpha(opacity=0); + font-size: 23px; + height: 100%; + margin: 0; + opacity: 0; + position: absolute; + right: 0; + top: 0; + width: 100%; + } + + &:hover { + @include opacity(.9); + } + } + } + + + .icon--emoji-picker { + @include opacity(.5); + @include single-transition(all, .15s); + cursor: pointer; + font-size: 19px; + margin-left: 7px; + position: relative; + vertical-align: top; + + &:hover, + &:active { + @include opacity(.9); + box-shadow: none; + } } textarea { diff --git a/webapp/sass/responsive/_mobile.scss b/webapp/sass/responsive/_mobile.scss index 4fbec082a..e6cf0ed7d 100644 --- a/webapp/sass/responsive/_mobile.scss +++ b/webapp/sass/responsive/_mobile.scss @@ -31,6 +31,15 @@ } } + .post-create__container{ + .post-create-body { + .icon__postcontent_picker { + display:none; + top: -7px; + } + } + } + .suggestion-list__content { max-height: 145px; } @@ -1098,6 +1107,13 @@ padding: .5em 1em; } + .emoji-rhs { + position: relative; + display: none; + top: 1px; + right: -1px; + } + .msg-typing:empty { display: none; } diff --git a/webapp/sass/responsive/_tablet.scss b/webapp/sass/responsive/_tablet.scss index 3bafc38d4..6924786b9 100644 --- a/webapp/sass/responsive/_tablet.scss +++ b/webapp/sass/responsive/_tablet.scss @@ -19,14 +19,23 @@ width: 300px; } } - + .post-right__scroll{ + .post-create__container{ + .post-create-body { + .icon__emoji_picker { + display:none; + top: -7px; + } + } + } + } .post-create__container { form { padding: .5em 0 0; } .post-create-footer { - padding: 0 45px; + padding: 0 45px 0 8px; .post-error { position: relative; @@ -46,6 +55,7 @@ display: table-cell; padding-left: 45px; + .sidebar--right & { padding-left: 0; } @@ -54,15 +64,30 @@ .app__content & { .btn-file { bottom: -2px; - left: 0; + left: 10px; line-height: 36px; padding: 0; top: auto; - width: 45px; + width: 25px; } } - .send-button { + .app__content & { + .icon { + position: relative; + top: 3px; + + } + } + + .icon__emoji_picker { + position: relative; + display: none; + top: 1px; + right: -1px; + } + + .send-button { display: table-cell; } } diff --git a/webapp/stores/emoji_store.jsx b/webapp/stores/emoji_store.jsx index 212583ea8..444a27c72 100644 --- a/webapp/stores/emoji_store.jsx +++ b/webapp/stores/emoji_store.jsx @@ -5,12 +5,13 @@ import Client from '../client/web_client.jsx'; import AppDispatcher from '../dispatcher/app_dispatcher.jsx'; import Constants from 'utils/constants.jsx'; import EventEmitter from 'events'; - import * as Emoji from 'utils/emoji.jsx'; const ActionTypes = Constants.ActionTypes; const CHANGE_EVENT = 'changed'; +const RECENT_EMOJI_KEY = 'recentEmojis'; +const MAXIMUM_RECENT_EMOJI = 27; // Wrap the contents of the store so that we don't need to construct an ES6 map where most of the content // (the system emojis) will never change. It provides the get/has functions of a map and an iterator so @@ -139,6 +140,48 @@ class EmojiStore extends EventEmitter { return this.map.get(name); } + addRecentEmoji(rawAlias) { + const recentEmojis = this.getRecentEmojis(); + + const alias = rawAlias.split(':').join(''); + + let emoji = this.getCustomEmojiMap().get(alias); + + if (!emoji) { + const emojiIndex = Emoji.EmojiIndicesByAlias.get(alias); + emoji = Emoji.Emojis[emojiIndex]; + } + + if (!emoji) { + // something is wrong, so we return + return; + } + + // odd workaround to the lack of array.findLastIndex - reverse looping & splice + for (let i = recentEmojis.length - 1; i >= 0; i--) { + if ((emoji.name && recentEmojis[i].name === emoji.name) || + (emoji.filename && recentEmojis[i].filename === emoji.filename)) { + recentEmojis.splice(i, 1); + break; + } + } + recentEmojis.push(emoji); + + // cut off the _top_ if it's over length (since new are added to end) + if (recentEmojis.length > MAXIMUM_RECENT_EMOJI) { + recentEmojis.splice(0, recentEmojis.length - MAXIMUM_RECENT_EMOJI); + } + localStorage.setItem(RECENT_EMOJI_KEY, JSON.stringify(recentEmojis)); + } + + getRecentEmojis() { + const result = JSON.parse(localStorage.getItem(RECENT_EMOJI_KEY)); + if (!result) { + return []; + } + return result; + } + hasUnicode(codepoint) { return Emoji.EmojiIndicesByUnicode.has(codepoint); } @@ -174,6 +217,10 @@ class EmojiStore extends EventEmitter { this.removeCustomEmoji(action.id); this.emitChange(); break; + case ActionTypes.EMOJI_POSTED: + this.addRecentEmoji(action.alias); + this.emitChange(); + break; } } } diff --git a/webapp/utils/constants.jsx b/webapp/utils/constants.jsx index d8fc169a3..0abd69a62 100644 --- a/webapp/utils/constants.jsx +++ b/webapp/utils/constants.jsx @@ -176,7 +176,9 @@ export const ActionTypes = keyMirror({ SUGGESTION_SELECT_NEXT: null, SUGGESTION_SELECT_PREVIOUS: null, - BROWSER_CHANGE_FOCUS: null + BROWSER_CHANGE_FOCUS: null, + + EMOJI_POSTED: null }); export const WebrtcActionTypes = keyMirror({ @@ -856,6 +858,10 @@ export const Constants = { WEBRTC_PREVIEW: { label: 'webrtc_preview', description: 'Enable WebRTC one on one calls' + }, + EMOJI_PICKER_PREVIEW: { + label: 'emojipicker', + description: 'Enable emoji picker' } }, OVERLAY_TIME_DELAY_SMALL: 100, diff --git a/webapp/utils/emoji.jsx b/webapp/utils/emoji.jsx index e129baae8..d9e9ee897 100644 --- a/webapp/utils/emoji.jsx +++ b/webapp/utils/emoji.jsx @@ -5,7 +5,7 @@ /* eslint-disable */ -export const Emojis = [{"aliases":["smile"],"filename":"1f604"},{"aliases":["smiley"],"filename":"1f603"},{"aliases":["grinning"],"filename":"1f600"},{"aliases":["blush"],"filename":"1f60a"},{"aliases":["relaxed"],"filename":"263a"},{"aliases":["wink"],"filename":"1f609"},{"aliases":["heart_eyes"],"filename":"1f60d"},{"aliases":["kissing_heart"],"filename":"1f618"},{"aliases":["kissing_closed_eyes"],"filename":"1f61a"},{"aliases":["kissing"],"filename":"1f617"},{"aliases":["kissing_smiling_eyes"],"filename":"1f619"},{"aliases":["stuck_out_tongue_winking_eye"],"filename":"1f61c"},{"aliases":["stuck_out_tongue_closed_eyes"],"filename":"1f61d"},{"aliases":["stuck_out_tongue"],"filename":"1f61b"},{"aliases":["flushed"],"filename":"1f633"},{"aliases":["grin"],"filename":"1f601"},{"aliases":["pensive"],"filename":"1f614"},{"aliases":["relieved"],"filename":"1f60c"},{"aliases":["unamused"],"filename":"1f612"},{"aliases":["disappointed"],"filename":"1f61e"},{"aliases":["persevere"],"filename":"1f623"},{"aliases":["cry"],"filename":"1f622"},{"aliases":["joy"],"filename":"1f602"},{"aliases":["sob"],"filename":"1f62d"},{"aliases":["sleepy"],"filename":"1f62a"},{"aliases":["disappointed_relieved"],"filename":"1f625"},{"aliases":["cold_sweat"],"filename":"1f630"},{"aliases":["sweat_smile"],"filename":"1f605"},{"aliases":["sweat"],"filename":"1f613"},{"aliases":["weary"],"filename":"1f629"},{"aliases":["tired_face"],"filename":"1f62b"},{"aliases":["fearful"],"filename":"1f628"},{"aliases":["scream"],"filename":"1f631"},{"aliases":["angry"],"filename":"1f620"},{"aliases":["rage","pout"],"filename":"1f621"},{"aliases":["triumph"],"filename":"1f624"},{"aliases":["confounded"],"filename":"1f616"},{"aliases":["laughing","satisfied"],"filename":"1f606"},{"aliases":["yum"],"filename":"1f60b"},{"aliases":["mask"],"filename":"1f637"},{"aliases":["sunglasses"],"filename":"1f60e"},{"aliases":["sleeping"],"filename":"1f634"},{"aliases":["dizzy_face"],"filename":"1f635"},{"aliases":["astonished"],"filename":"1f632"},{"aliases":["worried"],"filename":"1f61f"},{"aliases":["frowning"],"filename":"1f626"},{"aliases":["anguished"],"filename":"1f627"},{"aliases":["smiling_imp"],"filename":"1f608"},{"aliases":["imp"],"filename":"1f47f"},{"aliases":["open_mouth"],"filename":"1f62e"},{"aliases":["grimacing"],"filename":"1f62c"},{"aliases":["neutral_face"],"filename":"1f610"},{"aliases":["confused"],"filename":"1f615"},{"aliases":["hushed"],"filename":"1f62f"},{"aliases":["no_mouth"],"filename":"1f636"},{"aliases":["innocent"],"filename":"1f607"},{"aliases":["smirk"],"filename":"1f60f"},{"aliases":["expressionless"],"filename":"1f611"},{"aliases":["man_with_gua_pi_mao"],"filename":"1f472"},{"aliases":["man_with_turban"],"filename":"1f473"},{"aliases":["cop"],"filename":"1f46e"},{"aliases":["construction_worker"],"filename":"1f477"},{"aliases":["guardsman"],"filename":"1f482"},{"aliases":["baby"],"filename":"1f476"},{"aliases":["boy"],"filename":"1f466"},{"aliases":["girl"],"filename":"1f467"},{"aliases":["man"],"filename":"1f468"},{"aliases":["woman"],"filename":"1f469"},{"aliases":["older_man"],"filename":"1f474"},{"aliases":["older_woman"],"filename":"1f475"},{"aliases":["person_with_blond_hair"],"filename":"1f471"},{"aliases":["angel"],"filename":"1f47c"},{"aliases":["princess"],"filename":"1f478"},{"aliases":["smiley_cat"],"filename":"1f63a"},{"aliases":["smile_cat"],"filename":"1f638"},{"aliases":["heart_eyes_cat"],"filename":"1f63b"},{"aliases":["kissing_cat"],"filename":"1f63d"},{"aliases":["smirk_cat"],"filename":"1f63c"},{"aliases":["scream_cat"],"filename":"1f640"},{"aliases":["crying_cat_face"],"filename":"1f63f"},{"aliases":["joy_cat"],"filename":"1f639"},{"aliases":["pouting_cat"],"filename":"1f63e"},{"aliases":["japanese_ogre"],"filename":"1f479"},{"aliases":["japanese_goblin"],"filename":"1f47a"},{"aliases":["see_no_evil"],"filename":"1f648"},{"aliases":["hear_no_evil"],"filename":"1f649"},{"aliases":["speak_no_evil"],"filename":"1f64a"},{"aliases":["skull"],"filename":"1f480"},{"aliases":["alien"],"filename":"1f47d"},{"aliases":["hankey","poop","shit"],"filename":"1f4a9"},{"aliases":["fire"],"filename":"1f525"},{"aliases":["sparkles"],"filename":"2728"},{"aliases":["star2"],"filename":"1f31f"},{"aliases":["dizzy"],"filename":"1f4ab"},{"aliases":["boom","collision"],"filename":"1f4a5"},{"aliases":["anger"],"filename":"1f4a2"},{"aliases":["sweat_drops"],"filename":"1f4a6"},{"aliases":["droplet"],"filename":"1f4a7"},{"aliases":["zzz"],"filename":"1f4a4"},{"aliases":["dash"],"filename":"1f4a8"},{"aliases":["ear"],"filename":"1f442"},{"aliases":["eyes"],"filename":"1f440"},{"aliases":["nose"],"filename":"1f443"},{"aliases":["tongue"],"filename":"1f445"},{"aliases":["lips"],"filename":"1f444"},{"aliases":["+1","thumbsup"],"filename":"1f44d"},{"aliases":["-1","thumbsdown"],"filename":"1f44e"},{"aliases":["ok_hand"],"filename":"1f44c"},{"aliases":["facepunch","punch"],"filename":"1f44a"},{"aliases":["fist"],"filename":"270a"},{"aliases":["v"],"filename":"270c"},{"aliases":["wave"],"filename":"1f44b"},{"aliases":["hand","raised_hand"],"filename":"270b"},{"aliases":["open_hands"],"filename":"1f450"},{"aliases":["point_up_2"],"filename":"1f446"},{"aliases":["point_down"],"filename":"1f447"},{"aliases":["point_right"],"filename":"1f449"},{"aliases":["point_left"],"filename":"1f448"},{"aliases":["raised_hands"],"filename":"1f64c"},{"aliases":["pray"],"filename":"1f64f"},{"aliases":["point_up"],"filename":"261d"},{"aliases":["clap"],"filename":"1f44f"},{"aliases":["muscle"],"filename":"1f4aa"},{"aliases":["walking"],"filename":"1f6b6"},{"aliases":["runner","running"],"filename":"1f3c3"},{"aliases":["dancer"],"filename":"1f483"},{"aliases":["couple"],"filename":"1f46b"},{"aliases":["family"],"filename":"1f46a"},{"aliases":["two_men_holding_hands"],"filename":"1f46c"},{"aliases":["two_women_holding_hands"],"filename":"1f46d"},{"aliases":["couplekiss"],"filename":"1f48f"},{"aliases":["couple_with_heart"],"filename":"1f491"},{"aliases":["dancers"],"filename":"1f46f"},{"aliases":["ok_woman"],"filename":"1f646"},{"aliases":["no_good","ng_woman"],"filename":"1f645"},{"aliases":["information_desk_person"],"filename":"1f481"},{"aliases":["raising_hand"],"filename":"1f64b"},{"aliases":["massage"],"filename":"1f486"},{"aliases":["haircut"],"filename":"1f487"},{"aliases":["nail_care"],"filename":"1f485"},{"aliases":["bride_with_veil"],"filename":"1f470"},{"aliases":["person_with_pouting_face"],"filename":"1f64e"},{"aliases":["person_frowning"],"filename":"1f64d"},{"aliases":["bow"],"filename":"1f647"},{"aliases":["tophat"],"filename":"1f3a9"},{"aliases":["crown"],"filename":"1f451"},{"aliases":["womans_hat"],"filename":"1f452"},{"aliases":["athletic_shoe"],"filename":"1f45f"},{"aliases":["mans_shoe","shoe"],"filename":"1f45e"},{"aliases":["sandal"],"filename":"1f461"},{"aliases":["high_heel"],"filename":"1f460"},{"aliases":["boot"],"filename":"1f462"},{"aliases":["shirt","tshirt"],"filename":"1f455"},{"aliases":["necktie"],"filename":"1f454"},{"aliases":["womans_clothes"],"filename":"1f45a"},{"aliases":["dress"],"filename":"1f457"},{"aliases":["running_shirt_with_sash"],"filename":"1f3bd"},{"aliases":["jeans"],"filename":"1f456"},{"aliases":["kimono"],"filename":"1f458"},{"aliases":["bikini"],"filename":"1f459"},{"aliases":["briefcase"],"filename":"1f4bc"},{"aliases":["handbag"],"filename":"1f45c"},{"aliases":["pouch"],"filename":"1f45d"},{"aliases":["purse"],"filename":"1f45b"},{"aliases":["eyeglasses"],"filename":"1f453"},{"aliases":["ribbon"],"filename":"1f380"},{"aliases":["closed_umbrella"],"filename":"1f302"},{"aliases":["lipstick"],"filename":"1f484"},{"aliases":["yellow_heart"],"filename":"1f49b"},{"aliases":["blue_heart"],"filename":"1f499"},{"aliases":["purple_heart"],"filename":"1f49c"},{"aliases":["green_heart"],"filename":"1f49a"},{"aliases":["heart"],"filename":"2764"},{"aliases":["broken_heart"],"filename":"1f494"},{"aliases":["heartpulse"],"filename":"1f497"},{"aliases":["heartbeat"],"filename":"1f493"},{"aliases":["two_hearts"],"filename":"1f495"},{"aliases":["sparkling_heart"],"filename":"1f496"},{"aliases":["revolving_hearts"],"filename":"1f49e"},{"aliases":["cupid"],"filename":"1f498"},{"aliases":["love_letter"],"filename":"1f48c"},{"aliases":["kiss"],"filename":"1f48b"},{"aliases":["ring"],"filename":"1f48d"},{"aliases":["gem"],"filename":"1f48e"},{"aliases":["bust_in_silhouette"],"filename":"1f464"},{"aliases":["busts_in_silhouette"],"filename":"1f465"},{"aliases":["speech_balloon"],"filename":"1f4ac"},{"aliases":["footprints"],"filename":"1f463"},{"aliases":["thought_balloon"],"filename":"1f4ad"},{"aliases":["dog"],"filename":"1f436"},{"aliases":["wolf"],"filename":"1f43a"},{"aliases":["cat"],"filename":"1f431"},{"aliases":["mouse"],"filename":"1f42d"},{"aliases":["hamster"],"filename":"1f439"},{"aliases":["rabbit"],"filename":"1f430"},{"aliases":["frog"],"filename":"1f438"},{"aliases":["tiger"],"filename":"1f42f"},{"aliases":["koala"],"filename":"1f428"},{"aliases":["bear"],"filename":"1f43b"},{"aliases":["pig"],"filename":"1f437"},{"aliases":["pig_nose"],"filename":"1f43d"},{"aliases":["cow"],"filename":"1f42e"},{"aliases":["boar"],"filename":"1f417"},{"aliases":["monkey_face"],"filename":"1f435"},{"aliases":["monkey"],"filename":"1f412"},{"aliases":["horse"],"filename":"1f434"},{"aliases":["sheep"],"filename":"1f411"},{"aliases":["elephant"],"filename":"1f418"},{"aliases":["panda_face"],"filename":"1f43c"},{"aliases":["penguin"],"filename":"1f427"},{"aliases":["bird"],"filename":"1f426"},{"aliases":["baby_chick"],"filename":"1f424"},{"aliases":["hatched_chick"],"filename":"1f425"},{"aliases":["hatching_chick"],"filename":"1f423"},{"aliases":["chicken"],"filename":"1f414"},{"aliases":["snake"],"filename":"1f40d"},{"aliases":["turtle"],"filename":"1f422"},{"aliases":["bug"],"filename":"1f41b"},{"aliases":["bee","honeybee"],"filename":"1f41d"},{"aliases":["ant"],"filename":"1f41c"},{"aliases":["beetle"],"filename":"1f41e"},{"aliases":["snail"],"filename":"1f40c"},{"aliases":["octopus"],"filename":"1f419"},{"aliases":["shell"],"filename":"1f41a"},{"aliases":["tropical_fish"],"filename":"1f420"},{"aliases":["fish"],"filename":"1f41f"},{"aliases":["dolphin","flipper"],"filename":"1f42c"},{"aliases":["whale"],"filename":"1f433"},{"aliases":["whale2"],"filename":"1f40b"},{"aliases":["cow2"],"filename":"1f404"},{"aliases":["ram"],"filename":"1f40f"},{"aliases":["rat"],"filename":"1f400"},{"aliases":["water_buffalo"],"filename":"1f403"},{"aliases":["tiger2"],"filename":"1f405"},{"aliases":["rabbit2"],"filename":"1f407"},{"aliases":["dragon"],"filename":"1f409"},{"aliases":["racehorse"],"filename":"1f40e"},{"aliases":["goat"],"filename":"1f410"},{"aliases":["rooster"],"filename":"1f413"},{"aliases":["dog2"],"filename":"1f415"},{"aliases":["pig2"],"filename":"1f416"},{"aliases":["mouse2"],"filename":"1f401"},{"aliases":["ox"],"filename":"1f402"},{"aliases":["dragon_face"],"filename":"1f432"},{"aliases":["blowfish"],"filename":"1f421"},{"aliases":["crocodile"],"filename":"1f40a"},{"aliases":["camel"],"filename":"1f42b"},{"aliases":["dromedary_camel"],"filename":"1f42a"},{"aliases":["leopard"],"filename":"1f406"},{"aliases":["cat2"],"filename":"1f408"},{"aliases":["poodle"],"filename":"1f429"},{"aliases":["feet","paw_prints"],"filename":"1f43e"},{"aliases":["bouquet"],"filename":"1f490"},{"aliases":["cherry_blossom"],"filename":"1f338"},{"aliases":["tulip"],"filename":"1f337"},{"aliases":["four_leaf_clover"],"filename":"1f340"},{"aliases":["rose"],"filename":"1f339"},{"aliases":["sunflower"],"filename":"1f33b"},{"aliases":["hibiscus"],"filename":"1f33a"},{"aliases":["maple_leaf"],"filename":"1f341"},{"aliases":["leaves"],"filename":"1f343"},{"aliases":["fallen_leaf"],"filename":"1f342"},{"aliases":["herb"],"filename":"1f33f"},{"aliases":["ear_of_rice"],"filename":"1f33e"},{"aliases":["mushroom"],"filename":"1f344"},{"aliases":["cactus"],"filename":"1f335"},{"aliases":["palm_tree"],"filename":"1f334"},{"aliases":["evergreen_tree"],"filename":"1f332"},{"aliases":["deciduous_tree"],"filename":"1f333"},{"aliases":["chestnut"],"filename":"1f330"},{"aliases":["seedling"],"filename":"1f331"},{"aliases":["blossom"],"filename":"1f33c"},{"aliases":["globe_with_meridians"],"filename":"1f310"},{"aliases":["sun_with_face"],"filename":"1f31e"},{"aliases":["full_moon_with_face"],"filename":"1f31d"},{"aliases":["new_moon_with_face"],"filename":"1f31a"},{"aliases":["new_moon"],"filename":"1f311"},{"aliases":["waxing_crescent_moon"],"filename":"1f312"},{"aliases":["first_quarter_moon"],"filename":"1f313"},{"aliases":["moon","waxing_gibbous_moon"],"filename":"1f314"},{"aliases":["full_moon"],"filename":"1f315"},{"aliases":["waning_gibbous_moon"],"filename":"1f316"},{"aliases":["last_quarter_moon"],"filename":"1f317"},{"aliases":["waning_crescent_moon"],"filename":"1f318"},{"aliases":["last_quarter_moon_with_face"],"filename":"1f31c"},{"aliases":["first_quarter_moon_with_face"],"filename":"1f31b"},{"aliases":["crescent_moon"],"filename":"1f319"},{"aliases":["earth_africa"],"filename":"1f30d"},{"aliases":["earth_americas"],"filename":"1f30e"},{"aliases":["earth_asia"],"filename":"1f30f"},{"aliases":["volcano"],"filename":"1f30b"},{"aliases":["milky_way"],"filename":"1f30c"},{"aliases":["stars"],"filename":"1f320"},{"aliases":["star"],"filename":"2b50"},{"aliases":["sunny"],"filename":"2600"},{"aliases":["partly_sunny"],"filename":"26c5"},{"aliases":["cloud"],"filename":"2601"},{"aliases":["zap"],"filename":"26a1"},{"aliases":["umbrella"],"filename":"2614"},{"aliases":["snowflake"],"filename":"2744"},{"aliases":["snowman"],"filename":"26c4"},{"aliases":["cyclone"],"filename":"1f300"},{"aliases":["foggy"],"filename":"1f301"},{"aliases":["rainbow"],"filename":"1f308"},{"aliases":["ocean"],"filename":"1f30a"},{"aliases":["bamboo"],"filename":"1f38d"},{"aliases":["gift_heart"],"filename":"1f49d"},{"aliases":["dolls"],"filename":"1f38e"},{"aliases":["school_satchel"],"filename":"1f392"},{"aliases":["mortar_board"],"filename":"1f393"},{"aliases":["flags"],"filename":"1f38f"},{"aliases":["fireworks"],"filename":"1f386"},{"aliases":["sparkler"],"filename":"1f387"},{"aliases":["wind_chime"],"filename":"1f390"},{"aliases":["rice_scene"],"filename":"1f391"},{"aliases":["jack_o_lantern"],"filename":"1f383"},{"aliases":["ghost"],"filename":"1f47b"},{"aliases":["santa"],"filename":"1f385"},{"aliases":["christmas_tree"],"filename":"1f384"},{"aliases":["gift"],"filename":"1f381"},{"aliases":["tanabata_tree"],"filename":"1f38b"},{"aliases":["tada"],"filename":"1f389"},{"aliases":["confetti_ball"],"filename":"1f38a"},{"aliases":["balloon"],"filename":"1f388"},{"aliases":["crossed_flags"],"filename":"1f38c"},{"aliases":["crystal_ball"],"filename":"1f52e"},{"aliases":["movie_camera"],"filename":"1f3a5"},{"aliases":["camera"],"filename":"1f4f7"},{"aliases":["video_camera"],"filename":"1f4f9"},{"aliases":["vhs"],"filename":"1f4fc"},{"aliases":["cd"],"filename":"1f4bf"},{"aliases":["dvd"],"filename":"1f4c0"},{"aliases":["minidisc"],"filename":"1f4bd"},{"aliases":["floppy_disk"],"filename":"1f4be"},{"aliases":["computer"],"filename":"1f4bb"},{"aliases":["iphone"],"filename":"1f4f1"},{"aliases":["phone","telephone"],"filename":"260e"},{"aliases":["telephone_receiver"],"filename":"1f4de"},{"aliases":["pager"],"filename":"1f4df"},{"aliases":["fax"],"filename":"1f4e0"},{"aliases":["satellite"],"filename":"1f4e1"},{"aliases":["tv"],"filename":"1f4fa"},{"aliases":["radio"],"filename":"1f4fb"},{"aliases":["loud_sound"],"filename":"1f50a"},{"aliases":["sound"],"filename":"1f509"},{"aliases":["speaker"],"filename":"1f508"},{"aliases":["mute"],"filename":"1f507"},{"aliases":["bell"],"filename":"1f514"},{"aliases":["no_bell"],"filename":"1f515"},{"aliases":["loudspeaker"],"filename":"1f4e2"},{"aliases":["mega"],"filename":"1f4e3"},{"aliases":["hourglass_flowing_sand"],"filename":"23f3"},{"aliases":["hourglass"],"filename":"231b"},{"aliases":["alarm_clock"],"filename":"23f0"},{"aliases":["watch"],"filename":"231a"},{"aliases":["unlock"],"filename":"1f513"},{"aliases":["lock"],"filename":"1f512"},{"aliases":["lock_with_ink_pen"],"filename":"1f50f"},{"aliases":["closed_lock_with_key"],"filename":"1f510"},{"aliases":["key"],"filename":"1f511"},{"aliases":["mag_right"],"filename":"1f50e"},{"aliases":["bulb"],"filename":"1f4a1"},{"aliases":["flashlight"],"filename":"1f526"},{"aliases":["high_brightness"],"filename":"1f506"},{"aliases":["low_brightness"],"filename":"1f505"},{"aliases":["electric_plug"],"filename":"1f50c"},{"aliases":["battery"],"filename":"1f50b"},{"aliases":["mag"],"filename":"1f50d"},{"aliases":["bathtub"],"filename":"1f6c1"},{"aliases":["bath"],"filename":"1f6c0"},{"aliases":["shower"],"filename":"1f6bf"},{"aliases":["toilet"],"filename":"1f6bd"},{"aliases":["wrench"],"filename":"1f527"},{"aliases":["nut_and_bolt"],"filename":"1f529"},{"aliases":["hammer"],"filename":"1f528"},{"aliases":["door"],"filename":"1f6aa"},{"aliases":["smoking"],"filename":"1f6ac"},{"aliases":["bomb"],"filename":"1f4a3"},{"aliases":["gun"],"filename":"1f52b"},{"aliases":["hocho","knife"],"filename":"1f52a"},{"aliases":["pill"],"filename":"1f48a"},{"aliases":["syringe"],"filename":"1f489"},{"aliases":["moneybag"],"filename":"1f4b0"},{"aliases":["yen"],"filename":"1f4b4"},{"aliases":["dollar"],"filename":"1f4b5"},{"aliases":["pound"],"filename":"1f4b7"},{"aliases":["euro"],"filename":"1f4b6"},{"aliases":["credit_card"],"filename":"1f4b3"},{"aliases":["money_with_wings"],"filename":"1f4b8"},{"aliases":["calling"],"filename":"1f4f2"},{"aliases":["e-mail"],"filename":"1f4e7"},{"aliases":["inbox_tray"],"filename":"1f4e5"},{"aliases":["outbox_tray"],"filename":"1f4e4"},{"aliases":["email","envelope"],"filename":"2709"},{"aliases":["envelope_with_arrow"],"filename":"1f4e9"},{"aliases":["incoming_envelope"],"filename":"1f4e8"},{"aliases":["postal_horn"],"filename":"1f4ef"},{"aliases":["mailbox"],"filename":"1f4eb"},{"aliases":["mailbox_closed"],"filename":"1f4ea"},{"aliases":["mailbox_with_mail"],"filename":"1f4ec"},{"aliases":["mailbox_with_no_mail"],"filename":"1f4ed"},{"aliases":["postbox"],"filename":"1f4ee"},{"aliases":["package"],"filename":"1f4e6"},{"aliases":["memo","pencil"],"filename":"1f4dd"},{"aliases":["page_facing_up"],"filename":"1f4c4"},{"aliases":["page_with_curl"],"filename":"1f4c3"},{"aliases":["bookmark_tabs"],"filename":"1f4d1"},{"aliases":["bar_chart"],"filename":"1f4ca"},{"aliases":["chart_with_upwards_trend"],"filename":"1f4c8"},{"aliases":["chart_with_downwards_trend"],"filename":"1f4c9"},{"aliases":["scroll"],"filename":"1f4dc"},{"aliases":["clipboard"],"filename":"1f4cb"},{"aliases":["date"],"filename":"1f4c5"},{"aliases":["calendar"],"filename":"1f4c6"},{"aliases":["card_index"],"filename":"1f4c7"},{"aliases":["file_folder"],"filename":"1f4c1"},{"aliases":["open_file_folder"],"filename":"1f4c2"},{"aliases":["scissors"],"filename":"2702"},{"aliases":["pushpin"],"filename":"1f4cc"},{"aliases":["paperclip"],"filename":"1f4ce"},{"aliases":["black_nib"],"filename":"2712"},{"aliases":["pencil2"],"filename":"270f"},{"aliases":["straight_ruler"],"filename":"1f4cf"},{"aliases":["triangular_ruler"],"filename":"1f4d0"},{"aliases":["closed_book"],"filename":"1f4d5"},{"aliases":["green_book"],"filename":"1f4d7"},{"aliases":["blue_book"],"filename":"1f4d8"},{"aliases":["orange_book"],"filename":"1f4d9"},{"aliases":["notebook"],"filename":"1f4d3"},{"aliases":["notebook_with_decorative_cover"],"filename":"1f4d4"},{"aliases":["ledger"],"filename":"1f4d2"},{"aliases":["books"],"filename":"1f4da"},{"aliases":["book","open_book"],"filename":"1f4d6"},{"aliases":["bookmark"],"filename":"1f516"},{"aliases":["name_badge"],"filename":"1f4db"},{"aliases":["microscope"],"filename":"1f52c"},{"aliases":["telescope"],"filename":"1f52d"},{"aliases":["newspaper"],"filename":"1f4f0"},{"aliases":["art"],"filename":"1f3a8"},{"aliases":["clapper"],"filename":"1f3ac"},{"aliases":["microphone"],"filename":"1f3a4"},{"aliases":["headphones"],"filename":"1f3a7"},{"aliases":["musical_score"],"filename":"1f3bc"},{"aliases":["musical_note"],"filename":"1f3b5"},{"aliases":["notes"],"filename":"1f3b6"},{"aliases":["musical_keyboard"],"filename":"1f3b9"},{"aliases":["violin"],"filename":"1f3bb"},{"aliases":["trumpet"],"filename":"1f3ba"},{"aliases":["saxophone"],"filename":"1f3b7"},{"aliases":["guitar"],"filename":"1f3b8"},{"aliases":["space_invader"],"filename":"1f47e"},{"aliases":["video_game"],"filename":"1f3ae"},{"aliases":["black_joker"],"filename":"1f0cf"},{"aliases":["flower_playing_cards"],"filename":"1f3b4"},{"aliases":["mahjong"],"filename":"1f004"},{"aliases":["game_die"],"filename":"1f3b2"},{"aliases":["dart"],"filename":"1f3af"},{"aliases":["football"],"filename":"1f3c8"},{"aliases":["basketball"],"filename":"1f3c0"},{"aliases":["soccer"],"filename":"26bd"},{"aliases":["baseball"],"filename":"26be"},{"aliases":["tennis"],"filename":"1f3be"},{"aliases":["8ball"],"filename":"1f3b1"},{"aliases":["rugby_football"],"filename":"1f3c9"},{"aliases":["bowling"],"filename":"1f3b3"},{"aliases":["golf"],"filename":"26f3"},{"aliases":["mountain_bicyclist"],"filename":"1f6b5"},{"aliases":["bicyclist"],"filename":"1f6b4"},{"aliases":["checkered_flag"],"filename":"1f3c1"},{"aliases":["horse_racing"],"filename":"1f3c7"},{"aliases":["trophy"],"filename":"1f3c6"},{"aliases":["ski"],"filename":"1f3bf"},{"aliases":["snowboarder"],"filename":"1f3c2"},{"aliases":["swimmer"],"filename":"1f3ca"},{"aliases":["surfer"],"filename":"1f3c4"},{"aliases":["fishing_pole_and_fish"],"filename":"1f3a3"},{"aliases":["coffee"],"filename":"2615"},{"aliases":["tea"],"filename":"1f375"},{"aliases":["sake"],"filename":"1f376"},{"aliases":["baby_bottle"],"filename":"1f37c"},{"aliases":["beer"],"filename":"1f37a"},{"aliases":["beers"],"filename":"1f37b"},{"aliases":["cocktail"],"filename":"1f378"},{"aliases":["tropical_drink"],"filename":"1f379"},{"aliases":["wine_glass"],"filename":"1f377"},{"aliases":["fork_and_knife"],"filename":"1f374"},{"aliases":["pizza"],"filename":"1f355"},{"aliases":["hamburger"],"filename":"1f354"},{"aliases":["fries"],"filename":"1f35f"},{"aliases":["poultry_leg"],"filename":"1f357"},{"aliases":["meat_on_bone"],"filename":"1f356"},{"aliases":["spaghetti"],"filename":"1f35d"},{"aliases":["curry"],"filename":"1f35b"},{"aliases":["fried_shrimp"],"filename":"1f364"},{"aliases":["bento"],"filename":"1f371"},{"aliases":["sushi"],"filename":"1f363"},{"aliases":["fish_cake"],"filename":"1f365"},{"aliases":["rice_ball"],"filename":"1f359"},{"aliases":["rice_cracker"],"filename":"1f358"},{"aliases":["rice"],"filename":"1f35a"},{"aliases":["ramen"],"filename":"1f35c"},{"aliases":["stew"],"filename":"1f372"},{"aliases":["oden"],"filename":"1f362"},{"aliases":["dango"],"filename":"1f361"},{"aliases":["egg"],"filename":"1f373"},{"aliases":["bread"],"filename":"1f35e"},{"aliases":["doughnut"],"filename":"1f369"},{"aliases":["custard"],"filename":"1f36e"},{"aliases":["icecream"],"filename":"1f366"},{"aliases":["ice_cream"],"filename":"1f368"},{"aliases":["shaved_ice"],"filename":"1f367"},{"aliases":["birthday"],"filename":"1f382"},{"aliases":["cake"],"filename":"1f370"},{"aliases":["cookie"],"filename":"1f36a"},{"aliases":["chocolate_bar"],"filename":"1f36b"},{"aliases":["candy"],"filename":"1f36c"},{"aliases":["lollipop"],"filename":"1f36d"},{"aliases":["honey_pot"],"filename":"1f36f"},{"aliases":["apple"],"filename":"1f34e"},{"aliases":["green_apple"],"filename":"1f34f"},{"aliases":["tangerine","orange","mandarin"],"filename":"1f34a"},{"aliases":["lemon"],"filename":"1f34b"},{"aliases":["cherries"],"filename":"1f352"},{"aliases":["grapes"],"filename":"1f347"},{"aliases":["watermelon"],"filename":"1f349"},{"aliases":["strawberry"],"filename":"1f353"},{"aliases":["peach"],"filename":"1f351"},{"aliases":["melon"],"filename":"1f348"},{"aliases":["banana"],"filename":"1f34c"},{"aliases":["pear"],"filename":"1f350"},{"aliases":["pineapple"],"filename":"1f34d"},{"aliases":["sweet_potato"],"filename":"1f360"},{"aliases":["eggplant"],"filename":"1f346"},{"aliases":["tomato"],"filename":"1f345"},{"aliases":["corn"],"filename":"1f33d"},{"aliases":["house"],"filename":"1f3e0"},{"aliases":["house_with_garden"],"filename":"1f3e1"},{"aliases":["school"],"filename":"1f3eb"},{"aliases":["office"],"filename":"1f3e2"},{"aliases":["post_office"],"filename":"1f3e3"},{"aliases":["hospital"],"filename":"1f3e5"},{"aliases":["bank"],"filename":"1f3e6"},{"aliases":["convenience_store"],"filename":"1f3ea"},{"aliases":["love_hotel"],"filename":"1f3e9"},{"aliases":["hotel"],"filename":"1f3e8"},{"aliases":["wedding"],"filename":"1f492"},{"aliases":["church"],"filename":"26ea"},{"aliases":["department_store"],"filename":"1f3ec"},{"aliases":["european_post_office"],"filename":"1f3e4"},{"aliases":["city_sunrise"],"filename":"1f307"},{"aliases":["city_sunset"],"filename":"1f306"},{"aliases":["japanese_castle"],"filename":"1f3ef"},{"aliases":["european_castle"],"filename":"1f3f0"},{"aliases":["tent"],"filename":"26fa"},{"aliases":["factory"],"filename":"1f3ed"},{"aliases":["tokyo_tower"],"filename":"1f5fc"},{"aliases":["japan"],"filename":"1f5fe"},{"aliases":["mount_fuji"],"filename":"1f5fb"},{"aliases":["sunrise_over_mountains"],"filename":"1f304"},{"aliases":["sunrise"],"filename":"1f305"},{"aliases":["night_with_stars"],"filename":"1f303"},{"aliases":["statue_of_liberty"],"filename":"1f5fd"},{"aliases":["bridge_at_night"],"filename":"1f309"},{"aliases":["carousel_horse"],"filename":"1f3a0"},{"aliases":["ferris_wheel"],"filename":"1f3a1"},{"aliases":["fountain"],"filename":"26f2"},{"aliases":["roller_coaster"],"filename":"1f3a2"},{"aliases":["ship"],"filename":"1f6a2"},{"aliases":["boat","sailboat"],"filename":"26f5"},{"aliases":["speedboat"],"filename":"1f6a4"},{"aliases":["rowboat"],"filename":"1f6a3"},{"aliases":["anchor"],"filename":"2693"},{"aliases":["rocket"],"filename":"1f680"},{"aliases":["airplane"],"filename":"2708"},{"aliases":["seat"],"filename":"1f4ba"},{"aliases":["helicopter"],"filename":"1f681"},{"aliases":["steam_locomotive"],"filename":"1f682"},{"aliases":["tram"],"filename":"1f68a"},{"aliases":["station"],"filename":"1f689"},{"aliases":["mountain_railway"],"filename":"1f69e"},{"aliases":["train2"],"filename":"1f686"},{"aliases":["bullettrain_side"],"filename":"1f684"},{"aliases":["bullettrain_front"],"filename":"1f685"},{"aliases":["light_rail"],"filename":"1f688"},{"aliases":["metro"],"filename":"1f687"},{"aliases":["monorail"],"filename":"1f69d"},{"aliases":["train"],"filename":"1f68b"},{"aliases":["railway_car"],"filename":"1f683"},{"aliases":["trolleybus"],"filename":"1f68e"},{"aliases":["bus"],"filename":"1f68c"},{"aliases":["oncoming_bus"],"filename":"1f68d"},{"aliases":["blue_car"],"filename":"1f699"},{"aliases":["oncoming_automobile"],"filename":"1f698"},{"aliases":["car","red_car"],"filename":"1f697"},{"aliases":["taxi"],"filename":"1f695"},{"aliases":["oncoming_taxi"],"filename":"1f696"},{"aliases":["articulated_lorry"],"filename":"1f69b"},{"aliases":["truck"],"filename":"1f69a"},{"aliases":["rotating_light"],"filename":"1f6a8"},{"aliases":["police_car"],"filename":"1f693"},{"aliases":["oncoming_police_car"],"filename":"1f694"},{"aliases":["fire_engine"],"filename":"1f692"},{"aliases":["ambulance"],"filename":"1f691"},{"aliases":["minibus"],"filename":"1f690"},{"aliases":["bike"],"filename":"1f6b2"},{"aliases":["aerial_tramway"],"filename":"1f6a1"},{"aliases":["suspension_railway"],"filename":"1f69f"},{"aliases":["mountain_cableway"],"filename":"1f6a0"},{"aliases":["tractor"],"filename":"1f69c"},{"aliases":["barber"],"filename":"1f488"},{"aliases":["busstop"],"filename":"1f68f"},{"aliases":["ticket"],"filename":"1f3ab"},{"aliases":["vertical_traffic_light"],"filename":"1f6a6"},{"aliases":["traffic_light"],"filename":"1f6a5"},{"aliases":["warning"],"filename":"26a0"},{"aliases":["construction"],"filename":"1f6a7"},{"aliases":["beginner"],"filename":"1f530"},{"aliases":["fuelpump"],"filename":"26fd"},{"aliases":["izakaya_lantern","lantern"],"filename":"1f3ee"},{"aliases":["slot_machine"],"filename":"1f3b0"},{"aliases":["hotsprings"],"filename":"2668"},{"aliases":["moyai"],"filename":"1f5ff"},{"aliases":["circus_tent"],"filename":"1f3aa"},{"aliases":["performing_arts"],"filename":"1f3ad"},{"aliases":["round_pushpin"],"filename":"1f4cd"},{"aliases":["triangular_flag_on_post"],"filename":"1f6a9"},{"aliases":["jp"],"filename":"1f1ef-1f1f5"},{"aliases":["kr"],"filename":"1f1f0-1f1f7"},{"aliases":["de"],"filename":"1f1e9-1f1ea"},{"aliases":["cn"],"filename":"1f1e8-1f1f3"},{"aliases":["us"],"filename":"1f1fa-1f1f8"},{"aliases":["fr"],"filename":"1f1eb-1f1f7"},{"aliases":["es"],"filename":"1f1ea-1f1f8"},{"aliases":["it"],"filename":"1f1ee-1f1f9"},{"aliases":["ru"],"filename":"1f1f7-1f1fa"},{"aliases":["gb","uk"],"filename":"1f1ec-1f1e7"},{"aliases":["one"],"filename":"0031-20e3"},{"aliases":["two"],"filename":"0032-20e3"},{"aliases":["three"],"filename":"0033-20e3"},{"aliases":["four"],"filename":"0034-20e3"},{"aliases":["five"],"filename":"0035-20e3"},{"aliases":["six"],"filename":"0036-20e3"},{"aliases":["seven"],"filename":"0037-20e3"},{"aliases":["eight"],"filename":"0038-20e3"},{"aliases":["nine"],"filename":"0039-20e3"},{"aliases":["zero"],"filename":"0030-20e3"},{"aliases":["keycap_ten"],"filename":"1f51f"},{"aliases":["1234"],"filename":"1f522"},{"aliases":["hash"],"filename":"0023-20e3"},{"aliases":["symbols"],"filename":"1f523"},{"aliases":["arrow_up"],"filename":"2b06"},{"aliases":["arrow_down"],"filename":"2b07"},{"aliases":["arrow_left"],"filename":"2b05"},{"aliases":["arrow_right"],"filename":"27a1"},{"aliases":["capital_abcd"],"filename":"1f520"},{"aliases":["abcd"],"filename":"1f521"},{"aliases":["abc"],"filename":"1f524"},{"aliases":["arrow_upper_right"],"filename":"2197"},{"aliases":["arrow_upper_left"],"filename":"2196"},{"aliases":["arrow_lower_right"],"filename":"2198"},{"aliases":["arrow_lower_left"],"filename":"2199"},{"aliases":["left_right_arrow"],"filename":"2194"},{"aliases":["arrow_up_down"],"filename":"2195"},{"aliases":["arrows_counterclockwise"],"filename":"1f504"},{"aliases":["arrow_backward"],"filename":"25c0"},{"aliases":["arrow_forward"],"filename":"25b6"},{"aliases":["arrow_up_small"],"filename":"1f53c"},{"aliases":["arrow_down_small"],"filename":"1f53d"},{"aliases":["leftwards_arrow_with_hook"],"filename":"21a9"},{"aliases":["arrow_right_hook"],"filename":"21aa"},{"aliases":["information_source"],"filename":"2139"},{"aliases":["rewind"],"filename":"23ea"},{"aliases":["fast_forward"],"filename":"23e9"},{"aliases":["arrow_double_up"],"filename":"23eb"},{"aliases":["arrow_double_down"],"filename":"23ec"},{"aliases":["arrow_heading_down"],"filename":"2935"},{"aliases":["arrow_heading_up"],"filename":"2934"},{"aliases":["ok"],"filename":"1f197"},{"aliases":["twisted_rightwards_arrows"],"filename":"1f500"},{"aliases":["repeat"],"filename":"1f501"},{"aliases":["repeat_one"],"filename":"1f502"},{"aliases":["new"],"filename":"1f195"},{"aliases":["up"],"filename":"1f199"},{"aliases":["cool"],"filename":"1f192"},{"aliases":["free"],"filename":"1f193"},{"aliases":["ng"],"filename":"1f196"},{"aliases":["signal_strength"],"filename":"1f4f6"},{"aliases":["cinema"],"filename":"1f3a6"},{"aliases":["koko"],"filename":"1f201"},{"aliases":["u6307"],"filename":"1f22f"},{"aliases":["u7a7a"],"filename":"1f233"},{"aliases":["u6e80"],"filename":"1f235"},{"aliases":["u5408"],"filename":"1f234"},{"aliases":["u7981"],"filename":"1f232"},{"aliases":["ideograph_advantage"],"filename":"1f250"},{"aliases":["u5272"],"filename":"1f239"},{"aliases":["u55b6"],"filename":"1f23a"},{"aliases":["u6709"],"filename":"1f236"},{"aliases":["u7121"],"filename":"1f21a"},{"aliases":["restroom"],"filename":"1f6bb"},{"aliases":["mens"],"filename":"1f6b9"},{"aliases":["womens"],"filename":"1f6ba"},{"aliases":["baby_symbol"],"filename":"1f6bc"},{"aliases":["wc"],"filename":"1f6be"},{"aliases":["potable_water"],"filename":"1f6b0"},{"aliases":["put_litter_in_its_place"],"filename":"1f6ae"},{"aliases":["parking"],"filename":"1f17f"},{"aliases":["wheelchair"],"filename":"267f"},{"aliases":["no_smoking"],"filename":"1f6ad"},{"aliases":["u6708"],"filename":"1f237"},{"aliases":["u7533"],"filename":"1f238"},{"aliases":["sa"],"filename":"1f202"},{"aliases":["m"],"filename":"24c2"},{"aliases":["passport_control"],"filename":"1f6c2"},{"aliases":["baggage_claim"],"filename":"1f6c4"},{"aliases":["left_luggage"],"filename":"1f6c5"},{"aliases":["customs"],"filename":"1f6c3"},{"aliases":["accept"],"filename":"1f251"},{"aliases":["secret"],"filename":"3299"},{"aliases":["congratulations"],"filename":"3297"},{"aliases":["cl"],"filename":"1f191"},{"aliases":["sos"],"filename":"1f198"},{"aliases":["id"],"filename":"1f194"},{"aliases":["no_entry_sign"],"filename":"1f6ab"},{"aliases":["underage"],"filename":"1f51e"},{"aliases":["no_mobile_phones"],"filename":"1f4f5"},{"aliases":["do_not_litter"],"filename":"1f6af"},{"aliases":["non-potable_water"],"filename":"1f6b1"},{"aliases":["no_bicycles"],"filename":"1f6b3"},{"aliases":["no_pedestrians"],"filename":"1f6b7"},{"aliases":["children_crossing"],"filename":"1f6b8"},{"aliases":["no_entry"],"filename":"26d4"},{"aliases":["eight_spoked_asterisk"],"filename":"2733"},{"aliases":["sparkle"],"filename":"2747"},{"aliases":["negative_squared_cross_mark"],"filename":"274e"},{"aliases":["white_check_mark"],"filename":"2705"},{"aliases":["eight_pointed_black_star"],"filename":"2734"},{"aliases":["heart_decoration"],"filename":"1f49f"},{"aliases":["vs"],"filename":"1f19a"},{"aliases":["vibration_mode"],"filename":"1f4f3"},{"aliases":["mobile_phone_off"],"filename":"1f4f4"},{"aliases":["a"],"filename":"1f170"},{"aliases":["b"],"filename":"1f171"},{"aliases":["ab"],"filename":"1f18e"},{"aliases":["o2"],"filename":"1f17e"},{"aliases":["diamond_shape_with_a_dot_inside"],"filename":"1f4a0"},{"aliases":["loop"],"filename":"27bf"},{"aliases":["recycle"],"filename":"267b"},{"aliases":["aries"],"filename":"2648"},{"aliases":["taurus"],"filename":"2649"},{"aliases":["gemini"],"filename":"264a"},{"aliases":["cancer"],"filename":"264b"},{"aliases":["leo"],"filename":"264c"},{"aliases":["virgo"],"filename":"264d"},{"aliases":["libra"],"filename":"264e"},{"aliases":["scorpius"],"filename":"264f"},{"aliases":["sagittarius"],"filename":"2650"},{"aliases":["capricorn"],"filename":"2651"},{"aliases":["aquarius"],"filename":"2652"},{"aliases":["pisces"],"filename":"2653"},{"aliases":["ophiuchus"],"filename":"26ce"},{"aliases":["six_pointed_star"],"filename":"1f52f"},{"aliases":["atm"],"filename":"1f3e7"},{"aliases":["chart"],"filename":"1f4b9"},{"aliases":["heavy_dollar_sign"],"filename":"1f4b2"},{"aliases":["currency_exchange"],"filename":"1f4b1"},{"aliases":["copyright"],"filename":"00a9"},{"aliases":["registered"],"filename":"00ae"},{"aliases":["tm"],"filename":"2122"},{"aliases":["x"],"filename":"274c"},{"aliases":["bangbang"],"filename":"203c"},{"aliases":["interrobang"],"filename":"2049"},{"aliases":["exclamation","heavy_exclamation_mark"],"filename":"2757"},{"aliases":["question"],"filename":"2753"},{"aliases":["grey_exclamation"],"filename":"2755"},{"aliases":["grey_question"],"filename":"2754"},{"aliases":["o"],"filename":"2b55"},{"aliases":["top"],"filename":"1f51d"},{"aliases":["end"],"filename":"1f51a"},{"aliases":["back"],"filename":"1f519"},{"aliases":["on"],"filename":"1f51b"},{"aliases":["soon"],"filename":"1f51c"},{"aliases":["arrows_clockwise"],"filename":"1f503"},{"aliases":["clock12"],"filename":"1f55b"},{"aliases":["clock1230"],"filename":"1f567"},{"aliases":["clock1"],"filename":"1f550"},{"aliases":["clock130"],"filename":"1f55c"},{"aliases":["clock2"],"filename":"1f551"},{"aliases":["clock230"],"filename":"1f55d"},{"aliases":["clock3"],"filename":"1f552"},{"aliases":["clock330"],"filename":"1f55e"},{"aliases":["clock4"],"filename":"1f553"},{"aliases":["clock430"],"filename":"1f55f"},{"aliases":["clock5"],"filename":"1f554"},{"aliases":["clock530"],"filename":"1f560"},{"aliases":["clock6"],"filename":"1f555"},{"aliases":["clock7"],"filename":"1f556"},{"aliases":["clock8"],"filename":"1f557"},{"aliases":["clock9"],"filename":"1f558"},{"aliases":["clock10"],"filename":"1f559"},{"aliases":["clock11"],"filename":"1f55a"},{"aliases":["clock630"],"filename":"1f561"},{"aliases":["clock730"],"filename":"1f562"},{"aliases":["clock830"],"filename":"1f563"},{"aliases":["clock930"],"filename":"1f564"},{"aliases":["clock1030"],"filename":"1f565"},{"aliases":["clock1130"],"filename":"1f566"},{"aliases":["heavy_multiplication_x"],"filename":"2716"},{"aliases":["heavy_plus_sign"],"filename":"2795"},{"aliases":["heavy_minus_sign"],"filename":"2796"},{"aliases":["heavy_division_sign"],"filename":"2797"},{"aliases":["spades"],"filename":"2660"},{"aliases":["hearts"],"filename":"2665"},{"aliases":["clubs"],"filename":"2663"},{"aliases":["diamonds"],"filename":"2666"},{"aliases":["white_flower"],"filename":"1f4ae"},{"aliases":["100"],"filename":"1f4af"},{"aliases":["heavy_check_mark"],"filename":"2714"},{"aliases":["ballot_box_with_check"],"filename":"2611"},{"aliases":["radio_button"],"filename":"1f518"},{"aliases":["link"],"filename":"1f517"},{"aliases":["curly_loop"],"filename":"27b0"},{"aliases":["wavy_dash"],"filename":"3030"},{"aliases":["part_alternation_mark"],"filename":"303d"},{"aliases":["trident"],"filename":"1f531"},{"aliases":["black_medium_square"],"filename":"25fc"},{"aliases":["white_medium_square"],"filename":"25fb"},{"aliases":["black_medium_small_square"],"filename":"25fe"},{"aliases":["white_medium_small_square"],"filename":"25fd"},{"aliases":["black_small_square"],"filename":"25aa"},{"aliases":["white_small_square"],"filename":"25ab"},{"aliases":["small_red_triangle"],"filename":"1f53a"},{"aliases":["black_square_button"],"filename":"1f532"},{"aliases":["white_square_button"],"filename":"1f533"},{"aliases":["black_circle"],"filename":"26ab"},{"aliases":["white_circle"],"filename":"26aa"},{"aliases":["red_circle"],"filename":"1f534"},{"aliases":["large_blue_circle"],"filename":"1f535"},{"aliases":["small_red_triangle_down"],"filename":"1f53b"},{"aliases":["white_large_square"],"filename":"2b1c"},{"aliases":["black_large_square"],"filename":"2b1b"},{"aliases":["large_orange_diamond"],"filename":"1f536"},{"aliases":["large_blue_diamond"],"filename":"1f537"},{"aliases":["small_orange_diamond"],"filename":"1f538"},{"aliases":["small_blue_diamond"],"filename":"1f539"},{"aliases":["ca"],"filename":"1f1e8-1f1e6"},{"aliases":["pk"],"filename":"1f1f5-1f1f0"},{"aliases":["za"],"filename":"1f1ff-1f1e6"},{"aliases":["slightly_smiling_face"],"filename":"1f642"},{"aliases":["slightly_frowning_face"],"filename":"1f641"},{"aliases":["upside_down_face"],"filename":"1f643"},{"aliases":["mattermost"],"filename":""},{"aliases":["bowtie"],"filename":""},{"aliases":["feelsgood"],"filename":""},{"aliases":["finnadie"],"filename":""},{"aliases":["fu"],"filename":""},{"aliases":["goberserk"],"filename":""},{"aliases":["godmode"],"filename":""},{"aliases":["hurtrealbad"],"filename":""},{"aliases":["metal"],"filename":""},{"aliases":["neckbeard"],"filename":""},{"aliases":["octocat"],"filename":""},{"aliases":["rage1"],"filename":""},{"aliases":["rage2"],"filename":""},{"aliases":["rage3"],"filename":""},{"aliases":["rage4"],"filename":""},{"aliases":["shipit","squirrel"],"filename":""},{"aliases":["suspect"],"filename":""},{"aliases":["taco"],"filename":""},{"aliases":["trollface"],"filename":""}]; +export const Emojis = [{"aliases":["smile"],"filename":"1f604"},{"aliases":["smiley"],"filename":"1f603"},{"aliases":["grinning"],"filename":"1f600"},{"aliases":["blush"],"filename":"1f60a"},{"aliases":["relaxed"],"filename":"263a"},{"aliases":["wink"],"filename":"1f609"},{"aliases":["heart_eyes"],"filename":"1f60d"},{"aliases":["kissing_heart"],"filename":"1f618"},{"aliases":["kissing_closed_eyes"],"filename":"1f61a"},{"aliases":["kissing"],"filename":"1f617"},{"aliases":["kissing_smiling_eyes"],"filename":"1f619"},{"aliases":["stuck_out_tongue_winking_eye"],"filename":"1f61c"},{"aliases":["stuck_out_tongue_closed_eyes"],"filename":"1f61d"},{"aliases":["stuck_out_tongue"],"filename":"1f61b"},{"aliases":["flushed"],"filename":"1f633"},{"aliases":["grin"],"filename":"1f601"},{"aliases":["pensive"],"filename":"1f614"},{"aliases":["relieved"],"filename":"1f60c"},{"aliases":["unamused"],"filename":"1f612"},{"aliases":["disappointed"],"filename":"1f61e"},{"aliases":["persevere"],"filename":"1f623"},{"aliases":["cry"],"filename":"1f622"},{"aliases":["joy"],"filename":"1f602"},{"aliases":["sob"],"filename":"1f62d"},{"aliases":["sleepy"],"filename":"1f62a"},{"aliases":["disappointed_relieved"],"filename":"1f625"},{"aliases":["cold_sweat"],"filename":"1f630"},{"aliases":["sweat_smile"],"filename":"1f605"},{"aliases":["sweat"],"filename":"1f613"},{"aliases":["weary"],"filename":"1f629"},{"aliases":["tired_face"],"filename":"1f62b"},{"aliases":["fearful"],"filename":"1f628"},{"aliases":["scream"],"filename":"1f631"},{"aliases":["angry"],"filename":"1f620"},{"aliases":["rage","pout"],"filename":"1f621"},{"aliases":["triumph"],"filename":"1f624"},{"aliases":["confounded"],"filename":"1f616"},{"aliases":["laughing","satisfied"],"filename":"1f606"},{"aliases":["yum"],"filename":"1f60b"},{"aliases":["mask"],"filename":"1f637"},{"aliases":["sunglasses"],"filename":"1f60e"},{"aliases":["sleeping"],"filename":"1f634"},{"aliases":["dizzy_face"],"filename":"1f635"},{"aliases":["astonished"],"filename":"1f632"},{"aliases":["worried"],"filename":"1f61f"},{"aliases":["frowning"],"filename":"1f626"},{"aliases":["anguished"],"filename":"1f627"},{"aliases":["smiling_imp"],"filename":"1f608"},{"aliases":["imp"],"filename":"1f47f"},{"aliases":["open_mouth"],"filename":"1f62e"},{"aliases":["grimacing"],"filename":"1f62c"},{"aliases":["neutral_face"],"filename":"1f610"},{"aliases":["confused"],"filename":"1f615"},{"aliases":["hushed"],"filename":"1f62f"},{"aliases":["no_mouth"],"filename":"1f636"},{"aliases":["innocent"],"filename":"1f607"},{"aliases":["smirk"],"filename":"1f60f"},{"aliases":["expressionless"],"filename":"1f611"},{"aliases":["man_with_gua_pi_mao"],"filename":"1f472"},{"aliases":["man_with_turban"],"filename":"1f473"},{"aliases":["cop"],"filename":"1f46e"},{"aliases":["construction_worker"],"filename":"1f477"},{"aliases":["guardsman"],"filename":"1f482"},{"aliases":["baby"],"filename":"1f476"},{"aliases":["boy"],"filename":"1f466"},{"aliases":["girl"],"filename":"1f467"},{"aliases":["man"],"filename":"1f468"},{"aliases":["woman"],"filename":"1f469"},{"aliases":["older_man"],"filename":"1f474"},{"aliases":["older_woman"],"filename":"1f475"},{"aliases":["person_with_blond_hair"],"filename":"1f471"},{"aliases":["angel"],"filename":"1f47c"},{"aliases":["princess"],"filename":"1f478"},{"aliases":["smiley_cat"],"filename":"1f63a"},{"aliases":["smile_cat"],"filename":"1f638"},{"aliases":["heart_eyes_cat"],"filename":"1f63b"},{"aliases":["kissing_cat"],"filename":"1f63d"},{"aliases":["smirk_cat"],"filename":"1f63c"},{"aliases":["scream_cat"],"filename":"1f640"},{"aliases":["crying_cat_face"],"filename":"1f63f"},{"aliases":["joy_cat"],"filename":"1f639"},{"aliases":["pouting_cat"],"filename":"1f63e"},{"aliases":["japanese_ogre"],"filename":"1f479"},{"aliases":["japanese_goblin"],"filename":"1f47a"},{"aliases":["see_no_evil"],"filename":"1f648"},{"aliases":["hear_no_evil"],"filename":"1f649"},{"aliases":["speak_no_evil"],"filename":"1f64a"},{"aliases":["skull"],"filename":"1f480"},{"aliases":["alien"],"filename":"1f47d"},{"aliases":["hankey","poop","shit"],"filename":"1f4a9"},{"aliases":["fire"],"filename":"1f525"},{"aliases":["sparkles"],"filename":"2728"},{"aliases":["star2"],"filename":"1f31f"},{"aliases":["dizzy"],"filename":"1f4ab"},{"aliases":["boom","collision"],"filename":"1f4a5"},{"aliases":["anger"],"filename":"1f4a2"},{"aliases":["sweat_drops"],"filename":"1f4a6"},{"aliases":["droplet"],"filename":"1f4a7"},{"aliases":["zzz"],"filename":"1f4a4"},{"aliases":["dash"],"filename":"1f4a8"},{"aliases":["ear"],"filename":"1f442"},{"aliases":["eyes"],"filename":"1f440"},{"aliases":["nose"],"filename":"1f443"},{"aliases":["tongue"],"filename":"1f445"},{"aliases":["lips"],"filename":"1f444"},{"aliases":["+1","thumbsup"],"filename":"1f44d"},{"aliases":["-1","thumbsdown"],"filename":"1f44e"},{"aliases":["ok_hand"],"filename":"1f44c"},{"aliases":["facepunch","punch"],"filename":"1f44a"},{"aliases":["fist"],"filename":"270a"},{"aliases":["v"],"filename":"270c"},{"aliases":["wave"],"filename":"1f44b"},{"aliases":["hand","raised_hand"],"filename":"270b"},{"aliases":["open_hands"],"filename":"1f450"},{"aliases":["point_up_2"],"filename":"1f446"},{"aliases":["point_down"],"filename":"1f447"},{"aliases":["point_right"],"filename":"1f449"},{"aliases":["point_left"],"filename":"1f448"},{"aliases":["raised_hands"],"filename":"1f64c"},{"aliases":["pray"],"filename":"1f64f"},{"aliases":["point_up"],"filename":"261d"},{"aliases":["clap"],"filename":"1f44f"},{"aliases":["muscle"],"filename":"1f4aa"},{"aliases":["walking"],"filename":"1f6b6"},{"aliases":["runner","running"],"filename":"1f3c3"},{"aliases":["dancer"],"filename":"1f483"},{"aliases":["couple"],"filename":"1f46b"},{"aliases":["family"],"filename":"1f46a"},{"aliases":["two_men_holding_hands"],"filename":"1f46c"},{"aliases":["two_women_holding_hands"],"filename":"1f46d"},{"aliases":["couplekiss"],"filename":"1f48f"},{"aliases":["couple_with_heart"],"filename":"1f491"},{"aliases":["dancers"],"filename":"1f46f"},{"aliases":["ok_woman"],"filename":"1f646"},{"aliases":["no_good","ng_woman"],"filename":"1f645"},{"aliases":["information_desk_person"],"filename":"1f481"},{"aliases":["raising_hand"],"filename":"1f64b"},{"aliases":["massage"],"filename":"1f486"},{"aliases":["haircut"],"filename":"1f487"},{"aliases":["nail_care"],"filename":"1f485"},{"aliases":["bride_with_veil"],"filename":"1f470"},{"aliases":["person_with_pouting_face"],"filename":"1f64e"},{"aliases":["person_frowning"],"filename":"1f64d"},{"aliases":["bow"],"filename":"1f647"},{"aliases":["tophat"],"filename":"1f3a9"},{"aliases":["crown"],"filename":"1f451"},{"aliases":["womans_hat"],"filename":"1f452"},{"aliases":["athletic_shoe"],"filename":"1f45f"},{"aliases":["mans_shoe","shoe"],"filename":"1f45e"},{"aliases":["sandal"],"filename":"1f461"},{"aliases":["high_heel"],"filename":"1f460"},{"aliases":["boot"],"filename":"1f462"},{"aliases":["shirt","tshirt"],"filename":"1f455"},{"aliases":["necktie"],"filename":"1f454"},{"aliases":["womans_clothes"],"filename":"1f45a"},{"aliases":["dress"],"filename":"1f457"},{"aliases":["running_shirt_with_sash"],"filename":"1f3bd"},{"aliases":["jeans"],"filename":"1f456"},{"aliases":["kimono"],"filename":"1f458"},{"aliases":["bikini"],"filename":"1f459"},{"aliases":["briefcase"],"filename":"1f4bc"},{"aliases":["handbag"],"filename":"1f45c"},{"aliases":["pouch"],"filename":"1f45d"},{"aliases":["purse"],"filename":"1f45b"},{"aliases":["eyeglasses"],"filename":"1f453"},{"aliases":["ribbon"],"filename":"1f380"},{"aliases":["closed_umbrella"],"filename":"1f302"},{"aliases":["lipstick"],"filename":"1f484"},{"aliases":["yellow_heart"],"filename":"1f49b"},{"aliases":["blue_heart"],"filename":"1f499"},{"aliases":["purple_heart"],"filename":"1f49c"},{"aliases":["green_heart"],"filename":"1f49a"},{"aliases":["heart"],"filename":"2764"},{"aliases":["broken_heart"],"filename":"1f494"},{"aliases":["heartpulse"],"filename":"1f497"},{"aliases":["heartbeat"],"filename":"1f493"},{"aliases":["two_hearts"],"filename":"1f495"},{"aliases":["sparkling_heart"],"filename":"1f496"},{"aliases":["revolving_hearts"],"filename":"1f49e"},{"aliases":["cupid"],"filename":"1f498"},{"aliases":["love_letter"],"filename":"1f48c"},{"aliases":["kiss"],"filename":"1f48b"},{"aliases":["ring"],"filename":"1f48d"},{"aliases":["gem"],"filename":"1f48e"},{"aliases":["bust_in_silhouette"],"filename":"1f464"},{"aliases":["busts_in_silhouette"],"filename":"1f465"},{"aliases":["speech_balloon"],"filename":"1f4ac"},{"aliases":["footprints"],"filename":"1f463"},{"aliases":["thought_balloon"],"filename":"1f4ad"},{"aliases":["dog"],"filename":"1f436"},{"aliases":["wolf"],"filename":"1f43a"},{"aliases":["cat"],"filename":"1f431"},{"aliases":["mouse"],"filename":"1f42d"},{"aliases":["hamster"],"filename":"1f439"},{"aliases":["rabbit"],"filename":"1f430"},{"aliases":["frog"],"filename":"1f438"},{"aliases":["tiger"],"filename":"1f42f"},{"aliases":["koala"],"filename":"1f428"},{"aliases":["bear"],"filename":"1f43b"},{"aliases":["pig"],"filename":"1f437"},{"aliases":["pig_nose"],"filename":"1f43d"},{"aliases":["cow"],"filename":"1f42e"},{"aliases":["boar"],"filename":"1f417"},{"aliases":["monkey_face"],"filename":"1f435"},{"aliases":["monkey"],"filename":"1f412"},{"aliases":["horse"],"filename":"1f434"},{"aliases":["sheep"],"filename":"1f411"},{"aliases":["elephant"],"filename":"1f418"},{"aliases":["panda_face"],"filename":"1f43c"},{"aliases":["penguin"],"filename":"1f427"},{"aliases":["bird"],"filename":"1f426"},{"aliases":["baby_chick"],"filename":"1f424"},{"aliases":["hatched_chick"],"filename":"1f425"},{"aliases":["hatching_chick"],"filename":"1f423"},{"aliases":["chicken"],"filename":"1f414"},{"aliases":["snake"],"filename":"1f40d"},{"aliases":["turtle"],"filename":"1f422"},{"aliases":["bug"],"filename":"1f41b"},{"aliases":["bee","honeybee"],"filename":"1f41d"},{"aliases":["ant"],"filename":"1f41c"},{"aliases":["beetle"],"filename":"1f41e"},{"aliases":["snail"],"filename":"1f40c"},{"aliases":["octopus"],"filename":"1f419"},{"aliases":["shell"],"filename":"1f41a"},{"aliases":["tropical_fish"],"filename":"1f420"},{"aliases":["fish"],"filename":"1f41f"},{"aliases":["dolphin","flipper"],"filename":"1f42c"},{"aliases":["whale"],"filename":"1f433"},{"aliases":["whale2"],"filename":"1f40b"},{"aliases":["cow2"],"filename":"1f404"},{"aliases":["ram"],"filename":"1f40f"},{"aliases":["rat"],"filename":"1f400"},{"aliases":["water_buffalo"],"filename":"1f403"},{"aliases":["tiger2"],"filename":"1f405"},{"aliases":["rabbit2"],"filename":"1f407"},{"aliases":["dragon"],"filename":"1f409"},{"aliases":["racehorse"],"filename":"1f40e"},{"aliases":["goat"],"filename":"1f410"},{"aliases":["rooster"],"filename":"1f413"},{"aliases":["dog2"],"filename":"1f415"},{"aliases":["pig2"],"filename":"1f416"},{"aliases":["mouse2"],"filename":"1f401"},{"aliases":["ox"],"filename":"1f402"},{"aliases":["dragon_face"],"filename":"1f432"},{"aliases":["blowfish"],"filename":"1f421"},{"aliases":["crocodile"],"filename":"1f40a"},{"aliases":["camel"],"filename":"1f42b"},{"aliases":["dromedary_camel"],"filename":"1f42a"},{"aliases":["leopard"],"filename":"1f406"},{"aliases":["cat2"],"filename":"1f408"},{"aliases":["poodle"],"filename":"1f429"},{"aliases":["feet","paw_prints"],"filename":"1f43e"},{"aliases":["bouquet"],"filename":"1f490"},{"aliases":["cherry_blossom"],"filename":"1f338"},{"aliases":["tulip"],"filename":"1f337"},{"aliases":["four_leaf_clover"],"filename":"1f340"},{"aliases":["rose"],"filename":"1f339"},{"aliases":["sunflower"],"filename":"1f33b"},{"aliases":["hibiscus"],"filename":"1f33a"},{"aliases":["maple_leaf"],"filename":"1f341"},{"aliases":["leaves"],"filename":"1f343"},{"aliases":["fallen_leaf"],"filename":"1f342"},{"aliases":["herb"],"filename":"1f33f"},{"aliases":["ear_of_rice"],"filename":"1f33e"},{"aliases":["mushroom"],"filename":"1f344"},{"aliases":["cactus"],"filename":"1f335"},{"aliases":["palm_tree"],"filename":"1f334"},{"aliases":["evergreen_tree"],"filename":"1f332"},{"aliases":["deciduous_tree"],"filename":"1f333"},{"aliases":["chestnut"],"filename":"1f330"},{"aliases":["seedling"],"filename":"1f331"},{"aliases":["blossom"],"filename":"1f33c"},{"aliases":["globe_with_meridians"],"filename":"1f310"},{"aliases":["sun_with_face"],"filename":"1f31e"},{"aliases":["full_moon_with_face"],"filename":"1f31d"},{"aliases":["new_moon_with_face"],"filename":"1f31a"},{"aliases":["new_moon"],"filename":"1f311"},{"aliases":["waxing_crescent_moon"],"filename":"1f312"},{"aliases":["first_quarter_moon"],"filename":"1f313"},{"aliases":["moon","waxing_gibbous_moon"],"filename":"1f314"},{"aliases":["full_moon"],"filename":"1f315"},{"aliases":["waning_gibbous_moon"],"filename":"1f316"},{"aliases":["last_quarter_moon"],"filename":"1f317"},{"aliases":["waning_crescent_moon"],"filename":"1f318"},{"aliases":["last_quarter_moon_with_face"],"filename":"1f31c"},{"aliases":["first_quarter_moon_with_face"],"filename":"1f31b"},{"aliases":["crescent_moon"],"filename":"1f319"},{"aliases":["earth_africa"],"filename":"1f30d"},{"aliases":["earth_americas"],"filename":"1f30e"},{"aliases":["earth_asia"],"filename":"1f30f"},{"aliases":["volcano"],"filename":"1f30b"},{"aliases":["milky_way"],"filename":"1f30c"},{"aliases":["stars"],"filename":"1f320"},{"aliases":["star"],"filename":"2b50"},{"aliases":["sunny"],"filename":"2600"},{"aliases":["partly_sunny"],"filename":"26c5"},{"aliases":["cloud"],"filename":"2601"},{"aliases":["zap"],"filename":"26a1"},{"aliases":["umbrella"],"filename":"2614"},{"aliases":["snowflake"],"filename":"2744"},{"aliases":["snowman"],"filename":"26c4"},{"aliases":["cyclone"],"filename":"1f300"},{"aliases":["foggy"],"filename":"1f301"},{"aliases":["rainbow"],"filename":"1f308"},{"aliases":["ocean"],"filename":"1f30a"},{"aliases":["bamboo"],"filename":"1f38d"},{"aliases":["gift_heart"],"filename":"1f49d"},{"aliases":["dolls"],"filename":"1f38e"},{"aliases":["school_satchel"],"filename":"1f392"},{"aliases":["mortar_board"],"filename":"1f393"},{"aliases":["flags"],"filename":"1f38f"},{"aliases":["fireworks"],"filename":"1f386"},{"aliases":["sparkler"],"filename":"1f387"},{"aliases":["wind_chime"],"filename":"1f390"},{"aliases":["rice_scene"],"filename":"1f391"},{"aliases":["jack_o_lantern"],"filename":"1f383"},{"aliases":["ghost"],"filename":"1f47b"},{"aliases":["santa"],"filename":"1f385"},{"aliases":["christmas_tree"],"filename":"1f384"},{"aliases":["gift"],"filename":"1f381"},{"aliases":["tanabata_tree"],"filename":"1f38b"},{"aliases":["tada"],"filename":"1f389"},{"aliases":["confetti_ball"],"filename":"1f38a"},{"aliases":["balloon"],"filename":"1f388"},{"aliases":["crossed_flags"],"filename":"1f38c"},{"aliases":["crystal_ball"],"filename":"1f52e"},{"aliases":["movie_camera"],"filename":"1f3a5"},{"aliases":["camera"],"filename":"1f4f7"},{"aliases":["video_camera"],"filename":"1f4f9"},{"aliases":["vhs"],"filename":"1f4fc"},{"aliases":["cd"],"filename":"1f4bf"},{"aliases":["dvd"],"filename":"1f4c0"},{"aliases":["minidisc"],"filename":"1f4bd"},{"aliases":["floppy_disk"],"filename":"1f4be"},{"aliases":["computer"],"filename":"1f4bb"},{"aliases":["iphone"],"filename":"1f4f1"},{"aliases":["phone","telephone"],"filename":"260e"},{"aliases":["telephone_receiver"],"filename":"1f4de"},{"aliases":["pager"],"filename":"1f4df"},{"aliases":["fax"],"filename":"1f4e0"},{"aliases":["satellite"],"filename":"1f4e1"},{"aliases":["tv"],"filename":"1f4fa"},{"aliases":["radio"],"filename":"1f4fb"},{"aliases":["loud_sound"],"filename":"1f50a"},{"aliases":["sound"],"filename":"1f509"},{"aliases":["speaker"],"filename":"1f508"},{"aliases":["mute"],"filename":"1f507"},{"aliases":["bell"],"filename":"1f514"},{"aliases":["no_bell"],"filename":"1f515"},{"aliases":["loudspeaker"],"filename":"1f4e2"},{"aliases":["mega"],"filename":"1f4e3"},{"aliases":["hourglass_flowing_sand"],"filename":"23f3"},{"aliases":["hourglass"],"filename":"231b"},{"aliases":["alarm_clock"],"filename":"23f0"},{"aliases":["watch"],"filename":"231a"},{"aliases":["unlock"],"filename":"1f513"},{"aliases":["lock"],"filename":"1f512"},{"aliases":["lock_with_ink_pen"],"filename":"1f50f"},{"aliases":["closed_lock_with_key"],"filename":"1f510"},{"aliases":["key"],"filename":"1f511"},{"aliases":["mag_right"],"filename":"1f50e"},{"aliases":["bulb"],"filename":"1f4a1"},{"aliases":["flashlight"],"filename":"1f526"},{"aliases":["high_brightness"],"filename":"1f506"},{"aliases":["low_brightness"],"filename":"1f505"},{"aliases":["electric_plug"],"filename":"1f50c"},{"aliases":["battery"],"filename":"1f50b"},{"aliases":["mag"],"filename":"1f50d"},{"aliases":["bathtub"],"filename":"1f6c1"},{"aliases":["bath"],"filename":"1f6c0"},{"aliases":["shower"],"filename":"1f6bf"},{"aliases":["toilet"],"filename":"1f6bd"},{"aliases":["wrench"],"filename":"1f527"},{"aliases":["nut_and_bolt"],"filename":"1f529"},{"aliases":["hammer"],"filename":"1f528"},{"aliases":["door"],"filename":"1f6aa"},{"aliases":["smoking"],"filename":"1f6ac"},{"aliases":["bomb"],"filename":"1f4a3"},{"aliases":["gun"],"filename":"1f52b"},{"aliases":["hocho","knife"],"filename":"1f52a"},{"aliases":["pill"],"filename":"1f48a"},{"aliases":["syringe"],"filename":"1f489"},{"aliases":["moneybag"],"filename":"1f4b0"},{"aliases":["yen"],"filename":"1f4b4"},{"aliases":["dollar"],"filename":"1f4b5"},{"aliases":["pound"],"filename":"1f4b7"},{"aliases":["euro"],"filename":"1f4b6"},{"aliases":["credit_card"],"filename":"1f4b3"},{"aliases":["money_with_wings"],"filename":"1f4b8"},{"aliases":["calling"],"filename":"1f4f2"},{"aliases":["e-mail"],"filename":"1f4e7"},{"aliases":["inbox_tray"],"filename":"1f4e5"},{"aliases":["outbox_tray"],"filename":"1f4e4"},{"aliases":["email","envelope"],"filename":"2709"},{"aliases":["envelope_with_arrow"],"filename":"1f4e9"},{"aliases":["incoming_envelope"],"filename":"1f4e8"},{"aliases":["postal_horn"],"filename":"1f4ef"},{"aliases":["mailbox"],"filename":"1f4eb"},{"aliases":["mailbox_closed"],"filename":"1f4ea"},{"aliases":["mailbox_with_mail"],"filename":"1f4ec"},{"aliases":["mailbox_with_no_mail"],"filename":"1f4ed"},{"aliases":["postbox"],"filename":"1f4ee"},{"aliases":["package"],"filename":"1f4e6"},{"aliases":["memo","pencil"],"filename":"1f4dd"},{"aliases":["page_facing_up"],"filename":"1f4c4"},{"aliases":["page_with_curl"],"filename":"1f4c3"},{"aliases":["bookmark_tabs"],"filename":"1f4d1"},{"aliases":["bar_chart"],"filename":"1f4ca"},{"aliases":["chart_with_upwards_trend"],"filename":"1f4c8"},{"aliases":["chart_with_downwards_trend"],"filename":"1f4c9"},{"aliases":["scroll"],"filename":"1f4dc"},{"aliases":["clipboard"],"filename":"1f4cb"},{"aliases":["date"],"filename":"1f4c5"},{"aliases":["calendar"],"filename":"1f4c6"},{"aliases":["card_index"],"filename":"1f4c7"},{"aliases":["file_folder"],"filename":"1f4c1"},{"aliases":["open_file_folder"],"filename":"1f4c2"},{"aliases":["scissors"],"filename":"2702"},{"aliases":["pushpin"],"filename":"1f4cc"},{"aliases":["paperclip"],"filename":"1f4ce"},{"aliases":["black_nib"],"filename":"2712"},{"aliases":["pencil2"],"filename":"270f"},{"aliases":["straight_ruler"],"filename":"1f4cf"},{"aliases":["triangular_ruler"],"filename":"1f4d0"},{"aliases":["closed_book"],"filename":"1f4d5"},{"aliases":["green_book"],"filename":"1f4d7"},{"aliases":["blue_book"],"filename":"1f4d8"},{"aliases":["orange_book"],"filename":"1f4d9"},{"aliases":["notebook"],"filename":"1f4d3"},{"aliases":["notebook_with_decorative_cover"],"filename":"1f4d4"},{"aliases":["ledger"],"filename":"1f4d2"},{"aliases":["books"],"filename":"1f4da"},{"aliases":["book","open_book"],"filename":"1f4d6"},{"aliases":["bookmark"],"filename":"1f516"},{"aliases":["name_badge"],"filename":"1f4db"},{"aliases":["microscope"],"filename":"1f52c"},{"aliases":["telescope"],"filename":"1f52d"},{"aliases":["newspaper"],"filename":"1f4f0"},{"aliases":["art"],"filename":"1f3a8"},{"aliases":["clapper"],"filename":"1f3ac"},{"aliases":["microphone"],"filename":"1f3a4"},{"aliases":["headphones"],"filename":"1f3a7"},{"aliases":["musical_score"],"filename":"1f3bc"},{"aliases":["musical_note"],"filename":"1f3b5"},{"aliases":["notes"],"filename":"1f3b6"},{"aliases":["musical_keyboard"],"filename":"1f3b9"},{"aliases":["violin"],"filename":"1f3bb"},{"aliases":["trumpet"],"filename":"1f3ba"},{"aliases":["saxophone"],"filename":"1f3b7"},{"aliases":["guitar"],"filename":"1f3b8"},{"aliases":["space_invader"],"filename":"1f47e"},{"aliases":["video_game"],"filename":"1f3ae"},{"aliases":["black_joker"],"filename":"1f0cf"},{"aliases":["flower_playing_cards"],"filename":"1f3b4"},{"aliases":["mahjong"],"filename":"1f004"},{"aliases":["game_die"],"filename":"1f3b2"},{"aliases":["dart"],"filename":"1f3af"},{"aliases":["football"],"filename":"1f3c8"},{"aliases":["basketball"],"filename":"1f3c0"},{"aliases":["soccer"],"filename":"26bd"},{"aliases":["baseball"],"filename":"26be"},{"aliases":["tennis"],"filename":"1f3be"},{"aliases":["8ball"],"filename":"1f3b1"},{"aliases":["rugby_football"],"filename":"1f3c9"},{"aliases":["bowling"],"filename":"1f3b3"},{"aliases":["golf"],"filename":"26f3"},{"aliases":["mountain_bicyclist"],"filename":"1f6b5"},{"aliases":["bicyclist"],"filename":"1f6b4"},{"aliases":["checkered_flag"],"filename":"1f3c1"},{"aliases":["horse_racing"],"filename":"1f3c7"},{"aliases":["trophy"],"filename":"1f3c6"},{"aliases":["ski"],"filename":"1f3bf"},{"aliases":["snowboarder"],"filename":"1f3c2"},{"aliases":["swimmer"],"filename":"1f3ca"},{"aliases":["surfer"],"filename":"1f3c4"},{"aliases":["fishing_pole_and_fish"],"filename":"1f3a3"},{"aliases":["coffee"],"filename":"2615"},{"aliases":["tea"],"filename":"1f375"},{"aliases":["sake"],"filename":"1f376"},{"aliases":["baby_bottle"],"filename":"1f37c"},{"aliases":["beer"],"filename":"1f37a"},{"aliases":["beers"],"filename":"1f37b"},{"aliases":["cocktail"],"filename":"1f378"},{"aliases":["tropical_drink"],"filename":"1f379"},{"aliases":["wine_glass"],"filename":"1f377"},{"aliases":["fork_and_knife"],"filename":"1f374"},{"aliases":["pizza"],"filename":"1f355"},{"aliases":["hamburger"],"filename":"1f354"},{"aliases":["fries"],"filename":"1f35f"},{"aliases":["poultry_leg"],"filename":"1f357"},{"aliases":["meat_on_bone"],"filename":"1f356"},{"aliases":["spaghetti"],"filename":"1f35d"},{"aliases":["curry"],"filename":"1f35b"},{"aliases":["fried_shrimp"],"filename":"1f364"},{"aliases":["bento"],"filename":"1f371"},{"aliases":["sushi"],"filename":"1f363"},{"aliases":["fish_cake"],"filename":"1f365"},{"aliases":["rice_ball"],"filename":"1f359"},{"aliases":["rice_cracker"],"filename":"1f358"},{"aliases":["rice"],"filename":"1f35a"},{"aliases":["ramen"],"filename":"1f35c"},{"aliases":["stew"],"filename":"1f372"},{"aliases":["oden"],"filename":"1f362"},{"aliases":["dango"],"filename":"1f361"},{"aliases":["egg"],"filename":"1f373"},{"aliases":["bread"],"filename":"1f35e"},{"aliases":["doughnut"],"filename":"1f369"},{"aliases":["custard"],"filename":"1f36e"},{"aliases":["icecream"],"filename":"1f366"},{"aliases":["ice_cream"],"filename":"1f368"},{"aliases":["shaved_ice"],"filename":"1f367"},{"aliases":["birthday"],"filename":"1f382"},{"aliases":["cake"],"filename":"1f370"},{"aliases":["cookie"],"filename":"1f36a"},{"aliases":["chocolate_bar"],"filename":"1f36b"},{"aliases":["candy"],"filename":"1f36c"},{"aliases":["lollipop"],"filename":"1f36d"},{"aliases":["honey_pot"],"filename":"1f36f"},{"aliases":["apple"],"filename":"1f34e"},{"aliases":["green_apple"],"filename":"1f34f"},{"aliases":["tangerine","orange","mandarin"],"filename":"1f34a"},{"aliases":["lemon"],"filename":"1f34b"},{"aliases":["cherries"],"filename":"1f352"},{"aliases":["grapes"],"filename":"1f347"},{"aliases":["watermelon"],"filename":"1f349"},{"aliases":["strawberry"],"filename":"1f353"},{"aliases":["peach"],"filename":"1f351"},{"aliases":["melon"],"filename":"1f348"},{"aliases":["banana"],"filename":"1f34c"},{"aliases":["pear"],"filename":"1f350"},{"aliases":["pineapple"],"filename":"1f34d"},{"aliases":["sweet_potato"],"filename":"1f360"},{"aliases":["eggplant"],"filename":"1f346"},{"aliases":["tomato"],"filename":"1f345"},{"aliases":["corn"],"filename":"1f33d"},{"aliases":["house"],"filename":"1f3e0"},{"aliases":["house_with_garden"],"filename":"1f3e1"},{"aliases":["school"],"filename":"1f3eb"},{"aliases":["office"],"filename":"1f3e2"},{"aliases":["post_office"],"filename":"1f3e3"},{"aliases":["hospital"],"filename":"1f3e5"},{"aliases":["bank"],"filename":"1f3e6"},{"aliases":["convenience_store"],"filename":"1f3ea"},{"aliases":["love_hotel"],"filename":"1f3e9"},{"aliases":["hotel"],"filename":"1f3e8"},{"aliases":["wedding"],"filename":"1f492"},{"aliases":["church"],"filename":"26ea"},{"aliases":["department_store"],"filename":"1f3ec"},{"aliases":["european_post_office"],"filename":"1f3e4"},{"aliases":["city_sunrise"],"filename":"1f307"},{"aliases":["city_sunset"],"filename":"1f306"},{"aliases":["japanese_castle"],"filename":"1f3ef"},{"aliases":["european_castle"],"filename":"1f3f0"},{"aliases":["tent"],"filename":"26fa"},{"aliases":["factory"],"filename":"1f3ed"},{"aliases":["tokyo_tower"],"filename":"1f5fc"},{"aliases":["japan"],"filename":"1f5fe"},{"aliases":["mount_fuji"],"filename":"1f5fb"},{"aliases":["sunrise_over_mountains"],"filename":"1f304"},{"aliases":["sunrise"],"filename":"1f305"},{"aliases":["night_with_stars"],"filename":"1f303"},{"aliases":["statue_of_liberty"],"filename":"1f5fd"},{"aliases":["bridge_at_night"],"filename":"1f309"},{"aliases":["carousel_horse"],"filename":"1f3a0"},{"aliases":["ferris_wheel"],"filename":"1f3a1"},{"aliases":["fountain"],"filename":"26f2"},{"aliases":["roller_coaster"],"filename":"1f3a2"},{"aliases":["ship"],"filename":"1f6a2"},{"aliases":["boat","sailboat"],"filename":"26f5"},{"aliases":["speedboat"],"filename":"1f6a4"},{"aliases":["rowboat"],"filename":"1f6a3"},{"aliases":["anchor"],"filename":"2693"},{"aliases":["rocket"],"filename":"1f680"},{"aliases":["airplane"],"filename":"2708"},{"aliases":["seat"],"filename":"1f4ba"},{"aliases":["helicopter"],"filename":"1f681"},{"aliases":["steam_locomotive"],"filename":"1f682"},{"aliases":["tram"],"filename":"1f68a"},{"aliases":["station"],"filename":"1f689"},{"aliases":["mountain_railway"],"filename":"1f69e"},{"aliases":["train2"],"filename":"1f686"},{"aliases":["bullettrain_side"],"filename":"1f684"},{"aliases":["bullettrain_front"],"filename":"1f685"},{"aliases":["light_rail"],"filename":"1f688"},{"aliases":["metro"],"filename":"1f687"},{"aliases":["monorail"],"filename":"1f69d"},{"aliases":["train"],"filename":"1f68b"},{"aliases":["railway_car"],"filename":"1f683"},{"aliases":["trolleybus"],"filename":"1f68e"},{"aliases":["bus"],"filename":"1f68c"},{"aliases":["oncoming_bus"],"filename":"1f68d"},{"aliases":["blue_car"],"filename":"1f699"},{"aliases":["oncoming_automobile"],"filename":"1f698"},{"aliases":["car","red_car"],"filename":"1f697"},{"aliases":["taxi"],"filename":"1f695"},{"aliases":["oncoming_taxi"],"filename":"1f696"},{"aliases":["articulated_lorry"],"filename":"1f69b"},{"aliases":["truck"],"filename":"1f69a"},{"aliases":["rotating_light"],"filename":"1f6a8"},{"aliases":["police_car"],"filename":"1f693"},{"aliases":["oncoming_police_car"],"filename":"1f694"},{"aliases":["fire_engine"],"filename":"1f692"},{"aliases":["ambulance"],"filename":"1f691"},{"aliases":["minibus"],"filename":"1f690"},{"aliases":["bike"],"filename":"1f6b2"},{"aliases":["aerial_tramway"],"filename":"1f6a1"},{"aliases":["suspension_railway"],"filename":"1f69f"},{"aliases":["mountain_cableway"],"filename":"1f6a0"},{"aliases":["tractor"],"filename":"1f69c"},{"aliases":["barber"],"filename":"1f488"},{"aliases":["busstop"],"filename":"1f68f"},{"aliases":["ticket"],"filename":"1f3ab"},{"aliases":["vertical_traffic_light"],"filename":"1f6a6"},{"aliases":["traffic_light"],"filename":"1f6a5"},{"aliases":["warning"],"filename":"26a0"},{"aliases":["construction"],"filename":"1f6a7"},{"aliases":["beginner"],"filename":"1f530"},{"aliases":["fuelpump"],"filename":"26fd"},{"aliases":["izakaya_lantern","lantern"],"filename":"1f3ee"},{"aliases":["slot_machine"],"filename":"1f3b0"},{"aliases":["hotsprings"],"filename":"2668"},{"aliases":["moyai"],"filename":"1f5ff"},{"aliases":["circus_tent"],"filename":"1f3aa"},{"aliases":["performing_arts"],"filename":"1f3ad"},{"aliases":["round_pushpin"],"filename":"1f4cd"},{"aliases":["triangular_flag_on_post"],"filename":"1f6a9"},{"aliases":["jp"],"filename":"1f1ef-1f1f5"},{"aliases":["kr"],"filename":"1f1f0-1f1f7"},{"aliases":["de"],"filename":"1f1e9-1f1ea"},{"aliases":["cn"],"filename":"1f1e8-1f1f3"},{"aliases":["us"],"filename":"1f1fa-1f1f8"},{"aliases":["fr"],"filename":"1f1eb-1f1f7"},{"aliases":["es"],"filename":"1f1ea-1f1f8"},{"aliases":["it"],"filename":"1f1ee-1f1f9"},{"aliases":["ru"],"filename":"1f1f7-1f1fa"},{"aliases":["gb","uk"],"filename":"1f1ec-1f1e7"},{"aliases":["one"],"filename":"0031-20e3"},{"aliases":["two"],"filename":"0032-20e3"},{"aliases":["three"],"filename":"0033-20e3"},{"aliases":["four"],"filename":"0034-20e3"},{"aliases":["five"],"filename":"0035-20e3"},{"aliases":["six"],"filename":"0036-20e3"},{"aliases":["seven"],"filename":"0037-20e3"},{"aliases":["eight"],"filename":"0038-20e3"},{"aliases":["nine"],"filename":"0039-20e3"},{"aliases":["zero"],"filename":"0030-20e3"},{"aliases":["keycap_ten"],"filename":"1f51f"},{"aliases":["1234"],"filename":"1f522"},{"aliases":["hash"],"filename":"0023-20e3"},{"aliases":["symbols"],"filename":"1f523"},{"aliases":["arrow_up"],"filename":"2b06"},{"aliases":["arrow_down"],"filename":"2b07"},{"aliases":["arrow_left"],"filename":"2b05"},{"aliases":["arrow_right"],"filename":"27a1"},{"aliases":["capital_abcd"],"filename":"1f520"},{"aliases":["abcd"],"filename":"1f521"},{"aliases":["abc"],"filename":"1f524"},{"aliases":["arrow_upper_right"],"filename":"2197"},{"aliases":["arrow_upper_left"],"filename":"2196"},{"aliases":["arrow_lower_right"],"filename":"2198"},{"aliases":["arrow_lower_left"],"filename":"2199"},{"aliases":["left_right_arrow"],"filename":"2194"},{"aliases":["arrow_up_down"],"filename":"2195"},{"aliases":["arrows_counterclockwise"],"filename":"1f504"},{"aliases":["arrow_backward"],"filename":"25c0"},{"aliases":["arrow_forward"],"filename":"25b6"},{"aliases":["arrow_up_small"],"filename":"1f53c"},{"aliases":["arrow_down_small"],"filename":"1f53d"},{"aliases":["leftwards_arrow_with_hook"],"filename":"21a9"},{"aliases":["arrow_right_hook"],"filename":"21aa"},{"aliases":["information_source"],"filename":"2139"},{"aliases":["rewind"],"filename":"23ea"},{"aliases":["fast_forward"],"filename":"23e9"},{"aliases":["arrow_double_up"],"filename":"23eb"},{"aliases":["arrow_double_down"],"filename":"23ec"},{"aliases":["arrow_heading_down"],"filename":"2935"},{"aliases":["arrow_heading_up"],"filename":"2934"},{"aliases":["ok"],"filename":"1f197"},{"aliases":["twisted_rightwards_arrows"],"filename":"1f500"},{"aliases":["repeat"],"filename":"1f501"},{"aliases":["repeat_one"],"filename":"1f502"},{"aliases":["new"],"filename":"1f195"},{"aliases":["up"],"filename":"1f199"},{"aliases":["cool"],"filename":"1f192"},{"aliases":["free"],"filename":"1f193"},{"aliases":["ng"],"filename":"1f196"},{"aliases":["signal_strength"],"filename":"1f4f6"},{"aliases":["cinema"],"filename":"1f3a6"},{"aliases":["koko"],"filename":"1f201"},{"aliases":["u6307"],"filename":"1f22f"},{"aliases":["u7a7a"],"filename":"1f233"},{"aliases":["u6e80"],"filename":"1f235"},{"aliases":["u5408"],"filename":"1f234"},{"aliases":["u7981"],"filename":"1f232"},{"aliases":["ideograph_advantage"],"filename":"1f250"},{"aliases":["u5272"],"filename":"1f239"},{"aliases":["u55b6"],"filename":"1f23a"},{"aliases":["u6709"],"filename":"1f236"},{"aliases":["u7121"],"filename":"1f21a"},{"aliases":["restroom"],"filename":"1f6bb"},{"aliases":["mens"],"filename":"1f6b9"},{"aliases":["womens"],"filename":"1f6ba"},{"aliases":["baby_symbol"],"filename":"1f6bc"},{"aliases":["wc"],"filename":"1f6be"},{"aliases":["potable_water"],"filename":"1f6b0"},{"aliases":["put_litter_in_its_place"],"filename":"1f6ae"},{"aliases":["parking"],"filename":"1f17f"},{"aliases":["wheelchair"],"filename":"267f"},{"aliases":["no_smoking"],"filename":"1f6ad"},{"aliases":["u6708"],"filename":"1f237"},{"aliases":["u7533"],"filename":"1f238"},{"aliases":["sa"],"filename":"1f202"},{"aliases":["m"],"filename":"24c2"},{"aliases":["passport_control"],"filename":"1f6c2"},{"aliases":["baggage_claim"],"filename":"1f6c4"},{"aliases":["left_luggage"],"filename":"1f6c5"},{"aliases":["customs"],"filename":"1f6c3"},{"aliases":["accept"],"filename":"1f251"},{"aliases":["secret"],"filename":"3299"},{"aliases":["congratulations"],"filename":"3297"},{"aliases":["cl"],"filename":"1f191"},{"aliases":["sos"],"filename":"1f198"},{"aliases":["id"],"filename":"1f194"},{"aliases":["no_entry_sign"],"filename":"1f6ab"},{"aliases":["underage"],"filename":"1f51e"},{"aliases":["no_mobile_phones"],"filename":"1f4f5"},{"aliases":["do_not_litter"],"filename":"1f6af"},{"aliases":["non-potable_water"],"filename":"1f6b1"},{"aliases":["no_bicycles"],"filename":"1f6b3"},{"aliases":["no_pedestrians"],"filename":"1f6b7"},{"aliases":["children_crossing"],"filename":"1f6b8"},{"aliases":["no_entry"],"filename":"26d4"},{"aliases":["eight_spoked_asterisk"],"filename":"2733"},{"aliases":["sparkle"],"filename":"2747"},{"aliases":["negative_squared_cross_mark"],"filename":"274e"},{"aliases":["white_check_mark"],"filename":"2705"},{"aliases":["eight_pointed_black_star"],"filename":"2734"},{"aliases":["heart_decoration"],"filename":"1f49f"},{"aliases":["vs"],"filename":"1f19a"},{"aliases":["vibration_mode"],"filename":"1f4f3"},{"aliases":["mobile_phone_off"],"filename":"1f4f4"},{"aliases":["a"],"filename":"1f170"},{"aliases":["b"],"filename":"1f171"},{"aliases":["ab"],"filename":"1f18e"},{"aliases":["o2"],"filename":"1f17e"},{"aliases":["diamond_shape_with_a_dot_inside"],"filename":"1f4a0"},{"aliases":["loop"],"filename":"27bf"},{"aliases":["recycle"],"filename":"267b"},{"aliases":["aries"],"filename":"2648"},{"aliases":["taurus"],"filename":"2649"},{"aliases":["gemini"],"filename":"264a"},{"aliases":["cancer"],"filename":"264b"},{"aliases":["leo"],"filename":"264c"},{"aliases":["virgo"],"filename":"264d"},{"aliases":["libra"],"filename":"264e"},{"aliases":["scorpius"],"filename":"264f"},{"aliases":["sagittarius"],"filename":"2650"},{"aliases":["capricorn"],"filename":"2651"},{"aliases":["aquarius"],"filename":"2652"},{"aliases":["pisces"],"filename":"2653"},{"aliases":["ophiuchus"],"filename":"26ce"},{"aliases":["six_pointed_star"],"filename":"1f52f"},{"aliases":["atm"],"filename":"1f3e7"},{"aliases":["chart"],"filename":"1f4b9"},{"aliases":["heavy_dollar_sign"],"filename":"1f4b2"},{"aliases":["currency_exchange"],"filename":"1f4b1"},{"aliases":["copyright"],"filename":"00a9"},{"aliases":["registered"],"filename":"00ae"},{"aliases":["tm"],"filename":"2122"},{"aliases":["x"],"filename":"274c"},{"aliases":["bangbang"],"filename":"203c"},{"aliases":["interrobang"],"filename":"2049"},{"aliases":["exclamation","heavy_exclamation_mark"],"filename":"2757"},{"aliases":["question"],"filename":"2753"},{"aliases":["grey_exclamation"],"filename":"2755"},{"aliases":["grey_question"],"filename":"2754"},{"aliases":["o"],"filename":"2b55"},{"aliases":["top"],"filename":"1f51d"},{"aliases":["end"],"filename":"1f51a"},{"aliases":["back"],"filename":"1f519"},{"aliases":["on"],"filename":"1f51b"},{"aliases":["soon"],"filename":"1f51c"},{"aliases":["arrows_clockwise"],"filename":"1f503"},{"aliases":["clock12"],"filename":"1f55b"},{"aliases":["clock1230"],"filename":"1f567"},{"aliases":["clock1"],"filename":"1f550"},{"aliases":["clock130"],"filename":"1f55c"},{"aliases":["clock2"],"filename":"1f551"},{"aliases":["clock230"],"filename":"1f55d"},{"aliases":["clock3"],"filename":"1f552"},{"aliases":["clock330"],"filename":"1f55e"},{"aliases":["clock4"],"filename":"1f553"},{"aliases":["clock430"],"filename":"1f55f"},{"aliases":["clock5"],"filename":"1f554"},{"aliases":["clock530"],"filename":"1f560"},{"aliases":["clock6"],"filename":"1f555"},{"aliases":["clock7"],"filename":"1f556"},{"aliases":["clock8"],"filename":"1f557"},{"aliases":["clock9"],"filename":"1f558"},{"aliases":["clock10"],"filename":"1f559"},{"aliases":["clock11"],"filename":"1f55a"},{"aliases":["clock630"],"filename":"1f561"},{"aliases":["clock730"],"filename":"1f562"},{"aliases":["clock830"],"filename":"1f563"},{"aliases":["clock930"],"filename":"1f564"},{"aliases":["clock1030"],"filename":"1f565"},{"aliases":["clock1130"],"filename":"1f566"},{"aliases":["heavy_multiplication_x"],"filename":"2716"},{"aliases":["heavy_plus_sign"],"filename":"2795"},{"aliases":["heavy_minus_sign"],"filename":"2796"},{"aliases":["heavy_division_sign"],"filename":"2797"},{"aliases":["spades"],"filename":"2660"},{"aliases":["hearts"],"filename":"2665"},{"aliases":["clubs"],"filename":"2663"},{"aliases":["diamonds"],"filename":"2666"},{"aliases":["white_flower"],"filename":"1f4ae"},{"aliases":["100"],"filename":"1f4af"},{"aliases":["heavy_check_mark"],"filename":"2714"},{"aliases":["ballot_box_with_check"],"filename":"2611"},{"aliases":["radio_button"],"filename":"1f518"},{"aliases":["link"],"filename":"1f517"},{"aliases":["curly_loop"],"filename":"27b0"},{"aliases":["wavy_dash"],"filename":"3030"},{"aliases":["part_alternation_mark"],"filename":"303d"},{"aliases":["trident"],"filename":"1f531"},{"aliases":["black_medium_square"],"filename":"25fc"},{"aliases":["white_medium_square"],"filename":"25fb"},{"aliases":["black_medium_small_square"],"filename":"25fe"},{"aliases":["white_medium_small_square"],"filename":"25fd"},{"aliases":["black_small_square"],"filename":"25aa"},{"aliases":["white_small_square"],"filename":"25ab"},{"aliases":["small_red_triangle"],"filename":"1f53a"},{"aliases":["black_square_button"],"filename":"1f532"},{"aliases":["white_square_button"],"filename":"1f533"},{"aliases":["black_circle"],"filename":"26ab"},{"aliases":["white_circle"],"filename":"26aa"},{"aliases":["red_circle"],"filename":"1f534"},{"aliases":["large_blue_circle"],"filename":"1f535"},{"aliases":["small_red_triangle_down"],"filename":"1f53b"},{"aliases":["white_large_square"],"filename":"2b1c"},{"aliases":["black_large_square"],"filename":"2b1b"},{"aliases":["large_orange_diamond"],"filename":"1f536"},{"aliases":["large_blue_diamond"],"filename":"1f537"},{"aliases":["small_orange_diamond"],"filename":"1f538"},{"aliases":["small_blue_diamond"],"filename":"1f539"},{"aliases":["ca"],"filename":"1f1e8-1f1e6"},{"aliases":["pk"],"filename":"1f1f5-1f1f0"},{"aliases":["za"],"filename":"1f1ff-1f1e6"},{"aliases":["slightly_smiling_face"],"filename":"1f642"},{"aliases":["slightly_frowning_face"],"filename":"1f641"},{"aliases":["upside_down_face"],"filename":"1f643"},{"aliases":["mattermost"],"filename":"mattermost"},{"aliases":["bowtie"],"filename":"bowtie"},{"aliases":["feelsgood"],"filename":"feelsgood"},{"aliases":["finnadie"],"filename":"finnadie"},{"aliases":["fu"],"filename":"fu"},{"aliases":["goberserk"],"filename":"goberserk"},{"aliases":["godmode"],"filename":"godmode"},{"aliases":["hurtrealbad"],"filename":"hurtrealbad"},{"aliases":["metal"],"filename":"metal"},{"aliases":["neckbeard"],"filename":"neckbeard"},{"aliases":["octocat"],"filename":"octocat"},{"aliases":["rage1"],"filename":"rage1"},{"aliases":["rage2"],"filename":"rage2"},{"aliases":["rage3"],"filename":"rage3"},{"aliases":["rage4"],"filename":"rage4"},{"aliases":["shipit","squirrel"],"filename":"shipit"},{"aliases":["suspect"],"filename":"suspect"},{"aliases":["taco"],"filename":"taco"},{"aliases":["trollface"],"filename":"trollface"}]; export const EmojiIndicesByAlias = new Map([["+1",105],["-1",106],["100",816],["1234",647],["8ball",462],["a",741],["ab",743],["abc",656],["abcd",655],["accept",717],["aerial_tramway",605],["airplane",573],["alarm_clock",353],["alien",88],["ambulance",602],["anchor",571],["angel",71],["anger",95],["angry",33],["anguished",46],["ant",219],["apple",518],["aquarius",758],["aries",748],["arrow_backward",664],["arrow_double_down",674],["arrow_double_up",673],["arrow_down",651],["arrow_down_small",667],["arrow_forward",665],["arrow_heading_down",675],["arrow_heading_up",676],["arrow_left",652],["arrow_lower_left",660],["arrow_lower_right",659],["arrow_right",653],["arrow_right_hook",669],["arrow_up",650],["arrow_up_down",662],["arrow_up_small",666],["arrow_upper_left",658],["arrow_upper_right",657],["arrows_clockwise",782],["arrows_counterclockwise",663],["art",438],["articulated_lorry",596],["astonished",43],["athletic_shoe",147],["atm",762],["b",742],["baby",63],["baby_bottle",479],["baby_chick",211],["baby_symbol",702],["back",779],["baggage_claim",714],["balloon",323],["ballot_box_with_check",818],["bamboo",305],["banana",528],["bangbang",770],["bank",541],["bar_chart",407],["barber",609],["baseball",460],["basketball",458],["bath",369],["bathtub",368],["battery",366],["bear",198],["bee",218],["beer",480],["beers",481],["beetle",220],["beginner",616],["bell",347],["bento",494],["bicyclist",467],["bike",604],["bikini",159],["bird",210],["birthday",511],["black_circle",834],["black_joker",452],["black_large_square",840],["black_medium_small_square",827],["black_medium_square",825],["black_nib",420],["black_small_square",829],["black_square_button",832],["blossom",271],["blowfish",244],["blue_book",426],["blue_car",591],["blue_heart",169],["blush",3],["boar",202],["boat",568],["bomb",377],["book",432],["bookmark",433],["bookmark_tabs",406],["books",431],["boom",94],["boot",151],["bouquet",252],["bow",143],["bowling",464],["bowtie",852],["boy",64],["bread",505],["bride_with_veil",140],["bridge_at_night",562],["briefcase",160],["broken_heart",173],["bug",217],["bulb",361],["bullettrain_front",582],["bullettrain_side",581],["bus",589],["busstop",610],["bust_in_silhouette",184],["busts_in_silhouette",185],["ca",845],["cactus",265],["cake",512],["calendar",413],["calling",389],["camel",246],["camera",327],["cancer",751],["candy",515],["capital_abcd",654],["capricorn",757],["car",593],["card_index",414],["carousel_horse",563],["cat",191],["cat2",249],["cd",330],["chart",763],["chart_with_downwards_trend",409],["chart_with_upwards_trend",408],["checkered_flag",468],["cherries",522],["cherry_blossom",253],["chestnut",269],["chicken",214],["children_crossing",730],["chocolate_bar",514],["christmas_tree",318],["church",546],["cinema",687],["circus_tent",622],["city_sunrise",549],["city_sunset",550],["cl",720],["clap",121],["clapper",439],["clipboard",411],["clock1",785],["clock10",799],["clock1030",805],["clock11",800],["clock1130",806],["clock12",783],["clock1230",784],["clock130",786],["clock2",787],["clock230",788],["clock3",789],["clock330",790],["clock4",791],["clock430",792],["clock5",793],["clock530",794],["clock6",795],["clock630",801],["clock7",796],["clock730",802],["clock8",797],["clock830",803],["clock9",798],["clock930",804],["closed_book",424],["closed_lock_with_key",358],["closed_umbrella",166],["cloud",296],["clubs",813],["cn",629],["cocktail",482],["coffee",476],["cold_sweat",26],["collision",94],["computer",334],["confetti_ball",322],["confounded",36],["confused",52],["congratulations",719],["construction",615],["construction_worker",61],["convenience_store",542],["cookie",513],["cool",683],["cop",60],["copyright",766],["corn",534],["couple",126],["couple_with_heart",131],["couplekiss",130],["cow",201],["cow2",229],["credit_card",387],["crescent_moon",286],["crocodile",245],["crossed_flags",324],["crown",145],["cry",21],["crying_cat_face",79],["crystal_ball",325],["cupid",179],["curly_loop",821],["currency_exchange",765],["curry",492],["custard",507],["customs",716],["cyclone",301],["dancer",125],["dancers",132],["dango",503],["dart",456],["dash",99],["date",412],["de",628],["deciduous_tree",268],["department_store",547],["diamond_shape_with_a_dot_inside",745],["diamonds",814],["disappointed",19],["disappointed_relieved",25],["dizzy",93],["dizzy_face",42],["do_not_litter",726],["dog",189],["dog2",239],["dollar",384],["dolls",307],["dolphin",226],["door",375],["doughnut",506],["dragon",235],["dragon_face",243],["dress",155],["dromedary_camel",247],["droplet",97],["dvd",331],["e-mail",390],["ear",100],["ear_of_rice",263],["earth_africa",287],["earth_americas",288],["earth_asia",289],["egg",504],["eggplant",532],["eight",643],["eight_pointed_black_star",736],["eight_spoked_asterisk",732],["electric_plug",365],["elephant",207],["email",393],["end",778],["envelope",393],["envelope_with_arrow",394],["es",632],["euro",386],["european_castle",552],["european_post_office",548],["evergreen_tree",267],["exclamation",772],["expressionless",57],["eyeglasses",164],["eyes",101],["facepunch",108],["factory",554],["fallen_leaf",261],["family",127],["fast_forward",672],["fax",339],["fearful",31],["feelsgood",853],["feet",251],["ferris_wheel",564],["file_folder",415],["finnadie",854],["fire",90],["fire_engine",601],["fireworks",311],["first_quarter_moon",278],["first_quarter_moon_with_face",285],["fish",225],["fish_cake",496],["fishing_pole_and_fish",475],["fist",109],["five",640],["flags",310],["flashlight",362],["flipper",226],["floppy_disk",333],["flower_playing_cards",453],["flushed",14],["foggy",302],["football",457],["footprints",187],["fork_and_knife",485],["fountain",565],["four",639],["four_leaf_clover",255],["fr",631],["free",684],["fried_shrimp",493],["fries",488],["frog",195],["frowning",45],["fu",855],["fuelpump",617],["full_moon",280],["full_moon_with_face",274],["game_die",455],["gb",635],["gem",183],["gemini",750],["ghost",316],["gift",319],["gift_heart",306],["girl",65],["globe_with_meridians",272],["goat",237],["goberserk",856],["godmode",857],["golf",465],["grapes",523],["green_apple",519],["green_book",425],["green_heart",171],["grey_exclamation",774],["grey_question",775],["grimacing",50],["grin",15],["grinning",2],["guardsman",62],["guitar",449],["gun",378],["haircut",138],["hamburger",487],["hammer",374],["hamster",193],["hand",112],["handbag",161],["hankey",89],["hash",648],["hatched_chick",212],["hatching_chick",213],["headphones",441],["hear_no_evil",85],["heart",172],["heart_decoration",737],["heart_eyes",6],["heart_eyes_cat",75],["heartbeat",175],["heartpulse",174],["hearts",812],["heavy_check_mark",817],["heavy_division_sign",810],["heavy_dollar_sign",764],["heavy_exclamation_mark",772],["heavy_minus_sign",809],["heavy_multiplication_x",807],["heavy_plus_sign",808],["helicopter",575],["herb",262],["hibiscus",258],["high_brightness",363],["high_heel",150],["hocho",379],["honey_pot",517],["honeybee",218],["horse",205],["horse_racing",469],["hospital",540],["hotel",544],["hotsprings",620],["hourglass",352],["hourglass_flowing_sand",351],["house",535],["house_with_garden",536],["hurtrealbad",858],["hushed",53],["ice_cream",509],["icecream",508],["id",722],["ideograph_advantage",694],["imp",48],["inbox_tray",391],["incoming_envelope",395],["information_desk_person",135],["information_source",670],["innocent",55],["interrobang",771],["iphone",335],["it",633],["izakaya_lantern",618],["jack_o_lantern",315],["japan",556],["japanese_castle",551],["japanese_goblin",83],["japanese_ogre",82],["jeans",157],["joy",22],["joy_cat",80],["jp",626],["key",359],["keycap_ten",646],["kimono",158],["kiss",181],["kissing",9],["kissing_cat",76],["kissing_closed_eyes",8],["kissing_heart",7],["kissing_smiling_eyes",10],["knife",379],["koala",197],["koko",688],["kr",627],["lantern",618],["large_blue_circle",837],["large_blue_diamond",842],["large_orange_diamond",841],["last_quarter_moon",282],["last_quarter_moon_with_face",284],["laughing",37],["leaves",260],["ledger",430],["left_luggage",715],["left_right_arrow",661],["leftwards_arrow_with_hook",668],["lemon",521],["leo",752],["leopard",248],["libra",754],["light_rail",583],["link",820],["lips",104],["lipstick",167],["lock",356],["lock_with_ink_pen",357],["lollipop",516],["loop",746],["loud_sound",343],["loudspeaker",349],["love_hotel",543],["love_letter",180],["low_brightness",364],["m",712],["mag",367],["mag_right",360],["mahjong",454],["mailbox",397],["mailbox_closed",398],["mailbox_with_mail",399],["mailbox_with_no_mail",400],["man",66],["man_with_gua_pi_mao",58],["man_with_turban",59],["mandarin",520],["mans_shoe",148],["maple_leaf",259],["mask",39],["massage",137],["mattermost",851],["meat_on_bone",490],["mega",350],["melon",527],["memo",403],["mens",700],["metal",859],["metro",584],["microphone",440],["microscope",435],["milky_way",291],["minibus",603],["minidisc",332],["mobile_phone_off",740],["money_with_wings",388],["moneybag",382],["monkey",204],["monkey_face",203],["monorail",585],["moon",279],["mortar_board",309],["mount_fuji",557],["mountain_bicyclist",466],["mountain_cableway",607],["mountain_railway",579],["mouse",192],["mouse2",241],["movie_camera",326],["moyai",621],["muscle",122],["mushroom",264],["musical_keyboard",445],["musical_note",443],["musical_score",442],["mute",346],["nail_care",139],["name_badge",434],["neckbeard",860],["necktie",153],["negative_squared_cross_mark",734],["neutral_face",51],["new",681],["new_moon",276],["new_moon_with_face",275],["newspaper",437],["ng",685],["ng_woman",134],["night_with_stars",560],["nine",644],["no_bell",348],["no_bicycles",728],["no_entry",731],["no_entry_sign",723],["no_good",134],["no_mobile_phones",725],["no_mouth",54],["no_pedestrians",729],["no_smoking",708],["non-potable_water",727],["nose",102],["notebook",428],["notebook_with_decorative_cover",429],["notes",444],["nut_and_bolt",373],["o",776],["o2",744],["ocean",304],["octocat",861],["octopus",222],["oden",502],["office",538],["ok",677],["ok_hand",107],["ok_woman",133],["older_man",68],["older_woman",69],["on",780],["oncoming_automobile",592],["oncoming_bus",590],["oncoming_police_car",600],["oncoming_taxi",595],["one",636],["open_book",432],["open_file_folder",416],["open_hands",113],["open_mouth",49],["ophiuchus",760],["orange",520],["orange_book",427],["outbox_tray",392],["ox",242],["package",402],["page_facing_up",404],["page_with_curl",405],["pager",338],["palm_tree",266],["panda_face",208],["paperclip",419],["parking",706],["part_alternation_mark",823],["partly_sunny",295],["passport_control",713],["paw_prints",251],["peach",526],["pear",529],["pencil",403],["pencil2",421],["penguin",209],["pensive",16],["performing_arts",623],["persevere",20],["person_frowning",142],["person_with_blond_hair",70],["person_with_pouting_face",141],["phone",336],["pig",199],["pig2",240],["pig_nose",200],["pill",380],["pineapple",530],["pisces",759],["pizza",486],["pk",846],["point_down",115],["point_left",117],["point_right",116],["point_up",120],["point_up_2",114],["police_car",599],["poodle",250],["poop",89],["post_office",539],["postal_horn",396],["postbox",401],["potable_water",704],["pouch",162],["poultry_leg",489],["pound",385],["pout",34],["pouting_cat",81],["pray",119],["princess",72],["punch",108],["purple_heart",170],["purse",163],["pushpin",418],["put_litter_in_its_place",705],["question",773],["rabbit",194],["rabbit2",234],["racehorse",236],["radio",342],["radio_button",819],["rage",34],["rage1",862],["rage2",863],["rage3",864],["rage4",865],["railway_car",587],["rainbow",303],["raised_hand",112],["raised_hands",118],["raising_hand",136],["ram",230],["ramen",500],["rat",231],["recycle",747],["red_car",593],["red_circle",836],["registered",767],["relaxed",4],["relieved",17],["repeat",679],["repeat_one",680],["restroom",699],["revolving_hearts",178],["rewind",671],["ribbon",165],["rice",499],["rice_ball",497],["rice_cracker",498],["rice_scene",314],["ring",182],["rocket",572],["roller_coaster",566],["rooster",238],["rose",256],["rotating_light",598],["round_pushpin",624],["rowboat",570],["ru",634],["rugby_football",463],["runner",124],["running",124],["running_shirt_with_sash",156],["sa",711],["sagittarius",756],["sailboat",568],["sake",478],["sandal",149],["santa",317],["satellite",340],["satisfied",37],["saxophone",448],["school",537],["school_satchel",308],["scissors",417],["scorpius",755],["scream",32],["scream_cat",78],["scroll",410],["seat",574],["secret",718],["see_no_evil",84],["seedling",270],["seven",642],["shaved_ice",510],["sheep",206],["shell",223],["ship",567],["shipit",866],["shirt",152],["shit",89],["shoe",148],["shower",370],["signal_strength",686],["six",641],["six_pointed_star",761],["ski",471],["skull",87],["sleeping",41],["sleepy",24],["slightly_frowning_face",849],["slightly_smiling_face",848],["slot_machine",619],["small_blue_diamond",844],["small_orange_diamond",843],["small_red_triangle",831],["small_red_triangle_down",838],["smile",0],["smile_cat",74],["smiley",1],["smiley_cat",73],["smiling_imp",47],["smirk",56],["smirk_cat",77],["smoking",376],["snail",221],["snake",215],["snowboarder",472],["snowflake",299],["snowman",300],["sob",23],["soccer",459],["soon",781],["sos",721],["sound",344],["space_invader",450],["spades",811],["spaghetti",491],["sparkle",733],["sparkler",312],["sparkles",91],["sparkling_heart",177],["speak_no_evil",86],["speaker",345],["speech_balloon",186],["speedboat",569],["squirrel",866],["star",293],["star2",92],["stars",292],["station",578],["statue_of_liberty",561],["steam_locomotive",576],["stew",501],["straight_ruler",422],["strawberry",525],["stuck_out_tongue",13],["stuck_out_tongue_closed_eyes",12],["stuck_out_tongue_winking_eye",11],["sun_with_face",273],["sunflower",257],["sunglasses",40],["sunny",294],["sunrise",559],["sunrise_over_mountains",558],["surfer",474],["sushi",495],["suspect",867],["suspension_railway",606],["sweat",28],["sweat_drops",96],["sweat_smile",27],["sweet_potato",531],["swimmer",473],["symbols",649],["syringe",381],["taco",868],["tada",321],["tanabata_tree",320],["tangerine",520],["taurus",749],["taxi",594],["tea",477],["telephone",336],["telephone_receiver",337],["telescope",436],["tennis",461],["tent",553],["thought_balloon",188],["three",638],["thumbsdown",106],["thumbsup",105],["ticket",611],["tiger",196],["tiger2",233],["tired_face",30],["tm",768],["toilet",371],["tokyo_tower",555],["tomato",533],["tongue",103],["top",777],["tophat",144],["tractor",608],["traffic_light",613],["train",586],["train2",580],["tram",577],["triangular_flag_on_post",625],["triangular_ruler",423],["trident",824],["triumph",35],["trolleybus",588],["trollface",869],["trophy",470],["tropical_drink",483],["tropical_fish",224],["truck",597],["trumpet",447],["tshirt",152],["tulip",254],["turtle",216],["tv",341],["twisted_rightwards_arrows",678],["two",637],["two_hearts",176],["two_men_holding_hands",128],["two_women_holding_hands",129],["u5272",695],["u5408",692],["u55b6",696],["u6307",689],["u6708",709],["u6709",697],["u6e80",691],["u7121",698],["u7533",710],["u7981",693],["u7a7a",690],["uk",635],["umbrella",298],["unamused",18],["underage",724],["unlock",355],["up",682],["upside_down_face",850],["us",630],["v",110],["vertical_traffic_light",612],["vhs",329],["vibration_mode",739],["video_camera",328],["video_game",451],["violin",446],["virgo",753],["volcano",290],["vs",738],["walking",123],["waning_crescent_moon",283],["waning_gibbous_moon",281],["warning",614],["watch",354],["water_buffalo",232],["watermelon",524],["wave",111],["wavy_dash",822],["waxing_crescent_moon",277],["waxing_gibbous_moon",279],["wc",703],["weary",29],["wedding",545],["whale",227],["whale2",228],["wheelchair",707],["white_check_mark",735],["white_circle",835],["white_flower",815],["white_large_square",839],["white_medium_small_square",828],["white_medium_square",826],["white_small_square",830],["white_square_button",833],["wind_chime",313],["wine_glass",484],["wink",5],["wolf",190],["woman",67],["womans_clothes",154],["womans_hat",146],["womens",701],["worried",44],["wrench",372],["x",769],["yellow_heart",168],["yen",383],["yum",38],["za",847],["zap",297],["zero",645],["zzz",98]]); diff --git a/webapp/utils/utils.jsx b/webapp/utils/utils.jsx index 820f1a1c7..a64b06a3b 100644 --- a/webapp/utils/utils.jsx +++ b/webapp/utils/utils.jsx @@ -575,6 +575,8 @@ export function applyTheme(theme) { changeCss('body.app__body', 'scrollbar-face-color:' + theme.centerChannelBg); changeCss('body.app__body', 'scrollbar-track-color:' + theme.centerChannelBg); changeCss('.app__body .post-list__new-messages-below', 'color:' + theme.centerChannelBg); + changeCss('.app__body .emoji-picker, .app__body .emoji-picker__search', 'background:' + theme.centerChannelBg); + changeCss('.app__body .emoji-picker-bottom, .app__body .emoji-picker__search', 'background:' + theme.centerChannelBg); } if (theme.centerChannelColor) { @@ -651,6 +653,22 @@ export function applyTheme(theme) { changeCss('.app__body .navbar .status .offline--icon', 'fill:' + theme.centerChannelColor); changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.25)); changeCss('.app__body .post-reaction:not(.post-reaction--current-user)', 'color:' + changeOpacity(theme.centerChannelColor, 0.7)); + changeCss('.app__body .emoji-picker', 'color:' + theme.centerChannelColor); + changeCss('.app__body .emoji-picker-bottom', 'color:' + theme.centerChannelColor); + changeCss('.app__body .emoji-picker, .app__body .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); + changeCss('.app__body .emoji-picker-bottom, .app__body .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); + changeCss('.app__body .emoji-picker, .app__body .emoji-picker__items .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); + changeCss('.app__body .emoji-picker-bottom, .app__body .emoji-picker__items .emoji-picker__search-container .emoji-picker__search', 'border-color:' + changeOpacity(theme.centerChannelColor, 0.2)); + changeCss('.app__body .emoji-picker__items', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.05)); + changeCss('.app__body .emoji-picker__categories', 'border-bottom-color:' + changeOpacity(theme.centerChannelColor, 0.2)); + changeCss('.emoji-picker__category .fa:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8)); + + changeCss('.app__body .emoji-picker__preview', 'border-top-color:' + changeOpacity(theme.centerChannelColor, 0.2)); + changeCss('.app__body .emoji-picker__category, .app__body .emoji-picker__category:focus, .app__body .emoji-picker__category:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.3)); + changeCss('.app__body .emoji-picker__category--selected, .app__body .emoji-picker__category--selected:focus, .app__body .emoji-picker__category--selected:hover', 'color:' + theme.centerChannelColor); + changeCss('.app__body .emoji-picker__item:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8)); + changeCss('.app__body .emojisprite:hover', 'background-color:' + changeOpacity(theme.centerChannelColor, 0.8)); + changeCss('.app__body .icon__postcontent_picker:hover', 'color:' + changeOpacity(theme.centerChannelColor, 0.8)); } if (theme.newMessageSeparator) { |