diff --git a/.bowerrc b/.bowerrc deleted file mode 100644 index 3c5e8c33..00000000 --- a/.bowerrc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "directory" : "vendor" -} diff --git a/.travis.yml b/.travis.yml index 13337fbc..bd5967a1 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,10 +5,8 @@ before_install: - export CHROME_BIN=chromium-browser - export DISPLAY=:99.0 - sh -e /etc/init.d/xvfb start - - travis_retry npm install -g bower - travis_retry npm install -g gulp install: - travis_retry npm install - - travis_retry bower install before_script: - gulp deploy diff --git a/CHANGELOG.md b/CHANGELOG.md index c3b5456c..0779bfbe 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,8 @@ ## 3.1.0 No name yet (no date yet) - Velocity forecasting. Create sprints according to team velocity. +- Remove bower +- Add new wysiwyg editor (emojis, local storage changes, mentions) ## 3.0.0 Stellaria Borealis (2016-10-02) diff --git a/README.md b/README.md index 281aad7d..ba21307d 100644 --- a/README.md +++ b/README.md @@ -39,6 +39,7 @@ Every code patch accepted in taiga codebase is licensed under [AGPL v3.0](http:/ Please read carefully [our license](https://github.com/taigaio/taiga-front/blob/master/LICENSE) and ask us if you have any questions. +Emoji provided free by [Twemoji](https://github.com/twitter/twemoji) #### Bug reports, enhancements and support #### @@ -125,14 +126,12 @@ sass -v # should return Sass 3.3.8 (Maptastic Maple) Complete process for all OS at: http://sass-lang.com/install -**Node + Bower + Gulp** +**Node + Gulp** We recommend using [nvm](https://github.com/creationix/nvm) to manage different node versions ``` npm install -g gulp -npm install -g bower npm install -bower install gulp ``` @@ -178,4 +177,4 @@ To run a local Selenium Server, you will need to have the Java Development Kit ( ``` protractor conf.e2e.js --suite=auth # To tests authentication protractor conf.e2e.js --suite=full # To test all the platform authenticated - ``` + ``` \ No newline at end of file diff --git a/app/coffee/modules/base/model.coffee b/app/coffee/modules/base/model.coffee index 36f157be..d9951174 100644 --- a/app/coffee/modules/base/model.coffee +++ b/app/coffee/modules/base/model.coffee @@ -39,7 +39,7 @@ class Model instance._modifiedAttrs = _.cloneDeep(@._modifiedAttrs) instance._isModified = _.cloneDeep(@._isModified) - return instance + return instance clone: -> instance = new Model(@._name, @._attrs, @._dataTypes) diff --git a/app/coffee/modules/common.coffee b/app/coffee/modules/common.coffee index 5ab2fa50..64434411 100644 --- a/app/coffee/modules/common.coffee +++ b/app/coffee/modules/common.coffee @@ -390,14 +390,22 @@ Svg = () -> module.directive("tgSvg", [Svg]) -Autofocus = ($timeout) -> +Autofocus = ($timeout, $parse, animationFrame) -> return { restrict: 'A', - link : ($scope, $element) -> - $timeout -> $element[0].focus() + link : ($scope, $element, attrs) -> + if attrs.ngShow + model = $parse(attrs.ngShow) + + $scope.$watch model, (value) -> + if value == true + $timeout () -> $element[0].focus() + + else + $timeout () -> $element[0].focus() } -module.directive('tgAutofocus', ['$timeout', Autofocus]) +module.directive('tgAutofocus', ['$timeout', '$parse', "animationFrame", Autofocus]) module.directive 'tgPreloadImage', () -> spinner = "loading..." diff --git a/app/coffee/modules/common/components.coffee b/app/coffee/modules/common/components.coffee index 4a020dbc..dfce9ca7 100644 --- a/app/coffee/modules/common/components.coffee +++ b/app/coffee/modules/common/components.coffee @@ -496,40 +496,37 @@ DeleteButtonDirective = ($log, $repo, $confirm, $location, $template) -> module.directive("tgDeleteButton", ["$log", "$tgRepo", "$tgConfirm", "$tgLocation", "$tgTemplate", DeleteButtonDirective]) ############################################################################# -## Editable description directive +## Editable subject directive ############################################################################# -EditableDescriptionDirective = ($rootscope, $repo, $confirm, $compile, $loading, $selectedText, $modelTransform, $template, $translate) -> - template = $template.get("common/components/editable-description.html") - noDescriptionMegEditMode = $template.get("common/components/editable-description-msg-edit-mode.html") - noDescriptionMegReadMode = $template.get("common/components/editable-description-msg-read-mode.html") +EditableSubjectDirective = ($rootscope, $repo, $confirm, $loading, $modelTransform, $template) -> + template = $template.get("common/components/editable-subject.html") link = ($scope, $el, $attrs, $model) -> - $el.find('.edit-description').hide() - $el.find('.view-description .edit').hide() $scope.$on "object:updated", () -> - $el.find('.edit-description').hide() - $el.find('.view-description').show() + $el.find('.edit-subject').hide() + $el.find('.view-subject').show() isEditable = -> return $scope.project.my_permissions.indexOf($attrs.requiredPerm) != -1 - save = (description) -> + save = (subject) -> currentLoading = $loading() .target($el.find('.save-container')) .start() transform = $modelTransform.save (item) -> - item.description = description + + item.subject = subject return item - transform.then -> + transform.then => $confirm.notify("success") $rootscope.$broadcast("object:updated") - $el.find('.edit-description').hide() - $el.find('.view-description').show() + $el.find('.edit-subject').hide() + $el.find('.view-subject').show() transform.then null, -> $confirm.notify("error") @@ -537,60 +534,43 @@ EditableDescriptionDirective = ($rootscope, $repo, $confirm, $compile, $loading, transform.finally -> currentLoading.finish() - cancelEdition = () -> - $scope.item.revert() - $el.find('.edit-description').hide() - $el.find('.view-description').show() + return transform - $el.on "mouseup", ".view-description", (event) -> - # We want to dettect the a inside the div so we use the target and - # not the currentTarget - target = angular.element(event.target) + $el.click -> return if not isEditable() - return if target.is('a') - return if $selectedText.get().length - - $el.find('.edit-description').show() - $el.find('.view-description').hide() - $el.find('textarea').focus() - - $el.on "click", "a", (event) -> - target = angular.element(event.target) - href = target.attr('href') - if href.indexOf("#") == 0 - event.preventDefault() - $('body').scrollTop($(href).offset().top) + $el.find('.edit-subject').show() + $el.find('.view-subject').hide() + $el.find('input').focus() $el.on "click", ".save", (e) -> e.preventDefault() - description = $scope.item.description - save(description) + subject = $scope.item.subject + save(subject) - $el.on "keydown", "textarea", (event) -> - return if event.keyCode != 27 + $el.on "keyup", "input", (event) -> + if event.keyCode == 13 + subject = $scope.item.subject + save(subject) + else if event.keyCode == 27 + $scope.$apply () => $model.$modelValue.revert() - $scope.$applyAsync () -> - title = $translate.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE") - message = $translate.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE") - $confirm.ask(title, null, message).then (askResponse) -> - cancelEdition() - askResponse.finish() + $el.find('.edit-subject').hide() + $el.find('.view-subject').show() + + $el.find('.edit-subject').hide() $scope.$watch $attrs.ngModel, (value) -> return if not value - $scope.item = value - if isEditable() - $el.find('.view-description .edit').show() - $el.find('.view-description .us-content').addClass('editable') - $scope.noDescriptionMsg = $compile(noDescriptionMegEditMode)($scope) - else - $scope.noDescriptionMsg = $compile(noDescriptionMegReadMode)($scope) + + if not isEditable() + $el.find('.view-subject .edit').remove() $scope.$on "$destroy", -> $el.off() + return { link: link restrict: "EA" @@ -598,81 +578,8 @@ EditableDescriptionDirective = ($rootscope, $repo, $confirm, $compile, $loading, template: template } -module.directive("tgEditableDescription", [ - "$rootScope", - "$tgRepo", - "$tgConfirm", - "$compile", - "$tgLoading", - "$selectedText", - "$tgQueueModelTransformation", - "$tgTemplate", - "$translate", - EditableDescriptionDirective]) - - - -EditableWysiwyg = (attachmentsService, attachmentsFullService) -> - link = ($scope, $el, $attrs, $model) -> - - isInEditMode = -> - return $el.find('textarea').is(':visible') and $model.$modelValue.id - - - uploadFile = (file, type) -> - return if !attachmentsService.validate(file) - - return attachmentsFullService.addAttachment($model.$modelValue.project, $model.$modelValue.id, type, file).then (result) -> - if taiga.isImage(result.getIn(['file', 'name'])) - return '![' + result.getIn(['file', 'name']) + '](' + result.getIn(['file', 'url']) + ')' - else - return '[' + result.getIn(['file', 'name']) + '](' + result.getIn(['file', 'url']) + ')' - - $el.on 'dragover', (e) -> - textarea = $el.find('textarea').focus() - - return false - - $el.on 'drop', (e) -> - e.stopPropagation() - e.preventDefault() - - if isInEditMode() - dataTransfer = e.dataTransfer || (e.originalEvent && e.originalEvent.dataTransfer) - - textarea = $el.find('textarea') - - textarea.addClass('in-progress') - - type = $model.$modelValue['_name'] - - if type == "userstories" - type = "us" - else if type == "tasks" - type = "task" - else if type == "issues" - type = "issue" - else if type == "wiki" - type = "wiki_page" - - promises = _.map dataTransfer.files, (file) -> - return uploadFile(file, type) - - Promise.all(promises).then (result) -> - textarea = $el.find('textarea') - - $.markItUp({ replaceWith: result.join(' ') }) - - textarea.removeClass('in-progress') - - return { - link: link - restrict: "EA" - require: "ngModel" - } - -module.directive("tgEditableWysiwyg", ["tgAttachmentsService", "tgAttachmentsFullService", EditableWysiwyg]) - +module.directive("tgEditableSubject", ["$rootScope", "$tgRepo", "$tgConfirm", "$tgLoading", "$tgQueueModelTransformation", + "$tgTemplate", EditableSubjectDirective]) ############################################################################# ## Common list directives diff --git a/app/coffee/modules/common/filters.coffee b/app/coffee/modules/common/filters.coffee index 339e2fa6..6bdffcec 100644 --- a/app/coffee/modules/common/filters.coffee +++ b/app/coffee/modules/common/filters.coffee @@ -75,7 +75,6 @@ sizeFormat = => module.filter("sizeFormat", sizeFormat) - toMutableFilter = -> toMutable = (js) -> return js.toJS() @@ -128,6 +127,15 @@ darkerFilter = -> module.filter("darker", darkerFilter) +markdownToHTML = (wysiwigService) -> + return (input) -> + if input + return wysiwigService.getHTML(input) + + return "" + +module.filter("markdownToHTML", ["tgWysiwygService", markdownToHTML]) + inArray = ($filter) -> return (list, arrayFilter, element) -> if arrayFilter diff --git a/app/coffee/modules/common/loader.coffee b/app/coffee/modules/common/loader.coffee index 80253c91..32eaf16f 100644 --- a/app/coffee/modules/common/loader.coffee +++ b/app/coffee/modules/common/loader.coffee @@ -92,15 +92,16 @@ Loader = ($rootscope) -> return { pageLoaded: pageLoaded + open: () -> open start: (auto=false) -> if !open start() autoClose() if auto onStart: (fn) -> - $rootscope.$on("loader:start", fn) + return $rootscope.$on("loader:start", fn) onEnd: (fn) -> - $rootscope.$on("loader:end", fn) + return $rootscope.$on("loader:end", fn) logRequest: () -> requestCount++ diff --git a/app/coffee/modules/common/wisiwyg.coffee b/app/coffee/modules/common/wisiwyg.coffee deleted file mode 100644 index a889042b..00000000 --- a/app/coffee/modules/common/wisiwyg.coffee +++ /dev/null @@ -1,489 +0,0 @@ -### -# Copyright (C) 2014-2016 Andrey Antukh -# Copyright (C) 2014-2016 Jesús Espino Garcia -# Copyright (C) 2014-2016 David Barragán Merino -# Copyright (C) 2014-2016 Alejandro Alonso -# Copyright (C) 2014-2016 Juan Francisco Alcántara -# Copyright (C) 2014-2016 Xavi Julian -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -# File: modules/common/wisiwyg.coffee -### - -taiga = @.taiga -bindOnce = @.taiga.bindOnce - -module = angular.module("taigaCommon") - -# How to test lists (-, *, 1.) -# test it with text after & before the list -# + is the cursor position - -# CASE 1 -# - aa+ -# --> enter -# - aa -# - + - -# CASE 1 -# - + -# --> enter - -# + - -# CASE 3 -# - bb+cc -# --> enter -# - bb -# - cc - -# CASE 3 -# +- aa -# --> enter - -# - aa - -############################################################################# -## WYSIWYG markitup editor directive -############################################################################# -MarkitupDirective = ($rootscope, $rs, $selectedText, $template, $compile, $translate, projectService) -> - previewTemplate = $template.get("common/wysiwyg/wysiwyg-markitup-preview.html", true) - - link = ($scope, $el, $attrs, $model) -> - if not $scope.project - # for backward compatibility - $scope.project = projectService.project.toJS() - - element = angular.element($el) - previewDomNode = $("
", {class: "preview"}) - - closePreviewMode = -> - element.parents(".markdown").find(".preview").remove() - element.parents(".markItUp").show() - - $scope.$on "markdown-editor:submit", -> - closePreviewMode() - - cancelablePromise = null - previewInProgress = false - - preview = -> - return if previewInProgress - - previewInProgress = true - - markdownDomNode = element.parents(".markdown") - markItUpDomNode = element.parents(".markItUp") - - $rs.mdrender.render($scope.project.id, $model.$modelValue).then (data) -> - html = previewTemplate({data: data.data}) - html = $compile(html)($scope) - - markdownDomNode.append(html) - markItUpDomNode.hide() - - previewInProgress = false - - markdown = element.closest(".markdown") - - markdown.on "mouseup.preview", ".preview", (event) -> - event.preventDefault() - target = angular.element(event.target) - - if !target.is('a') and $selectedText.get().length - return - - markdown.off(".preview") - closePreviewMode() - - setCaretPosition = (textarea, caretPosition) -> - if textarea.createTextRange - range = textarea.createTextRange() - range.move("character", caretPosition) - range.select() - - else if textarea.selectionStart - textarea.focus() - textarea.setSelectionRange(caretPosition, caretPosition) - - # Calculate the scroll position - totalLines = textarea.value.split("\n").length - line = textarea.value[0..(caretPosition - 1)].split("\n").length - scrollRelation = line / totalLines - $el.scrollTop((scrollRelation * $el[0].scrollHeight) - ($el.height() / 2)) - - addLine = (textarea, nline, replace) -> - lines = textarea.value.split("\n") - - if replace - lines[nline] = replace + lines[nline] - else - lines[nline] = "" - - cursorPosition = 0 - - for line, key in lines - cursorPosition += line.length + 1 || 1 - - break if key == nline - - textarea.value = lines.join("\n") - - #return the new position - if replace - return cursorPosition - lines[nline].length + replace.length - 1 - else - return cursorPosition - - prepareUrlFormatting = (markItUp) -> - regex = /(<<<|>>>)/gi - result = 0 - indices = [] - (indices.push(result.index)) while ( (result = regex.exec(markItUp.textarea.value)) ) - markItUp.donotparse = indices - - urlFormatting = (markItUp) -> - regex = /<<>>/gi - endIndex = 0 - loop - result = regex.exec(markItUp.textarea.value) - break if !result - if result.index not in markItUp.donotparse - endIndex = result.index - break - - value = markItUp.textarea.value - url = value.substring(startIndex, endIndex).replace('<<<', '').replace('>>>', '') - url = url.replace('(', '%28').replace(')', '%29') - url = url.replace('[', '%5B').replace(']', '%5D') - value = value.substring(0, startIndex) + url + value.substring(endIndex+3, value.length) - markItUp.textarea.value = value - markItUp.donotparse = undefined - - markdownTitle = (markItUp, char) -> - heading = "" - n = $.trim(markItUp.selection or markItUp.placeHolder).length - - for i in [0..n-1] - heading += char - - return "\n"+heading+"\n" - - renderMarkItUp = () -> - markdownSettings = - nameSpace: "markdown" - onShiftEnter: {keepDefault:false, openWith:"\n\n"} - onEnter: - keepDefault: false, - replaceWith: () -> - # Allow textcomplete to intercept the enter key if the options list is displayed - # @todo There doesn't seem to be a more graceful way to do this with the textcomplete API. - if not $('.textcomplete-dropdown').is(':visible') - "\n" - afterInsert: (data) -> - lines = data.textarea.value.split("\n") - # Detect if we are in this situation +- aa at the beginning if the textarea - if data.caretPosition > 0 - cursorLine = data.textarea.value[0..(data.caretPosition - 1)].split("\n").length - else - cursorLine = 1 - - newLineContent = data.textarea.value[data.caretPosition..].split("\n")[0] - lastLine = lines[cursorLine - 1] - - # unordered list - - match = lastLine.match /^(\s*- ).*/ - - if match - emptyListItem = lastLine.match /^(\s*)\-\s$/ - - if emptyListItem - nline = cursorLine - 1 - replace = null - else - nline = cursorLine - replace = "#{match[1]}" - - markdownCaretPositon = addLine(data.textarea, nline, replace) - - # unordered list * - match = lastLine.match /^(\s*\* ).*/ - - if match - emptyListItem = lastLine.match /^(\s*\* )$/ - - if emptyListItem - nline = cursorLine - 1 - replace = null - else - nline = cursorLine - replace = "#{match[1]}" - - markdownCaretPositon = addLine(data.textarea, nline, replace) - - # ordered list - match = lastLine.match /^(\s*)(\d+)\.\s/ - - if match - emptyListItem = lastLine.match /^(\s*)(\d+)\.\s$/ - - if emptyListItem - nline = cursorLine - 1 - replace = null - else - nline = cursorLine - replace = "#{match[1] + (parseInt(match[2], 10) + 1)}. " - - markdownCaretPositon = addLine(data.textarea, nline, replace) - - setCaretPosition(data.textarea, markdownCaretPositon) if markdownCaretPositon - - markupSet: [ - { - name: $translate.instant("COMMON.WYSIWYG.H1_BUTTON") - key: "1" - placeHolder: $translate.instant("COMMON.WYSIWYG.H1_SAMPLE_TEXT") - closeWith: (markItUp) -> markdownTitle(markItUp, "=") - }, - { - name: $translate.instant("COMMON.WYSIWYG.H2_BUTTON") - key: "2" - placeHolder: $translate.instant("COMMON.WYSIWYG.H2_SAMPLE_TEXT") - closeWith: (markItUp) -> markdownTitle(markItUp, "-") - }, - { - name: $translate.instant("COMMON.WYSIWYG.H3_BUTTON") - key: "3" - openWith: "### " - placeHolder: $translate.instant("COMMON.WYSIWYG.H3_SAMPLE_TEXT") - }, - { - separator: "---------------" - }, - { - name: $translate.instant("COMMON.WYSIWYG.BOLD_BUTTON") - key: "B" - openWith: "**" - closeWith: "**" - placeHolder: $translate.instant("COMMON.WYSIWYG.BOLD_BUTTON_SAMPLE_TEXT") - }, - { - name: $translate.instant("COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT") - key: "I" - openWith: "_" - closeWith: "_" - placeHolder: $translate.instant("COMMON.WYSIWYG.ITALIC_SAMPLE_TEXT") - }, - { - name: $translate.instant("COMMON.WYSIWYG.STRIKE_BUTTON") - key: "S" - openWith: "~~" - closeWith: "~~" - placeHolder: $translate.instant("COMMON.WYSIWYG.STRIKE_SAMPLE_TEXT") - }, - { - separator: "---------------" - }, - { - name: $translate.instant("COMMON.WYSIWYG.BULLETED_LIST_BUTTON") - openWith: "- " - placeHolder: $translate.instant("COMMON.WYSIWYG.BULLETED_LIST_SAMPLE_TEXT") - }, - { - name: $translate.instant("COMMON.WYSIWYG.NUMERIC_LIST_BUTTON") - openWith: (markItUp) -> markItUp.line+". " - placeHolder: $translate.instant("COMMON.WYSIWYG.NUMERIC_LIST_SAMPLE_TEXT") - }, - { - separator: "---------------" - }, - { - name: $translate.instant("COMMON.WYSIWYG.PICTURE_BUTTON") - key: "P" - openWith: "![" - closeWith: '](<<<[![Url:!:http://]!]>>> "[![Title]!]")' - placeHolder: $translate.instant("COMMON.WYSIWYG.PICTURE_SAMPLE_TEXT") - beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp) - afterInsert:(markItUp) -> urlFormatting(markItUp) - }, - { - name: $translate.instant("COMMON.WYSIWYG.LINK_BUTTON") - key: "L" - openWith: "[" - closeWith: '](<<<[![Url:!:http://]!]>>> "[![Title]!]")' - placeHolder: $translate.instant("COMMON.WYSIWYG.LINK_SAMPLE_TEXT") - beforeInsert:(markItUp) -> prepareUrlFormatting(markItUp) - afterInsert:(markItUp) -> urlFormatting(markItUp) - }, - { - separator: "---------------" - }, - { - name: $translate.instant("COMMON.WYSIWYG.QUOTE_BLOCK_BUTTON") - openWith: "> " - placeHolder: $translate.instant("COMMON.WYSIWYG.QUOTE_BLOCK_SAMPLE_TEXT") - }, - { - name: $translate.instant("COMMON.WYSIWYG.CODE_BLOCK_BUTTON") - openWith: "```\n" - placeHolder: $translate.instant("COMMON.WYSIWYG.CODE_BLOCK_SAMPLE_TEXT") - closeWith: "\n```" - }, - { - separator: "---------------" - }, - { - name: $translate.instant("COMMON.WYSIWYG.PREVIEW_BUTTON") - call: preview - className: "preview-icon" - }, - ] - afterInsert: (event) -> - target = angular.element(event.textarea) - $model.$setViewValue(target.val()) - - element - .markItUpRemove() - .markItUp(markdownSettings) - .textcomplete([ - # us, task, and issue autocomplete: #id or # - { - cache: true - match: /(^|\s)#([a-z0-9]+)$/i, - search: (term, callback) -> - term = taiga.slugify(term) - - searchTypes = ['issues', 'tasks', 'userstories', 'epics'] - searchProps = ['ref', 'subject'] - - filter = (item) => - for prop in searchProps - if taiga.slugify(item[prop]).indexOf(term) >= 0 - return true - return false - - cancelablePromise.abort() if cancelablePromise - cancelablePromise = $rs.search.do($scope.project.id, term) - - cancelablePromise.then (res) => - # ignore wikipages if they're the only results. can't exclude them in search - if res.count < 1 or res.count == res.wikipages.length - callback([]) - - else - for type in searchTypes - if res[type] and res[type].length > 0 - callback(res[type].filter(filter), true) - - # must signal end of lists - callback([]) - - replace: (res) -> - return "$1\##{res.ref} " - - template: (res, term) -> - return "\##{res.ref} - #{res.subject}" - } - - # username autocomplete: @username or @ - { - cache: true - match: /(^|\s)@([a-z0-9\-\._]{2,})$/i - search: (term, callback) -> - username = taiga.slugify(term) - searchProps = ['username', 'full_name', 'full_name_display'] - - if $scope.project.members.length < 1 - callback([]) - - else - callback $scope.project.members.filter (user) => - for prop in searchProps - if taiga.slugify(user[prop]).indexOf(username) >= 0 - return true - return false - - replace: (user) -> - return "$1@#{user.username} " - - template: (user) -> - return "#{user.username} - #{user.full_name_display}" - } - - # wiki pages autocomplete: [[slug or [[ - # if the search function was called with the 3rd param the regex - # like the docs claim, we could combine this with the #123 search - { - cache: true - match: /(^|\s)\[\[([a-z0-9\-]+)$/i - search: (term, callback) -> - term = taiga.slugify(term) - - $rs.search.do($scope.project.id, term).then (res) => - if res.count < 1 - callback([]) - - if res.count < 1 or not res.wikipages or res.wikipages.length <= 0 - callback([]) - - else - callback res.wikipages.filter((page) => - return taiga.slugify(page['slug']).indexOf(term) >= 0 - ), true - - # must signal end of lists - callback([]) - - - replace: (res) -> - return "$1[[#{res.slug}]]" - - template: (res, term) -> - return res.slug - } - ], - { - debounce: 200 - } - ) - - renderMarkItUp() - - unbind = $rootscope.$on "$translateChangeEnd", renderMarkItUp - - element.on "keypress", (event) -> - $scope.$apply() - - $scope.$on "$destroy", -> - $el.off() - unbind() - - return {link:link, require:"ngModel"} - -module.directive("tgMarkitup", ["$rootScope", "$tgResources", "$selectedText", "$tgTemplate", "$compile", - "$translate", "tgProjectService", MarkitupDirective]) diff --git a/app/coffee/modules/userstories/detail.coffee b/app/coffee/modules/userstories/detail.coffee index b75a10e0..6643c9de 100644 --- a/app/coffee/modules/userstories/detail.coffee +++ b/app/coffee/modules/userstories/detail.coffee @@ -53,11 +53,13 @@ class UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin) "$tgQueueModelTransformation", "tgErrorHandlingService", "$tgConfig", - "tgProjectService" + "tgProjectService", + "tgWysiwygService" ] constructor: (@scope, @rootscope, @repo, @confirm, @rs, @params, @q, @location, - @log, @appMetaService, @navUrls, @analytics, @translate, @modelTransform, @errorHandlingService, @configService, @projectService) -> + @log, @appMetaService, @navUrls, @analytics, @translate, @modelTransform, + @errorHandlingService, @configService, @projectService, @wysiwigService) -> bindMethods(@) @scope.usRef = @params.usref @@ -89,7 +91,7 @@ class UserStoryDetailController extends mixOf(taiga.Controller, taiga.PageMixin) description = @translate.instant("US.PAGE_DESCRIPTION", { userStoryStatus: @scope.statusById[@scope.us.status]?.name or "--" userStoryPoints: @scope.us.total_points - userStoryDescription: angular.element(@scope.us.description_html or "").text() + userStoryDescription: angular.element(@wysiwigService.getHTML(@scope.us.description) or "").text() userStoryClosedTasks: closedTasks userStoryTotalTasks: totalTasks userStoryProgressPercentage: progressPercentage diff --git a/app/coffee/modules/wiki/main.coffee b/app/coffee/modules/wiki/main.coffee index daee9ada..5eee43b2 100644 --- a/app/coffee/modules/wiki/main.coffee +++ b/app/coffee/modules/wiki/main.coffee @@ -218,126 +218,82 @@ WikiSummaryDirective = ($log, $template, $compile, $translate, avatarService) -> module.directive("tgWikiSummary", ["$log", "$tgTemplate", "$compile", "$translate", "tgAvatarService", WikiSummaryDirective]) +WikiWysiwyg = ($modelTransform, $rootscope, $confirm, attachmentsFullService, +$qqueue, $repo, $analytics, wikiHistoryService) -> + link = ($scope, $el, $attrs) -> + $scope.editableDescription = false -############################################################################# -## Editable Wiki Content Directive -############################################################################# - -EditableWikiContentDirective = ($window, $document, $repo, $confirm, $loading, $analytics, $qqueue, $translate, - $wikiHistoryService) -> - link = ($scope, $el, $attrs, $model) -> - isEditable = -> - return $scope.project.my_permissions.indexOf("modify_wiki_page") != -1 - - switchToEditMode = -> - $el.find('.edit-wiki-content').show() - $el.find('.view-wiki-content').hide() - $el.find('textarea').focus() - - switchToReadMode = -> - $el.find('.edit-wiki-content').hide() - $el.find('.view-wiki-content').show() - - disableEdition = -> - $el.find(".view-wiki-content .edit").remove() - $el.find(".edit-wiki-content").remove() - - cancelEdition = -> - return if not $model.$modelValue.id - - $model.$modelValue.revert() - switchToReadMode() - - getSelectedText = -> - if $window.getSelection - return $window.getSelection().toString() - else if $document.selection - return $document.selection.createRange().text - return null - - save = $qqueue.bindAdd (wiki) -> + $scope.saveDescription = $qqueue.bindAdd (description, cb) -> onSuccess = (wikiPage) -> - if not wiki.id? + if not $scope.item.id? $analytics.trackEvent("wikipage", "create", "create wiki page", 1) - $model.$setViewValue wikiPage.clone() - - $wikiHistoryService.loadHistoryEntries() + wikiHistoryService.loadHistoryEntries() $confirm.notify("success") - switchToReadMode() onError = -> $confirm.notify("error") - currentLoading = $loading() - .target($el.find('.save')) - .start() + $scope.item.content = description - if wiki.id? - promise = $repo.save(wiki).then(onSuccess, onError) + if $scope.item.id? + promise = $repo.save($scope.item).then(onSuccess, onError) else - promise = $repo.create("wiki", wiki).then(onSuccess, onError) + promise = $repo.create("wiki", $scope.item).then(onSuccess, onError) - promise.finally -> - currentLoading.finish() + promise.finally(cb) - $el.on "click", "a", (event) -> - target = angular.element(event.currentTarget) - href = target.attr('href') + uploadFile = (file, cb) -> + return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, 'wiki_page', file).then (result) -> + cb(result.getIn(['file', 'name']), result.getIn(['file', 'url'])) - if href.indexOf("#") == 0 - event.preventDefault() - $('body').scrollTop($(href).offset().top) + $scope.uploadFiles = (files, cb) -> + for file in files + uploadFile(file, cb) - $el.on "mousedown", ".view-wiki-content", (event) -> - target = angular.element(event.target) - return if not isEditable() - return if event.button == 2 + $scope.$watch $attrs.model, (value) -> + return if not value + $scope.item = value + $scope.version = value.version + $scope.storageKey = $scope.project.id + "-" + value.id + "-" + $attrs.type - $el.on "mouseup", ".view-wiki-content", (event) -> - target = angular.element(event.target) - return if getSelectedText() - return if not isEditable() - return if target.is('a') - return if target.is('pre') + $scope.$watch 'project', (project) -> + return if !project - switchToEditMode() - - $el.on "click", ".save", debounce 2000, -> - save($scope.wiki) - - $el.on "click", ".cancel", -> - $scope.$apply(cancelEdition) - - $el.on "keydown", "textarea", (event) -> - return if event.keyCode != 27 - $scope.$applyAsync () -> - title = $translate.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE") - message = $translate.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE") - $confirm.ask(title, null, message).then (askResponse) -> - cancelEdition() - askResponse.finish() - - $scope.$watch $attrs.ngModel, (wikiPage) -> - return if not wikiPage - - if isEditable() - $el.addClass('editable') - if not wikiPage.id? or $.trim(wikiPage.content).length == 0 - switchToEditMode() - else - disableEdition() - - $scope.$on "$destroy", -> - $el.off() + $scope.editableDescription = project.my_permissions.indexOf("modify_wiki_page") != -1 return { - link: link - restrict: "EA" - require: "ngModel" - templateUrl: "wiki/editable-wiki-content.html" + scope: true, + link: link, + template: """ +
+ + + +
+ +
+ {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}} +
+
+ """ } -module.directive("tgEditableWikiContent", ["$window", "$document", "$tgRepo", "$tgConfirm", "$tgLoading", - "$tgAnalytics", "$tgQqueue", "$translate", "tgWikiHistoryService", - EditableWikiContentDirective]) +module.directive("tgWikiWysiwyg", [ + "$tgQueueModelTransformation", + "$rootScope", + "$tgConfirm", + "tgAttachmentsFullService", + "$tgQqueue", "$tgRepo", "$tgAnalytics", "tgWikiHistoryService" + WikiWysiwyg]) diff --git a/app/coffee/utils.coffee b/app/coffee/utils.coffee index a2d02c99..638dc218 100644 --- a/app/coffee/utils.coffee +++ b/app/coffee/utils.coffee @@ -251,6 +251,16 @@ getRandomDefaultColor = () -> getDefaulColorList = () -> return _.clone(DEFAULT_COLOR_LIST) +getMatches = (string, regex, index) -> + index || (index = 1) + matches = [] + match = null + + while match = regex.exec(string) + matches.push(match[index]) + + return matches + taiga = @.taiga taiga.addClass = addClass taiga.nl2br = nl2br @@ -280,3 +290,4 @@ taiga.isPdf = isPdf taiga.patch = patch taiga.getRandomDefaultColor = getRandomDefaultColor taiga.getDefaulColorList = getDefaulColorList +taiga.getMatches = getMatches diff --git a/app/js/medium-mention.js b/app/js/medium-mention.js new file mode 100644 index 00000000..240f6722 --- /dev/null +++ b/app/js/medium-mention.js @@ -0,0 +1,270 @@ +var MentionExtension = MediumEditor.Extension.extend({ + name: 'mediumMention', + init: function() { + this.subscribe('editableKeyup', this.handleKeyup.bind(this)); + this.subscribe('editableKeydown', this.handleKeydown.bind(this)); + this.subscribe('blur', this.cancel.bind(this)); + }, + isEditMode: function() { + return !this.base.origElements.parentNode.classList.contains('read-mode') + }, + cancel: function() { + if (this.isEditMode()) { + this.hidePanel(); + this.reset(); + } + }, + handleKeydown: function(e) { + var code = e.keyCode ? e.keyCode : e.which; + + if (this.mentionPanel && code === MediumEditor.util.keyCode.ENTER) { + e.preventDefault(); + } + }, + handleKeyup: function(e) { + var code = e.keyCode ? e.keyCode : e.which; + var isSpace = code === MediumEditor.util.keyCode.SPACE; + var isBackspace = code === MediumEditor.util.keyCode.BACKSPACE; + + if (this.mentionPanel) { + this.keyDownMentionPanel(e); + } + + var moveKeys = [37, 38, 39, 40]; + + if (moveKeys.indexOf(code) !== -1) { + return; + } + + this.selection = this.document.getSelection(); + + if (isBackspace && this.selection.focusNode.nodeName.toLowerCase() === 'p') { + return; + } + + if (!isSpace && this.selection.rangeCount === 1) { + var endChar = this.selection.getRangeAt(0).startOffset; + var textContent = this.selection.focusNode.textContent; + + this.word = this.getLastWord(textContent); + textContent = textContent.substring(0, endChar); + + if (this.word.length > 1 && ['@', '#', ':'].indexOf(this.word[0]) != -1) { + this.wrap(); + this.showPanel(); + + MediumEditor.selection.select( + this.document, + this.wordNode.firstChild, + this.word.length + ); + + return; + } + } else if (isSpace) { + this.cancelMentionSpace(); + } + + this.hidePanel(); + }, + reset: function() { + this.wordNode = null; + this.word = null; + this.selection = null; + }, + cancelMentionSpace: function() { + if (this.wordNode && this.wordNode.nextSibling) { + var textNode = this.document.createTextNode(''); + textNode.textContent = this.word + '\u00A0'; + + this.wordNode.parentNode.replaceChild(textNode, this.wordNode); + + MediumEditor.selection.select(this.document, textNode, this.word.length + 1); + } + + this.reset(); + }, + wrap: function() { + var range = this.selection.getRangeAt(0).cloneRange(); + + if (range.startContainer.parentNode.nodeName.toLowerCase() === 'a') { + var parentLink = range.startContainer.parentNode.parentNode; + var textNode = this.document.createTextNode(range.startContainer.parentNode.innerText); + + parentLink.replaceChild(textNode, range.startContainer.parentNode); + + this.selection.removeAllRanges(); + + range = document.createRange(); + + range.setStart(textNode, textNode.length); + range.setEnd(textNode, textNode.length); + + this.selection.addRange(range); + } + + if (!range.startContainer.parentNode.classList.contains('mention')) { + this.wordNode = this.document.createElement('span'); + this.wordNode.classList.add('mention'); + + range.setStart(range.startContainer, this.selection.getRangeAt(0).startOffset - this.word.length); + range.surroundContents(this.wordNode); + + this.selection.removeAllRanges(); + this.selection.addRange(range); + + //move cursor to old position + range.setStart(range.startContainer, range.endOffset); + range.setStart(range.endContainer, range.endOffset); + this.selection.removeAllRanges(); + this.selection.addRange(range); + } else { + this.wordNode = range.startContainer.parentNode; + } + }, + refreshPositionPanel: function() { + var bound = this.wordNode.getBoundingClientRect(); + + this.mentionPanel.style.top = this.window.pageYOffset + bound.bottom + 'px'; + this.mentionPanel.style.left = this.window.pageXOffset + bound.left + 'px'; + }, + selectMention: function(item) { + if (item.image) { + var img = document.createElement('img'); + img.src = item.image; + + this.wordNode.parentNode.replaceChild(img, this.wordNode); + this.wordNode = img; + } else { + var link = document.createElement('a'); + + link.setAttribute('href', item.url); + + if (item.ref) { + link.innerText = '#' + item.ref + '-' + item.subject; + } else { + link.innerText = '@' + item.username; + } + + this.wordNode.parentNode.replaceChild(link, this.wordNode); + this.wordNode = link; + } + + var textNode = this.document.createTextNode(''); + textNode.textContent = '\u00A0'; + + this.wordNode.parentNode.insertBefore(textNode, this.wordNode.nextSibling); + MediumEditor.selection.select(this.document, textNode, 1); + + var target = this.base.getFocusedElement(); + + this.base.events.updateInput(target, { + target: target, + currentTarget: target + }); + + this.hidePanel(); + this.reset(); + }, + showPanel: function() { + if(document.querySelectorAll('.medium-editor-mention-panel').length) { + this.refreshPositionPanel(); + this.getItems(this.word, this.renderPanel.bind(this)); + return; + } + + var el = this.document.createElement('div'); + el.classList.add('medium-editor-mention-panel'); + this.mentionPanel = el; + this.getEditorOption('elementsContainer').appendChild(el); + + this.refreshPositionPanel(); + this.getItems(this.word, this.renderPanel.bind(this)); + }, + keyDownMentionPanel: function(e) { + var code = e.keyCode ? e.keyCode : e.which; + var active = this.mentionPanel.querySelector('.active'); + + this.wordNode = document.querySelector('span.mention'); + + if(!active) { + return; + } + + if (code === MediumEditor.util.keyCode.ENTER) { + e.preventDefault(); + e.stopPropagation(); + + var event = document.createEvent('HTMLEvents'); + event.initEvent('click', true, false); + + active.dispatchEvent(event); + + return; + } + + active.classList.remove('active'); + + if (code === 38) { + if(active.previousSibling) { + active.previousSibling.classList.add('active'); + } else { + active.parentNode.lastChild.classList.add('active'); + } + } else if (code === 40) { + if(active.nextSibling) { + active.nextSibling.classList.add('active'); + } else { + active.parentNode.firstChild.classList.add('active'); + } + } + }, + renderPanel: function(items) { + this.mentionPanel.innerHTML = ''; + + if (!items.length) return; + + var ul = this.document.createElement('ul'); + + ul.classList.add('medium-mention'); + + items.forEach(function(it) { + var li = this.document.createElement('li'); + + if (it.image) { + var img = this.document.createElement('img'); + + img.src = it.image; + li.appendChild(img); + + var textNode = document.createTextNode(''); + textNode.textContent = ' ' + it.name; + + li.appendChild(textNode); + + } else if (it.ref) { + li.innerText = '#' + it.ref + ' - ' + it.subject; + } else { + li.innerText = '@' + it.username; + } + + li.addEventListener('click', this.selectMention.bind(this, it)); + + ul.appendChild(li); + }.bind(this)); + + ul.firstChild.classList.add('active'); + + this.mentionPanel.appendChild(ul); + }, + hidePanel: function() { + if (this.mentionPanel) { + this.mentionPanel.parentNode.removeChild(this.mentionPanel); + this.mentionPanel = null; + } + }, + getLastWord: function(text) { + var n = text.split(' '); + return n[n.length - 1].trim(); + } +}); diff --git a/app/locales/taiga/locale-en.json b/app/locales/taiga/locale-en.json index 7127c031..9eb45448 100644 --- a/app/locales/taiga/locale-en.json +++ b/app/locales/taiga/locale-en.json @@ -228,32 +228,7 @@ } }, "WYSIWYG": { - "H1_BUTTON": "First Level Heading", - "H1_SAMPLE_TEXT": "Your title here...", - "H2_BUTTON": "Second Level Heading", - "H2_SAMPLE_TEXT": "Your title here...", - "H3_BUTTON": "Third Level Heading", - "H3_SAMPLE_TEXT": "Your title here...", - "BOLD_BUTTON": "Bold", - "BOLD_BUTTON_SAMPLE_TEXT": "Your text here...", - "ITALIC_BUTTON": "Italic", - "ITALIC_SAMPLE_TEXT": "Your text here...", - "STRIKE_BUTTON": "Strike", - "STRIKE_SAMPLE_TEXT": "Your text here...", - "BULLETED_LIST_BUTTON": "Bulleted List", - "BULLETED_LIST_SAMPLE_TEXT": "Your text here...", - "NUMERIC_LIST_BUTTON": "Numeric List", - "NUMERIC_LIST_SAMPLE_TEXT": "Your text here...", - "PICTURE_BUTTON": "Picture", - "PICTURE_SAMPLE_TEXT": "Your alternative text to picture here...", - "LINK_BUTTON": "Link", - "LINK_SAMPLE_TEXT": "Your text to link here....", - "QUOTE_BLOCK_BUTTON": "Quote Block", - "QUOTE_BLOCK_SAMPLE_TEXT": "Your text here...", - "CODE_BLOCK_BUTTON": "Code Block", - "CODE_BLOCK_SAMPLE_TEXT": "Your text here...", - "PREVIEW_BUTTON": "Preview", - "EDIT_BUTTON": "Edit", + "OUTDATED": "Another person has made changes while you were editing. Check the new version on the activiy tab before you save your changes.", "ATTACH_FILE_HELP": "Attach files by dragging & dropping on the textarea above.", "ATTACH_FILE_HELP_SAVE_FIRST": "Save first before if you want to attach files by dragging & dropping on the textarea above.", "MARKDOWN_HELP": "Markdown syntax help" diff --git a/app/modules/components/bind-code.directive.coffee b/app/modules/components/bind-code.directive.coffee new file mode 100644 index 00000000..6ac0ebed --- /dev/null +++ b/app/modules/components/bind-code.directive.coffee @@ -0,0 +1,54 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/bind-code.directive.coffee +### + +BindCode = ($sce, $parse, $compile, wysiwygService, wysiwygCodeHightlighterService) -> + return { + restrict: 'A', + compile: (tElement, tAttrs) -> + tgBindCodeGetter = $parse(tAttrs.tgBindCode) + tgBindCodeWatch = $parse tAttrs.tgBindCode, (value) -> + return (value || '').toString() + + $compile.$$addBindingClass(tElement) + + return (scope, element, attr) -> + $compile.$$addBindingInfo(element, attr.tgBindCode); + + scope.$watch tgBindCodeWatch, () -> + html = wysiwygService.getHTML(tgBindCodeGetter(scope)) + + element.html($sce.getTrustedHtml(html) || '') + + wysiwygCodeHightlighterService.addHightlighter(element) + + } + +angular.module("taigaComponents") + .directive("tgBindCode", [ + "$sce", + "$parse", + "$compile", + "tgWysiwygService", + "tgWysiwygCodeHightlighterService", + BindCode]) diff --git a/app/modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee b/app/modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee new file mode 100644 index 00000000..2bc170e6 --- /dev/null +++ b/app/modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee @@ -0,0 +1,59 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/wysiwyg/comment-edit-wysiwyg.directive.coffee +### + +CommentEditWysiwyg = (attachmentsFullService) -> + link = ($scope, $el, $attrs) -> + types = { + userstories: "us", + issues: "issue", + tasks: "task" + } + + uploadFile = (file, cb) -> + return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.comment.comment.id, types[$scope.vm.comment.comment._name], file).then (result) -> + cb(result.getIn(['file', 'name']), result.getIn(['file', 'url'])) + + $scope.uploadFiles = (files, cb) -> + for file in files + uploadFile(file, cb) + + return { + scope: true, + link: link, + template: """ +
+ + +
+ """ + } + +angular.module("taigaComponents") + .directive("tgCommentEditWysiwyg", ["tgAttachmentsFullService", CommentEditWysiwyg]) diff --git a/app/modules/components/wysiwyg/comment-wysiwyg.directive.coffee b/app/modules/components/wysiwyg/comment-wysiwyg.directive.coffee new file mode 100644 index 00000000..c1240a63 --- /dev/null +++ b/app/modules/components/wysiwyg/comment-wysiwyg.directive.coffee @@ -0,0 +1,77 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/wysiwyg/comment-wysiwyg.directive.coffee +### + +CommentWysiwyg = (attachmentsFullService) -> + link = ($scope, $el, $attrs) -> + $scope.editableDescription = false + + $scope.saveComment = (description, cb) -> + $scope.content = '' + $scope.vm.type.comment = description + $scope.vm.onAddComment({callback: cb}) + + types = { + userstories: "us", + issues: "issue", + tasks: "task" + } + + uploadFile = (file, cb) -> + return attachmentsFullService.addAttachment($scope.vm.projectId, $scope.vm.type.id, types[$scope.vm.type._name], file).then (result) -> + cb(result.getIn(['file', 'name']), result.getIn(['file', 'url'])) + + $scope.onChange = (markdown) -> + $scope.vm.type.comment = markdown + + $scope.uploadFiles = (files, cb) -> + for file in files + uploadFile(file, cb) + + $scope.content = '' + + $scope.$watch "vm.type", (value) -> + return if not value + + $scope.storageKey = "comment-" + value.project + "-" + value.id + "-" + value._name + + return { + scope: true, + link: link, + template: """ +
+ + +
+ """ + } + +angular.module("taigaComponents") + .directive("tgCommentWysiwyg", ["tgAttachmentsFullService", CommentWysiwyg]) diff --git a/app/modules/components/wysiwyg/item-wysiwyg.directive.coffee b/app/modules/components/wysiwyg/item-wysiwyg.directive.coffee new file mode 100644 index 00000000..e4c6baff --- /dev/null +++ b/app/modules/components/wysiwyg/item-wysiwyg.directive.coffee @@ -0,0 +1,100 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/wysiwyg/item-wysiwyg.directive.coffee +### + +# Used in details descriptions +ItemWysiwyg = ($modelTransform, $rootscope, $confirm, attachmentsFullService, $translate) -> + link = ($scope, $el, $attrs) -> + $scope.editableDescription = false + + $scope.saveDescription = (description, cb) -> + transform = $modelTransform.save (item) -> + item.description = description + + return item + + transform.then -> + $confirm.notify("success") + $rootscope.$broadcast("object:updated") + + transform.then null, -> + $confirm.notify("error") + + transform.finally(cb) + + uploadFile = (file, cb) -> + return attachmentsFullService.addAttachment($scope.project.id, $scope.item.id, $attrs.type, file).then (result) -> + cb(result.getIn(['file', 'name']), result.getIn(['file', 'url'])) + + $scope.uploadFiles = (files, cb) -> + for file in files + uploadFile(file, cb) + + $scope.$watch $attrs.model, (value) -> + return if not value + $scope.item = value + $scope.version = value.version + $scope.storageKey = $scope.project.id + "-" + value.id + "-" + $attrs.type + + $scope.$watch 'project', (project) -> + return if !project + + $scope.editableDescription = project.my_permissions.indexOf($attrs.requiredPerm) != -1 + + return { + scope: true, + link: link, + template: """ +
+ + + +
+ +
+ {{'COMMON.DESCRIPTION.NO_DESCRIPTION' | translate}} +
+
+ """ + } + +angular.module("taigaComponents") + .directive("tgItemWysiwyg", [ + "$tgQueueModelTransformation", + "$rootScope", + "$tgConfirm", + "tgAttachmentsFullService", + "$translate", + ItemWysiwyg]) diff --git a/app/modules/components/wysiwyg/wysiwyg-code-hightlighter.service.coffee b/app/modules/components/wysiwyg/wysiwyg-code-hightlighter.service.coffee new file mode 100644 index 00000000..b9854a96 --- /dev/null +++ b/app/modules/components/wysiwyg/wysiwyg-code-hightlighter.service.coffee @@ -0,0 +1,180 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/wysiwyg/wysiwyg-code-hightlighter.service.coffee +### + +class WysiwygCodeHightlighterService + constructor: () -> + if !@.languages + @.loadLanguages() + + loadLanguages: () -> + $.getJSON("/#{window._version}/prism/prism-languages.json").then (_languages_) => + @.languages = _.map _languages_, (it) -> + it.url = "/#{window._version}/prism/" + it.file + + return it + + getLanguageInClassList: (classes) -> + lan = _.find @.languages, (it) -> + return !!_.find classes, (className) -> + return 'language-' + it.name == className + + return if lan then lan.name else null + + addCodeLanguageSelectors: (mediumInstance) -> + $(mediumInstance.elements[0]).find('code').each (index, code) => + if !code.classList.contains('has-code-lan-selector') + code.classList.add('has-code-lan-selector') # prevent multi instanciate + + currentLan = @.getLanguageInClassList(code.classList) + + id = new Date().getTime() + + text = document.createTextNode(currentLan || 'text') + + tab = document.createElement('div') + tab.appendChild(text) + tab.addEventListener 'click', () => + @.searchLanguage tab, (lan) => + if lan + tab.innerText = lan + @.updatePositionCodeTab(code.parentElement, tab) + code.classList.add('language-' + lan) + code.classList.add(lan) + + document.body.appendChild(tab) + + code.classList.add(id) + code.dataset.tab = tab + + tab.classList.add('code-language-selector') # styles + tab.classList.add('medium-' + mediumInstance.id) # used to delete + tab.dataset.tabId = id + + @.updatePositionCodeTab(code.parentElement, tab) + + removeCodeLanguageSelectors: (mediumInstance) -> + return if !mediumInstance || !mediumInstance.elements + + $(mediumInstance.elements[0]).find('code').each (index, code) -> + $(code).removeClass('has-code-lan-selector') + + $('.medium-' + mediumInstance.id).remove() + + updatePositionCodeTab: (node, tab) -> + preRects = node.getBoundingClientRect() + + tab.style.top = (preRects.top + $(window).scrollTop()) + 'px' + tab.style.left = (preRects.left + preRects.width - tab.offsetWidth) + 'px' + + getCodeLanHTML: (filter = '') -> + template = _.template(""" + <% _.forEach(lans, function(lan) { %> +
  • <%- lan %>
  • <% }); + %> + """); + + filteresLans = _.map @.languages, (it) -> it.name + + if filter.length + filteresLans = _.filter filteresLans, (it) -> + return it.indexOf(filter) != -1 + + return template({ 'lans': filteresLans }); + + searchLanguage: (tab, cb) -> + search = document.createElement('div') + + search.className = 'code-language-search' + + preRects = tab.getBoundingClientRect() + search.style.top = (preRects.top + $(window).scrollTop() + preRects.height) + 'px' + search.style.left = preRects.left + 'px' + + input = document.createElement('input') + input.setAttribute('type', 'text') + + ul = document.createElement('ul') + + ul.innerHTML = @.getCodeLanHTML() + + search.appendChild(input) + search.appendChild(ul) + + document.body.appendChild(search) + + input.focus() + + close = () -> + search.remove() + $(document.body).off('.leave-search-codelan') + + clickedInSearchBox = (target) -> + return $(search).is(target) || !!$(search).has(target).length + + $(document.body).on 'mouseup.leave-search-codelan', (e) -> + if !clickedInSearchBox(e.target) + cb(null) + close() + + $(input).on 'keyup', (e) => + filter = e.currentTarget.value + ul.innerHTML = @.getCodeLanHTML(filter) + + $(ul).on 'click', 'li', (e) -> + cb(e.currentTarget.innerText) + close() + + loadLanguage: (lan) -> + return new Promise (resolve) -> + if !Prism.languages[lan] + ljs.load("/#{window._version}/prism/prism-#{lan}.min.js", resolve) + else + resolve() + + removeHightlighter: (element) -> + codes = $(element).find('code') + + codes.each (index, code) -> + code.innerHTML = code.innerText + + addHightlighter: (element) -> + codes = $(element).find('code') + + codes.each (index, code) => + lan = @.getLanguageInClassList(code.classList) + + if lan + @.loadLanguage(lan).then () -> Prism.highlightElement(code) + + updateCodeLanguageSelector: (mediumInstance) -> + $('.medium-' + mediumInstance.id).each (index, tab) => + node = $('.' + tab.dataset.tabId) + + if !node.length + tab.remove() + else + @.updatePositionCodeTab(node.parent()[0], tab) + +angular.module("taigaComponents") + .service("tgWysiwygCodeHightlighterService", WysiwygCodeHightlighterService) diff --git a/app/modules/components/wysiwyg/wysiwyg-mention.service.coffee b/app/modules/components/wysiwyg/wysiwyg-mention.service.coffee new file mode 100644 index 00000000..43d6d163 --- /dev/null +++ b/app/modules/components/wysiwyg/wysiwyg-mention.service.coffee @@ -0,0 +1,117 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/wysiwyg/wysiwyg-mention.service.coffee +### + +class WysiwygMentionService + @.$inject = [ + "tgProjectService", + "tgWysiwygService", + "$tgNavUrls", + "$tgResources" + ] + + constructor: (@projectService, @wysiwygService, @navurls, @rs) -> + @.cancelablePromise = null + + searchEmoji: (name, cb) -> + filteredEmojis = @wysiwygService.searchEmojiByName(name) + filteredEmojis = filteredEmojis.slice(0, 10) + + cb(filteredEmojis) + + searchUser: (term, cb) -> + searchProps = ['username', 'full_name', 'full_name_display'] + + users = @projectService.project.toJS().members.filter (user) => + for prop in searchProps + if taiga.slugify(user[prop]).indexOf(term) >= 0 + return true + return false + + users = users.slice(0, 10).map (it) => + it.url = @navurls.resolve('user-profile', { + project: @projectService.project.get('slug'), + username: it.username + }) + + return it + + cb(users) + + searchItem: (term) -> + return new Promise (resolve, reject) => + term = taiga.slugify(term) + + searchTypes = ['issues', 'tasks', 'userstories'] + + urls = { + issues: "project-issues-detail", + tasks: "project-tasks-detail", + userstories: "project-userstories-detail" + } + + searchProps = ['ref', 'subject'] + + filter = (item) => + for prop in searchProps + if taiga.slugify(item[prop]).indexOf(term) >= 0 + return true + return false + + @.cancelablePromise.abort() if @.cancelablePromise + + @.cancelablePromise = @rs.search.do(@projectService.project.get('id'), term) + + @.cancelablePromise.then (res) => + # ignore wikipages if they're the only results. can't exclude them in search + if res.count < 1 or res.count == res.wikipages.length + resolve([]) + else + result = [] + for type in searchTypes + if res[type] and res[type].length > 0 + items = res[type].filter(filter) + items = items.map (it) => + it.url = @navurls.resolve(urls[type], { + project: @projectService.project.get('slug'), + ref: it.ref + }) + + return it + + result = result.concat(items) + + resolve(result.slice(0, 10)) + + + search: (mention) -> + return new Promise (resolve) => + if '#'.indexOf(mention[0]) != -1 + @.searchItem(mention.replace('#', '')).then(resolve) + else if '@'.indexOf(mention[0]) != -1 + @.searchUser(mention.replace('@', ''), resolve) + else if ':'.indexOf(mention[0]) != -1 + @.searchEmoji(mention.replace(':', ''), resolve) + + +angular.module("taigaComponents").service("tgWysiwygMentionService", WysiwygMentionService) diff --git a/app/modules/components/wysiwyg/wysiwyg.directive.coffee b/app/modules/components/wysiwyg/wysiwyg.directive.coffee new file mode 100644 index 00000000..25048c00 --- /dev/null +++ b/app/modules/components/wysiwyg/wysiwyg.directive.coffee @@ -0,0 +1,401 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/wysiwyg/wysiwyg.directive.coffee +### + +taiga = @.taiga +bindOnce = @.taiga.bindOnce + +Medium = ($translate, $confirm, $storage, wysiwygService, animationFrame, tgLoader, wysiwygCodeHightlighterService, wysiwygMentionService, analytics) -> + + isCodeBlockSelected = (range, elm) -> + return !!$(range.endContainer).parentsUntil('.editor', 'code').length + + removeCodeBlockAndHightlight = (range, elm) -> + code = $(range.endContainer).closest('code')[0] + pre = code.parentNode + + p = document.createElement('p') + p.innerText = code.innerText + + pre.parentNode.replaceChild(p, pre) + + wysiwygCodeHightlighterService.removeCodeLanguageSelectors(elm) + + addCodeBlockAndHightlight = (range, elm) -> + pre = document.createElement('pre') + code = document.createElement('code') + + pre.appendChild(code) + code.appendChild(range.extractContents()) + range.insertNode(pre) + + elm.checkContentChanged() + + wysiwygCodeHightlighterService.addCodeLanguageSelectors(elm) + + # MediumEditor extension to add + CodeButton = MediumEditor.extensions.button.extend({ + name: 'code', + init: () -> + this.button = this.document.createElement('button') + this.button.classList.add('medium-editor-action') + this.button.innerHTML = 'Code' + this.button.title = 'Code' + this.on(this.button, 'click', this.handleClick.bind(this)) + + getButton: () -> + return this.button + + tagNames: ['code'] + + handleClick: (event) -> + range = MediumEditor.selection.getSelectionRange(self.document) + + if isCodeBlockSelected(range, this.base) + removeCodeBlockAndHightlight(range, this.base) + else + addCodeBlockAndHightlight(range, this.base) + }) + + # bug + #
    the enter key press doesn't work + oldIsBlockContainer = MediumEditor.util.isBlockContainer + + MediumEditor.util.isBlockContainer = (element) -> + if !element + return oldIsBlockContainer(element) + + if element.tagName + tagName = element.tagName + else + tagName = element.parentNode.tagName + + if tagName.toLowerCase() == 'code' + return true + + return oldIsBlockContainer(element) + + link = ($scope, $el, $attrs) -> + mediumInstance = null + editorMedium = $el.find('.medium') + editorMarkdown = $el.find('.markdown') + + isEditOnly = !!$attrs.$attr.editonly + notPersist = !!$attrs.$attr.notPersist + + $scope.required = !!$attrs.$attr.required + $scope.editMode = isEditOnly || false + $scope.mode = $storage.get('editor-mode', 'html') + + wysiwygService.loadEmojis() + + setHtmlMedium = (markdown) -> + html = wysiwygService.getHTML(markdown) + editorMedium.html(html) + + $scope.setMode = (mode) -> + $storage.set('editor-mode', mode) + + if mode == 'markdown' + updateMarkdownWithCurrentHtml() + else + setHtmlMedium($scope.markdown) + + $scope.mode = mode + mediumInstance.trigger('editableBlur', {}, editorMedium[0]) + + $scope.save = () -> + if $scope.mode == 'html' + updateMarkdownWithCurrentHtml() + + return if $scope.required && !$scope.markdown.length + + $scope.saving = true + $scope.outdated = false + + $scope.onSave({text: $scope.markdown, cb: saveEnd}) + + return + + $scope.cancel = () -> + if !isEditOnly + $scope.editMode = false + + if notPersist + clean() + else if $scope.mode == 'html' + setHtmlMedium($scope.content) + + $scope.markdown = $scope.content + + discardLocalStorage() + mediumInstance.trigger('blur', {}, editorMedium[0]) + $scope.outdated = false + + $scope.onCancel() + + return + + clean = () -> + $scope.markdown = '' + editorMedium.html('') + + refreshExtras = () -> + animationFrame.add () -> + if $scope.mode == 'html' + if $scope.editMode + wysiwygCodeHightlighterService.addCodeLanguageSelectors(mediumInstance) + wysiwygCodeHightlighterService.removeHightlighter(mediumInstance.elements[0]) + else + wysiwygCodeHightlighterService.addHightlighter(mediumInstance.elements[0]) + wysiwygCodeHightlighterService.removeCodeLanguageSelectors(mediumInstance) + else + wysiwygCodeHightlighterService.removeHightlighter(mediumInstance.elements[0]) + wysiwygCodeHightlighterService.removeCodeLanguageSelectors(mediumInstance) + + saveEnd = () -> + $scope.saving = false + + if !isEditOnly + $scope.editMode = false + + if notPersist + clean() + + discardLocalStorage() + mediumInstance.trigger('blur', {}, editorMedium[0]) + + analytics.trackEvent('develop', 'save wysiwyg', $scope.mode, 1) + + uploadEnd = (name, url) -> + if taiga.isImage(name) + mediumInstance.pasteHTML("
    ") + else + name = $('
    ').text(name).html() + mediumInstance.pasteHTML("" + name + "
    ") + + isOutdated = () -> + store = $storage.get($scope.storageKey) + + if store && store.version && store.version != $scope.version + return true + + return false + + isDraft = () -> + store = $storage.get($scope.storageKey) + + if store + return true + + return false + + getCurrentContent = () -> + store = $storage.get($scope.storageKey) + + if store + return store.text + + return $scope.content + + discardLocalStorage = () -> + $storage.remove($scope.storageKey) + + cancelWithConfirmation = () -> + if $scope.content == $scope.markdown + $scope.cancel() + + document.activeElement.blur() + document.body.click() + + return null + + title = $translate.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_TITLE") + message = $translate.instant("COMMON.CONFIRM_CLOSE_EDIT_MODE_MESSAGE") + + $confirm.ask(title, null, message).then (askResponse) -> + $scope.cancel() + askResponse.finish() + + updateMarkdownWithCurrentHtml = () -> + $scope.markdown = wysiwygService.getMarkdown(editorMedium.html()) + + localSave = (markdown) -> + if $scope.storageKey + store = {} + store.version = $scope.version || 0 + store.text = markdown + $storage.set($scope.storageKey, store) + + change = () -> + if $scope.mode == 'html' + updateMarkdownWithCurrentHtml() + wysiwygCodeHightlighterService.updateCodeLanguageSelector(mediumInstance) + + localSave($scope.markdown) + + $scope.onChange({markdown: $scope.markdown}) + + throttleChange = _.throttle(change, 200) + + create = (text, editMode=false) -> + if text.length + html = wysiwygService.getHTML(text) + editorMedium.html(html) + + mediumInstance = new MediumEditor(editorMedium[0], { + targetBlank: true, + imageDragging: false, + placeholder: { + text: $scope.placeholder + }, + toolbar: { + buttons: [ + 'bold', + 'italic', + 'strikethrough', + 'anchor', + 'image', + 'orderedlist', + 'unorderedlist', + 'h1', + 'h2', + 'h3', + 'quote', + 'removeFormat', + 'code' + ] + }, + extensions: { + code: new CodeButton(), + autolist: new AutoList(), + mediumMention: new MentionExtension({ + getItems: (mention, mentionCb) -> + wysiwygMentionService.search(mention).then(mentionCb) + }) + } + }) + + $scope.changeMarkdown = throttleChange + + mediumInstance.subscribe 'editableInput', (e) -> + $scope.$applyAsync(throttleChange) + + mediumInstance.subscribe "editableClick", (e) -> + e.stopPropagation() + + if e.target.href + window.open(e.target.href) + + mediumInstance.subscribe 'focus', (event) -> + $scope.$applyAsync () -> + if !$scope.editMode + $scope.editMode = true + + mediumInstance.subscribe 'editableDrop', (event) -> + $scope.onUploadFile({files: event.dataTransfer.files, cb: uploadEnd}) + + mediumInstance.subscribe 'editableKeydown', (e) -> + code = if e.keyCode then e.keyCode else e.which + + mention = $('.medium-mention') + + if (code == 40 || code == 38) && mention.length + e.stopPropagation() + e.preventDefault() + + return + + if $scope.editMode && code == 27 + e.stopPropagation() + $scope.$applyAsync(cancelWithConfirmation) + else if code == 27 + editorMedium.blur() + + $scope.editMode = editMode + + $scope.$applyAsync(refreshExtras) + + $scope.$watch () -> + return $scope.mode + ":" + $scope.editMode + , () -> + $scope.$applyAsync(refreshExtras) + + unwatch = $scope.$watch 'content', (content) -> + if !_.isUndefined(content) + $scope.outdated = isOutdated() + + if !mediumInstance && isDraft() + $scope.editMode = true + + if $scope.markdown == content + return + + content = getCurrentContent() + + $scope.markdown = content + + if mediumInstance + mediumInstance.destroy() + + if tgLoader.open() + unwatchLoader = tgLoader.onEnd () -> + create(content, $scope.editMode) + unwatchLoader() + else + create(content, $scope.editMode) + + unwatch() + + $scope.$on "$destroy", () -> + if mediumInstance + wysiwygCodeHightlighterService.removeCodeLanguageSelectors(mediumInstance) + mediumInstance.destroy() + + return { + templateUrl: "common/components/wysiwyg-toolbar.html", + scope: { + placeholder: '@', + version: '<', + storageKey: '<', + content: '<', + onCancel: '&', + onSave: '&', + onUploadFile: '&', + onChange: '&' + }, + link: link + } + +angular.module("taigaComponents").directive("tgWysiwyg", [ + "$translate", + "$tgConfirm", + "$tgStorage", + "tgWysiwygService", + "animationFrame", + "tgLoader", + "tgWysiwygCodeHightlighterService", + "tgWysiwygMentionService", + "$tgAnalytics", + Medium +]) diff --git a/app/styles/components/wysiwyg.scss b/app/modules/components/wysiwyg/wysiwyg.scss similarity index 54% rename from app/styles/components/wysiwyg.scss rename to app/modules/components/wysiwyg/wysiwyg.scss index dbf1220d..2f10c1bc 100644 --- a/app/styles/components/wysiwyg.scss +++ b/app/modules/components/wysiwyg/wysiwyg.scss @@ -1,6 +1,5 @@ .wysiwyg { line-height: 1.4rem; - margin-bottom: 2rem; overflow: auto; padding: 1rem; h1 { @@ -37,7 +36,7 @@ ol { line-height: 1.5; list-style-position: outside; - margin-bottom: 0; + margin-bottom: 1rem; margin-top: 0; padding-left: 2em; ul, @@ -48,6 +47,15 @@ ul { list-style-type: disc; } + .list-stye-none { + list-style: none; + } + b { + font-weight: bold; + } + i { + font-style: italic; + } dl { dt { font-size: 1em; @@ -63,6 +71,7 @@ } a { color: $primary; + cursor: pointer; &:hover { color: $primary-light; } @@ -134,3 +143,113 @@ border: 1px solid $whitish; } } + +.medium-editor-mention-panel { + background-color: $white; + border: 1px solid $gray-light; + position: absolute; + ul { + margin-bottom: 0; + } + li { + border-top: 1px solid $gray-light; + cursor: pointer; + padding: 2px 5px; + &:first-child { + border-top: 0; + } + &:hover, + &.active { + background-color: $primary-dark; + color: $white; + } + } +} + +tg-wysiwyg { + display: flex; + margin-bottom: 2rem; + .outdated { + color: $red; + } + .tools { + padding-left: 1rem; + a { + display: block; + margin-bottom: .5rem; + } + svg { + fill: $gray-light; + } + } + .editor { + width: 100%; + } + .mode-editor { + span { + color: $gray-light; + cursor: pointer; + margin-right: .5rem; + } + } + .medium-editor-placeholder, + .markdown-editor-placeholder { + color: $gray-light; + padding-left: 1rem; + &::after { // overwrite medium css + color: $gray-light; + font-style: normal; + } + } + .markdown:not(.empty) { + p { + margin-bottom: 0; + white-space: pre-wrap; + } + } + .read-mode { + cursor: pointer; + } + .edit-mode { + .markdown, + .medium { + border: 1px solid $gray-light; + } + .medium-editor-element { + min-height: 10rem; + } + } + .mention { + font-weight: bold; + } +} + +.code-language-selector { + @include font-size(xsmall); + background-color: $white; + border: 1px solid $gray-light; + cursor: pointer; + padding: .2rem .5rem 0; + position: absolute; +} + +.code-language-search { + @include font-size(xsmall); + background-color: $white; + border: 1px solid $gray-light; + position: absolute; + ul { + cursor: pointer; + margin-bottom: 0; + max-height: 20vh; + overflow-y: scroll; + } + li { + padding: .2rem .5rem; + } +} + +// Override medium styles +.medium-editor-toolbar li .medium-editor-button-active { + color: $primary-light; +} diff --git a/app/modules/components/wysiwyg/wysiwyg.service.coffee b/app/modules/components/wysiwyg/wysiwyg.service.coffee new file mode 100644 index 00000000..caf2aefb --- /dev/null +++ b/app/modules/components/wysiwyg/wysiwyg.service.coffee @@ -0,0 +1,121 @@ +### +# Copyright (C) 2014-2016 Andrey Antukh +# Copyright (C) 2014-2016 Jesús Espino Garcia +# Copyright (C) 2014-2016 David Barragán Merino +# Copyright (C) 2014-2016 Alejandro Alonso +# Copyright (C) 2014-2016 Juan Francisco Alcántara +# Copyright (C) 2014-2016 Xavi Julian +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +# File: modules/components/wysiwyg/wysiwyg.service.coffee +### + +class WysiwygService + constructor: (@wysiwygCodeHightlighterService) -> + + searchEmojiByName: (name) -> + return _.filter @.emojis, (it) -> it.name.indexOf(name) != -1 + + setEmojiImagePath: (emojis) -> + @.emojis = _.map emojis, (it) -> + it.image = "/#{window._version}/emojis/" + it.image + + return it + + loadEmojis: () -> + $.getJSON("/#{window._version}/emojis/emojis-data.json").then(@.setEmojiImagePath.bind(this)) + + getEmojiById: (id) -> + return _.find @.emojis, (it) -> it.id == id + + getEmojiByName: (name) -> + return _.find @.emojis, (it) -> it.name == name + + replaceImgsByEmojiName: (html) -> + emojiIds = taiga.getMatches(html, /emojis\/([^"]+).png"/gi) + + for emojiId in emojiIds + regexImgs = new RegExp(']+\>', 'g') + emoji = @.getEmojiById(emojiId) + html = html.replace(regexImgs, ':' + emoji.name + ':') + + return html + + replaceEmojiNameByImgs: (text) -> + emojiIds = taiga.getMatches(text, /:([^: ]*):/g) + + for emojiId in emojiIds + regexImgs = new RegExp(':' + emojiId + ':', 'g') + emoji = @.getEmojiByName(emojiId) + + if emoji + text = text.replace(regexImgs, '![alt](' + emoji.image + ')') + + return text + + removeTrailingListBr: (text) -> + regex = new RegExp(/
  • (.*?)
    <\/li>/, 'g') + return text.replace(regex, '
  • $1
  • ') + + getMarkdown: (html) -> + # https://github.com/yabwe/medium-editor/issues/543 + cleanIssueConverter = { + filter: ['html', 'body', 'span', 'div'], + replacement: (innerHTML) -> + return innerHTML + } + + codeLanguageConverter = { + filter: (node) => + return node.nodeName == 'PRE' && + node.firstChild && + node.firstChild.nodeName == 'CODE' + replacement: (content, node) => + lan = @wysiwygCodeHightlighterService.getLanguageInClassList(node.firstChild.classList) + lan = '' if !lan + + return '\n\n```' + lan + '\n' + _.trim(node.firstChild.textContent) + '\n```\n\n' + } + + html = html.replace(/ (<\/.*>)/g, "$1") + html = @.replaceImgsByEmojiName(html) + html = @.removeTrailingListBr(html) + + markdown = toMarkdown(html, { + gfm: true, + converters: [cleanIssueConverter, codeLanguageConverter] + }) + + return markdown + + getHTML: (text) -> + return "" if !text || !text.length + + options = { + breaks: true + } + + text = @.replaceEmojiNameByImgs(text) + + md = window.markdownit({ + breaks: true + }) + + result = md.render(text) + + return result + +angular.module("taigaComponents") + .service("tgWysiwygService", ["tgWysiwygCodeHightlighterService", WysiwygService]) diff --git a/app/modules/history/comments/comment.controller.coffee b/app/modules/history/comments/comment.controller.coffee index 531480ef..468b700a 100644 --- a/app/modules/history/comments/comment.controller.coffee +++ b/app/modules/history/comments/comment.controller.coffee @@ -28,7 +28,6 @@ class CommentController constructor: (@currentUserService, @permissionService, @lightboxFactory) -> @.hiddenDeletedComment = true - @.commentContent = angular.copy(@.comment) showDeletedComment: () -> @.hiddenDeletedComment = false @@ -45,6 +44,9 @@ class CommentController @.user = @currentUserService.getUser() return @.user.get('id') == @.comment.user.pk || @permissionService.check('modify_project') + saveComment: (text, cb) -> + @.onEditComment({commentId: @.comment.id, commentData: text, callback: cb}) + displayCommentHistory: () -> @lightboxFactory.create('tg-lb-display-historic', { "class": "lightbox lightbox-display-historic" diff --git a/app/modules/history/comments/comment.jade b/app/modules/history/comments/comment.jade index 447b8bfd..a73549d5 100644 --- a/app/modules/history/comments/comment.jade +++ b/app/modules/history/comments/comment.jade @@ -1,5 +1,3 @@ -include ../../../partials/common/components/wysiwyg.jade - .comment-wrapper(ng-if="!vm.comment.delete_comment_date") img.comment-avatar( tg-avatar="vm.comment.user" @@ -23,38 +21,21 @@ include ../../../partials/common/components/wysiwyg.jade .comment-container .comment-text.wysiwyg( ng-if="!vm.editMode" - ng-bind-html="vm.comment.comment_html" + tg-bind-code="vm.comment.comment" ) .comment-editor( ng-if="vm.editMode" ng-keyup="vm.checkCancelComment($event)" ) - .edit-comment(ng-model="vm.type") - textarea( - ng-model="vm.commentContent.comment" - ) - .save-comment-wrapper - button.button-green.save-comment( - type="button" - title="{{'COMMENTS.EDIT_COMMENT' | translate}}" - translate="COMMENTS.EDIT_COMMENT" - ng-disabled="!vm.commentContent.comment.length || vm.editing == vm.comment.id" - ng-click="vm.onEditComment({commentId: vm.comment.id, commentData: vm.commentContent.comment})" - tg-loading="vm.editing == vm.comment.id" - ) - .comment-options(ng-if="::vm.canEditDeleteComment()") + tg-comment-edit-wysiwyg.edit-comment + + .comment-options(ng-if="vm.canEditDeleteComment() && !vm.editMode") tg-svg.comment-option( svg-icon="icon-edit" svg-title-translate="COMMON.EDIT" ng-click="vm.onEditMode({commentId: vm.comment.id})" ng-if="!vm.editMode" ) - tg-svg.comment-option( - svg-icon="icon-close" - svg-title-translate="COMMON.CANCEL" - ng-click="vm.onEditMode({commentId: vm.comment.id})" - ng-if="vm.editMode" - ) tg-svg.comment-option( svg-icon="icon-trash" svg-title-translate="COMMON.DELETE" @@ -107,5 +88,5 @@ include ../../../partials/common/components/wysiwyg.jade span(translate="COMMENTS.RESTORE") p.deleted-comment-comment( ng-if="!vm.hiddenDeletedComment" - ng-bind-html="vm.comment.comment_html" + tg-bind-code="vm.comment.comment" ) diff --git a/app/modules/history/comments/comment.scss b/app/modules/history/comments/comment.scss index 5aef9e53..7a526108 100644 --- a/app/modules/history/comments/comment.scss +++ b/app/modules/history/comments/comment.scss @@ -1,5 +1,16 @@ .comments { clear: both; + tg-wysiwyg { + margin-top: 1.5rem; + } + .read-mode { + border: 1px solid $gray-light; + height: 55px; + .medium-editor-placeholder, + .markdown-editor-placeholder { + height: 55px; + } + } .add-comment { margin-top: 1rem; textarea { @@ -20,7 +31,6 @@ margin-top: 1rem; padding: .5rem 4rem; } - } .comment { display: block; @@ -143,12 +153,6 @@ .deleted-comment-comment { margin-top: 1rem; } - .comment-editor { - textarea { - height: 5rem; - min-height: 5rem; - } - } } .comment-text { diff --git a/app/modules/history/comments/comments.jade b/app/modules/history/comments/comments.jade index 249863eb..09a27fcd 100644 --- a/app/modules/history/comments/comments.jade +++ b/app/modules/history/comments/comments.jade @@ -1,5 +1,3 @@ -include ../../../partials/common/components/wysiwyg.jade - section.comments .comments-wrapper tg-comment.comment( @@ -15,25 +13,11 @@ section.comments on-edit-mode="vm.onEditMode({commentId: commentId})" on-delete-comment="vm.onDeleteComment({commentId: commentId})" on-restore-deleted-comment="vm.onRestoreDeletedComment({commentId: commentId})" - on-edit-comment="vm.onEditComment({commentId: commentId, commentData: commentData})" + on-edit-comment="vm.onEditComment({commentId: commentId, commentData: commentData, callback: callback})" ) - tg-editable-wysiwyg.add-comment( - ng-model="vm.type" + + tg-comment-wysiwyg( tg-check-permission="{{::vm.canAddCommentPermission}}" - tg-toggle-comment + on-update="updateComment(text)" + type="vm.type" ) - textarea( - ng-attr-placeholder="{{'COMMENTS.TYPE_NEW_COMMENT' | translate}}" - tg-markitup="tg-markitup" - ng-model="vm.type.comment" - ) - +wysihelp - .save-comment-wrapper - button.button-green.save-comment( - type="button" - title="{{'COMMENTS.COMMENT' | translate}}" - translate="COMMENTS.COMMENT" - ng-disabled="!vm.type.comment.length || vm.loading" - ng-click="vm.onAddComment()" - tg-loading="vm.loading" - ) diff --git a/app/modules/history/history-lightbox/history-entry.jade b/app/modules/history/history-lightbox/history-entry.jade index b3c5ca4a..80b7b3e8 100644 --- a/app/modules/history/history-lightbox/history-entry.jade +++ b/app/modules/history/history-lightbox/history-entry.jade @@ -15,5 +15,5 @@ ) .entry-text( ng-class="{'ellipsed': !displayFullEntry && entry.comment.length >= 75, 'blurry': entry.comment.length >= 75 && !displayFullEntry}" - ng-bind-html="entry.comment_html" + ng-bind-html="entry.comment | markdownToHTML" ) diff --git a/app/modules/history/history.controller.coffee b/app/modules/history/history.controller.coffee index d80a5ec0..de452840 100644 --- a/app/modules/history/history.controller.coffee +++ b/app/modules/history/history.controller.coffee @@ -72,7 +72,7 @@ class HistorySectionController @.deleting = commentId return @rs.history.deleteComment(type, objectId, activityId).then => @._loadHistory() - @.deleting = commentId + @.deleting = null editComment: (commentId, comment) -> type = @.name @@ -93,12 +93,10 @@ class HistorySectionController @._loadHistory() @.editing = null - addComment: () -> - type = @.type - @.loading = true + addComment: (cb) -> @repo.save(@.type).then => @._loadHistory() - @.loading = false + cb() onOrderComments: () -> @.reverse = !@.reverse diff --git a/app/modules/history/history.controller.spec.coffee b/app/modules/history/history.controller.spec.coffee index 2a97b2ca..69b70db5 100644 --- a/app/modules/history/history.controller.spec.coffee +++ b/app/modules/history/history.controller.spec.coffee @@ -149,12 +149,16 @@ describe "HistorySection", -> objectId = historyCtrl.id commentId = 7 - promise = mocks.tgResources.history.deleteComment.withArgs(type, objectId, commentId).promise().resolve() + deleteCommentPromise = mocks.tgResources.history.deleteComment.withArgs(type, objectId, commentId).promise() - historyCtrl.deleting = true - historyCtrl.deleteComment(commentId).then () -> + ctrlPromise = historyCtrl.deleteComment(commentId) + expect(historyCtrl.deleting).to.be.equal(7) + + deleteCommentPromise.resolve() + + ctrlPromise.then () -> expect(historyCtrl._loadHistory).have.been.called - expect(historyCtrl.deleting).to.be.equal(7) + expect(historyCtrl.deleting).to.be.null it "edit comment", () -> historyCtrl = controller "HistorySection" @@ -201,13 +205,15 @@ describe "HistorySection", -> historyCtrl.type = "type" type = historyCtrl.type - historyCtrl.loading = true + + cb = sinon.spy() promise = mocks.tgRepo.save.withArgs(type).promise().resolve() - historyCtrl.addComment().then () -> + historyCtrl.addComment(cb).then () -> expect(historyCtrl._loadHistory).has.been.called - expect(historyCtrl.loading).to.be.false + expect(cb).to.have.been.called + it "order comments", () -> historyCtrl = controller "HistorySection" diff --git a/app/modules/history/history.jade b/app/modules/history/history.jade index eaa9af8d..12ef2b08 100644 --- a/app/modules/history/history.jade +++ b/app/modules/history/history.jade @@ -18,8 +18,8 @@ section.history( on-delete-comment="vm.deleteComment(commentId)" on-restore-deleted-comment="vm.restoreDeletedComment(commentId)" on-edit-mode="vm.toggleEditMode(commentId)" - on-add-comment="vm.addComment()" - on-edit-comment="vm.editComment(commentId, commentData)" + on-add-comment="vm.addComment(callback)" + on-edit-comment="vm.editComment(commentId, commentData, callback)" edit-mode="vm.editMode" object="{{vm.id}}" diff --git a/app/partials/common/components/editable-description.jade b/app/partials/common/components/editable-description.jade deleted file mode 100644 index f5b9f095..00000000 --- a/app/partials/common/components/editable-description.jade +++ /dev/null @@ -1,15 +0,0 @@ -include wysiwyg.jade - -.view-description - section.us-content.wysiwyg(tg-bind-html="item.description_html || noDescriptionMsg") - tg-svg.edit(svg-icon="icon-edit") - -.edit-description - textarea(ng-attr-placeholder="{{'COMMON.DESCRIPTION.EMPTY' | translate}}", ng-model="item.description", tg-markitup="tg-markitup") - +wysihelp - div.save-container - span.save - tg-svg( - svg-icon="icon-save", - svg-title-translate="COMMON.SAVE" - ) diff --git a/app/partials/common/components/wysiwyg-toolbar.jade b/app/partials/common/components/wysiwyg-toolbar.jade new file mode 100644 index 00000000..af77eedd --- /dev/null +++ b/app/partials/common/components/wysiwyg-toolbar.jade @@ -0,0 +1,58 @@ +.editor(ng-class="{'edit-mode': editMode, 'read-mode': !editMode}") + div(ng-if="outdated") + p.outdated {{'COMMON.WYSIWYG.OUTDATED' | translate}} + + .medium.wysiwyg( + type="text", + ng-show="mode == 'html'" + ) + + textarea.markdown.e2e-markdown-textarea( + placeholder="{{placeholder}}" + ng-change="changeMarkdown()" + ng-model="markdown" + ng-show="mode == 'markdown' && editMode" + ) + + .markdown( + ng-class="{empty: !markdown.length}" + ng-click="editMode = true" + ng-show="mode == 'markdown' && !editMode" + ) + p(ng-if="markdown.length") {{markdown}} + p.markdown-editor-placeholder.wysiwyg(ng-if="!markdown.length") {{placeholder}} + + .mode-editor(ng-if="editMode") + span.e2e-markdown-mode( + ng-if="mode=='html'" + ng-click="setMode('markdown')" + ) Markdown Mode + + span.e2e-html-mode( + ng-if="mode=='markdown'" + ng-click="setMode('html')" + ) HTML Mode + + a.help-markdown( + ng-if="mode=='markdown'" + href="https://tree.taiga.io/support/misc/taiga-markdown-syntax/" + target="_blank" + title="{{'COMMON.WYSIWYG.MARKDOWN_HELP' | translate}}" + ) + tg-svg(svg-icon="icon-question") + span(translate="COMMON.WYSIWYG.MARKDOWN_HELP") + +.tools(ng-if="editMode") + a.e2e-save-editor( + ng-class="{disabled: required && !markdown.length}" + tg-loading="saving" + href="#", + ng-click="save()" + ) + tg-svg(svg-icon="icon-save") + a.e2e-cancel-editor( + href="#", + ng-click="cancel()" + title="{{ 'COMMON.CANCEL' | translate }}" + ) + tg-svg(svg-icon="icon-close") diff --git a/app/partials/common/components/wysiwyg.jade b/app/partials/common/components/wysiwyg.jade deleted file mode 100644 index f68d4467..00000000 --- a/app/partials/common/components/wysiwyg.jade +++ /dev/null @@ -1,11 +0,0 @@ -mixin wysihelp - .wysiwyg-help - span.drag-drop-help(ng-if="wiki.id", translate="COMMON.WYSIWYG.ATTACH_FILE_HELP") - span.drag-drop-help(ng-if="!wiki.id", translate="COMMON.WYSIWYG.ATTACH_FILE_HELP_SAVE_FIRST") - a.help-markdown( - href="https://tree.taiga.io/support/misc/taiga-markdown-syntax/" - target="_blank" - title="{{'COMMON.WYSIWYG.MARKDOWN_HELP' | translate}}" - ) - tg-svg(svg-icon="icon-question") - span(translate="COMMON.WYSIWYG.MARKDOWN_HELP") diff --git a/app/partials/epic/epic-detail.jade b/app/partials/epic/epic-detail.jade index 52bb688c..6f422b05 100644 --- a/app/partials/epic/epic-detail.jade +++ b/app/partials/epic/epic-detail.jade @@ -41,12 +41,12 @@ div.wrapper( ) tg-created-by-display.ticket-created-by(ng-model="epic") - section.duty-content( - tg-editable-description - tg-editable-wysiwyg - ng-model="epic" - required-perm="modify_epic" - ) + section.duty-content + tg-item-wysiwyg( + type="epic", + model="epic", + required-perm="modify_epic" + ) // Custom Fields tg-custom-attributes-values( diff --git a/app/partials/issue/issues-detail.jade b/app/partials/issue/issues-detail.jade index e85c9a3d..91a01ef1 100644 --- a/app/partials/issue/issues-detail.jade +++ b/app/partials/issue/issues-detail.jade @@ -33,13 +33,13 @@ div.wrapper( permissions="modify_issue" ) tg-created-by-display.ticket-created-by(ng-model="issue") - - section.duty-content( - tg-editable-description - tg-editable-wysiwyg - ng-model="issue" - required-perm="modify_issue" - ) + + section.duty-content + tg-item-wysiwyg( + type="issue", + model="issue", + required-perm="modify_issue" + ) // Custom Fields tg-custom-attributes-values( diff --git a/app/partials/task/task-detail.jade b/app/partials/task/task-detail.jade index 2a331a5b..3928cc08 100644 --- a/app/partials/task/task-detail.jade +++ b/app/partials/task/task-detail.jade @@ -43,7 +43,12 @@ div.wrapper( ) tg-created-by-display.ticket-created-by(ng-model="task") - section.duty-content(tg-editable-description, tg-editable-wysiwyg, ng-model="task", required-perm="modify_task") + section.duty-content + tg-item-wysiwyg( + type="task", + model="task", + required-perm="modify_task" + ) // Custom Fields tg-custom-attributes-values( diff --git a/app/partials/us/us-detail.jade b/app/partials/us/us-detail.jade index 6c04fb9f..be89305b 100644 --- a/app/partials/us/us-detail.jade +++ b/app/partials/us/us-detail.jade @@ -43,7 +43,12 @@ div.wrapper( ) tg-created-by-display.ticket-created-by(ng-model="us") - section.duty-content(tg-editable-description, tg-editable-wysiwyg, ng-model="us", required-perm="modify_us") + section.duty-content + tg-item-wysiwyg( + type="us", + model="us", + required-perm="modify_us" + ) // Custom Fields tg-custom-attributes-values( diff --git a/app/partials/wiki/editable-wiki-content.jade b/app/partials/wiki/editable-wiki-content.jade deleted file mode 100644 index 4f27d874..00000000 --- a/app/partials/wiki/editable-wiki-content.jade +++ /dev/null @@ -1,29 +0,0 @@ -include ../common/components/wysiwyg.jade - -.view-wiki-content - section.wysiwyg(tg-bind-html='wiki.html') - a.edit( - href="" - title="{{'COMMON.EDIT' | translate}}" - ) - tg-svg(svg-icon="icon-edit") - -.edit-wiki-content(style='display: none;') - textarea( - ng-attr-placeholder="{{'WIKI.PLACEHOLDER_PAGE' | translate}}", - ng-model='wiki.content' - tg-markitup='tg-markitup' - ) - +wysihelp - - span.action-container - a.save( - title="{{'COMMON.SAVE' | translate}}" - href="" - ) - tg-svg(svg-icon="icon-save") - a.cancel( - title="{{'COMMON.CANCEL' | translate}}" - href="" - ) - tg-svg(svg-icon="icon-close") diff --git a/app/partials/wiki/wiki.jade b/app/partials/wiki/wiki.jade index cde221a6..50a37af7 100644 --- a/app/partials/wiki/wiki.jade +++ b/app/partials/wiki/wiki.jade @@ -17,11 +17,8 @@ div.wrapper( span.green(translate="PROJECT.SECTION.WIKI") h2.wiki-title(ng-bind='wikiTitle') - section.wiki-content( - tg-editable-wysiwyg, - tg-editable-wiki-content, - ng-model="wiki" - ) + + tg-wiki-wysiwyg(model="wiki") .summary.wiki-summary( tg-wiki-summary diff --git a/app/styles/components/markitup.scss b/app/styles/components/markitup.scss deleted file mode 100644 index 59dc99a2..00000000 --- a/app/styles/components/markitup.scss +++ /dev/null @@ -1,42 +0,0 @@ -.markItUpHeader { - ul { - background: $mass-white; - padding: .3rem; - li { - display: inline-block; - float: none; - a { - opacity: .8; - &:hover { - opacity: .3; - transition: opacity .2s linear; - } - } - } - .preview-icon { - position: absolute; - right: 4rem; - } - } -} - -.markItUpContainer { - padding: 0; -} - -.markdown { - position: relative; -} - -.preview { - .actions { - background: $mass-white; - margin-top: .5rem; - min-height: 2rem; - padding: .3rem; - } - .content { - background: $white; - margin-bottom: 0; - } -} diff --git a/app/styles/extras/dependencies.scss b/app/styles/extras/dependencies.scss index 2d94ceff..7203c465 100644 --- a/app/styles/extras/dependencies.scss +++ b/app/styles/extras/dependencies.scss @@ -1,5 +1,5 @@ // Bourbon -@import '../../../vendor/bourbon/app/assets/stylesheets/bourbon'; +@import '../../../node_modules/bourbon/core/bourbon'; //################################################# // dependencies @@ -22,3 +22,13 @@ @import '../dependencies/mixins/svg'; @import '../dependencies/mixins/track-buttons'; @import '../dependencies/mixins/empty-color'; + +//deprecated +@mixin placeholder { + $placeholders: ":-webkit-input" ":-moz" "-moz" "-ms-input"; + @each $placeholder in $placeholders { + &:#{$placeholder}-placeholder { + @content; + } + } +} diff --git a/app/styles/layout/wiki.scss b/app/styles/layout/wiki.scss index 3930ca41..e1b26a37 100644 --- a/app/styles/layout/wiki.scss +++ b/app/styles/layout/wiki.scss @@ -10,73 +10,3 @@ padding: 1rem; } } - -.wiki-content { - @include font-size(large); - position: relative; - &.editable { - &:hover { - .wysiwyg { - background: $mass-white; - cursor: pointer; - } - } - } - .view-wiki-content { - &:hover { - .edit { - opacity: 1; - top: -1.5rem; - transition: all .2s linear; - } - } - } - .edit { - @include svg-size(2rem); - background: $mass-white; - left: 0; - opacity: 0; - padding: .2rem .5rem; - position: absolute; - top: 0; - transition: all .2s linear; - &:hover { - cursor: pointer; - } - } - .preview { - padding-top: 1.8rem; - } -} - -.edit-wiki-content { - a { - display: inline-block; - margin-right: .5rem; - &:last-child { - margin: 0; - } - &:hover { - cursor: pointer; - .icon { - fill: $primary-dark; - opacity: .3; - transition: all .2s linear; - } - } - } - .preview-icon { - position: absolute; - right: 3.5rem; - } - .action-container { - position: absolute; - right: 1rem; - top: .3rem; - } - .edit { - position: absolute; - right: 3.5rem; - top: .4rem; - } -} diff --git a/app/styles/vendor/markitup.css b/app/styles/vendor/markitup.css deleted file mode 100644 index 93a8a345..00000000 --- a/app/styles/vendor/markitup.css +++ /dev/null @@ -1,175 +0,0 @@ -/* ------------------------------------------------------------------- -// markItUp! -// By Jay Salvat - http://markitup.jaysalvat.com/ -// ------------------------------------------------------------------*/ -.markItUp .markItUpButton1 a { - background-image:url("../images/markitup/h1.png"); -} - -.markItUp .markItUpButton2 a { - background-image:url("../images/markitup/h2.png"); -} - -.markItUp .markItUpButton3 a { - background-image:url("../images/markitup/h3.png"); -} - -.markItUp .markItUpButton4 a { - background-image:url("../images/markitup/bold.png"); -} -.markItUp .markItUpButton5 a { - background-image:url("../images/markitup/italic.png"); -} - -.markItUp .markItUpButton6 a { - background-image:url("../images/markitup/stroke.png"); -} - -.markdown .markItUpButton7 a { - background-image:url("../images/markitup/list-bullet.png"); -} -.markdown .markItUpButton8 a { - background-image:url("../images/markitup/list-numeric.png"); -} - -.markdown .markItUpButton9 a { - background-image:url("../images/markitup/picture.png"); -} -.markdown .markItUpButton10 a { - background-image:url("../images/markitup/link.png"); -} - -.markdown .markItUpButton11 a { - background-image:url("../images/markitup/quotes.png"); -} -.markdown .markItUpButton12 a { - background-image:url("../images/markitup/code.png"); -} - -.markdown .preview-icon a { - background-image:url("../images/markitup/preview.png"); -} - -.markdown .help a { - background-image:url("../images/markitup/help.png"); -} - - -/* ------------------------------------------------------------------- -// markItUp! Universal MarkUp Engine, JQuery plugin -// By Jay Salvat - http://markitup.jaysalvat.com/ -// ------------------------------------------------------------------*/ -.markItUp * { - margin:0px; padding:0px; - outline:none; -} -.markItUp a:link, -.markItUp a:visited { - color:#000; - text-decoration:none; -} -.markItUpContainer { - padding:5px 5px 2px 5px; - font:11px Verdana, Arial, Helvetica, sans-serif; -} -.markItUpEditor { - font:12px 'Courier New', Courier, monospace; - padding:5px; - height:320px; - clear:both; - line-height:18px; - overflow:auto; -} -.markItUpPreviewFrame { - overflow:auto; - background-color:#FFF; - width:99.9%; - height:300px; - margin:5px 0; -} -.markItUpFooter { - width:100%; -} -.markItUpResizeHandle { - overflow:hidden; - width:22px; height:5px; - margin-left:auto; - margin-right:auto; - background-image:url(../images/markitup/handle.png); - cursor:n-resize; -} -/***************************************************************************************/ -/* first row of buttons */ -.markItUp .markItUpHeader ul { - margin: 0; -} -.markItUpHeader ul li { - list-style:none; - float:left; - position:relative; - margin: 3px; -} -.markItUpHeader ul li:hover > ul{ - display:block; -} -.markItUpHeader ul .markItUpDropMenu { - background:transparent url(../images/markitup/menu.png) no-repeat 115% 50%; - margin-right:5px; -} -.markItUpHeader ul .markItUpDropMenu li { - margin-right:0px; -} -/* next rows of buttons */ -.markItUpHeader ul ul { - display:none; - position:absolute; - top:18px; left:0px; - background:#FFF; - border:1px solid #000; -} -.markItUpHeader ul ul li { - float:none; - border-bottom:1px solid #000; -} -.markItUpHeader ul ul .markItUpDropMenu { - background:#FFF url(../images/markitup/submenu.png) no-repeat 100% 50%; -} -.markItUpHeader ul .markItUpSeparator { - margin:2px 10px 0 10px; - width:1px; - height:16px; - overflow:hidden; - background-color:#CCC; -} -.markItUpHeader ul ul .markItUpSeparator { - width:auto; height:1px; - margin:0px; -} -/* next rows of buttons */ -.markItUpHeader ul ul ul { - position:absolute; - top:-1px; left:150px; -} -.markItUpHeader ul ul ul li { - float:none; -} -.markItUpHeader ul a { - display:block; - width:16px; height:16px; - text-indent:-10000px; - background-repeat:no-repeat; - padding:3px; - margin:0px; -} -.markItUpHeader ul ul a { - display:block; - padding-left:0px; - text-indent:0; - width:120px; - padding:5px 5px 5px 25px; - background-position:2px 50%; -} -.markItUpHeader ul ul a:hover { - color:#FFF; - background-color:#000; -} diff --git a/bower.json b/bower.json deleted file mode 100644 index 80144e0f..00000000 --- a/bower.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "name": "taiga-layout", - "version": "2.1.0", - "homepage": "https://github.com/taiga.io/taiga-layout", - "authors": [ - { - "name": "Andrey Antukh", - "email": "niwi@niwi.nz" - }, - { - "name": "Jesus Espino Garcia", - "email": "jespinog@gmail.com" - }, - { - "name": "David Barragán Merino", - "email": "dbarragan@dbarragan.com" - }, - { - "name": "Xavi Julian", - "email": "xavier.julian@kaleidos.net" - }, - { - "name": "Alejandro Alonso", - "email": "alejandro.alonso@kaleidos.net" - }, - { - "name": "Anler Hernández", - "email": "hello@anler.me" - }, - { - "name": "Juan Francisco Alcántara", - "email": "juanfran.alcantara@kaleidos.net" - } - ], - "description": "Taiga project management system (frontend)", - "license": "AGPL-3.0", - "repository": { - "type": "git", - "url": "git@github.com:taigaio/taiga-front.git" - }, - "ignore": [ - "**/.*", - "node_modules", - "bower_components", - "app/vendor", - "test", - "tests" - ], - "dependencies": { - "emoticons": "~0.1.7", - "jquery-flot": "~0.8.2", - "angular": "1.5.5", - "angular-route": "1.5.5", - "angular-animate": "1.5.5", - "angular-aria": "1.5.5", - "angular-sanitize": "1.5.5", - "checksley": "~0.6.0", - "jquery": "~2.2.3", - "markitup-1x": "~1.1.14", - "jquery-textcomplete": "yuku-t/jquery-textcomplete#~0.7", - "flot-axislabels": "markrcote/flot-axislabels", - "flot-orderBars": "emmerich/flot-orderBars", - "flot.tooltip": "~0.8.4", - "moment": "~2.13.0", - "pikaday": "~1.4.0", - "raven-js": "~3.0.0", - "l.js": "~0.1.0", - "angular-translate": "~2.10.0", - "angular-translate-loader-partial": "~2.10.0", - "angular-translate-loader-static-files": "~2.10.0", - "angular-translate-interpolation-messageformat": "~2.10.0", - "ng-infinite-scroll-npm-is-better-than-bower": "^1.3.0", - "immutable": "~3.8.1", - "bluebird": "~3.3.5", - "intro.js": "~2.1.0", - "lodash": "~4.11.2", - "messageformat": "^0.3.1", - "dragula.js": "dragula#^3.6.6", - "bourbon": "^4.2.7" - }, - "resolutions": { - "lodash": "~4.11.2", - "moment": "~2.10.6", - "jquery": "~2.2.3", - "angular": "1.5.5", - "messageformat": "0.3.1", - "angular-translate": "2.10.0" - }, - "private": true -} diff --git a/e2e/helpers/detail-helper.js b/e2e/helpers/detail-helper.js index a315edbb..3051b6fd 100644 --- a/e2e/helpers/detail-helper.js +++ b/e2e/helpers/detail-helper.js @@ -146,24 +146,6 @@ helper.assignedTo = function() { return obj; }; -helper.editComment = function() { - let el = $('.comment-editor'); - let obj = { - el:el, - - updateText: function (text) { - el.$('textarea').sendKeys(text); - }, - - saveComment: async function () { - el.$('.save-comment').click(); - await browser.waitForAngular(); - } - } - return obj; - -}; - helper.history = function() { let el = $('section.history'); let obj = { @@ -179,16 +161,6 @@ helper.history = function() { await browser.waitForAngular(); }, - addComment: async function(comment) { - obj.writeComment(comment); - el.$('.save-comment').click(); - await browser.waitForAngular(); - }, - - writeComment: function(comment) { - el.$('textarea[tg-markitup]').sendKeys(comment); - }, - countComments: async function() { let comments = await el.$$(".comment-wrapper"); return comments.length; @@ -227,6 +199,10 @@ helper.history = function() { await browser.waitForAngular(); }, + getComments: function() { + return $$('tg-comment'); + }, + showVersionsLastComment: async function() { el.$$(".comment-edited a").last().click(); await browser.waitForAngular(); @@ -252,11 +228,11 @@ helper.history = function() { el.$$(".deleted-comment-wrapper .restore-comment").last().click(); await browser.waitForAngular(); } - } + }; return obj; -} +}; helper.block = function() { let el = $('tg-block-button'); diff --git a/e2e/shared/detail.js b/e2e/shared/detail.js index 364813c5..a1240b1e 100644 --- a/e2e/shared/detail.js +++ b/e2e/shared/detail.js @@ -6,6 +6,7 @@ var customFieldsHelper = require('../helpers/custom-fields-helper'); var commonUtil = require('../utils/common'); var lightbox = require('../utils/lightbox'); var notifications = require('../utils/notifications'); +var sharedWysiwyg = require('./wysiwyg').wysiwygTesting; var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); @@ -48,49 +49,6 @@ shared.tagsTesting = async function() { expect(newtagsText).to.be.not.eql(tagsText); } -shared.descriptionTesting = function() { - it('confirm close with ESC', async function() { - let descriptionHelper = detailHelper.description(); - - descriptionHelper.enabledEditionMode(); - - browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); - - await lightbox.confirm.cancel(); - - let descriptionVisibility = await $('.edit-description').isDisplayed(); - - expect(descriptionVisibility).to.be.true; - - descriptionHelper.focus(); - - browser.actions().sendKeys(protractor.Key.ESCAPE).perform(); - - await lightbox.confirm.ok(); - - descriptionVisibility = await $('.edit-description').isDisplayed(); - - expect(descriptionVisibility).to.be.false; - }); - - it('edit', async function() { - let descriptionHelper = detailHelper.description(); - let description = await descriptionHelper.getInnerHtml(); - let date = Date.now(); - descriptionHelper.enabledEditionMode(); - descriptionHelper.setText("New description " + date); - descriptionHelper.save(); - - let newDescription = await descriptionHelper.getInnerHtml(); - let notificationOpen = await notifications.success.open(); - - expect(notificationOpen).to.be.equal.true; - expect(newDescription).to.be.not.equal(description); - - await notifications.success.close(); - }); -} - shared.statusTesting = async function(status1 , status2) { let statusHelper = detailHelper.statusSelector(); @@ -195,68 +153,9 @@ shared.assignedToTesting = function() { shared.historyTesting = async function(screenshotsFolder) { let historyHelper = detailHelper.history(); - - //Adding a comment - historyHelper.selectCommentsTab(); - await utils.common.takeScreenshot(screenshotsFolder, "show comments tab"); - - let commentsCounter = await historyHelper.countComments(); - let date = Date.now(); - - await historyHelper.addComment("New comment " + date); - await utils.common.takeScreenshot(screenshotsFolder, "new coment"); - - let newCommentsCounter = await historyHelper.countComments(); - expect(newCommentsCounter).to.be.equal(commentsCounter+1); - - //Edit last comment - historyHelper.editLastComment(); - let editComment = detailHelper.editComment(); - editComment.updateText("This is the new and updated text"); - editComment.saveComment(); - await utils.common.takeScreenshot(screenshotsFolder, "edit comment"); - - //Show versions from last comment edited - historyHelper.showVersionsLastComment(); - await utils.common.takeScreenshot(screenshotsFolder, "show comment versions"); - - historyHelper.closeVersionsLastComment(); - - //Deleting last comment - let deletedCommentsCounter = await historyHelper.countDeletedComments(); - await historyHelper.deleteLastComment(); - - let newDeletedCommentsCounter = await historyHelper.countDeletedComments(); - expect(newDeletedCommentsCounter).to.be.equal(deletedCommentsCounter+1); - await utils.common.takeScreenshot(screenshotsFolder, "deleted comment"); - - //Restore last comment - deletedCommentsCounter = await historyHelper.countDeletedComments(); - await historyHelper.restoreLastComment(); - newDeletedCommentsCounter = await historyHelper.countDeletedComments(); - expect(newDeletedCommentsCounter).to.be.equal(deletedCommentsCounter-1); - await utils.common.takeScreenshot(screenshotsFolder, "restored comment"); - - //Store comment with a modification - commentsCounter = await historyHelper.countComments(); - - historyHelper.writeComment("New comment " + date); - let title = detailHelper.title(); - title.setTitle('changed'); - await title.save(); - await utils.notifications.success.close(); - - newCommentsCounter = await historyHelper.countComments(); - - expect(newCommentsCounter).to.be.equal(commentsCounter+1); - //Check activity await historyHelper.selectActivityTab(); await utils.common.takeScreenshot(screenshotsFolder, "show activity tab"); - - let activitiesCounter = await historyHelper.countActivities(); - - expect(newCommentsCounter).to.be.least(1); } shared.blockTesting = async function() { diff --git a/e2e/shared/wysiwyg.js b/e2e/shared/wysiwyg.js new file mode 100644 index 00000000..db9c012c --- /dev/null +++ b/e2e/shared/wysiwyg.js @@ -0,0 +1,500 @@ +var chai = require('chai'); +var chaiAsPromised = require('chai-as-promised'); + +var detailHelper = require('../helpers').detail; +var historyHelper = detailHelper.history(); + +var utils = require('../utils'); +var EC = protractor.ExpectedConditions; + +chai.use(chaiAsPromised); +var expect = chai.expect; + +var shared = module.exports; + +function selectEditorFirstChild(elm) { + browser.executeScript(function () { + // select the first paragraph + var range = document.createRange(); + range.selectNode(arguments[0].firstChild); + + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + }, elm.getWebElement()); + + browser.actions().mouseUp().perform(); // trigger medium events +} + +function resetSelection() { + browser.executeScript(function () { + var sel = window.getSelection(); + sel.removeAllRanges(); + }); + + browser.actions().mouseUp().perform(); // trigger medium events +} + +function getMarkdownText(elm) { + var markdownTextarea = getMarkdownTextarea(elm); + + return markdownTextarea.getAttribute("value"); +} + +function getMarkdownTextarea(elm) { + return elm.$('.e2e-markdown-textarea');} + + +function htmlMode() { + $('.e2e-html-mode').click(); +} + +function markdownMode() { + $('.e2e-markdown-mode').click(); +} + +function saveEdition() { + $('.e2e-save-editor').click(); +} + +function cancelEdition(elm) { + $('.e2e-cancel-editor').click(); + + return browser.wait(async () => { + return !!await elm.$$('.read-mode').count(); + }, 3000); +} + +async function edit(elm, elmWrapper, text = null) { + await browser.wait(EC.elementToBeClickable(elm), 10000); + + elm.click(); + + browser.sleep(200); + + browser.executeScript(function () { + if(arguments[0].firstChild) { + var range = document.createRange(); + range.setStart(arguments[0].firstChild, 0); + range.setEnd(arguments[0].lastChild, 0); + + var sel = window.getSelection(); + sel.removeAllRanges(); + sel.addRange(range); + } + }, elm.getWebElement()); + + if (text !== null) { + await cleanWysiwyg(elm, elmWrapper); + + return elm.sendKeys(text); + } +} + +async function cleanWysiwyg(elm, elmWrapper) { + let isHtmlMode = await elm.isDisplayed(); + + if (isHtmlMode) { + let isPresent = await $('.e2e-markdown-mode').isPresent(); + + markdownMode(); + } + var markdownTextarea = getMarkdownTextarea(elmWrapper); + + await utils.common.clear(markdownTextarea); + + return htmlMode(); +} + +shared.wysiwygTestingComments = function(parentSelector, section) { + var editor; + var editorWrapper; + + beforeEach(() => { + let parent = $(parentSelector); + editor = parent.$('.medium'); + editorWrapper = parent.$('tg-wysiwyg'); + }); + + it('bold, test normal behavior and check markdown', async () => { + let commentsCounter = await historyHelper.countComments(); + + await edit(editor, editorWrapper, "test"); + selectEditorFirstChild(editor); + + $('.medium-editor-toolbar-active .medium-editor-action-bold').click(); + + resetSelection(); + + markdownMode(); + + let markdown = await getMarkdownText(editorWrapper); + + expect(markdown).to.be.equal('**test**'); + + htmlMode(); + + saveEdition(); + + let newCommentsCounter = await historyHelper.countComments(); + expect(newCommentsCounter).to.be.equal(commentsCounter+1); + }); + + it('convert to html', async () => { + let commentsCounter = await historyHelper.countComments(); + + await edit(editor, editorWrapper, ''); + + markdownMode(); + + let markdownTextarea = getMarkdownTextarea(editorWrapper); + + await markdownTextarea.sendKeys('_test2_'); + + htmlMode(); + + let html = await editor.getInnerHtml(); + + expect(html).to.be.eql('

    test2

    \n'); + + saveEdition(); + + let newCommentsCounter = await historyHelper.countComments(); + expect(newCommentsCounter).to.be.equal(commentsCounter+1); + }); + + it('code block', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys("var test = 2;"); + + selectEditorFirstChild(editor); + + $('.medium-editor-toolbar-active .medium-editor-button-last').click(); + + $('.code-language-selector').click(); + $('.code-language-search input').sendKeys('javascript'); + $('.code-language-search li').click(); + + saveEdition(); + + let lastComment = historyHelper.getComments().last(); + + let hasHightlighter = !!await lastComment.$$('.token').count(); + + expect(hasHightlighter).to.be.true; + }); + + it('confirm exit when there is changes', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys('text text text'); + editor.sendKeys(protractor.Key.ESCAPE); + + await utils.lightbox.confirm.ok(); + + let isReadMode = !!await editorWrapper.$$('.read-mode').count(); + + expect(isReadMode).to.be.true; + + let html = await editor.getText(); + + expect(html).not.to.be.eql('text text text'); + }); + + it('keep changes on reload', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys('text text text'); + editor.sendKeys(protractor.Key.ESCAPE); + + browser.sleep(400); + browser.refresh(); + + let isReadMode = !!await editorWrapper.$$('.read-mode').count(); + + expect(isReadMode).to.be.false; + + let html = await editor.getText(); + + expect(html).to.be.eql('text text text'); + + await cancelEdition(editorWrapper); + }); + + it('mention user', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys('@use'); + + $$('.medium-mention li').get(2).click(); + + let html = await editor.getInnerHtml(); + + expect(html).to.be.eql('

    @user8 

    '); + + markdownMode(); + + let markdown = await getMarkdownText(editorWrapper); + + expect(markdown).to.be.equal('[@user8](/profile/user8)'); + + htmlMode(); + + await cancelEdition(editorWrapper); + }); + + it('emojis', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys(':smil'); + + $$('.medium-mention li').get(2).click(); + + let html = await editor.getInnerHtml(); + + expect(html).to.include('1f604.png'); + + markdownMode(); + + let markdown = await getMarkdownText(editorWrapper); + + expect(markdown).to.be.equal(':smile:'); + + htmlMode(); + + await cancelEdition(editorWrapper); + }); + + it('cancel', async () => { + let prevHtml = await editor.getInnerHtml(); + + await edit(editor, editorWrapper, 'xxx yyy zzz'); + + await cancelEdition(editorWrapper); + + let html = await editor.getInnerHtml(); + + expect(html).to.be.equal(prevHtml); + }); + + it('edit comment', async () => { + historyHelper.editLastComment(); + + let editWrapperLast = historyHelper.getComments().last(); + let editLast = editWrapperLast.$('.medium'); + + await edit(editLast, editWrapperLast, "This is the new and updated text"); + await utils.common.takeScreenshot(section, "edit comment"); + + saveEdition(); + + //Show versions from last comment edited + historyHelper.showVersionsLastComment(); + await utils.common.takeScreenshot(section, "show comment versions"); + + historyHelper.closeVersionsLastComment(); + }); + + it('delete last comment', async () => { + let deletedCommentsCounter = await historyHelper.countDeletedComments(); + await historyHelper.deleteLastComment(); + + let newDeletedCommentsCounter = await historyHelper.countDeletedComments(); + + expect(newDeletedCommentsCounter).to.be.equal(deletedCommentsCounter+1); + + await utils.common.takeScreenshot(section, 'deleted comment'); + }); + + it('restore last comment', async () => { + let deletedCommentsCounter = await historyHelper.countDeletedComments(); + + await historyHelper.restoreLastComment(); + + let newDeletedCommentsCounter = await historyHelper.countDeletedComments(); + + expect(newDeletedCommentsCounter).to.be.equal(deletedCommentsCounter-1); + + await utils.common.takeScreenshot(section, 'restored comment'); + }); +}; + +shared.wysiwygTesting = function(parentSelector) { + var editor; + var editorWrapper; + + beforeEach(async () => { + let isReadMode = !!await editorWrapper.$$('.read-mode').count(); + + if (isReadMode) { + editor.click(); + } + + await cleanWysiwyg(editor, editorWrapper); + + markdownMode(); + + var markdownTextarea = getMarkdownTextarea(editorWrapper); + + browser.wait(EC.elementToBeClickable(markdownTextarea), 10000); + + await markdownTextarea.sendKeys('test'); + + htmlMode(); + + saveEdition(); + + await browser.wait(EC.elementToBeClickable(editor), 10000); + }); + + before(() => { + let parent = $(parentSelector); + editor = parent.$('.medium'); + editorWrapper = parent.$('tg-wysiwyg'); + }); + + it('bold, test normal behavior and check markdown', async () => { + await edit(editor, editorWrapper, "test"); + selectEditorFirstChild(editor); + + $('.medium-editor-toolbar-active .medium-editor-action-bold').click(); + + resetSelection(); + + let html = await editor.getInnerHtml(); + + expect(html).to.be.eql('

    test

    '); + + saveEdition(); + + await edit(editor, editorWrapper); + + markdownMode(); + + let markdown = await getMarkdownText(editorWrapper); + + expect(markdown).to.be.equal('**test**'); + }); + + it('convert to html', async () => { + await edit(editor, editorWrapper, ''); + + markdownMode(); + + let markdownTextarea = getMarkdownTextarea(editorWrapper); + + await markdownTextarea.sendKeys('_test2_'); + + htmlMode(); + + let html = await editor.getInnerHtml(); + + expect(html).to.be.eql('

    test2

    \n'); + }); + + it('code block', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys("var test = 2;"); + + selectEditorFirstChild(editor); + + $('.medium-editor-toolbar-active .medium-editor-button-last').click(); + + $('.code-language-selector').click(); + $('.code-language-search input').sendKeys('javascript'); + $('.code-language-search li').click(); + + saveEdition(); + + let hasHightlighter = !!await editor.$$('.token').count(); + + expect(hasHightlighter).to.be.true; + }); + + it('save with confirmconfirm exit when there is changes', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys('text text text'); + editor.sendKeys(protractor.Key.ESCAPE); + + await utils.lightbox.confirm.ok(); + + let isReadMode = !!await editorWrapper.$$('.read-mode').count(); + + expect(isReadMode).to.be.true; + + let html = await editor.getText(); + + expect(html).not.to.be.eql('text text text'); + }); + + it('keep changes on reload', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys('text text text'); + editor.sendKeys(protractor.Key.ESCAPE); + + browser.sleep(400); + browser.refresh(); + + let isReadMode = !!await editorWrapper.$$('.read-mode').count(); + + expect(isReadMode).to.be.false; + + let html = await editor.getText(); + + expect(html).to.be.eql('text text text'); + }); + + it('mention user', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys('@use'); + + $$('.medium-mention li').get(2).click(); + + let html = await editor.getInnerHtml(); + + expect(html).to.be.eql('

    @user8 

    '); + + markdownMode(); + + let markdown = await getMarkdownText(editorWrapper); + + expect(markdown).to.be.equal('[@user8](/profile/user8)'); + + htmlMode(); + }); + + it('emojis', async () => { + await edit(editor, editorWrapper, ''); + + editor.sendKeys(':smil'); + + $$('.medium-mention li').get(2).click(); + + let html = await editor.getInnerHtml(); + + expect(html).to.include('1f604.png'); + + markdownMode(); + + let markdown = await getMarkdownText(editorWrapper); + + expect(markdown).to.be.equal(':smile:'); + }); + + it('cancel', async () => { + let prevHtml = await editor.getInnerHtml(); + + await edit(editor, editorWrapper, 'xxx yyy zzz'); + + await cancelEdition(editorWrapper); + + let html = await editor.getInnerHtml(); + + expect(html).to.be.equal(prevHtml); + }); +}; diff --git a/e2e/suites/epics/epic-detail.e2e.js b/e2e/suites/epics/epic-detail.e2e.js index 66c5e34a..4db310b6 100644 --- a/e2e/suites/epics/epic-detail.e2e.js +++ b/e2e/suites/epics/epic-detail.e2e.js @@ -1,6 +1,9 @@ var utils = require('../../utils'); var sharedDetail = require('../../shared/detail'); var epicDetailHelper = require('../../helpers').epicDetail; +var wysiwyg = require('../../shared/wysiwyg'); +var sharedWysiwyg = wysiwyg.wysiwygTesting; +var sharedWysiwygComments = wysiwyg.wysiwygTestingComments; var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); @@ -39,7 +42,7 @@ describe('Epic detail', async function(){ it('tags edition', sharedDetail.tagsTesting); - describe('description', sharedDetail.descriptionTesting); + describe('description', sharedWysiwyg.bind(this, '.duty-content')); describe('related userstories', function() { let relatedUserstories = epicDetailHelper.relatedUserstories(); @@ -68,6 +71,8 @@ describe('Epic detail', async function(){ it('history', sharedDetail.historyTesting.bind(this, "epics")); + describe('comments epics', sharedWysiwygComments.bind(this, '.comments', 'epics')); + it('block', sharedDetail.blockTesting); describe('team requirement edition', sharedDetail.teamRequirementTesting); diff --git a/e2e/suites/issues/issue-detail.e2e.js b/e2e/suites/issues/issue-detail.e2e.js index 352d6615..e76fb3da 100644 --- a/e2e/suites/issues/issue-detail.e2e.js +++ b/e2e/suites/issues/issue-detail.e2e.js @@ -1,5 +1,8 @@ var utils = require('../../utils'); var sharedDetail = require('../../shared/detail'); +var wysiwyg = require('../../shared/wysiwyg'); +var sharedWysiwyg = wysiwyg.wysiwygTesting; +var sharedWysiwygComments = wysiwyg.wysiwygTestingComments; var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); @@ -29,7 +32,7 @@ describe('Issue detail', async function(){ it('tags edition', sharedDetail.tagsTesting); - describe('description', sharedDetail.descriptionTesting); + describe('description', sharedWysiwyg.bind(this, '.duty-content')); it('status edition', sharedDetail.statusTesting.bind(this, 'In progress', 'Ready for test')); @@ -39,6 +42,8 @@ describe('Issue detail', async function(){ it('history', sharedDetail.historyTesting.bind(this, "issues")); + describe('comments issue', sharedWysiwygComments.bind(this, '.comments', 'issues')); + it('block', sharedDetail.blockTesting); it('attachments', sharedDetail.attachmentTesting); diff --git a/e2e/suites/tasks/task-detail.e2e.js b/e2e/suites/tasks/task-detail.e2e.js index 10389c00..f5955513 100644 --- a/e2e/suites/tasks/task-detail.e2e.js +++ b/e2e/suites/tasks/task-detail.e2e.js @@ -1,6 +1,9 @@ var utils = require('../../utils'); var sharedDetail = require('../../shared/detail'); var taskDetailHelper = require('../../helpers').taskDetail; +var wysiwyg = require('../../shared/wysiwyg'); +var sharedWysiwyg = wysiwyg.wysiwygTesting; +var sharedWysiwygComments = wysiwyg.wysiwygTestingComments; var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); @@ -31,7 +34,7 @@ describe('Task detail', function(){ it('tags edition', sharedDetail.tagsTesting); - describe('description', sharedDetail.descriptionTesting); + describe('description', sharedWysiwyg.bind(this, '.duty-content')); it('status edition', sharedDetail.statusTesting.bind(this, 'In progress', 'Ready for test')); @@ -55,6 +58,8 @@ describe('Task detail', function(){ it('history', sharedDetail.historyTesting.bind(this, "tasks")); + describe('comments task', sharedWysiwygComments.bind(this, '.comments', 'tasks')); + it('block', sharedDetail.blockTesting); it('attachments', sharedDetail.attachmentTesting); diff --git a/e2e/suites/user-stories/user-story-detail.e2e.js b/e2e/suites/user-stories/user-story-detail.e2e.js index 1a7d28af..a280e2d9 100644 --- a/e2e/suites/user-stories/user-story-detail.e2e.js +++ b/e2e/suites/user-stories/user-story-detail.e2e.js @@ -1,6 +1,9 @@ var utils = require('../../utils'); var sharedDetail = require('../../shared/detail'); var usDetailHelper = require('../../helpers').usDetail; +var wysiwyg = require('../../shared/wysiwyg'); +var sharedWysiwyg = wysiwyg.wysiwygTesting; +var sharedWysiwygComments = wysiwyg.wysiwygTestingComments; var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); @@ -30,7 +33,7 @@ describe('User story detail', function(){ it('tags edition', sharedDetail.tagsTesting); - describe('description', sharedDetail.descriptionTesting); + describe('description', sharedWysiwyg.bind(this, '.duty-content')); it('status edition', sharedDetail.statusTesting.bind(this, 'Ready', 'In progress')); @@ -44,6 +47,8 @@ describe('User story detail', function(){ it('history', sharedDetail.historyTesting.bind(this, "user-stories")); + describe('comments us', sharedWysiwygComments.bind(this, '.comments', 'issues')); + it('block', sharedDetail.blockTesting); it('attachments', sharedDetail.attachmentTesting); diff --git a/e2e/suites/wiki.e2e.js b/e2e/suites/wiki.e2e.js index 4f9b6e48..3206047c 100644 --- a/e2e/suites/wiki.e2e.js +++ b/e2e/suites/wiki.e2e.js @@ -1,6 +1,7 @@ var utils = require('../utils'); var sharedDetail = require('../shared/detail'); var wikiHelper = require('../helpers').wiki; +var sharedWysiwyg = require('../shared/wysiwyg').wysiwygTesting; var chai = require('chai'); var chaiAsPromised = require('chai-as-promised'); @@ -64,30 +65,7 @@ describe('wiki', function() { await utils.common.takeScreenshot("wiki", "deleting-the-created-link"); }); - it('edition', async function() { - let timesEdited = wikiHelper.editor().getTimesEdited(); - let lastEditionDatetime = wikiHelper.editor().getLastEditionDateTime(); - wikiHelper.editor().enabledEditionMode(); - let settingText = "This is the new text" + new Date().getTime(); - wikiHelper.editor().setText(settingText); - - //preview - wikiHelper.editor().preview(); - await utils.common.takeScreenshot("wiki", "home-edition-preview"); - wikiHelper.editor().closePreview(); - - //save - wikiHelper.editor().save(); - let newHtml = await wikiHelper.editor().getInnerHtml(); - let newTimesEdited = wikiHelper.editor().getTimesEdited(); - let newLastEditionDatetime = wikiHelper.editor().getLastEditionDateTime(); - - expect(newHtml).to.be.equal("

    " + settingText + "

    "); - expect(newTimesEdited).to.be.eventually.equal(timesEdited+1); - expect(newLastEditionDatetime).to.be.not.equal(lastEditionDatetime); - - await utils.common.takeScreenshot("wiki", "home-edition"); - }); + describe('wiki editor', sharedWysiwyg.bind(this)); it('confirm close with ESC in lightbox', async function() { wikiHelper.editor().enabledEditionMode(); diff --git a/emojis/0023-20e3.png b/emojis/0023-20e3.png new file mode 100644 index 00000000..66e39204 Binary files /dev/null and b/emojis/0023-20e3.png differ diff --git a/emojis/002a-20e3.png b/emojis/002a-20e3.png new file mode 100644 index 00000000..200b3565 Binary files /dev/null and b/emojis/002a-20e3.png differ diff --git a/emojis/0030-20e3.png b/emojis/0030-20e3.png new file mode 100644 index 00000000..ecd15380 Binary files /dev/null and b/emojis/0030-20e3.png differ diff --git a/emojis/0031-20e3.png b/emojis/0031-20e3.png new file mode 100644 index 00000000..3d2c5ffa Binary files /dev/null and b/emojis/0031-20e3.png differ diff --git a/emojis/0032-20e3.png b/emojis/0032-20e3.png new file mode 100644 index 00000000..60191741 Binary files /dev/null and b/emojis/0032-20e3.png differ diff --git a/emojis/0033-20e3.png b/emojis/0033-20e3.png new file mode 100644 index 00000000..f9f679c9 Binary files /dev/null and b/emojis/0033-20e3.png differ diff --git a/emojis/0034-20e3.png b/emojis/0034-20e3.png new file mode 100644 index 00000000..f01e704c Binary files /dev/null and b/emojis/0034-20e3.png differ diff --git a/emojis/0035-20e3.png b/emojis/0035-20e3.png new file mode 100644 index 00000000..f385a072 Binary files /dev/null and b/emojis/0035-20e3.png differ diff --git a/emojis/0036-20e3.png b/emojis/0036-20e3.png new file mode 100644 index 00000000..d370688d Binary files /dev/null and b/emojis/0036-20e3.png differ diff --git a/emojis/0037-20e3.png b/emojis/0037-20e3.png new file mode 100644 index 00000000..aec7df37 Binary files /dev/null and b/emojis/0037-20e3.png differ diff --git a/emojis/0038-20e3.png b/emojis/0038-20e3.png new file mode 100644 index 00000000..a2379d79 Binary files /dev/null and b/emojis/0038-20e3.png differ diff --git a/emojis/0039-20e3.png b/emojis/0039-20e3.png new file mode 100644 index 00000000..e718c0e7 Binary files /dev/null and b/emojis/0039-20e3.png differ diff --git a/emojis/1f004.png b/emojis/1f004.png new file mode 100644 index 00000000..04348650 Binary files /dev/null and b/emojis/1f004.png differ diff --git a/emojis/1f0cf.png b/emojis/1f0cf.png new file mode 100644 index 00000000..683141f3 Binary files /dev/null and b/emojis/1f0cf.png differ diff --git a/emojis/1f170.png b/emojis/1f170.png new file mode 100644 index 00000000..f3b77292 Binary files /dev/null and b/emojis/1f170.png differ diff --git a/emojis/1f171.png b/emojis/1f171.png new file mode 100644 index 00000000..aac0ecd1 Binary files /dev/null and b/emojis/1f171.png differ diff --git a/emojis/1f17e.png b/emojis/1f17e.png new file mode 100644 index 00000000..5b594b5f Binary files /dev/null and b/emojis/1f17e.png differ diff --git a/emojis/1f17f.png b/emojis/1f17f.png new file mode 100644 index 00000000..272caa47 Binary files /dev/null and b/emojis/1f17f.png differ diff --git a/emojis/1f18e.png b/emojis/1f18e.png new file mode 100644 index 00000000..1fb4aa22 Binary files /dev/null and b/emojis/1f18e.png differ diff --git a/emojis/1f191.png b/emojis/1f191.png new file mode 100644 index 00000000..dcd1c68b Binary files /dev/null and b/emojis/1f191.png differ diff --git a/emojis/1f192.png b/emojis/1f192.png new file mode 100644 index 00000000..267ff9e5 Binary files /dev/null and b/emojis/1f192.png differ diff --git a/emojis/1f193.png b/emojis/1f193.png new file mode 100644 index 00000000..db0d1f22 Binary files /dev/null and b/emojis/1f193.png differ diff --git a/emojis/1f194.png b/emojis/1f194.png new file mode 100644 index 00000000..ac05e00d Binary files /dev/null and b/emojis/1f194.png differ diff --git a/emojis/1f195.png b/emojis/1f195.png new file mode 100644 index 00000000..5adfbcf0 Binary files /dev/null and b/emojis/1f195.png differ diff --git a/emojis/1f196.png b/emojis/1f196.png new file mode 100644 index 00000000..260e8c47 Binary files /dev/null and b/emojis/1f196.png differ diff --git a/emojis/1f197.png b/emojis/1f197.png new file mode 100644 index 00000000..becc64cc Binary files /dev/null and b/emojis/1f197.png differ diff --git a/emojis/1f198.png b/emojis/1f198.png new file mode 100644 index 00000000..e35fefd2 Binary files /dev/null and b/emojis/1f198.png differ diff --git a/emojis/1f199.png b/emojis/1f199.png new file mode 100644 index 00000000..a4e63b1e Binary files /dev/null and b/emojis/1f199.png differ diff --git a/emojis/1f19a.png b/emojis/1f19a.png new file mode 100644 index 00000000..51c077d7 Binary files /dev/null and b/emojis/1f19a.png differ diff --git a/emojis/1f1e6-1f1e8.png b/emojis/1f1e6-1f1e8.png new file mode 100644 index 00000000..6e6e3caf Binary files /dev/null and b/emojis/1f1e6-1f1e8.png differ diff --git a/emojis/1f1e6-1f1e9.png b/emojis/1f1e6-1f1e9.png new file mode 100644 index 00000000..76ea6e0a Binary files /dev/null and b/emojis/1f1e6-1f1e9.png differ diff --git a/emojis/1f1e6-1f1ea.png b/emojis/1f1e6-1f1ea.png new file mode 100644 index 00000000..0e0c9da0 Binary files /dev/null and b/emojis/1f1e6-1f1ea.png differ diff --git a/emojis/1f1e6-1f1eb.png b/emojis/1f1e6-1f1eb.png new file mode 100644 index 00000000..f478d275 Binary files /dev/null and b/emojis/1f1e6-1f1eb.png differ diff --git a/emojis/1f1e6-1f1ec.png b/emojis/1f1e6-1f1ec.png new file mode 100644 index 00000000..1be16c60 Binary files /dev/null and b/emojis/1f1e6-1f1ec.png differ diff --git a/emojis/1f1e6-1f1ee.png b/emojis/1f1e6-1f1ee.png new file mode 100644 index 00000000..065229e1 Binary files /dev/null and b/emojis/1f1e6-1f1ee.png differ diff --git a/emojis/1f1e6-1f1f1.png b/emojis/1f1e6-1f1f1.png new file mode 100644 index 00000000..a9eefd05 Binary files /dev/null and b/emojis/1f1e6-1f1f1.png differ diff --git a/emojis/1f1e6-1f1f2.png b/emojis/1f1e6-1f1f2.png new file mode 100644 index 00000000..0bb112b9 Binary files /dev/null and b/emojis/1f1e6-1f1f2.png differ diff --git a/emojis/1f1e6-1f1f4.png b/emojis/1f1e6-1f1f4.png new file mode 100644 index 00000000..9a928da3 Binary files /dev/null and b/emojis/1f1e6-1f1f4.png differ diff --git a/emojis/1f1e6-1f1f6.png b/emojis/1f1e6-1f1f6.png new file mode 100644 index 00000000..c2b3f928 Binary files /dev/null and b/emojis/1f1e6-1f1f6.png differ diff --git a/emojis/1f1e6-1f1f7.png b/emojis/1f1e6-1f1f7.png new file mode 100644 index 00000000..3a98a614 Binary files /dev/null and b/emojis/1f1e6-1f1f7.png differ diff --git a/emojis/1f1e6-1f1f8.png b/emojis/1f1e6-1f1f8.png new file mode 100644 index 00000000..461dd422 Binary files /dev/null and b/emojis/1f1e6-1f1f8.png differ diff --git a/emojis/1f1e6-1f1f9.png b/emojis/1f1e6-1f1f9.png new file mode 100644 index 00000000..eaee0df4 Binary files /dev/null and b/emojis/1f1e6-1f1f9.png differ diff --git a/emojis/1f1e6-1f1fa.png b/emojis/1f1e6-1f1fa.png new file mode 100644 index 00000000..686b2438 Binary files /dev/null and b/emojis/1f1e6-1f1fa.png differ diff --git a/emojis/1f1e6-1f1fc.png b/emojis/1f1e6-1f1fc.png new file mode 100644 index 00000000..241589fc Binary files /dev/null and b/emojis/1f1e6-1f1fc.png differ diff --git a/emojis/1f1e6-1f1fd.png b/emojis/1f1e6-1f1fd.png new file mode 100644 index 00000000..220a61bf Binary files /dev/null and b/emojis/1f1e6-1f1fd.png differ diff --git a/emojis/1f1e6-1f1ff.png b/emojis/1f1e6-1f1ff.png new file mode 100644 index 00000000..6246b5db Binary files /dev/null and b/emojis/1f1e6-1f1ff.png differ diff --git a/emojis/1f1e7-1f1e6.png b/emojis/1f1e7-1f1e6.png new file mode 100644 index 00000000..04bf6084 Binary files /dev/null and b/emojis/1f1e7-1f1e6.png differ diff --git a/emojis/1f1e7-1f1e7.png b/emojis/1f1e7-1f1e7.png new file mode 100644 index 00000000..71727feb Binary files /dev/null and b/emojis/1f1e7-1f1e7.png differ diff --git a/emojis/1f1e7-1f1e9.png b/emojis/1f1e7-1f1e9.png new file mode 100644 index 00000000..f18a7e0b Binary files /dev/null and b/emojis/1f1e7-1f1e9.png differ diff --git a/emojis/1f1e7-1f1ea.png b/emojis/1f1e7-1f1ea.png new file mode 100644 index 00000000..bebd1108 Binary files /dev/null and b/emojis/1f1e7-1f1ea.png differ diff --git a/emojis/1f1e7-1f1eb.png b/emojis/1f1e7-1f1eb.png new file mode 100644 index 00000000..7da4ae86 Binary files /dev/null and b/emojis/1f1e7-1f1eb.png differ diff --git a/emojis/1f1e7-1f1ec.png b/emojis/1f1e7-1f1ec.png new file mode 100644 index 00000000..f62a1645 Binary files /dev/null and b/emojis/1f1e7-1f1ec.png differ diff --git a/emojis/1f1e7-1f1ed.png b/emojis/1f1e7-1f1ed.png new file mode 100644 index 00000000..a2e0c648 Binary files /dev/null and b/emojis/1f1e7-1f1ed.png differ diff --git a/emojis/1f1e7-1f1ee.png b/emojis/1f1e7-1f1ee.png new file mode 100644 index 00000000..67e878cb Binary files /dev/null and b/emojis/1f1e7-1f1ee.png differ diff --git a/emojis/1f1e7-1f1ef.png b/emojis/1f1e7-1f1ef.png new file mode 100644 index 00000000..d8021a04 Binary files /dev/null and b/emojis/1f1e7-1f1ef.png differ diff --git a/emojis/1f1e7-1f1f1.png b/emojis/1f1e7-1f1f1.png new file mode 100644 index 00000000..044ab7d7 Binary files /dev/null and b/emojis/1f1e7-1f1f1.png differ diff --git a/emojis/1f1e7-1f1f2.png b/emojis/1f1e7-1f1f2.png new file mode 100644 index 00000000..3e71c787 Binary files /dev/null and b/emojis/1f1e7-1f1f2.png differ diff --git a/emojis/1f1e7-1f1f3.png b/emojis/1f1e7-1f1f3.png new file mode 100644 index 00000000..1b121dad Binary files /dev/null and b/emojis/1f1e7-1f1f3.png differ diff --git a/emojis/1f1e7-1f1f4.png b/emojis/1f1e7-1f1f4.png new file mode 100644 index 00000000..b7fd1678 Binary files /dev/null and b/emojis/1f1e7-1f1f4.png differ diff --git a/emojis/1f1e7-1f1f6.png b/emojis/1f1e7-1f1f6.png new file mode 100644 index 00000000..ee4187ff Binary files /dev/null and b/emojis/1f1e7-1f1f6.png differ diff --git a/emojis/1f1e7-1f1f7.png b/emojis/1f1e7-1f1f7.png new file mode 100644 index 00000000..a48615e3 Binary files /dev/null and b/emojis/1f1e7-1f1f7.png differ diff --git a/emojis/1f1e7-1f1f8.png b/emojis/1f1e7-1f1f8.png new file mode 100644 index 00000000..7085f732 Binary files /dev/null and b/emojis/1f1e7-1f1f8.png differ diff --git a/emojis/1f1e7-1f1f9.png b/emojis/1f1e7-1f1f9.png new file mode 100644 index 00000000..a13a1b99 Binary files /dev/null and b/emojis/1f1e7-1f1f9.png differ diff --git a/emojis/1f1e7-1f1fb.png b/emojis/1f1e7-1f1fb.png new file mode 100644 index 00000000..62329ed1 Binary files /dev/null and b/emojis/1f1e7-1f1fb.png differ diff --git a/emojis/1f1e7-1f1fc.png b/emojis/1f1e7-1f1fc.png new file mode 100644 index 00000000..9eab7c24 Binary files /dev/null and b/emojis/1f1e7-1f1fc.png differ diff --git a/emojis/1f1e7-1f1fe.png b/emojis/1f1e7-1f1fe.png new file mode 100644 index 00000000..6ee3c78e Binary files /dev/null and b/emojis/1f1e7-1f1fe.png differ diff --git a/emojis/1f1e7-1f1ff.png b/emojis/1f1e7-1f1ff.png new file mode 100644 index 00000000..80c3a266 Binary files /dev/null and b/emojis/1f1e7-1f1ff.png differ diff --git a/emojis/1f1e8-1f1e6.png b/emojis/1f1e8-1f1e6.png new file mode 100644 index 00000000..7d2b2674 Binary files /dev/null and b/emojis/1f1e8-1f1e6.png differ diff --git a/emojis/1f1e8-1f1e8.png b/emojis/1f1e8-1f1e8.png new file mode 100644 index 00000000..08ea22b0 Binary files /dev/null and b/emojis/1f1e8-1f1e8.png differ diff --git a/emojis/1f1e8-1f1e9.png b/emojis/1f1e8-1f1e9.png new file mode 100644 index 00000000..9dc9b176 Binary files /dev/null and b/emojis/1f1e8-1f1e9.png differ diff --git a/emojis/1f1e8-1f1eb.png b/emojis/1f1e8-1f1eb.png new file mode 100644 index 00000000..6d2e94dd Binary files /dev/null and b/emojis/1f1e8-1f1eb.png differ diff --git a/emojis/1f1e8-1f1ec.png b/emojis/1f1e8-1f1ec.png new file mode 100644 index 00000000..eefd21d0 Binary files /dev/null and b/emojis/1f1e8-1f1ec.png differ diff --git a/emojis/1f1e8-1f1ed.png b/emojis/1f1e8-1f1ed.png new file mode 100644 index 00000000..e8b408b9 Binary files /dev/null and b/emojis/1f1e8-1f1ed.png differ diff --git a/emojis/1f1e8-1f1ee.png b/emojis/1f1e8-1f1ee.png new file mode 100644 index 00000000..95554703 Binary files /dev/null and b/emojis/1f1e8-1f1ee.png differ diff --git a/emojis/1f1e8-1f1f0.png b/emojis/1f1e8-1f1f0.png new file mode 100644 index 00000000..9cb9f284 Binary files /dev/null and b/emojis/1f1e8-1f1f0.png differ diff --git a/emojis/1f1e8-1f1f1.png b/emojis/1f1e8-1f1f1.png new file mode 100644 index 00000000..8654b217 Binary files /dev/null and b/emojis/1f1e8-1f1f1.png differ diff --git a/emojis/1f1e8-1f1f2.png b/emojis/1f1e8-1f1f2.png new file mode 100644 index 00000000..5c6a9fbe Binary files /dev/null and b/emojis/1f1e8-1f1f2.png differ diff --git a/emojis/1f1e8-1f1f3.png b/emojis/1f1e8-1f1f3.png new file mode 100644 index 00000000..ecbf96cb Binary files /dev/null and b/emojis/1f1e8-1f1f3.png differ diff --git a/emojis/1f1e8-1f1f4.png b/emojis/1f1e8-1f1f4.png new file mode 100644 index 00000000..12b67862 Binary files /dev/null and b/emojis/1f1e8-1f1f4.png differ diff --git a/emojis/1f1e8-1f1f5.png b/emojis/1f1e8-1f1f5.png new file mode 100644 index 00000000..49d3cee3 Binary files /dev/null and b/emojis/1f1e8-1f1f5.png differ diff --git a/emojis/1f1e8-1f1f7.png b/emojis/1f1e8-1f1f7.png new file mode 100644 index 00000000..ff8bf345 Binary files /dev/null and b/emojis/1f1e8-1f1f7.png differ diff --git a/emojis/1f1e8-1f1fa.png b/emojis/1f1e8-1f1fa.png new file mode 100644 index 00000000..e210dad6 Binary files /dev/null and b/emojis/1f1e8-1f1fa.png differ diff --git a/emojis/1f1e8-1f1fb.png b/emojis/1f1e8-1f1fb.png new file mode 100644 index 00000000..4bc4815f Binary files /dev/null and b/emojis/1f1e8-1f1fb.png differ diff --git a/emojis/1f1e8-1f1fc.png b/emojis/1f1e8-1f1fc.png new file mode 100644 index 00000000..e8b91be3 Binary files /dev/null and b/emojis/1f1e8-1f1fc.png differ diff --git a/emojis/1f1e8-1f1fd.png b/emojis/1f1e8-1f1fd.png new file mode 100644 index 00000000..1b521a6e Binary files /dev/null and b/emojis/1f1e8-1f1fd.png differ diff --git a/emojis/1f1e8-1f1fe.png b/emojis/1f1e8-1f1fe.png new file mode 100644 index 00000000..baef68b9 Binary files /dev/null and b/emojis/1f1e8-1f1fe.png differ diff --git a/emojis/1f1e8-1f1ff.png b/emojis/1f1e8-1f1ff.png new file mode 100644 index 00000000..ac404b0e Binary files /dev/null and b/emojis/1f1e8-1f1ff.png differ diff --git a/emojis/1f1e9-1f1ea.png b/emojis/1f1e9-1f1ea.png new file mode 100644 index 00000000..1664fe83 Binary files /dev/null and b/emojis/1f1e9-1f1ea.png differ diff --git a/emojis/1f1e9-1f1ec.png b/emojis/1f1e9-1f1ec.png new file mode 100644 index 00000000..f96b7e28 Binary files /dev/null and b/emojis/1f1e9-1f1ec.png differ diff --git a/emojis/1f1e9-1f1ef.png b/emojis/1f1e9-1f1ef.png new file mode 100644 index 00000000..5ed815f7 Binary files /dev/null and b/emojis/1f1e9-1f1ef.png differ diff --git a/emojis/1f1e9-1f1f0.png b/emojis/1f1e9-1f1f0.png new file mode 100644 index 00000000..368bc42d Binary files /dev/null and b/emojis/1f1e9-1f1f0.png differ diff --git a/emojis/1f1e9-1f1f2.png b/emojis/1f1e9-1f1f2.png new file mode 100644 index 00000000..e4567739 Binary files /dev/null and b/emojis/1f1e9-1f1f2.png differ diff --git a/emojis/1f1e9-1f1f4.png b/emojis/1f1e9-1f1f4.png new file mode 100644 index 00000000..c1f3c547 Binary files /dev/null and b/emojis/1f1e9-1f1f4.png differ diff --git a/emojis/1f1e9-1f1ff.png b/emojis/1f1e9-1f1ff.png new file mode 100644 index 00000000..25283884 Binary files /dev/null and b/emojis/1f1e9-1f1ff.png differ diff --git a/emojis/1f1ea-1f1e6.png b/emojis/1f1ea-1f1e6.png new file mode 100644 index 00000000..106343e0 Binary files /dev/null and b/emojis/1f1ea-1f1e6.png differ diff --git a/emojis/1f1ea-1f1e8.png b/emojis/1f1ea-1f1e8.png new file mode 100644 index 00000000..85e718ea Binary files /dev/null and b/emojis/1f1ea-1f1e8.png differ diff --git a/emojis/1f1ea-1f1ea.png b/emojis/1f1ea-1f1ea.png new file mode 100644 index 00000000..8610b4ee Binary files /dev/null and b/emojis/1f1ea-1f1ea.png differ diff --git a/emojis/1f1ea-1f1ec.png b/emojis/1f1ea-1f1ec.png new file mode 100644 index 00000000..f2e5b19d Binary files /dev/null and b/emojis/1f1ea-1f1ec.png differ diff --git a/emojis/1f1ea-1f1ed.png b/emojis/1f1ea-1f1ed.png new file mode 100644 index 00000000..7a7af4cd Binary files /dev/null and b/emojis/1f1ea-1f1ed.png differ diff --git a/emojis/1f1ea-1f1f7.png b/emojis/1f1ea-1f1f7.png new file mode 100644 index 00000000..2338a490 Binary files /dev/null and b/emojis/1f1ea-1f1f7.png differ diff --git a/emojis/1f1ea-1f1f8.png b/emojis/1f1ea-1f1f8.png new file mode 100644 index 00000000..106343e0 Binary files /dev/null and b/emojis/1f1ea-1f1f8.png differ diff --git a/emojis/1f1ea-1f1f9.png b/emojis/1f1ea-1f1f9.png new file mode 100644 index 00000000..92ba8492 Binary files /dev/null and b/emojis/1f1ea-1f1f9.png differ diff --git a/emojis/1f1ea-1f1fa.png b/emojis/1f1ea-1f1fa.png new file mode 100644 index 00000000..8505a097 Binary files /dev/null and b/emojis/1f1ea-1f1fa.png differ diff --git a/emojis/1f1eb-1f1ee.png b/emojis/1f1eb-1f1ee.png new file mode 100644 index 00000000..60ae8ba4 Binary files /dev/null and b/emojis/1f1eb-1f1ee.png differ diff --git a/emojis/1f1eb-1f1ef.png b/emojis/1f1eb-1f1ef.png new file mode 100644 index 00000000..2d89f4b2 Binary files /dev/null and b/emojis/1f1eb-1f1ef.png differ diff --git a/emojis/1f1eb-1f1f0.png b/emojis/1f1eb-1f1f0.png new file mode 100644 index 00000000..2ac15c56 Binary files /dev/null and b/emojis/1f1eb-1f1f0.png differ diff --git a/emojis/1f1eb-1f1f2.png b/emojis/1f1eb-1f1f2.png new file mode 100644 index 00000000..7006aaa4 Binary files /dev/null and b/emojis/1f1eb-1f1f2.png differ diff --git a/emojis/1f1eb-1f1f4.png b/emojis/1f1eb-1f1f4.png new file mode 100644 index 00000000..1a4319c0 Binary files /dev/null and b/emojis/1f1eb-1f1f4.png differ diff --git a/emojis/1f1eb-1f1f7.png b/emojis/1f1eb-1f1f7.png new file mode 100644 index 00000000..49d3cee3 Binary files /dev/null and b/emojis/1f1eb-1f1f7.png differ diff --git a/emojis/1f1ec-1f1e6.png b/emojis/1f1ec-1f1e6.png new file mode 100644 index 00000000..140bd24e Binary files /dev/null and b/emojis/1f1ec-1f1e6.png differ diff --git a/emojis/1f1ec-1f1e7.png b/emojis/1f1ec-1f1e7.png new file mode 100644 index 00000000..fe4a4820 Binary files /dev/null and b/emojis/1f1ec-1f1e7.png differ diff --git a/emojis/1f1ec-1f1e9.png b/emojis/1f1ec-1f1e9.png new file mode 100644 index 00000000..42d73882 Binary files /dev/null and b/emojis/1f1ec-1f1e9.png differ diff --git a/emojis/1f1ec-1f1ea.png b/emojis/1f1ec-1f1ea.png new file mode 100644 index 00000000..42054f9b Binary files /dev/null and b/emojis/1f1ec-1f1ea.png differ diff --git a/emojis/1f1ec-1f1eb.png b/emojis/1f1ec-1f1eb.png new file mode 100644 index 00000000..9f5b65a3 Binary files /dev/null and b/emojis/1f1ec-1f1eb.png differ diff --git a/emojis/1f1ec-1f1ec.png b/emojis/1f1ec-1f1ec.png new file mode 100644 index 00000000..060498aa Binary files /dev/null and b/emojis/1f1ec-1f1ec.png differ diff --git a/emojis/1f1ec-1f1ed.png b/emojis/1f1ec-1f1ed.png new file mode 100644 index 00000000..37033413 Binary files /dev/null and b/emojis/1f1ec-1f1ed.png differ diff --git a/emojis/1f1ec-1f1ee.png b/emojis/1f1ec-1f1ee.png new file mode 100644 index 00000000..51c9a4c0 Binary files /dev/null and b/emojis/1f1ec-1f1ee.png differ diff --git a/emojis/1f1ec-1f1f1.png b/emojis/1f1ec-1f1f1.png new file mode 100644 index 00000000..5250c71b Binary files /dev/null and b/emojis/1f1ec-1f1f1.png differ diff --git a/emojis/1f1ec-1f1f2.png b/emojis/1f1ec-1f1f2.png new file mode 100644 index 00000000..d528ee98 Binary files /dev/null and b/emojis/1f1ec-1f1f2.png differ diff --git a/emojis/1f1ec-1f1f3.png b/emojis/1f1ec-1f1f3.png new file mode 100644 index 00000000..e1ab17b0 Binary files /dev/null and b/emojis/1f1ec-1f1f3.png differ diff --git a/emojis/1f1ec-1f1f5.png b/emojis/1f1ec-1f1f5.png new file mode 100644 index 00000000..82f071d3 Binary files /dev/null and b/emojis/1f1ec-1f1f5.png differ diff --git a/emojis/1f1ec-1f1f6.png b/emojis/1f1ec-1f1f6.png new file mode 100644 index 00000000..ae906f7b Binary files /dev/null and b/emojis/1f1ec-1f1f6.png differ diff --git a/emojis/1f1ec-1f1f7.png b/emojis/1f1ec-1f1f7.png new file mode 100644 index 00000000..861da81b Binary files /dev/null and b/emojis/1f1ec-1f1f7.png differ diff --git a/emojis/1f1ec-1f1f8.png b/emojis/1f1ec-1f1f8.png new file mode 100644 index 00000000..b68a84aa Binary files /dev/null and b/emojis/1f1ec-1f1f8.png differ diff --git a/emojis/1f1ec-1f1f9.png b/emojis/1f1ec-1f1f9.png new file mode 100644 index 00000000..7e9a853c Binary files /dev/null and b/emojis/1f1ec-1f1f9.png differ diff --git a/emojis/1f1ec-1f1fa.png b/emojis/1f1ec-1f1fa.png new file mode 100644 index 00000000..b8e4ef22 Binary files /dev/null and b/emojis/1f1ec-1f1fa.png differ diff --git a/emojis/1f1ec-1f1fc.png b/emojis/1f1ec-1f1fc.png new file mode 100644 index 00000000..bc7295be Binary files /dev/null and b/emojis/1f1ec-1f1fc.png differ diff --git a/emojis/1f1ec-1f1fe.png b/emojis/1f1ec-1f1fe.png new file mode 100644 index 00000000..147ae88e Binary files /dev/null and b/emojis/1f1ec-1f1fe.png differ diff --git a/emojis/1f1ed-1f1f0.png b/emojis/1f1ed-1f1f0.png new file mode 100644 index 00000000..bb793930 Binary files /dev/null and b/emojis/1f1ed-1f1f0.png differ diff --git a/emojis/1f1ed-1f1f2.png b/emojis/1f1ed-1f1f2.png new file mode 100644 index 00000000..686b2438 Binary files /dev/null and b/emojis/1f1ed-1f1f2.png differ diff --git a/emojis/1f1ed-1f1f3.png b/emojis/1f1ed-1f1f3.png new file mode 100644 index 00000000..906e928d Binary files /dev/null and b/emojis/1f1ed-1f1f3.png differ diff --git a/emojis/1f1ed-1f1f7.png b/emojis/1f1ed-1f1f7.png new file mode 100644 index 00000000..57845ee8 Binary files /dev/null and b/emojis/1f1ed-1f1f7.png differ diff --git a/emojis/1f1ed-1f1f9.png b/emojis/1f1ed-1f1f9.png new file mode 100644 index 00000000..44233b06 Binary files /dev/null and b/emojis/1f1ed-1f1f9.png differ diff --git a/emojis/1f1ed-1f1fa.png b/emojis/1f1ed-1f1fa.png new file mode 100644 index 00000000..26192115 Binary files /dev/null and b/emojis/1f1ed-1f1fa.png differ diff --git a/emojis/1f1ee-1f1e8.png b/emojis/1f1ee-1f1e8.png new file mode 100644 index 00000000..ad720c55 Binary files /dev/null and b/emojis/1f1ee-1f1e8.png differ diff --git a/emojis/1f1ee-1f1e9.png b/emojis/1f1ee-1f1e9.png new file mode 100644 index 00000000..ca0ac5cd Binary files /dev/null and b/emojis/1f1ee-1f1e9.png differ diff --git a/emojis/1f1ee-1f1ea.png b/emojis/1f1ee-1f1ea.png new file mode 100644 index 00000000..92bcda93 Binary files /dev/null and b/emojis/1f1ee-1f1ea.png differ diff --git a/emojis/1f1ee-1f1f1.png b/emojis/1f1ee-1f1f1.png new file mode 100644 index 00000000..63893052 Binary files /dev/null and b/emojis/1f1ee-1f1f1.png differ diff --git a/emojis/1f1ee-1f1f2.png b/emojis/1f1ee-1f1f2.png new file mode 100644 index 00000000..339e561b Binary files /dev/null and b/emojis/1f1ee-1f1f2.png differ diff --git a/emojis/1f1ee-1f1f3.png b/emojis/1f1ee-1f1f3.png new file mode 100644 index 00000000..49154ab8 Binary files /dev/null and b/emojis/1f1ee-1f1f3.png differ diff --git a/emojis/1f1ee-1f1f4.png b/emojis/1f1ee-1f1f4.png new file mode 100644 index 00000000..f96b7e28 Binary files /dev/null and b/emojis/1f1ee-1f1f4.png differ diff --git a/emojis/1f1ee-1f1f6.png b/emojis/1f1ee-1f1f6.png new file mode 100644 index 00000000..19ca0151 Binary files /dev/null and b/emojis/1f1ee-1f1f6.png differ diff --git a/emojis/1f1ee-1f1f7.png b/emojis/1f1ee-1f1f7.png new file mode 100644 index 00000000..155fe444 Binary files /dev/null and b/emojis/1f1ee-1f1f7.png differ diff --git a/emojis/1f1ee-1f1f8.png b/emojis/1f1ee-1f1f8.png new file mode 100644 index 00000000..2b7ed5c2 Binary files /dev/null and b/emojis/1f1ee-1f1f8.png differ diff --git a/emojis/1f1ee-1f1f9.png b/emojis/1f1ee-1f1f9.png new file mode 100644 index 00000000..a93df5b5 Binary files /dev/null and b/emojis/1f1ee-1f1f9.png differ diff --git a/emojis/1f1ef-1f1ea.png b/emojis/1f1ef-1f1ea.png new file mode 100644 index 00000000..c5889565 Binary files /dev/null and b/emojis/1f1ef-1f1ea.png differ diff --git a/emojis/1f1ef-1f1f2.png b/emojis/1f1ef-1f1f2.png new file mode 100644 index 00000000..ec14aaa6 Binary files /dev/null and b/emojis/1f1ef-1f1f2.png differ diff --git a/emojis/1f1ef-1f1f4.png b/emojis/1f1ef-1f1f4.png new file mode 100644 index 00000000..e00caf69 Binary files /dev/null and b/emojis/1f1ef-1f1f4.png differ diff --git a/emojis/1f1ef-1f1f5.png b/emojis/1f1ef-1f1f5.png new file mode 100644 index 00000000..6524f75a Binary files /dev/null and b/emojis/1f1ef-1f1f5.png differ diff --git a/emojis/1f1f0-1f1ea.png b/emojis/1f1f0-1f1ea.png new file mode 100644 index 00000000..594fc41e Binary files /dev/null and b/emojis/1f1f0-1f1ea.png differ diff --git a/emojis/1f1f0-1f1ec.png b/emojis/1f1f0-1f1ec.png new file mode 100644 index 00000000..b7ab5685 Binary files /dev/null and b/emojis/1f1f0-1f1ec.png differ diff --git a/emojis/1f1f0-1f1ed.png b/emojis/1f1f0-1f1ed.png new file mode 100644 index 00000000..555b891a Binary files /dev/null and b/emojis/1f1f0-1f1ed.png differ diff --git a/emojis/1f1f0-1f1ee.png b/emojis/1f1f0-1f1ee.png new file mode 100644 index 00000000..2d3d680f Binary files /dev/null and b/emojis/1f1f0-1f1ee.png differ diff --git a/emojis/1f1f0-1f1f2.png b/emojis/1f1f0-1f1f2.png new file mode 100644 index 00000000..3c2f4068 Binary files /dev/null and b/emojis/1f1f0-1f1f2.png differ diff --git a/emojis/1f1f0-1f1f3.png b/emojis/1f1f0-1f1f3.png new file mode 100644 index 00000000..2b910241 Binary files /dev/null and b/emojis/1f1f0-1f1f3.png differ diff --git a/emojis/1f1f0-1f1f5.png b/emojis/1f1f0-1f1f5.png new file mode 100644 index 00000000..d484fcb4 Binary files /dev/null and b/emojis/1f1f0-1f1f5.png differ diff --git a/emojis/1f1f0-1f1f7.png b/emojis/1f1f0-1f1f7.png new file mode 100644 index 00000000..34a73124 Binary files /dev/null and b/emojis/1f1f0-1f1f7.png differ diff --git a/emojis/1f1f0-1f1fc.png b/emojis/1f1f0-1f1fc.png new file mode 100644 index 00000000..a9f513b2 Binary files /dev/null and b/emojis/1f1f0-1f1fc.png differ diff --git a/emojis/1f1f0-1f1fe.png b/emojis/1f1f0-1f1fe.png new file mode 100644 index 00000000..509aff96 Binary files /dev/null and b/emojis/1f1f0-1f1fe.png differ diff --git a/emojis/1f1f0-1f1ff.png b/emojis/1f1f0-1f1ff.png new file mode 100644 index 00000000..44a1466b Binary files /dev/null and b/emojis/1f1f0-1f1ff.png differ diff --git a/emojis/1f1f1-1f1e6.png b/emojis/1f1f1-1f1e6.png new file mode 100644 index 00000000..75f95569 Binary files /dev/null and b/emojis/1f1f1-1f1e6.png differ diff --git a/emojis/1f1f1-1f1e7.png b/emojis/1f1f1-1f1e7.png new file mode 100644 index 00000000..1f9bf891 Binary files /dev/null and b/emojis/1f1f1-1f1e7.png differ diff --git a/emojis/1f1f1-1f1e8.png b/emojis/1f1f1-1f1e8.png new file mode 100644 index 00000000..ae52ba40 Binary files /dev/null and b/emojis/1f1f1-1f1e8.png differ diff --git a/emojis/1f1f1-1f1ee.png b/emojis/1f1f1-1f1ee.png new file mode 100644 index 00000000..7c60af3a Binary files /dev/null and b/emojis/1f1f1-1f1ee.png differ diff --git a/emojis/1f1f1-1f1f0.png b/emojis/1f1f1-1f1f0.png new file mode 100644 index 00000000..ff31f6ba Binary files /dev/null and b/emojis/1f1f1-1f1f0.png differ diff --git a/emojis/1f1f1-1f1f7.png b/emojis/1f1f1-1f1f7.png new file mode 100644 index 00000000..9e640bea Binary files /dev/null and b/emojis/1f1f1-1f1f7.png differ diff --git a/emojis/1f1f1-1f1f8.png b/emojis/1f1f1-1f1f8.png new file mode 100644 index 00000000..4814d9ae Binary files /dev/null and b/emojis/1f1f1-1f1f8.png differ diff --git a/emojis/1f1f1-1f1f9.png b/emojis/1f1f1-1f1f9.png new file mode 100644 index 00000000..db81293f Binary files /dev/null and b/emojis/1f1f1-1f1f9.png differ diff --git a/emojis/1f1f1-1f1fa.png b/emojis/1f1f1-1f1fa.png new file mode 100644 index 00000000..11a0b27d Binary files /dev/null and b/emojis/1f1f1-1f1fa.png differ diff --git a/emojis/1f1f1-1f1fb.png b/emojis/1f1f1-1f1fb.png new file mode 100644 index 00000000..aca16066 Binary files /dev/null and b/emojis/1f1f1-1f1fb.png differ diff --git a/emojis/1f1f1-1f1fe.png b/emojis/1f1f1-1f1fe.png new file mode 100644 index 00000000..17d1ebea Binary files /dev/null and b/emojis/1f1f1-1f1fe.png differ diff --git a/emojis/1f1f2-1f1e6.png b/emojis/1f1f2-1f1e6.png new file mode 100644 index 00000000..3bfd6dcd Binary files /dev/null and b/emojis/1f1f2-1f1e6.png differ diff --git a/emojis/1f1f2-1f1e8.png b/emojis/1f1f2-1f1e8.png new file mode 100644 index 00000000..393d0799 Binary files /dev/null and b/emojis/1f1f2-1f1e8.png differ diff --git a/emojis/1f1f2-1f1e9.png b/emojis/1f1f2-1f1e9.png new file mode 100644 index 00000000..cd8a590e Binary files /dev/null and b/emojis/1f1f2-1f1e9.png differ diff --git a/emojis/1f1f2-1f1ea.png b/emojis/1f1f2-1f1ea.png new file mode 100644 index 00000000..6273c123 Binary files /dev/null and b/emojis/1f1f2-1f1ea.png differ diff --git a/emojis/1f1f2-1f1eb.png b/emojis/1f1f2-1f1eb.png new file mode 100644 index 00000000..49d3cee3 Binary files /dev/null and b/emojis/1f1f2-1f1eb.png differ diff --git a/emojis/1f1f2-1f1ec.png b/emojis/1f1f2-1f1ec.png new file mode 100644 index 00000000..f20f72a8 Binary files /dev/null and b/emojis/1f1f2-1f1ec.png differ diff --git a/emojis/1f1f2-1f1ed.png b/emojis/1f1f2-1f1ed.png new file mode 100644 index 00000000..cf741796 Binary files /dev/null and b/emojis/1f1f2-1f1ed.png differ diff --git a/emojis/1f1f2-1f1f0.png b/emojis/1f1f2-1f1f0.png new file mode 100644 index 00000000..dd28a2e0 Binary files /dev/null and b/emojis/1f1f2-1f1f0.png differ diff --git a/emojis/1f1f2-1f1f1.png b/emojis/1f1f2-1f1f1.png new file mode 100644 index 00000000..fce3c1b3 Binary files /dev/null and b/emojis/1f1f2-1f1f1.png differ diff --git a/emojis/1f1f2-1f1f2.png b/emojis/1f1f2-1f1f2.png new file mode 100644 index 00000000..5468bd3a Binary files /dev/null and b/emojis/1f1f2-1f1f2.png differ diff --git a/emojis/1f1f2-1f1f3.png b/emojis/1f1f2-1f1f3.png new file mode 100644 index 00000000..e70d2e9a Binary files /dev/null and b/emojis/1f1f2-1f1f3.png differ diff --git a/emojis/1f1f2-1f1f4.png b/emojis/1f1f2-1f1f4.png new file mode 100644 index 00000000..150fc587 Binary files /dev/null and b/emojis/1f1f2-1f1f4.png differ diff --git a/emojis/1f1f2-1f1f5.png b/emojis/1f1f2-1f1f5.png new file mode 100644 index 00000000..13ca25b0 Binary files /dev/null and b/emojis/1f1f2-1f1f5.png differ diff --git a/emojis/1f1f2-1f1f6.png b/emojis/1f1f2-1f1f6.png new file mode 100644 index 00000000..a6ff03de Binary files /dev/null and b/emojis/1f1f2-1f1f6.png differ diff --git a/emojis/1f1f2-1f1f7.png b/emojis/1f1f2-1f1f7.png new file mode 100644 index 00000000..0e8364f9 Binary files /dev/null and b/emojis/1f1f2-1f1f7.png differ diff --git a/emojis/1f1f2-1f1f8.png b/emojis/1f1f2-1f1f8.png new file mode 100644 index 00000000..b53cdba4 Binary files /dev/null and b/emojis/1f1f2-1f1f8.png differ diff --git a/emojis/1f1f2-1f1f9.png b/emojis/1f1f2-1f1f9.png new file mode 100644 index 00000000..f287dffd Binary files /dev/null and b/emojis/1f1f2-1f1f9.png differ diff --git a/emojis/1f1f2-1f1fa.png b/emojis/1f1f2-1f1fa.png new file mode 100644 index 00000000..7eeeb542 Binary files /dev/null and b/emojis/1f1f2-1f1fa.png differ diff --git a/emojis/1f1f2-1f1fb.png b/emojis/1f1f2-1f1fb.png new file mode 100644 index 00000000..ee0d0f8c Binary files /dev/null and b/emojis/1f1f2-1f1fb.png differ diff --git a/emojis/1f1f2-1f1fc.png b/emojis/1f1f2-1f1fc.png new file mode 100644 index 00000000..0600e5aa Binary files /dev/null and b/emojis/1f1f2-1f1fc.png differ diff --git a/emojis/1f1f2-1f1fd.png b/emojis/1f1f2-1f1fd.png new file mode 100644 index 00000000..f401b400 Binary files /dev/null and b/emojis/1f1f2-1f1fd.png differ diff --git a/emojis/1f1f2-1f1fe.png b/emojis/1f1f2-1f1fe.png new file mode 100644 index 00000000..d2eeba0c Binary files /dev/null and b/emojis/1f1f2-1f1fe.png differ diff --git a/emojis/1f1f2-1f1ff.png b/emojis/1f1f2-1f1ff.png new file mode 100644 index 00000000..b86d6442 Binary files /dev/null and b/emojis/1f1f2-1f1ff.png differ diff --git a/emojis/1f1f3-1f1e6.png b/emojis/1f1f3-1f1e6.png new file mode 100644 index 00000000..7a8adc2f Binary files /dev/null and b/emojis/1f1f3-1f1e6.png differ diff --git a/emojis/1f1f3-1f1e8.png b/emojis/1f1f3-1f1e8.png new file mode 100644 index 00000000..ddc6865b Binary files /dev/null and b/emojis/1f1f3-1f1e8.png differ diff --git a/emojis/1f1f3-1f1ea.png b/emojis/1f1f3-1f1ea.png new file mode 100644 index 00000000..e6bafb13 Binary files /dev/null and b/emojis/1f1f3-1f1ea.png differ diff --git a/emojis/1f1f3-1f1eb.png b/emojis/1f1f3-1f1eb.png new file mode 100644 index 00000000..793813ea Binary files /dev/null and b/emojis/1f1f3-1f1eb.png differ diff --git a/emojis/1f1f3-1f1ec.png b/emojis/1f1f3-1f1ec.png new file mode 100644 index 00000000..75247085 Binary files /dev/null and b/emojis/1f1f3-1f1ec.png differ diff --git a/emojis/1f1f3-1f1ee.png b/emojis/1f1f3-1f1ee.png new file mode 100644 index 00000000..4d860947 Binary files /dev/null and b/emojis/1f1f3-1f1ee.png differ diff --git a/emojis/1f1f3-1f1f1.png b/emojis/1f1f3-1f1f1.png new file mode 100644 index 00000000..108fab62 Binary files /dev/null and b/emojis/1f1f3-1f1f1.png differ diff --git a/emojis/1f1f3-1f1f4.png b/emojis/1f1f3-1f1f4.png new file mode 100644 index 00000000..b6ccaa8e Binary files /dev/null and b/emojis/1f1f3-1f1f4.png differ diff --git a/emojis/1f1f3-1f1f5.png b/emojis/1f1f3-1f1f5.png new file mode 100644 index 00000000..c9f334fc Binary files /dev/null and b/emojis/1f1f3-1f1f5.png differ diff --git a/emojis/1f1f3-1f1f7.png b/emojis/1f1f3-1f1f7.png new file mode 100644 index 00000000..a4990002 Binary files /dev/null and b/emojis/1f1f3-1f1f7.png differ diff --git a/emojis/1f1f3-1f1fa.png b/emojis/1f1f3-1f1fa.png new file mode 100644 index 00000000..f5530bf4 Binary files /dev/null and b/emojis/1f1f3-1f1fa.png differ diff --git a/emojis/1f1f3-1f1ff.png b/emojis/1f1f3-1f1ff.png new file mode 100644 index 00000000..55c450c1 Binary files /dev/null and b/emojis/1f1f3-1f1ff.png differ diff --git a/emojis/1f1f4-1f1f2.png b/emojis/1f1f4-1f1f2.png new file mode 100644 index 00000000..82a76e01 Binary files /dev/null and b/emojis/1f1f4-1f1f2.png differ diff --git a/emojis/1f1f5-1f1e6.png b/emojis/1f1f5-1f1e6.png new file mode 100644 index 00000000..321fcdad Binary files /dev/null and b/emojis/1f1f5-1f1e6.png differ diff --git a/emojis/1f1f5-1f1ea.png b/emojis/1f1f5-1f1ea.png new file mode 100644 index 00000000..f9092204 Binary files /dev/null and b/emojis/1f1f5-1f1ea.png differ diff --git a/emojis/1f1f5-1f1eb.png b/emojis/1f1f5-1f1eb.png new file mode 100644 index 00000000..5cd6d7b8 Binary files /dev/null and b/emojis/1f1f5-1f1eb.png differ diff --git a/emojis/1f1f5-1f1ec.png b/emojis/1f1f5-1f1ec.png new file mode 100644 index 00000000..df254bea Binary files /dev/null and b/emojis/1f1f5-1f1ec.png differ diff --git a/emojis/1f1f5-1f1ed.png b/emojis/1f1f5-1f1ed.png new file mode 100644 index 00000000..a0dde9d6 Binary files /dev/null and b/emojis/1f1f5-1f1ed.png differ diff --git a/emojis/1f1f5-1f1f0.png b/emojis/1f1f5-1f1f0.png new file mode 100644 index 00000000..3c9cbacf Binary files /dev/null and b/emojis/1f1f5-1f1f0.png differ diff --git a/emojis/1f1f5-1f1f1.png b/emojis/1f1f5-1f1f1.png new file mode 100644 index 00000000..e34c68f9 Binary files /dev/null and b/emojis/1f1f5-1f1f1.png differ diff --git a/emojis/1f1f5-1f1f2.png b/emojis/1f1f5-1f1f2.png new file mode 100644 index 00000000..53ea6450 Binary files /dev/null and b/emojis/1f1f5-1f1f2.png differ diff --git a/emojis/1f1f5-1f1f3.png b/emojis/1f1f5-1f1f3.png new file mode 100644 index 00000000..daee9b97 Binary files /dev/null and b/emojis/1f1f5-1f1f3.png differ diff --git a/emojis/1f1f5-1f1f7.png b/emojis/1f1f5-1f1f7.png new file mode 100644 index 00000000..46d73adb Binary files /dev/null and b/emojis/1f1f5-1f1f7.png differ diff --git a/emojis/1f1f5-1f1f8.png b/emojis/1f1f5-1f1f8.png new file mode 100644 index 00000000..8e9df727 Binary files /dev/null and b/emojis/1f1f5-1f1f8.png differ diff --git a/emojis/1f1f5-1f1f9.png b/emojis/1f1f5-1f1f9.png new file mode 100644 index 00000000..9e29d95e Binary files /dev/null and b/emojis/1f1f5-1f1f9.png differ diff --git a/emojis/1f1f5-1f1fc.png b/emojis/1f1f5-1f1fc.png new file mode 100644 index 00000000..12662419 Binary files /dev/null and b/emojis/1f1f5-1f1fc.png differ diff --git a/emojis/1f1f5-1f1fe.png b/emojis/1f1f5-1f1fe.png new file mode 100644 index 00000000..af8da86c Binary files /dev/null and b/emojis/1f1f5-1f1fe.png differ diff --git a/emojis/1f1f6-1f1e6.png b/emojis/1f1f6-1f1e6.png new file mode 100644 index 00000000..a3c05cb0 Binary files /dev/null and b/emojis/1f1f6-1f1e6.png differ diff --git a/emojis/1f1f7-1f1ea.png b/emojis/1f1f7-1f1ea.png new file mode 100644 index 00000000..467754ae Binary files /dev/null and b/emojis/1f1f7-1f1ea.png differ diff --git a/emojis/1f1f7-1f1f4.png b/emojis/1f1f7-1f1f4.png new file mode 100644 index 00000000..d9e64187 Binary files /dev/null and b/emojis/1f1f7-1f1f4.png differ diff --git a/emojis/1f1f7-1f1f8.png b/emojis/1f1f7-1f1f8.png new file mode 100644 index 00000000..a387d8ea Binary files /dev/null and b/emojis/1f1f7-1f1f8.png differ diff --git a/emojis/1f1f7-1f1fa.png b/emojis/1f1f7-1f1fa.png new file mode 100644 index 00000000..38454d2a Binary files /dev/null and b/emojis/1f1f7-1f1fa.png differ diff --git a/emojis/1f1f7-1f1fc.png b/emojis/1f1f7-1f1fc.png new file mode 100644 index 00000000..6c306c18 Binary files /dev/null and b/emojis/1f1f7-1f1fc.png differ diff --git a/emojis/1f1f8-1f1e6.png b/emojis/1f1f8-1f1e6.png new file mode 100644 index 00000000..a2132dff Binary files /dev/null and b/emojis/1f1f8-1f1e6.png differ diff --git a/emojis/1f1f8-1f1e7.png b/emojis/1f1f8-1f1e7.png new file mode 100644 index 00000000..497377b0 Binary files /dev/null and b/emojis/1f1f8-1f1e7.png differ diff --git a/emojis/1f1f8-1f1e8.png b/emojis/1f1f8-1f1e8.png new file mode 100644 index 00000000..798a8a9e Binary files /dev/null and b/emojis/1f1f8-1f1e8.png differ diff --git a/emojis/1f1f8-1f1e9.png b/emojis/1f1f8-1f1e9.png new file mode 100644 index 00000000..6a60ec8c Binary files /dev/null and b/emojis/1f1f8-1f1e9.png differ diff --git a/emojis/1f1f8-1f1ea.png b/emojis/1f1f8-1f1ea.png new file mode 100644 index 00000000..efbfdb00 Binary files /dev/null and b/emojis/1f1f8-1f1ea.png differ diff --git a/emojis/1f1f8-1f1ec.png b/emojis/1f1f8-1f1ec.png new file mode 100644 index 00000000..407d6b28 Binary files /dev/null and b/emojis/1f1f8-1f1ec.png differ diff --git a/emojis/1f1f8-1f1ed.png b/emojis/1f1f8-1f1ed.png new file mode 100644 index 00000000..b2e3973f Binary files /dev/null and b/emojis/1f1f8-1f1ed.png differ diff --git a/emojis/1f1f8-1f1ee.png b/emojis/1f1f8-1f1ee.png new file mode 100644 index 00000000..70772fd3 Binary files /dev/null and b/emojis/1f1f8-1f1ee.png differ diff --git a/emojis/1f1f8-1f1ef.png b/emojis/1f1f8-1f1ef.png new file mode 100644 index 00000000..b6ccaa8e Binary files /dev/null and b/emojis/1f1f8-1f1ef.png differ diff --git a/emojis/1f1f8-1f1f0.png b/emojis/1f1f8-1f1f0.png new file mode 100644 index 00000000..4bfcb818 Binary files /dev/null and b/emojis/1f1f8-1f1f0.png differ diff --git a/emojis/1f1f8-1f1f1.png b/emojis/1f1f8-1f1f1.png new file mode 100644 index 00000000..8ac43964 Binary files /dev/null and b/emojis/1f1f8-1f1f1.png differ diff --git a/emojis/1f1f8-1f1f2.png b/emojis/1f1f8-1f1f2.png new file mode 100644 index 00000000..e0cc6607 Binary files /dev/null and b/emojis/1f1f8-1f1f2.png differ diff --git a/emojis/1f1f8-1f1f3.png b/emojis/1f1f8-1f1f3.png new file mode 100644 index 00000000..4598f9f9 Binary files /dev/null and b/emojis/1f1f8-1f1f3.png differ diff --git a/emojis/1f1f8-1f1f4.png b/emojis/1f1f8-1f1f4.png new file mode 100644 index 00000000..1dcbe44f Binary files /dev/null and b/emojis/1f1f8-1f1f4.png differ diff --git a/emojis/1f1f8-1f1f7.png b/emojis/1f1f8-1f1f7.png new file mode 100644 index 00000000..f49a5542 Binary files /dev/null and b/emojis/1f1f8-1f1f7.png differ diff --git a/emojis/1f1f8-1f1f8.png b/emojis/1f1f8-1f1f8.png new file mode 100644 index 00000000..f3f35fdb Binary files /dev/null and b/emojis/1f1f8-1f1f8.png differ diff --git a/emojis/1f1f8-1f1f9.png b/emojis/1f1f8-1f1f9.png new file mode 100644 index 00000000..2afdea70 Binary files /dev/null and b/emojis/1f1f8-1f1f9.png differ diff --git a/emojis/1f1f8-1f1fb.png b/emojis/1f1f8-1f1fb.png new file mode 100644 index 00000000..4f74d58d Binary files /dev/null and b/emojis/1f1f8-1f1fb.png differ diff --git a/emojis/1f1f8-1f1fd.png b/emojis/1f1f8-1f1fd.png new file mode 100644 index 00000000..6fb29a42 Binary files /dev/null and b/emojis/1f1f8-1f1fd.png differ diff --git a/emojis/1f1f8-1f1fe.png b/emojis/1f1f8-1f1fe.png new file mode 100644 index 00000000..541da3f9 Binary files /dev/null and b/emojis/1f1f8-1f1fe.png differ diff --git a/emojis/1f1f8-1f1ff.png b/emojis/1f1f8-1f1ff.png new file mode 100644 index 00000000..e3de29f7 Binary files /dev/null and b/emojis/1f1f8-1f1ff.png differ diff --git a/emojis/1f1f9-1f1e6.png b/emojis/1f1f9-1f1e6.png new file mode 100644 index 00000000..91ddb125 Binary files /dev/null and b/emojis/1f1f9-1f1e6.png differ diff --git a/emojis/1f1f9-1f1e8.png b/emojis/1f1f9-1f1e8.png new file mode 100644 index 00000000..fac570eb Binary files /dev/null and b/emojis/1f1f9-1f1e8.png differ diff --git a/emojis/1f1f9-1f1e9.png b/emojis/1f1f9-1f1e9.png new file mode 100644 index 00000000..dabd311e Binary files /dev/null and b/emojis/1f1f9-1f1e9.png differ diff --git a/emojis/1f1f9-1f1eb.png b/emojis/1f1f9-1f1eb.png new file mode 100644 index 00000000..c37f3c58 Binary files /dev/null and b/emojis/1f1f9-1f1eb.png differ diff --git a/emojis/1f1f9-1f1ec.png b/emojis/1f1f9-1f1ec.png new file mode 100644 index 00000000..1ef1370c Binary files /dev/null and b/emojis/1f1f9-1f1ec.png differ diff --git a/emojis/1f1f9-1f1ed.png b/emojis/1f1f9-1f1ed.png new file mode 100644 index 00000000..99cf5391 Binary files /dev/null and b/emojis/1f1f9-1f1ed.png differ diff --git a/emojis/1f1f9-1f1ef.png b/emojis/1f1f9-1f1ef.png new file mode 100644 index 00000000..845d2f1d Binary files /dev/null and b/emojis/1f1f9-1f1ef.png differ diff --git a/emojis/1f1f9-1f1f0.png b/emojis/1f1f9-1f1f0.png new file mode 100644 index 00000000..82a53925 Binary files /dev/null and b/emojis/1f1f9-1f1f0.png differ diff --git a/emojis/1f1f9-1f1f1.png b/emojis/1f1f9-1f1f1.png new file mode 100644 index 00000000..af876256 Binary files /dev/null and b/emojis/1f1f9-1f1f1.png differ diff --git a/emojis/1f1f9-1f1f2.png b/emojis/1f1f9-1f1f2.png new file mode 100644 index 00000000..5be97cb5 Binary files /dev/null and b/emojis/1f1f9-1f1f2.png differ diff --git a/emojis/1f1f9-1f1f3.png b/emojis/1f1f9-1f1f3.png new file mode 100644 index 00000000..a935b0b4 Binary files /dev/null and b/emojis/1f1f9-1f1f3.png differ diff --git a/emojis/1f1f9-1f1f4.png b/emojis/1f1f9-1f1f4.png new file mode 100644 index 00000000..5c9099c7 Binary files /dev/null and b/emojis/1f1f9-1f1f4.png differ diff --git a/emojis/1f1f9-1f1f7.png b/emojis/1f1f9-1f1f7.png new file mode 100644 index 00000000..ab80a9a7 Binary files /dev/null and b/emojis/1f1f9-1f1f7.png differ diff --git a/emojis/1f1f9-1f1f9.png b/emojis/1f1f9-1f1f9.png new file mode 100644 index 00000000..49fa13bc Binary files /dev/null and b/emojis/1f1f9-1f1f9.png differ diff --git a/emojis/1f1f9-1f1fb.png b/emojis/1f1f9-1f1fb.png new file mode 100644 index 00000000..3cfdb29d Binary files /dev/null and b/emojis/1f1f9-1f1fb.png differ diff --git a/emojis/1f1f9-1f1fc.png b/emojis/1f1f9-1f1fc.png new file mode 100644 index 00000000..7447face Binary files /dev/null and b/emojis/1f1f9-1f1fc.png differ diff --git a/emojis/1f1f9-1f1ff.png b/emojis/1f1f9-1f1ff.png new file mode 100644 index 00000000..311f43e2 Binary files /dev/null and b/emojis/1f1f9-1f1ff.png differ diff --git a/emojis/1f1fa-1f1e6.png b/emojis/1f1fa-1f1e6.png new file mode 100644 index 00000000..4970ac81 Binary files /dev/null and b/emojis/1f1fa-1f1e6.png differ diff --git a/emojis/1f1fa-1f1ec.png b/emojis/1f1fa-1f1ec.png new file mode 100644 index 00000000..46fd6b67 Binary files /dev/null and b/emojis/1f1fa-1f1ec.png differ diff --git a/emojis/1f1fa-1f1f2.png b/emojis/1f1fa-1f1f2.png new file mode 100644 index 00000000..b9bc8ecf Binary files /dev/null and b/emojis/1f1fa-1f1f2.png differ diff --git a/emojis/1f1fa-1f1f8.png b/emojis/1f1fa-1f1f8.png new file mode 100644 index 00000000..b9bc8ecf Binary files /dev/null and b/emojis/1f1fa-1f1f8.png differ diff --git a/emojis/1f1fa-1f1fe.png b/emojis/1f1fa-1f1fe.png new file mode 100644 index 00000000..8f8dec2f Binary files /dev/null and b/emojis/1f1fa-1f1fe.png differ diff --git a/emojis/1f1fa-1f1ff.png b/emojis/1f1fa-1f1ff.png new file mode 100644 index 00000000..2379bf4a Binary files /dev/null and b/emojis/1f1fa-1f1ff.png differ diff --git a/emojis/1f1fb-1f1e6.png b/emojis/1f1fb-1f1e6.png new file mode 100644 index 00000000..74ed2806 Binary files /dev/null and b/emojis/1f1fb-1f1e6.png differ diff --git a/emojis/1f1fb-1f1e8.png b/emojis/1f1fb-1f1e8.png new file mode 100644 index 00000000..a319a043 Binary files /dev/null and b/emojis/1f1fb-1f1e8.png differ diff --git a/emojis/1f1fb-1f1ea.png b/emojis/1f1fb-1f1ea.png new file mode 100644 index 00000000..2af4c6cd Binary files /dev/null and b/emojis/1f1fb-1f1ea.png differ diff --git a/emojis/1f1fb-1f1ec.png b/emojis/1f1fb-1f1ec.png new file mode 100644 index 00000000..90e2af61 Binary files /dev/null and b/emojis/1f1fb-1f1ec.png differ diff --git a/emojis/1f1fb-1f1ee.png b/emojis/1f1fb-1f1ee.png new file mode 100644 index 00000000..6ff10308 Binary files /dev/null and b/emojis/1f1fb-1f1ee.png differ diff --git a/emojis/1f1fb-1f1f3.png b/emojis/1f1fb-1f1f3.png new file mode 100644 index 00000000..8e8b998a Binary files /dev/null and b/emojis/1f1fb-1f1f3.png differ diff --git a/emojis/1f1fb-1f1fa.png b/emojis/1f1fb-1f1fa.png new file mode 100644 index 00000000..a6780dbd Binary files /dev/null and b/emojis/1f1fb-1f1fa.png differ diff --git a/emojis/1f1fc-1f1eb.png b/emojis/1f1fc-1f1eb.png new file mode 100644 index 00000000..edf9ec30 Binary files /dev/null and b/emojis/1f1fc-1f1eb.png differ diff --git a/emojis/1f1fc-1f1f8.png b/emojis/1f1fc-1f1f8.png new file mode 100644 index 00000000..2b6f6388 Binary files /dev/null and b/emojis/1f1fc-1f1f8.png differ diff --git a/emojis/1f1fd-1f1f0.png b/emojis/1f1fd-1f1f0.png new file mode 100644 index 00000000..ba53b654 Binary files /dev/null and b/emojis/1f1fd-1f1f0.png differ diff --git a/emojis/1f1fe-1f1ea.png b/emojis/1f1fe-1f1ea.png new file mode 100644 index 00000000..47f96ef4 Binary files /dev/null and b/emojis/1f1fe-1f1ea.png differ diff --git a/emojis/1f1fe-1f1f9.png b/emojis/1f1fe-1f1f9.png new file mode 100644 index 00000000..5a1b2d9b Binary files /dev/null and b/emojis/1f1fe-1f1f9.png differ diff --git a/emojis/1f1ff-1f1e6.png b/emojis/1f1ff-1f1e6.png new file mode 100644 index 00000000..178709f6 Binary files /dev/null and b/emojis/1f1ff-1f1e6.png differ diff --git a/emojis/1f1ff-1f1f2.png b/emojis/1f1ff-1f1f2.png new file mode 100644 index 00000000..66afe555 Binary files /dev/null and b/emojis/1f1ff-1f1f2.png differ diff --git a/emojis/1f1ff-1f1fc.png b/emojis/1f1ff-1f1fc.png new file mode 100644 index 00000000..1ccd92c5 Binary files /dev/null and b/emojis/1f1ff-1f1fc.png differ diff --git a/emojis/1f201.png b/emojis/1f201.png new file mode 100644 index 00000000..7f81f8d0 Binary files /dev/null and b/emojis/1f201.png differ diff --git a/emojis/1f202.png b/emojis/1f202.png new file mode 100644 index 00000000..b5af88d9 Binary files /dev/null and b/emojis/1f202.png differ diff --git a/emojis/1f21a.png b/emojis/1f21a.png new file mode 100644 index 00000000..241fb799 Binary files /dev/null and b/emojis/1f21a.png differ diff --git a/emojis/1f22f.png b/emojis/1f22f.png new file mode 100644 index 00000000..b12caac7 Binary files /dev/null and b/emojis/1f22f.png differ diff --git a/emojis/1f232.png b/emojis/1f232.png new file mode 100644 index 00000000..b53f3d91 Binary files /dev/null and b/emojis/1f232.png differ diff --git a/emojis/1f233.png b/emojis/1f233.png new file mode 100644 index 00000000..97ad4460 Binary files /dev/null and b/emojis/1f233.png differ diff --git a/emojis/1f234.png b/emojis/1f234.png new file mode 100644 index 00000000..2cd2d980 Binary files /dev/null and b/emojis/1f234.png differ diff --git a/emojis/1f235.png b/emojis/1f235.png new file mode 100644 index 00000000..82652e6c Binary files /dev/null and b/emojis/1f235.png differ diff --git a/emojis/1f236.png b/emojis/1f236.png new file mode 100644 index 00000000..172ef999 Binary files /dev/null and b/emojis/1f236.png differ diff --git a/emojis/1f237.png b/emojis/1f237.png new file mode 100644 index 00000000..4d8388f0 Binary files /dev/null and b/emojis/1f237.png differ diff --git a/emojis/1f238.png b/emojis/1f238.png new file mode 100644 index 00000000..356c6460 Binary files /dev/null and b/emojis/1f238.png differ diff --git a/emojis/1f239.png b/emojis/1f239.png new file mode 100644 index 00000000..a06ee803 Binary files /dev/null and b/emojis/1f239.png differ diff --git a/emojis/1f23a.png b/emojis/1f23a.png new file mode 100644 index 00000000..d011c055 Binary files /dev/null and b/emojis/1f23a.png differ diff --git a/emojis/1f250.png b/emojis/1f250.png new file mode 100644 index 00000000..875e6474 Binary files /dev/null and b/emojis/1f250.png differ diff --git a/emojis/1f251.png b/emojis/1f251.png new file mode 100644 index 00000000..d23ab77b Binary files /dev/null and b/emojis/1f251.png differ diff --git a/emojis/1f300.png b/emojis/1f300.png new file mode 100644 index 00000000..a4935a98 Binary files /dev/null and b/emojis/1f300.png differ diff --git a/emojis/1f301.png b/emojis/1f301.png new file mode 100644 index 00000000..0959db7c Binary files /dev/null and b/emojis/1f301.png differ diff --git a/emojis/1f302.png b/emojis/1f302.png new file mode 100644 index 00000000..9d2be1fa Binary files /dev/null and b/emojis/1f302.png differ diff --git a/emojis/1f303.png b/emojis/1f303.png new file mode 100644 index 00000000..d7397b55 Binary files /dev/null and b/emojis/1f303.png differ diff --git a/emojis/1f304.png b/emojis/1f304.png new file mode 100644 index 00000000..fdc62a87 Binary files /dev/null and b/emojis/1f304.png differ diff --git a/emojis/1f305.png b/emojis/1f305.png new file mode 100644 index 00000000..eb83dd99 Binary files /dev/null and b/emojis/1f305.png differ diff --git a/emojis/1f306.png b/emojis/1f306.png new file mode 100644 index 00000000..99572259 Binary files /dev/null and b/emojis/1f306.png differ diff --git a/emojis/1f307.png b/emojis/1f307.png new file mode 100644 index 00000000..377727d0 Binary files /dev/null and b/emojis/1f307.png differ diff --git a/emojis/1f308.png b/emojis/1f308.png new file mode 100644 index 00000000..ab59038c Binary files /dev/null and b/emojis/1f308.png differ diff --git a/emojis/1f309.png b/emojis/1f309.png new file mode 100644 index 00000000..62b1efd7 Binary files /dev/null and b/emojis/1f309.png differ diff --git a/emojis/1f30a.png b/emojis/1f30a.png new file mode 100644 index 00000000..466afeb6 Binary files /dev/null and b/emojis/1f30a.png differ diff --git a/emojis/1f30b.png b/emojis/1f30b.png new file mode 100644 index 00000000..c697714c Binary files /dev/null and b/emojis/1f30b.png differ diff --git a/emojis/1f30c.png b/emojis/1f30c.png new file mode 100644 index 00000000..9f79fe7f Binary files /dev/null and b/emojis/1f30c.png differ diff --git a/emojis/1f30d.png b/emojis/1f30d.png new file mode 100644 index 00000000..afdefecd Binary files /dev/null and b/emojis/1f30d.png differ diff --git a/emojis/1f30e.png b/emojis/1f30e.png new file mode 100644 index 00000000..b4371023 Binary files /dev/null and b/emojis/1f30e.png differ diff --git a/emojis/1f30f.png b/emojis/1f30f.png new file mode 100644 index 00000000..c557645e Binary files /dev/null and b/emojis/1f30f.png differ diff --git a/emojis/1f310.png b/emojis/1f310.png new file mode 100644 index 00000000..d890f6a1 Binary files /dev/null and b/emojis/1f310.png differ diff --git a/emojis/1f311.png b/emojis/1f311.png new file mode 100644 index 00000000..376435e4 Binary files /dev/null and b/emojis/1f311.png differ diff --git a/emojis/1f312.png b/emojis/1f312.png new file mode 100644 index 00000000..8a8e8eae Binary files /dev/null and b/emojis/1f312.png differ diff --git a/emojis/1f313.png b/emojis/1f313.png new file mode 100644 index 00000000..60493a47 Binary files /dev/null and b/emojis/1f313.png differ diff --git a/emojis/1f314.png b/emojis/1f314.png new file mode 100644 index 00000000..c43e16c1 Binary files /dev/null and b/emojis/1f314.png differ diff --git a/emojis/1f315.png b/emojis/1f315.png new file mode 100644 index 00000000..995ccf7c Binary files /dev/null and b/emojis/1f315.png differ diff --git a/emojis/1f316.png b/emojis/1f316.png new file mode 100644 index 00000000..0a14c1e0 Binary files /dev/null and b/emojis/1f316.png differ diff --git a/emojis/1f317.png b/emojis/1f317.png new file mode 100644 index 00000000..b5095e24 Binary files /dev/null and b/emojis/1f317.png differ diff --git a/emojis/1f318.png b/emojis/1f318.png new file mode 100644 index 00000000..14abe44a Binary files /dev/null and b/emojis/1f318.png differ diff --git a/emojis/1f319.png b/emojis/1f319.png new file mode 100644 index 00000000..169ce3d7 Binary files /dev/null and b/emojis/1f319.png differ diff --git a/emojis/1f31a.png b/emojis/1f31a.png new file mode 100644 index 00000000..44c9b5db Binary files /dev/null and b/emojis/1f31a.png differ diff --git a/emojis/1f31b.png b/emojis/1f31b.png new file mode 100644 index 00000000..69d7ae6f Binary files /dev/null and b/emojis/1f31b.png differ diff --git a/emojis/1f31c.png b/emojis/1f31c.png new file mode 100644 index 00000000..176cce28 Binary files /dev/null and b/emojis/1f31c.png differ diff --git a/emojis/1f31d.png b/emojis/1f31d.png new file mode 100644 index 00000000..ff73594b Binary files /dev/null and b/emojis/1f31d.png differ diff --git a/emojis/1f31e.png b/emojis/1f31e.png new file mode 100644 index 00000000..85df9bc4 Binary files /dev/null and b/emojis/1f31e.png differ diff --git a/emojis/1f31f.png b/emojis/1f31f.png new file mode 100644 index 00000000..78898cc0 Binary files /dev/null and b/emojis/1f31f.png differ diff --git a/emojis/1f320.png b/emojis/1f320.png new file mode 100644 index 00000000..84a6d159 Binary files /dev/null and b/emojis/1f320.png differ diff --git a/emojis/1f321.png b/emojis/1f321.png new file mode 100644 index 00000000..42ae0658 Binary files /dev/null and b/emojis/1f321.png differ diff --git a/emojis/1f324.png b/emojis/1f324.png new file mode 100644 index 00000000..1c374a5f Binary files /dev/null and b/emojis/1f324.png differ diff --git a/emojis/1f325.png b/emojis/1f325.png new file mode 100644 index 00000000..87f70797 Binary files /dev/null and b/emojis/1f325.png differ diff --git a/emojis/1f326.png b/emojis/1f326.png new file mode 100644 index 00000000..5fa89ded Binary files /dev/null and b/emojis/1f326.png differ diff --git a/emojis/1f327.png b/emojis/1f327.png new file mode 100644 index 00000000..51712964 Binary files /dev/null and b/emojis/1f327.png differ diff --git a/emojis/1f328.png b/emojis/1f328.png new file mode 100644 index 00000000..70010deb Binary files /dev/null and b/emojis/1f328.png differ diff --git a/emojis/1f329.png b/emojis/1f329.png new file mode 100644 index 00000000..cb08e47b Binary files /dev/null and b/emojis/1f329.png differ diff --git a/emojis/1f32a.png b/emojis/1f32a.png new file mode 100644 index 00000000..f87600b1 Binary files /dev/null and b/emojis/1f32a.png differ diff --git a/emojis/1f32b.png b/emojis/1f32b.png new file mode 100644 index 00000000..21b036fb Binary files /dev/null and b/emojis/1f32b.png differ diff --git a/emojis/1f32c.png b/emojis/1f32c.png new file mode 100644 index 00000000..67d1d70a Binary files /dev/null and b/emojis/1f32c.png differ diff --git a/emojis/1f32d.png b/emojis/1f32d.png new file mode 100644 index 00000000..f834ce46 Binary files /dev/null and b/emojis/1f32d.png differ diff --git a/emojis/1f32e.png b/emojis/1f32e.png new file mode 100644 index 00000000..c44b9318 Binary files /dev/null and b/emojis/1f32e.png differ diff --git a/emojis/1f32f.png b/emojis/1f32f.png new file mode 100644 index 00000000..0e7cde89 Binary files /dev/null and b/emojis/1f32f.png differ diff --git a/emojis/1f330.png b/emojis/1f330.png new file mode 100644 index 00000000..632f9e2a Binary files /dev/null and b/emojis/1f330.png differ diff --git a/emojis/1f331.png b/emojis/1f331.png new file mode 100644 index 00000000..51c2c92e Binary files /dev/null and b/emojis/1f331.png differ diff --git a/emojis/1f332.png b/emojis/1f332.png new file mode 100644 index 00000000..d1aebc43 Binary files /dev/null and b/emojis/1f332.png differ diff --git a/emojis/1f333.png b/emojis/1f333.png new file mode 100644 index 00000000..e7948a34 Binary files /dev/null and b/emojis/1f333.png differ diff --git a/emojis/1f334.png b/emojis/1f334.png new file mode 100644 index 00000000..f00a24bc Binary files /dev/null and b/emojis/1f334.png differ diff --git a/emojis/1f335.png b/emojis/1f335.png new file mode 100644 index 00000000..664ae7e7 Binary files /dev/null and b/emojis/1f335.png differ diff --git a/emojis/1f336.png b/emojis/1f336.png new file mode 100644 index 00000000..aec088d9 Binary files /dev/null and b/emojis/1f336.png differ diff --git a/emojis/1f337.png b/emojis/1f337.png new file mode 100644 index 00000000..a8ef0ce0 Binary files /dev/null and b/emojis/1f337.png differ diff --git a/emojis/1f338.png b/emojis/1f338.png new file mode 100644 index 00000000..82910117 Binary files /dev/null and b/emojis/1f338.png differ diff --git a/emojis/1f339.png b/emojis/1f339.png new file mode 100644 index 00000000..4c0f5b0b Binary files /dev/null and b/emojis/1f339.png differ diff --git a/emojis/1f33a.png b/emojis/1f33a.png new file mode 100644 index 00000000..27cc8b6f Binary files /dev/null and b/emojis/1f33a.png differ diff --git a/emojis/1f33b.png b/emojis/1f33b.png new file mode 100644 index 00000000..3bde2ad6 Binary files /dev/null and b/emojis/1f33b.png differ diff --git a/emojis/1f33c.png b/emojis/1f33c.png new file mode 100644 index 00000000..7d8f1e9d Binary files /dev/null and b/emojis/1f33c.png differ diff --git a/emojis/1f33d.png b/emojis/1f33d.png new file mode 100644 index 00000000..ae2bbe52 Binary files /dev/null and b/emojis/1f33d.png differ diff --git a/emojis/1f33e.png b/emojis/1f33e.png new file mode 100644 index 00000000..04a7fcd8 Binary files /dev/null and b/emojis/1f33e.png differ diff --git a/emojis/1f33f.png b/emojis/1f33f.png new file mode 100644 index 00000000..1ea9b400 Binary files /dev/null and b/emojis/1f33f.png differ diff --git a/emojis/1f340.png b/emojis/1f340.png new file mode 100644 index 00000000..54cb4a1c Binary files /dev/null and b/emojis/1f340.png differ diff --git a/emojis/1f341.png b/emojis/1f341.png new file mode 100644 index 00000000..6b9f4717 Binary files /dev/null and b/emojis/1f341.png differ diff --git a/emojis/1f342.png b/emojis/1f342.png new file mode 100644 index 00000000..4c5ed023 Binary files /dev/null and b/emojis/1f342.png differ diff --git a/emojis/1f343.png b/emojis/1f343.png new file mode 100644 index 00000000..70ede459 Binary files /dev/null and b/emojis/1f343.png differ diff --git a/emojis/1f344.png b/emojis/1f344.png new file mode 100644 index 00000000..8db9f0b8 Binary files /dev/null and b/emojis/1f344.png differ diff --git a/emojis/1f345.png b/emojis/1f345.png new file mode 100644 index 00000000..c90bd513 Binary files /dev/null and b/emojis/1f345.png differ diff --git a/emojis/1f346.png b/emojis/1f346.png new file mode 100644 index 00000000..ca69e7b8 Binary files /dev/null and b/emojis/1f346.png differ diff --git a/emojis/1f347.png b/emojis/1f347.png new file mode 100644 index 00000000..0c193db3 Binary files /dev/null and b/emojis/1f347.png differ diff --git a/emojis/1f348.png b/emojis/1f348.png new file mode 100644 index 00000000..98eb6336 Binary files /dev/null and b/emojis/1f348.png differ diff --git a/emojis/1f349.png b/emojis/1f349.png new file mode 100644 index 00000000..26417714 Binary files /dev/null and b/emojis/1f349.png differ diff --git a/emojis/1f34a.png b/emojis/1f34a.png new file mode 100644 index 00000000..590d80ad Binary files /dev/null and b/emojis/1f34a.png differ diff --git a/emojis/1f34b.png b/emojis/1f34b.png new file mode 100644 index 00000000..c61aad48 Binary files /dev/null and b/emojis/1f34b.png differ diff --git a/emojis/1f34c.png b/emojis/1f34c.png new file mode 100644 index 00000000..9d5793ff Binary files /dev/null and b/emojis/1f34c.png differ diff --git a/emojis/1f34d.png b/emojis/1f34d.png new file mode 100644 index 00000000..526f72cf Binary files /dev/null and b/emojis/1f34d.png differ diff --git a/emojis/1f34e.png b/emojis/1f34e.png new file mode 100644 index 00000000..a70cde15 Binary files /dev/null and b/emojis/1f34e.png differ diff --git a/emojis/1f34f.png b/emojis/1f34f.png new file mode 100644 index 00000000..e9fe7785 Binary files /dev/null and b/emojis/1f34f.png differ diff --git a/emojis/1f350.png b/emojis/1f350.png new file mode 100644 index 00000000..a4f11726 Binary files /dev/null and b/emojis/1f350.png differ diff --git a/emojis/1f351.png b/emojis/1f351.png new file mode 100644 index 00000000..2151ebac Binary files /dev/null and b/emojis/1f351.png differ diff --git a/emojis/1f352.png b/emojis/1f352.png new file mode 100644 index 00000000..4c81dccc Binary files /dev/null and b/emojis/1f352.png differ diff --git a/emojis/1f353.png b/emojis/1f353.png new file mode 100644 index 00000000..03d57e7b Binary files /dev/null and b/emojis/1f353.png differ diff --git a/emojis/1f354.png b/emojis/1f354.png new file mode 100644 index 00000000..5231bed1 Binary files /dev/null and b/emojis/1f354.png differ diff --git a/emojis/1f355.png b/emojis/1f355.png new file mode 100644 index 00000000..1f43782b Binary files /dev/null and b/emojis/1f355.png differ diff --git a/emojis/1f356.png b/emojis/1f356.png new file mode 100644 index 00000000..e7c8b7a2 Binary files /dev/null and b/emojis/1f356.png differ diff --git a/emojis/1f357.png b/emojis/1f357.png new file mode 100644 index 00000000..6924bdbc Binary files /dev/null and b/emojis/1f357.png differ diff --git a/emojis/1f358.png b/emojis/1f358.png new file mode 100644 index 00000000..7067fb72 Binary files /dev/null and b/emojis/1f358.png differ diff --git a/emojis/1f359.png b/emojis/1f359.png new file mode 100644 index 00000000..9a670d04 Binary files /dev/null and b/emojis/1f359.png differ diff --git a/emojis/1f35a.png b/emojis/1f35a.png new file mode 100644 index 00000000..d9e3d267 Binary files /dev/null and b/emojis/1f35a.png differ diff --git a/emojis/1f35b.png b/emojis/1f35b.png new file mode 100644 index 00000000..330c53f3 Binary files /dev/null and b/emojis/1f35b.png differ diff --git a/emojis/1f35c.png b/emojis/1f35c.png new file mode 100644 index 00000000..dd3a7349 Binary files /dev/null and b/emojis/1f35c.png differ diff --git a/emojis/1f35d.png b/emojis/1f35d.png new file mode 100644 index 00000000..ec2416e8 Binary files /dev/null and b/emojis/1f35d.png differ diff --git a/emojis/1f35e.png b/emojis/1f35e.png new file mode 100644 index 00000000..46331354 Binary files /dev/null and b/emojis/1f35e.png differ diff --git a/emojis/1f35f.png b/emojis/1f35f.png new file mode 100644 index 00000000..58c3cdd7 Binary files /dev/null and b/emojis/1f35f.png differ diff --git a/emojis/1f360.png b/emojis/1f360.png new file mode 100644 index 00000000..de9d9139 Binary files /dev/null and b/emojis/1f360.png differ diff --git a/emojis/1f361.png b/emojis/1f361.png new file mode 100644 index 00000000..3c476860 Binary files /dev/null and b/emojis/1f361.png differ diff --git a/emojis/1f362.png b/emojis/1f362.png new file mode 100644 index 00000000..607a8278 Binary files /dev/null and b/emojis/1f362.png differ diff --git a/emojis/1f363.png b/emojis/1f363.png new file mode 100644 index 00000000..84463e2c Binary files /dev/null and b/emojis/1f363.png differ diff --git a/emojis/1f364.png b/emojis/1f364.png new file mode 100644 index 00000000..d9b68b30 Binary files /dev/null and b/emojis/1f364.png differ diff --git a/emojis/1f365.png b/emojis/1f365.png new file mode 100644 index 00000000..fcb93b18 Binary files /dev/null and b/emojis/1f365.png differ diff --git a/emojis/1f366.png b/emojis/1f366.png new file mode 100644 index 00000000..c30a07cc Binary files /dev/null and b/emojis/1f366.png differ diff --git a/emojis/1f367.png b/emojis/1f367.png new file mode 100644 index 00000000..c284b4e4 Binary files /dev/null and b/emojis/1f367.png differ diff --git a/emojis/1f368.png b/emojis/1f368.png new file mode 100644 index 00000000..28d6fbb6 Binary files /dev/null and b/emojis/1f368.png differ diff --git a/emojis/1f369.png b/emojis/1f369.png new file mode 100644 index 00000000..4f9a2115 Binary files /dev/null and b/emojis/1f369.png differ diff --git a/emojis/1f36a.png b/emojis/1f36a.png new file mode 100644 index 00000000..9f9650c4 Binary files /dev/null and b/emojis/1f36a.png differ diff --git a/emojis/1f36b.png b/emojis/1f36b.png new file mode 100644 index 00000000..6981c442 Binary files /dev/null and b/emojis/1f36b.png differ diff --git a/emojis/1f36c.png b/emojis/1f36c.png new file mode 100644 index 00000000..a532ec49 Binary files /dev/null and b/emojis/1f36c.png differ diff --git a/emojis/1f36d.png b/emojis/1f36d.png new file mode 100644 index 00000000..7859036c Binary files /dev/null and b/emojis/1f36d.png differ diff --git a/emojis/1f36e.png b/emojis/1f36e.png new file mode 100644 index 00000000..40c6e740 Binary files /dev/null and b/emojis/1f36e.png differ diff --git a/emojis/1f36f.png b/emojis/1f36f.png new file mode 100644 index 00000000..2d3ea469 Binary files /dev/null and b/emojis/1f36f.png differ diff --git a/emojis/1f370.png b/emojis/1f370.png new file mode 100644 index 00000000..0d5c3563 Binary files /dev/null and b/emojis/1f370.png differ diff --git a/emojis/1f371.png b/emojis/1f371.png new file mode 100644 index 00000000..97a27f26 Binary files /dev/null and b/emojis/1f371.png differ diff --git a/emojis/1f372.png b/emojis/1f372.png new file mode 100644 index 00000000..09b220ee Binary files /dev/null and b/emojis/1f372.png differ diff --git a/emojis/1f373.png b/emojis/1f373.png new file mode 100644 index 00000000..a02cd3b5 Binary files /dev/null and b/emojis/1f373.png differ diff --git a/emojis/1f374.png b/emojis/1f374.png new file mode 100644 index 00000000..381eee18 Binary files /dev/null and b/emojis/1f374.png differ diff --git a/emojis/1f375.png b/emojis/1f375.png new file mode 100644 index 00000000..8a132568 Binary files /dev/null and b/emojis/1f375.png differ diff --git a/emojis/1f376.png b/emojis/1f376.png new file mode 100644 index 00000000..375a5975 Binary files /dev/null and b/emojis/1f376.png differ diff --git a/emojis/1f377.png b/emojis/1f377.png new file mode 100644 index 00000000..8c04a183 Binary files /dev/null and b/emojis/1f377.png differ diff --git a/emojis/1f378.png b/emojis/1f378.png new file mode 100644 index 00000000..c18dac4d Binary files /dev/null and b/emojis/1f378.png differ diff --git a/emojis/1f379.png b/emojis/1f379.png new file mode 100644 index 00000000..03217e27 Binary files /dev/null and b/emojis/1f379.png differ diff --git a/emojis/1f37a.png b/emojis/1f37a.png new file mode 100644 index 00000000..b98a026e Binary files /dev/null and b/emojis/1f37a.png differ diff --git a/emojis/1f37b.png b/emojis/1f37b.png new file mode 100644 index 00000000..161d7fde Binary files /dev/null and b/emojis/1f37b.png differ diff --git a/emojis/1f37c.png b/emojis/1f37c.png new file mode 100644 index 00000000..99b01c4c Binary files /dev/null and b/emojis/1f37c.png differ diff --git a/emojis/1f37d.png b/emojis/1f37d.png new file mode 100644 index 00000000..9e7c6de0 Binary files /dev/null and b/emojis/1f37d.png differ diff --git a/emojis/1f37e.png b/emojis/1f37e.png new file mode 100644 index 00000000..1ede0f4b Binary files /dev/null and b/emojis/1f37e.png differ diff --git a/emojis/1f37f.png b/emojis/1f37f.png new file mode 100644 index 00000000..1ffcd671 Binary files /dev/null and b/emojis/1f37f.png differ diff --git a/emojis/1f380.png b/emojis/1f380.png new file mode 100644 index 00000000..152348a0 Binary files /dev/null and b/emojis/1f380.png differ diff --git a/emojis/1f381.png b/emojis/1f381.png new file mode 100644 index 00000000..40ac1e50 Binary files /dev/null and b/emojis/1f381.png differ diff --git a/emojis/1f382.png b/emojis/1f382.png new file mode 100644 index 00000000..8b4dacd9 Binary files /dev/null and b/emojis/1f382.png differ diff --git a/emojis/1f383.png b/emojis/1f383.png new file mode 100644 index 00000000..31da8e62 Binary files /dev/null and b/emojis/1f383.png differ diff --git a/emojis/1f384.png b/emojis/1f384.png new file mode 100644 index 00000000..c758f4ff Binary files /dev/null and b/emojis/1f384.png differ diff --git a/emojis/1f385.png b/emojis/1f385.png new file mode 100644 index 00000000..4a4485a4 Binary files /dev/null and b/emojis/1f385.png differ diff --git a/emojis/1f386.png b/emojis/1f386.png new file mode 100644 index 00000000..43e7bda6 Binary files /dev/null and b/emojis/1f386.png differ diff --git a/emojis/1f387.png b/emojis/1f387.png new file mode 100644 index 00000000..623cb0b0 Binary files /dev/null and b/emojis/1f387.png differ diff --git a/emojis/1f388.png b/emojis/1f388.png new file mode 100644 index 00000000..ca775142 Binary files /dev/null and b/emojis/1f388.png differ diff --git a/emojis/1f389.png b/emojis/1f389.png new file mode 100644 index 00000000..c0e0234b Binary files /dev/null and b/emojis/1f389.png differ diff --git a/emojis/1f38a.png b/emojis/1f38a.png new file mode 100644 index 00000000..4d52260a Binary files /dev/null and b/emojis/1f38a.png differ diff --git a/emojis/1f38b.png b/emojis/1f38b.png new file mode 100644 index 00000000..fe353582 Binary files /dev/null and b/emojis/1f38b.png differ diff --git a/emojis/1f38c.png b/emojis/1f38c.png new file mode 100644 index 00000000..49886853 Binary files /dev/null and b/emojis/1f38c.png differ diff --git a/emojis/1f38d.png b/emojis/1f38d.png new file mode 100644 index 00000000..8369970b Binary files /dev/null and b/emojis/1f38d.png differ diff --git a/emojis/1f38e.png b/emojis/1f38e.png new file mode 100644 index 00000000..978ca843 Binary files /dev/null and b/emojis/1f38e.png differ diff --git a/emojis/1f38f.png b/emojis/1f38f.png new file mode 100644 index 00000000..c2b4aa46 Binary files /dev/null and b/emojis/1f38f.png differ diff --git a/emojis/1f390.png b/emojis/1f390.png new file mode 100644 index 00000000..912955f1 Binary files /dev/null and b/emojis/1f390.png differ diff --git a/emojis/1f391.png b/emojis/1f391.png new file mode 100644 index 00000000..5163e5ce Binary files /dev/null and b/emojis/1f391.png differ diff --git a/emojis/1f392.png b/emojis/1f392.png new file mode 100644 index 00000000..c2b6a443 Binary files /dev/null and b/emojis/1f392.png differ diff --git a/emojis/1f393.png b/emojis/1f393.png new file mode 100644 index 00000000..fe380c24 Binary files /dev/null and b/emojis/1f393.png differ diff --git a/emojis/1f396.png b/emojis/1f396.png new file mode 100644 index 00000000..5b1a3f66 Binary files /dev/null and b/emojis/1f396.png differ diff --git a/emojis/1f397.png b/emojis/1f397.png new file mode 100644 index 00000000..0c75838f Binary files /dev/null and b/emojis/1f397.png differ diff --git a/emojis/1f399.png b/emojis/1f399.png new file mode 100644 index 00000000..a9cf3323 Binary files /dev/null and b/emojis/1f399.png differ diff --git a/emojis/1f39a.png b/emojis/1f39a.png new file mode 100644 index 00000000..ae958370 Binary files /dev/null and b/emojis/1f39a.png differ diff --git a/emojis/1f39b.png b/emojis/1f39b.png new file mode 100644 index 00000000..c4992d91 Binary files /dev/null and b/emojis/1f39b.png differ diff --git a/emojis/1f39e.png b/emojis/1f39e.png new file mode 100644 index 00000000..39939745 Binary files /dev/null and b/emojis/1f39e.png differ diff --git a/emojis/1f39f.png b/emojis/1f39f.png new file mode 100644 index 00000000..9fa260f6 Binary files /dev/null and b/emojis/1f39f.png differ diff --git a/emojis/1f3a0.png b/emojis/1f3a0.png new file mode 100644 index 00000000..f2a17910 Binary files /dev/null and b/emojis/1f3a0.png differ diff --git a/emojis/1f3a1.png b/emojis/1f3a1.png new file mode 100644 index 00000000..4de439ad Binary files /dev/null and b/emojis/1f3a1.png differ diff --git a/emojis/1f3a2.png b/emojis/1f3a2.png new file mode 100644 index 00000000..776c56c8 Binary files /dev/null and b/emojis/1f3a2.png differ diff --git a/emojis/1f3a3.png b/emojis/1f3a3.png new file mode 100644 index 00000000..32f5e909 Binary files /dev/null and b/emojis/1f3a3.png differ diff --git a/emojis/1f3a4.png b/emojis/1f3a4.png new file mode 100644 index 00000000..726ff37a Binary files /dev/null and b/emojis/1f3a4.png differ diff --git a/emojis/1f3a5.png b/emojis/1f3a5.png new file mode 100644 index 00000000..5d49eac4 Binary files /dev/null and b/emojis/1f3a5.png differ diff --git a/emojis/1f3a6.png b/emojis/1f3a6.png new file mode 100644 index 00000000..291299e6 Binary files /dev/null and b/emojis/1f3a6.png differ diff --git a/emojis/1f3a7.png b/emojis/1f3a7.png new file mode 100644 index 00000000..3473aefc Binary files /dev/null and b/emojis/1f3a7.png differ diff --git a/emojis/1f3a8.png b/emojis/1f3a8.png new file mode 100644 index 00000000..59dc84e7 Binary files /dev/null and b/emojis/1f3a8.png differ diff --git a/emojis/1f3a9.png b/emojis/1f3a9.png new file mode 100644 index 00000000..00af7a7a Binary files /dev/null and b/emojis/1f3a9.png differ diff --git a/emojis/1f3aa.png b/emojis/1f3aa.png new file mode 100644 index 00000000..36b4d72b Binary files /dev/null and b/emojis/1f3aa.png differ diff --git a/emojis/1f3ab.png b/emojis/1f3ab.png new file mode 100644 index 00000000..b25d2fa0 Binary files /dev/null and b/emojis/1f3ab.png differ diff --git a/emojis/1f3ac.png b/emojis/1f3ac.png new file mode 100644 index 00000000..1ba9532c Binary files /dev/null and b/emojis/1f3ac.png differ diff --git a/emojis/1f3ad.png b/emojis/1f3ad.png new file mode 100644 index 00000000..8bd0b3b5 Binary files /dev/null and b/emojis/1f3ad.png differ diff --git a/emojis/1f3ae.png b/emojis/1f3ae.png new file mode 100644 index 00000000..70916d21 Binary files /dev/null and b/emojis/1f3ae.png differ diff --git a/emojis/1f3af.png b/emojis/1f3af.png new file mode 100644 index 00000000..81131f3f Binary files /dev/null and b/emojis/1f3af.png differ diff --git a/emojis/1f3b0.png b/emojis/1f3b0.png new file mode 100644 index 00000000..5ccddee5 Binary files /dev/null and b/emojis/1f3b0.png differ diff --git a/emojis/1f3b1.png b/emojis/1f3b1.png new file mode 100644 index 00000000..3fd1cc4b Binary files /dev/null and b/emojis/1f3b1.png differ diff --git a/emojis/1f3b2.png b/emojis/1f3b2.png new file mode 100644 index 00000000..3ba81637 Binary files /dev/null and b/emojis/1f3b2.png differ diff --git a/emojis/1f3b3.png b/emojis/1f3b3.png new file mode 100644 index 00000000..52ba4715 Binary files /dev/null and b/emojis/1f3b3.png differ diff --git a/emojis/1f3b4.png b/emojis/1f3b4.png new file mode 100644 index 00000000..6a7cd731 Binary files /dev/null and b/emojis/1f3b4.png differ diff --git a/emojis/1f3b5.png b/emojis/1f3b5.png new file mode 100644 index 00000000..317accfd Binary files /dev/null and b/emojis/1f3b5.png differ diff --git a/emojis/1f3b6.png b/emojis/1f3b6.png new file mode 100644 index 00000000..467c6e6e Binary files /dev/null and b/emojis/1f3b6.png differ diff --git a/emojis/1f3b7.png b/emojis/1f3b7.png new file mode 100644 index 00000000..bb629257 Binary files /dev/null and b/emojis/1f3b7.png differ diff --git a/emojis/1f3b8.png b/emojis/1f3b8.png new file mode 100644 index 00000000..9b9bd5ab Binary files /dev/null and b/emojis/1f3b8.png differ diff --git a/emojis/1f3b9.png b/emojis/1f3b9.png new file mode 100644 index 00000000..7633f868 Binary files /dev/null and b/emojis/1f3b9.png differ diff --git a/emojis/1f3ba.png b/emojis/1f3ba.png new file mode 100644 index 00000000..b4fcc879 Binary files /dev/null and b/emojis/1f3ba.png differ diff --git a/emojis/1f3bb.png b/emojis/1f3bb.png new file mode 100644 index 00000000..5b0fdc00 Binary files /dev/null and b/emojis/1f3bb.png differ diff --git a/emojis/1f3bc.png b/emojis/1f3bc.png new file mode 100644 index 00000000..fa2edfae Binary files /dev/null and b/emojis/1f3bc.png differ diff --git a/emojis/1f3bd.png b/emojis/1f3bd.png new file mode 100644 index 00000000..69112fba Binary files /dev/null and b/emojis/1f3bd.png differ diff --git a/emojis/1f3be.png b/emojis/1f3be.png new file mode 100644 index 00000000..51b45a03 Binary files /dev/null and b/emojis/1f3be.png differ diff --git a/emojis/1f3bf.png b/emojis/1f3bf.png new file mode 100644 index 00000000..353767e6 Binary files /dev/null and b/emojis/1f3bf.png differ diff --git a/emojis/1f3c0.png b/emojis/1f3c0.png new file mode 100644 index 00000000..c743018f Binary files /dev/null and b/emojis/1f3c0.png differ diff --git a/emojis/1f3c1.png b/emojis/1f3c1.png new file mode 100644 index 00000000..b497b495 Binary files /dev/null and b/emojis/1f3c1.png differ diff --git a/emojis/1f3c2.png b/emojis/1f3c2.png new file mode 100644 index 00000000..d61994a5 Binary files /dev/null and b/emojis/1f3c2.png differ diff --git a/emojis/1f3c3.png b/emojis/1f3c3.png new file mode 100644 index 00000000..fd7ce435 Binary files /dev/null and b/emojis/1f3c3.png differ diff --git a/emojis/1f3c4.png b/emojis/1f3c4.png new file mode 100644 index 00000000..f05801c7 Binary files /dev/null and b/emojis/1f3c4.png differ diff --git a/emojis/1f3c5.png b/emojis/1f3c5.png new file mode 100644 index 00000000..775d93ed Binary files /dev/null and b/emojis/1f3c5.png differ diff --git a/emojis/1f3c6.png b/emojis/1f3c6.png new file mode 100644 index 00000000..7ce831af Binary files /dev/null and b/emojis/1f3c6.png differ diff --git a/emojis/1f3c7.png b/emojis/1f3c7.png new file mode 100644 index 00000000..d170130a Binary files /dev/null and b/emojis/1f3c7.png differ diff --git a/emojis/1f3c8.png b/emojis/1f3c8.png new file mode 100644 index 00000000..bcaa9827 Binary files /dev/null and b/emojis/1f3c8.png differ diff --git a/emojis/1f3c9.png b/emojis/1f3c9.png new file mode 100644 index 00000000..972757aa Binary files /dev/null and b/emojis/1f3c9.png differ diff --git a/emojis/1f3ca.png b/emojis/1f3ca.png new file mode 100644 index 00000000..616ee3d2 Binary files /dev/null and b/emojis/1f3ca.png differ diff --git a/emojis/1f3cb.png b/emojis/1f3cb.png new file mode 100644 index 00000000..90384ba8 Binary files /dev/null and b/emojis/1f3cb.png differ diff --git a/emojis/1f3cc.png b/emojis/1f3cc.png new file mode 100644 index 00000000..f3a744bd Binary files /dev/null and b/emojis/1f3cc.png differ diff --git a/emojis/1f3cd.png b/emojis/1f3cd.png new file mode 100644 index 00000000..7cc7a338 Binary files /dev/null and b/emojis/1f3cd.png differ diff --git a/emojis/1f3ce.png b/emojis/1f3ce.png new file mode 100644 index 00000000..5bc5f990 Binary files /dev/null and b/emojis/1f3ce.png differ diff --git a/emojis/1f3cf.png b/emojis/1f3cf.png new file mode 100644 index 00000000..a3bafefd Binary files /dev/null and b/emojis/1f3cf.png differ diff --git a/emojis/1f3d0.png b/emojis/1f3d0.png new file mode 100644 index 00000000..46bc628a Binary files /dev/null and b/emojis/1f3d0.png differ diff --git a/emojis/1f3d1.png b/emojis/1f3d1.png new file mode 100644 index 00000000..f2388391 Binary files /dev/null and b/emojis/1f3d1.png differ diff --git a/emojis/1f3d2.png b/emojis/1f3d2.png new file mode 100644 index 00000000..70abff04 Binary files /dev/null and b/emojis/1f3d2.png differ diff --git a/emojis/1f3d3.png b/emojis/1f3d3.png new file mode 100644 index 00000000..a5323e26 Binary files /dev/null and b/emojis/1f3d3.png differ diff --git a/emojis/1f3d4.png b/emojis/1f3d4.png new file mode 100644 index 00000000..b2fbdccb Binary files /dev/null and b/emojis/1f3d4.png differ diff --git a/emojis/1f3d5.png b/emojis/1f3d5.png new file mode 100644 index 00000000..51841c57 Binary files /dev/null and b/emojis/1f3d5.png differ diff --git a/emojis/1f3d6.png b/emojis/1f3d6.png new file mode 100644 index 00000000..7ea70066 Binary files /dev/null and b/emojis/1f3d6.png differ diff --git a/emojis/1f3d7.png b/emojis/1f3d7.png new file mode 100644 index 00000000..3494cf87 Binary files /dev/null and b/emojis/1f3d7.png differ diff --git a/emojis/1f3d8.png b/emojis/1f3d8.png new file mode 100644 index 00000000..f477d9b3 Binary files /dev/null and b/emojis/1f3d8.png differ diff --git a/emojis/1f3d9.png b/emojis/1f3d9.png new file mode 100644 index 00000000..faff16fe Binary files /dev/null and b/emojis/1f3d9.png differ diff --git a/emojis/1f3da.png b/emojis/1f3da.png new file mode 100644 index 00000000..d036029e Binary files /dev/null and b/emojis/1f3da.png differ diff --git a/emojis/1f3db.png b/emojis/1f3db.png new file mode 100644 index 00000000..036d4dde Binary files /dev/null and b/emojis/1f3db.png differ diff --git a/emojis/1f3dc.png b/emojis/1f3dc.png new file mode 100644 index 00000000..fa4a937a Binary files /dev/null and b/emojis/1f3dc.png differ diff --git a/emojis/1f3dd.png b/emojis/1f3dd.png new file mode 100644 index 00000000..48555994 Binary files /dev/null and b/emojis/1f3dd.png differ diff --git a/emojis/1f3de.png b/emojis/1f3de.png new file mode 100644 index 00000000..776c2850 Binary files /dev/null and b/emojis/1f3de.png differ diff --git a/emojis/1f3df.png b/emojis/1f3df.png new file mode 100644 index 00000000..2e72fb17 Binary files /dev/null and b/emojis/1f3df.png differ diff --git a/emojis/1f3e0.png b/emojis/1f3e0.png new file mode 100644 index 00000000..e9963c28 Binary files /dev/null and b/emojis/1f3e0.png differ diff --git a/emojis/1f3e1.png b/emojis/1f3e1.png new file mode 100644 index 00000000..923af654 Binary files /dev/null and b/emojis/1f3e1.png differ diff --git a/emojis/1f3e2.png b/emojis/1f3e2.png new file mode 100644 index 00000000..3fcc0461 Binary files /dev/null and b/emojis/1f3e2.png differ diff --git a/emojis/1f3e3.png b/emojis/1f3e3.png new file mode 100644 index 00000000..c644e6af Binary files /dev/null and b/emojis/1f3e3.png differ diff --git a/emojis/1f3e4.png b/emojis/1f3e4.png new file mode 100644 index 00000000..13e1a4d3 Binary files /dev/null and b/emojis/1f3e4.png differ diff --git a/emojis/1f3e5.png b/emojis/1f3e5.png new file mode 100644 index 00000000..b3c7d1ea Binary files /dev/null and b/emojis/1f3e5.png differ diff --git a/emojis/1f3e6.png b/emojis/1f3e6.png new file mode 100644 index 00000000..fa5aa7eb Binary files /dev/null and b/emojis/1f3e6.png differ diff --git a/emojis/1f3e7.png b/emojis/1f3e7.png new file mode 100644 index 00000000..04eee2db Binary files /dev/null and b/emojis/1f3e7.png differ diff --git a/emojis/1f3e8.png b/emojis/1f3e8.png new file mode 100644 index 00000000..955dc23b Binary files /dev/null and b/emojis/1f3e8.png differ diff --git a/emojis/1f3e9.png b/emojis/1f3e9.png new file mode 100644 index 00000000..3b00df21 Binary files /dev/null and b/emojis/1f3e9.png differ diff --git a/emojis/1f3ea.png b/emojis/1f3ea.png new file mode 100644 index 00000000..8b36db91 Binary files /dev/null and b/emojis/1f3ea.png differ diff --git a/emojis/1f3eb.png b/emojis/1f3eb.png new file mode 100644 index 00000000..338702a1 Binary files /dev/null and b/emojis/1f3eb.png differ diff --git a/emojis/1f3ec.png b/emojis/1f3ec.png new file mode 100644 index 00000000..99c6f8b1 Binary files /dev/null and b/emojis/1f3ec.png differ diff --git a/emojis/1f3ed.png b/emojis/1f3ed.png new file mode 100644 index 00000000..2ae0b10d Binary files /dev/null and b/emojis/1f3ed.png differ diff --git a/emojis/1f3ee.png b/emojis/1f3ee.png new file mode 100644 index 00000000..82f8b2db Binary files /dev/null and b/emojis/1f3ee.png differ diff --git a/emojis/1f3ef.png b/emojis/1f3ef.png new file mode 100644 index 00000000..4f4c0401 Binary files /dev/null and b/emojis/1f3ef.png differ diff --git a/emojis/1f3f0.png b/emojis/1f3f0.png new file mode 100644 index 00000000..90b60e9c Binary files /dev/null and b/emojis/1f3f0.png differ diff --git a/emojis/1f3f3.png b/emojis/1f3f3.png new file mode 100644 index 00000000..0acfd4cf Binary files /dev/null and b/emojis/1f3f3.png differ diff --git a/emojis/1f3f4.png b/emojis/1f3f4.png new file mode 100644 index 00000000..88631b0e Binary files /dev/null and b/emojis/1f3f4.png differ diff --git a/emojis/1f3f5.png b/emojis/1f3f5.png new file mode 100644 index 00000000..87e29815 Binary files /dev/null and b/emojis/1f3f5.png differ diff --git a/emojis/1f3f7.png b/emojis/1f3f7.png new file mode 100644 index 00000000..7b105684 Binary files /dev/null and b/emojis/1f3f7.png differ diff --git a/emojis/1f3f8.png b/emojis/1f3f8.png new file mode 100644 index 00000000..1179a419 Binary files /dev/null and b/emojis/1f3f8.png differ diff --git a/emojis/1f3f9.png b/emojis/1f3f9.png new file mode 100644 index 00000000..890d56f1 Binary files /dev/null and b/emojis/1f3f9.png differ diff --git a/emojis/1f3fa.png b/emojis/1f3fa.png new file mode 100644 index 00000000..3a128cf7 Binary files /dev/null and b/emojis/1f3fa.png differ diff --git a/emojis/1f3fb.png b/emojis/1f3fb.png new file mode 100644 index 00000000..eff586e8 Binary files /dev/null and b/emojis/1f3fb.png differ diff --git a/emojis/1f3fc.png b/emojis/1f3fc.png new file mode 100644 index 00000000..4132ae87 Binary files /dev/null and b/emojis/1f3fc.png differ diff --git a/emojis/1f3fd.png b/emojis/1f3fd.png new file mode 100644 index 00000000..eb8a7c2e Binary files /dev/null and b/emojis/1f3fd.png differ diff --git a/emojis/1f3fe.png b/emojis/1f3fe.png new file mode 100644 index 00000000..91abd3e4 Binary files /dev/null and b/emojis/1f3fe.png differ diff --git a/emojis/1f3ff.png b/emojis/1f3ff.png new file mode 100644 index 00000000..a74d7093 Binary files /dev/null and b/emojis/1f3ff.png differ diff --git a/emojis/1f400.png b/emojis/1f400.png new file mode 100644 index 00000000..8d030df5 Binary files /dev/null and b/emojis/1f400.png differ diff --git a/emojis/1f401.png b/emojis/1f401.png new file mode 100644 index 00000000..3ee08d2a Binary files /dev/null and b/emojis/1f401.png differ diff --git a/emojis/1f402.png b/emojis/1f402.png new file mode 100644 index 00000000..ca7e2ae2 Binary files /dev/null and b/emojis/1f402.png differ diff --git a/emojis/1f403.png b/emojis/1f403.png new file mode 100644 index 00000000..995064e5 Binary files /dev/null and b/emojis/1f403.png differ diff --git a/emojis/1f404.png b/emojis/1f404.png new file mode 100644 index 00000000..f2c239f6 Binary files /dev/null and b/emojis/1f404.png differ diff --git a/emojis/1f405.png b/emojis/1f405.png new file mode 100644 index 00000000..df7e9001 Binary files /dev/null and b/emojis/1f405.png differ diff --git a/emojis/1f406.png b/emojis/1f406.png new file mode 100644 index 00000000..901ae6d7 Binary files /dev/null and b/emojis/1f406.png differ diff --git a/emojis/1f407.png b/emojis/1f407.png new file mode 100644 index 00000000..7494da23 Binary files /dev/null and b/emojis/1f407.png differ diff --git a/emojis/1f408.png b/emojis/1f408.png new file mode 100644 index 00000000..5ab22aef Binary files /dev/null and b/emojis/1f408.png differ diff --git a/emojis/1f409.png b/emojis/1f409.png new file mode 100644 index 00000000..a8865276 Binary files /dev/null and b/emojis/1f409.png differ diff --git a/emojis/1f40a.png b/emojis/1f40a.png new file mode 100644 index 00000000..191d874d Binary files /dev/null and b/emojis/1f40a.png differ diff --git a/emojis/1f40b.png b/emojis/1f40b.png new file mode 100644 index 00000000..4d1d09b5 Binary files /dev/null and b/emojis/1f40b.png differ diff --git a/emojis/1f40c.png b/emojis/1f40c.png new file mode 100644 index 00000000..ea715ca1 Binary files /dev/null and b/emojis/1f40c.png differ diff --git a/emojis/1f40d.png b/emojis/1f40d.png new file mode 100644 index 00000000..f710c380 Binary files /dev/null and b/emojis/1f40d.png differ diff --git a/emojis/1f40e.png b/emojis/1f40e.png new file mode 100644 index 00000000..3b640e30 Binary files /dev/null and b/emojis/1f40e.png differ diff --git a/emojis/1f40f.png b/emojis/1f40f.png new file mode 100644 index 00000000..1c405852 Binary files /dev/null and b/emojis/1f40f.png differ diff --git a/emojis/1f410.png b/emojis/1f410.png new file mode 100644 index 00000000..9867fc5f Binary files /dev/null and b/emojis/1f410.png differ diff --git a/emojis/1f411.png b/emojis/1f411.png new file mode 100644 index 00000000..539c024d Binary files /dev/null and b/emojis/1f411.png differ diff --git a/emojis/1f412.png b/emojis/1f412.png new file mode 100644 index 00000000..e4a69006 Binary files /dev/null and b/emojis/1f412.png differ diff --git a/emojis/1f413.png b/emojis/1f413.png new file mode 100644 index 00000000..6a1e1b9d Binary files /dev/null and b/emojis/1f413.png differ diff --git a/emojis/1f414.png b/emojis/1f414.png new file mode 100644 index 00000000..aa2c1dd1 Binary files /dev/null and b/emojis/1f414.png differ diff --git a/emojis/1f415.png b/emojis/1f415.png new file mode 100644 index 00000000..707298c4 Binary files /dev/null and b/emojis/1f415.png differ diff --git a/emojis/1f416.png b/emojis/1f416.png new file mode 100644 index 00000000..cc7ae2e3 Binary files /dev/null and b/emojis/1f416.png differ diff --git a/emojis/1f417.png b/emojis/1f417.png new file mode 100644 index 00000000..fa588872 Binary files /dev/null and b/emojis/1f417.png differ diff --git a/emojis/1f418.png b/emojis/1f418.png new file mode 100644 index 00000000..dfaf4254 Binary files /dev/null and b/emojis/1f418.png differ diff --git a/emojis/1f419.png b/emojis/1f419.png new file mode 100644 index 00000000..9bd26fa8 Binary files /dev/null and b/emojis/1f419.png differ diff --git a/emojis/1f41a.png b/emojis/1f41a.png new file mode 100644 index 00000000..aab26309 Binary files /dev/null and b/emojis/1f41a.png differ diff --git a/emojis/1f41b.png b/emojis/1f41b.png new file mode 100644 index 00000000..e19daab6 Binary files /dev/null and b/emojis/1f41b.png differ diff --git a/emojis/1f41c.png b/emojis/1f41c.png new file mode 100644 index 00000000..7c9ff9cd Binary files /dev/null and b/emojis/1f41c.png differ diff --git a/emojis/1f41d.png b/emojis/1f41d.png new file mode 100644 index 00000000..f26766c0 Binary files /dev/null and b/emojis/1f41d.png differ diff --git a/emojis/1f41e.png b/emojis/1f41e.png new file mode 100644 index 00000000..2401b69b Binary files /dev/null and b/emojis/1f41e.png differ diff --git a/emojis/1f41f.png b/emojis/1f41f.png new file mode 100644 index 00000000..412bbb16 Binary files /dev/null and b/emojis/1f41f.png differ diff --git a/emojis/1f420.png b/emojis/1f420.png new file mode 100644 index 00000000..2d420222 Binary files /dev/null and b/emojis/1f420.png differ diff --git a/emojis/1f421.png b/emojis/1f421.png new file mode 100644 index 00000000..7a2e2dcd Binary files /dev/null and b/emojis/1f421.png differ diff --git a/emojis/1f422.png b/emojis/1f422.png new file mode 100644 index 00000000..fdeecd1b Binary files /dev/null and b/emojis/1f422.png differ diff --git a/emojis/1f423.png b/emojis/1f423.png new file mode 100644 index 00000000..9e08fec9 Binary files /dev/null and b/emojis/1f423.png differ diff --git a/emojis/1f424.png b/emojis/1f424.png new file mode 100644 index 00000000..17fa07fc Binary files /dev/null and b/emojis/1f424.png differ diff --git a/emojis/1f425.png b/emojis/1f425.png new file mode 100644 index 00000000..dc73a9c7 Binary files /dev/null and b/emojis/1f425.png differ diff --git a/emojis/1f426.png b/emojis/1f426.png new file mode 100644 index 00000000..dc5c6294 Binary files /dev/null and b/emojis/1f426.png differ diff --git a/emojis/1f427.png b/emojis/1f427.png new file mode 100644 index 00000000..c5233dc8 Binary files /dev/null and b/emojis/1f427.png differ diff --git a/emojis/1f428.png b/emojis/1f428.png new file mode 100644 index 00000000..fe0dd5f7 Binary files /dev/null and b/emojis/1f428.png differ diff --git a/emojis/1f429.png b/emojis/1f429.png new file mode 100644 index 00000000..f3d92335 Binary files /dev/null and b/emojis/1f429.png differ diff --git a/emojis/1f42a.png b/emojis/1f42a.png new file mode 100644 index 00000000..25cf8ab7 Binary files /dev/null and b/emojis/1f42a.png differ diff --git a/emojis/1f42b.png b/emojis/1f42b.png new file mode 100644 index 00000000..a5aa04b3 Binary files /dev/null and b/emojis/1f42b.png differ diff --git a/emojis/1f42c.png b/emojis/1f42c.png new file mode 100644 index 00000000..341ca4ad Binary files /dev/null and b/emojis/1f42c.png differ diff --git a/emojis/1f42d.png b/emojis/1f42d.png new file mode 100644 index 00000000..89e25dc2 Binary files /dev/null and b/emojis/1f42d.png differ diff --git a/emojis/1f42e.png b/emojis/1f42e.png new file mode 100644 index 00000000..369f357d Binary files /dev/null and b/emojis/1f42e.png differ diff --git a/emojis/1f42f.png b/emojis/1f42f.png new file mode 100644 index 00000000..2bb5d8c2 Binary files /dev/null and b/emojis/1f42f.png differ diff --git a/emojis/1f430.png b/emojis/1f430.png new file mode 100644 index 00000000..175b1aba Binary files /dev/null and b/emojis/1f430.png differ diff --git a/emojis/1f431.png b/emojis/1f431.png new file mode 100644 index 00000000..3bdb9972 Binary files /dev/null and b/emojis/1f431.png differ diff --git a/emojis/1f432.png b/emojis/1f432.png new file mode 100644 index 00000000..a78c7b20 Binary files /dev/null and b/emojis/1f432.png differ diff --git a/emojis/1f433.png b/emojis/1f433.png new file mode 100644 index 00000000..df4080dc Binary files /dev/null and b/emojis/1f433.png differ diff --git a/emojis/1f434.png b/emojis/1f434.png new file mode 100644 index 00000000..b3c4aa4d Binary files /dev/null and b/emojis/1f434.png differ diff --git a/emojis/1f435.png b/emojis/1f435.png new file mode 100644 index 00000000..52e4d811 Binary files /dev/null and b/emojis/1f435.png differ diff --git a/emojis/1f436.png b/emojis/1f436.png new file mode 100644 index 00000000..3d21c7fc Binary files /dev/null and b/emojis/1f436.png differ diff --git a/emojis/1f437.png b/emojis/1f437.png new file mode 100644 index 00000000..416aa5d7 Binary files /dev/null and b/emojis/1f437.png differ diff --git a/emojis/1f438.png b/emojis/1f438.png new file mode 100644 index 00000000..83ce21ea Binary files /dev/null and b/emojis/1f438.png differ diff --git a/emojis/1f439.png b/emojis/1f439.png new file mode 100644 index 00000000..3b1dd2cf Binary files /dev/null and b/emojis/1f439.png differ diff --git a/emojis/1f43a.png b/emojis/1f43a.png new file mode 100644 index 00000000..1291eee8 Binary files /dev/null and b/emojis/1f43a.png differ diff --git a/emojis/1f43b.png b/emojis/1f43b.png new file mode 100644 index 00000000..98fbf70f Binary files /dev/null and b/emojis/1f43b.png differ diff --git a/emojis/1f43c.png b/emojis/1f43c.png new file mode 100644 index 00000000..16bb947e Binary files /dev/null and b/emojis/1f43c.png differ diff --git a/emojis/1f43d.png b/emojis/1f43d.png new file mode 100644 index 00000000..2723d5e7 Binary files /dev/null and b/emojis/1f43d.png differ diff --git a/emojis/1f43e.png b/emojis/1f43e.png new file mode 100644 index 00000000..4eb4b11e Binary files /dev/null and b/emojis/1f43e.png differ diff --git a/emojis/1f43f.png b/emojis/1f43f.png new file mode 100644 index 00000000..667fc5fc Binary files /dev/null and b/emojis/1f43f.png differ diff --git a/emojis/1f440.png b/emojis/1f440.png new file mode 100644 index 00000000..a2656738 Binary files /dev/null and b/emojis/1f440.png differ diff --git a/emojis/1f441.png b/emojis/1f441.png new file mode 100644 index 00000000..6a460d2b Binary files /dev/null and b/emojis/1f441.png differ diff --git a/emojis/1f442.png b/emojis/1f442.png new file mode 100644 index 00000000..15158d25 Binary files /dev/null and b/emojis/1f442.png differ diff --git a/emojis/1f443.png b/emojis/1f443.png new file mode 100644 index 00000000..5e004410 Binary files /dev/null and b/emojis/1f443.png differ diff --git a/emojis/1f444.png b/emojis/1f444.png new file mode 100644 index 00000000..ea5cc01a Binary files /dev/null and b/emojis/1f444.png differ diff --git a/emojis/1f445.png b/emojis/1f445.png new file mode 100644 index 00000000..0b348665 Binary files /dev/null and b/emojis/1f445.png differ diff --git a/emojis/1f446.png b/emojis/1f446.png new file mode 100644 index 00000000..39865d71 Binary files /dev/null and b/emojis/1f446.png differ diff --git a/emojis/1f447.png b/emojis/1f447.png new file mode 100644 index 00000000..186b79a8 Binary files /dev/null and b/emojis/1f447.png differ diff --git a/emojis/1f448.png b/emojis/1f448.png new file mode 100644 index 00000000..b9c08208 Binary files /dev/null and b/emojis/1f448.png differ diff --git a/emojis/1f449.png b/emojis/1f449.png new file mode 100644 index 00000000..2d1ac932 Binary files /dev/null and b/emojis/1f449.png differ diff --git a/emojis/1f44a.png b/emojis/1f44a.png new file mode 100644 index 00000000..a4ae5b29 Binary files /dev/null and b/emojis/1f44a.png differ diff --git a/emojis/1f44b.png b/emojis/1f44b.png new file mode 100644 index 00000000..e4a09d72 Binary files /dev/null and b/emojis/1f44b.png differ diff --git a/emojis/1f44c.png b/emojis/1f44c.png new file mode 100644 index 00000000..c2690631 Binary files /dev/null and b/emojis/1f44c.png differ diff --git a/emojis/1f44d.png b/emojis/1f44d.png new file mode 100644 index 00000000..66f41b44 Binary files /dev/null and b/emojis/1f44d.png differ diff --git a/emojis/1f44e.png b/emojis/1f44e.png new file mode 100644 index 00000000..738a67cc Binary files /dev/null and b/emojis/1f44e.png differ diff --git a/emojis/1f44f.png b/emojis/1f44f.png new file mode 100644 index 00000000..2051be03 Binary files /dev/null and b/emojis/1f44f.png differ diff --git a/emojis/1f450.png b/emojis/1f450.png new file mode 100644 index 00000000..3cb8896e Binary files /dev/null and b/emojis/1f450.png differ diff --git a/emojis/1f451.png b/emojis/1f451.png new file mode 100644 index 00000000..9ef877af Binary files /dev/null and b/emojis/1f451.png differ diff --git a/emojis/1f452.png b/emojis/1f452.png new file mode 100644 index 00000000..8b88825f Binary files /dev/null and b/emojis/1f452.png differ diff --git a/emojis/1f453.png b/emojis/1f453.png new file mode 100644 index 00000000..8a898067 Binary files /dev/null and b/emojis/1f453.png differ diff --git a/emojis/1f454.png b/emojis/1f454.png new file mode 100644 index 00000000..2ef0bf05 Binary files /dev/null and b/emojis/1f454.png differ diff --git a/emojis/1f455.png b/emojis/1f455.png new file mode 100644 index 00000000..151f87d1 Binary files /dev/null and b/emojis/1f455.png differ diff --git a/emojis/1f456.png b/emojis/1f456.png new file mode 100644 index 00000000..d69d74ab Binary files /dev/null and b/emojis/1f456.png differ diff --git a/emojis/1f457.png b/emojis/1f457.png new file mode 100644 index 00000000..9fa12a00 Binary files /dev/null and b/emojis/1f457.png differ diff --git a/emojis/1f458.png b/emojis/1f458.png new file mode 100644 index 00000000..059c68df Binary files /dev/null and b/emojis/1f458.png differ diff --git a/emojis/1f459.png b/emojis/1f459.png new file mode 100644 index 00000000..37326c10 Binary files /dev/null and b/emojis/1f459.png differ diff --git a/emojis/1f45a.png b/emojis/1f45a.png new file mode 100644 index 00000000..c0f8d38b Binary files /dev/null and b/emojis/1f45a.png differ diff --git a/emojis/1f45b.png b/emojis/1f45b.png new file mode 100644 index 00000000..6e38ee5d Binary files /dev/null and b/emojis/1f45b.png differ diff --git a/emojis/1f45c.png b/emojis/1f45c.png new file mode 100644 index 00000000..35b75737 Binary files /dev/null and b/emojis/1f45c.png differ diff --git a/emojis/1f45d.png b/emojis/1f45d.png new file mode 100644 index 00000000..0157070a Binary files /dev/null and b/emojis/1f45d.png differ diff --git a/emojis/1f45e.png b/emojis/1f45e.png new file mode 100644 index 00000000..a1a742e5 Binary files /dev/null and b/emojis/1f45e.png differ diff --git a/emojis/1f45f.png b/emojis/1f45f.png new file mode 100644 index 00000000..bacfc115 Binary files /dev/null and b/emojis/1f45f.png differ diff --git a/emojis/1f460.png b/emojis/1f460.png new file mode 100644 index 00000000..5035f773 Binary files /dev/null and b/emojis/1f460.png differ diff --git a/emojis/1f461.png b/emojis/1f461.png new file mode 100644 index 00000000..d52c231b Binary files /dev/null and b/emojis/1f461.png differ diff --git a/emojis/1f462.png b/emojis/1f462.png new file mode 100644 index 00000000..843f16eb Binary files /dev/null and b/emojis/1f462.png differ diff --git a/emojis/1f463.png b/emojis/1f463.png new file mode 100644 index 00000000..0a654e9f Binary files /dev/null and b/emojis/1f463.png differ diff --git a/emojis/1f464.png b/emojis/1f464.png new file mode 100644 index 00000000..72a1a15f Binary files /dev/null and b/emojis/1f464.png differ diff --git a/emojis/1f465.png b/emojis/1f465.png new file mode 100644 index 00000000..5dd5c388 Binary files /dev/null and b/emojis/1f465.png differ diff --git a/emojis/1f466.png b/emojis/1f466.png new file mode 100644 index 00000000..04f6707a Binary files /dev/null and b/emojis/1f466.png differ diff --git a/emojis/1f467.png b/emojis/1f467.png new file mode 100644 index 00000000..91ac83cf Binary files /dev/null and b/emojis/1f467.png differ diff --git a/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png b/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png new file mode 100644 index 00000000..309a9ba3 Binary files /dev/null and b/emojis/1f468-200d-1f468-200d-1f466-200d-1f466.png differ diff --git a/emojis/1f468-200d-1f468-200d-1f466.png b/emojis/1f468-200d-1f468-200d-1f466.png new file mode 100644 index 00000000..4c1de049 Binary files /dev/null and b/emojis/1f468-200d-1f468-200d-1f466.png differ diff --git a/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png b/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png new file mode 100644 index 00000000..562dba71 Binary files /dev/null and b/emojis/1f468-200d-1f468-200d-1f467-200d-1f466.png differ diff --git a/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png b/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png new file mode 100644 index 00000000..de2a626b Binary files /dev/null and b/emojis/1f468-200d-1f468-200d-1f467-200d-1f467.png differ diff --git a/emojis/1f468-200d-1f468-200d-1f467.png b/emojis/1f468-200d-1f468-200d-1f467.png new file mode 100644 index 00000000..4a111dd4 Binary files /dev/null and b/emojis/1f468-200d-1f468-200d-1f467.png differ diff --git a/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png b/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png new file mode 100644 index 00000000..c4ae16b9 Binary files /dev/null and b/emojis/1f468-200d-1f469-200d-1f466-200d-1f466.png differ diff --git a/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png b/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png new file mode 100644 index 00000000..45346941 Binary files /dev/null and b/emojis/1f468-200d-1f469-200d-1f467-200d-1f466.png differ diff --git a/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png b/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png new file mode 100644 index 00000000..ec303847 Binary files /dev/null and b/emojis/1f468-200d-1f469-200d-1f467-200d-1f467.png differ diff --git a/emojis/1f468-200d-1f469-200d-1f467.png b/emojis/1f468-200d-1f469-200d-1f467.png new file mode 100644 index 00000000..dbbc5d81 Binary files /dev/null and b/emojis/1f468-200d-1f469-200d-1f467.png differ diff --git a/emojis/1f468-200d-2764-fe0f-200d-1f468.png b/emojis/1f468-200d-2764-fe0f-200d-1f468.png new file mode 100644 index 00000000..1474b1a4 Binary files /dev/null and b/emojis/1f468-200d-2764-fe0f-200d-1f468.png differ diff --git a/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png b/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png new file mode 100644 index 00000000..e2850f09 Binary files /dev/null and b/emojis/1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png differ diff --git a/emojis/1f468.png b/emojis/1f468.png new file mode 100644 index 00000000..80f78fb2 Binary files /dev/null and b/emojis/1f468.png differ diff --git a/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png b/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png new file mode 100644 index 00000000..256b8676 Binary files /dev/null and b/emojis/1f469-200d-1f469-200d-1f466-200d-1f466.png differ diff --git a/emojis/1f469-200d-1f469-200d-1f466.png b/emojis/1f469-200d-1f469-200d-1f466.png new file mode 100644 index 00000000..81ebca03 Binary files /dev/null and b/emojis/1f469-200d-1f469-200d-1f466.png differ diff --git a/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png b/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png new file mode 100644 index 00000000..34dcba26 Binary files /dev/null and b/emojis/1f469-200d-1f469-200d-1f467-200d-1f466.png differ diff --git a/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png b/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png new file mode 100644 index 00000000..79cad7eb Binary files /dev/null and b/emojis/1f469-200d-1f469-200d-1f467-200d-1f467.png differ diff --git a/emojis/1f469-200d-1f469-200d-1f467.png b/emojis/1f469-200d-1f469-200d-1f467.png new file mode 100644 index 00000000..c512c43b Binary files /dev/null and b/emojis/1f469-200d-1f469-200d-1f467.png differ diff --git a/emojis/1f469-200d-2764-fe0f-200d-1f469.png b/emojis/1f469-200d-2764-fe0f-200d-1f469.png new file mode 100644 index 00000000..aa1fc0c4 Binary files /dev/null and b/emojis/1f469-200d-2764-fe0f-200d-1f469.png differ diff --git a/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png b/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png new file mode 100644 index 00000000..54b468e5 Binary files /dev/null and b/emojis/1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png differ diff --git a/emojis/1f469.png b/emojis/1f469.png new file mode 100644 index 00000000..65dc7846 Binary files /dev/null and b/emojis/1f469.png differ diff --git a/emojis/1f46a.png b/emojis/1f46a.png new file mode 100644 index 00000000..8ab628c1 Binary files /dev/null and b/emojis/1f46a.png differ diff --git a/emojis/1f46b.png b/emojis/1f46b.png new file mode 100644 index 00000000..5edf7b0d Binary files /dev/null and b/emojis/1f46b.png differ diff --git a/emojis/1f46c.png b/emojis/1f46c.png new file mode 100644 index 00000000..0034b8a2 Binary files /dev/null and b/emojis/1f46c.png differ diff --git a/emojis/1f46d.png b/emojis/1f46d.png new file mode 100644 index 00000000..525e6b95 Binary files /dev/null and b/emojis/1f46d.png differ diff --git a/emojis/1f46e.png b/emojis/1f46e.png new file mode 100644 index 00000000..71f79151 Binary files /dev/null and b/emojis/1f46e.png differ diff --git a/emojis/1f46f.png b/emojis/1f46f.png new file mode 100644 index 00000000..935cfb96 Binary files /dev/null and b/emojis/1f46f.png differ diff --git a/emojis/1f470.png b/emojis/1f470.png new file mode 100644 index 00000000..3566b8bc Binary files /dev/null and b/emojis/1f470.png differ diff --git a/emojis/1f471.png b/emojis/1f471.png new file mode 100644 index 00000000..46c2e7a3 Binary files /dev/null and b/emojis/1f471.png differ diff --git a/emojis/1f472.png b/emojis/1f472.png new file mode 100644 index 00000000..33086fca Binary files /dev/null and b/emojis/1f472.png differ diff --git a/emojis/1f473.png b/emojis/1f473.png new file mode 100644 index 00000000..49b8b85a Binary files /dev/null and b/emojis/1f473.png differ diff --git a/emojis/1f474.png b/emojis/1f474.png new file mode 100644 index 00000000..806a4223 Binary files /dev/null and b/emojis/1f474.png differ diff --git a/emojis/1f475.png b/emojis/1f475.png new file mode 100644 index 00000000..998a4ae3 Binary files /dev/null and b/emojis/1f475.png differ diff --git a/emojis/1f476.png b/emojis/1f476.png new file mode 100644 index 00000000..a21fd452 Binary files /dev/null and b/emojis/1f476.png differ diff --git a/emojis/1f477.png b/emojis/1f477.png new file mode 100644 index 00000000..5129bfb4 Binary files /dev/null and b/emojis/1f477.png differ diff --git a/emojis/1f478.png b/emojis/1f478.png new file mode 100644 index 00000000..f49d0213 Binary files /dev/null and b/emojis/1f478.png differ diff --git a/emojis/1f479.png b/emojis/1f479.png new file mode 100644 index 00000000..35a1a369 Binary files /dev/null and b/emojis/1f479.png differ diff --git a/emojis/1f47a.png b/emojis/1f47a.png new file mode 100644 index 00000000..8e5b5765 Binary files /dev/null and b/emojis/1f47a.png differ diff --git a/emojis/1f47b.png b/emojis/1f47b.png new file mode 100644 index 00000000..9eca01f5 Binary files /dev/null and b/emojis/1f47b.png differ diff --git a/emojis/1f47c.png b/emojis/1f47c.png new file mode 100644 index 00000000..0d8b84ba Binary files /dev/null and b/emojis/1f47c.png differ diff --git a/emojis/1f47d.png b/emojis/1f47d.png new file mode 100644 index 00000000..721a9ee9 Binary files /dev/null and b/emojis/1f47d.png differ diff --git a/emojis/1f47e.png b/emojis/1f47e.png new file mode 100644 index 00000000..4181acae Binary files /dev/null and b/emojis/1f47e.png differ diff --git a/emojis/1f47f.png b/emojis/1f47f.png new file mode 100644 index 00000000..6f4ffd88 Binary files /dev/null and b/emojis/1f47f.png differ diff --git a/emojis/1f480.png b/emojis/1f480.png new file mode 100644 index 00000000..3f7761b1 Binary files /dev/null and b/emojis/1f480.png differ diff --git a/emojis/1f481.png b/emojis/1f481.png new file mode 100644 index 00000000..6f22fc3b Binary files /dev/null and b/emojis/1f481.png differ diff --git a/emojis/1f482.png b/emojis/1f482.png new file mode 100644 index 00000000..51ded209 Binary files /dev/null and b/emojis/1f482.png differ diff --git a/emojis/1f483.png b/emojis/1f483.png new file mode 100644 index 00000000..d8a9a4f4 Binary files /dev/null and b/emojis/1f483.png differ diff --git a/emojis/1f484.png b/emojis/1f484.png new file mode 100644 index 00000000..140e7c16 Binary files /dev/null and b/emojis/1f484.png differ diff --git a/emojis/1f485.png b/emojis/1f485.png new file mode 100644 index 00000000..7c016bb0 Binary files /dev/null and b/emojis/1f485.png differ diff --git a/emojis/1f486.png b/emojis/1f486.png new file mode 100644 index 00000000..73b56903 Binary files /dev/null and b/emojis/1f486.png differ diff --git a/emojis/1f487.png b/emojis/1f487.png new file mode 100644 index 00000000..c11e5afc Binary files /dev/null and b/emojis/1f487.png differ diff --git a/emojis/1f488.png b/emojis/1f488.png new file mode 100644 index 00000000..53bb57bb Binary files /dev/null and b/emojis/1f488.png differ diff --git a/emojis/1f489.png b/emojis/1f489.png new file mode 100644 index 00000000..39ae8d16 Binary files /dev/null and b/emojis/1f489.png differ diff --git a/emojis/1f48a.png b/emojis/1f48a.png new file mode 100644 index 00000000..93dd1b23 Binary files /dev/null and b/emojis/1f48a.png differ diff --git a/emojis/1f48b.png b/emojis/1f48b.png new file mode 100644 index 00000000..bc3101c5 Binary files /dev/null and b/emojis/1f48b.png differ diff --git a/emojis/1f48c.png b/emojis/1f48c.png new file mode 100644 index 00000000..37a3f0ab Binary files /dev/null and b/emojis/1f48c.png differ diff --git a/emojis/1f48d.png b/emojis/1f48d.png new file mode 100644 index 00000000..ea8ce85d Binary files /dev/null and b/emojis/1f48d.png differ diff --git a/emojis/1f48e.png b/emojis/1f48e.png new file mode 100644 index 00000000..babec910 Binary files /dev/null and b/emojis/1f48e.png differ diff --git a/emojis/1f48f.png b/emojis/1f48f.png new file mode 100644 index 00000000..d169c8b3 Binary files /dev/null and b/emojis/1f48f.png differ diff --git a/emojis/1f490.png b/emojis/1f490.png new file mode 100644 index 00000000..cd119065 Binary files /dev/null and b/emojis/1f490.png differ diff --git a/emojis/1f491.png b/emojis/1f491.png new file mode 100644 index 00000000..d6f82e30 Binary files /dev/null and b/emojis/1f491.png differ diff --git a/emojis/1f492.png b/emojis/1f492.png new file mode 100644 index 00000000..5ddc9e8f Binary files /dev/null and b/emojis/1f492.png differ diff --git a/emojis/1f493.png b/emojis/1f493.png new file mode 100644 index 00000000..85e1b311 Binary files /dev/null and b/emojis/1f493.png differ diff --git a/emojis/1f494.png b/emojis/1f494.png new file mode 100644 index 00000000..00dab8eb Binary files /dev/null and b/emojis/1f494.png differ diff --git a/emojis/1f495.png b/emojis/1f495.png new file mode 100644 index 00000000..e5cd0f83 Binary files /dev/null and b/emojis/1f495.png differ diff --git a/emojis/1f496.png b/emojis/1f496.png new file mode 100644 index 00000000..0f9f4a5a Binary files /dev/null and b/emojis/1f496.png differ diff --git a/emojis/1f497.png b/emojis/1f497.png new file mode 100644 index 00000000..cd0a4ba8 Binary files /dev/null and b/emojis/1f497.png differ diff --git a/emojis/1f498.png b/emojis/1f498.png new file mode 100644 index 00000000..f4f10882 Binary files /dev/null and b/emojis/1f498.png differ diff --git a/emojis/1f499.png b/emojis/1f499.png new file mode 100644 index 00000000..3831cb0c Binary files /dev/null and b/emojis/1f499.png differ diff --git a/emojis/1f49a.png b/emojis/1f49a.png new file mode 100644 index 00000000..e495bf7d Binary files /dev/null and b/emojis/1f49a.png differ diff --git a/emojis/1f49b.png b/emojis/1f49b.png new file mode 100644 index 00000000..b325d41e Binary files /dev/null and b/emojis/1f49b.png differ diff --git a/emojis/1f49c.png b/emojis/1f49c.png new file mode 100644 index 00000000..43c65244 Binary files /dev/null and b/emojis/1f49c.png differ diff --git a/emojis/1f49d.png b/emojis/1f49d.png new file mode 100644 index 00000000..792953dd Binary files /dev/null and b/emojis/1f49d.png differ diff --git a/emojis/1f49e.png b/emojis/1f49e.png new file mode 100644 index 00000000..d63c74f3 Binary files /dev/null and b/emojis/1f49e.png differ diff --git a/emojis/1f49f.png b/emojis/1f49f.png new file mode 100644 index 00000000..69806936 Binary files /dev/null and b/emojis/1f49f.png differ diff --git a/emojis/1f4a0.png b/emojis/1f4a0.png new file mode 100644 index 00000000..22c3b133 Binary files /dev/null and b/emojis/1f4a0.png differ diff --git a/emojis/1f4a1.png b/emojis/1f4a1.png new file mode 100644 index 00000000..708640b5 Binary files /dev/null and b/emojis/1f4a1.png differ diff --git a/emojis/1f4a2.png b/emojis/1f4a2.png new file mode 100644 index 00000000..deaabf2d Binary files /dev/null and b/emojis/1f4a2.png differ diff --git a/emojis/1f4a3.png b/emojis/1f4a3.png new file mode 100644 index 00000000..6674491b Binary files /dev/null and b/emojis/1f4a3.png differ diff --git a/emojis/1f4a4.png b/emojis/1f4a4.png new file mode 100644 index 00000000..89d7b883 Binary files /dev/null and b/emojis/1f4a4.png differ diff --git a/emojis/1f4a5.png b/emojis/1f4a5.png new file mode 100644 index 00000000..bee635cc Binary files /dev/null and b/emojis/1f4a5.png differ diff --git a/emojis/1f4a6.png b/emojis/1f4a6.png new file mode 100644 index 00000000..ec66fccb Binary files /dev/null and b/emojis/1f4a6.png differ diff --git a/emojis/1f4a7.png b/emojis/1f4a7.png new file mode 100644 index 00000000..d931cdf6 Binary files /dev/null and b/emojis/1f4a7.png differ diff --git a/emojis/1f4a8.png b/emojis/1f4a8.png new file mode 100644 index 00000000..2df3ad98 Binary files /dev/null and b/emojis/1f4a8.png differ diff --git a/emojis/1f4a9.png b/emojis/1f4a9.png new file mode 100644 index 00000000..eb8f3c4c Binary files /dev/null and b/emojis/1f4a9.png differ diff --git a/emojis/1f4aa.png b/emojis/1f4aa.png new file mode 100644 index 00000000..eb4aa967 Binary files /dev/null and b/emojis/1f4aa.png differ diff --git a/emojis/1f4ab.png b/emojis/1f4ab.png new file mode 100644 index 00000000..d48d5f62 Binary files /dev/null and b/emojis/1f4ab.png differ diff --git a/emojis/1f4ac.png b/emojis/1f4ac.png new file mode 100644 index 00000000..36075f0e Binary files /dev/null and b/emojis/1f4ac.png differ diff --git a/emojis/1f4ad.png b/emojis/1f4ad.png new file mode 100644 index 00000000..b40f2a90 Binary files /dev/null and b/emojis/1f4ad.png differ diff --git a/emojis/1f4ae.png b/emojis/1f4ae.png new file mode 100644 index 00000000..89cb9728 Binary files /dev/null and b/emojis/1f4ae.png differ diff --git a/emojis/1f4af.png b/emojis/1f4af.png new file mode 100644 index 00000000..36680b5a Binary files /dev/null and b/emojis/1f4af.png differ diff --git a/emojis/1f4b0.png b/emojis/1f4b0.png new file mode 100644 index 00000000..7f246f1b Binary files /dev/null and b/emojis/1f4b0.png differ diff --git a/emojis/1f4b1.png b/emojis/1f4b1.png new file mode 100644 index 00000000..02332181 Binary files /dev/null and b/emojis/1f4b1.png differ diff --git a/emojis/1f4b2.png b/emojis/1f4b2.png new file mode 100644 index 00000000..636aeed1 Binary files /dev/null and b/emojis/1f4b2.png differ diff --git a/emojis/1f4b3.png b/emojis/1f4b3.png new file mode 100644 index 00000000..c922db14 Binary files /dev/null and b/emojis/1f4b3.png differ diff --git a/emojis/1f4b4.png b/emojis/1f4b4.png new file mode 100644 index 00000000..3cb5ed49 Binary files /dev/null and b/emojis/1f4b4.png differ diff --git a/emojis/1f4b5.png b/emojis/1f4b5.png new file mode 100644 index 00000000..bd292578 Binary files /dev/null and b/emojis/1f4b5.png differ diff --git a/emojis/1f4b6.png b/emojis/1f4b6.png new file mode 100644 index 00000000..dc93ccfb Binary files /dev/null and b/emojis/1f4b6.png differ diff --git a/emojis/1f4b7.png b/emojis/1f4b7.png new file mode 100644 index 00000000..4755a008 Binary files /dev/null and b/emojis/1f4b7.png differ diff --git a/emojis/1f4b8.png b/emojis/1f4b8.png new file mode 100644 index 00000000..b02fc5a3 Binary files /dev/null and b/emojis/1f4b8.png differ diff --git a/emojis/1f4b9.png b/emojis/1f4b9.png new file mode 100644 index 00000000..ab86303b Binary files /dev/null and b/emojis/1f4b9.png differ diff --git a/emojis/1f4ba.png b/emojis/1f4ba.png new file mode 100644 index 00000000..9dd62627 Binary files /dev/null and b/emojis/1f4ba.png differ diff --git a/emojis/1f4bb.png b/emojis/1f4bb.png new file mode 100644 index 00000000..510d0cea Binary files /dev/null and b/emojis/1f4bb.png differ diff --git a/emojis/1f4bc.png b/emojis/1f4bc.png new file mode 100644 index 00000000..f38a1b96 Binary files /dev/null and b/emojis/1f4bc.png differ diff --git a/emojis/1f4bd.png b/emojis/1f4bd.png new file mode 100644 index 00000000..66cada1b Binary files /dev/null and b/emojis/1f4bd.png differ diff --git a/emojis/1f4be.png b/emojis/1f4be.png new file mode 100644 index 00000000..2a34b199 Binary files /dev/null and b/emojis/1f4be.png differ diff --git a/emojis/1f4bf.png b/emojis/1f4bf.png new file mode 100644 index 00000000..608da0db Binary files /dev/null and b/emojis/1f4bf.png differ diff --git a/emojis/1f4c0.png b/emojis/1f4c0.png new file mode 100644 index 00000000..b703d90e Binary files /dev/null and b/emojis/1f4c0.png differ diff --git a/emojis/1f4c1.png b/emojis/1f4c1.png new file mode 100644 index 00000000..1be20b33 Binary files /dev/null and b/emojis/1f4c1.png differ diff --git a/emojis/1f4c2.png b/emojis/1f4c2.png new file mode 100644 index 00000000..c0798516 Binary files /dev/null and b/emojis/1f4c2.png differ diff --git a/emojis/1f4c3.png b/emojis/1f4c3.png new file mode 100644 index 00000000..99169866 Binary files /dev/null and b/emojis/1f4c3.png differ diff --git a/emojis/1f4c4.png b/emojis/1f4c4.png new file mode 100644 index 00000000..dcbb065a Binary files /dev/null and b/emojis/1f4c4.png differ diff --git a/emojis/1f4c5.png b/emojis/1f4c5.png new file mode 100644 index 00000000..b6388b51 Binary files /dev/null and b/emojis/1f4c5.png differ diff --git a/emojis/1f4c6.png b/emojis/1f4c6.png new file mode 100644 index 00000000..54a78a03 Binary files /dev/null and b/emojis/1f4c6.png differ diff --git a/emojis/1f4c7.png b/emojis/1f4c7.png new file mode 100644 index 00000000..a5743a16 Binary files /dev/null and b/emojis/1f4c7.png differ diff --git a/emojis/1f4c8.png b/emojis/1f4c8.png new file mode 100644 index 00000000..74decbc4 Binary files /dev/null and b/emojis/1f4c8.png differ diff --git a/emojis/1f4c9.png b/emojis/1f4c9.png new file mode 100644 index 00000000..3b5934ea Binary files /dev/null and b/emojis/1f4c9.png differ diff --git a/emojis/1f4ca.png b/emojis/1f4ca.png new file mode 100644 index 00000000..a39be4fa Binary files /dev/null and b/emojis/1f4ca.png differ diff --git a/emojis/1f4cb.png b/emojis/1f4cb.png new file mode 100644 index 00000000..9528d173 Binary files /dev/null and b/emojis/1f4cb.png differ diff --git a/emojis/1f4cc.png b/emojis/1f4cc.png new file mode 100644 index 00000000..02b168d2 Binary files /dev/null and b/emojis/1f4cc.png differ diff --git a/emojis/1f4cd.png b/emojis/1f4cd.png new file mode 100644 index 00000000..0287a07d Binary files /dev/null and b/emojis/1f4cd.png differ diff --git a/emojis/1f4ce.png b/emojis/1f4ce.png new file mode 100644 index 00000000..6ee0c5fb Binary files /dev/null and b/emojis/1f4ce.png differ diff --git a/emojis/1f4cf.png b/emojis/1f4cf.png new file mode 100644 index 00000000..8c5af697 Binary files /dev/null and b/emojis/1f4cf.png differ diff --git a/emojis/1f4d0.png b/emojis/1f4d0.png new file mode 100644 index 00000000..91efab93 Binary files /dev/null and b/emojis/1f4d0.png differ diff --git a/emojis/1f4d1.png b/emojis/1f4d1.png new file mode 100644 index 00000000..e836cafc Binary files /dev/null and b/emojis/1f4d1.png differ diff --git a/emojis/1f4d2.png b/emojis/1f4d2.png new file mode 100644 index 00000000..3b11d66b Binary files /dev/null and b/emojis/1f4d2.png differ diff --git a/emojis/1f4d3.png b/emojis/1f4d3.png new file mode 100644 index 00000000..7840b145 Binary files /dev/null and b/emojis/1f4d3.png differ diff --git a/emojis/1f4d4.png b/emojis/1f4d4.png new file mode 100644 index 00000000..417ea55f Binary files /dev/null and b/emojis/1f4d4.png differ diff --git a/emojis/1f4d5.png b/emojis/1f4d5.png new file mode 100644 index 00000000..cab168b0 Binary files /dev/null and b/emojis/1f4d5.png differ diff --git a/emojis/1f4d6.png b/emojis/1f4d6.png new file mode 100644 index 00000000..7879f451 Binary files /dev/null and b/emojis/1f4d6.png differ diff --git a/emojis/1f4d7.png b/emojis/1f4d7.png new file mode 100644 index 00000000..da823fb5 Binary files /dev/null and b/emojis/1f4d7.png differ diff --git a/emojis/1f4d8.png b/emojis/1f4d8.png new file mode 100644 index 00000000..eb35e803 Binary files /dev/null and b/emojis/1f4d8.png differ diff --git a/emojis/1f4d9.png b/emojis/1f4d9.png new file mode 100644 index 00000000..880a0b0b Binary files /dev/null and b/emojis/1f4d9.png differ diff --git a/emojis/1f4da.png b/emojis/1f4da.png new file mode 100644 index 00000000..43a319fd Binary files /dev/null and b/emojis/1f4da.png differ diff --git a/emojis/1f4db.png b/emojis/1f4db.png new file mode 100644 index 00000000..b7e858bf Binary files /dev/null and b/emojis/1f4db.png differ diff --git a/emojis/1f4dc.png b/emojis/1f4dc.png new file mode 100644 index 00000000..069f16c6 Binary files /dev/null and b/emojis/1f4dc.png differ diff --git a/emojis/1f4dd.png b/emojis/1f4dd.png new file mode 100644 index 00000000..0f731b2b Binary files /dev/null and b/emojis/1f4dd.png differ diff --git a/emojis/1f4de.png b/emojis/1f4de.png new file mode 100644 index 00000000..d760f75e Binary files /dev/null and b/emojis/1f4de.png differ diff --git a/emojis/1f4df.png b/emojis/1f4df.png new file mode 100644 index 00000000..c38a2a8a Binary files /dev/null and b/emojis/1f4df.png differ diff --git a/emojis/1f4e0.png b/emojis/1f4e0.png new file mode 100644 index 00000000..b71bd81c Binary files /dev/null and b/emojis/1f4e0.png differ diff --git a/emojis/1f4e1.png b/emojis/1f4e1.png new file mode 100644 index 00000000..d5b1870a Binary files /dev/null and b/emojis/1f4e1.png differ diff --git a/emojis/1f4e2.png b/emojis/1f4e2.png new file mode 100644 index 00000000..7329cd96 Binary files /dev/null and b/emojis/1f4e2.png differ diff --git a/emojis/1f4e3.png b/emojis/1f4e3.png new file mode 100644 index 00000000..28b20310 Binary files /dev/null and b/emojis/1f4e3.png differ diff --git a/emojis/1f4e4.png b/emojis/1f4e4.png new file mode 100644 index 00000000..0953827b Binary files /dev/null and b/emojis/1f4e4.png differ diff --git a/emojis/1f4e5.png b/emojis/1f4e5.png new file mode 100644 index 00000000..c23faaad Binary files /dev/null and b/emojis/1f4e5.png differ diff --git a/emojis/1f4e6.png b/emojis/1f4e6.png new file mode 100644 index 00000000..dc7f04af Binary files /dev/null and b/emojis/1f4e6.png differ diff --git a/emojis/1f4e7.png b/emojis/1f4e7.png new file mode 100644 index 00000000..330688d7 Binary files /dev/null and b/emojis/1f4e7.png differ diff --git a/emojis/1f4e8.png b/emojis/1f4e8.png new file mode 100644 index 00000000..2028c3c8 Binary files /dev/null and b/emojis/1f4e8.png differ diff --git a/emojis/1f4e9.png b/emojis/1f4e9.png new file mode 100644 index 00000000..04b04066 Binary files /dev/null and b/emojis/1f4e9.png differ diff --git a/emojis/1f4ea.png b/emojis/1f4ea.png new file mode 100644 index 00000000..1fa43ced Binary files /dev/null and b/emojis/1f4ea.png differ diff --git a/emojis/1f4eb.png b/emojis/1f4eb.png new file mode 100644 index 00000000..0795291e Binary files /dev/null and b/emojis/1f4eb.png differ diff --git a/emojis/1f4ec.png b/emojis/1f4ec.png new file mode 100644 index 00000000..2ffca371 Binary files /dev/null and b/emojis/1f4ec.png differ diff --git a/emojis/1f4ed.png b/emojis/1f4ed.png new file mode 100644 index 00000000..594618fa Binary files /dev/null and b/emojis/1f4ed.png differ diff --git a/emojis/1f4ee.png b/emojis/1f4ee.png new file mode 100644 index 00000000..edbf9261 Binary files /dev/null and b/emojis/1f4ee.png differ diff --git a/emojis/1f4ef.png b/emojis/1f4ef.png new file mode 100644 index 00000000..8c47f6c0 Binary files /dev/null and b/emojis/1f4ef.png differ diff --git a/emojis/1f4f0.png b/emojis/1f4f0.png new file mode 100644 index 00000000..b7f063e6 Binary files /dev/null and b/emojis/1f4f0.png differ diff --git a/emojis/1f4f1.png b/emojis/1f4f1.png new file mode 100644 index 00000000..ddb7a310 Binary files /dev/null and b/emojis/1f4f1.png differ diff --git a/emojis/1f4f2.png b/emojis/1f4f2.png new file mode 100644 index 00000000..9ab86410 Binary files /dev/null and b/emojis/1f4f2.png differ diff --git a/emojis/1f4f3.png b/emojis/1f4f3.png new file mode 100644 index 00000000..22ca0e5c Binary files /dev/null and b/emojis/1f4f3.png differ diff --git a/emojis/1f4f4.png b/emojis/1f4f4.png new file mode 100644 index 00000000..4ae348ed Binary files /dev/null and b/emojis/1f4f4.png differ diff --git a/emojis/1f4f5.png b/emojis/1f4f5.png new file mode 100644 index 00000000..6e8d29ad Binary files /dev/null and b/emojis/1f4f5.png differ diff --git a/emojis/1f4f6.png b/emojis/1f4f6.png new file mode 100644 index 00000000..ba1bcd2a Binary files /dev/null and b/emojis/1f4f6.png differ diff --git a/emojis/1f4f7.png b/emojis/1f4f7.png new file mode 100644 index 00000000..b95b2e09 Binary files /dev/null and b/emojis/1f4f7.png differ diff --git a/emojis/1f4f8.png b/emojis/1f4f8.png new file mode 100644 index 00000000..1b6270a6 Binary files /dev/null and b/emojis/1f4f8.png differ diff --git a/emojis/1f4f9.png b/emojis/1f4f9.png new file mode 100644 index 00000000..856ccccc Binary files /dev/null and b/emojis/1f4f9.png differ diff --git a/emojis/1f4fa.png b/emojis/1f4fa.png new file mode 100644 index 00000000..da1a7079 Binary files /dev/null and b/emojis/1f4fa.png differ diff --git a/emojis/1f4fb.png b/emojis/1f4fb.png new file mode 100644 index 00000000..dfb91a83 Binary files /dev/null and b/emojis/1f4fb.png differ diff --git a/emojis/1f4fc.png b/emojis/1f4fc.png new file mode 100644 index 00000000..ab7c96d5 Binary files /dev/null and b/emojis/1f4fc.png differ diff --git a/emojis/1f4fd.png b/emojis/1f4fd.png new file mode 100644 index 00000000..cdf67014 Binary files /dev/null and b/emojis/1f4fd.png differ diff --git a/emojis/1f4ff.png b/emojis/1f4ff.png new file mode 100644 index 00000000..4db33923 Binary files /dev/null and b/emojis/1f4ff.png differ diff --git a/emojis/1f500.png b/emojis/1f500.png new file mode 100644 index 00000000..8d52f177 Binary files /dev/null and b/emojis/1f500.png differ diff --git a/emojis/1f501.png b/emojis/1f501.png new file mode 100644 index 00000000..2331b22c Binary files /dev/null and b/emojis/1f501.png differ diff --git a/emojis/1f502.png b/emojis/1f502.png new file mode 100644 index 00000000..c79f5c32 Binary files /dev/null and b/emojis/1f502.png differ diff --git a/emojis/1f503.png b/emojis/1f503.png new file mode 100644 index 00000000..935cd74f Binary files /dev/null and b/emojis/1f503.png differ diff --git a/emojis/1f504.png b/emojis/1f504.png new file mode 100644 index 00000000..1c17faa7 Binary files /dev/null and b/emojis/1f504.png differ diff --git a/emojis/1f505.png b/emojis/1f505.png new file mode 100644 index 00000000..dca4099e Binary files /dev/null and b/emojis/1f505.png differ diff --git a/emojis/1f506.png b/emojis/1f506.png new file mode 100644 index 00000000..807a11b2 Binary files /dev/null and b/emojis/1f506.png differ diff --git a/emojis/1f507.png b/emojis/1f507.png new file mode 100644 index 00000000..ba3b16ed Binary files /dev/null and b/emojis/1f507.png differ diff --git a/emojis/1f508.png b/emojis/1f508.png new file mode 100644 index 00000000..6439703c Binary files /dev/null and b/emojis/1f508.png differ diff --git a/emojis/1f509.png b/emojis/1f509.png new file mode 100644 index 00000000..f6706053 Binary files /dev/null and b/emojis/1f509.png differ diff --git a/emojis/1f50a.png b/emojis/1f50a.png new file mode 100644 index 00000000..ff6a3676 Binary files /dev/null and b/emojis/1f50a.png differ diff --git a/emojis/1f50b.png b/emojis/1f50b.png new file mode 100644 index 00000000..d5ecdbc8 Binary files /dev/null and b/emojis/1f50b.png differ diff --git a/emojis/1f50c.png b/emojis/1f50c.png new file mode 100644 index 00000000..aa57f6a7 Binary files /dev/null and b/emojis/1f50c.png differ diff --git a/emojis/1f50d.png b/emojis/1f50d.png new file mode 100644 index 00000000..ca651a3f Binary files /dev/null and b/emojis/1f50d.png differ diff --git a/emojis/1f50e.png b/emojis/1f50e.png new file mode 100644 index 00000000..648d7c76 Binary files /dev/null and b/emojis/1f50e.png differ diff --git a/emojis/1f50f.png b/emojis/1f50f.png new file mode 100644 index 00000000..01f59f59 Binary files /dev/null and b/emojis/1f50f.png differ diff --git a/emojis/1f510.png b/emojis/1f510.png new file mode 100644 index 00000000..a51075dc Binary files /dev/null and b/emojis/1f510.png differ diff --git a/emojis/1f511.png b/emojis/1f511.png new file mode 100644 index 00000000..8ed93504 Binary files /dev/null and b/emojis/1f511.png differ diff --git a/emojis/1f512.png b/emojis/1f512.png new file mode 100644 index 00000000..a2a85ac7 Binary files /dev/null and b/emojis/1f512.png differ diff --git a/emojis/1f513.png b/emojis/1f513.png new file mode 100644 index 00000000..c10c6b7a Binary files /dev/null and b/emojis/1f513.png differ diff --git a/emojis/1f514.png b/emojis/1f514.png new file mode 100644 index 00000000..aa48445b Binary files /dev/null and b/emojis/1f514.png differ diff --git a/emojis/1f515.png b/emojis/1f515.png new file mode 100644 index 00000000..305a8c8d Binary files /dev/null and b/emojis/1f515.png differ diff --git a/emojis/1f516.png b/emojis/1f516.png new file mode 100644 index 00000000..be095754 Binary files /dev/null and b/emojis/1f516.png differ diff --git a/emojis/1f517.png b/emojis/1f517.png new file mode 100644 index 00000000..20c0312d Binary files /dev/null and b/emojis/1f517.png differ diff --git a/emojis/1f518.png b/emojis/1f518.png new file mode 100644 index 00000000..8e845a57 Binary files /dev/null and b/emojis/1f518.png differ diff --git a/emojis/1f519.png b/emojis/1f519.png new file mode 100644 index 00000000..13c27ede Binary files /dev/null and b/emojis/1f519.png differ diff --git a/emojis/1f51a.png b/emojis/1f51a.png new file mode 100644 index 00000000..eee9b471 Binary files /dev/null and b/emojis/1f51a.png differ diff --git a/emojis/1f51b.png b/emojis/1f51b.png new file mode 100644 index 00000000..f4f5dc4a Binary files /dev/null and b/emojis/1f51b.png differ diff --git a/emojis/1f51c.png b/emojis/1f51c.png new file mode 100644 index 00000000..4a22b2c5 Binary files /dev/null and b/emojis/1f51c.png differ diff --git a/emojis/1f51d.png b/emojis/1f51d.png new file mode 100644 index 00000000..aa439737 Binary files /dev/null and b/emojis/1f51d.png differ diff --git a/emojis/1f51e.png b/emojis/1f51e.png new file mode 100644 index 00000000..13547738 Binary files /dev/null and b/emojis/1f51e.png differ diff --git a/emojis/1f51f.png b/emojis/1f51f.png new file mode 100644 index 00000000..a9a6bf19 Binary files /dev/null and b/emojis/1f51f.png differ diff --git a/emojis/1f520.png b/emojis/1f520.png new file mode 100644 index 00000000..eca27a9b Binary files /dev/null and b/emojis/1f520.png differ diff --git a/emojis/1f521.png b/emojis/1f521.png new file mode 100644 index 00000000..1ca305de Binary files /dev/null and b/emojis/1f521.png differ diff --git a/emojis/1f522.png b/emojis/1f522.png new file mode 100644 index 00000000..b341c9e0 Binary files /dev/null and b/emojis/1f522.png differ diff --git a/emojis/1f523.png b/emojis/1f523.png new file mode 100644 index 00000000..3a5d9d99 Binary files /dev/null and b/emojis/1f523.png differ diff --git a/emojis/1f524.png b/emojis/1f524.png new file mode 100644 index 00000000..219c4b53 Binary files /dev/null and b/emojis/1f524.png differ diff --git a/emojis/1f525.png b/emojis/1f525.png new file mode 100644 index 00000000..a02f59ed Binary files /dev/null and b/emojis/1f525.png differ diff --git a/emojis/1f526.png b/emojis/1f526.png new file mode 100644 index 00000000..add89316 Binary files /dev/null and b/emojis/1f526.png differ diff --git a/emojis/1f527.png b/emojis/1f527.png new file mode 100644 index 00000000..49a62419 Binary files /dev/null and b/emojis/1f527.png differ diff --git a/emojis/1f528.png b/emojis/1f528.png new file mode 100644 index 00000000..342995e9 Binary files /dev/null and b/emojis/1f528.png differ diff --git a/emojis/1f529.png b/emojis/1f529.png new file mode 100644 index 00000000..a779f1f5 Binary files /dev/null and b/emojis/1f529.png differ diff --git a/emojis/1f52a.png b/emojis/1f52a.png new file mode 100644 index 00000000..cd6cee11 Binary files /dev/null and b/emojis/1f52a.png differ diff --git a/emojis/1f52b.png b/emojis/1f52b.png new file mode 100644 index 00000000..b3b3a1a3 Binary files /dev/null and b/emojis/1f52b.png differ diff --git a/emojis/1f52c.png b/emojis/1f52c.png new file mode 100644 index 00000000..76f2b0be Binary files /dev/null and b/emojis/1f52c.png differ diff --git a/emojis/1f52d.png b/emojis/1f52d.png new file mode 100644 index 00000000..6a63be45 Binary files /dev/null and b/emojis/1f52d.png differ diff --git a/emojis/1f52e.png b/emojis/1f52e.png new file mode 100644 index 00000000..332f4daa Binary files /dev/null and b/emojis/1f52e.png differ diff --git a/emojis/1f52f.png b/emojis/1f52f.png new file mode 100644 index 00000000..458fa9da Binary files /dev/null and b/emojis/1f52f.png differ diff --git a/emojis/1f530.png b/emojis/1f530.png new file mode 100644 index 00000000..a25019fc Binary files /dev/null and b/emojis/1f530.png differ diff --git a/emojis/1f531.png b/emojis/1f531.png new file mode 100644 index 00000000..76f7e0d6 Binary files /dev/null and b/emojis/1f531.png differ diff --git a/emojis/1f532.png b/emojis/1f532.png new file mode 100644 index 00000000..83292cc8 Binary files /dev/null and b/emojis/1f532.png differ diff --git a/emojis/1f533.png b/emojis/1f533.png new file mode 100644 index 00000000..11bb5c1c Binary files /dev/null and b/emojis/1f533.png differ diff --git a/emojis/1f534.png b/emojis/1f534.png new file mode 100644 index 00000000..53186df7 Binary files /dev/null and b/emojis/1f534.png differ diff --git a/emojis/1f535.png b/emojis/1f535.png new file mode 100644 index 00000000..b7372a6f Binary files /dev/null and b/emojis/1f535.png differ diff --git a/emojis/1f536.png b/emojis/1f536.png new file mode 100644 index 00000000..42a34b03 Binary files /dev/null and b/emojis/1f536.png differ diff --git a/emojis/1f537.png b/emojis/1f537.png new file mode 100644 index 00000000..297bdd59 Binary files /dev/null and b/emojis/1f537.png differ diff --git a/emojis/1f538.png b/emojis/1f538.png new file mode 100644 index 00000000..ff5a3ccd Binary files /dev/null and b/emojis/1f538.png differ diff --git a/emojis/1f539.png b/emojis/1f539.png new file mode 100644 index 00000000..f700e0c1 Binary files /dev/null and b/emojis/1f539.png differ diff --git a/emojis/1f53a.png b/emojis/1f53a.png new file mode 100644 index 00000000..e8d57e2a Binary files /dev/null and b/emojis/1f53a.png differ diff --git a/emojis/1f53b.png b/emojis/1f53b.png new file mode 100644 index 00000000..f6c7787e Binary files /dev/null and b/emojis/1f53b.png differ diff --git a/emojis/1f53c.png b/emojis/1f53c.png new file mode 100644 index 00000000..5aee3436 Binary files /dev/null and b/emojis/1f53c.png differ diff --git a/emojis/1f53d.png b/emojis/1f53d.png new file mode 100644 index 00000000..c7c3d6d2 Binary files /dev/null and b/emojis/1f53d.png differ diff --git a/emojis/1f549.png b/emojis/1f549.png new file mode 100644 index 00000000..afbbe7c0 Binary files /dev/null and b/emojis/1f549.png differ diff --git a/emojis/1f54a.png b/emojis/1f54a.png new file mode 100644 index 00000000..4d3dc44d Binary files /dev/null and b/emojis/1f54a.png differ diff --git a/emojis/1f54b.png b/emojis/1f54b.png new file mode 100644 index 00000000..8ff62e96 Binary files /dev/null and b/emojis/1f54b.png differ diff --git a/emojis/1f54c.png b/emojis/1f54c.png new file mode 100644 index 00000000..a2b11e82 Binary files /dev/null and b/emojis/1f54c.png differ diff --git a/emojis/1f54d.png b/emojis/1f54d.png new file mode 100644 index 00000000..23ca5c88 Binary files /dev/null and b/emojis/1f54d.png differ diff --git a/emojis/1f54e.png b/emojis/1f54e.png new file mode 100644 index 00000000..814afe57 Binary files /dev/null and b/emojis/1f54e.png differ diff --git a/emojis/1f550.png b/emojis/1f550.png new file mode 100644 index 00000000..a4f575fc Binary files /dev/null and b/emojis/1f550.png differ diff --git a/emojis/1f551.png b/emojis/1f551.png new file mode 100644 index 00000000..17540371 Binary files /dev/null and b/emojis/1f551.png differ diff --git a/emojis/1f552.png b/emojis/1f552.png new file mode 100644 index 00000000..5cebf205 Binary files /dev/null and b/emojis/1f552.png differ diff --git a/emojis/1f553.png b/emojis/1f553.png new file mode 100644 index 00000000..f5dcb68e Binary files /dev/null and b/emojis/1f553.png differ diff --git a/emojis/1f554.png b/emojis/1f554.png new file mode 100644 index 00000000..07ba3c2a Binary files /dev/null and b/emojis/1f554.png differ diff --git a/emojis/1f555.png b/emojis/1f555.png new file mode 100644 index 00000000..ec37a8e7 Binary files /dev/null and b/emojis/1f555.png differ diff --git a/emojis/1f556.png b/emojis/1f556.png new file mode 100644 index 00000000..e56f611a Binary files /dev/null and b/emojis/1f556.png differ diff --git a/emojis/1f557.png b/emojis/1f557.png new file mode 100644 index 00000000..9eb1d7be Binary files /dev/null and b/emojis/1f557.png differ diff --git a/emojis/1f558.png b/emojis/1f558.png new file mode 100644 index 00000000..27aaf682 Binary files /dev/null and b/emojis/1f558.png differ diff --git a/emojis/1f559.png b/emojis/1f559.png new file mode 100644 index 00000000..6991b878 Binary files /dev/null and b/emojis/1f559.png differ diff --git a/emojis/1f55a.png b/emojis/1f55a.png new file mode 100644 index 00000000..2b1aa9b9 Binary files /dev/null and b/emojis/1f55a.png differ diff --git a/emojis/1f55b.png b/emojis/1f55b.png new file mode 100644 index 00000000..57221643 Binary files /dev/null and b/emojis/1f55b.png differ diff --git a/emojis/1f55c.png b/emojis/1f55c.png new file mode 100644 index 00000000..8dc54f24 Binary files /dev/null and b/emojis/1f55c.png differ diff --git a/emojis/1f55d.png b/emojis/1f55d.png new file mode 100644 index 00000000..7af8cb7e Binary files /dev/null and b/emojis/1f55d.png differ diff --git a/emojis/1f55e.png b/emojis/1f55e.png new file mode 100644 index 00000000..4cf1144f Binary files /dev/null and b/emojis/1f55e.png differ diff --git a/emojis/1f55f.png b/emojis/1f55f.png new file mode 100644 index 00000000..9926b32a Binary files /dev/null and b/emojis/1f55f.png differ diff --git a/emojis/1f560.png b/emojis/1f560.png new file mode 100644 index 00000000..1e4e5753 Binary files /dev/null and b/emojis/1f560.png differ diff --git a/emojis/1f561.png b/emojis/1f561.png new file mode 100644 index 00000000..38f614b8 Binary files /dev/null and b/emojis/1f561.png differ diff --git a/emojis/1f562.png b/emojis/1f562.png new file mode 100644 index 00000000..13f69486 Binary files /dev/null and b/emojis/1f562.png differ diff --git a/emojis/1f563.png b/emojis/1f563.png new file mode 100644 index 00000000..19a8ff81 Binary files /dev/null and b/emojis/1f563.png differ diff --git a/emojis/1f564.png b/emojis/1f564.png new file mode 100644 index 00000000..eef0caae Binary files /dev/null and b/emojis/1f564.png differ diff --git a/emojis/1f565.png b/emojis/1f565.png new file mode 100644 index 00000000..a8112f2c Binary files /dev/null and b/emojis/1f565.png differ diff --git a/emojis/1f566.png b/emojis/1f566.png new file mode 100644 index 00000000..935ba679 Binary files /dev/null and b/emojis/1f566.png differ diff --git a/emojis/1f567.png b/emojis/1f567.png new file mode 100644 index 00000000..802483de Binary files /dev/null and b/emojis/1f567.png differ diff --git a/emojis/1f56f.png b/emojis/1f56f.png new file mode 100644 index 00000000..f56b2f11 Binary files /dev/null and b/emojis/1f56f.png differ diff --git a/emojis/1f570.png b/emojis/1f570.png new file mode 100644 index 00000000..ab6ac628 Binary files /dev/null and b/emojis/1f570.png differ diff --git a/emojis/1f573.png b/emojis/1f573.png new file mode 100644 index 00000000..194c86f8 Binary files /dev/null and b/emojis/1f573.png differ diff --git a/emojis/1f574.png b/emojis/1f574.png new file mode 100644 index 00000000..50a59dab Binary files /dev/null and b/emojis/1f574.png differ diff --git a/emojis/1f575.png b/emojis/1f575.png new file mode 100644 index 00000000..d0969e45 Binary files /dev/null and b/emojis/1f575.png differ diff --git a/emojis/1f576.png b/emojis/1f576.png new file mode 100644 index 00000000..0d0e5556 Binary files /dev/null and b/emojis/1f576.png differ diff --git a/emojis/1f577.png b/emojis/1f577.png new file mode 100644 index 00000000..a37b18ae Binary files /dev/null and b/emojis/1f577.png differ diff --git a/emojis/1f578.png b/emojis/1f578.png new file mode 100644 index 00000000..3ce29d81 Binary files /dev/null and b/emojis/1f578.png differ diff --git a/emojis/1f579.png b/emojis/1f579.png new file mode 100644 index 00000000..0a74d0cf Binary files /dev/null and b/emojis/1f579.png differ diff --git a/emojis/1f587.png b/emojis/1f587.png new file mode 100644 index 00000000..23c118f5 Binary files /dev/null and b/emojis/1f587.png differ diff --git a/emojis/1f58a.png b/emojis/1f58a.png new file mode 100644 index 00000000..b8279e8d Binary files /dev/null and b/emojis/1f58a.png differ diff --git a/emojis/1f58b.png b/emojis/1f58b.png new file mode 100644 index 00000000..a92c8369 Binary files /dev/null and b/emojis/1f58b.png differ diff --git a/emojis/1f58c.png b/emojis/1f58c.png new file mode 100644 index 00000000..9b458075 Binary files /dev/null and b/emojis/1f58c.png differ diff --git a/emojis/1f58d.png b/emojis/1f58d.png new file mode 100644 index 00000000..fcf2d267 Binary files /dev/null and b/emojis/1f58d.png differ diff --git a/emojis/1f590.png b/emojis/1f590.png new file mode 100644 index 00000000..225b357e Binary files /dev/null and b/emojis/1f590.png differ diff --git a/emojis/1f595.png b/emojis/1f595.png new file mode 100644 index 00000000..f6806c9c Binary files /dev/null and b/emojis/1f595.png differ diff --git a/emojis/1f596.png b/emojis/1f596.png new file mode 100644 index 00000000..e6ab2524 Binary files /dev/null and b/emojis/1f596.png differ diff --git a/emojis/1f5a5.png b/emojis/1f5a5.png new file mode 100644 index 00000000..c9c28eaa Binary files /dev/null and b/emojis/1f5a5.png differ diff --git a/emojis/1f5a8.png b/emojis/1f5a8.png new file mode 100644 index 00000000..f9956aa3 Binary files /dev/null and b/emojis/1f5a8.png differ diff --git a/emojis/1f5b1.png b/emojis/1f5b1.png new file mode 100644 index 00000000..dbb8e296 Binary files /dev/null and b/emojis/1f5b1.png differ diff --git a/emojis/1f5b2.png b/emojis/1f5b2.png new file mode 100644 index 00000000..647bf79a Binary files /dev/null and b/emojis/1f5b2.png differ diff --git a/emojis/1f5bc.png b/emojis/1f5bc.png new file mode 100644 index 00000000..a570fd28 Binary files /dev/null and b/emojis/1f5bc.png differ diff --git a/emojis/1f5c2.png b/emojis/1f5c2.png new file mode 100644 index 00000000..0ec497b0 Binary files /dev/null and b/emojis/1f5c2.png differ diff --git a/emojis/1f5c3.png b/emojis/1f5c3.png new file mode 100644 index 00000000..37215d0b Binary files /dev/null and b/emojis/1f5c3.png differ diff --git a/emojis/1f5c4.png b/emojis/1f5c4.png new file mode 100644 index 00000000..578de13e Binary files /dev/null and b/emojis/1f5c4.png differ diff --git a/emojis/1f5d1.png b/emojis/1f5d1.png new file mode 100644 index 00000000..db8b3524 Binary files /dev/null and b/emojis/1f5d1.png differ diff --git a/emojis/1f5d2.png b/emojis/1f5d2.png new file mode 100644 index 00000000..8ae63942 Binary files /dev/null and b/emojis/1f5d2.png differ diff --git a/emojis/1f5d3.png b/emojis/1f5d3.png new file mode 100644 index 00000000..549d931f Binary files /dev/null and b/emojis/1f5d3.png differ diff --git a/emojis/1f5dc.png b/emojis/1f5dc.png new file mode 100644 index 00000000..80981d74 Binary files /dev/null and b/emojis/1f5dc.png differ diff --git a/emojis/1f5dd.png b/emojis/1f5dd.png new file mode 100644 index 00000000..b778e702 Binary files /dev/null and b/emojis/1f5dd.png differ diff --git a/emojis/1f5de.png b/emojis/1f5de.png new file mode 100644 index 00000000..ba5b6aab Binary files /dev/null and b/emojis/1f5de.png differ diff --git a/emojis/1f5e1.png b/emojis/1f5e1.png new file mode 100644 index 00000000..d28bb0a3 Binary files /dev/null and b/emojis/1f5e1.png differ diff --git a/emojis/1f5e3.png b/emojis/1f5e3.png new file mode 100644 index 00000000..63f583ae Binary files /dev/null and b/emojis/1f5e3.png differ diff --git a/emojis/1f5e8.png b/emojis/1f5e8.png new file mode 100644 index 00000000..b3d6fdb7 Binary files /dev/null and b/emojis/1f5e8.png differ diff --git a/emojis/1f5ef.png b/emojis/1f5ef.png new file mode 100644 index 00000000..a6c7fb71 Binary files /dev/null and b/emojis/1f5ef.png differ diff --git a/emojis/1f5f3.png b/emojis/1f5f3.png new file mode 100644 index 00000000..1ab91c33 Binary files /dev/null and b/emojis/1f5f3.png differ diff --git a/emojis/1f5fa.png b/emojis/1f5fa.png new file mode 100644 index 00000000..eb7a0bae Binary files /dev/null and b/emojis/1f5fa.png differ diff --git a/emojis/1f5fb.png b/emojis/1f5fb.png new file mode 100644 index 00000000..2effd625 Binary files /dev/null and b/emojis/1f5fb.png differ diff --git a/emojis/1f5fc.png b/emojis/1f5fc.png new file mode 100644 index 00000000..a6f4915e Binary files /dev/null and b/emojis/1f5fc.png differ diff --git a/emojis/1f5fd.png b/emojis/1f5fd.png new file mode 100644 index 00000000..5d4a0fac Binary files /dev/null and b/emojis/1f5fd.png differ diff --git a/emojis/1f5fe.png b/emojis/1f5fe.png new file mode 100644 index 00000000..38181631 Binary files /dev/null and b/emojis/1f5fe.png differ diff --git a/emojis/1f5ff.png b/emojis/1f5ff.png new file mode 100644 index 00000000..cb2695f4 Binary files /dev/null and b/emojis/1f5ff.png differ diff --git a/emojis/1f600.png b/emojis/1f600.png new file mode 100644 index 00000000..4e365499 Binary files /dev/null and b/emojis/1f600.png differ diff --git a/emojis/1f601.png b/emojis/1f601.png new file mode 100644 index 00000000..5faf9160 Binary files /dev/null and b/emojis/1f601.png differ diff --git a/emojis/1f602.png b/emojis/1f602.png new file mode 100644 index 00000000..f4214ea6 Binary files /dev/null and b/emojis/1f602.png differ diff --git a/emojis/1f603.png b/emojis/1f603.png new file mode 100644 index 00000000..b376ae45 Binary files /dev/null and b/emojis/1f603.png differ diff --git a/emojis/1f604.png b/emojis/1f604.png new file mode 100644 index 00000000..696511b1 Binary files /dev/null and b/emojis/1f604.png differ diff --git a/emojis/1f605.png b/emojis/1f605.png new file mode 100644 index 00000000..09d984f9 Binary files /dev/null and b/emojis/1f605.png differ diff --git a/emojis/1f606.png b/emojis/1f606.png new file mode 100644 index 00000000..8459ac05 Binary files /dev/null and b/emojis/1f606.png differ diff --git a/emojis/1f607.png b/emojis/1f607.png new file mode 100644 index 00000000..10cfb624 Binary files /dev/null and b/emojis/1f607.png differ diff --git a/emojis/1f608.png b/emojis/1f608.png new file mode 100644 index 00000000..98b33d73 Binary files /dev/null and b/emojis/1f608.png differ diff --git a/emojis/1f609.png b/emojis/1f609.png new file mode 100644 index 00000000..3685570b Binary files /dev/null and b/emojis/1f609.png differ diff --git a/emojis/1f60a.png b/emojis/1f60a.png new file mode 100644 index 00000000..1c024ea3 Binary files /dev/null and b/emojis/1f60a.png differ diff --git a/emojis/1f60b.png b/emojis/1f60b.png new file mode 100644 index 00000000..bc78070c Binary files /dev/null and b/emojis/1f60b.png differ diff --git a/emojis/1f60c.png b/emojis/1f60c.png new file mode 100644 index 00000000..8f1bb223 Binary files /dev/null and b/emojis/1f60c.png differ diff --git a/emojis/1f60d.png b/emojis/1f60d.png new file mode 100644 index 00000000..3cc9de6c Binary files /dev/null and b/emojis/1f60d.png differ diff --git a/emojis/1f60e.png b/emojis/1f60e.png new file mode 100644 index 00000000..ffd1d387 Binary files /dev/null and b/emojis/1f60e.png differ diff --git a/emojis/1f60f.png b/emojis/1f60f.png new file mode 100644 index 00000000..1bfb23cf Binary files /dev/null and b/emojis/1f60f.png differ diff --git a/emojis/1f610.png b/emojis/1f610.png new file mode 100644 index 00000000..1cf46cd6 Binary files /dev/null and b/emojis/1f610.png differ diff --git a/emojis/1f611.png b/emojis/1f611.png new file mode 100644 index 00000000..0c716f8f Binary files /dev/null and b/emojis/1f611.png differ diff --git a/emojis/1f612.png b/emojis/1f612.png new file mode 100644 index 00000000..b93f0891 Binary files /dev/null and b/emojis/1f612.png differ diff --git a/emojis/1f613.png b/emojis/1f613.png new file mode 100644 index 00000000..5ce1c118 Binary files /dev/null and b/emojis/1f613.png differ diff --git a/emojis/1f614.png b/emojis/1f614.png new file mode 100644 index 00000000..5ab4f722 Binary files /dev/null and b/emojis/1f614.png differ diff --git a/emojis/1f615.png b/emojis/1f615.png new file mode 100644 index 00000000..ca81823b Binary files /dev/null and b/emojis/1f615.png differ diff --git a/emojis/1f616.png b/emojis/1f616.png new file mode 100644 index 00000000..18aa58f9 Binary files /dev/null and b/emojis/1f616.png differ diff --git a/emojis/1f617.png b/emojis/1f617.png new file mode 100644 index 00000000..f7cd367d Binary files /dev/null and b/emojis/1f617.png differ diff --git a/emojis/1f618.png b/emojis/1f618.png new file mode 100644 index 00000000..424d741c Binary files /dev/null and b/emojis/1f618.png differ diff --git a/emojis/1f619.png b/emojis/1f619.png new file mode 100644 index 00000000..b07b54a4 Binary files /dev/null and b/emojis/1f619.png differ diff --git a/emojis/1f61a.png b/emojis/1f61a.png new file mode 100644 index 00000000..282539f5 Binary files /dev/null and b/emojis/1f61a.png differ diff --git a/emojis/1f61b.png b/emojis/1f61b.png new file mode 100644 index 00000000..4147e12c Binary files /dev/null and b/emojis/1f61b.png differ diff --git a/emojis/1f61c.png b/emojis/1f61c.png new file mode 100644 index 00000000..1ff29700 Binary files /dev/null and b/emojis/1f61c.png differ diff --git a/emojis/1f61d.png b/emojis/1f61d.png new file mode 100644 index 00000000..0a7682d3 Binary files /dev/null and b/emojis/1f61d.png differ diff --git a/emojis/1f61e.png b/emojis/1f61e.png new file mode 100644 index 00000000..d28186e8 Binary files /dev/null and b/emojis/1f61e.png differ diff --git a/emojis/1f61f.png b/emojis/1f61f.png new file mode 100644 index 00000000..9be2ad0c Binary files /dev/null and b/emojis/1f61f.png differ diff --git a/emojis/1f620.png b/emojis/1f620.png new file mode 100644 index 00000000..9b42a9a3 Binary files /dev/null and b/emojis/1f620.png differ diff --git a/emojis/1f621.png b/emojis/1f621.png new file mode 100644 index 00000000..bf2776c6 Binary files /dev/null and b/emojis/1f621.png differ diff --git a/emojis/1f622.png b/emojis/1f622.png new file mode 100644 index 00000000..7eba3bc9 Binary files /dev/null and b/emojis/1f622.png differ diff --git a/emojis/1f623.png b/emojis/1f623.png new file mode 100644 index 00000000..e87bf439 Binary files /dev/null and b/emojis/1f623.png differ diff --git a/emojis/1f624.png b/emojis/1f624.png new file mode 100644 index 00000000..35659c7e Binary files /dev/null and b/emojis/1f624.png differ diff --git a/emojis/1f625.png b/emojis/1f625.png new file mode 100644 index 00000000..c7207755 Binary files /dev/null and b/emojis/1f625.png differ diff --git a/emojis/1f626.png b/emojis/1f626.png new file mode 100644 index 00000000..ca95721d Binary files /dev/null and b/emojis/1f626.png differ diff --git a/emojis/1f627.png b/emojis/1f627.png new file mode 100644 index 00000000..3935115d Binary files /dev/null and b/emojis/1f627.png differ diff --git a/emojis/1f628.png b/emojis/1f628.png new file mode 100644 index 00000000..62225029 Binary files /dev/null and b/emojis/1f628.png differ diff --git a/emojis/1f629.png b/emojis/1f629.png new file mode 100644 index 00000000..a7e807c8 Binary files /dev/null and b/emojis/1f629.png differ diff --git a/emojis/1f62a.png b/emojis/1f62a.png new file mode 100644 index 00000000..b37ace8d Binary files /dev/null and b/emojis/1f62a.png differ diff --git a/emojis/1f62b.png b/emojis/1f62b.png new file mode 100644 index 00000000..c11e749d Binary files /dev/null and b/emojis/1f62b.png differ diff --git a/emojis/1f62c.png b/emojis/1f62c.png new file mode 100644 index 00000000..c3498b35 Binary files /dev/null and b/emojis/1f62c.png differ diff --git a/emojis/1f62d.png b/emojis/1f62d.png new file mode 100644 index 00000000..fb8b98bf Binary files /dev/null and b/emojis/1f62d.png differ diff --git a/emojis/1f62e.png b/emojis/1f62e.png new file mode 100644 index 00000000..7a61e5de Binary files /dev/null and b/emojis/1f62e.png differ diff --git a/emojis/1f62f.png b/emojis/1f62f.png new file mode 100644 index 00000000..007a6962 Binary files /dev/null and b/emojis/1f62f.png differ diff --git a/emojis/1f630.png b/emojis/1f630.png new file mode 100644 index 00000000..890af3da Binary files /dev/null and b/emojis/1f630.png differ diff --git a/emojis/1f631.png b/emojis/1f631.png new file mode 100644 index 00000000..05beab2b Binary files /dev/null and b/emojis/1f631.png differ diff --git a/emojis/1f632.png b/emojis/1f632.png new file mode 100644 index 00000000..f72753a3 Binary files /dev/null and b/emojis/1f632.png differ diff --git a/emojis/1f633.png b/emojis/1f633.png new file mode 100644 index 00000000..f9738a66 Binary files /dev/null and b/emojis/1f633.png differ diff --git a/emojis/1f634.png b/emojis/1f634.png new file mode 100644 index 00000000..1e1a9503 Binary files /dev/null and b/emojis/1f634.png differ diff --git a/emojis/1f635.png b/emojis/1f635.png new file mode 100644 index 00000000..ea5a9c74 Binary files /dev/null and b/emojis/1f635.png differ diff --git a/emojis/1f636.png b/emojis/1f636.png new file mode 100644 index 00000000..6ec2eb78 Binary files /dev/null and b/emojis/1f636.png differ diff --git a/emojis/1f637.png b/emojis/1f637.png new file mode 100644 index 00000000..0c8585c8 Binary files /dev/null and b/emojis/1f637.png differ diff --git a/emojis/1f638.png b/emojis/1f638.png new file mode 100644 index 00000000..50467791 Binary files /dev/null and b/emojis/1f638.png differ diff --git a/emojis/1f639.png b/emojis/1f639.png new file mode 100644 index 00000000..02474150 Binary files /dev/null and b/emojis/1f639.png differ diff --git a/emojis/1f63a.png b/emojis/1f63a.png new file mode 100644 index 00000000..8417ee0b Binary files /dev/null and b/emojis/1f63a.png differ diff --git a/emojis/1f63b.png b/emojis/1f63b.png new file mode 100644 index 00000000..4e7573f2 Binary files /dev/null and b/emojis/1f63b.png differ diff --git a/emojis/1f63c.png b/emojis/1f63c.png new file mode 100644 index 00000000..ecd389d0 Binary files /dev/null and b/emojis/1f63c.png differ diff --git a/emojis/1f63d.png b/emojis/1f63d.png new file mode 100644 index 00000000..5c903ad5 Binary files /dev/null and b/emojis/1f63d.png differ diff --git a/emojis/1f63e.png b/emojis/1f63e.png new file mode 100644 index 00000000..c14793f8 Binary files /dev/null and b/emojis/1f63e.png differ diff --git a/emojis/1f63f.png b/emojis/1f63f.png new file mode 100644 index 00000000..747c0532 Binary files /dev/null and b/emojis/1f63f.png differ diff --git a/emojis/1f640.png b/emojis/1f640.png new file mode 100644 index 00000000..8b86a211 Binary files /dev/null and b/emojis/1f640.png differ diff --git a/emojis/1f641.png b/emojis/1f641.png new file mode 100644 index 00000000..7dda3cff Binary files /dev/null and b/emojis/1f641.png differ diff --git a/emojis/1f642.png b/emojis/1f642.png new file mode 100644 index 00000000..fbd559ef Binary files /dev/null and b/emojis/1f642.png differ diff --git a/emojis/1f643.png b/emojis/1f643.png new file mode 100644 index 00000000..9b8c012a Binary files /dev/null and b/emojis/1f643.png differ diff --git a/emojis/1f644.png b/emojis/1f644.png new file mode 100644 index 00000000..180664c2 Binary files /dev/null and b/emojis/1f644.png differ diff --git a/emojis/1f645.png b/emojis/1f645.png new file mode 100644 index 00000000..72158f5c Binary files /dev/null and b/emojis/1f645.png differ diff --git a/emojis/1f646.png b/emojis/1f646.png new file mode 100644 index 00000000..f30acb7a Binary files /dev/null and b/emojis/1f646.png differ diff --git a/emojis/1f647.png b/emojis/1f647.png new file mode 100644 index 00000000..232585dd Binary files /dev/null and b/emojis/1f647.png differ diff --git a/emojis/1f648.png b/emojis/1f648.png new file mode 100644 index 00000000..b45fac21 Binary files /dev/null and b/emojis/1f648.png differ diff --git a/emojis/1f649.png b/emojis/1f649.png new file mode 100644 index 00000000..1ab841bc Binary files /dev/null and b/emojis/1f649.png differ diff --git a/emojis/1f64a.png b/emojis/1f64a.png new file mode 100644 index 00000000..87db6f48 Binary files /dev/null and b/emojis/1f64a.png differ diff --git a/emojis/1f64b.png b/emojis/1f64b.png new file mode 100644 index 00000000..0d5fb91c Binary files /dev/null and b/emojis/1f64b.png differ diff --git a/emojis/1f64c.png b/emojis/1f64c.png new file mode 100644 index 00000000..591729cc Binary files /dev/null and b/emojis/1f64c.png differ diff --git a/emojis/1f64d.png b/emojis/1f64d.png new file mode 100644 index 00000000..493a28ba Binary files /dev/null and b/emojis/1f64d.png differ diff --git a/emojis/1f64e.png b/emojis/1f64e.png new file mode 100644 index 00000000..d84aed27 Binary files /dev/null and b/emojis/1f64e.png differ diff --git a/emojis/1f64f.png b/emojis/1f64f.png new file mode 100644 index 00000000..77a5639e Binary files /dev/null and b/emojis/1f64f.png differ diff --git a/emojis/1f680.png b/emojis/1f680.png new file mode 100644 index 00000000..93c1685e Binary files /dev/null and b/emojis/1f680.png differ diff --git a/emojis/1f681.png b/emojis/1f681.png new file mode 100644 index 00000000..b27b6dea Binary files /dev/null and b/emojis/1f681.png differ diff --git a/emojis/1f682.png b/emojis/1f682.png new file mode 100644 index 00000000..89f94dda Binary files /dev/null and b/emojis/1f682.png differ diff --git a/emojis/1f683.png b/emojis/1f683.png new file mode 100644 index 00000000..a33665ef Binary files /dev/null and b/emojis/1f683.png differ diff --git a/emojis/1f684.png b/emojis/1f684.png new file mode 100644 index 00000000..4b6f70ce Binary files /dev/null and b/emojis/1f684.png differ diff --git a/emojis/1f685.png b/emojis/1f685.png new file mode 100644 index 00000000..349b24ac Binary files /dev/null and b/emojis/1f685.png differ diff --git a/emojis/1f686.png b/emojis/1f686.png new file mode 100644 index 00000000..3c0e0371 Binary files /dev/null and b/emojis/1f686.png differ diff --git a/emojis/1f687.png b/emojis/1f687.png new file mode 100644 index 00000000..a1affaf5 Binary files /dev/null and b/emojis/1f687.png differ diff --git a/emojis/1f688.png b/emojis/1f688.png new file mode 100644 index 00000000..4fbd4758 Binary files /dev/null and b/emojis/1f688.png differ diff --git a/emojis/1f689.png b/emojis/1f689.png new file mode 100644 index 00000000..17254c4b Binary files /dev/null and b/emojis/1f689.png differ diff --git a/emojis/1f68a.png b/emojis/1f68a.png new file mode 100644 index 00000000..270b8068 Binary files /dev/null and b/emojis/1f68a.png differ diff --git a/emojis/1f68b.png b/emojis/1f68b.png new file mode 100644 index 00000000..0600119c Binary files /dev/null and b/emojis/1f68b.png differ diff --git a/emojis/1f68c.png b/emojis/1f68c.png new file mode 100644 index 00000000..d2d853a9 Binary files /dev/null and b/emojis/1f68c.png differ diff --git a/emojis/1f68d.png b/emojis/1f68d.png new file mode 100644 index 00000000..2cafe329 Binary files /dev/null and b/emojis/1f68d.png differ diff --git a/emojis/1f68e.png b/emojis/1f68e.png new file mode 100644 index 00000000..5b4732c5 Binary files /dev/null and b/emojis/1f68e.png differ diff --git a/emojis/1f68f.png b/emojis/1f68f.png new file mode 100644 index 00000000..639c816e Binary files /dev/null and b/emojis/1f68f.png differ diff --git a/emojis/1f690.png b/emojis/1f690.png new file mode 100644 index 00000000..d0e3dae2 Binary files /dev/null and b/emojis/1f690.png differ diff --git a/emojis/1f691.png b/emojis/1f691.png new file mode 100644 index 00000000..fdc56e56 Binary files /dev/null and b/emojis/1f691.png differ diff --git a/emojis/1f692.png b/emojis/1f692.png new file mode 100644 index 00000000..a2508a60 Binary files /dev/null and b/emojis/1f692.png differ diff --git a/emojis/1f693.png b/emojis/1f693.png new file mode 100644 index 00000000..74f6cf1c Binary files /dev/null and b/emojis/1f693.png differ diff --git a/emojis/1f694.png b/emojis/1f694.png new file mode 100644 index 00000000..3f4f8e49 Binary files /dev/null and b/emojis/1f694.png differ diff --git a/emojis/1f695.png b/emojis/1f695.png new file mode 100644 index 00000000..c6a6d9f2 Binary files /dev/null and b/emojis/1f695.png differ diff --git a/emojis/1f696.png b/emojis/1f696.png new file mode 100644 index 00000000..fa144b17 Binary files /dev/null and b/emojis/1f696.png differ diff --git a/emojis/1f697.png b/emojis/1f697.png new file mode 100644 index 00000000..9719519b Binary files /dev/null and b/emojis/1f697.png differ diff --git a/emojis/1f698.png b/emojis/1f698.png new file mode 100644 index 00000000..c6ed50d3 Binary files /dev/null and b/emojis/1f698.png differ diff --git a/emojis/1f699.png b/emojis/1f699.png new file mode 100644 index 00000000..d3d9cdb0 Binary files /dev/null and b/emojis/1f699.png differ diff --git a/emojis/1f69a.png b/emojis/1f69a.png new file mode 100644 index 00000000..0ae78b36 Binary files /dev/null and b/emojis/1f69a.png differ diff --git a/emojis/1f69b.png b/emojis/1f69b.png new file mode 100644 index 00000000..b992f86f Binary files /dev/null and b/emojis/1f69b.png differ diff --git a/emojis/1f69c.png b/emojis/1f69c.png new file mode 100644 index 00000000..aa9bd39d Binary files /dev/null and b/emojis/1f69c.png differ diff --git a/emojis/1f69d.png b/emojis/1f69d.png new file mode 100644 index 00000000..c33a78ce Binary files /dev/null and b/emojis/1f69d.png differ diff --git a/emojis/1f69e.png b/emojis/1f69e.png new file mode 100644 index 00000000..5ea872ef Binary files /dev/null and b/emojis/1f69e.png differ diff --git a/emojis/1f69f.png b/emojis/1f69f.png new file mode 100644 index 00000000..a14614f1 Binary files /dev/null and b/emojis/1f69f.png differ diff --git a/emojis/1f6a0.png b/emojis/1f6a0.png new file mode 100644 index 00000000..ae8dac81 Binary files /dev/null and b/emojis/1f6a0.png differ diff --git a/emojis/1f6a1.png b/emojis/1f6a1.png new file mode 100644 index 00000000..222e7c56 Binary files /dev/null and b/emojis/1f6a1.png differ diff --git a/emojis/1f6a2.png b/emojis/1f6a2.png new file mode 100644 index 00000000..63442976 Binary files /dev/null and b/emojis/1f6a2.png differ diff --git a/emojis/1f6a3.png b/emojis/1f6a3.png new file mode 100644 index 00000000..ef8875dd Binary files /dev/null and b/emojis/1f6a3.png differ diff --git a/emojis/1f6a4.png b/emojis/1f6a4.png new file mode 100644 index 00000000..1154a1ca Binary files /dev/null and b/emojis/1f6a4.png differ diff --git a/emojis/1f6a5.png b/emojis/1f6a5.png new file mode 100644 index 00000000..4fdf44e2 Binary files /dev/null and b/emojis/1f6a5.png differ diff --git a/emojis/1f6a6.png b/emojis/1f6a6.png new file mode 100644 index 00000000..b01c89f7 Binary files /dev/null and b/emojis/1f6a6.png differ diff --git a/emojis/1f6a7.png b/emojis/1f6a7.png new file mode 100644 index 00000000..66c45552 Binary files /dev/null and b/emojis/1f6a7.png differ diff --git a/emojis/1f6a8.png b/emojis/1f6a8.png new file mode 100644 index 00000000..04f88fd7 Binary files /dev/null and b/emojis/1f6a8.png differ diff --git a/emojis/1f6a9.png b/emojis/1f6a9.png new file mode 100644 index 00000000..af55b601 Binary files /dev/null and b/emojis/1f6a9.png differ diff --git a/emojis/1f6aa.png b/emojis/1f6aa.png new file mode 100644 index 00000000..158bd808 Binary files /dev/null and b/emojis/1f6aa.png differ diff --git a/emojis/1f6ab.png b/emojis/1f6ab.png new file mode 100644 index 00000000..c52c0871 Binary files /dev/null and b/emojis/1f6ab.png differ diff --git a/emojis/1f6ac.png b/emojis/1f6ac.png new file mode 100644 index 00000000..ab6b73dc Binary files /dev/null and b/emojis/1f6ac.png differ diff --git a/emojis/1f6ad.png b/emojis/1f6ad.png new file mode 100644 index 00000000..b20500a4 Binary files /dev/null and b/emojis/1f6ad.png differ diff --git a/emojis/1f6ae.png b/emojis/1f6ae.png new file mode 100644 index 00000000..6e09af04 Binary files /dev/null and b/emojis/1f6ae.png differ diff --git a/emojis/1f6af.png b/emojis/1f6af.png new file mode 100644 index 00000000..07d02708 Binary files /dev/null and b/emojis/1f6af.png differ diff --git a/emojis/1f6b0.png b/emojis/1f6b0.png new file mode 100644 index 00000000..833d3817 Binary files /dev/null and b/emojis/1f6b0.png differ diff --git a/emojis/1f6b1.png b/emojis/1f6b1.png new file mode 100644 index 00000000..9977beac Binary files /dev/null and b/emojis/1f6b1.png differ diff --git a/emojis/1f6b2.png b/emojis/1f6b2.png new file mode 100644 index 00000000..953ee5e3 Binary files /dev/null and b/emojis/1f6b2.png differ diff --git a/emojis/1f6b3.png b/emojis/1f6b3.png new file mode 100644 index 00000000..8ff4749e Binary files /dev/null and b/emojis/1f6b3.png differ diff --git a/emojis/1f6b4.png b/emojis/1f6b4.png new file mode 100644 index 00000000..9d298195 Binary files /dev/null and b/emojis/1f6b4.png differ diff --git a/emojis/1f6b5.png b/emojis/1f6b5.png new file mode 100644 index 00000000..2179499a Binary files /dev/null and b/emojis/1f6b5.png differ diff --git a/emojis/1f6b6.png b/emojis/1f6b6.png new file mode 100644 index 00000000..81dec26f Binary files /dev/null and b/emojis/1f6b6.png differ diff --git a/emojis/1f6b7.png b/emojis/1f6b7.png new file mode 100644 index 00000000..e03e96ad Binary files /dev/null and b/emojis/1f6b7.png differ diff --git a/emojis/1f6b8.png b/emojis/1f6b8.png new file mode 100644 index 00000000..956494ca Binary files /dev/null and b/emojis/1f6b8.png differ diff --git a/emojis/1f6b9.png b/emojis/1f6b9.png new file mode 100644 index 00000000..43d0d168 Binary files /dev/null and b/emojis/1f6b9.png differ diff --git a/emojis/1f6ba.png b/emojis/1f6ba.png new file mode 100644 index 00000000..78d91b49 Binary files /dev/null and b/emojis/1f6ba.png differ diff --git a/emojis/1f6bb.png b/emojis/1f6bb.png new file mode 100644 index 00000000..2cd688eb Binary files /dev/null and b/emojis/1f6bb.png differ diff --git a/emojis/1f6bc.png b/emojis/1f6bc.png new file mode 100644 index 00000000..4f7a700d Binary files /dev/null and b/emojis/1f6bc.png differ diff --git a/emojis/1f6bd.png b/emojis/1f6bd.png new file mode 100644 index 00000000..2171e4bc Binary files /dev/null and b/emojis/1f6bd.png differ diff --git a/emojis/1f6be.png b/emojis/1f6be.png new file mode 100644 index 00000000..03c8928d Binary files /dev/null and b/emojis/1f6be.png differ diff --git a/emojis/1f6bf.png b/emojis/1f6bf.png new file mode 100644 index 00000000..de9c3a9d Binary files /dev/null and b/emojis/1f6bf.png differ diff --git a/emojis/1f6c0.png b/emojis/1f6c0.png new file mode 100644 index 00000000..b7b884a3 Binary files /dev/null and b/emojis/1f6c0.png differ diff --git a/emojis/1f6c1.png b/emojis/1f6c1.png new file mode 100644 index 00000000..701dca1d Binary files /dev/null and b/emojis/1f6c1.png differ diff --git a/emojis/1f6c2.png b/emojis/1f6c2.png new file mode 100644 index 00000000..a5ba36c2 Binary files /dev/null and b/emojis/1f6c2.png differ diff --git a/emojis/1f6c3.png b/emojis/1f6c3.png new file mode 100644 index 00000000..fc057b9d Binary files /dev/null and b/emojis/1f6c3.png differ diff --git a/emojis/1f6c4.png b/emojis/1f6c4.png new file mode 100644 index 00000000..c668ac2b Binary files /dev/null and b/emojis/1f6c4.png differ diff --git a/emojis/1f6c5.png b/emojis/1f6c5.png new file mode 100644 index 00000000..4c0d92aa Binary files /dev/null and b/emojis/1f6c5.png differ diff --git a/emojis/1f6cb.png b/emojis/1f6cb.png new file mode 100644 index 00000000..b706ffe5 Binary files /dev/null and b/emojis/1f6cb.png differ diff --git a/emojis/1f6cc.png b/emojis/1f6cc.png new file mode 100644 index 00000000..5ff54664 Binary files /dev/null and b/emojis/1f6cc.png differ diff --git a/emojis/1f6cd.png b/emojis/1f6cd.png new file mode 100644 index 00000000..bc84c66a Binary files /dev/null and b/emojis/1f6cd.png differ diff --git a/emojis/1f6ce.png b/emojis/1f6ce.png new file mode 100644 index 00000000..d3755509 Binary files /dev/null and b/emojis/1f6ce.png differ diff --git a/emojis/1f6cf.png b/emojis/1f6cf.png new file mode 100644 index 00000000..01140e43 Binary files /dev/null and b/emojis/1f6cf.png differ diff --git a/emojis/1f6d0.png b/emojis/1f6d0.png new file mode 100644 index 00000000..31f2ee04 Binary files /dev/null and b/emojis/1f6d0.png differ diff --git a/emojis/1f6e0.png b/emojis/1f6e0.png new file mode 100644 index 00000000..5bc97f95 Binary files /dev/null and b/emojis/1f6e0.png differ diff --git a/emojis/1f6e1.png b/emojis/1f6e1.png new file mode 100644 index 00000000..3f9ea922 Binary files /dev/null and b/emojis/1f6e1.png differ diff --git a/emojis/1f6e2.png b/emojis/1f6e2.png new file mode 100644 index 00000000..98d6d769 Binary files /dev/null and b/emojis/1f6e2.png differ diff --git a/emojis/1f6e3.png b/emojis/1f6e3.png new file mode 100644 index 00000000..57f1521a Binary files /dev/null and b/emojis/1f6e3.png differ diff --git a/emojis/1f6e4.png b/emojis/1f6e4.png new file mode 100644 index 00000000..c7c848a5 Binary files /dev/null and b/emojis/1f6e4.png differ diff --git a/emojis/1f6e5.png b/emojis/1f6e5.png new file mode 100644 index 00000000..89cdda4d Binary files /dev/null and b/emojis/1f6e5.png differ diff --git a/emojis/1f6e9.png b/emojis/1f6e9.png new file mode 100644 index 00000000..30ff9bf2 Binary files /dev/null and b/emojis/1f6e9.png differ diff --git a/emojis/1f6eb.png b/emojis/1f6eb.png new file mode 100644 index 00000000..863c6bbd Binary files /dev/null and b/emojis/1f6eb.png differ diff --git a/emojis/1f6ec.png b/emojis/1f6ec.png new file mode 100644 index 00000000..8d860fe3 Binary files /dev/null and b/emojis/1f6ec.png differ diff --git a/emojis/1f6f0.png b/emojis/1f6f0.png new file mode 100644 index 00000000..19f9a1d2 Binary files /dev/null and b/emojis/1f6f0.png differ diff --git a/emojis/1f6f3.png b/emojis/1f6f3.png new file mode 100644 index 00000000..43c09dca Binary files /dev/null and b/emojis/1f6f3.png differ diff --git a/emojis/1f910.png b/emojis/1f910.png new file mode 100644 index 00000000..4c6e9459 Binary files /dev/null and b/emojis/1f910.png differ diff --git a/emojis/1f911.png b/emojis/1f911.png new file mode 100644 index 00000000..eb056616 Binary files /dev/null and b/emojis/1f911.png differ diff --git a/emojis/1f912.png b/emojis/1f912.png new file mode 100644 index 00000000..7a622063 Binary files /dev/null and b/emojis/1f912.png differ diff --git a/emojis/1f913.png b/emojis/1f913.png new file mode 100644 index 00000000..60b44c16 Binary files /dev/null and b/emojis/1f913.png differ diff --git a/emojis/1f914.png b/emojis/1f914.png new file mode 100644 index 00000000..3bcf6096 Binary files /dev/null and b/emojis/1f914.png differ diff --git a/emojis/1f915.png b/emojis/1f915.png new file mode 100644 index 00000000..edc696d1 Binary files /dev/null and b/emojis/1f915.png differ diff --git a/emojis/1f916.png b/emojis/1f916.png new file mode 100644 index 00000000..26e99159 Binary files /dev/null and b/emojis/1f916.png differ diff --git a/emojis/1f917.png b/emojis/1f917.png new file mode 100644 index 00000000..26deb1cc Binary files /dev/null and b/emojis/1f917.png differ diff --git a/emojis/1f918.png b/emojis/1f918.png new file mode 100644 index 00000000..0d386273 Binary files /dev/null and b/emojis/1f918.png differ diff --git a/emojis/1f980.png b/emojis/1f980.png new file mode 100644 index 00000000..b128f804 Binary files /dev/null and b/emojis/1f980.png differ diff --git a/emojis/1f981.png b/emojis/1f981.png new file mode 100644 index 00000000..c3a966a2 Binary files /dev/null and b/emojis/1f981.png differ diff --git a/emojis/1f982.png b/emojis/1f982.png new file mode 100644 index 00000000..cad2d3d8 Binary files /dev/null and b/emojis/1f982.png differ diff --git a/emojis/1f983.png b/emojis/1f983.png new file mode 100644 index 00000000..7a83b3eb Binary files /dev/null and b/emojis/1f983.png differ diff --git a/emojis/1f984.png b/emojis/1f984.png new file mode 100644 index 00000000..18d73fad Binary files /dev/null and b/emojis/1f984.png differ diff --git a/emojis/1f9c0.png b/emojis/1f9c0.png new file mode 100644 index 00000000..ce5e813b Binary files /dev/null and b/emojis/1f9c0.png differ diff --git a/emojis/203c.png b/emojis/203c.png new file mode 100644 index 00000000..434405b1 Binary files /dev/null and b/emojis/203c.png differ diff --git a/emojis/2049.png b/emojis/2049.png new file mode 100644 index 00000000..bbf863cf Binary files /dev/null and b/emojis/2049.png differ diff --git a/emojis/2139.png b/emojis/2139.png new file mode 100644 index 00000000..e123e25e Binary files /dev/null and b/emojis/2139.png differ diff --git a/emojis/2194.png b/emojis/2194.png new file mode 100644 index 00000000..0422ac4d Binary files /dev/null and b/emojis/2194.png differ diff --git a/emojis/2195.png b/emojis/2195.png new file mode 100644 index 00000000..5b9534d9 Binary files /dev/null and b/emojis/2195.png differ diff --git a/emojis/2196.png b/emojis/2196.png new file mode 100644 index 00000000..62e16810 Binary files /dev/null and b/emojis/2196.png differ diff --git a/emojis/2197.png b/emojis/2197.png new file mode 100644 index 00000000..ee00e481 Binary files /dev/null and b/emojis/2197.png differ diff --git a/emojis/2198.png b/emojis/2198.png new file mode 100644 index 00000000..dab5e291 Binary files /dev/null and b/emojis/2198.png differ diff --git a/emojis/2199.png b/emojis/2199.png new file mode 100644 index 00000000..08a89ec6 Binary files /dev/null and b/emojis/2199.png differ diff --git a/emojis/21a9.png b/emojis/21a9.png new file mode 100644 index 00000000..d68c9b12 Binary files /dev/null and b/emojis/21a9.png differ diff --git a/emojis/21aa.png b/emojis/21aa.png new file mode 100644 index 00000000..6a969834 Binary files /dev/null and b/emojis/21aa.png differ diff --git a/emojis/231a.png b/emojis/231a.png new file mode 100644 index 00000000..3809418c Binary files /dev/null and b/emojis/231a.png differ diff --git a/emojis/231b.png b/emojis/231b.png new file mode 100644 index 00000000..3e0e734a Binary files /dev/null and b/emojis/231b.png differ diff --git a/emojis/2328.png b/emojis/2328.png new file mode 100644 index 00000000..491d7988 Binary files /dev/null and b/emojis/2328.png differ diff --git a/emojis/23e9.png b/emojis/23e9.png new file mode 100644 index 00000000..3226696d Binary files /dev/null and b/emojis/23e9.png differ diff --git a/emojis/23ea.png b/emojis/23ea.png new file mode 100644 index 00000000..d27d2c98 Binary files /dev/null and b/emojis/23ea.png differ diff --git a/emojis/23eb.png b/emojis/23eb.png new file mode 100644 index 00000000..b5fc2d3c Binary files /dev/null and b/emojis/23eb.png differ diff --git a/emojis/23ec.png b/emojis/23ec.png new file mode 100644 index 00000000..9d1c2bbd Binary files /dev/null and b/emojis/23ec.png differ diff --git a/emojis/23ed.png b/emojis/23ed.png new file mode 100644 index 00000000..8772ba28 Binary files /dev/null and b/emojis/23ed.png differ diff --git a/emojis/23ee.png b/emojis/23ee.png new file mode 100644 index 00000000..7c820c80 Binary files /dev/null and b/emojis/23ee.png differ diff --git a/emojis/23ef.png b/emojis/23ef.png new file mode 100644 index 00000000..f3d8118e Binary files /dev/null and b/emojis/23ef.png differ diff --git a/emojis/23f0.png b/emojis/23f0.png new file mode 100644 index 00000000..fccd685a Binary files /dev/null and b/emojis/23f0.png differ diff --git a/emojis/23f1.png b/emojis/23f1.png new file mode 100644 index 00000000..b6982a27 Binary files /dev/null and b/emojis/23f1.png differ diff --git a/emojis/23f2.png b/emojis/23f2.png new file mode 100644 index 00000000..c6a7ea7a Binary files /dev/null and b/emojis/23f2.png differ diff --git a/emojis/23f3.png b/emojis/23f3.png new file mode 100644 index 00000000..b6e5675d Binary files /dev/null and b/emojis/23f3.png differ diff --git a/emojis/23f8.png b/emojis/23f8.png new file mode 100644 index 00000000..a7993a4f Binary files /dev/null and b/emojis/23f8.png differ diff --git a/emojis/23f9.png b/emojis/23f9.png new file mode 100644 index 00000000..3a34cb7f Binary files /dev/null and b/emojis/23f9.png differ diff --git a/emojis/23fa.png b/emojis/23fa.png new file mode 100644 index 00000000..72c5a709 Binary files /dev/null and b/emojis/23fa.png differ diff --git a/emojis/24c2.png b/emojis/24c2.png new file mode 100644 index 00000000..c3f38182 Binary files /dev/null and b/emojis/24c2.png differ diff --git a/emojis/25aa.png b/emojis/25aa.png new file mode 100644 index 00000000..c3373520 Binary files /dev/null and b/emojis/25aa.png differ diff --git a/emojis/25ab.png b/emojis/25ab.png new file mode 100644 index 00000000..c65f7e62 Binary files /dev/null and b/emojis/25ab.png differ diff --git a/emojis/25b6.png b/emojis/25b6.png new file mode 100644 index 00000000..4b1fb019 Binary files /dev/null and b/emojis/25b6.png differ diff --git a/emojis/25c0.png b/emojis/25c0.png new file mode 100644 index 00000000..b5db584f Binary files /dev/null and b/emojis/25c0.png differ diff --git a/emojis/25fb.png b/emojis/25fb.png new file mode 100644 index 00000000..2b0293fe Binary files /dev/null and b/emojis/25fb.png differ diff --git a/emojis/25fc.png b/emojis/25fc.png new file mode 100644 index 00000000..60bddb0b Binary files /dev/null and b/emojis/25fc.png differ diff --git a/emojis/25fd.png b/emojis/25fd.png new file mode 100644 index 00000000..b06389d5 Binary files /dev/null and b/emojis/25fd.png differ diff --git a/emojis/25fe.png b/emojis/25fe.png new file mode 100644 index 00000000..1e4af908 Binary files /dev/null and b/emojis/25fe.png differ diff --git a/emojis/2600.png b/emojis/2600.png new file mode 100644 index 00000000..9047237c Binary files /dev/null and b/emojis/2600.png differ diff --git a/emojis/2601.png b/emojis/2601.png new file mode 100644 index 00000000..8274e515 Binary files /dev/null and b/emojis/2601.png differ diff --git a/emojis/2602.png b/emojis/2602.png new file mode 100644 index 00000000..0e2d8ce2 Binary files /dev/null and b/emojis/2602.png differ diff --git a/emojis/2603.png b/emojis/2603.png new file mode 100644 index 00000000..80a03bdb Binary files /dev/null and b/emojis/2603.png differ diff --git a/emojis/2604.png b/emojis/2604.png new file mode 100644 index 00000000..7f0c3438 Binary files /dev/null and b/emojis/2604.png differ diff --git a/emojis/260e.png b/emojis/260e.png new file mode 100644 index 00000000..eaee53d6 Binary files /dev/null and b/emojis/260e.png differ diff --git a/emojis/2611.png b/emojis/2611.png new file mode 100644 index 00000000..46e861f4 Binary files /dev/null and b/emojis/2611.png differ diff --git a/emojis/2614.png b/emojis/2614.png new file mode 100644 index 00000000..8379d6fa Binary files /dev/null and b/emojis/2614.png differ diff --git a/emojis/2615.png b/emojis/2615.png new file mode 100644 index 00000000..cf9a689c Binary files /dev/null and b/emojis/2615.png differ diff --git a/emojis/2618.png b/emojis/2618.png new file mode 100644 index 00000000..0da05d4e Binary files /dev/null and b/emojis/2618.png differ diff --git a/emojis/261d.png b/emojis/261d.png new file mode 100644 index 00000000..8aabe3d0 Binary files /dev/null and b/emojis/261d.png differ diff --git a/emojis/2620.png b/emojis/2620.png new file mode 100644 index 00000000..0aa44690 Binary files /dev/null and b/emojis/2620.png differ diff --git a/emojis/2622.png b/emojis/2622.png new file mode 100644 index 00000000..e2eac944 Binary files /dev/null and b/emojis/2622.png differ diff --git a/emojis/2623.png b/emojis/2623.png new file mode 100644 index 00000000..6e0d0122 Binary files /dev/null and b/emojis/2623.png differ diff --git a/emojis/2626.png b/emojis/2626.png new file mode 100644 index 00000000..09146d5d Binary files /dev/null and b/emojis/2626.png differ diff --git a/emojis/262a.png b/emojis/262a.png new file mode 100644 index 00000000..fe83d143 Binary files /dev/null and b/emojis/262a.png differ diff --git a/emojis/262e.png b/emojis/262e.png new file mode 100644 index 00000000..d17a2512 Binary files /dev/null and b/emojis/262e.png differ diff --git a/emojis/262f.png b/emojis/262f.png new file mode 100644 index 00000000..a02c9adc Binary files /dev/null and b/emojis/262f.png differ diff --git a/emojis/2638.png b/emojis/2638.png new file mode 100644 index 00000000..53bad371 Binary files /dev/null and b/emojis/2638.png differ diff --git a/emojis/2639.png b/emojis/2639.png new file mode 100644 index 00000000..9c9221f8 Binary files /dev/null and b/emojis/2639.png differ diff --git a/emojis/263a.png b/emojis/263a.png new file mode 100644 index 00000000..8581bd29 Binary files /dev/null and b/emojis/263a.png differ diff --git a/emojis/2648.png b/emojis/2648.png new file mode 100644 index 00000000..5a84d63c Binary files /dev/null and b/emojis/2648.png differ diff --git a/emojis/2649.png b/emojis/2649.png new file mode 100644 index 00000000..1d803a61 Binary files /dev/null and b/emojis/2649.png differ diff --git a/emojis/264a.png b/emojis/264a.png new file mode 100644 index 00000000..9e16311d Binary files /dev/null and b/emojis/264a.png differ diff --git a/emojis/264b.png b/emojis/264b.png new file mode 100644 index 00000000..9c2e4546 Binary files /dev/null and b/emojis/264b.png differ diff --git a/emojis/264c.png b/emojis/264c.png new file mode 100644 index 00000000..a050b90e Binary files /dev/null and b/emojis/264c.png differ diff --git a/emojis/264d.png b/emojis/264d.png new file mode 100644 index 00000000..c3dd210b Binary files /dev/null and b/emojis/264d.png differ diff --git a/emojis/264e.png b/emojis/264e.png new file mode 100644 index 00000000..b22a4515 Binary files /dev/null and b/emojis/264e.png differ diff --git a/emojis/264f.png b/emojis/264f.png new file mode 100644 index 00000000..7ff3fe83 Binary files /dev/null and b/emojis/264f.png differ diff --git a/emojis/2650.png b/emojis/2650.png new file mode 100644 index 00000000..c2248b7e Binary files /dev/null and b/emojis/2650.png differ diff --git a/emojis/2651.png b/emojis/2651.png new file mode 100644 index 00000000..ff58cf02 Binary files /dev/null and b/emojis/2651.png differ diff --git a/emojis/2652.png b/emojis/2652.png new file mode 100644 index 00000000..22bbd85f Binary files /dev/null and b/emojis/2652.png differ diff --git a/emojis/2653.png b/emojis/2653.png new file mode 100644 index 00000000..43e0d45f Binary files /dev/null and b/emojis/2653.png differ diff --git a/emojis/2660.png b/emojis/2660.png new file mode 100644 index 00000000..c1f25a8b Binary files /dev/null and b/emojis/2660.png differ diff --git a/emojis/2663.png b/emojis/2663.png new file mode 100644 index 00000000..419f9be4 Binary files /dev/null and b/emojis/2663.png differ diff --git a/emojis/2665.png b/emojis/2665.png new file mode 100644 index 00000000..dca527bf Binary files /dev/null and b/emojis/2665.png differ diff --git a/emojis/2666.png b/emojis/2666.png new file mode 100644 index 00000000..90154935 Binary files /dev/null and b/emojis/2666.png differ diff --git a/emojis/2668.png b/emojis/2668.png new file mode 100644 index 00000000..6ddd77c9 Binary files /dev/null and b/emojis/2668.png differ diff --git a/emojis/267b.png b/emojis/267b.png new file mode 100644 index 00000000..87f432fa Binary files /dev/null and b/emojis/267b.png differ diff --git a/emojis/267f.png b/emojis/267f.png new file mode 100644 index 00000000..efc9909b Binary files /dev/null and b/emojis/267f.png differ diff --git a/emojis/2692.png b/emojis/2692.png new file mode 100644 index 00000000..579984c4 Binary files /dev/null and b/emojis/2692.png differ diff --git a/emojis/2693.png b/emojis/2693.png new file mode 100644 index 00000000..31896a55 Binary files /dev/null and b/emojis/2693.png differ diff --git a/emojis/2694.png b/emojis/2694.png new file mode 100644 index 00000000..d87a6a60 Binary files /dev/null and b/emojis/2694.png differ diff --git a/emojis/2696.png b/emojis/2696.png new file mode 100644 index 00000000..8846c875 Binary files /dev/null and b/emojis/2696.png differ diff --git a/emojis/2697.png b/emojis/2697.png new file mode 100644 index 00000000..ad4975ef Binary files /dev/null and b/emojis/2697.png differ diff --git a/emojis/2699.png b/emojis/2699.png new file mode 100644 index 00000000..9bf94aae Binary files /dev/null and b/emojis/2699.png differ diff --git a/emojis/269b.png b/emojis/269b.png new file mode 100644 index 00000000..0c70f287 Binary files /dev/null and b/emojis/269b.png differ diff --git a/emojis/269c.png b/emojis/269c.png new file mode 100644 index 00000000..19d2a828 Binary files /dev/null and b/emojis/269c.png differ diff --git a/emojis/26a0.png b/emojis/26a0.png new file mode 100644 index 00000000..ea27d15c Binary files /dev/null and b/emojis/26a0.png differ diff --git a/emojis/26a1.png b/emojis/26a1.png new file mode 100644 index 00000000..e7e7b75a Binary files /dev/null and b/emojis/26a1.png differ diff --git a/emojis/26aa.png b/emojis/26aa.png new file mode 100644 index 00000000..13e73518 Binary files /dev/null and b/emojis/26aa.png differ diff --git a/emojis/26ab.png b/emojis/26ab.png new file mode 100644 index 00000000..a20ddf6e Binary files /dev/null and b/emojis/26ab.png differ diff --git a/emojis/26b0.png b/emojis/26b0.png new file mode 100644 index 00000000..cd08d05a Binary files /dev/null and b/emojis/26b0.png differ diff --git a/emojis/26b1.png b/emojis/26b1.png new file mode 100644 index 00000000..afd6a659 Binary files /dev/null and b/emojis/26b1.png differ diff --git a/emojis/26bd.png b/emojis/26bd.png new file mode 100644 index 00000000..7e219a31 Binary files /dev/null and b/emojis/26bd.png differ diff --git a/emojis/26be.png b/emojis/26be.png new file mode 100644 index 00000000..c771cc2b Binary files /dev/null and b/emojis/26be.png differ diff --git a/emojis/26c4.png b/emojis/26c4.png new file mode 100644 index 00000000..b1835392 Binary files /dev/null and b/emojis/26c4.png differ diff --git a/emojis/26c5.png b/emojis/26c5.png new file mode 100644 index 00000000..cf4e1654 Binary files /dev/null and b/emojis/26c5.png differ diff --git a/emojis/26c8.png b/emojis/26c8.png new file mode 100644 index 00000000..ef2bd558 Binary files /dev/null and b/emojis/26c8.png differ diff --git a/emojis/26ce.png b/emojis/26ce.png new file mode 100644 index 00000000..f2fcb622 Binary files /dev/null and b/emojis/26ce.png differ diff --git a/emojis/26cf.png b/emojis/26cf.png new file mode 100644 index 00000000..9f16142a Binary files /dev/null and b/emojis/26cf.png differ diff --git a/emojis/26d1.png b/emojis/26d1.png new file mode 100644 index 00000000..3995af8f Binary files /dev/null and b/emojis/26d1.png differ diff --git a/emojis/26d3.png b/emojis/26d3.png new file mode 100644 index 00000000..9ff6397b Binary files /dev/null and b/emojis/26d3.png differ diff --git a/emojis/26d4.png b/emojis/26d4.png new file mode 100644 index 00000000..d28699ce Binary files /dev/null and b/emojis/26d4.png differ diff --git a/emojis/26e9.png b/emojis/26e9.png new file mode 100644 index 00000000..86902414 Binary files /dev/null and b/emojis/26e9.png differ diff --git a/emojis/26ea.png b/emojis/26ea.png new file mode 100644 index 00000000..e7e94332 Binary files /dev/null and b/emojis/26ea.png differ diff --git a/emojis/26f0.png b/emojis/26f0.png new file mode 100644 index 00000000..6ac65545 Binary files /dev/null and b/emojis/26f0.png differ diff --git a/emojis/26f1.png b/emojis/26f1.png new file mode 100644 index 00000000..7299fe0c Binary files /dev/null and b/emojis/26f1.png differ diff --git a/emojis/26f2.png b/emojis/26f2.png new file mode 100644 index 00000000..630fe352 Binary files /dev/null and b/emojis/26f2.png differ diff --git a/emojis/26f3.png b/emojis/26f3.png new file mode 100644 index 00000000..6f28da19 Binary files /dev/null and b/emojis/26f3.png differ diff --git a/emojis/26f4.png b/emojis/26f4.png new file mode 100644 index 00000000..e37e0b6a Binary files /dev/null and b/emojis/26f4.png differ diff --git a/emojis/26f5.png b/emojis/26f5.png new file mode 100644 index 00000000..52d88eea Binary files /dev/null and b/emojis/26f5.png differ diff --git a/emojis/26f7.png b/emojis/26f7.png new file mode 100644 index 00000000..6f5559e0 Binary files /dev/null and b/emojis/26f7.png differ diff --git a/emojis/26f8.png b/emojis/26f8.png new file mode 100644 index 00000000..c8d1fa26 Binary files /dev/null and b/emojis/26f8.png differ diff --git a/emojis/26f9.png b/emojis/26f9.png new file mode 100644 index 00000000..c1f2c3bb Binary files /dev/null and b/emojis/26f9.png differ diff --git a/emojis/26fa.png b/emojis/26fa.png new file mode 100644 index 00000000..bd778cd7 Binary files /dev/null and b/emojis/26fa.png differ diff --git a/emojis/26fd.png b/emojis/26fd.png new file mode 100644 index 00000000..f5795adc Binary files /dev/null and b/emojis/26fd.png differ diff --git a/emojis/2702.png b/emojis/2702.png new file mode 100644 index 00000000..dcb526df Binary files /dev/null and b/emojis/2702.png differ diff --git a/emojis/2705.png b/emojis/2705.png new file mode 100644 index 00000000..09db8ce1 Binary files /dev/null and b/emojis/2705.png differ diff --git a/emojis/2708.png b/emojis/2708.png new file mode 100644 index 00000000..7c83ff3c Binary files /dev/null and b/emojis/2708.png differ diff --git a/emojis/2709.png b/emojis/2709.png new file mode 100644 index 00000000..4c890f0b Binary files /dev/null and b/emojis/2709.png differ diff --git a/emojis/270a.png b/emojis/270a.png new file mode 100644 index 00000000..a7130bba Binary files /dev/null and b/emojis/270a.png differ diff --git a/emojis/270b.png b/emojis/270b.png new file mode 100644 index 00000000..2f377930 Binary files /dev/null and b/emojis/270b.png differ diff --git a/emojis/270c.png b/emojis/270c.png new file mode 100644 index 00000000..072dcbae Binary files /dev/null and b/emojis/270c.png differ diff --git a/emojis/270d.png b/emojis/270d.png new file mode 100644 index 00000000..7336de9a Binary files /dev/null and b/emojis/270d.png differ diff --git a/emojis/270f.png b/emojis/270f.png new file mode 100644 index 00000000..6d634bd1 Binary files /dev/null and b/emojis/270f.png differ diff --git a/emojis/2712.png b/emojis/2712.png new file mode 100644 index 00000000..6c70e714 Binary files /dev/null and b/emojis/2712.png differ diff --git a/emojis/2714.png b/emojis/2714.png new file mode 100644 index 00000000..ca960039 Binary files /dev/null and b/emojis/2714.png differ diff --git a/emojis/2716.png b/emojis/2716.png new file mode 100644 index 00000000..2494e066 Binary files /dev/null and b/emojis/2716.png differ diff --git a/emojis/271d.png b/emojis/271d.png new file mode 100644 index 00000000..1f98761e Binary files /dev/null and b/emojis/271d.png differ diff --git a/emojis/2721.png b/emojis/2721.png new file mode 100644 index 00000000..91ea2f87 Binary files /dev/null and b/emojis/2721.png differ diff --git a/emojis/2728.png b/emojis/2728.png new file mode 100644 index 00000000..8916b69e Binary files /dev/null and b/emojis/2728.png differ diff --git a/emojis/2733.png b/emojis/2733.png new file mode 100644 index 00000000..bcd79e20 Binary files /dev/null and b/emojis/2733.png differ diff --git a/emojis/2734.png b/emojis/2734.png new file mode 100644 index 00000000..5fe58b23 Binary files /dev/null and b/emojis/2734.png differ diff --git a/emojis/2744.png b/emojis/2744.png new file mode 100644 index 00000000..f64c2f15 Binary files /dev/null and b/emojis/2744.png differ diff --git a/emojis/2747.png b/emojis/2747.png new file mode 100644 index 00000000..e6f2395d Binary files /dev/null and b/emojis/2747.png differ diff --git a/emojis/274c.png b/emojis/274c.png new file mode 100644 index 00000000..65bbadaa Binary files /dev/null and b/emojis/274c.png differ diff --git a/emojis/274e.png b/emojis/274e.png new file mode 100644 index 00000000..d85154ff Binary files /dev/null and b/emojis/274e.png differ diff --git a/emojis/2753.png b/emojis/2753.png new file mode 100644 index 00000000..1d8cf201 Binary files /dev/null and b/emojis/2753.png differ diff --git a/emojis/2754.png b/emojis/2754.png new file mode 100644 index 00000000..0c755b3a Binary files /dev/null and b/emojis/2754.png differ diff --git a/emojis/2755.png b/emojis/2755.png new file mode 100644 index 00000000..58fdc859 Binary files /dev/null and b/emojis/2755.png differ diff --git a/emojis/2757.png b/emojis/2757.png new file mode 100644 index 00000000..7587fe50 Binary files /dev/null and b/emojis/2757.png differ diff --git a/emojis/2763.png b/emojis/2763.png new file mode 100644 index 00000000..d6a1b045 Binary files /dev/null and b/emojis/2763.png differ diff --git a/emojis/2764.png b/emojis/2764.png new file mode 100644 index 00000000..02742f1d Binary files /dev/null and b/emojis/2764.png differ diff --git a/emojis/2795.png b/emojis/2795.png new file mode 100644 index 00000000..f351ea74 Binary files /dev/null and b/emojis/2795.png differ diff --git a/emojis/2796.png b/emojis/2796.png new file mode 100644 index 00000000..c026e2f7 Binary files /dev/null and b/emojis/2796.png differ diff --git a/emojis/2797.png b/emojis/2797.png new file mode 100644 index 00000000..18964c87 Binary files /dev/null and b/emojis/2797.png differ diff --git a/emojis/27a1.png b/emojis/27a1.png new file mode 100644 index 00000000..5aa3f8c8 Binary files /dev/null and b/emojis/27a1.png differ diff --git a/emojis/27b0.png b/emojis/27b0.png new file mode 100644 index 00000000..b2ec6298 Binary files /dev/null and b/emojis/27b0.png differ diff --git a/emojis/27bf.png b/emojis/27bf.png new file mode 100644 index 00000000..1e4954c5 Binary files /dev/null and b/emojis/27bf.png differ diff --git a/emojis/2934.png b/emojis/2934.png new file mode 100644 index 00000000..b1597912 Binary files /dev/null and b/emojis/2934.png differ diff --git a/emojis/2935.png b/emojis/2935.png new file mode 100644 index 00000000..18d3b1f9 Binary files /dev/null and b/emojis/2935.png differ diff --git a/emojis/2b05.png b/emojis/2b05.png new file mode 100644 index 00000000..cdb6846e Binary files /dev/null and b/emojis/2b05.png differ diff --git a/emojis/2b06.png b/emojis/2b06.png new file mode 100644 index 00000000..c5b2804c Binary files /dev/null and b/emojis/2b06.png differ diff --git a/emojis/2b07.png b/emojis/2b07.png new file mode 100644 index 00000000..95ab6d1a Binary files /dev/null and b/emojis/2b07.png differ diff --git a/emojis/2b1b.png b/emojis/2b1b.png new file mode 100644 index 00000000..71c01487 Binary files /dev/null and b/emojis/2b1b.png differ diff --git a/emojis/2b1c.png b/emojis/2b1c.png new file mode 100644 index 00000000..8a90cda3 Binary files /dev/null and b/emojis/2b1c.png differ diff --git a/emojis/2b50.png b/emojis/2b50.png new file mode 100644 index 00000000..46bd86c1 Binary files /dev/null and b/emojis/2b50.png differ diff --git a/emojis/2b55.png b/emojis/2b55.png new file mode 100644 index 00000000..e1f9e3e3 Binary files /dev/null and b/emojis/2b55.png differ diff --git a/emojis/3030.png b/emojis/3030.png new file mode 100644 index 00000000..6fa4eaad Binary files /dev/null and b/emojis/3030.png differ diff --git a/emojis/303d.png b/emojis/303d.png new file mode 100644 index 00000000..9727d94a Binary files /dev/null and b/emojis/303d.png differ diff --git a/emojis/3297.png b/emojis/3297.png new file mode 100644 index 00000000..bdbc8b8d Binary files /dev/null and b/emojis/3297.png differ diff --git a/emojis/3299.png b/emojis/3299.png new file mode 100644 index 00000000..654c5f66 Binary files /dev/null and b/emojis/3299.png differ diff --git a/emojis/emojis-data.json b/emojis/emojis-data.json new file mode 100644 index 00000000..382e5756 --- /dev/null +++ b/emojis/emojis-data.json @@ -0,0 +1 @@ +[{"name":"+1","image":"1f44d.png","id":"1f44d"},{"name":"-1","image":"1f44e.png","id":"1f44e"},{"name":"100","image":"1f4af.png","id":"1f4af"},{"name":"1234","image":"1f522.png","id":"1f522"},{"name":"8ball","image":"1f3b1.png","id":"1f3b1"},{"name":"a","image":"1f170.png","id":"1f170"},{"name":"ab","image":"1f18e.png","id":"1f18e"},{"name":"abc","image":"1f524.png","id":"1f524"},{"name":"abcd","image":"1f521.png","id":"1f521"},{"name":"accept","image":"1f251.png","id":"1f251"},{"name":"admission_tickets","image":"1f39f.png","id":"1f39f"},{"name":"aerial_tramway","image":"1f6a1.png","id":"1f6a1"},{"name":"airplane","image":"2708.png","id":"2708"},{"name":"airplane_arriving","image":"1f6ec.png","id":"1f6ec"},{"name":"airplane_departure","image":"1f6eb.png","id":"1f6eb"},{"name":"alarm_clock","image":"23f0.png","id":"23f0"},{"name":"alembic","image":"2697.png","id":"2697"},{"name":"alien","image":"1f47d.png","id":"1f47d"},{"name":"ambulance","image":"1f691.png","id":"1f691"},{"name":"amphora","image":"1f3fa.png","id":"1f3fa"},{"name":"anchor","image":"2693.png","id":"2693"},{"name":"angel","image":"1f47c.png","id":"1f47c"},{"name":"anger","image":"1f4a2.png","id":"1f4a2"},{"name":"angry","image":"1f620.png","id":"1f620"},{"name":"anguished","image":"1f627.png","id":"1f627"},{"name":"ant","image":"1f41c.png","id":"1f41c"},{"name":"apple","image":"1f34e.png","id":"1f34e"},{"name":"aquarius","image":"2652.png","id":"2652"},{"name":"aries","image":"2648.png","id":"2648"},{"name":"arrow_backward","image":"25c0.png","id":"25c0"},{"name":"arrow_double_down","image":"23ec.png","id":"23ec"},{"name":"arrow_double_up","image":"23eb.png","id":"23eb"},{"name":"arrow_down","image":"2b07.png","id":"2b07"},{"name":"arrow_down_small","image":"1f53d.png","id":"1f53d"},{"name":"arrow_forward","image":"25b6.png","id":"25b6"},{"name":"arrow_heading_down","image":"2935.png","id":"2935"},{"name":"arrow_heading_up","image":"2934.png","id":"2934"},{"name":"arrow_left","image":"2b05.png","id":"2b05"},{"name":"arrow_lower_left","image":"2199.png","id":"2199"},{"name":"arrow_lower_right","image":"2198.png","id":"2198"},{"name":"arrow_right","image":"27a1.png","id":"27a1"},{"name":"arrow_right_hook","image":"21aa.png","id":"21aa"},{"name":"arrow_up","image":"2b06.png","id":"2b06"},{"name":"arrow_up_down","image":"2195.png","id":"2195"},{"name":"arrow_up_small","image":"1f53c.png","id":"1f53c"},{"name":"arrow_upper_left","image":"2196.png","id":"2196"},{"name":"arrow_upper_right","image":"2197.png","id":"2197"},{"name":"arrows_clockwise","image":"1f503.png","id":"1f503"},{"name":"arrows_counterclockwise","image":"1f504.png","id":"1f504"},{"name":"art","image":"1f3a8.png","id":"1f3a8"},{"name":"articulated_lorry","image":"1f69b.png","id":"1f69b"},{"name":"astonished","image":"1f632.png","id":"1f632"},{"name":"athletic_shoe","image":"1f45f.png","id":"1f45f"},{"name":"atm","image":"1f3e7.png","id":"1f3e7"},{"name":"atom_symbol","image":"269b.png","id":"269b"},{"name":"b","image":"1f171.png","id":"1f171"},{"name":"baby","image":"1f476.png","id":"1f476"},{"name":"baby_bottle","image":"1f37c.png","id":"1f37c"},{"name":"baby_chick","image":"1f424.png","id":"1f424"},{"name":"baby_symbol","image":"1f6bc.png","id":"1f6bc"},{"name":"back","image":"1f519.png","id":"1f519"},{"name":"badminton_racquet_and_shuttlecock","image":"1f3f8.png","id":"1f3f8"},{"name":"baggage_claim","image":"1f6c4.png","id":"1f6c4"},{"name":"balloon","image":"1f388.png","id":"1f388"},{"name":"ballot_box_with_ballot","image":"1f5f3.png","id":"1f5f3"},{"name":"ballot_box_with_check","image":"2611.png","id":"2611"},{"name":"bamboo","image":"1f38d.png","id":"1f38d"},{"name":"banana","image":"1f34c.png","id":"1f34c"},{"name":"bangbang","image":"203c.png","id":"203c"},{"name":"bank","image":"1f3e6.png","id":"1f3e6"},{"name":"bar_chart","image":"1f4ca.png","id":"1f4ca"},{"name":"barber","image":"1f488.png","id":"1f488"},{"name":"barely_sunny","image":"1f325.png","id":"1f325"},{"name":"baseball","image":"26be.png","id":"26be"},{"name":"basketball","image":"1f3c0.png","id":"1f3c0"},{"name":"bath","image":"1f6c0.png","id":"1f6c0"},{"name":"bathtub","image":"1f6c1.png","id":"1f6c1"},{"name":"battery","image":"1f50b.png","id":"1f50b"},{"name":"beach_with_umbrella","image":"1f3d6.png","id":"1f3d6"},{"name":"bear","image":"1f43b.png","id":"1f43b"},{"name":"bed","image":"1f6cf.png","id":"1f6cf"},{"name":"bee","image":"1f41d.png","id":"1f41d"},{"name":"beer","image":"1f37a.png","id":"1f37a"},{"name":"beers","image":"1f37b.png","id":"1f37b"},{"name":"beetle","image":"1f41e.png","id":"1f41e"},{"name":"beginner","image":"1f530.png","id":"1f530"},{"name":"bell","image":"1f514.png","id":"1f514"},{"name":"bellhop_bell","image":"1f6ce.png","id":"1f6ce"},{"name":"bento","image":"1f371.png","id":"1f371"},{"name":"bicyclist","image":"1f6b4.png","id":"1f6b4"},{"name":"bike","image":"1f6b2.png","id":"1f6b2"},{"name":"bikini","image":"1f459.png","id":"1f459"},{"name":"biohazard_sign","image":"2623.png","id":"2623"},{"name":"bird","image":"1f426.png","id":"1f426"},{"name":"birthday","image":"1f382.png","id":"1f382"},{"name":"black_circle","image":"26ab.png","id":"26ab"},{"name":"black_circle_for_record","image":"23fa.png","id":"23fa"},{"name":"black_joker","image":"1f0cf.png","id":"1f0cf"},{"name":"black_large_square","image":"2b1b.png","id":"2b1b"},{"name":"black_left_pointing_double_triangle_with_vertical_bar","image":"23ee.png","id":"23ee"},{"name":"black_medium_small_square","image":"25fe.png","id":"25fe"},{"name":"black_medium_square","image":"25fc.png","id":"25fc"},{"name":"black_nib","image":"2712.png","id":"2712"},{"name":"black_right_pointing_double_triangle_with_vertical_bar","image":"23ed.png","id":"23ed"},{"name":"black_right_pointing_triangle_with_double_vertical_bar","image":"23ef.png","id":"23ef"},{"name":"black_small_square","image":"25aa.png","id":"25aa"},{"name":"black_square_button","image":"1f532.png","id":"1f532"},{"name":"black_square_for_stop","image":"23f9.png","id":"23f9"},{"name":"blossom","image":"1f33c.png","id":"1f33c"},{"name":"blowfish","image":"1f421.png","id":"1f421"},{"name":"blue_book","image":"1f4d8.png","id":"1f4d8"},{"name":"blue_car","image":"1f699.png","id":"1f699"},{"name":"blue_heart","image":"1f499.png","id":"1f499"},{"name":"blush","image":"1f60a.png","id":"1f60a"},{"name":"boar","image":"1f417.png","id":"1f417"},{"name":"boat","image":"26f5.png","id":"26f5"},{"name":"bomb","image":"1f4a3.png","id":"1f4a3"},{"name":"book","image":"1f4d6.png","id":"1f4d6"},{"name":"bookmark","image":"1f516.png","id":"1f516"},{"name":"bookmark_tabs","image":"1f4d1.png","id":"1f4d1"},{"name":"books","image":"1f4da.png","id":"1f4da"},{"name":"boom","image":"1f4a5.png","id":"1f4a5"},{"name":"boot","image":"1f462.png","id":"1f462"},{"name":"bouquet","image":"1f490.png","id":"1f490"},{"name":"bow","image":"1f647.png","id":"1f647"},{"name":"bow_and_arrow","image":"1f3f9.png","id":"1f3f9"},{"name":"bowling","image":"1f3b3.png","id":"1f3b3"},{"name":"boy","image":"1f466.png","id":"1f466"},{"name":"bread","image":"1f35e.png","id":"1f35e"},{"name":"bride_with_veil","image":"1f470.png","id":"1f470"},{"name":"bridge_at_night","image":"1f309.png","id":"1f309"},{"name":"briefcase","image":"1f4bc.png","id":"1f4bc"},{"name":"broken_heart","image":"1f494.png","id":"1f494"},{"name":"bug","image":"1f41b.png","id":"1f41b"},{"name":"building_construction","image":"1f3d7.png","id":"1f3d7"},{"name":"bulb","image":"1f4a1.png","id":"1f4a1"},{"name":"bullettrain_front","image":"1f685.png","id":"1f685"},{"name":"bullettrain_side","image":"1f684.png","id":"1f684"},{"name":"burrito","image":"1f32f.png","id":"1f32f"},{"name":"bus","image":"1f68c.png","id":"1f68c"},{"name":"busstop","image":"1f68f.png","id":"1f68f"},{"name":"bust_in_silhouette","image":"1f464.png","id":"1f464"},{"name":"busts_in_silhouette","image":"1f465.png","id":"1f465"},{"name":"cactus","image":"1f335.png","id":"1f335"},{"name":"cake","image":"1f370.png","id":"1f370"},{"name":"calendar","image":"1f4c6.png","id":"1f4c6"},{"name":"calling","image":"1f4f2.png","id":"1f4f2"},{"name":"camel","image":"1f42b.png","id":"1f42b"},{"name":"camera","image":"1f4f7.png","id":"1f4f7"},{"name":"camera_with_flash","image":"1f4f8.png","id":"1f4f8"},{"name":"camping","image":"1f3d5.png","id":"1f3d5"},{"name":"cancer","image":"264b.png","id":"264b"},{"name":"candle","image":"1f56f.png","id":"1f56f"},{"name":"candy","image":"1f36c.png","id":"1f36c"},{"name":"capital_abcd","image":"1f520.png","id":"1f520"},{"name":"capricorn","image":"2651.png","id":"2651"},{"name":"car","image":"1f697.png","id":"1f697"},{"name":"card_file_box","image":"1f5c3.png","id":"1f5c3"},{"name":"card_index","image":"1f4c7.png","id":"1f4c7"},{"name":"card_index_dividers","image":"1f5c2.png","id":"1f5c2"},{"name":"carousel_horse","image":"1f3a0.png","id":"1f3a0"},{"name":"cat","image":"1f431.png","id":"1f431"},{"name":"cat2","image":"1f408.png","id":"1f408"},{"name":"cd","image":"1f4bf.png","id":"1f4bf"},{"name":"chains","image":"26d3.png","id":"26d3"},{"name":"champagne","image":"1f37e.png","id":"1f37e"},{"name":"chart","image":"1f4b9.png","id":"1f4b9"},{"name":"chart_with_downwards_trend","image":"1f4c9.png","id":"1f4c9"},{"name":"chart_with_upwards_trend","image":"1f4c8.png","id":"1f4c8"},{"name":"checkered_flag","image":"1f3c1.png","id":"1f3c1"},{"name":"cheese_wedge","image":"1f9c0.png","id":"1f9c0"},{"name":"cherries","image":"1f352.png","id":"1f352"},{"name":"cherry_blossom","image":"1f338.png","id":"1f338"},{"name":"chestnut","image":"1f330.png","id":"1f330"},{"name":"chicken","image":"1f414.png","id":"1f414"},{"name":"children_crossing","image":"1f6b8.png","id":"1f6b8"},{"name":"chipmunk","image":"1f43f.png","id":"1f43f"},{"name":"chocolate_bar","image":"1f36b.png","id":"1f36b"},{"name":"christmas_tree","image":"1f384.png","id":"1f384"},{"name":"church","image":"26ea.png","id":"26ea"},{"name":"cinema","image":"1f3a6.png","id":"1f3a6"},{"name":"circus_tent","image":"1f3aa.png","id":"1f3aa"},{"name":"city_sunrise","image":"1f307.png","id":"1f307"},{"name":"city_sunset","image":"1f306.png","id":"1f306"},{"name":"cityscape","image":"1f3d9.png","id":"1f3d9"},{"name":"cl","image":"1f191.png","id":"1f191"},{"name":"clap","image":"1f44f.png","id":"1f44f"},{"name":"clapper","image":"1f3ac.png","id":"1f3ac"},{"name":"classical_building","image":"1f3db.png","id":"1f3db"},{"name":"clipboard","image":"1f4cb.png","id":"1f4cb"},{"name":"clock1","image":"1f550.png","id":"1f550"},{"name":"clock10","image":"1f559.png","id":"1f559"},{"name":"clock1030","image":"1f565.png","id":"1f565"},{"name":"clock11","image":"1f55a.png","id":"1f55a"},{"name":"clock1130","image":"1f566.png","id":"1f566"},{"name":"clock12","image":"1f55b.png","id":"1f55b"},{"name":"clock1230","image":"1f567.png","id":"1f567"},{"name":"clock130","image":"1f55c.png","id":"1f55c"},{"name":"clock2","image":"1f551.png","id":"1f551"},{"name":"clock230","image":"1f55d.png","id":"1f55d"},{"name":"clock3","image":"1f552.png","id":"1f552"},{"name":"clock330","image":"1f55e.png","id":"1f55e"},{"name":"clock4","image":"1f553.png","id":"1f553"},{"name":"clock430","image":"1f55f.png","id":"1f55f"},{"name":"clock5","image":"1f554.png","id":"1f554"},{"name":"clock530","image":"1f560.png","id":"1f560"},{"name":"clock6","image":"1f555.png","id":"1f555"},{"name":"clock630","image":"1f561.png","id":"1f561"},{"name":"clock7","image":"1f556.png","id":"1f556"},{"name":"clock730","image":"1f562.png","id":"1f562"},{"name":"clock8","image":"1f557.png","id":"1f557"},{"name":"clock830","image":"1f563.png","id":"1f563"},{"name":"clock9","image":"1f558.png","id":"1f558"},{"name":"clock930","image":"1f564.png","id":"1f564"},{"name":"closed_book","image":"1f4d5.png","id":"1f4d5"},{"name":"closed_lock_with_key","image":"1f510.png","id":"1f510"},{"name":"closed_umbrella","image":"1f302.png","id":"1f302"},{"name":"cloud","image":"2601.png","id":"2601"},{"name":"clubs","image":"2663.png","id":"2663"},{"name":"cocktail","image":"1f378.png","id":"1f378"},{"name":"coffee","image":"2615.png","id":"2615"},{"name":"coffin","image":"26b0.png","id":"26b0"},{"name":"cold_sweat","image":"1f630.png","id":"1f630"},{"name":"comet","image":"2604.png","id":"2604"},{"name":"compression","image":"1f5dc.png","id":"1f5dc"},{"name":"computer","image":"1f4bb.png","id":"1f4bb"},{"name":"confetti_ball","image":"1f38a.png","id":"1f38a"},{"name":"confounded","image":"1f616.png","id":"1f616"},{"name":"confused","image":"1f615.png","id":"1f615"},{"name":"congratulations","image":"3297.png","id":"3297"},{"name":"construction","image":"1f6a7.png","id":"1f6a7"},{"name":"construction_worker","image":"1f477.png","id":"1f477"},{"name":"control_knobs","image":"1f39b.png","id":"1f39b"},{"name":"convenience_store","image":"1f3ea.png","id":"1f3ea"},{"name":"cookie","image":"1f36a.png","id":"1f36a"},{"name":"cool","image":"1f192.png","id":"1f192"},{"name":"cop","image":"1f46e.png","id":"1f46e"},{"name":"corn","image":"1f33d.png","id":"1f33d"},{"name":"couch_and_lamp","image":"1f6cb.png","id":"1f6cb"},{"name":"couple","image":"1f46b.png","id":"1f46b"},{"name":"couple_with_heart","image":"1f491.png","id":"1f491"},{"name":"couplekiss","image":"1f48f.png","id":"1f48f"},{"name":"cow","image":"1f42e.png","id":"1f42e"},{"name":"cow2","image":"1f404.png","id":"1f404"},{"name":"crab","image":"1f980.png","id":"1f980"},{"name":"credit_card","image":"1f4b3.png","id":"1f4b3"},{"name":"crescent_moon","image":"1f319.png","id":"1f319"},{"name":"cricket_bat_and_ball","image":"1f3cf.png","id":"1f3cf"},{"name":"crocodile","image":"1f40a.png","id":"1f40a"},{"name":"crossed_flags","image":"1f38c.png","id":"1f38c"},{"name":"crossed_swords","image":"2694.png","id":"2694"},{"name":"crown","image":"1f451.png","id":"1f451"},{"name":"cry","image":"1f622.png","id":"1f622"},{"name":"crying_cat_face","image":"1f63f.png","id":"1f63f"},{"name":"crystal_ball","image":"1f52e.png","id":"1f52e"},{"name":"cupid","image":"1f498.png","id":"1f498"},{"name":"curly_loop","image":"27b0.png","id":"27b0"},{"name":"currency_exchange","image":"1f4b1.png","id":"1f4b1"},{"name":"curry","image":"1f35b.png","id":"1f35b"},{"name":"custard","image":"1f36e.png","id":"1f36e"},{"name":"customs","image":"1f6c3.png","id":"1f6c3"},{"name":"cyclone","image":"1f300.png","id":"1f300"},{"name":"dagger_knife","image":"1f5e1.png","id":"1f5e1"},{"name":"dancer","image":"1f483.png","id":"1f483"},{"name":"dancers","image":"1f46f.png","id":"1f46f"},{"name":"dango","image":"1f361.png","id":"1f361"},{"name":"dark_sunglasses","image":"1f576.png","id":"1f576"},{"name":"dart","image":"1f3af.png","id":"1f3af"},{"name":"dash","image":"1f4a8.png","id":"1f4a8"},{"name":"date","image":"1f4c5.png","id":"1f4c5"},{"name":"deciduous_tree","image":"1f333.png","id":"1f333"},{"name":"department_store","image":"1f3ec.png","id":"1f3ec"},{"name":"derelict_house_building","image":"1f3da.png","id":"1f3da"},{"name":"desert","image":"1f3dc.png","id":"1f3dc"},{"name":"desert_island","image":"1f3dd.png","id":"1f3dd"},{"name":"desktop_computer","image":"1f5a5.png","id":"1f5a5"},{"name":"diamond_shape_with_a_dot_inside","image":"1f4a0.png","id":"1f4a0"},{"name":"diamonds","image":"2666.png","id":"2666"},{"name":"disappointed","image":"1f61e.png","id":"1f61e"},{"name":"disappointed_relieved","image":"1f625.png","id":"1f625"},{"name":"dizzy","image":"1f4ab.png","id":"1f4ab"},{"name":"dizzy_face","image":"1f635.png","id":"1f635"},{"name":"do_not_litter","image":"1f6af.png","id":"1f6af"},{"name":"dog","image":"1f436.png","id":"1f436"},{"name":"dog2","image":"1f415.png","id":"1f415"},{"name":"dollar","image":"1f4b5.png","id":"1f4b5"},{"name":"dolls","image":"1f38e.png","id":"1f38e"},{"name":"dolphin","image":"1f42c.png","id":"1f42c"},{"name":"door","image":"1f6aa.png","id":"1f6aa"},{"name":"double_vertical_bar","image":"23f8.png","id":"23f8"},{"name":"doughnut","image":"1f369.png","id":"1f369"},{"name":"dove_of_peace","image":"1f54a.png","id":"1f54a"},{"name":"dragon","image":"1f409.png","id":"1f409"},{"name":"dragon_face","image":"1f432.png","id":"1f432"},{"name":"dress","image":"1f457.png","id":"1f457"},{"name":"dromedary_camel","image":"1f42a.png","id":"1f42a"},{"name":"droplet","image":"1f4a7.png","id":"1f4a7"},{"name":"dvd","image":"1f4c0.png","id":"1f4c0"},{"name":"e-mail","image":"1f4e7.png","id":"1f4e7"},{"name":"ear","image":"1f442.png","id":"1f442"},{"name":"ear_of_rice","image":"1f33e.png","id":"1f33e"},{"name":"earth_africa","image":"1f30d.png","id":"1f30d"},{"name":"earth_americas","image":"1f30e.png","id":"1f30e"},{"name":"earth_asia","image":"1f30f.png","id":"1f30f"},{"name":"egg","image":"1f373.png","id":"1f373"},{"name":"eggplant","image":"1f346.png","id":"1f346"},{"name":"eight","image":"0038-20e3.png","id":"0038-20e3"},{"name":"eight_pointed_black_star","image":"2734.png","id":"2734"},{"name":"eight_spoked_asterisk","image":"2733.png","id":"2733"},{"name":"electric_plug","image":"1f50c.png","id":"1f50c"},{"name":"elephant","image":"1f418.png","id":"1f418"},{"name":"email","image":"2709.png","id":"2709"},{"name":"end","image":"1f51a.png","id":"1f51a"},{"name":"envelope_with_arrow","image":"1f4e9.png","id":"1f4e9"},{"name":"euro","image":"1f4b6.png","id":"1f4b6"},{"name":"european_castle","image":"1f3f0.png","id":"1f3f0"},{"name":"european_post_office","image":"1f3e4.png","id":"1f3e4"},{"name":"evergreen_tree","image":"1f332.png","id":"1f332"},{"name":"exclamation","image":"2757.png","id":"2757"},{"name":"expressionless","image":"1f611.png","id":"1f611"},{"name":"eye","image":"1f441.png","id":"1f441"},{"name":"eyeglasses","image":"1f453.png","id":"1f453"},{"name":"eyes","image":"1f440.png","id":"1f440"},{"name":"face_with_head_bandage","image":"1f915.png","id":"1f915"},{"name":"face_with_rolling_eyes","image":"1f644.png","id":"1f644"},{"name":"face_with_thermometer","image":"1f912.png","id":"1f912"},{"name":"facepunch","image":"1f44a.png","id":"1f44a"},{"name":"factory","image":"1f3ed.png","id":"1f3ed"},{"name":"fallen_leaf","image":"1f342.png","id":"1f342"},{"name":"family","image":"1f46a.png","id":"1f46a"},{"name":"fast_forward","image":"23e9.png","id":"23e9"},{"name":"fax","image":"1f4e0.png","id":"1f4e0"},{"name":"fearful","image":"1f628.png","id":"1f628"},{"name":"feet","image":"1f43e.png","id":"1f43e"},{"name":"ferris_wheel","image":"1f3a1.png","id":"1f3a1"},{"name":"ferry","image":"26f4.png","id":"26f4"},{"name":"field_hockey_stick_and_ball","image":"1f3d1.png","id":"1f3d1"},{"name":"file_cabinet","image":"1f5c4.png","id":"1f5c4"},{"name":"file_folder","image":"1f4c1.png","id":"1f4c1"},{"name":"film_frames","image":"1f39e.png","id":"1f39e"},{"name":"film_projector","image":"1f4fd.png","id":"1f4fd"},{"name":"fire","image":"1f525.png","id":"1f525"},{"name":"fire_engine","image":"1f692.png","id":"1f692"},{"name":"fireworks","image":"1f386.png","id":"1f386"},{"name":"first_quarter_moon","image":"1f313.png","id":"1f313"},{"name":"first_quarter_moon_with_face","image":"1f31b.png","id":"1f31b"},{"name":"fish","image":"1f41f.png","id":"1f41f"},{"name":"fish_cake","image":"1f365.png","id":"1f365"},{"name":"fishing_pole_and_fish","image":"1f3a3.png","id":"1f3a3"},{"name":"fist","image":"270a.png","id":"270a"},{"name":"five","image":"0035-20e3.png","id":"0035-20e3"},{"name":"flag-ac","image":"1f1e6-1f1e8.png","id":"1f1e6-1f1e8"},{"name":"flag-ad","image":"1f1e6-1f1e9.png","id":"1f1e6-1f1e9"},{"name":"flag-ae","image":"1f1e6-1f1ea.png","id":"1f1e6-1f1ea"},{"name":"flag-af","image":"1f1e6-1f1eb.png","id":"1f1e6-1f1eb"},{"name":"flag-ag","image":"1f1e6-1f1ec.png","id":"1f1e6-1f1ec"},{"name":"flag-ai","image":"1f1e6-1f1ee.png","id":"1f1e6-1f1ee"},{"name":"flag-al","image":"1f1e6-1f1f1.png","id":"1f1e6-1f1f1"},{"name":"flag-am","image":"1f1e6-1f1f2.png","id":"1f1e6-1f1f2"},{"name":"flag-ao","image":"1f1e6-1f1f4.png","id":"1f1e6-1f1f4"},{"name":"flag-aq","image":"1f1e6-1f1f6.png","id":"1f1e6-1f1f6"},{"name":"flag-ar","image":"1f1e6-1f1f7.png","id":"1f1e6-1f1f7"},{"name":"flag-as","image":"1f1e6-1f1f8.png","id":"1f1e6-1f1f8"},{"name":"flag-at","image":"1f1e6-1f1f9.png","id":"1f1e6-1f1f9"},{"name":"flag-au","image":"1f1e6-1f1fa.png","id":"1f1e6-1f1fa"},{"name":"flag-aw","image":"1f1e6-1f1fc.png","id":"1f1e6-1f1fc"},{"name":"flag-ax","image":"1f1e6-1f1fd.png","id":"1f1e6-1f1fd"},{"name":"flag-az","image":"1f1e6-1f1ff.png","id":"1f1e6-1f1ff"},{"name":"flag-ba","image":"1f1e7-1f1e6.png","id":"1f1e7-1f1e6"},{"name":"flag-bb","image":"1f1e7-1f1e7.png","id":"1f1e7-1f1e7"},{"name":"flag-bd","image":"1f1e7-1f1e9.png","id":"1f1e7-1f1e9"},{"name":"flag-be","image":"1f1e7-1f1ea.png","id":"1f1e7-1f1ea"},{"name":"flag-bf","image":"1f1e7-1f1eb.png","id":"1f1e7-1f1eb"},{"name":"flag-bg","image":"1f1e7-1f1ec.png","id":"1f1e7-1f1ec"},{"name":"flag-bh","image":"1f1e7-1f1ed.png","id":"1f1e7-1f1ed"},{"name":"flag-bi","image":"1f1e7-1f1ee.png","id":"1f1e7-1f1ee"},{"name":"flag-bj","image":"1f1e7-1f1ef.png","id":"1f1e7-1f1ef"},{"name":"flag-bl","image":"1f1e7-1f1f1.png","id":"1f1e7-1f1f1"},{"name":"flag-bm","image":"1f1e7-1f1f2.png","id":"1f1e7-1f1f2"},{"name":"flag-bn","image":"1f1e7-1f1f3.png","id":"1f1e7-1f1f3"},{"name":"flag-bo","image":"1f1e7-1f1f4.png","id":"1f1e7-1f1f4"},{"name":"flag-bq","image":"1f1e7-1f1f6.png","id":"1f1e7-1f1f6"},{"name":"flag-br","image":"1f1e7-1f1f7.png","id":"1f1e7-1f1f7"},{"name":"flag-bs","image":"1f1e7-1f1f8.png","id":"1f1e7-1f1f8"},{"name":"flag-bt","image":"1f1e7-1f1f9.png","id":"1f1e7-1f1f9"},{"name":"flag-bv","image":"1f1e7-1f1fb.png","id":"1f1e7-1f1fb"},{"name":"flag-bw","image":"1f1e7-1f1fc.png","id":"1f1e7-1f1fc"},{"name":"flag-by","image":"1f1e7-1f1fe.png","id":"1f1e7-1f1fe"},{"name":"flag-bz","image":"1f1e7-1f1ff.png","id":"1f1e7-1f1ff"},{"name":"flag-ca","image":"1f1e8-1f1e6.png","id":"1f1e8-1f1e6"},{"name":"flag-cc","image":"1f1e8-1f1e8.png","id":"1f1e8-1f1e8"},{"name":"flag-cd","image":"1f1e8-1f1e9.png","id":"1f1e8-1f1e9"},{"name":"flag-cf","image":"1f1e8-1f1eb.png","id":"1f1e8-1f1eb"},{"name":"flag-cg","image":"1f1e8-1f1ec.png","id":"1f1e8-1f1ec"},{"name":"flag-ch","image":"1f1e8-1f1ed.png","id":"1f1e8-1f1ed"},{"name":"flag-ci","image":"1f1e8-1f1ee.png","id":"1f1e8-1f1ee"},{"name":"flag-ck","image":"1f1e8-1f1f0.png","id":"1f1e8-1f1f0"},{"name":"flag-cl","image":"1f1e8-1f1f1.png","id":"1f1e8-1f1f1"},{"name":"flag-cm","image":"1f1e8-1f1f2.png","id":"1f1e8-1f1f2"},{"name":"flag-cn","image":"1f1e8-1f1f3.png","id":"1f1e8-1f1f3"},{"name":"flag-co","image":"1f1e8-1f1f4.png","id":"1f1e8-1f1f4"},{"name":"flag-cp","image":"1f1e8-1f1f5.png","id":"1f1e8-1f1f5"},{"name":"flag-cr","image":"1f1e8-1f1f7.png","id":"1f1e8-1f1f7"},{"name":"flag-cu","image":"1f1e8-1f1fa.png","id":"1f1e8-1f1fa"},{"name":"flag-cv","image":"1f1e8-1f1fb.png","id":"1f1e8-1f1fb"},{"name":"flag-cw","image":"1f1e8-1f1fc.png","id":"1f1e8-1f1fc"},{"name":"flag-cx","image":"1f1e8-1f1fd.png","id":"1f1e8-1f1fd"},{"name":"flag-cy","image":"1f1e8-1f1fe.png","id":"1f1e8-1f1fe"},{"name":"flag-cz","image":"1f1e8-1f1ff.png","id":"1f1e8-1f1ff"},{"name":"flag-de","image":"1f1e9-1f1ea.png","id":"1f1e9-1f1ea"},{"name":"flag-dg","image":"1f1e9-1f1ec.png","id":"1f1e9-1f1ec"},{"name":"flag-dj","image":"1f1e9-1f1ef.png","id":"1f1e9-1f1ef"},{"name":"flag-dk","image":"1f1e9-1f1f0.png","id":"1f1e9-1f1f0"},{"name":"flag-dm","image":"1f1e9-1f1f2.png","id":"1f1e9-1f1f2"},{"name":"flag-do","image":"1f1e9-1f1f4.png","id":"1f1e9-1f1f4"},{"name":"flag-dz","image":"1f1e9-1f1ff.png","id":"1f1e9-1f1ff"},{"name":"flag-ea","image":"1f1ea-1f1e6.png","id":"1f1ea-1f1e6"},{"name":"flag-ec","image":"1f1ea-1f1e8.png","id":"1f1ea-1f1e8"},{"name":"flag-ee","image":"1f1ea-1f1ea.png","id":"1f1ea-1f1ea"},{"name":"flag-eg","image":"1f1ea-1f1ec.png","id":"1f1ea-1f1ec"},{"name":"flag-eh","image":"1f1ea-1f1ed.png","id":"1f1ea-1f1ed"},{"name":"flag-er","image":"1f1ea-1f1f7.png","id":"1f1ea-1f1f7"},{"name":"flag-es","image":"1f1ea-1f1f8.png","id":"1f1ea-1f1f8"},{"name":"flag-et","image":"1f1ea-1f1f9.png","id":"1f1ea-1f1f9"},{"name":"flag-eu","image":"1f1ea-1f1fa.png","id":"1f1ea-1f1fa"},{"name":"flag-fi","image":"1f1eb-1f1ee.png","id":"1f1eb-1f1ee"},{"name":"flag-fj","image":"1f1eb-1f1ef.png","id":"1f1eb-1f1ef"},{"name":"flag-fk","image":"1f1eb-1f1f0.png","id":"1f1eb-1f1f0"},{"name":"flag-fm","image":"1f1eb-1f1f2.png","id":"1f1eb-1f1f2"},{"name":"flag-fo","image":"1f1eb-1f1f4.png","id":"1f1eb-1f1f4"},{"name":"flag-fr","image":"1f1eb-1f1f7.png","id":"1f1eb-1f1f7"},{"name":"flag-ga","image":"1f1ec-1f1e6.png","id":"1f1ec-1f1e6"},{"name":"flag-gb","image":"1f1ec-1f1e7.png","id":"1f1ec-1f1e7"},{"name":"flag-gd","image":"1f1ec-1f1e9.png","id":"1f1ec-1f1e9"},{"name":"flag-ge","image":"1f1ec-1f1ea.png","id":"1f1ec-1f1ea"},{"name":"flag-gf","image":"1f1ec-1f1eb.png","id":"1f1ec-1f1eb"},{"name":"flag-gg","image":"1f1ec-1f1ec.png","id":"1f1ec-1f1ec"},{"name":"flag-gh","image":"1f1ec-1f1ed.png","id":"1f1ec-1f1ed"},{"name":"flag-gi","image":"1f1ec-1f1ee.png","id":"1f1ec-1f1ee"},{"name":"flag-gl","image":"1f1ec-1f1f1.png","id":"1f1ec-1f1f1"},{"name":"flag-gm","image":"1f1ec-1f1f2.png","id":"1f1ec-1f1f2"},{"name":"flag-gn","image":"1f1ec-1f1f3.png","id":"1f1ec-1f1f3"},{"name":"flag-gp","image":"1f1ec-1f1f5.png","id":"1f1ec-1f1f5"},{"name":"flag-gq","image":"1f1ec-1f1f6.png","id":"1f1ec-1f1f6"},{"name":"flag-gr","image":"1f1ec-1f1f7.png","id":"1f1ec-1f1f7"},{"name":"flag-gs","image":"1f1ec-1f1f8.png","id":"1f1ec-1f1f8"},{"name":"flag-gt","image":"1f1ec-1f1f9.png","id":"1f1ec-1f1f9"},{"name":"flag-gu","image":"1f1ec-1f1fa.png","id":"1f1ec-1f1fa"},{"name":"flag-gw","image":"1f1ec-1f1fc.png","id":"1f1ec-1f1fc"},{"name":"flag-gy","image":"1f1ec-1f1fe.png","id":"1f1ec-1f1fe"},{"name":"flag-hk","image":"1f1ed-1f1f0.png","id":"1f1ed-1f1f0"},{"name":"flag-hm","image":"1f1ed-1f1f2.png","id":"1f1ed-1f1f2"},{"name":"flag-hn","image":"1f1ed-1f1f3.png","id":"1f1ed-1f1f3"},{"name":"flag-hr","image":"1f1ed-1f1f7.png","id":"1f1ed-1f1f7"},{"name":"flag-ht","image":"1f1ed-1f1f9.png","id":"1f1ed-1f1f9"},{"name":"flag-hu","image":"1f1ed-1f1fa.png","id":"1f1ed-1f1fa"},{"name":"flag-ic","image":"1f1ee-1f1e8.png","id":"1f1ee-1f1e8"},{"name":"flag-id","image":"1f1ee-1f1e9.png","id":"1f1ee-1f1e9"},{"name":"flag-ie","image":"1f1ee-1f1ea.png","id":"1f1ee-1f1ea"},{"name":"flag-il","image":"1f1ee-1f1f1.png","id":"1f1ee-1f1f1"},{"name":"flag-im","image":"1f1ee-1f1f2.png","id":"1f1ee-1f1f2"},{"name":"flag-in","image":"1f1ee-1f1f3.png","id":"1f1ee-1f1f3"},{"name":"flag-io","image":"1f1ee-1f1f4.png","id":"1f1ee-1f1f4"},{"name":"flag-iq","image":"1f1ee-1f1f6.png","id":"1f1ee-1f1f6"},{"name":"flag-ir","image":"1f1ee-1f1f7.png","id":"1f1ee-1f1f7"},{"name":"flag-is","image":"1f1ee-1f1f8.png","id":"1f1ee-1f1f8"},{"name":"flag-it","image":"1f1ee-1f1f9.png","id":"1f1ee-1f1f9"},{"name":"flag-je","image":"1f1ef-1f1ea.png","id":"1f1ef-1f1ea"},{"name":"flag-jm","image":"1f1ef-1f1f2.png","id":"1f1ef-1f1f2"},{"name":"flag-jo","image":"1f1ef-1f1f4.png","id":"1f1ef-1f1f4"},{"name":"flag-jp","image":"1f1ef-1f1f5.png","id":"1f1ef-1f1f5"},{"name":"flag-ke","image":"1f1f0-1f1ea.png","id":"1f1f0-1f1ea"},{"name":"flag-kg","image":"1f1f0-1f1ec.png","id":"1f1f0-1f1ec"},{"name":"flag-kh","image":"1f1f0-1f1ed.png","id":"1f1f0-1f1ed"},{"name":"flag-ki","image":"1f1f0-1f1ee.png","id":"1f1f0-1f1ee"},{"name":"flag-km","image":"1f1f0-1f1f2.png","id":"1f1f0-1f1f2"},{"name":"flag-kn","image":"1f1f0-1f1f3.png","id":"1f1f0-1f1f3"},{"name":"flag-kp","image":"1f1f0-1f1f5.png","id":"1f1f0-1f1f5"},{"name":"flag-kr","image":"1f1f0-1f1f7.png","id":"1f1f0-1f1f7"},{"name":"flag-kw","image":"1f1f0-1f1fc.png","id":"1f1f0-1f1fc"},{"name":"flag-ky","image":"1f1f0-1f1fe.png","id":"1f1f0-1f1fe"},{"name":"flag-kz","image":"1f1f0-1f1ff.png","id":"1f1f0-1f1ff"},{"name":"flag-la","image":"1f1f1-1f1e6.png","id":"1f1f1-1f1e6"},{"name":"flag-lb","image":"1f1f1-1f1e7.png","id":"1f1f1-1f1e7"},{"name":"flag-lc","image":"1f1f1-1f1e8.png","id":"1f1f1-1f1e8"},{"name":"flag-li","image":"1f1f1-1f1ee.png","id":"1f1f1-1f1ee"},{"name":"flag-lk","image":"1f1f1-1f1f0.png","id":"1f1f1-1f1f0"},{"name":"flag-lr","image":"1f1f1-1f1f7.png","id":"1f1f1-1f1f7"},{"name":"flag-ls","image":"1f1f1-1f1f8.png","id":"1f1f1-1f1f8"},{"name":"flag-lt","image":"1f1f1-1f1f9.png","id":"1f1f1-1f1f9"},{"name":"flag-lu","image":"1f1f1-1f1fa.png","id":"1f1f1-1f1fa"},{"name":"flag-lv","image":"1f1f1-1f1fb.png","id":"1f1f1-1f1fb"},{"name":"flag-ly","image":"1f1f1-1f1fe.png","id":"1f1f1-1f1fe"},{"name":"flag-ma","image":"1f1f2-1f1e6.png","id":"1f1f2-1f1e6"},{"name":"flag-mc","image":"1f1f2-1f1e8.png","id":"1f1f2-1f1e8"},{"name":"flag-md","image":"1f1f2-1f1e9.png","id":"1f1f2-1f1e9"},{"name":"flag-me","image":"1f1f2-1f1ea.png","id":"1f1f2-1f1ea"},{"name":"flag-mf","image":"1f1f2-1f1eb.png","id":"1f1f2-1f1eb"},{"name":"flag-mg","image":"1f1f2-1f1ec.png","id":"1f1f2-1f1ec"},{"name":"flag-mh","image":"1f1f2-1f1ed.png","id":"1f1f2-1f1ed"},{"name":"flag-mk","image":"1f1f2-1f1f0.png","id":"1f1f2-1f1f0"},{"name":"flag-ml","image":"1f1f2-1f1f1.png","id":"1f1f2-1f1f1"},{"name":"flag-mm","image":"1f1f2-1f1f2.png","id":"1f1f2-1f1f2"},{"name":"flag-mn","image":"1f1f2-1f1f3.png","id":"1f1f2-1f1f3"},{"name":"flag-mo","image":"1f1f2-1f1f4.png","id":"1f1f2-1f1f4"},{"name":"flag-mp","image":"1f1f2-1f1f5.png","id":"1f1f2-1f1f5"},{"name":"flag-mq","image":"1f1f2-1f1f6.png","id":"1f1f2-1f1f6"},{"name":"flag-mr","image":"1f1f2-1f1f7.png","id":"1f1f2-1f1f7"},{"name":"flag-ms","image":"1f1f2-1f1f8.png","id":"1f1f2-1f1f8"},{"name":"flag-mt","image":"1f1f2-1f1f9.png","id":"1f1f2-1f1f9"},{"name":"flag-mu","image":"1f1f2-1f1fa.png","id":"1f1f2-1f1fa"},{"name":"flag-mv","image":"1f1f2-1f1fb.png","id":"1f1f2-1f1fb"},{"name":"flag-mw","image":"1f1f2-1f1fc.png","id":"1f1f2-1f1fc"},{"name":"flag-mx","image":"1f1f2-1f1fd.png","id":"1f1f2-1f1fd"},{"name":"flag-my","image":"1f1f2-1f1fe.png","id":"1f1f2-1f1fe"},{"name":"flag-mz","image":"1f1f2-1f1ff.png","id":"1f1f2-1f1ff"},{"name":"flag-na","image":"1f1f3-1f1e6.png","id":"1f1f3-1f1e6"},{"name":"flag-nc","image":"1f1f3-1f1e8.png","id":"1f1f3-1f1e8"},{"name":"flag-ne","image":"1f1f3-1f1ea.png","id":"1f1f3-1f1ea"},{"name":"flag-nf","image":"1f1f3-1f1eb.png","id":"1f1f3-1f1eb"},{"name":"flag-ng","image":"1f1f3-1f1ec.png","id":"1f1f3-1f1ec"},{"name":"flag-ni","image":"1f1f3-1f1ee.png","id":"1f1f3-1f1ee"},{"name":"flag-nl","image":"1f1f3-1f1f1.png","id":"1f1f3-1f1f1"},{"name":"flag-no","image":"1f1f3-1f1f4.png","id":"1f1f3-1f1f4"},{"name":"flag-np","image":"1f1f3-1f1f5.png","id":"1f1f3-1f1f5"},{"name":"flag-nr","image":"1f1f3-1f1f7.png","id":"1f1f3-1f1f7"},{"name":"flag-nu","image":"1f1f3-1f1fa.png","id":"1f1f3-1f1fa"},{"name":"flag-nz","image":"1f1f3-1f1ff.png","id":"1f1f3-1f1ff"},{"name":"flag-om","image":"1f1f4-1f1f2.png","id":"1f1f4-1f1f2"},{"name":"flag-pa","image":"1f1f5-1f1e6.png","id":"1f1f5-1f1e6"},{"name":"flag-pe","image":"1f1f5-1f1ea.png","id":"1f1f5-1f1ea"},{"name":"flag-pf","image":"1f1f5-1f1eb.png","id":"1f1f5-1f1eb"},{"name":"flag-pg","image":"1f1f5-1f1ec.png","id":"1f1f5-1f1ec"},{"name":"flag-ph","image":"1f1f5-1f1ed.png","id":"1f1f5-1f1ed"},{"name":"flag-pk","image":"1f1f5-1f1f0.png","id":"1f1f5-1f1f0"},{"name":"flag-pl","image":"1f1f5-1f1f1.png","id":"1f1f5-1f1f1"},{"name":"flag-pm","image":"1f1f5-1f1f2.png","id":"1f1f5-1f1f2"},{"name":"flag-pn","image":"1f1f5-1f1f3.png","id":"1f1f5-1f1f3"},{"name":"flag-pr","image":"1f1f5-1f1f7.png","id":"1f1f5-1f1f7"},{"name":"flag-ps","image":"1f1f5-1f1f8.png","id":"1f1f5-1f1f8"},{"name":"flag-pt","image":"1f1f5-1f1f9.png","id":"1f1f5-1f1f9"},{"name":"flag-pw","image":"1f1f5-1f1fc.png","id":"1f1f5-1f1fc"},{"name":"flag-py","image":"1f1f5-1f1fe.png","id":"1f1f5-1f1fe"},{"name":"flag-qa","image":"1f1f6-1f1e6.png","id":"1f1f6-1f1e6"},{"name":"flag-re","image":"1f1f7-1f1ea.png","id":"1f1f7-1f1ea"},{"name":"flag-ro","image":"1f1f7-1f1f4.png","id":"1f1f7-1f1f4"},{"name":"flag-rs","image":"1f1f7-1f1f8.png","id":"1f1f7-1f1f8"},{"name":"flag-ru","image":"1f1f7-1f1fa.png","id":"1f1f7-1f1fa"},{"name":"flag-rw","image":"1f1f7-1f1fc.png","id":"1f1f7-1f1fc"},{"name":"flag-sa","image":"1f1f8-1f1e6.png","id":"1f1f8-1f1e6"},{"name":"flag-sb","image":"1f1f8-1f1e7.png","id":"1f1f8-1f1e7"},{"name":"flag-sc","image":"1f1f8-1f1e8.png","id":"1f1f8-1f1e8"},{"name":"flag-sd","image":"1f1f8-1f1e9.png","id":"1f1f8-1f1e9"},{"name":"flag-se","image":"1f1f8-1f1ea.png","id":"1f1f8-1f1ea"},{"name":"flag-sg","image":"1f1f8-1f1ec.png","id":"1f1f8-1f1ec"},{"name":"flag-sh","image":"1f1f8-1f1ed.png","id":"1f1f8-1f1ed"},{"name":"flag-si","image":"1f1f8-1f1ee.png","id":"1f1f8-1f1ee"},{"name":"flag-sj","image":"1f1f8-1f1ef.png","id":"1f1f8-1f1ef"},{"name":"flag-sk","image":"1f1f8-1f1f0.png","id":"1f1f8-1f1f0"},{"name":"flag-sl","image":"1f1f8-1f1f1.png","id":"1f1f8-1f1f1"},{"name":"flag-sm","image":"1f1f8-1f1f2.png","id":"1f1f8-1f1f2"},{"name":"flag-sn","image":"1f1f8-1f1f3.png","id":"1f1f8-1f1f3"},{"name":"flag-so","image":"1f1f8-1f1f4.png","id":"1f1f8-1f1f4"},{"name":"flag-sr","image":"1f1f8-1f1f7.png","id":"1f1f8-1f1f7"},{"name":"flag-ss","image":"1f1f8-1f1f8.png","id":"1f1f8-1f1f8"},{"name":"flag-st","image":"1f1f8-1f1f9.png","id":"1f1f8-1f1f9"},{"name":"flag-sv","image":"1f1f8-1f1fb.png","id":"1f1f8-1f1fb"},{"name":"flag-sx","image":"1f1f8-1f1fd.png","id":"1f1f8-1f1fd"},{"name":"flag-sy","image":"1f1f8-1f1fe.png","id":"1f1f8-1f1fe"},{"name":"flag-sz","image":"1f1f8-1f1ff.png","id":"1f1f8-1f1ff"},{"name":"flag-ta","image":"1f1f9-1f1e6.png","id":"1f1f9-1f1e6"},{"name":"flag-tc","image":"1f1f9-1f1e8.png","id":"1f1f9-1f1e8"},{"name":"flag-td","image":"1f1f9-1f1e9.png","id":"1f1f9-1f1e9"},{"name":"flag-tf","image":"1f1f9-1f1eb.png","id":"1f1f9-1f1eb"},{"name":"flag-tg","image":"1f1f9-1f1ec.png","id":"1f1f9-1f1ec"},{"name":"flag-th","image":"1f1f9-1f1ed.png","id":"1f1f9-1f1ed"},{"name":"flag-tj","image":"1f1f9-1f1ef.png","id":"1f1f9-1f1ef"},{"name":"flag-tk","image":"1f1f9-1f1f0.png","id":"1f1f9-1f1f0"},{"name":"flag-tl","image":"1f1f9-1f1f1.png","id":"1f1f9-1f1f1"},{"name":"flag-tm","image":"1f1f9-1f1f2.png","id":"1f1f9-1f1f2"},{"name":"flag-tn","image":"1f1f9-1f1f3.png","id":"1f1f9-1f1f3"},{"name":"flag-to","image":"1f1f9-1f1f4.png","id":"1f1f9-1f1f4"},{"name":"flag-tr","image":"1f1f9-1f1f7.png","id":"1f1f9-1f1f7"},{"name":"flag-tt","image":"1f1f9-1f1f9.png","id":"1f1f9-1f1f9"},{"name":"flag-tv","image":"1f1f9-1f1fb.png","id":"1f1f9-1f1fb"},{"name":"flag-tw","image":"1f1f9-1f1fc.png","id":"1f1f9-1f1fc"},{"name":"flag-tz","image":"1f1f9-1f1ff.png","id":"1f1f9-1f1ff"},{"name":"flag-ua","image":"1f1fa-1f1e6.png","id":"1f1fa-1f1e6"},{"name":"flag-ug","image":"1f1fa-1f1ec.png","id":"1f1fa-1f1ec"},{"name":"flag-um","image":"1f1fa-1f1f2.png","id":"1f1fa-1f1f2"},{"name":"flag-us","image":"1f1fa-1f1f8.png","id":"1f1fa-1f1f8"},{"name":"flag-uy","image":"1f1fa-1f1fe.png","id":"1f1fa-1f1fe"},{"name":"flag-uz","image":"1f1fa-1f1ff.png","id":"1f1fa-1f1ff"},{"name":"flag-va","image":"1f1fb-1f1e6.png","id":"1f1fb-1f1e6"},{"name":"flag-vc","image":"1f1fb-1f1e8.png","id":"1f1fb-1f1e8"},{"name":"flag-ve","image":"1f1fb-1f1ea.png","id":"1f1fb-1f1ea"},{"name":"flag-vg","image":"1f1fb-1f1ec.png","id":"1f1fb-1f1ec"},{"name":"flag-vi","image":"1f1fb-1f1ee.png","id":"1f1fb-1f1ee"},{"name":"flag-vn","image":"1f1fb-1f1f3.png","id":"1f1fb-1f1f3"},{"name":"flag-vu","image":"1f1fb-1f1fa.png","id":"1f1fb-1f1fa"},{"name":"flag-wf","image":"1f1fc-1f1eb.png","id":"1f1fc-1f1eb"},{"name":"flag-ws","image":"1f1fc-1f1f8.png","id":"1f1fc-1f1f8"},{"name":"flag-xk","image":"1f1fd-1f1f0.png","id":"1f1fd-1f1f0"},{"name":"flag-ye","image":"1f1fe-1f1ea.png","id":"1f1fe-1f1ea"},{"name":"flag-yt","image":"1f1fe-1f1f9.png","id":"1f1fe-1f1f9"},{"name":"flag-za","image":"1f1ff-1f1e6.png","id":"1f1ff-1f1e6"},{"name":"flag-zm","image":"1f1ff-1f1f2.png","id":"1f1ff-1f1f2"},{"name":"flag-zw","image":"1f1ff-1f1fc.png","id":"1f1ff-1f1fc"},{"name":"flags","image":"1f38f.png","id":"1f38f"},{"name":"flashlight","image":"1f526.png","id":"1f526"},{"name":"fleur_de_lis","image":"269c.png","id":"269c"},{"name":"floppy_disk","image":"1f4be.png","id":"1f4be"},{"name":"flower_playing_cards","image":"1f3b4.png","id":"1f3b4"},{"name":"flushed","image":"1f633.png","id":"1f633"},{"name":"fog","image":"1f32b.png","id":"1f32b"},{"name":"foggy","image":"1f301.png","id":"1f301"},{"name":"football","image":"1f3c8.png","id":"1f3c8"},{"name":"footprints","image":"1f463.png","id":"1f463"},{"name":"fork_and_knife","image":"1f374.png","id":"1f374"},{"name":"fountain","image":"26f2.png","id":"26f2"},{"name":"four","image":"0034-20e3.png","id":"0034-20e3"},{"name":"four_leaf_clover","image":"1f340.png","id":"1f340"},{"name":"frame_with_picture","image":"1f5bc.png","id":"1f5bc"},{"name":"free","image":"1f193.png","id":"1f193"},{"name":"fried_shrimp","image":"1f364.png","id":"1f364"},{"name":"fries","image":"1f35f.png","id":"1f35f"},{"name":"frog","image":"1f438.png","id":"1f438"},{"name":"frowning","image":"1f626.png","id":"1f626"},{"name":"fuelpump","image":"26fd.png","id":"26fd"},{"name":"full_moon","image":"1f315.png","id":"1f315"},{"name":"full_moon_with_face","image":"1f31d.png","id":"1f31d"},{"name":"funeral_urn","image":"26b1.png","id":"26b1"},{"name":"game_die","image":"1f3b2.png","id":"1f3b2"},{"name":"gear","image":"2699.png","id":"2699"},{"name":"gem","image":"1f48e.png","id":"1f48e"},{"name":"gemini","image":"264a.png","id":"264a"},{"name":"ghost","image":"1f47b.png","id":"1f47b"},{"name":"gift","image":"1f381.png","id":"1f381"},{"name":"gift_heart","image":"1f49d.png","id":"1f49d"},{"name":"girl","image":"1f467.png","id":"1f467"},{"name":"globe_with_meridians","image":"1f310.png","id":"1f310"},{"name":"goat","image":"1f410.png","id":"1f410"},{"name":"golf","image":"26f3.png","id":"26f3"},{"name":"golfer","image":"1f3cc.png","id":"1f3cc"},{"name":"grapes","image":"1f347.png","id":"1f347"},{"name":"green_apple","image":"1f34f.png","id":"1f34f"},{"name":"green_book","image":"1f4d7.png","id":"1f4d7"},{"name":"green_heart","image":"1f49a.png","id":"1f49a"},{"name":"grey_exclamation","image":"2755.png","id":"2755"},{"name":"grey_question","image":"2754.png","id":"2754"},{"name":"grimacing","image":"1f62c.png","id":"1f62c"},{"name":"grin","image":"1f601.png","id":"1f601"},{"name":"grinning","image":"1f600.png","id":"1f600"},{"name":"guardsman","image":"1f482.png","id":"1f482"},{"name":"guitar","image":"1f3b8.png","id":"1f3b8"},{"name":"gun","image":"1f52b.png","id":"1f52b"},{"name":"haircut","image":"1f487.png","id":"1f487"},{"name":"hamburger","image":"1f354.png","id":"1f354"},{"name":"hammer","image":"1f528.png","id":"1f528"},{"name":"hammer_and_pick","image":"2692.png","id":"2692"},{"name":"hammer_and_wrench","image":"1f6e0.png","id":"1f6e0"},{"name":"hamster","image":"1f439.png","id":"1f439"},{"name":"hand","image":"270b.png","id":"270b"},{"name":"handbag","image":"1f45c.png","id":"1f45c"},{"name":"hankey","image":"1f4a9.png","id":"1f4a9"},{"name":"hash","image":"0023-20e3.png","id":"0023-20e3"},{"name":"hatched_chick","image":"1f425.png","id":"1f425"},{"name":"hatching_chick","image":"1f423.png","id":"1f423"},{"name":"headphones","image":"1f3a7.png","id":"1f3a7"},{"name":"hear_no_evil","image":"1f649.png","id":"1f649"},{"name":"heart","image":"2764.png","id":"2764"},{"name":"heart_decoration","image":"1f49f.png","id":"1f49f"},{"name":"heart_eyes","image":"1f60d.png","id":"1f60d"},{"name":"heart_eyes_cat","image":"1f63b.png","id":"1f63b"},{"name":"heartbeat","image":"1f493.png","id":"1f493"},{"name":"heartpulse","image":"1f497.png","id":"1f497"},{"name":"hearts","image":"2665.png","id":"2665"},{"name":"heavy_check_mark","image":"2714.png","id":"2714"},{"name":"heavy_division_sign","image":"2797.png","id":"2797"},{"name":"heavy_dollar_sign","image":"1f4b2.png","id":"1f4b2"},{"name":"heavy_heart_exclamation_mark_ornament","image":"2763.png","id":"2763"},{"name":"heavy_minus_sign","image":"2796.png","id":"2796"},{"name":"heavy_multiplication_x","image":"2716.png","id":"2716"},{"name":"heavy_plus_sign","image":"2795.png","id":"2795"},{"name":"helicopter","image":"1f681.png","id":"1f681"},{"name":"helmet_with_white_cross","image":"26d1.png","id":"26d1"},{"name":"herb","image":"1f33f.png","id":"1f33f"},{"name":"hibiscus","image":"1f33a.png","id":"1f33a"},{"name":"high_brightness","image":"1f506.png","id":"1f506"},{"name":"high_heel","image":"1f460.png","id":"1f460"},{"name":"hocho","image":"1f52a.png","id":"1f52a"},{"name":"hole","image":"1f573.png","id":"1f573"},{"name":"honey_pot","image":"1f36f.png","id":"1f36f"},{"name":"horse","image":"1f434.png","id":"1f434"},{"name":"horse_racing","image":"1f3c7.png","id":"1f3c7"},{"name":"hospital","image":"1f3e5.png","id":"1f3e5"},{"name":"hot_pepper","image":"1f336.png","id":"1f336"},{"name":"hotdog","image":"1f32d.png","id":"1f32d"},{"name":"hotel","image":"1f3e8.png","id":"1f3e8"},{"name":"hotsprings","image":"2668.png","id":"2668"},{"name":"hourglass","image":"231b.png","id":"231b"},{"name":"hourglass_flowing_sand","image":"23f3.png","id":"23f3"},{"name":"house","image":"1f3e0.png","id":"1f3e0"},{"name":"house_buildings","image":"1f3d8.png","id":"1f3d8"},{"name":"house_with_garden","image":"1f3e1.png","id":"1f3e1"},{"name":"hugging_face","image":"1f917.png","id":"1f917"},{"name":"hushed","image":"1f62f.png","id":"1f62f"},{"name":"ice_cream","image":"1f368.png","id":"1f368"},{"name":"ice_hockey_stick_and_puck","image":"1f3d2.png","id":"1f3d2"},{"name":"ice_skate","image":"26f8.png","id":"26f8"},{"name":"icecream","image":"1f366.png","id":"1f366"},{"name":"id","image":"1f194.png","id":"1f194"},{"name":"ideograph_advantage","image":"1f250.png","id":"1f250"},{"name":"imp","image":"1f47f.png","id":"1f47f"},{"name":"inbox_tray","image":"1f4e5.png","id":"1f4e5"},{"name":"incoming_envelope","image":"1f4e8.png","id":"1f4e8"},{"name":"information_desk_person","image":"1f481.png","id":"1f481"},{"name":"information_source","image":"2139.png","id":"2139"},{"name":"innocent","image":"1f607.png","id":"1f607"},{"name":"interrobang","image":"2049.png","id":"2049"},{"name":"iphone","image":"1f4f1.png","id":"1f4f1"},{"name":"izakaya_lantern","image":"1f3ee.png","id":"1f3ee"},{"name":"jack_o_lantern","image":"1f383.png","id":"1f383"},{"name":"japan","image":"1f5fe.png","id":"1f5fe"},{"name":"japanese_castle","image":"1f3ef.png","id":"1f3ef"},{"name":"japanese_goblin","image":"1f47a.png","id":"1f47a"},{"name":"japanese_ogre","image":"1f479.png","id":"1f479"},{"name":"jeans","image":"1f456.png","id":"1f456"},{"name":"joy","image":"1f602.png","id":"1f602"},{"name":"joy_cat","image":"1f639.png","id":"1f639"},{"name":"joystick","image":"1f579.png","id":"1f579"},{"name":"kaaba","image":"1f54b.png","id":"1f54b"},{"name":"key","image":"1f511.png","id":"1f511"},{"name":"keyboard","image":"2328.png","id":"2328"},{"name":"keycap_star","image":"002a-20e3.png","id":"002a-20e3"},{"name":"keycap_ten","image":"1f51f.png","id":"1f51f"},{"name":"kimono","image":"1f458.png","id":"1f458"},{"name":"kiss","image":"1f48b.png","id":"1f48b"},{"name":"kissing","image":"1f617.png","id":"1f617"},{"name":"kissing_cat","image":"1f63d.png","id":"1f63d"},{"name":"kissing_closed_eyes","image":"1f61a.png","id":"1f61a"},{"name":"kissing_heart","image":"1f618.png","id":"1f618"},{"name":"kissing_smiling_eyes","image":"1f619.png","id":"1f619"},{"name":"knife_fork_plate","image":"1f37d.png","id":"1f37d"},{"name":"koala","image":"1f428.png","id":"1f428"},{"name":"koko","image":"1f201.png","id":"1f201"},{"name":"label","image":"1f3f7.png","id":"1f3f7"},{"name":"large_blue_circle","image":"1f535.png","id":"1f535"},{"name":"large_blue_diamond","image":"1f537.png","id":"1f537"},{"name":"large_orange_diamond","image":"1f536.png","id":"1f536"},{"name":"last_quarter_moon","image":"1f317.png","id":"1f317"},{"name":"last_quarter_moon_with_face","image":"1f31c.png","id":"1f31c"},{"name":"latin_cross","image":"271d.png","id":"271d"},{"name":"laughing","image":"1f606.png","id":"1f606"},{"name":"leaves","image":"1f343.png","id":"1f343"},{"name":"ledger","image":"1f4d2.png","id":"1f4d2"},{"name":"left_luggage","image":"1f6c5.png","id":"1f6c5"},{"name":"left_right_arrow","image":"2194.png","id":"2194"},{"name":"left_speech_bubble","image":"1f5e8.png","id":"1f5e8"},{"name":"leftwards_arrow_with_hook","image":"21a9.png","id":"21a9"},{"name":"lemon","image":"1f34b.png","id":"1f34b"},{"name":"leo","image":"264c.png","id":"264c"},{"name":"leopard","image":"1f406.png","id":"1f406"},{"name":"level_slider","image":"1f39a.png","id":"1f39a"},{"name":"libra","image":"264e.png","id":"264e"},{"name":"light_rail","image":"1f688.png","id":"1f688"},{"name":"lightning","image":"1f329.png","id":"1f329"},{"name":"link","image":"1f517.png","id":"1f517"},{"name":"linked_paperclips","image":"1f587.png","id":"1f587"},{"name":"lion_face","image":"1f981.png","id":"1f981"},{"name":"lips","image":"1f444.png","id":"1f444"},{"name":"lipstick","image":"1f484.png","id":"1f484"},{"name":"lock","image":"1f512.png","id":"1f512"},{"name":"lock_with_ink_pen","image":"1f50f.png","id":"1f50f"},{"name":"lollipop","image":"1f36d.png","id":"1f36d"},{"name":"loop","image":"27bf.png","id":"27bf"},{"name":"loud_sound","image":"1f50a.png","id":"1f50a"},{"name":"loudspeaker","image":"1f4e2.png","id":"1f4e2"},{"name":"love_hotel","image":"1f3e9.png","id":"1f3e9"},{"name":"love_letter","image":"1f48c.png","id":"1f48c"},{"name":"low_brightness","image":"1f505.png","id":"1f505"},{"name":"lower_left_ballpoint_pen","image":"1f58a.png","id":"1f58a"},{"name":"lower_left_crayon","image":"1f58d.png","id":"1f58d"},{"name":"lower_left_fountain_pen","image":"1f58b.png","id":"1f58b"},{"name":"lower_left_paintbrush","image":"1f58c.png","id":"1f58c"},{"name":"m","image":"24c2.png","id":"24c2"},{"name":"mag","image":"1f50d.png","id":"1f50d"},{"name":"mag_right","image":"1f50e.png","id":"1f50e"},{"name":"mahjong","image":"1f004.png","id":"1f004"},{"name":"mailbox","image":"1f4eb.png","id":"1f4eb"},{"name":"mailbox_closed","image":"1f4ea.png","id":"1f4ea"},{"name":"mailbox_with_mail","image":"1f4ec.png","id":"1f4ec"},{"name":"mailbox_with_no_mail","image":"1f4ed.png","id":"1f4ed"},{"name":"man","image":"1f468.png","id":"1f468"},{"name":"man-heart-man","image":"1f468-200d-2764-fe0f-200d-1f468.png","id":"1f468-200d-2764-fe0f-200d-1f468"},{"name":"man-kiss-man","image":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468.png","id":"1f468-200d-2764-fe0f-200d-1f48b-200d-1f468"},{"name":"man-man-boy","image":"1f468-200d-1f468-200d-1f466.png","id":"1f468-200d-1f468-200d-1f466"},{"name":"man-man-boy-boy","image":"1f468-200d-1f468-200d-1f466-200d-1f466.png","id":"1f468-200d-1f468-200d-1f466-200d-1f466"},{"name":"man-man-girl","image":"1f468-200d-1f468-200d-1f467.png","id":"1f468-200d-1f468-200d-1f467"},{"name":"man-man-girl-boy","image":"1f468-200d-1f468-200d-1f467-200d-1f466.png","id":"1f468-200d-1f468-200d-1f467-200d-1f466"},{"name":"man-man-girl-girl","image":"1f468-200d-1f468-200d-1f467-200d-1f467.png","id":"1f468-200d-1f468-200d-1f467-200d-1f467"},{"name":"man-woman-boy-boy","image":"1f468-200d-1f469-200d-1f466-200d-1f466.png","id":"1f468-200d-1f469-200d-1f466-200d-1f466"},{"name":"man-woman-girl","image":"1f468-200d-1f469-200d-1f467.png","id":"1f468-200d-1f469-200d-1f467"},{"name":"man-woman-girl-boy","image":"1f468-200d-1f469-200d-1f467-200d-1f466.png","id":"1f468-200d-1f469-200d-1f467-200d-1f466"},{"name":"man-woman-girl-girl","image":"1f468-200d-1f469-200d-1f467-200d-1f467.png","id":"1f468-200d-1f469-200d-1f467-200d-1f467"},{"name":"man_in_business_suit_levitating","image":"1f574.png","id":"1f574"},{"name":"man_with_gua_pi_mao","image":"1f472.png","id":"1f472"},{"name":"man_with_turban","image":"1f473.png","id":"1f473"},{"name":"mans_shoe","image":"1f45e.png","id":"1f45e"},{"name":"mantelpiece_clock","image":"1f570.png","id":"1f570"},{"name":"maple_leaf","image":"1f341.png","id":"1f341"},{"name":"mask","image":"1f637.png","id":"1f637"},{"name":"massage","image":"1f486.png","id":"1f486"},{"name":"meat_on_bone","image":"1f356.png","id":"1f356"},{"name":"medal","image":"1f396.png","id":"1f396"},{"name":"mega","image":"1f4e3.png","id":"1f4e3"},{"name":"melon","image":"1f348.png","id":"1f348"},{"name":"memo","image":"1f4dd.png","id":"1f4dd"},{"name":"menorah_with_nine_branches","image":"1f54e.png","id":"1f54e"},{"name":"mens","image":"1f6b9.png","id":"1f6b9"},{"name":"metro","image":"1f687.png","id":"1f687"},{"name":"microphone","image":"1f3a4.png","id":"1f3a4"},{"name":"microscope","image":"1f52c.png","id":"1f52c"},{"name":"middle_finger","image":"1f595.png","id":"1f595"},{"name":"milky_way","image":"1f30c.png","id":"1f30c"},{"name":"minibus","image":"1f690.png","id":"1f690"},{"name":"minidisc","image":"1f4bd.png","id":"1f4bd"},{"name":"mobile_phone_off","image":"1f4f4.png","id":"1f4f4"},{"name":"money_mouth_face","image":"1f911.png","id":"1f911"},{"name":"money_with_wings","image":"1f4b8.png","id":"1f4b8"},{"name":"moneybag","image":"1f4b0.png","id":"1f4b0"},{"name":"monkey","image":"1f412.png","id":"1f412"},{"name":"monkey_face","image":"1f435.png","id":"1f435"},{"name":"monorail","image":"1f69d.png","id":"1f69d"},{"name":"moon","image":"1f314.png","id":"1f314"},{"name":"mortar_board","image":"1f393.png","id":"1f393"},{"name":"mosque","image":"1f54c.png","id":"1f54c"},{"name":"mostly_sunny","image":"1f324.png","id":"1f324"},{"name":"motor_boat","image":"1f6e5.png","id":"1f6e5"},{"name":"motorway","image":"1f6e3.png","id":"1f6e3"},{"name":"mount_fuji","image":"1f5fb.png","id":"1f5fb"},{"name":"mountain","image":"26f0.png","id":"26f0"},{"name":"mountain_bicyclist","image":"1f6b5.png","id":"1f6b5"},{"name":"mountain_cableway","image":"1f6a0.png","id":"1f6a0"},{"name":"mountain_railway","image":"1f69e.png","id":"1f69e"},{"name":"mouse","image":"1f42d.png","id":"1f42d"},{"name":"mouse2","image":"1f401.png","id":"1f401"},{"name":"movie_camera","image":"1f3a5.png","id":"1f3a5"},{"name":"moyai","image":"1f5ff.png","id":"1f5ff"},{"name":"muscle","image":"1f4aa.png","id":"1f4aa"},{"name":"mushroom","image":"1f344.png","id":"1f344"},{"name":"musical_keyboard","image":"1f3b9.png","id":"1f3b9"},{"name":"musical_note","image":"1f3b5.png","id":"1f3b5"},{"name":"musical_score","image":"1f3bc.png","id":"1f3bc"},{"name":"mute","image":"1f507.png","id":"1f507"},{"name":"nail_care","image":"1f485.png","id":"1f485"},{"name":"name_badge","image":"1f4db.png","id":"1f4db"},{"name":"national_park","image":"1f3de.png","id":"1f3de"},{"name":"necktie","image":"1f454.png","id":"1f454"},{"name":"negative_squared_cross_mark","image":"274e.png","id":"274e"},{"name":"nerd_face","image":"1f913.png","id":"1f913"},{"name":"neutral_face","image":"1f610.png","id":"1f610"},{"name":"new","image":"1f195.png","id":"1f195"},{"name":"new_moon","image":"1f311.png","id":"1f311"},{"name":"new_moon_with_face","image":"1f31a.png","id":"1f31a"},{"name":"newspaper","image":"1f4f0.png","id":"1f4f0"},{"name":"ng","image":"1f196.png","id":"1f196"},{"name":"night_with_stars","image":"1f303.png","id":"1f303"},{"name":"nine","image":"0039-20e3.png","id":"0039-20e3"},{"name":"no_bell","image":"1f515.png","id":"1f515"},{"name":"no_bicycles","image":"1f6b3.png","id":"1f6b3"},{"name":"no_entry","image":"26d4.png","id":"26d4"},{"name":"no_entry_sign","image":"1f6ab.png","id":"1f6ab"},{"name":"no_good","image":"1f645.png","id":"1f645"},{"name":"no_mobile_phones","image":"1f4f5.png","id":"1f4f5"},{"name":"no_mouth","image":"1f636.png","id":"1f636"},{"name":"no_pedestrians","image":"1f6b7.png","id":"1f6b7"},{"name":"no_smoking","image":"1f6ad.png","id":"1f6ad"},{"name":"non-potable_water","image":"1f6b1.png","id":"1f6b1"},{"name":"nose","image":"1f443.png","id":"1f443"},{"name":"notebook","image":"1f4d3.png","id":"1f4d3"},{"name":"notebook_with_decorative_cover","image":"1f4d4.png","id":"1f4d4"},{"name":"notes","image":"1f3b6.png","id":"1f3b6"},{"name":"nut_and_bolt","image":"1f529.png","id":"1f529"},{"name":"o","image":"2b55.png","id":"2b55"},{"name":"o2","image":"1f17e.png","id":"1f17e"},{"name":"ocean","image":"1f30a.png","id":"1f30a"},{"name":"octopus","image":"1f419.png","id":"1f419"},{"name":"oden","image":"1f362.png","id":"1f362"},{"name":"office","image":"1f3e2.png","id":"1f3e2"},{"name":"oil_drum","image":"1f6e2.png","id":"1f6e2"},{"name":"ok","image":"1f197.png","id":"1f197"},{"name":"ok_hand","image":"1f44c.png","id":"1f44c"},{"name":"ok_woman","image":"1f646.png","id":"1f646"},{"name":"old_key","image":"1f5dd.png","id":"1f5dd"},{"name":"older_man","image":"1f474.png","id":"1f474"},{"name":"older_woman","image":"1f475.png","id":"1f475"},{"name":"om_symbol","image":"1f549.png","id":"1f549"},{"name":"on","image":"1f51b.png","id":"1f51b"},{"name":"oncoming_automobile","image":"1f698.png","id":"1f698"},{"name":"oncoming_bus","image":"1f68d.png","id":"1f68d"},{"name":"oncoming_police_car","image":"1f694.png","id":"1f694"},{"name":"oncoming_taxi","image":"1f696.png","id":"1f696"},{"name":"one","image":"0031-20e3.png","id":"0031-20e3"},{"name":"open_file_folder","image":"1f4c2.png","id":"1f4c2"},{"name":"open_hands","image":"1f450.png","id":"1f450"},{"name":"open_mouth","image":"1f62e.png","id":"1f62e"},{"name":"ophiuchus","image":"26ce.png","id":"26ce"},{"name":"orange_book","image":"1f4d9.png","id":"1f4d9"},{"name":"orthodox_cross","image":"2626.png","id":"2626"},{"name":"outbox_tray","image":"1f4e4.png","id":"1f4e4"},{"name":"ox","image":"1f402.png","id":"1f402"},{"name":"package","image":"1f4e6.png","id":"1f4e6"},{"name":"page_facing_up","image":"1f4c4.png","id":"1f4c4"},{"name":"page_with_curl","image":"1f4c3.png","id":"1f4c3"},{"name":"pager","image":"1f4df.png","id":"1f4df"},{"name":"palm_tree","image":"1f334.png","id":"1f334"},{"name":"panda_face","image":"1f43c.png","id":"1f43c"},{"name":"paperclip","image":"1f4ce.png","id":"1f4ce"},{"name":"parking","image":"1f17f.png","id":"1f17f"},{"name":"part_alternation_mark","image":"303d.png","id":"303d"},{"name":"partly_sunny","image":"26c5.png","id":"26c5"},{"name":"partly_sunny_rain","image":"1f326.png","id":"1f326"},{"name":"passenger_ship","image":"1f6f3.png","id":"1f6f3"},{"name":"passport_control","image":"1f6c2.png","id":"1f6c2"},{"name":"peace_symbol","image":"262e.png","id":"262e"},{"name":"peach","image":"1f351.png","id":"1f351"},{"name":"pear","image":"1f350.png","id":"1f350"},{"name":"pencil2","image":"270f.png","id":"270f"},{"name":"penguin","image":"1f427.png","id":"1f427"},{"name":"pensive","image":"1f614.png","id":"1f614"},{"name":"performing_arts","image":"1f3ad.png","id":"1f3ad"},{"name":"persevere","image":"1f623.png","id":"1f623"},{"name":"person_frowning","image":"1f64d.png","id":"1f64d"},{"name":"person_with_ball","image":"26f9.png","id":"26f9"},{"name":"person_with_blond_hair","image":"1f471.png","id":"1f471"},{"name":"person_with_pouting_face","image":"1f64e.png","id":"1f64e"},{"name":"phone","image":"260e.png","id":"260e"},{"name":"pick","image":"26cf.png","id":"26cf"},{"name":"pig","image":"1f437.png","id":"1f437"},{"name":"pig2","image":"1f416.png","id":"1f416"},{"name":"pig_nose","image":"1f43d.png","id":"1f43d"},{"name":"pill","image":"1f48a.png","id":"1f48a"},{"name":"pineapple","image":"1f34d.png","id":"1f34d"},{"name":"pisces","image":"2653.png","id":"2653"},{"name":"pizza","image":"1f355.png","id":"1f355"},{"name":"place_of_worship","image":"1f6d0.png","id":"1f6d0"},{"name":"point_down","image":"1f447.png","id":"1f447"},{"name":"point_left","image":"1f448.png","id":"1f448"},{"name":"point_right","image":"1f449.png","id":"1f449"},{"name":"point_up","image":"261d.png","id":"261d"},{"name":"point_up_2","image":"1f446.png","id":"1f446"},{"name":"police_car","image":"1f693.png","id":"1f693"},{"name":"poodle","image":"1f429.png","id":"1f429"},{"name":"popcorn","image":"1f37f.png","id":"1f37f"},{"name":"post_office","image":"1f3e3.png","id":"1f3e3"},{"name":"postal_horn","image":"1f4ef.png","id":"1f4ef"},{"name":"postbox","image":"1f4ee.png","id":"1f4ee"},{"name":"potable_water","image":"1f6b0.png","id":"1f6b0"},{"name":"pouch","image":"1f45d.png","id":"1f45d"},{"name":"poultry_leg","image":"1f357.png","id":"1f357"},{"name":"pound","image":"1f4b7.png","id":"1f4b7"},{"name":"pouting_cat","image":"1f63e.png","id":"1f63e"},{"name":"pray","image":"1f64f.png","id":"1f64f"},{"name":"prayer_beads","image":"1f4ff.png","id":"1f4ff"},{"name":"princess","image":"1f478.png","id":"1f478"},{"name":"printer","image":"1f5a8.png","id":"1f5a8"},{"name":"purple_heart","image":"1f49c.png","id":"1f49c"},{"name":"purse","image":"1f45b.png","id":"1f45b"},{"name":"pushpin","image":"1f4cc.png","id":"1f4cc"},{"name":"put_litter_in_its_place","image":"1f6ae.png","id":"1f6ae"},{"name":"question","image":"2753.png","id":"2753"},{"name":"rabbit","image":"1f430.png","id":"1f430"},{"name":"rabbit2","image":"1f407.png","id":"1f407"},{"name":"racehorse","image":"1f40e.png","id":"1f40e"},{"name":"racing_car","image":"1f3ce.png","id":"1f3ce"},{"name":"racing_motorcycle","image":"1f3cd.png","id":"1f3cd"},{"name":"radio","image":"1f4fb.png","id":"1f4fb"},{"name":"radio_button","image":"1f518.png","id":"1f518"},{"name":"radioactive_sign","image":"2622.png","id":"2622"},{"name":"rage","image":"1f621.png","id":"1f621"},{"name":"railway_car","image":"1f683.png","id":"1f683"},{"name":"railway_track","image":"1f6e4.png","id":"1f6e4"},{"name":"rain_cloud","image":"1f327.png","id":"1f327"},{"name":"rainbow","image":"1f308.png","id":"1f308"},{"name":"raised_hand_with_fingers_splayed","image":"1f590.png","id":"1f590"},{"name":"raised_hands","image":"1f64c.png","id":"1f64c"},{"name":"raising_hand","image":"1f64b.png","id":"1f64b"},{"name":"ram","image":"1f40f.png","id":"1f40f"},{"name":"ramen","image":"1f35c.png","id":"1f35c"},{"name":"rat","image":"1f400.png","id":"1f400"},{"name":"recycle","image":"267b.png","id":"267b"},{"name":"red_circle","image":"1f534.png","id":"1f534"},{"name":"relaxed","image":"263a.png","id":"263a"},{"name":"relieved","image":"1f60c.png","id":"1f60c"},{"name":"reminder_ribbon","image":"1f397.png","id":"1f397"},{"name":"repeat","image":"1f501.png","id":"1f501"},{"name":"repeat_one","image":"1f502.png","id":"1f502"},{"name":"restroom","image":"1f6bb.png","id":"1f6bb"},{"name":"revolving_hearts","image":"1f49e.png","id":"1f49e"},{"name":"rewind","image":"23ea.png","id":"23ea"},{"name":"ribbon","image":"1f380.png","id":"1f380"},{"name":"rice","image":"1f35a.png","id":"1f35a"},{"name":"rice_ball","image":"1f359.png","id":"1f359"},{"name":"rice_cracker","image":"1f358.png","id":"1f358"},{"name":"rice_scene","image":"1f391.png","id":"1f391"},{"name":"right_anger_bubble","image":"1f5ef.png","id":"1f5ef"},{"name":"ring","image":"1f48d.png","id":"1f48d"},{"name":"robot_face","image":"1f916.png","id":"1f916"},{"name":"rocket","image":"1f680.png","id":"1f680"},{"name":"rolled_up_newspaper","image":"1f5de.png","id":"1f5de"},{"name":"roller_coaster","image":"1f3a2.png","id":"1f3a2"},{"name":"rooster","image":"1f413.png","id":"1f413"},{"name":"rose","image":"1f339.png","id":"1f339"},{"name":"rosette","image":"1f3f5.png","id":"1f3f5"},{"name":"rotating_light","image":"1f6a8.png","id":"1f6a8"},{"name":"round_pushpin","image":"1f4cd.png","id":"1f4cd"},{"name":"rowboat","image":"1f6a3.png","id":"1f6a3"},{"name":"rugby_football","image":"1f3c9.png","id":"1f3c9"},{"name":"runner","image":"1f3c3.png","id":"1f3c3"},{"name":"running_shirt_with_sash","image":"1f3bd.png","id":"1f3bd"},{"name":"sa","image":"1f202.png","id":"1f202"},{"name":"sagittarius","image":"2650.png","id":"2650"},{"name":"sake","image":"1f376.png","id":"1f376"},{"name":"sandal","image":"1f461.png","id":"1f461"},{"name":"santa","image":"1f385.png","id":"1f385"},{"name":"satellite","image":"1f6f0.png","id":"1f6f0"},{"name":"satellite_antenna","image":"1f4e1.png","id":"1f4e1"},{"name":"saxophone","image":"1f3b7.png","id":"1f3b7"},{"name":"scales","image":"2696.png","id":"2696"},{"name":"school","image":"1f3eb.png","id":"1f3eb"},{"name":"school_satchel","image":"1f392.png","id":"1f392"},{"name":"scissors","image":"2702.png","id":"2702"},{"name":"scorpion","image":"1f982.png","id":"1f982"},{"name":"scorpius","image":"264f.png","id":"264f"},{"name":"scream","image":"1f631.png","id":"1f631"},{"name":"scream_cat","image":"1f640.png","id":"1f640"},{"name":"scroll","image":"1f4dc.png","id":"1f4dc"},{"name":"seat","image":"1f4ba.png","id":"1f4ba"},{"name":"secret","image":"3299.png","id":"3299"},{"name":"see_no_evil","image":"1f648.png","id":"1f648"},{"name":"seedling","image":"1f331.png","id":"1f331"},{"name":"seven","image":"0037-20e3.png","id":"0037-20e3"},{"name":"shamrock","image":"2618.png","id":"2618"},{"name":"shaved_ice","image":"1f367.png","id":"1f367"},{"name":"sheep","image":"1f411.png","id":"1f411"},{"name":"shell","image":"1f41a.png","id":"1f41a"},{"name":"shield","image":"1f6e1.png","id":"1f6e1"},{"name":"shinto_shrine","image":"26e9.png","id":"26e9"},{"name":"ship","image":"1f6a2.png","id":"1f6a2"},{"name":"shirt","image":"1f455.png","id":"1f455"},{"name":"shopping_bags","image":"1f6cd.png","id":"1f6cd"},{"name":"shower","image":"1f6bf.png","id":"1f6bf"},{"name":"signal_strength","image":"1f4f6.png","id":"1f4f6"},{"name":"six","image":"0036-20e3.png","id":"0036-20e3"},{"name":"six_pointed_star","image":"1f52f.png","id":"1f52f"},{"name":"ski","image":"1f3bf.png","id":"1f3bf"},{"name":"skier","image":"26f7.png","id":"26f7"},{"name":"skin-tone-2","image":"1f3fb.png","id":"1f3fb"},{"name":"skin-tone-3","image":"1f3fc.png","id":"1f3fc"},{"name":"skin-tone-4","image":"1f3fd.png","id":"1f3fd"},{"name":"skin-tone-5","image":"1f3fe.png","id":"1f3fe"},{"name":"skin-tone-6","image":"1f3ff.png","id":"1f3ff"},{"name":"skull","image":"1f480.png","id":"1f480"},{"name":"skull_and_crossbones","image":"2620.png","id":"2620"},{"name":"sleeping","image":"1f634.png","id":"1f634"},{"name":"sleeping_accommodation","image":"1f6cc.png","id":"1f6cc"},{"name":"sleepy","image":"1f62a.png","id":"1f62a"},{"name":"sleuth_or_spy","image":"1f575.png","id":"1f575"},{"name":"slightly_frowning_face","image":"1f641.png","id":"1f641"},{"name":"slightly_smiling_face","image":"1f642.png","id":"1f642"},{"name":"slot_machine","image":"1f3b0.png","id":"1f3b0"},{"name":"small_airplane","image":"1f6e9.png","id":"1f6e9"},{"name":"small_blue_diamond","image":"1f539.png","id":"1f539"},{"name":"small_orange_diamond","image":"1f538.png","id":"1f538"},{"name":"small_red_triangle","image":"1f53a.png","id":"1f53a"},{"name":"small_red_triangle_down","image":"1f53b.png","id":"1f53b"},{"name":"smile","image":"1f604.png","id":"1f604"},{"name":"smile_cat","image":"1f638.png","id":"1f638"},{"name":"smiley","image":"1f603.png","id":"1f603"},{"name":"smiley_cat","image":"1f63a.png","id":"1f63a"},{"name":"smiling_imp","image":"1f608.png","id":"1f608"},{"name":"smirk","image":"1f60f.png","id":"1f60f"},{"name":"smirk_cat","image":"1f63c.png","id":"1f63c"},{"name":"smoking","image":"1f6ac.png","id":"1f6ac"},{"name":"snail","image":"1f40c.png","id":"1f40c"},{"name":"snake","image":"1f40d.png","id":"1f40d"},{"name":"snow_capped_mountain","image":"1f3d4.png","id":"1f3d4"},{"name":"snow_cloud","image":"1f328.png","id":"1f328"},{"name":"snowboarder","image":"1f3c2.png","id":"1f3c2"},{"name":"snowflake","image":"2744.png","id":"2744"},{"name":"snowman","image":"2603.png","id":"2603"},{"name":"snowman_without_snow","image":"26c4.png","id":"26c4"},{"name":"sob","image":"1f62d.png","id":"1f62d"},{"name":"soccer","image":"26bd.png","id":"26bd"},{"name":"soon","image":"1f51c.png","id":"1f51c"},{"name":"sos","image":"1f198.png","id":"1f198"},{"name":"sound","image":"1f509.png","id":"1f509"},{"name":"space_invader","image":"1f47e.png","id":"1f47e"},{"name":"spades","image":"2660.png","id":"2660"},{"name":"spaghetti","image":"1f35d.png","id":"1f35d"},{"name":"sparkle","image":"2747.png","id":"2747"},{"name":"sparkler","image":"1f387.png","id":"1f387"},{"name":"sparkles","image":"2728.png","id":"2728"},{"name":"sparkling_heart","image":"1f496.png","id":"1f496"},{"name":"speak_no_evil","image":"1f64a.png","id":"1f64a"},{"name":"speaker","image":"1f508.png","id":"1f508"},{"name":"speaking_head_in_silhouette","image":"1f5e3.png","id":"1f5e3"},{"name":"speech_balloon","image":"1f4ac.png","id":"1f4ac"},{"name":"speedboat","image":"1f6a4.png","id":"1f6a4"},{"name":"spider","image":"1f577.png","id":"1f577"},{"name":"spider_web","image":"1f578.png","id":"1f578"},{"name":"spiral_calendar_pad","image":"1f5d3.png","id":"1f5d3"},{"name":"spiral_note_pad","image":"1f5d2.png","id":"1f5d2"},{"name":"spock-hand","image":"1f596.png","id":"1f596"},{"name":"sports_medal","image":"1f3c5.png","id":"1f3c5"},{"name":"stadium","image":"1f3df.png","id":"1f3df"},{"name":"star","image":"2b50.png","id":"2b50"},{"name":"star2","image":"1f31f.png","id":"1f31f"},{"name":"star_and_crescent","image":"262a.png","id":"262a"},{"name":"star_of_david","image":"2721.png","id":"2721"},{"name":"stars","image":"1f320.png","id":"1f320"},{"name":"station","image":"1f689.png","id":"1f689"},{"name":"statue_of_liberty","image":"1f5fd.png","id":"1f5fd"},{"name":"steam_locomotive","image":"1f682.png","id":"1f682"},{"name":"stew","image":"1f372.png","id":"1f372"},{"name":"stopwatch","image":"23f1.png","id":"23f1"},{"name":"straight_ruler","image":"1f4cf.png","id":"1f4cf"},{"name":"strawberry","image":"1f353.png","id":"1f353"},{"name":"stuck_out_tongue","image":"1f61b.png","id":"1f61b"},{"name":"stuck_out_tongue_closed_eyes","image":"1f61d.png","id":"1f61d"},{"name":"stuck_out_tongue_winking_eye","image":"1f61c.png","id":"1f61c"},{"name":"studio_microphone","image":"1f399.png","id":"1f399"},{"name":"sun_with_face","image":"1f31e.png","id":"1f31e"},{"name":"sunflower","image":"1f33b.png","id":"1f33b"},{"name":"sunglasses","image":"1f60e.png","id":"1f60e"},{"name":"sunny","image":"2600.png","id":"2600"},{"name":"sunrise","image":"1f305.png","id":"1f305"},{"name":"sunrise_over_mountains","image":"1f304.png","id":"1f304"},{"name":"surfer","image":"1f3c4.png","id":"1f3c4"},{"name":"sushi","image":"1f363.png","id":"1f363"},{"name":"suspension_railway","image":"1f69f.png","id":"1f69f"},{"name":"sweat","image":"1f613.png","id":"1f613"},{"name":"sweat_drops","image":"1f4a6.png","id":"1f4a6"},{"name":"sweat_smile","image":"1f605.png","id":"1f605"},{"name":"sweet_potato","image":"1f360.png","id":"1f360"},{"name":"swimmer","image":"1f3ca.png","id":"1f3ca"},{"name":"symbols","image":"1f523.png","id":"1f523"},{"name":"synagogue","image":"1f54d.png","id":"1f54d"},{"name":"syringe","image":"1f489.png","id":"1f489"},{"name":"table_tennis_paddle_and_ball","image":"1f3d3.png","id":"1f3d3"},{"name":"taco","image":"1f32e.png","id":"1f32e"},{"name":"tada","image":"1f389.png","id":"1f389"},{"name":"tanabata_tree","image":"1f38b.png","id":"1f38b"},{"name":"tangerine","image":"1f34a.png","id":"1f34a"},{"name":"taurus","image":"2649.png","id":"2649"},{"name":"taxi","image":"1f695.png","id":"1f695"},{"name":"tea","image":"1f375.png","id":"1f375"},{"name":"telephone_receiver","image":"1f4de.png","id":"1f4de"},{"name":"telescope","image":"1f52d.png","id":"1f52d"},{"name":"tennis","image":"1f3be.png","id":"1f3be"},{"name":"tent","image":"26fa.png","id":"26fa"},{"name":"the_horns","image":"1f918.png","id":"1f918"},{"name":"thermometer","image":"1f321.png","id":"1f321"},{"name":"thinking_face","image":"1f914.png","id":"1f914"},{"name":"thought_balloon","image":"1f4ad.png","id":"1f4ad"},{"name":"three","image":"0033-20e3.png","id":"0033-20e3"},{"name":"three_button_mouse","image":"1f5b1.png","id":"1f5b1"},{"name":"thunder_cloud_and_rain","image":"26c8.png","id":"26c8"},{"name":"ticket","image":"1f3ab.png","id":"1f3ab"},{"name":"tiger","image":"1f42f.png","id":"1f42f"},{"name":"tiger2","image":"1f405.png","id":"1f405"},{"name":"timer_clock","image":"23f2.png","id":"23f2"},{"name":"tired_face","image":"1f62b.png","id":"1f62b"},{"name":"toilet","image":"1f6bd.png","id":"1f6bd"},{"name":"tokyo_tower","image":"1f5fc.png","id":"1f5fc"},{"name":"tomato","image":"1f345.png","id":"1f345"},{"name":"tongue","image":"1f445.png","id":"1f445"},{"name":"top","image":"1f51d.png","id":"1f51d"},{"name":"tophat","image":"1f3a9.png","id":"1f3a9"},{"name":"tornado","image":"1f32a.png","id":"1f32a"},{"name":"trackball","image":"1f5b2.png","id":"1f5b2"},{"name":"tractor","image":"1f69c.png","id":"1f69c"},{"name":"traffic_light","image":"1f6a5.png","id":"1f6a5"},{"name":"train","image":"1f68b.png","id":"1f68b"},{"name":"train2","image":"1f686.png","id":"1f686"},{"name":"tram","image":"1f68a.png","id":"1f68a"},{"name":"triangular_flag_on_post","image":"1f6a9.png","id":"1f6a9"},{"name":"triangular_ruler","image":"1f4d0.png","id":"1f4d0"},{"name":"trident","image":"1f531.png","id":"1f531"},{"name":"triumph","image":"1f624.png","id":"1f624"},{"name":"trolleybus","image":"1f68e.png","id":"1f68e"},{"name":"trophy","image":"1f3c6.png","id":"1f3c6"},{"name":"tropical_drink","image":"1f379.png","id":"1f379"},{"name":"tropical_fish","image":"1f420.png","id":"1f420"},{"name":"truck","image":"1f69a.png","id":"1f69a"},{"name":"trumpet","image":"1f3ba.png","id":"1f3ba"},{"name":"tulip","image":"1f337.png","id":"1f337"},{"name":"turkey","image":"1f983.png","id":"1f983"},{"name":"turtle","image":"1f422.png","id":"1f422"},{"name":"tv","image":"1f4fa.png","id":"1f4fa"},{"name":"twisted_rightwards_arrows","image":"1f500.png","id":"1f500"},{"name":"two","image":"0032-20e3.png","id":"0032-20e3"},{"name":"two_hearts","image":"1f495.png","id":"1f495"},{"name":"two_men_holding_hands","image":"1f46c.png","id":"1f46c"},{"name":"two_women_holding_hands","image":"1f46d.png","id":"1f46d"},{"name":"u5272","image":"1f239.png","id":"1f239"},{"name":"u5408","image":"1f234.png","id":"1f234"},{"name":"u55b6","image":"1f23a.png","id":"1f23a"},{"name":"u6307","image":"1f22f.png","id":"1f22f"},{"name":"u6708","image":"1f237.png","id":"1f237"},{"name":"u6709","image":"1f236.png","id":"1f236"},{"name":"u6e80","image":"1f235.png","id":"1f235"},{"name":"u7121","image":"1f21a.png","id":"1f21a"},{"name":"u7533","image":"1f238.png","id":"1f238"},{"name":"u7981","image":"1f232.png","id":"1f232"},{"name":"u7a7a","image":"1f233.png","id":"1f233"},{"name":"umbrella","image":"2602.png","id":"2602"},{"name":"umbrella_on_ground","image":"26f1.png","id":"26f1"},{"name":"umbrella_with_rain_drops","image":"2614.png","id":"2614"},{"name":"unamused","image":"1f612.png","id":"1f612"},{"name":"underage","image":"1f51e.png","id":"1f51e"},{"name":"unicorn_face","image":"1f984.png","id":"1f984"},{"name":"unlock","image":"1f513.png","id":"1f513"},{"name":"up","image":"1f199.png","id":"1f199"},{"name":"upside_down_face","image":"1f643.png","id":"1f643"},{"name":"v","image":"270c.png","id":"270c"},{"name":"vertical_traffic_light","image":"1f6a6.png","id":"1f6a6"},{"name":"vhs","image":"1f4fc.png","id":"1f4fc"},{"name":"vibration_mode","image":"1f4f3.png","id":"1f4f3"},{"name":"video_camera","image":"1f4f9.png","id":"1f4f9"},{"name":"video_game","image":"1f3ae.png","id":"1f3ae"},{"name":"violin","image":"1f3bb.png","id":"1f3bb"},{"name":"virgo","image":"264d.png","id":"264d"},{"name":"volcano","image":"1f30b.png","id":"1f30b"},{"name":"volleyball","image":"1f3d0.png","id":"1f3d0"},{"name":"vs","image":"1f19a.png","id":"1f19a"},{"name":"walking","image":"1f6b6.png","id":"1f6b6"},{"name":"waning_crescent_moon","image":"1f318.png","id":"1f318"},{"name":"waning_gibbous_moon","image":"1f316.png","id":"1f316"},{"name":"warning","image":"26a0.png","id":"26a0"},{"name":"wastebasket","image":"1f5d1.png","id":"1f5d1"},{"name":"watch","image":"231a.png","id":"231a"},{"name":"water_buffalo","image":"1f403.png","id":"1f403"},{"name":"watermelon","image":"1f349.png","id":"1f349"},{"name":"wave","image":"1f44b.png","id":"1f44b"},{"name":"waving_black_flag","image":"1f3f4.png","id":"1f3f4"},{"name":"waving_white_flag","image":"1f3f3.png","id":"1f3f3"},{"name":"wavy_dash","image":"3030.png","id":"3030"},{"name":"waxing_crescent_moon","image":"1f312.png","id":"1f312"},{"name":"wc","image":"1f6be.png","id":"1f6be"},{"name":"weary","image":"1f629.png","id":"1f629"},{"name":"wedding","image":"1f492.png","id":"1f492"},{"name":"weight_lifter","image":"1f3cb.png","id":"1f3cb"},{"name":"whale","image":"1f433.png","id":"1f433"},{"name":"whale2","image":"1f40b.png","id":"1f40b"},{"name":"wheel_of_dharma","image":"2638.png","id":"2638"},{"name":"wheelchair","image":"267f.png","id":"267f"},{"name":"white_check_mark","image":"2705.png","id":"2705"},{"name":"white_circle","image":"26aa.png","id":"26aa"},{"name":"white_flower","image":"1f4ae.png","id":"1f4ae"},{"name":"white_frowning_face","image":"2639.png","id":"2639"},{"name":"white_large_square","image":"2b1c.png","id":"2b1c"},{"name":"white_medium_small_square","image":"25fd.png","id":"25fd"},{"name":"white_medium_square","image":"25fb.png","id":"25fb"},{"name":"white_small_square","image":"25ab.png","id":"25ab"},{"name":"white_square_button","image":"1f533.png","id":"1f533"},{"name":"wind_blowing_face","image":"1f32c.png","id":"1f32c"},{"name":"wind_chime","image":"1f390.png","id":"1f390"},{"name":"wine_glass","image":"1f377.png","id":"1f377"},{"name":"wink","image":"1f609.png","id":"1f609"},{"name":"wolf","image":"1f43a.png","id":"1f43a"},{"name":"woman","image":"1f469.png","id":"1f469"},{"name":"woman-heart-woman","image":"1f469-200d-2764-fe0f-200d-1f469.png","id":"1f469-200d-2764-fe0f-200d-1f469"},{"name":"woman-kiss-woman","image":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469.png","id":"1f469-200d-2764-fe0f-200d-1f48b-200d-1f469"},{"name":"woman-woman-boy","image":"1f469-200d-1f469-200d-1f466.png","id":"1f469-200d-1f469-200d-1f466"},{"name":"woman-woman-boy-boy","image":"1f469-200d-1f469-200d-1f466-200d-1f466.png","id":"1f469-200d-1f469-200d-1f466-200d-1f466"},{"name":"woman-woman-girl","image":"1f469-200d-1f469-200d-1f467.png","id":"1f469-200d-1f469-200d-1f467"},{"name":"woman-woman-girl-boy","image":"1f469-200d-1f469-200d-1f467-200d-1f466.png","id":"1f469-200d-1f469-200d-1f467-200d-1f466"},{"name":"woman-woman-girl-girl","image":"1f469-200d-1f469-200d-1f467-200d-1f467.png","id":"1f469-200d-1f469-200d-1f467-200d-1f467"},{"name":"womans_clothes","image":"1f45a.png","id":"1f45a"},{"name":"womans_hat","image":"1f452.png","id":"1f452"},{"name":"womens","image":"1f6ba.png","id":"1f6ba"},{"name":"world_map","image":"1f5fa.png","id":"1f5fa"},{"name":"worried","image":"1f61f.png","id":"1f61f"},{"name":"wrench","image":"1f527.png","id":"1f527"},{"name":"writing_hand","image":"270d.png","id":"270d"},{"name":"x","image":"274c.png","id":"274c"},{"name":"yellow_heart","image":"1f49b.png","id":"1f49b"},{"name":"yen","image":"1f4b4.png","id":"1f4b4"},{"name":"yin_yang","image":"262f.png","id":"262f"},{"name":"yum","image":"1f60b.png","id":"1f60b"},{"name":"zap","image":"26a1.png","id":"26a1"},{"name":"zero","image":"0030-20e3.png","id":"0030-20e3"},{"name":"zipper_mouth_face","image":"1f910.png","id":"1f910"},{"name":"zzz","image":"1f4a4.png","id":"1f4a4"}] \ No newline at end of file diff --git a/gulpfile.js b/gulpfile.js index 00ad4fbd..7b769f5c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,4 +1,5 @@ var gulp = require("gulp"), + fs = require('fs'), imagemin = require("gulp-imagemin"), jade = require("gulp-jade"), coffee = require("gulp-coffee"), @@ -51,7 +52,6 @@ paths.dist = "dist/"; paths.distVersion = paths.dist + version + "/"; paths.tmp = "tmp/"; paths.extras = "extras/"; -paths.vendor = "vendor/"; paths.modules = "node_modules/"; paths.jade = [ @@ -68,10 +68,14 @@ paths.htmlPartials = [ paths.images = paths.app + "images/**/*"; paths.svg = paths.app + "svg/**/*"; paths.css_vendor = [ - paths.vendor + "intro.js/introjs.css", - paths.vendor + "dragula.js/dist/dragula.css", + paths.modules + "intro.js/introjs.css", + paths.modules + "dragula.js/dist/dragula.css", paths.modules + "awesomplete/awesomplete.css", - paths.app + "styles/vendor/*.css" + paths.app + "styles/vendor/*.css", + paths.modules + "medium-editor/dist/css/medium-editor.css", + paths.modules + "medium-editor/dist/css/themes/default.css", + paths.modules + "highlight.js/styles/default.css", + paths.modules + "prismjs/themes/prism-okaidia.css" ]; paths.locales = paths.app + "locales/**/*.json"; paths.modulesLocales = paths.app + "modules/**/locales/*.json"; @@ -149,45 +153,58 @@ paths.coffee_order = [ ]; paths.libs = [ - paths.vendor + "bluebird/js/browser/bluebird.js", - paths.vendor + "jquery/dist/jquery.js", - paths.vendor + "lodash/lodash.js", - paths.vendor + "emoticons/lib/emoticons.js", - paths.vendor + "messageformat/messageformat.js", - paths.vendor + "angular/angular.js", - paths.vendor + "angular-route/angular-route.js", - paths.vendor + "angular-sanitize/angular-sanitize.js", - paths.vendor + "angular-animate/angular-animate.js", - paths.vendor + "angular-aria/angular-aria.js", - paths.vendor + "angular-translate/angular-translate.js", - paths.vendor + "angular-translate-loader-partial/angular-translate-loader-partial.js", - paths.vendor + "angular-translate-loader-static-files/angular-translate-loader-static-files.js", - paths.vendor + "angular-translate-interpolation-messageformat/angular-translate-interpolation-messageformat.js", - paths.vendor + "moment/moment.js", - paths.vendor + "checksley/checksley.js", - paths.vendor + "pikaday/pikaday.js", - paths.vendor + "jquery-flot/jquery.flot.js", - paths.vendor + "jquery-flot/jquery.flot.pie.js", - paths.vendor + "jquery-flot/jquery.flot.time.js", - paths.vendor + "flot-axislabels/jquery.flot.axislabels.js", - paths.vendor + "flot.tooltip/js/jquery.flot.tooltip.js", - paths.vendor + "jquery-textcomplete/dist/jquery.textcomplete.js", - paths.vendor + "markitup-1x/markitup/jquery.markitup.js", - paths.vendor + "raven-js/dist/raven.js", - paths.vendor + "l.js/l.js", - paths.vendor + "messageformat/locale/*.js", - paths.vendor + "ng-infinite-scroll-npm-is-better-than-bower/build/ng-infinite-scroll.js", - paths.vendor + "immutable/dist/immutable.js", - paths.vendor + "intro.js/intro.js", - paths.vendor + "dragula.js/dist/dragula.js", + paths.modules + "bluebird/js/browser/bluebird.js", + paths.modules + "jquery/dist/jquery.js", + paths.modules + "lodash/lodash.js", + paths.modules + "messageformat/messageformat.js", + paths.modules + "angular/angular.js", + paths.modules + "angular-route/angular-route.js", + paths.modules + "angular-sanitize/angular-sanitize.js", + paths.modules + "angular-animate/angular-animate.js", + paths.modules + "angular-aria/angular-aria.js", + paths.modules + "angular-translate/dist/angular-translate.js", + paths.modules + "angular-translate-loader-partial/angular-translate-loader-partial.js", + paths.modules + "angular-translate-loader-static-files/angular-translate-loader-static-files.js", + paths.modules + "angular-translate-interpolation-messageformat/angular-translate-interpolation-messageformat.js", + paths.modules + "moment/moment.js", + paths.modules + "checksley/checksley.js", + paths.modules + "pikaday/pikaday.js", + paths.modules + "Flot/jquery.flot.js", + paths.modules + "Flot/jquery.flot.pie.js", + paths.modules + "Flot/jquery.flot.time.js", + paths.modules + "flot-axislabels/jquery.flot.axislabels.js", + paths.modules + "jquery.flot.tooltip/js/jquery.flot.tooltip.js", + paths.modules + "raven-js/dist/raven.js", + paths.modules + "l.js/l.js", + paths.modules + "ng-infinite-scroll/build/ng-infinite-scroll.js", + paths.modules + "immutable/dist/immutable.js", + paths.modules + "intro.js/intro.js", + paths.modules + "dragula/dist/dragula.js", + paths.modules + "awesomplete/awesomplete.js", + paths.modules + "medium-editor/dist/js/medium-editor.js", + paths.modules + "to-markdown/dist/to-markdown.js", + paths.modules + "markdown-it/dist/markdown-it.js", + paths.modules + "highlight.js/lib/highlight.js", + paths.modules + "prismjs/prism.js", + paths.modules + "medium-editor-autolist/dist/autolist.js", paths.app + "js/dom-autoscroller.js", paths.app + "js/dragula-drag-multiple.js", paths.app + "js/tg-repeat.js", paths.app + "js/sha1-custom.js", paths.app + "js/murmurhash3_gc.js", - paths.modules + "awesomplete/awesomplete.js" + paths.app + "js/medium-mention.js" ]; +paths.libs.forEach(function(file) { + try { + // Query the entry + stats = fs.lstatSync(file); + } + catch (e) { + console.log(file); + } +}); + var isDeploy = argv["_"].indexOf("deploy") !== -1; /* @@ -246,7 +263,6 @@ gulp.task("jade-watch", function(cb) { gulp.task("scss-lint", [], function() { var ignore = [ "!" + paths.app + "/styles/shame/**/*.scss", - "!" + paths.app + "/styles/components/markitup.scss" ]; var fail = process.argv.indexOf("--fail") !== -1; @@ -388,6 +404,76 @@ gulp.task("styles-dependencies", function(cb) { # JS Related tasks ############################################################################## */ + +gulp.task("prism-languages", function(cb) { + var files = fs.readdirSync(paths.modules + "prismjs/components"); + + files = files.filter(function(file) { + return file.indexOf('.min.js') != -1; + }); + + files = files.map(function(file) { + return { + file: file, + name: /prism-(.*)\.min\.js/g.exec(file)[1] + }; + }); + + var filesStr = JSON.stringify(files); + + fs.writeFileSync(__dirname + '/prism-languages.json', filesStr, { + flag: 'w+' + }); + + cb(); +}); + +gulp.task("emoji", function(cb) { + // don't add to package.json + var Jimp = require("jimp"); + + //var emojiFolder = ""; + var emojiPath = "../emoji-data/"; + + var emojis = require(emojiPath + "emoji.json"); + + emojis = emojis.filter(function(emoji) { + return emoji.has_img_twitter; + }); + + emojis = emojis.map(function(emoji) { + return { + name: emoji.short_name, + image: emoji.image, + id: emoji.unified.toLowerCase() + }; + }); + + emojis = emojis.sort(function(a, b) { + if(a.name < b.name) return -1; + if(a.name > b.name) return 1; + return 0; + }); + + emojis.forEach(function(emoji) { + Jimp.read(emojiPath + "img-twitter-64/" + emoji.image, function (err, lenna) { + if (err) throw err; + + lenna + .resize(16, 16) + .quality(100) + .write(__dirname + '/emojis/' + emoji.image); + }); + }); + + var emojisStr = JSON.stringify(emojis); + fs.writeFileSync(__dirname + '/emojis/emojis-data.json', emojisStr, { + flag: 'w+' + }); + + cb(); +}); + gulp.task("conf", function() { return gulp.src(["conf/conf.example.json"]) .pipe(gulp.dest(paths.dist)); @@ -460,7 +546,7 @@ gulp.task("coffee", function() { }); gulp.task("moment-locales", function() { - return gulp.src(paths.vendor + "moment/locale/*") + return gulp.src(paths.modules + "moment/locale/*") .pipe(gulpif(isDeploy, uglify())) .pipe(gulp.dest(paths.distVersion + "locales/moment-locales/")); }); @@ -528,6 +614,22 @@ gulp.task("copy-images", function() { .pipe(gulp.dest(paths.distVersion + "/images/")); }); +gulp.task("copy-emojis", function() { + return gulp.src([__dirname + "/emojis/*"]) + .pipe(gulp.dest(paths.distVersion + "/emojis/")); +}); + +gulp.task("copy-prism", ["prism-languages"], function() { + var prismLanguages = require(__dirname + '/prism-languages.json'); + + prismLanguages = prismLanguages.map(function(it) { + return paths.modules + "prismjs/components/" + it.file; + }); + + return gulp.src(prismLanguages.concat(__dirname + '/prism-languages.json')) + .pipe(gulp.dest(paths.distVersion + "/prism/")); +}); + gulp.task("copy-theme-images", function() { return gulp.src(themes.current.path + "/images/**/*") .pipe(gulpif(isDeploy, imagemin({progressive: true}))) @@ -543,6 +645,8 @@ gulp.task("copy", [ "copy-fonts", "copy-theme-fonts", "copy-images", + "copy-emojis", + "copy-prism", "copy-theme-images", "copy-svg", "copy-theme-svg", @@ -578,11 +682,13 @@ gulp.task("express", function() { app.use("/" + version + "/js", express.static(__dirname + "/dist/" + version + "/js")); app.use("/" + version + "/styles", express.static(__dirname + "/dist/" + version + "/styles")); app.use("/" + version + "/images", express.static(__dirname + "/dist/" + version + "/images")); + app.use("/" + version + "/emojis", express.static(__dirname + "/dist/" + version + "/emojis")); app.use("/" + version + "/svg", express.static(__dirname + "/dist/" + version + "/svg")); app.use("/" + version + "/partials", express.static(__dirname + "/dist/" + version + "/partials")); app.use("/" + version + "/fonts", express.static(__dirname + "/dist/" + version + "/fonts")); app.use("/" + version + "/locales", express.static(__dirname + "/dist/" + version + "/locales")); app.use("/" + version + "/maps", express.static(__dirname + "/dist/" + version + "/maps")); + app.use("/" + version + "/prism", express.static(__dirname + "/dist/" + version + "/prism")); app.use("/plugins", express.static(__dirname + "/dist/plugins")); app.use("/conf.json", express.static(__dirname + "/dist/conf.json")); app.use(require('connect-livereload')({ diff --git a/package.json b/package.json index 2849caf4..a54865f1 100644 --- a/package.json +++ b/package.json @@ -99,7 +99,42 @@ "scss-lint" ], "dependencies": { + "Flot": "git+https://github.com/flot/flot.git", + "angular": "1.5.5", + "angular-animate": "1.5.5", + "angular-aria": "1.5.5", + "angular-route": "1.5.5", + "angular-sanitize": "1.5.5", + "angular-translate": "2.10.0", + "angular-translate-interpolation-messageformat": "2.10.0", + "angular-translate-loader-partial": "2.10.0", + "angular-translate-loader-static-files": "2.10.0", "awesomplete": "^1.0.0", - "dom-autoscroller": "^1.3.1" + "bluebird": "^3.4.6", + "bourbon": "git+https://github.com/thoughtbot/bourbon.git", + "checksley": "git+https://github.com/jespino/checksley-bower.git", + "dom-autoscroller": "^1.3.1", + "dragula": "^3.7.2", + "flot-axislabels": "git+https://git@github.com/juanfran/flot-axislabels.git", + "highlight.js": "^9.7.0", + "immutable": "^3.8.1", + "intro.js": "^2.3.0", + "jquery": "^2.2.3", + "jquery.flot.tooltip": "git+https://git@github.com/krzysu/flot.tooltip.git", + "l.js": "git+https://git@github.com/juanfran/l.js.git", + "lodash": "^4.16.4", + "markdown-it": "^8.0.1", + "markdown-it-task-lists": "^1.4.1", + "medium-editor": "^5.21.1", + "medium-editor-autolist": "git+https://github.com/gruberro/medium-editor-autolist.git#add-package-json", + "medium-editor-tc-mention": "^2.2.4", + "messageformat": "^1.0.2", + "moment": "^2.15.1", + "ng-infinite-scroll": "^1.3.0", + "pikaday": "^1.4.0", + "prismjs": "^1.5.1", + "raven-js": "^3.7.0", + "showdown": "^1.4.3", + "to-markdown": "^3.0.1" } } diff --git a/prism-languages.json b/prism-languages.json new file mode 100644 index 00000000..be5b8e15 --- /dev/null +++ b/prism-languages.json @@ -0,0 +1 @@ +[{"file":"prism-abap.min.js","name":"abap"},{"file":"prism-actionscript.min.js","name":"actionscript"},{"file":"prism-apacheconf.min.js","name":"apacheconf"},{"file":"prism-apl.min.js","name":"apl"},{"file":"prism-applescript.min.js","name":"applescript"},{"file":"prism-asciidoc.min.js","name":"asciidoc"},{"file":"prism-aspnet.min.js","name":"aspnet"},{"file":"prism-autohotkey.min.js","name":"autohotkey"},{"file":"prism-autoit.min.js","name":"autoit"},{"file":"prism-bash.min.js","name":"bash"},{"file":"prism-basic.min.js","name":"basic"},{"file":"prism-batch.min.js","name":"batch"},{"file":"prism-bison.min.js","name":"bison"},{"file":"prism-brainfuck.min.js","name":"brainfuck"},{"file":"prism-bro.min.js","name":"bro"},{"file":"prism-c.min.js","name":"c"},{"file":"prism-clike.min.js","name":"clike"},{"file":"prism-coffeescript.min.js","name":"coffeescript"},{"file":"prism-core.min.js","name":"core"},{"file":"prism-cpp.min.js","name":"cpp"},{"file":"prism-crystal.min.js","name":"crystal"},{"file":"prism-csharp.min.js","name":"csharp"},{"file":"prism-css-extras.min.js","name":"css-extras"},{"file":"prism-css.min.js","name":"css"},{"file":"prism-d.min.js","name":"d"},{"file":"prism-dart.min.js","name":"dart"},{"file":"prism-diff.min.js","name":"diff"},{"file":"prism-docker.min.js","name":"docker"},{"file":"prism-eiffel.min.js","name":"eiffel"},{"file":"prism-elixir.min.js","name":"elixir"},{"file":"prism-erlang.min.js","name":"erlang"},{"file":"prism-fortran.min.js","name":"fortran"},{"file":"prism-fsharp.min.js","name":"fsharp"},{"file":"prism-gherkin.min.js","name":"gherkin"},{"file":"prism-git.min.js","name":"git"},{"file":"prism-glsl.min.js","name":"glsl"},{"file":"prism-go.min.js","name":"go"},{"file":"prism-groovy.min.js","name":"groovy"},{"file":"prism-haml.min.js","name":"haml"},{"file":"prism-handlebars.min.js","name":"handlebars"},{"file":"prism-haskell.min.js","name":"haskell"},{"file":"prism-haxe.min.js","name":"haxe"},{"file":"prism-http.min.js","name":"http"},{"file":"prism-icon.min.js","name":"icon"},{"file":"prism-inform7.min.js","name":"inform7"},{"file":"prism-ini.min.js","name":"ini"},{"file":"prism-j.min.js","name":"j"},{"file":"prism-jade.min.js","name":"jade"},{"file":"prism-java.min.js","name":"java"},{"file":"prism-javascript.min.js","name":"javascript"},{"file":"prism-json.min.js","name":"json"},{"file":"prism-jsx.min.js","name":"jsx"},{"file":"prism-julia.min.js","name":"julia"},{"file":"prism-keyman.min.js","name":"keyman"},{"file":"prism-kotlin.min.js","name":"kotlin"},{"file":"prism-latex.min.js","name":"latex"},{"file":"prism-less.min.js","name":"less"},{"file":"prism-lolcode.min.js","name":"lolcode"},{"file":"prism-lua.min.js","name":"lua"},{"file":"prism-makefile.min.js","name":"makefile"},{"file":"prism-markdown.min.js","name":"markdown"},{"file":"prism-markup.min.js","name":"markup"},{"file":"prism-matlab.min.js","name":"matlab"},{"file":"prism-mel.min.js","name":"mel"},{"file":"prism-mizar.min.js","name":"mizar"},{"file":"prism-monkey.min.js","name":"monkey"},{"file":"prism-nasm.min.js","name":"nasm"},{"file":"prism-nginx.min.js","name":"nginx"},{"file":"prism-nim.min.js","name":"nim"},{"file":"prism-nix.min.js","name":"nix"},{"file":"prism-nsis.min.js","name":"nsis"},{"file":"prism-objectivec.min.js","name":"objectivec"},{"file":"prism-ocaml.min.js","name":"ocaml"},{"file":"prism-oz.min.js","name":"oz"},{"file":"prism-parigp.min.js","name":"parigp"},{"file":"prism-parser.min.js","name":"parser"},{"file":"prism-pascal.min.js","name":"pascal"},{"file":"prism-perl.min.js","name":"perl"},{"file":"prism-php-extras.min.js","name":"php-extras"},{"file":"prism-php.min.js","name":"php"},{"file":"prism-powershell.min.js","name":"powershell"},{"file":"prism-processing.min.js","name":"processing"},{"file":"prism-prolog.min.js","name":"prolog"},{"file":"prism-protobuf.min.js","name":"protobuf"},{"file":"prism-puppet.min.js","name":"puppet"},{"file":"prism-pure.min.js","name":"pure"},{"file":"prism-python.min.js","name":"python"},{"file":"prism-q.min.js","name":"q"},{"file":"prism-qore.min.js","name":"qore"},{"file":"prism-r.min.js","name":"r"},{"file":"prism-rest.min.js","name":"rest"},{"file":"prism-rip.min.js","name":"rip"},{"file":"prism-roboconf.min.js","name":"roboconf"},{"file":"prism-ruby.min.js","name":"ruby"},{"file":"prism-rust.min.js","name":"rust"},{"file":"prism-sas.min.js","name":"sas"},{"file":"prism-sass.min.js","name":"sass"},{"file":"prism-scala.min.js","name":"scala"},{"file":"prism-scheme.min.js","name":"scheme"},{"file":"prism-scss.min.js","name":"scss"},{"file":"prism-smalltalk.min.js","name":"smalltalk"},{"file":"prism-smarty.min.js","name":"smarty"},{"file":"prism-sql.min.js","name":"sql"},{"file":"prism-stylus.min.js","name":"stylus"},{"file":"prism-swift.min.js","name":"swift"},{"file":"prism-tcl.min.js","name":"tcl"},{"file":"prism-textile.min.js","name":"textile"},{"file":"prism-twig.min.js","name":"twig"},{"file":"prism-typescript.min.js","name":"typescript"},{"file":"prism-verilog.min.js","name":"verilog"},{"file":"prism-vhdl.min.js","name":"vhdl"},{"file":"prism-vim.min.js","name":"vim"},{"file":"prism-wiki.min.js","name":"wiki"},{"file":"prism-yaml.min.js","name":"yaml"}] \ No newline at end of file