Related
I've a little problem.
I'm using NodeJS as backend. Now, an user has a field "biography", where the user can write something about himself.
Suppose that this field has 220 maxlength, and suppose this as input:
👶🏻👦🏻👧🏻👨🏻👩🏻👱🏻♀️👱🏻👴🏻👵🏻👲🏻👳🏻♀️👳🏻👮🏻♀️👮🏻👷🏻♀️👷🏻💂🏻♀️💂🏻🕵🏻♀️👩🏻⚕️👨🏻⚕️👩🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾
As you can see there aren't 220 emojis (there are 37 emojis), but if I do in my nodejs server
console.log(bio.length)
where bio is the input text, I got 221. How could I "parse" the string input to get the correct length? Is it a problem about unicode?
SOLVED
I used this library: https://github.com/orling/grapheme-splitter
I tried that:
var Grapheme = require('grapheme-splitter');
var splitter = new Grapheme();
console.log(splitter.splitGraphemes(bio).length);
and the length is 37. It works very well!
str.length gives the count of UTF-16 units.
Unicode-proof way to get string length in codepoints (in characters) is [...str].length as iterable protocol splits the string to codepoints.
If we need the length in graphemes (grapheme clusters), we have these native ways:
a. Unicode property escapes in RegExp. See for example: Unicode-aware version of \w or Matching emoji.
b. Intl.Segmenter — coming soon, probably in ES2021. Can be tested with a flag in the last V8 versions (realization was synced with the last spec in V8 86). Unflagged (shipped) in V8 87.
See also:
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
What every JavaScript developer should know about Unicode
JavaScript has a Unicode problem
Unicode-aware regular expressions in ES2015
ES6 Strings (and Unicode, ❤) in Depth
JavaScript for impatient programmers. Unicode – a brief introduction
TL;DR there are solutions, but they don’t work in every case. Unicode can feel like a dark art.
There seems to be limitations in various solutions I have seen presented, with the issue going beyond emojis and covering other characters in the Unicode range. Consider é can be stored as é or e + ‘, if using combing characters. This can even lead to two strings that look the same not being equal. Also note, in certain cases a single emoji can be 11 characters when stored and as a result 22 bytes, assuming UTF16.
The way this is handled and how characters are combined, or displayed, can even vary between browsers and operating systems. So, while you may think you cracked it, there is a risk another environment breaks this. Be sure to test where it matters.
Now, there is the front-end vs back-end problem: you solved the character count problem so it works well for human users, now your single emoji blows right past the allocated field size in the database. Less of an issue with databases such as mongo, but can be one with SQL databases, where field allocation was conservative. This means how you solve your problem will depend where the hardest limitation comes in.
Note, that a basic solution does involve converting a string to an array and getting the length, accepting limitations:
Array.from(str)
This will fall apart when characters are combined and dealing with astral planes.
A few high level approaches, that take into account limitations:
use approaches that solve the front-end issue, as best as possible, and then ensure storage issues are resolved
be more conservative with the advertised front-end limits, if the database or other storage can’t be adjusted
limit the character types that can be entered
clearly indicate limitations of the length calculation
Additionally, given the complexity of the issue it may be worth seeing if there is a popular JS library that already deals with this? I did not find one at the time of writing. Hopefully this is something that would become core to Javascript at some point.
Other pages to read:
https://blog.jonnew.com/posts/poo-dot-length-equals-two
https://mathiasbynens.be/notes/javascript-unicode
https://www.contentful.com/blog/2016/12/06/unicode-javascript-and-the-emoji-family/
https://dmitripavlutin.com/what-every-javascript-developer-should-know-about-unicode/
I answered to a similar question here
But basically, here it is :
'👍'.match(/./gu).length == 1
As :
'👍'.length == 2
More precision in my original post
function fancyCount2(str){
const joiner = "\u{200D}";
const split = str.split(joiner);
let count = 0;
for(const s of split){
//removing the variation selectors
const num = Array.from(s.split(/[\ufe00-\ufe0f]/).join("")).length;
count += num;
}
//assuming the joiners are used appropriately
return count / split.length;
}
With a regex that can parse emojis, this can be done easily and without the use of external libraries. Please see the code snippets for examples. 👷🏻♀️
Note that grapheme-splitter as suggested in the question will overcount and split apart compound emojis that contain other emojis, such as this one: 🧑🏻🤝🧑🏻. This is reported as three distinct "graphemes", 🧑🏻 and 🤝 and 🧑🏻
Here we are using the 'compact', literal version so it'll fit, but there's a safe, long version that uses Unicode escapes as well.
For more info on the regex see also this answer.
/*the pattern (compact version)*/
var emojiPattern = String.raw`(?:🧑🏻❤️💋🧑🏼|🧑🏻❤️💋🧑🏽|🧑🏻❤️💋🧑🏾|🧑🏻❤️💋🧑🏿|🧑🏼❤️💋🧑🏻|🧑🏼❤️💋🧑🏽|🧑🏼❤️💋🧑🏾|🧑🏼❤️💋🧑🏿|🧑🏽❤️💋🧑🏻|🧑🏽❤️💋🧑🏼|🧑🏽❤️💋🧑🏾|🧑🏽❤️💋🧑🏿|🧑🏾❤️💋🧑🏻|🧑🏾❤️💋🧑🏼|🧑🏾❤️💋🧑🏽|🧑🏾❤️💋🧑🏿|🧑🏿❤️💋🧑🏻|🧑🏿❤️💋🧑🏼|🧑🏿❤️💋🧑🏽|🧑🏿❤️💋🧑🏾|👩🏻❤️💋👨🏻|👩🏻❤️💋👨🏼|👩🏻❤️💋👨🏽|👩🏻❤️💋👨🏾|👩🏻❤️💋👨🏿|👩🏼❤️💋👨🏻|👩🏼❤️💋👨🏼|👩🏼❤️💋👨🏽|👩🏼❤️💋👨🏾|👩🏼❤️💋👨🏿|👩🏽❤️💋👨🏻|👩🏽❤️💋👨🏼|👩🏽❤️💋👨🏽|👩🏽❤️💋👨🏾|👩🏽❤️💋👨🏿|👩🏾❤️💋👨🏻|👩🏾❤️💋👨🏼|👩🏾❤️💋👨🏽|👩🏾❤️💋👨🏾|👩🏾❤️💋👨🏿|👩🏿❤️💋👨🏻|👩🏿❤️💋👨🏼|👩🏿❤️💋👨🏽|👩🏿❤️💋👨🏾|👩🏿❤️💋👨🏿|👨🏻❤️💋👨🏻|👨🏻❤️💋👨🏼|👨🏻❤️💋👨🏽|👨🏻❤️💋👨🏾|👨🏻❤️💋👨🏿|👨🏼❤️💋👨🏻|👨🏼❤️💋👨🏼|👨🏼❤️💋👨🏽|👨🏼❤️💋👨🏾|👨🏼❤️💋👨🏿|👨🏽❤️💋👨🏻|👨🏽❤️💋👨🏼|👨🏽❤️💋👨🏽|👨🏽❤️💋👨🏾|👨🏽❤️💋👨🏿|👨🏾❤️💋👨🏻|👨🏾❤️💋👨🏼|👨🏾❤️💋👨🏽|👨🏾❤️💋👨🏾|👨🏾❤️💋👨🏿|👨🏿❤️💋👨🏻|👨🏿❤️💋👨🏼|👨🏿❤️💋👨🏽|👨🏿❤️💋👨🏾|👨🏿❤️💋👨🏿|👩🏻❤️💋👩🏻|👩🏻❤️💋👩🏼|👩🏻❤️💋👩🏽|👩🏻❤️💋👩🏾|👩🏻❤️💋👩🏿|👩🏼❤️💋👩🏻|👩🏼❤️💋👩🏼|👩🏼❤️💋👩🏽|👩🏼❤️💋👩🏾|👩🏼❤️💋👩🏿|👩🏽❤️💋👩🏻|👩🏽❤️💋👩🏼|👩🏽❤️💋👩🏽|👩🏽❤️💋👩🏾|👩🏽❤️💋👩🏿|👩🏾❤️💋👩🏻|👩🏾❤️💋👩🏼|👩🏾❤️💋👩🏽|👩🏾❤️💋👩🏾|👩🏾❤️💋👩🏿|👩🏿❤️💋👩🏻|👩🏿❤️💋👩🏼|👩🏿❤️💋👩🏽|👩🏿❤️💋👩🏾|👩🏿❤️💋👩🏿|🏴|🏴|🏴|🧑🏻🤝🧑🏻|🧑🏻🤝🧑🏼|🧑🏻🤝🧑🏽|🧑🏻🤝🧑🏾|🧑🏻🤝🧑🏿|🧑🏼🤝🧑🏻|🧑🏼🤝🧑🏼|🧑🏼🤝🧑🏽|🧑🏼🤝🧑🏾|🧑🏼🤝🧑🏿|🧑🏽🤝🧑🏻|🧑🏽🤝🧑🏼|🧑🏽🤝🧑🏽|🧑🏽🤝🧑🏾|🧑🏽🤝🧑🏿|🧑🏾🤝🧑🏻|🧑🏾🤝🧑🏼|🧑🏾🤝🧑🏽|🧑🏾🤝🧑🏾|🧑🏾🤝🧑🏿|🧑🏿🤝🧑🏻|🧑🏿🤝🧑🏼|🧑🏿🤝🧑🏽|🧑🏿🤝🧑🏾|🧑🏿🤝🧑🏿|👩🏻🤝👩🏼|👩🏻🤝👩🏽|👩🏻🤝👩🏾|👩🏻🤝👩🏿|👩🏼🤝👩🏻|👩🏼🤝👩🏽|👩🏼🤝👩🏾|👩🏼🤝👩🏿|👩🏽🤝👩🏻|👩🏽🤝👩🏼|👩🏽🤝👩🏾|👩🏽🤝👩🏿|👩🏾🤝👩🏻|👩🏾🤝👩🏼|👩🏾🤝👩🏽|👩🏾🤝👩🏿|👩🏿🤝👩🏻|👩🏿🤝👩🏼|👩🏿🤝👩🏽|👩🏿🤝👩🏾|👩🏻🤝👨🏼|👩🏻🤝👨🏽|👩🏻🤝👨🏾|👩🏻🤝👨🏿|👩🏼🤝👨🏻|👩🏼🤝👨🏽|👩🏼🤝👨🏾|👩🏼🤝👨🏿|👩🏽🤝👨🏻|👩🏽🤝👨🏼|👩🏽🤝👨🏾|👩🏽🤝👨🏿|👩🏾🤝👨🏻|👩🏾🤝👨🏼|👩🏾🤝👨🏽|👩🏾🤝👨🏿|👩🏿🤝👨🏻|👩🏿🤝👨🏼|👩🏿🤝👨🏽|👩🏿🤝👨🏾|👨🏻🤝👨🏼|👨🏻🤝👨🏽|👨🏻🤝👨🏾|👨🏻🤝👨🏿|👨🏼🤝👨🏻|👨🏼🤝👨🏽|👨🏼🤝👨🏾|👨🏼🤝👨🏿|👨🏽🤝👨🏻|👨🏽🤝👨🏼|👨🏽🤝👨🏾|👨🏽🤝👨🏿|👨🏾🤝👨🏻|👨🏾🤝👨🏼|👨🏾🤝👨🏽|👨🏾🤝👨🏿|👨🏿🤝👨🏻|👨🏿🤝👨🏼|👨🏿🤝👨🏽|👨🏿🤝👨🏾|🧑🏻❤️🧑🏼|🧑🏻❤️🧑🏽|🧑🏻❤️🧑🏾|🧑🏻❤️🧑🏿|🧑🏼❤️🧑🏻|🧑🏼❤️🧑🏽|🧑🏼❤️🧑🏾|🧑🏼❤️🧑🏿|🧑🏽❤️🧑🏻|🧑🏽❤️🧑🏼|🧑🏽❤️🧑🏾|🧑🏽❤️🧑🏿|🧑🏾❤️🧑🏻|🧑🏾❤️🧑🏼|🧑🏾❤️🧑🏽|🧑🏾❤️🧑🏿|🧑🏿❤️🧑🏻|🧑🏿❤️🧑🏼|🧑🏿❤️🧑🏽|🧑🏿❤️🧑🏾|👩🏻❤️👨🏻|👩🏻❤️👨🏼|👩🏻❤️👨🏽|👩🏻❤️👨🏾|👩🏻❤️👨🏿|👩🏼❤️👨🏻|👩🏼❤️👨🏼|👩🏼❤️👨🏽|👩🏼❤️👨🏾|👩🏼❤️👨🏿|👩🏽❤️👨🏻|👩🏽❤️👨🏼|👩🏽❤️👨🏽|👩🏽❤️👨🏾|👩🏽❤️👨🏿|👩🏾❤️👨🏻|👩🏾❤️👨🏼|👩🏾❤️👨🏽|👩🏾❤️👨🏾|👩🏾❤️👨🏿|👩🏿❤️👨🏻|👩🏿❤️👨🏼|👩🏿❤️👨🏽|👩🏿❤️👨🏾|👩🏿❤️👨🏿|👨🏻❤️👨🏻|👨🏻❤️👨🏼|👨🏻❤️👨🏽|👨🏻❤️👨🏾|👨🏻❤️👨🏿|👨🏼❤️👨🏻|👨🏼❤️👨🏼|👨🏼❤️👨🏽|👨🏼❤️👨🏾|👨🏼❤️👨🏿|👨🏽❤️👨🏻|👨🏽❤️👨🏼|👨🏽❤️👨🏽|👨🏽❤️👨🏾|👨🏽❤️👨🏿|👨🏾❤️👨🏻|👨🏾❤️👨🏼|👨🏾❤️👨🏽|👨🏾❤️👨🏾|👨🏾❤️👨🏿|👨🏿❤️👨🏻|👨🏿❤️👨🏼|👨🏿❤️👨🏽|👨🏿❤️👨🏾|👨🏿❤️👨🏿|👩🏻❤️👩🏻|👩🏻❤️👩🏼|👩🏻❤️👩🏽|👩🏻❤️👩🏾|👩🏻❤️👩🏿|👩🏼❤️👩🏻|👩🏼❤️👩🏼|👩🏼❤️👩🏽|👩🏼❤️👩🏾|👩🏼❤️👩🏿|👩🏽❤️👩🏻|👩🏽❤️👩🏼|👩🏽❤️👩🏽|👩🏽❤️👩🏾|👩🏽❤️👩🏿|👩🏾❤️👩🏻|👩🏾❤️👩🏼|👩🏾❤️👩🏽|👩🏾❤️👩🏾|👩🏾❤️👩🏿|👩🏿❤️👩🏻|👩🏿❤️👩🏼|👩🏿❤️👩🏽|👩🏿❤️👩🏾|👩🏿❤️👩🏿|👩❤️💋👨|👨❤️💋👨|👩❤️💋👩|👨👩👧👦|👨👩👦👦|👨👩👧👧|👨👨👧👦|👨👨👦👦|👨👨👧👧|👩👩👧👦|👩👩👦👦|👩👩👧👧|🧑🤝🧑|👩❤️👨|👨❤️👨|👩❤️👩|👨👩👦|👨👩👧|👨👨👦|👨👨👧|👩👩👦|👩👩👧|👨👦👦|👨👧👦|👨👧👧|👩👦👦|👩👧👦|👩👧👧|👁️🗨️|🧔🏻♂️|🧔🏼♂️|🧔🏽♂️|🧔🏾♂️|🧔🏿♂️|🧔🏻♀️|🧔🏼♀️|🧔🏽♀️|🧔🏾♀️|🧔🏿♀️|👨🏻🦰|👨🏼🦰|👨🏽🦰|👨🏾🦰|👨🏿🦰|👨🏻🦱|👨🏼🦱|👨🏽🦱|👨🏾🦱|👨🏿🦱|👨🏻🦳|👨🏼🦳|👨🏽🦳|👨🏾🦳|👨🏿🦳|👨🏻🦲|👨🏼🦲|👨🏽🦲|👨🏾🦲|👨🏿🦲|👩🏻🦰|👩🏼🦰|👩🏽🦰|👩🏾🦰|👩🏿🦰|🧑🏻🦰|🧑🏼🦰|🧑🏽🦰|🧑🏾🦰|🧑🏿🦰|👩🏻🦱|👩🏼🦱|👩🏽🦱|👩🏾🦱|👩🏿🦱|🧑🏻🦱|🧑🏼🦱|🧑🏽🦱|🧑🏾🦱|🧑🏿🦱|👩🏻🦳|👩🏼🦳|👩🏽🦳|👩🏾🦳|👩🏿🦳|🧑🏻🦳|🧑🏼🦳|🧑🏽🦳|🧑🏾🦳|🧑🏿🦳|👩🏻🦲|👩🏼🦲|👩🏽🦲|👩🏾🦲|👩🏿🦲|🧑🏻🦲|🧑🏼🦲|🧑🏽🦲|🧑🏾🦲|🧑🏿🦲|👱🏻♀️|👱🏼♀️|👱🏽♀️|👱🏾♀️|👱🏿♀️|👱🏻♂️|👱🏼♂️|👱🏽♂️|👱🏾♂️|👱🏿♂️|🙍🏻♂️|🙍🏼♂️|🙍🏽♂️|🙍🏾♂️|🙍🏿♂️|🙍🏻♀️|🙍🏼♀️|🙍🏽♀️|🙍🏾♀️|🙍🏿♀️|🙎🏻♂️|🙎🏼♂️|🙎🏽♂️|🙎🏾♂️|🙎🏿♂️|🙎🏻♀️|🙎🏼♀️|🙎🏽♀️|🙎🏾♀️|🙎🏿♀️|🙅🏻♂️|🙅🏼♂️|🙅🏽♂️|🙅🏾♂️|🙅🏿♂️|🙅🏻♀️|🙅🏼♀️|🙅🏽♀️|🙅🏾♀️|🙅🏿♀️|🙆🏻♂️|🙆🏼♂️|🙆🏽♂️|🙆🏾♂️|🙆🏿♂️|🙆🏻♀️|🙆🏼♀️|🙆🏽♀️|🙆🏾♀️|🙆🏿♀️|💁🏻♂️|💁🏼♂️|💁🏽♂️|💁🏾♂️|💁🏿♂️|💁🏻♀️|💁🏼♀️|💁🏽♀️|💁🏾♀️|💁🏿♀️|🙋🏻♂️|🙋🏼♂️|🙋🏽♂️|🙋🏾♂️|🙋🏿♂️|🙋🏻♀️|🙋🏼♀️|🙋🏽♀️|🙋🏾♀️|🙋🏿♀️|🧏🏻♂️|🧏🏼♂️|🧏🏽♂️|🧏🏾♂️|🧏🏿♂️|🧏🏻♀️|🧏🏼♀️|🧏🏽♀️|🧏🏾♀️|🧏🏿♀️|🙇🏻♂️|🙇🏼♂️|🙇🏽♂️|🙇🏾♂️|🙇🏿♂️|🙇🏻♀️|🙇🏼♀️|🙇🏽♀️|🙇🏾♀️|🙇🏿♀️|🤦🏻♂️|🤦🏼♂️|🤦🏽♂️|🤦🏾♂️|🤦🏿♂️|🤦🏻♀️|🤦🏼♀️|🤦🏽♀️|🤦🏾♀️|🤦🏿♀️|🤷🏻♂️|🤷🏼♂️|🤷🏽♂️|🤷🏾♂️|🤷🏿♂️|🤷🏻♀️|🤷🏼♀️|🤷🏽♀️|🤷🏾♀️|🤷🏿♀️|🧑🏻⚕️|🧑🏼⚕️|🧑🏽⚕️|🧑🏾⚕️|🧑🏿⚕️|👨🏻⚕️|👨🏼⚕️|👨🏽⚕️|👨🏾⚕️|👨🏿⚕️|👩🏻⚕️|👩🏼⚕️|👩🏽⚕️|👩🏾⚕️|👩🏿⚕️|🧑🏻🎓|🧑🏼🎓|🧑🏽🎓|🧑🏾🎓|🧑🏿🎓|👨🏻🎓|👨🏼🎓|👨🏽🎓|👨🏾🎓|👨🏿🎓|👩🏻🎓|👩🏼🎓|👩🏽🎓|👩🏾🎓|👩🏿🎓|🧑🏻🏫|🧑🏼🏫|🧑🏽🏫|🧑🏾🏫|🧑🏿🏫|👨🏻🏫|👨🏼🏫|👨🏽🏫|👨🏾🏫|👨🏿🏫|👩🏻🏫|👩🏼🏫|👩🏽🏫|👩🏾🏫|👩🏿🏫|🧑🏻⚖️|🧑🏼⚖️|🧑🏽⚖️|🧑🏾⚖️|🧑🏿⚖️|👨🏻⚖️|👨🏼⚖️|👨🏽⚖️|👨🏾⚖️|👨🏿⚖️|👩🏻⚖️|👩🏼⚖️|👩🏽⚖️|👩🏾⚖️|👩🏿⚖️|🧑🏻🌾|🧑🏼🌾|🧑🏽🌾|🧑🏾🌾|🧑🏿🌾|👨🏻🌾|👨🏼🌾|👨🏽🌾|👨🏾🌾|👨🏿🌾|👩🏻🌾|👩🏼🌾|👩🏽🌾|👩🏾🌾|👩🏿🌾|🧑🏻🍳|🧑🏼🍳|🧑🏽🍳|🧑🏾🍳|🧑🏿🍳|👨🏻🍳|👨🏼🍳|👨🏽🍳|👨🏾🍳|👨🏿🍳|👩🏻🍳|👩🏼🍳|👩🏽🍳|👩🏾🍳|👩🏿🍳|🧑🏻🔧|🧑🏼🔧|🧑🏽🔧|🧑🏾🔧|🧑🏿🔧|👨🏻🔧|👨🏼🔧|👨🏽🔧|👨🏾🔧|👨🏿🔧|👩🏻🔧|👩🏼🔧|👩🏽🔧|👩🏾🔧|👩🏿🔧|🧑🏻🏭|🧑🏼🏭|🧑🏽🏭|🧑🏾🏭|🧑🏿🏭|👨🏻🏭|👨🏼🏭|👨🏽🏭|👨🏾🏭|👨🏿🏭|👩🏻🏭|👩🏼🏭|👩🏽🏭|👩🏾🏭|👩🏿🏭|🧑🏻💼|🧑🏼💼|🧑🏽💼|🧑🏾💼|🧑🏿💼|👨🏻💼|👨🏼💼|👨🏽💼|👨🏾💼|👨🏿💼|👩🏻💼|👩🏼💼|👩🏽💼|👩🏾💼|👩🏿💼|🧑🏻🔬|🧑🏼🔬|🧑🏽🔬|🧑🏾🔬|🧑🏿🔬|👨🏻🔬|👨🏼🔬|👨🏽🔬|👨🏾🔬|👨🏿🔬|👩🏻🔬|👩🏼🔬|👩🏽🔬|👩🏾🔬|👩🏿🔬|🧑🏻💻|🧑🏼💻|🧑🏽💻|🧑🏾💻|🧑🏿💻|👨🏻💻|👨🏼💻|👨🏽💻|👨🏾💻|👨🏿💻|👩🏻💻|👩🏼💻|👩🏽💻|👩🏾💻|👩🏿💻|🧑🏻🎤|🧑🏼🎤|🧑🏽🎤|🧑🏾🎤|🧑🏿🎤|👨🏻🎤|👨🏼🎤|👨🏽🎤|👨🏾🎤|👨🏿🎤|👩🏻🎤|👩🏼🎤|👩🏽🎤|👩🏾🎤|👩🏿🎤|🧑🏻🎨|🧑🏼🎨|🧑🏽🎨|🧑🏾🎨|🧑🏿🎨|👨🏻🎨|👨🏼🎨|👨🏽🎨|👨🏾🎨|👨🏿🎨|👩🏻🎨|👩🏼🎨|👩🏽🎨|👩🏾🎨|👩🏿🎨|🧑🏻✈️|🧑🏼✈️|🧑🏽✈️|🧑🏾✈️|🧑🏿✈️|👨🏻✈️|👨🏼✈️|👨🏽✈️|👨🏾✈️|👨🏿✈️|👩🏻✈️|👩🏼✈️|👩🏽✈️|👩🏾✈️|👩🏿✈️|🧑🏻🚀|🧑🏼🚀|🧑🏽🚀|🧑🏾🚀|🧑🏿🚀|👨🏻🚀|👨🏼🚀|👨🏽🚀|👨🏾🚀|👨🏿🚀|👩🏻🚀|👩🏼🚀|👩🏽🚀|👩🏾🚀|👩🏿🚀|🧑🏻🚒|🧑🏼🚒|🧑🏽🚒|🧑🏾🚒|🧑🏿🚒|👨🏻🚒|👨🏼🚒|👨🏽🚒|👨🏾🚒|👨🏿🚒|👩🏻🚒|👩🏼🚒|👩🏽🚒|👩🏾🚒|👩🏿🚒|👮🏻♂️|👮🏼♂️|👮🏽♂️|👮🏾♂️|👮🏿♂️|👮🏻♀️|👮🏼♀️|👮🏽♀️|👮🏾♀️|👮🏿♀️|🕵🏻♂️|🕵🏼♂️|🕵🏽♂️|🕵🏾♂️|🕵🏿♂️|🕵🏻♀️|🕵🏼♀️|🕵🏽♀️|🕵🏾♀️|🕵🏿♀️|💂🏻♂️|💂🏼♂️|💂🏽♂️|💂🏾♂️|💂🏿♂️|💂🏻♀️|💂🏼♀️|💂🏽♀️|💂🏾♀️|💂🏿♀️|👷🏻♂️|👷🏼♂️|👷🏽♂️|👷🏾♂️|👷🏿♂️|👷🏻♀️|👷🏼♀️|👷🏽♀️|👷🏾♀️|👷🏿♀️|👳🏻♂️|👳🏼♂️|👳🏽♂️|👳🏾♂️|👳🏿♂️|👳🏻♀️|👳🏼♀️|👳🏽♀️|👳🏾♀️|👳🏿♀️|🤵🏻♂️|🤵🏼♂️|🤵🏽♂️|🤵🏾♂️|🤵🏿♂️|🤵🏻♀️|🤵🏼♀️|🤵🏽♀️|🤵🏾♀️|🤵🏿♀️|👰🏻♂️|👰🏼♂️|👰🏽♂️|👰🏾♂️|👰🏿♂️|👰🏻♀️|👰🏼♀️|👰🏽♀️|👰🏾♀️|👰🏿♀️|👩🏻🍼|👩🏼🍼|👩🏽🍼|👩🏾🍼|👩🏿🍼|👨🏻🍼|👨🏼🍼|👨🏽🍼|👨🏾🍼|👨🏿🍼|🧑🏻🍼|🧑🏼🍼|🧑🏽🍼|🧑🏾🍼|🧑🏿🍼|🧑🏻🎄|🧑🏼🎄|🧑🏽🎄|🧑🏾🎄|🧑🏿🎄|🦸🏻♂️|🦸🏼♂️|🦸🏽♂️|🦸🏾♂️|🦸🏿♂️|🦸🏻♀️|🦸🏼♀️|🦸🏽♀️|🦸🏾♀️|🦸🏿♀️|🦹🏻♂️|🦹🏼♂️|🦹🏽♂️|🦹🏾♂️|🦹🏿♂️|🦹🏻♀️|🦹🏼♀️|🦹🏽♀️|🦹🏾♀️|🦹🏿♀️|🧙🏻♂️|🧙🏼♂️|🧙🏽♂️|🧙🏾♂️|🧙🏿♂️|🧙🏻♀️|🧙🏼♀️|🧙🏽♀️|🧙🏾♀️|🧙🏿♀️|🧚🏻♂️|🧚🏼♂️|🧚🏽♂️|🧚🏾♂️|🧚🏿♂️|🧚🏻♀️|🧚🏼♀️|🧚🏽♀️|🧚🏾♀️|🧚🏿♀️|🧛🏻♂️|🧛🏼♂️|🧛🏽♂️|🧛🏾♂️|🧛🏿♂️|🧛🏻♀️|🧛🏼♀️|🧛🏽♀️|🧛🏾♀️|🧛🏿♀️|🧜🏻♂️|🧜🏼♂️|🧜🏽♂️|🧜🏾♂️|🧜🏿♂️|🧜🏻♀️|🧜🏼♀️|🧜🏽♀️|🧜🏾♀️|🧜🏿♀️|🧝🏻♂️|🧝🏼♂️|🧝🏽♂️|🧝🏾♂️|🧝🏿♂️|🧝🏻♀️|🧝🏼♀️|🧝🏽♀️|🧝🏾♀️|🧝🏿♀️|💆🏻♂️|💆🏼♂️|💆🏽♂️|💆🏾♂️|💆🏿♂️|💆🏻♀️|💆🏼♀️|💆🏽♀️|💆🏾♀️|💆🏿♀️|💇🏻♂️|💇🏼♂️|💇🏽♂️|💇🏾♂️|💇🏿♂️|💇🏻♀️|💇🏼♀️|💇🏽♀️|💇🏾♀️|💇🏿♀️|🚶🏻♂️|🚶🏼♂️|🚶🏽♂️|🚶🏾♂️|🚶🏿♂️|🚶🏻♀️|🚶🏼♀️|🚶🏽♀️|🚶🏾♀️|🚶🏿♀️|🧍🏻♂️|🧍🏼♂️|🧍🏽♂️|🧍🏾♂️|🧍🏿♂️|🧍🏻♀️|🧍🏼♀️|🧍🏽♀️|🧍🏾♀️|🧍🏿♀️|🧎🏻♂️|🧎🏼♂️|🧎🏽♂️|🧎🏾♂️|🧎🏿♂️|🧎🏻♀️|🧎🏼♀️|🧎🏽♀️|🧎🏾♀️|🧎🏿♀️|🧑🏻🦯|🧑🏼🦯|🧑🏽🦯|🧑🏾🦯|🧑🏿🦯|👨🏻🦯|👨🏼🦯|👨🏽🦯|👨🏾🦯|👨🏿🦯|👩🏻🦯|👩🏼🦯|👩🏽🦯|👩🏾🦯|👩🏿🦯|🧑🏻🦼|🧑🏼🦼|🧑🏽🦼|🧑🏾🦼|🧑🏿🦼|👨🏻🦼|👨🏼🦼|👨🏽🦼|👨🏾🦼|👨🏿🦼|👩🏻🦼|👩🏼🦼|👩🏽🦼|👩🏾🦼|👩🏿🦼|🧑🏻🦽|🧑🏼🦽|🧑🏽🦽|🧑🏾🦽|🧑🏿🦽|👨🏻🦽|👨🏼🦽|👨🏽🦽|👨🏾🦽|👨🏿🦽|👩🏻🦽|👩🏼🦽|👩🏽🦽|👩🏾🦽|👩🏿🦽|🏃🏻♂️|🏃🏼♂️|🏃🏽♂️|🏃🏾♂️|🏃🏿♂️|🏃🏻♀️|🏃🏼♀️|🏃🏽♀️|🏃🏾♀️|🏃🏿♀️|🧖🏻♂️|🧖🏼♂️|🧖🏽♂️|🧖🏾♂️|🧖🏿♂️|🧖🏻♀️|🧖🏼♀️|🧖🏽♀️|🧖🏾♀️|🧖🏿♀️|🧗🏻♂️|🧗🏼♂️|🧗🏽♂️|🧗🏾♂️|🧗🏿♂️|🧗🏻♀️|🧗🏼♀️|🧗🏽♀️|🧗🏾♀️|🧗🏿♀️|🏌🏻♂️|🏌🏼♂️|🏌🏽♂️|🏌🏾♂️|🏌🏿♂️|🏌🏻♀️|🏌🏼♀️|🏌🏽♀️|🏌🏾♀️|🏌🏿♀️|🏄🏻♂️|🏄🏼♂️|🏄🏽♂️|🏄🏾♂️|🏄🏿♂️|🏄🏻♀️|🏄🏼♀️|🏄🏽♀️|🏄🏾♀️|🏄🏿♀️|🚣🏻♂️|🚣🏼♂️|🚣🏽♂️|🚣🏾♂️|🚣🏿♂️|🚣🏻♀️|🚣🏼♀️|🚣🏽♀️|🚣🏾♀️|🚣🏿♀️|🏊🏻♂️|🏊🏼♂️|🏊🏽♂️|🏊🏾♂️|🏊🏿♂️|🏊🏻♀️|🏊🏼♀️|🏊🏽♀️|🏊🏾♀️|🏊🏿♀️|🏋🏻♂️|🏋🏼♂️|🏋🏽♂️|🏋🏾♂️|🏋🏿♂️|🏋🏻♀️|🏋🏼♀️|🏋🏽♀️|🏋🏾♀️|🏋🏿♀️|🚴🏻♂️|🚴🏼♂️|🚴🏽♂️|🚴🏾♂️|🚴🏿♂️|🚴🏻♀️|🚴🏼♀️|🚴🏽♀️|🚴🏾♀️|🚴🏿♀️|🚵🏻♂️|🚵🏼♂️|🚵🏽♂️|🚵🏾♂️|🚵🏿♂️|🚵🏻♀️|🚵🏼♀️|🚵🏽♀️|🚵🏾♀️|🚵🏿♀️|🤸🏻♂️|🤸🏼♂️|🤸🏽♂️|🤸🏾♂️|🤸🏿♂️|🤸🏻♀️|🤸🏼♀️|🤸🏽♀️|🤸🏾♀️|🤸🏿♀️|🤽🏻♂️|🤽🏼♂️|🤽🏽♂️|🤽🏾♂️|🤽🏿♂️|🤽🏻♀️|🤽🏼♀️|🤽🏽♀️|🤽🏾♀️|🤽🏿♀️|🤾🏻♂️|🤾🏼♂️|🤾🏽♂️|🤾🏾♂️|🤾🏿♂️|🤾🏻♀️|🤾🏼♀️|🤾🏽♀️|🤾🏾♀️|🤾🏿♀️|🤹🏻♂️|🤹🏼♂️|🤹🏽♂️|🤹🏾♂️|🤹🏿♂️|🤹🏻♀️|🤹🏼♀️|🤹🏽♀️|🤹🏾♀️|🤹🏿♀️|🧘🏻♂️|🧘🏼♂️|🧘🏽♂️|🧘🏾♂️|🧘🏿♂️|🧘🏻♀️|🧘🏼♀️|🧘🏽♀️|🧘🏾♀️|🧘🏿♀️|😶🌫️|🕵️♂️|🕵️♀️|🏌️♂️|🏌️♀️|🏋️♂️|🏋️♀️|🏳️🌈|🏳️⚧️|⛹🏻♂️|⛹🏼♂️|⛹🏽♂️|⛹🏾♂️|⛹🏿♂️|⛹🏻♀️|⛹🏼♀️|⛹🏽♀️|⛹🏾♀️|⛹🏿♀️|😮💨|😵💫|❤️🔥|❤️🩹|🧔♂️|🧔♀️|👨🦰|👨🦱|👨🦳|👨🦲|👩🦰|🧑🦰|👩🦱|🧑🦱|👩🦳|🧑🦳|👩🦲|🧑🦲|👱♀️|👱♂️|🙍♂️|🙍♀️|🙎♂️|🙎♀️|🙅♂️|🙅♀️|🙆♂️|🙆♀️|💁♂️|💁♀️|🙋♂️|🙋♀️|🧏♂️|🧏♀️|🙇♂️|🙇♀️|🤦♂️|🤦♀️|🤷♂️|🤷♀️|🧑⚕️|👨⚕️|👩⚕️|🧑🎓|👨🎓|👩🎓|🧑🏫|👨🏫|👩🏫|🧑⚖️|👨⚖️|👩⚖️|🧑🌾|👨🌾|👩🌾|🧑🍳|👨🍳|👩🍳|🧑🔧|👨🔧|👩🔧|🧑🏭|👨🏭|👩🏭|🧑💼|👨💼|👩💼|🧑🔬|👨🔬|👩🔬|🧑💻|👨💻|👩💻|🧑🎤|👨🎤|👩🎤|🧑🎨|👨🎨|👩🎨|🧑✈️|👨✈️|👩✈️|🧑🚀|👨🚀|👩🚀|🧑🚒|👨🚒|👩🚒|👮♂️|👮♀️|💂♂️|💂♀️|👷♂️|👷♀️|👳♂️|👳♀️|🤵♂️|🤵♀️|👰♂️|👰♀️|👩🍼|👨🍼|🧑🍼|🧑🎄|🦸♂️|🦸♀️|🦹♂️|🦹♀️|🧙♂️|🧙♀️|🧚♂️|🧚♀️|🧛♂️|🧛♀️|🧜♂️|🧜♀️|🧝♂️|🧝♀️|🧞♂️|🧞♀️|🧟♂️|🧟♀️|💆♂️|💆♀️|💇♂️|💇♀️|🚶♂️|🚶♀️|🧍♂️|🧍♀️|🧎♂️|🧎♀️|🧑🦯|👨🦯|👩🦯|🧑🦼|👨🦼|👩🦼|🧑🦽|👨🦽|👩🦽|🏃♂️|🏃♀️|👯♂️|👯♀️|🧖♂️|🧖♀️|🧗♂️|🧗♀️|🏄♂️|🏄♀️|🚣♂️|🚣♀️|🏊♂️|🏊♀️|⛹️♂️|⛹️♀️|🚴♂️|🚴♀️|🚵♂️|🚵♀️|🤸♂️|🤸♀️|🤼♂️|🤼♀️|🤽♂️|🤽♀️|🤾♂️|🤾♀️|🤹♂️|🤹♀️|🧘♂️|🧘♀️|👨👦|👨👧|👩👦|👩👧|🐕🦺|🐻❄️|🏴☠️|🐈⬛|🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼|👋🏻|👋🏼|👋🏽|👋🏾|👋🏿|🤚🏻|🤚🏼|🤚🏽|🤚🏾|🤚🏿|🖐🏻|🖐🏼|🖐🏽|🖐🏾|🖐🏿|🖖🏻|🖖🏼|🖖🏽|🖖🏾|🖖🏿|👌🏻|👌🏼|👌🏽|👌🏾|👌🏿|🤌🏻|🤌🏼|🤌🏽|🤌🏾|🤌🏿|🤏🏻|🤏🏼|🤏🏽|🤏🏾|🤏🏿|🤞🏻|🤞🏼|🤞🏽|🤞🏾|🤞🏿|🤟🏻|🤟🏼|🤟🏽|🤟🏾|🤟🏿|🤘🏻|🤘🏼|🤘🏽|🤘🏾|🤘🏿|🤙🏻|🤙🏼|🤙🏽|🤙🏾|🤙🏿|👈🏻|👈🏼|👈🏽|👈🏾|👈🏿|👉🏻|👉🏼|👉🏽|👉🏾|👉🏿|👆🏻|👆🏼|👆🏽|👆🏾|👆🏿|🖕🏻|🖕🏼|🖕🏽|🖕🏾|🖕🏿|👇🏻|👇🏼|👇🏽|👇🏾|👇🏿|👍🏻|👍🏼|👍🏽|👍🏾|👍🏿|👎🏻|👎🏼|👎🏽|👎🏾|👎🏿|👊🏻|👊🏼|👊🏽|👊🏾|👊🏿|🤛🏻|🤛🏼|🤛🏽|🤛🏾|🤛🏿|🤜🏻|🤜🏼|🤜🏽|🤜🏾|🤜🏿|👏🏻|👏🏼|👏🏽|👏🏾|👏🏿|🙌🏻|🙌🏼|🙌🏽|🙌🏾|🙌🏿|👐🏻|👐🏼|👐🏽|👐🏾|👐🏿|🤲🏻|🤲🏼|🤲🏽|🤲🏾|🤲🏿|🙏🏻|🙏🏼|🙏🏽|🙏🏾|🙏🏿|💅🏻|💅🏼|💅🏽|💅🏾|💅🏿|🤳🏻|🤳🏼|🤳🏽|🤳🏾|🤳🏿|💪🏻|💪🏼|💪🏽|💪🏾|💪🏿|🦵🏻|🦵🏼|🦵🏽|🦵🏾|🦵🏿|🦶🏻|🦶🏼|🦶🏽|🦶🏾|🦶🏿|👂🏻|👂🏼|👂🏽|👂🏾|👂🏿|🦻🏻|🦻🏼|🦻🏽|🦻🏾|🦻🏿|👃🏻|👃🏼|👃🏽|👃🏾|👃🏿|👶🏻|👶🏼|👶🏽|👶🏾|👶🏿|🧒🏻|🧒🏼|🧒🏽|🧒🏾|🧒🏿|👦🏻|👦🏼|👦🏽|👦🏾|👦🏿|👧🏻|👧🏼|👧🏽|👧🏾|👧🏿|🧑🏻|🧑🏼|🧑🏽|🧑🏾|🧑🏿|👱🏻|👱🏼|👱🏽|👱🏾|👱🏿|👨🏻|👨🏼|👨🏽|👨🏾|👨🏿|🧔🏻|🧔🏼|🧔🏽|🧔🏾|🧔🏿|👩🏻|👩🏼|👩🏽|👩🏾|👩🏿|🧓🏻|🧓🏼|🧓🏽|🧓🏾|🧓🏿|👴🏻|👴🏼|👴🏽|👴🏾|👴🏿|👵🏻|👵🏼|👵🏽|👵🏾|👵🏿|🙍🏻|🙍🏼|🙍🏽|🙍🏾|🙍🏿|🙎🏻|🙎🏼|🙎🏽|🙎🏾|🙎🏿|🙅🏻|🙅🏼|🙅🏽|🙅🏾|🙅🏿|🙆🏻|🙆🏼|🙆🏽|🙆🏾|🙆🏿|💁🏻|💁🏼|💁🏽|💁🏾|💁🏿|🙋🏻|🙋🏼|🙋🏽|🙋🏾|🙋🏿|🧏🏻|🧏🏼|🧏🏽|🧏🏾|🧏🏿|🙇🏻|🙇🏼|🙇🏽|🙇🏾|🙇🏿|🤦🏻|🤦🏼|🤦🏽|🤦🏾|🤦🏿|🤷🏻|🤷🏼|🤷🏽|🤷🏾|🤷🏿|👮🏻|👮🏼|👮🏽|👮🏾|👮🏿|🕵🏻|🕵🏼|🕵🏽|🕵🏾|🕵🏿|💂🏻|💂🏼|💂🏽|💂🏾|💂🏿|🥷🏻|🥷🏼|🥷🏽|🥷🏾|🥷🏿|👷🏻|👷🏼|👷🏽|👷🏾|👷🏿|🤴🏻|🤴🏼|🤴🏽|🤴🏾|🤴🏿|👸🏻|👸🏼|👸🏽|👸🏾|👸🏿|👳🏻|👳🏼|👳🏽|👳🏾|👳🏿|👲🏻|👲🏼|👲🏽|👲🏾|👲🏿|🧕🏻|🧕🏼|🧕🏽|🧕🏾|🧕🏿|🤵🏻|🤵🏼|🤵🏽|🤵🏾|🤵🏿|👰🏻|👰🏼|👰🏽|👰🏾|👰🏿|🤰🏻|🤰🏼|🤰🏽|🤰🏾|🤰🏿|🤱🏻|🤱🏼|🤱🏽|🤱🏾|🤱🏿|👼🏻|👼🏼|👼🏽|👼🏾|👼🏿|🎅🏻|🎅🏼|🎅🏽|🎅🏾|🎅🏿|🤶🏻|🤶🏼|🤶🏽|🤶🏾|🤶🏿|🦸🏻|🦸🏼|🦸🏽|🦸🏾|🦸🏿|🦹🏻|🦹🏼|🦹🏽|🦹🏾|🦹🏿|🧙🏻|🧙🏼|🧙🏽|🧙🏾|🧙🏿|🧚🏻|🧚🏼|🧚🏽|🧚🏾|🧚🏿|🧛🏻|🧛🏼|🧛🏽|🧛🏾|🧛🏿|🧜🏻|🧜🏼|🧜🏽|🧜🏾|🧜🏿|🧝🏻|🧝🏼|🧝🏽|🧝🏾|🧝🏿|💆🏻|💆🏼|💆🏽|💆🏾|💆🏿|💇🏻|💇🏼|💇🏽|💇🏾|💇🏿|🚶🏻|🚶🏼|🚶🏽|🚶🏾|🚶🏿|🧍🏻|🧍🏼|🧍🏽|🧍🏾|🧍🏿|🧎🏻|🧎🏼|🧎🏽|🧎🏾|🧎🏿|🏃🏻|🏃🏼|🏃🏽|🏃🏾|🏃🏿|💃🏻|💃🏼|💃🏽|💃🏾|💃🏿|🕺🏻|🕺🏼|🕺🏽|🕺🏾|🕺🏿|🕴🏻|🕴🏼|🕴🏽|🕴🏾|🕴🏿|🧖🏻|🧖🏼|🧖🏽|🧖🏾|🧖🏿|🧗🏻|🧗🏼|🧗🏽|🧗🏾|🧗🏿|🏇🏻|🏇🏼|🏇🏽|🏇🏾|🏇🏿|🏂🏻|🏂🏼|🏂🏽|🏂🏾|🏂🏿|🏌🏻|🏌🏼|🏌🏽|🏌🏾|🏌🏿|🏄🏻|🏄🏼|🏄🏽|🏄🏾|🏄🏿|🚣🏻|🚣🏼|🚣🏽|🚣🏾|🚣🏿|🏊🏻|🏊🏼|🏊🏽|🏊🏾|🏊🏿|🏋🏻|🏋🏼|🏋🏽|🏋🏾|🏋🏿|🚴🏻|🚴🏼|🚴🏽|🚴🏾|🚴🏿|🚵🏻|🚵🏼|🚵🏽|🚵🏾|🚵🏿|🤸🏻|🤸🏼|🤸🏽|🤸🏾|🤸🏿|🤽🏻|🤽🏼|🤽🏽|🤽🏾|🤽🏿|🤾🏻|🤾🏼|🤾🏽|🤾🏾|🤾🏿|🤹🏻|🤹🏼|🤹🏽|🤹🏾|🤹🏿|🧘🏻|🧘🏼|🧘🏽|🧘🏾|🧘🏿|🛀🏻|🛀🏼|🛀🏽|🛀🏾|🛀🏿|🛌🏻|🛌🏼|🛌🏽|🛌🏾|🛌🏿|👭🏻|👭🏼|👭🏽|👭🏾|👭🏿|👫🏻|👫🏼|👫🏽|👫🏾|👫🏿|👬🏻|👬🏼|👬🏽|👬🏾|👬🏿|💏🏻|💏🏼|💏🏽|💏🏾|💏🏿|💑🏻|💑🏼|💑🏽|💑🏾|💑🏿|#️⃣|0️⃣|1️⃣|2️⃣|3️⃣|4️⃣|5️⃣|6️⃣|7️⃣|8️⃣|9️⃣|✋🏻|✋🏼|✋🏽|✋🏾|✋🏿|✌🏻|✌🏼|✌🏽|✌🏾|✌🏿|☝🏻|☝🏼|☝🏽|☝🏾|☝🏿|✊🏻|✊🏼|✊🏽|✊🏾|✊🏿|✍🏻|✍🏼|✍🏽|✍🏾|✍🏿|⛹🏻|⛹🏼|⛹🏽|⛹🏾|⛹🏿|😀|😃|😄|😁|😆|😅|🤣|😂|🙂|🙃|😉|😊|😇|🥰|😍|🤩|😘|😗|😚|😙|🥲|😋|😛|😜|🤪|😝|🤑|🤗|🤭|🤫|🤔|🤐|🤨|😐|😑|😶|😏|😒|🙄|😬|🤥|😌|😔|😪|🤤|😴|😷|🤒|🤕|🤢|🤮|🤧|🥵|🥶|🥴|😵|🤯|🤠|🥳|🥸|😎|🤓|🧐|😕|😟|🙁|😮|😯|😲|😳|🥺|😦|😧|😨|😰|😥|😢|😭|😱|😖|😣|😞|😓|😩|😫|🥱|😤|😡|😠|🤬|😈|👿|💀|💩|🤡|👹|👺|👻|👽|👾|🤖|😺|😸|😹|😻|😼|😽|🙀|😿|😾|🙈|🙉|🙊|💋|💌|💘|💝|💖|💗|💓|💞|💕|💟|💔|🧡|💛|💚|💙|💜|🤎|🖤|🤍|💯|💢|💥|💫|💦|💨|🕳|💣|💬|🗨|🗯|💭|💤|👋|🤚|🖐|🖖|👌|🤌|🤏|🤞|🤟|🤘|🤙|👈|👉|👆|🖕|👇|👍|👎|👊|🤛|🤜|👏|🙌|👐|🤲|🤝|🙏|💅|🤳|💪|🦾|🦿|🦵|🦶|👂|🦻|👃|🧠|🫀|🫁|🦷|🦴|👀|👁|👅|👄|👶|🧒|👦|👧|🧑|👱|👨|🧔|👩|🧓|👴|👵|🙍|🙎|🙅|🙆|💁|🙋|🧏|🙇|🤦|🤷|👮|🕵|💂|🥷|👷|🤴|👸|👳|👲|🧕|🤵|👰|🤰|🤱|👼|🎅|🤶|🦸|🦹|🧙|🧚|🧛|🧜|🧝|🧞|🧟|💆|💇|🚶|🧍|🧎|🏃|💃|🕺|🕴|👯|🧖|🧗|🤺|🏇|🏂|🏌|🏄|🚣|🏊|🏋|🚴|🚵|🤸|🤼|🤽|🤾|🤹|🧘|🛀|🛌|👭|👫|👬|💏|💑|👪|🗣|👤|👥|🫂|👣|🦰|🦱|🦳|🦲|🐵|🐒|🦍|🦧|🐶|🐕|🦮|🐩|🐺|🦊|🦝|🐱|🐈|🦁|🐯|🐅|🐆|🐴|🐎|🦄|🦓|🦌|🦬|🐮|🐂|🐃|🐄|🐷|🐖|🐗|🐽|🐏|🐑|🐐|🐪|🐫|🦙|🦒|🐘|🦣|🦏|🦛|🐭|🐁|🐀|🐹|🐰|🐇|🐿|🦫|🦔|🦇|🐻|🐨|🐼|🦥|🦦|🦨|🦘|🦡|🐾|🦃|🐔|🐓|🐣|🐤|🐥|🐦|🐧|🕊|🦅|🦆|🦢|🦉|🦤|🪶|🦩|🦚|🦜|🐸|🐊|🐢|🦎|🐍|🐲|🐉|🦕|🦖|🐳|🐋|🐬|🦭|🐟|🐠|🐡|🦈|🐙|🐚|🐌|🦋|🐛|🐜|🐝|🪲|🐞|🦗|🪳|🕷|🕸|🦂|🦟|🪰|🪱|🦠|💐|🌸|💮|🏵|🌹|🥀|🌺|🌻|🌼|🌷|🌱|🪴|🌲|🌳|🌴|🌵|🌾|🌿|🍀|🍁|🍂|🍃|🍇|🍈|🍉|🍊|🍋|🍌|🍍|🥭|🍎|🍏|🍐|🍑|🍒|🍓|🫐|🥝|🍅|🫒|🥥|🥑|🍆|🥔|🥕|🌽|🌶|🫑|🥒|🥬|🥦|🧄|🧅|🍄|🥜|🌰|🍞|🥐|🥖|🫓|🥨|🥯|🥞|🧇|🧀|🍖|🍗|🥩|🥓|🍔|🍟|🍕|🌭|🥪|🌮|🌯|🫔|🥙|🧆|🥚|🍳|🥘|🍲|🫕|🥣|🥗|🍿|🧈|🧂|🥫|🍱|🍘|🍙|🍚|🍛|🍜|🍝|🍠|🍢|🍣|🍤|🍥|🥮|🍡|🥟|🥠|🥡|🦀|🦞|🦐|🦑|🦪|🍦|🍧|🍨|🍩|🍪|🎂|🍰|🧁|🥧|🍫|🍬|🍭|🍮|🍯|🍼|🥛|🫖|🍵|🍶|🍾|🍷|🍸|🍹|🍺|🍻|🥂|🥃|🥤|🧋|🧃|🧉|🧊|🥢|🍽|🍴|🥄|🔪|🏺|🌍|🌎|🌏|🌐|🗺|🗾|🧭|🏔|🌋|🗻|🏕|🏖|🏜|🏝|🏞|🏟|🏛|🏗|🧱|🪨|🪵|🛖|🏘|🏚|🏠|🏡|🏢|🏣|🏤|🏥|🏦|🏨|🏩|🏪|🏫|🏬|🏭|🏯|🏰|💒|🗼|🗽|🕌|🛕|🕍|🕋|🌁|🌃|🏙|🌄|🌅|🌆|🌇|🌉|🎠|🎡|🎢|💈|🎪|🚂|🚃|🚄|🚅|🚆|🚇|🚈|🚉|🚊|🚝|🚞|🚋|🚌|🚍|🚎|🚐|🚑|🚒|🚓|🚔|🚕|🚖|🚗|🚘|🚙|🛻|🚚|🚛|🚜|🏎|🏍|🛵|🦽|🦼|🛺|🚲|🛴|🛹|🛼|🚏|🛣|🛤|🛢|🚨|🚥|🚦|🛑|🚧|🛶|🚤|🛳|🛥|🚢|🛩|🛫|🛬|🪂|💺|🚁|🚟|🚠|🚡|🛰|🚀|🛸|🛎|🧳|🕰|🕛|🕧|🕐|🕜|🕑|🕝|🕒|🕞|🕓|🕟|🕔|🕠|🕕|🕡|🕖|🕢|🕗|🕣|🕘|🕤|🕙|🕥|🕚|🕦|🌑|🌒|🌓|🌔|🌕|🌖|🌗|🌘|🌙|🌚|🌛|🌜|🌡|🌝|🌞|🪐|🌟|🌠|🌌|🌤|🌥|🌦|🌧|🌨|🌩|🌪|🌫|🌬|🌀|🌈|🌂|🔥|💧|🌊|🎃|🎄|🎆|🎇|🧨|🎈|🎉|🎊|🎋|🎍|🎎|🎏|🎐|🎑|🧧|🎀|🎁|🎗|🎟|🎫|🎖|🏆|🏅|🥇|🥈|🥉|🥎|🏀|🏐|🏈|🏉|🎾|🥏|🎳|🏏|🏑|🏒|🥍|🏓|🏸|🥊|🥋|🥅|🎣|🤿|🎽|🎿|🛷|🥌|🎯|🪀|🪁|🎱|🔮|🪄|🧿|🎮|🕹|🎰|🎲|🧩|🧸|🪅|🪆|🃏|🀄|🎴|🎭|🖼|🎨|🧵|🪡|🧶|🪢|👓|🕶|🥽|🥼|🦺|👔|👕|👖|🧣|🧤|🧥|🧦|👗|👘|🥻|🩱|🩲|🩳|👙|👚|👛|👜|👝|🛍|🎒|🩴|👞|👟|🥾|🥿|👠|👡|🩰|👢|👑|👒|🎩|🎓|🧢|🪖|📿|💄|💍|💎|🔇|🔈|🔉|🔊|📢|📣|📯|🔔|🔕|🎼|🎵|🎶|🎙|🎚|🎛|🎤|🎧|📻|🎷|🪗|🎸|🎹|🎺|🎻|🪕|🥁|🪘|📱|📲|📞|📟|📠|🔋|🔌|💻|🖥|🖨|🖱|🖲|💽|💾|💿|📀|🧮|🎥|🎞|📽|🎬|📺|📷|📸|📹|📼|🔍|🔎|🕯|💡|🔦|🏮|🪔|📔|📕|📖|📗|📘|📙|📚|📓|📒|📃|📜|📄|📰|🗞|📑|🔖|🏷|💰|🪙|💴|💵|💶|💷|💸|💳|🧾|💹|📧|📨|📩|📤|📥|📦|📫|📪|📬|📭|📮|🗳|🖋|🖊|🖌|🖍|📝|💼|📁|📂|🗂|📅|📆|🗒|🗓|📇|📈|📉|📊|📋|📌|📍|📎|🖇|📏|📐|🗃|🗄|🗑|🔒|🔓|🔏|🔐|🔑|🗝|🔨|🪓|🛠|🗡|🔫|🪃|🏹|🛡|🪚|🔧|🪛|🔩|🗜|🦯|🔗|🪝|🧰|🧲|🪜|🧪|🧫|🧬|🔬|🔭|📡|💉|🩸|💊|🩹|🩺|🚪|🛗|🪞|🪟|🛏|🛋|🪑|🚽|🪠|🚿|🛁|🪤|🪒|🧴|🧷|🧹|🧺|🧻|🪣|🧼|🪥|🧽|🧯|🛒|🚬|🪦|🗿|🪧|🏧|🚮|🚰|🚹|🚺|🚻|🚼|🚾|🛂|🛃|🛄|🛅|🚸|🚫|🚳|🚭|🚯|🚱|🚷|📵|🔞|🔃|🔄|🔙|🔚|🔛|🔜|🔝|🛐|🕉|🕎|🔯|🔀|🔁|🔂|🔼|🔽|🎦|🔅|🔆|📶|📳|📴|💱|💲|🔱|📛|🔰|🔟|🔠|🔡|🔢|🔣|🔤|🅰|🆎|🅱|🆑|🆒|🆓|🆔|🆕|🆖|🅾|🆗|🅿|🆘|🆙|🆚|🈁|🈂|🈷|🈶|🈯|🉐|🈹|🈚|🈲|🉑|🈸|🈴|🈳|🈺|🈵|🔴|🟠|🟡|🟢|🔵|🟣|🟤|🟥|🟧|🟨|🟩|🟦|🟪|🟫|🔶|🔷|🔸|🔹|🔺|🔻|💠|🔘|🔳|🔲|🏁|🚩|🎌|🏴|🏳|🏻|🏼|🏽|🏾|🏿|☺|☹|☠|❣|❤|✋|✌|☝|✊|✍|⛷|⛹|☘|☕|⛰|⛪|⛩|⛲|⛺|♨|⛽|⚓|⛵|⛴|✈|⌛|⏳|⌚|⏰|⏱|⏲|☀|⭐|☁|⛅|⛈|☂|☔|⛱|⚡|❄|☃|⛄|☄|✨|⚽|⚾|⛳|⛸|♠|♥|♦|♣|♟|⛑|☎|⌨|✉|✏|✒|✂|⛏|⚒|⚔|⚙|⚖|⛓|⚗|⚰|⚱|♿|⚠|⛔|☢|☣|⬆|↗|➡|↘|⬇|↙|⬅|↖|↕|↔|↩|↪|⤴|⤵|⚛|✡|☸|☯|✝|☦|☪|☮|♈|♉|♊|♋|♌|♍|♎|♏|♐|♑|♒|♓|⛎|▶|⏩|⏭|⏯|◀|⏪|⏮|⏫|⏬|⏸|⏹|⏺|⏏|♀|♂|⚧|✖|➕|➖|➗|♾|‼|⁉|❓|❔|❕|❗|〰|⚕|♻|⚜|⭕|✅|☑|✔|❌|❎|➰|➿|〽|✳|✴|❇|©|®|™|ℹ|Ⓜ|㊗|㊙|⚫|⚪|⬛|⬜|◼|◻|◾|◽|▪|▫)`
/*compile the pattern string into a regex*/
let emoRegex = new RegExp(emojiPattern, "g");
/*count of emojis*/
let emoCount = [..."👶🏻👦🏻👧🏻👨🏻👩🏻👱🏻♀️👱🏻👴🏻👵🏻👲🏻👳🏻♀️👳🏻👮🏻♀️👮🏻👷🏻♀️👷🏻💂🏻♀️💂🏻🕵🏻♀️👩🏻⚕️👨🏻⚕️👩🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾".matchAll(emoRegex)].length
console.log(emoCount) //37
/*modifying the pattern to count other characters too*/
let generalCounter = new RegExp(emojiPattern+"|.", "g") //emoji or regular character
let allCount = [..."$%^ other stuff equalling 28👶👦🏻👧🏻👨🏻👩🏻👱🏻♀️👱🏻👴🏻👵🏻👲🏻👳🏻♀️👳🏻👮🏻♀️👮🏻👷🏻♀️👷🏻💂🏻♀️💂🏻🕵🏻♀️👩🏻⚕️👨🏻⚕️👩🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾".matchAll(generalCounter)].length
console.log(allCount) //28+37 = 65
As you can see from the below example, this is to do with unicode encoding,
There's some great resources such as the one I took this example from.
https://blog.jonnew.com/posts/poo-dot-length-equals-two
console.log("👩❤️💋👩".length === 11);
For anyone interested, I had a similar problem where I wanted to count the length of an emoji at the end of a string.
This is the solution I came up with:
var emoji = new RegExp('(\\p{Extended_Pictographic})((\u200D\\p{Extended_Pictographic})*)$', 'u');
var testStrings = ['👨👩👧', '😂', '🌲'];
for(var string = 0; string < testStrings.length; string++){
var match = testStrings[string].match(emoji);
var chars = match == null ? 0 : match[0].length;
console.log(testStrings[string] + ': ' + chars);
}
Explanation: \\p{Extended_Pictographic} matches an emoji like 😂, consisting of two characters. Emojis like 👨👩👧 consists of 4 emojis (👨, 👩, 👧,👦) combined by a zero width joiner (\u200D).
The regex matches any emoji at the end ($). If there is a match the length is counted. I am sure it could be adopted for your use-case by matching all emojis in a given string and then subtracting the surplus. It's not a complete implementation for your particular question but I hope this gets you on the right track.
use lodash toArray method
console.log(_.toArray("👨👩👧").length); // 1
console.log(_.toArray("👨👩👧🧍♂️👩👧👧").length); // 3
Check here for Codesandbox
I suggest using the runes package to accomplish correct multi-byte string conversions cause else you will get more issues if using reducers and more to reverse strings for example.
Take a look at this great small package: runes
I've a little problem.
I'm using NodeJS as backend. Now, an user has a field "biography", where the user can write something about himself.
Suppose that this field has 220 maxlength, and suppose this as input:
👶🏻👦🏻👧🏻👨🏻👩🏻👱🏻♀️👱🏻👴🏻👵🏻👲🏻👳🏻♀️👳🏻👮🏻♀️👮🏻👷🏻♀️👷🏻💂🏻♀️💂🏻🕵🏻♀️👩🏻⚕️👨🏻⚕️👩🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾
As you can see there aren't 220 emojis (there are 37 emojis), but if I do in my nodejs server
console.log(bio.length)
where bio is the input text, I got 221. How could I "parse" the string input to get the correct length? Is it a problem about unicode?
SOLVED
I used this library: https://github.com/orling/grapheme-splitter
I tried that:
var Grapheme = require('grapheme-splitter');
var splitter = new Grapheme();
console.log(splitter.splitGraphemes(bio).length);
and the length is 37. It works very well!
str.length gives the count of UTF-16 units.
Unicode-proof way to get string length in codepoints (in characters) is [...str].length as iterable protocol splits the string to codepoints.
If we need the length in graphemes (grapheme clusters), we have these native ways:
a. Unicode property escapes in RegExp. See for example: Unicode-aware version of \w or Matching emoji.
b. Intl.Segmenter — coming soon, probably in ES2021. Can be tested with a flag in the last V8 versions (realization was synced with the last spec in V8 86). Unflagged (shipped) in V8 87.
See also:
The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)
What every JavaScript developer should know about Unicode
JavaScript has a Unicode problem
Unicode-aware regular expressions in ES2015
ES6 Strings (and Unicode, ❤) in Depth
JavaScript for impatient programmers. Unicode – a brief introduction
TL;DR there are solutions, but they don’t work in every case. Unicode can feel like a dark art.
There seems to be limitations in various solutions I have seen presented, with the issue going beyond emojis and covering other characters in the Unicode range. Consider é can be stored as é or e + ‘, if using combing characters. This can even lead to two strings that look the same not being equal. Also note, in certain cases a single emoji can be 11 characters when stored and as a result 22 bytes, assuming UTF16.
The way this is handled and how characters are combined, or displayed, can even vary between browsers and operating systems. So, while you may think you cracked it, there is a risk another environment breaks this. Be sure to test where it matters.
Now, there is the front-end vs back-end problem: you solved the character count problem so it works well for human users, now your single emoji blows right past the allocated field size in the database. Less of an issue with databases such as mongo, but can be one with SQL databases, where field allocation was conservative. This means how you solve your problem will depend where the hardest limitation comes in.
Note, that a basic solution does involve converting a string to an array and getting the length, accepting limitations:
Array.from(str)
This will fall apart when characters are combined and dealing with astral planes.
A few high level approaches, that take into account limitations:
use approaches that solve the front-end issue, as best as possible, and then ensure storage issues are resolved
be more conservative with the advertised front-end limits, if the database or other storage can’t be adjusted
limit the character types that can be entered
clearly indicate limitations of the length calculation
Additionally, given the complexity of the issue it may be worth seeing if there is a popular JS library that already deals with this? I did not find one at the time of writing. Hopefully this is something that would become core to Javascript at some point.
Other pages to read:
https://blog.jonnew.com/posts/poo-dot-length-equals-two
https://mathiasbynens.be/notes/javascript-unicode
https://www.contentful.com/blog/2016/12/06/unicode-javascript-and-the-emoji-family/
https://dmitripavlutin.com/what-every-javascript-developer-should-know-about-unicode/
I answered to a similar question here
But basically, here it is :
'👍'.match(/./gu).length == 1
As :
'👍'.length == 2
More precision in my original post
function fancyCount2(str){
const joiner = "\u{200D}";
const split = str.split(joiner);
let count = 0;
for(const s of split){
//removing the variation selectors
const num = Array.from(s.split(/[\ufe00-\ufe0f]/).join("")).length;
count += num;
}
//assuming the joiners are used appropriately
return count / split.length;
}
With a regex that can parse emojis, this can be done easily and without the use of external libraries. Please see the code snippets for examples. 👷🏻♀️
Note that grapheme-splitter as suggested in the question will overcount and split apart compound emojis that contain other emojis, such as this one: 🧑🏻🤝🧑🏻. This is reported as three distinct "graphemes", 🧑🏻 and 🤝 and 🧑🏻
Here we are using the 'compact', literal version so it'll fit, but there's a safe, long version that uses Unicode escapes as well.
For more info on the regex see also this answer.
/*the pattern (compact version)*/
var emojiPattern = String.raw`(?:🧑🏻❤️💋🧑🏼|🧑🏻❤️💋🧑🏽|🧑🏻❤️💋🧑🏾|🧑🏻❤️💋🧑🏿|🧑🏼❤️💋🧑🏻|🧑🏼❤️💋🧑🏽|🧑🏼❤️💋🧑🏾|🧑🏼❤️💋🧑🏿|🧑🏽❤️💋🧑🏻|🧑🏽❤️💋🧑🏼|🧑🏽❤️💋🧑🏾|🧑🏽❤️💋🧑🏿|🧑🏾❤️💋🧑🏻|🧑🏾❤️💋🧑🏼|🧑🏾❤️💋🧑🏽|🧑🏾❤️💋🧑🏿|🧑🏿❤️💋🧑🏻|🧑🏿❤️💋🧑🏼|🧑🏿❤️💋🧑🏽|🧑🏿❤️💋🧑🏾|👩🏻❤️💋👨🏻|👩🏻❤️💋👨🏼|👩🏻❤️💋👨🏽|👩🏻❤️💋👨🏾|👩🏻❤️💋👨🏿|👩🏼❤️💋👨🏻|👩🏼❤️💋👨🏼|👩🏼❤️💋👨🏽|👩🏼❤️💋👨🏾|👩🏼❤️💋👨🏿|👩🏽❤️💋👨🏻|👩🏽❤️💋👨🏼|👩🏽❤️💋👨🏽|👩🏽❤️💋👨🏾|👩🏽❤️💋👨🏿|👩🏾❤️💋👨🏻|👩🏾❤️💋👨🏼|👩🏾❤️💋👨🏽|👩🏾❤️💋👨🏾|👩🏾❤️💋👨🏿|👩🏿❤️💋👨🏻|👩🏿❤️💋👨🏼|👩🏿❤️💋👨🏽|👩🏿❤️💋👨🏾|👩🏿❤️💋👨🏿|👨🏻❤️💋👨🏻|👨🏻❤️💋👨🏼|👨🏻❤️💋👨🏽|👨🏻❤️💋👨🏾|👨🏻❤️💋👨🏿|👨🏼❤️💋👨🏻|👨🏼❤️💋👨🏼|👨🏼❤️💋👨🏽|👨🏼❤️💋👨🏾|👨🏼❤️💋👨🏿|👨🏽❤️💋👨🏻|👨🏽❤️💋👨🏼|👨🏽❤️💋👨🏽|👨🏽❤️💋👨🏾|👨🏽❤️💋👨🏿|👨🏾❤️💋👨🏻|👨🏾❤️💋👨🏼|👨🏾❤️💋👨🏽|👨🏾❤️💋👨🏾|👨🏾❤️💋👨🏿|👨🏿❤️💋👨🏻|👨🏿❤️💋👨🏼|👨🏿❤️💋👨🏽|👨🏿❤️💋👨🏾|👨🏿❤️💋👨🏿|👩🏻❤️💋👩🏻|👩🏻❤️💋👩🏼|👩🏻❤️💋👩🏽|👩🏻❤️💋👩🏾|👩🏻❤️💋👩🏿|👩🏼❤️💋👩🏻|👩🏼❤️💋👩🏼|👩🏼❤️💋👩🏽|👩🏼❤️💋👩🏾|👩🏼❤️💋👩🏿|👩🏽❤️💋👩🏻|👩🏽❤️💋👩🏼|👩🏽❤️💋👩🏽|👩🏽❤️💋👩🏾|👩🏽❤️💋👩🏿|👩🏾❤️💋👩🏻|👩🏾❤️💋👩🏼|👩🏾❤️💋👩🏽|👩🏾❤️💋👩🏾|👩🏾❤️💋👩🏿|👩🏿❤️💋👩🏻|👩🏿❤️💋👩🏼|👩🏿❤️💋👩🏽|👩🏿❤️💋👩🏾|👩🏿❤️💋👩🏿|🏴|🏴|🏴|🧑🏻🤝🧑🏻|🧑🏻🤝🧑🏼|🧑🏻🤝🧑🏽|🧑🏻🤝🧑🏾|🧑🏻🤝🧑🏿|🧑🏼🤝🧑🏻|🧑🏼🤝🧑🏼|🧑🏼🤝🧑🏽|🧑🏼🤝🧑🏾|🧑🏼🤝🧑🏿|🧑🏽🤝🧑🏻|🧑🏽🤝🧑🏼|🧑🏽🤝🧑🏽|🧑🏽🤝🧑🏾|🧑🏽🤝🧑🏿|🧑🏾🤝🧑🏻|🧑🏾🤝🧑🏼|🧑🏾🤝🧑🏽|🧑🏾🤝🧑🏾|🧑🏾🤝🧑🏿|🧑🏿🤝🧑🏻|🧑🏿🤝🧑🏼|🧑🏿🤝🧑🏽|🧑🏿🤝🧑🏾|🧑🏿🤝🧑🏿|👩🏻🤝👩🏼|👩🏻🤝👩🏽|👩🏻🤝👩🏾|👩🏻🤝👩🏿|👩🏼🤝👩🏻|👩🏼🤝👩🏽|👩🏼🤝👩🏾|👩🏼🤝👩🏿|👩🏽🤝👩🏻|👩🏽🤝👩🏼|👩🏽🤝👩🏾|👩🏽🤝👩🏿|👩🏾🤝👩🏻|👩🏾🤝👩🏼|👩🏾🤝👩🏽|👩🏾🤝👩🏿|👩🏿🤝👩🏻|👩🏿🤝👩🏼|👩🏿🤝👩🏽|👩🏿🤝👩🏾|👩🏻🤝👨🏼|👩🏻🤝👨🏽|👩🏻🤝👨🏾|👩🏻🤝👨🏿|👩🏼🤝👨🏻|👩🏼🤝👨🏽|👩🏼🤝👨🏾|👩🏼🤝👨🏿|👩🏽🤝👨🏻|👩🏽🤝👨🏼|👩🏽🤝👨🏾|👩🏽🤝👨🏿|👩🏾🤝👨🏻|👩🏾🤝👨🏼|👩🏾🤝👨🏽|👩🏾🤝👨🏿|👩🏿🤝👨🏻|👩🏿🤝👨🏼|👩🏿🤝👨🏽|👩🏿🤝👨🏾|👨🏻🤝👨🏼|👨🏻🤝👨🏽|👨🏻🤝👨🏾|👨🏻🤝👨🏿|👨🏼🤝👨🏻|👨🏼🤝👨🏽|👨🏼🤝👨🏾|👨🏼🤝👨🏿|👨🏽🤝👨🏻|👨🏽🤝👨🏼|👨🏽🤝👨🏾|👨🏽🤝👨🏿|👨🏾🤝👨🏻|👨🏾🤝👨🏼|👨🏾🤝👨🏽|👨🏾🤝👨🏿|👨🏿🤝👨🏻|👨🏿🤝👨🏼|👨🏿🤝👨🏽|👨🏿🤝👨🏾|🧑🏻❤️🧑🏼|🧑🏻❤️🧑🏽|🧑🏻❤️🧑🏾|🧑🏻❤️🧑🏿|🧑🏼❤️🧑🏻|🧑🏼❤️🧑🏽|🧑🏼❤️🧑🏾|🧑🏼❤️🧑🏿|🧑🏽❤️🧑🏻|🧑🏽❤️🧑🏼|🧑🏽❤️🧑🏾|🧑🏽❤️🧑🏿|🧑🏾❤️🧑🏻|🧑🏾❤️🧑🏼|🧑🏾❤️🧑🏽|🧑🏾❤️🧑🏿|🧑🏿❤️🧑🏻|🧑🏿❤️🧑🏼|🧑🏿❤️🧑🏽|🧑🏿❤️🧑🏾|👩🏻❤️👨🏻|👩🏻❤️👨🏼|👩🏻❤️👨🏽|👩🏻❤️👨🏾|👩🏻❤️👨🏿|👩🏼❤️👨🏻|👩🏼❤️👨🏼|👩🏼❤️👨🏽|👩🏼❤️👨🏾|👩🏼❤️👨🏿|👩🏽❤️👨🏻|👩🏽❤️👨🏼|👩🏽❤️👨🏽|👩🏽❤️👨🏾|👩🏽❤️👨🏿|👩🏾❤️👨🏻|👩🏾❤️👨🏼|👩🏾❤️👨🏽|👩🏾❤️👨🏾|👩🏾❤️👨🏿|👩🏿❤️👨🏻|👩🏿❤️👨🏼|👩🏿❤️👨🏽|👩🏿❤️👨🏾|👩🏿❤️👨🏿|👨🏻❤️👨🏻|👨🏻❤️👨🏼|👨🏻❤️👨🏽|👨🏻❤️👨🏾|👨🏻❤️👨🏿|👨🏼❤️👨🏻|👨🏼❤️👨🏼|👨🏼❤️👨🏽|👨🏼❤️👨🏾|👨🏼❤️👨🏿|👨🏽❤️👨🏻|👨🏽❤️👨🏼|👨🏽❤️👨🏽|👨🏽❤️👨🏾|👨🏽❤️👨🏿|👨🏾❤️👨🏻|👨🏾❤️👨🏼|👨🏾❤️👨🏽|👨🏾❤️👨🏾|👨🏾❤️👨🏿|👨🏿❤️👨🏻|👨🏿❤️👨🏼|👨🏿❤️👨🏽|👨🏿❤️👨🏾|👨🏿❤️👨🏿|👩🏻❤️👩🏻|👩🏻❤️👩🏼|👩🏻❤️👩🏽|👩🏻❤️👩🏾|👩🏻❤️👩🏿|👩🏼❤️👩🏻|👩🏼❤️👩🏼|👩🏼❤️👩🏽|👩🏼❤️👩🏾|👩🏼❤️👩🏿|👩🏽❤️👩🏻|👩🏽❤️👩🏼|👩🏽❤️👩🏽|👩🏽❤️👩🏾|👩🏽❤️👩🏿|👩🏾❤️👩🏻|👩🏾❤️👩🏼|👩🏾❤️👩🏽|👩🏾❤️👩🏾|👩🏾❤️👩🏿|👩🏿❤️👩🏻|👩🏿❤️👩🏼|👩🏿❤️👩🏽|👩🏿❤️👩🏾|👩🏿❤️👩🏿|👩❤️💋👨|👨❤️💋👨|👩❤️💋👩|👨👩👧👦|👨👩👦👦|👨👩👧👧|👨👨👧👦|👨👨👦👦|👨👨👧👧|👩👩👧👦|👩👩👦👦|👩👩👧👧|🧑🤝🧑|👩❤️👨|👨❤️👨|👩❤️👩|👨👩👦|👨👩👧|👨👨👦|👨👨👧|👩👩👦|👩👩👧|👨👦👦|👨👧👦|👨👧👧|👩👦👦|👩👧👦|👩👧👧|👁️🗨️|🧔🏻♂️|🧔🏼♂️|🧔🏽♂️|🧔🏾♂️|🧔🏿♂️|🧔🏻♀️|🧔🏼♀️|🧔🏽♀️|🧔🏾♀️|🧔🏿♀️|👨🏻🦰|👨🏼🦰|👨🏽🦰|👨🏾🦰|👨🏿🦰|👨🏻🦱|👨🏼🦱|👨🏽🦱|👨🏾🦱|👨🏿🦱|👨🏻🦳|👨🏼🦳|👨🏽🦳|👨🏾🦳|👨🏿🦳|👨🏻🦲|👨🏼🦲|👨🏽🦲|👨🏾🦲|👨🏿🦲|👩🏻🦰|👩🏼🦰|👩🏽🦰|👩🏾🦰|👩🏿🦰|🧑🏻🦰|🧑🏼🦰|🧑🏽🦰|🧑🏾🦰|🧑🏿🦰|👩🏻🦱|👩🏼🦱|👩🏽🦱|👩🏾🦱|👩🏿🦱|🧑🏻🦱|🧑🏼🦱|🧑🏽🦱|🧑🏾🦱|🧑🏿🦱|👩🏻🦳|👩🏼🦳|👩🏽🦳|👩🏾🦳|👩🏿🦳|🧑🏻🦳|🧑🏼🦳|🧑🏽🦳|🧑🏾🦳|🧑🏿🦳|👩🏻🦲|👩🏼🦲|👩🏽🦲|👩🏾🦲|👩🏿🦲|🧑🏻🦲|🧑🏼🦲|🧑🏽🦲|🧑🏾🦲|🧑🏿🦲|👱🏻♀️|👱🏼♀️|👱🏽♀️|👱🏾♀️|👱🏿♀️|👱🏻♂️|👱🏼♂️|👱🏽♂️|👱🏾♂️|👱🏿♂️|🙍🏻♂️|🙍🏼♂️|🙍🏽♂️|🙍🏾♂️|🙍🏿♂️|🙍🏻♀️|🙍🏼♀️|🙍🏽♀️|🙍🏾♀️|🙍🏿♀️|🙎🏻♂️|🙎🏼♂️|🙎🏽♂️|🙎🏾♂️|🙎🏿♂️|🙎🏻♀️|🙎🏼♀️|🙎🏽♀️|🙎🏾♀️|🙎🏿♀️|🙅🏻♂️|🙅🏼♂️|🙅🏽♂️|🙅🏾♂️|🙅🏿♂️|🙅🏻♀️|🙅🏼♀️|🙅🏽♀️|🙅🏾♀️|🙅🏿♀️|🙆🏻♂️|🙆🏼♂️|🙆🏽♂️|🙆🏾♂️|🙆🏿♂️|🙆🏻♀️|🙆🏼♀️|🙆🏽♀️|🙆🏾♀️|🙆🏿♀️|💁🏻♂️|💁🏼♂️|💁🏽♂️|💁🏾♂️|💁🏿♂️|💁🏻♀️|💁🏼♀️|💁🏽♀️|💁🏾♀️|💁🏿♀️|🙋🏻♂️|🙋🏼♂️|🙋🏽♂️|🙋🏾♂️|🙋🏿♂️|🙋🏻♀️|🙋🏼♀️|🙋🏽♀️|🙋🏾♀️|🙋🏿♀️|🧏🏻♂️|🧏🏼♂️|🧏🏽♂️|🧏🏾♂️|🧏🏿♂️|🧏🏻♀️|🧏🏼♀️|🧏🏽♀️|🧏🏾♀️|🧏🏿♀️|🙇🏻♂️|🙇🏼♂️|🙇🏽♂️|🙇🏾♂️|🙇🏿♂️|🙇🏻♀️|🙇🏼♀️|🙇🏽♀️|🙇🏾♀️|🙇🏿♀️|🤦🏻♂️|🤦🏼♂️|🤦🏽♂️|🤦🏾♂️|🤦🏿♂️|🤦🏻♀️|🤦🏼♀️|🤦🏽♀️|🤦🏾♀️|🤦🏿♀️|🤷🏻♂️|🤷🏼♂️|🤷🏽♂️|🤷🏾♂️|🤷🏿♂️|🤷🏻♀️|🤷🏼♀️|🤷🏽♀️|🤷🏾♀️|🤷🏿♀️|🧑🏻⚕️|🧑🏼⚕️|🧑🏽⚕️|🧑🏾⚕️|🧑🏿⚕️|👨🏻⚕️|👨🏼⚕️|👨🏽⚕️|👨🏾⚕️|👨🏿⚕️|👩🏻⚕️|👩🏼⚕️|👩🏽⚕️|👩🏾⚕️|👩🏿⚕️|🧑🏻🎓|🧑🏼🎓|🧑🏽🎓|🧑🏾🎓|🧑🏿🎓|👨🏻🎓|👨🏼🎓|👨🏽🎓|👨🏾🎓|👨🏿🎓|👩🏻🎓|👩🏼🎓|👩🏽🎓|👩🏾🎓|👩🏿🎓|🧑🏻🏫|🧑🏼🏫|🧑🏽🏫|🧑🏾🏫|🧑🏿🏫|👨🏻🏫|👨🏼🏫|👨🏽🏫|👨🏾🏫|👨🏿🏫|👩🏻🏫|👩🏼🏫|👩🏽🏫|👩🏾🏫|👩🏿🏫|🧑🏻⚖️|🧑🏼⚖️|🧑🏽⚖️|🧑🏾⚖️|🧑🏿⚖️|👨🏻⚖️|👨🏼⚖️|👨🏽⚖️|👨🏾⚖️|👨🏿⚖️|👩🏻⚖️|👩🏼⚖️|👩🏽⚖️|👩🏾⚖️|👩🏿⚖️|🧑🏻🌾|🧑🏼🌾|🧑🏽🌾|🧑🏾🌾|🧑🏿🌾|👨🏻🌾|👨🏼🌾|👨🏽🌾|👨🏾🌾|👨🏿🌾|👩🏻🌾|👩🏼🌾|👩🏽🌾|👩🏾🌾|👩🏿🌾|🧑🏻🍳|🧑🏼🍳|🧑🏽🍳|🧑🏾🍳|🧑🏿🍳|👨🏻🍳|👨🏼🍳|👨🏽🍳|👨🏾🍳|👨🏿🍳|👩🏻🍳|👩🏼🍳|👩🏽🍳|👩🏾🍳|👩🏿🍳|🧑🏻🔧|🧑🏼🔧|🧑🏽🔧|🧑🏾🔧|🧑🏿🔧|👨🏻🔧|👨🏼🔧|👨🏽🔧|👨🏾🔧|👨🏿🔧|👩🏻🔧|👩🏼🔧|👩🏽🔧|👩🏾🔧|👩🏿🔧|🧑🏻🏭|🧑🏼🏭|🧑🏽🏭|🧑🏾🏭|🧑🏿🏭|👨🏻🏭|👨🏼🏭|👨🏽🏭|👨🏾🏭|👨🏿🏭|👩🏻🏭|👩🏼🏭|👩🏽🏭|👩🏾🏭|👩🏿🏭|🧑🏻💼|🧑🏼💼|🧑🏽💼|🧑🏾💼|🧑🏿💼|👨🏻💼|👨🏼💼|👨🏽💼|👨🏾💼|👨🏿💼|👩🏻💼|👩🏼💼|👩🏽💼|👩🏾💼|👩🏿💼|🧑🏻🔬|🧑🏼🔬|🧑🏽🔬|🧑🏾🔬|🧑🏿🔬|👨🏻🔬|👨🏼🔬|👨🏽🔬|👨🏾🔬|👨🏿🔬|👩🏻🔬|👩🏼🔬|👩🏽🔬|👩🏾🔬|👩🏿🔬|🧑🏻💻|🧑🏼💻|🧑🏽💻|🧑🏾💻|🧑🏿💻|👨🏻💻|👨🏼💻|👨🏽💻|👨🏾💻|👨🏿💻|👩🏻💻|👩🏼💻|👩🏽💻|👩🏾💻|👩🏿💻|🧑🏻🎤|🧑🏼🎤|🧑🏽🎤|🧑🏾🎤|🧑🏿🎤|👨🏻🎤|👨🏼🎤|👨🏽🎤|👨🏾🎤|👨🏿🎤|👩🏻🎤|👩🏼🎤|👩🏽🎤|👩🏾🎤|👩🏿🎤|🧑🏻🎨|🧑🏼🎨|🧑🏽🎨|🧑🏾🎨|🧑🏿🎨|👨🏻🎨|👨🏼🎨|👨🏽🎨|👨🏾🎨|👨🏿🎨|👩🏻🎨|👩🏼🎨|👩🏽🎨|👩🏾🎨|👩🏿🎨|🧑🏻✈️|🧑🏼✈️|🧑🏽✈️|🧑🏾✈️|🧑🏿✈️|👨🏻✈️|👨🏼✈️|👨🏽✈️|👨🏾✈️|👨🏿✈️|👩🏻✈️|👩🏼✈️|👩🏽✈️|👩🏾✈️|👩🏿✈️|🧑🏻🚀|🧑🏼🚀|🧑🏽🚀|🧑🏾🚀|🧑🏿🚀|👨🏻🚀|👨🏼🚀|👨🏽🚀|👨🏾🚀|👨🏿🚀|👩🏻🚀|👩🏼🚀|👩🏽🚀|👩🏾🚀|👩🏿🚀|🧑🏻🚒|🧑🏼🚒|🧑🏽🚒|🧑🏾🚒|🧑🏿🚒|👨🏻🚒|👨🏼🚒|👨🏽🚒|👨🏾🚒|👨🏿🚒|👩🏻🚒|👩🏼🚒|👩🏽🚒|👩🏾🚒|👩🏿🚒|👮🏻♂️|👮🏼♂️|👮🏽♂️|👮🏾♂️|👮🏿♂️|👮🏻♀️|👮🏼♀️|👮🏽♀️|👮🏾♀️|👮🏿♀️|🕵🏻♂️|🕵🏼♂️|🕵🏽♂️|🕵🏾♂️|🕵🏿♂️|🕵🏻♀️|🕵🏼♀️|🕵🏽♀️|🕵🏾♀️|🕵🏿♀️|💂🏻♂️|💂🏼♂️|💂🏽♂️|💂🏾♂️|💂🏿♂️|💂🏻♀️|💂🏼♀️|💂🏽♀️|💂🏾♀️|💂🏿♀️|👷🏻♂️|👷🏼♂️|👷🏽♂️|👷🏾♂️|👷🏿♂️|👷🏻♀️|👷🏼♀️|👷🏽♀️|👷🏾♀️|👷🏿♀️|👳🏻♂️|👳🏼♂️|👳🏽♂️|👳🏾♂️|👳🏿♂️|👳🏻♀️|👳🏼♀️|👳🏽♀️|👳🏾♀️|👳🏿♀️|🤵🏻♂️|🤵🏼♂️|🤵🏽♂️|🤵🏾♂️|🤵🏿♂️|🤵🏻♀️|🤵🏼♀️|🤵🏽♀️|🤵🏾♀️|🤵🏿♀️|👰🏻♂️|👰🏼♂️|👰🏽♂️|👰🏾♂️|👰🏿♂️|👰🏻♀️|👰🏼♀️|👰🏽♀️|👰🏾♀️|👰🏿♀️|👩🏻🍼|👩🏼🍼|👩🏽🍼|👩🏾🍼|👩🏿🍼|👨🏻🍼|👨🏼🍼|👨🏽🍼|👨🏾🍼|👨🏿🍼|🧑🏻🍼|🧑🏼🍼|🧑🏽🍼|🧑🏾🍼|🧑🏿🍼|🧑🏻🎄|🧑🏼🎄|🧑🏽🎄|🧑🏾🎄|🧑🏿🎄|🦸🏻♂️|🦸🏼♂️|🦸🏽♂️|🦸🏾♂️|🦸🏿♂️|🦸🏻♀️|🦸🏼♀️|🦸🏽♀️|🦸🏾♀️|🦸🏿♀️|🦹🏻♂️|🦹🏼♂️|🦹🏽♂️|🦹🏾♂️|🦹🏿♂️|🦹🏻♀️|🦹🏼♀️|🦹🏽♀️|🦹🏾♀️|🦹🏿♀️|🧙🏻♂️|🧙🏼♂️|🧙🏽♂️|🧙🏾♂️|🧙🏿♂️|🧙🏻♀️|🧙🏼♀️|🧙🏽♀️|🧙🏾♀️|🧙🏿♀️|🧚🏻♂️|🧚🏼♂️|🧚🏽♂️|🧚🏾♂️|🧚🏿♂️|🧚🏻♀️|🧚🏼♀️|🧚🏽♀️|🧚🏾♀️|🧚🏿♀️|🧛🏻♂️|🧛🏼♂️|🧛🏽♂️|🧛🏾♂️|🧛🏿♂️|🧛🏻♀️|🧛🏼♀️|🧛🏽♀️|🧛🏾♀️|🧛🏿♀️|🧜🏻♂️|🧜🏼♂️|🧜🏽♂️|🧜🏾♂️|🧜🏿♂️|🧜🏻♀️|🧜🏼♀️|🧜🏽♀️|🧜🏾♀️|🧜🏿♀️|🧝🏻♂️|🧝🏼♂️|🧝🏽♂️|🧝🏾♂️|🧝🏿♂️|🧝🏻♀️|🧝🏼♀️|🧝🏽♀️|🧝🏾♀️|🧝🏿♀️|💆🏻♂️|💆🏼♂️|💆🏽♂️|💆🏾♂️|💆🏿♂️|💆🏻♀️|💆🏼♀️|💆🏽♀️|💆🏾♀️|💆🏿♀️|💇🏻♂️|💇🏼♂️|💇🏽♂️|💇🏾♂️|💇🏿♂️|💇🏻♀️|💇🏼♀️|💇🏽♀️|💇🏾♀️|💇🏿♀️|🚶🏻♂️|🚶🏼♂️|🚶🏽♂️|🚶🏾♂️|🚶🏿♂️|🚶🏻♀️|🚶🏼♀️|🚶🏽♀️|🚶🏾♀️|🚶🏿♀️|🧍🏻♂️|🧍🏼♂️|🧍🏽♂️|🧍🏾♂️|🧍🏿♂️|🧍🏻♀️|🧍🏼♀️|🧍🏽♀️|🧍🏾♀️|🧍🏿♀️|🧎🏻♂️|🧎🏼♂️|🧎🏽♂️|🧎🏾♂️|🧎🏿♂️|🧎🏻♀️|🧎🏼♀️|🧎🏽♀️|🧎🏾♀️|🧎🏿♀️|🧑🏻🦯|🧑🏼🦯|🧑🏽🦯|🧑🏾🦯|🧑🏿🦯|👨🏻🦯|👨🏼🦯|👨🏽🦯|👨🏾🦯|👨🏿🦯|👩🏻🦯|👩🏼🦯|👩🏽🦯|👩🏾🦯|👩🏿🦯|🧑🏻🦼|🧑🏼🦼|🧑🏽🦼|🧑🏾🦼|🧑🏿🦼|👨🏻🦼|👨🏼🦼|👨🏽🦼|👨🏾🦼|👨🏿🦼|👩🏻🦼|👩🏼🦼|👩🏽🦼|👩🏾🦼|👩🏿🦼|🧑🏻🦽|🧑🏼🦽|🧑🏽🦽|🧑🏾🦽|🧑🏿🦽|👨🏻🦽|👨🏼🦽|👨🏽🦽|👨🏾🦽|👨🏿🦽|👩🏻🦽|👩🏼🦽|👩🏽🦽|👩🏾🦽|👩🏿🦽|🏃🏻♂️|🏃🏼♂️|🏃🏽♂️|🏃🏾♂️|🏃🏿♂️|🏃🏻♀️|🏃🏼♀️|🏃🏽♀️|🏃🏾♀️|🏃🏿♀️|🧖🏻♂️|🧖🏼♂️|🧖🏽♂️|🧖🏾♂️|🧖🏿♂️|🧖🏻♀️|🧖🏼♀️|🧖🏽♀️|🧖🏾♀️|🧖🏿♀️|🧗🏻♂️|🧗🏼♂️|🧗🏽♂️|🧗🏾♂️|🧗🏿♂️|🧗🏻♀️|🧗🏼♀️|🧗🏽♀️|🧗🏾♀️|🧗🏿♀️|🏌🏻♂️|🏌🏼♂️|🏌🏽♂️|🏌🏾♂️|🏌🏿♂️|🏌🏻♀️|🏌🏼♀️|🏌🏽♀️|🏌🏾♀️|🏌🏿♀️|🏄🏻♂️|🏄🏼♂️|🏄🏽♂️|🏄🏾♂️|🏄🏿♂️|🏄🏻♀️|🏄🏼♀️|🏄🏽♀️|🏄🏾♀️|🏄🏿♀️|🚣🏻♂️|🚣🏼♂️|🚣🏽♂️|🚣🏾♂️|🚣🏿♂️|🚣🏻♀️|🚣🏼♀️|🚣🏽♀️|🚣🏾♀️|🚣🏿♀️|🏊🏻♂️|🏊🏼♂️|🏊🏽♂️|🏊🏾♂️|🏊🏿♂️|🏊🏻♀️|🏊🏼♀️|🏊🏽♀️|🏊🏾♀️|🏊🏿♀️|🏋🏻♂️|🏋🏼♂️|🏋🏽♂️|🏋🏾♂️|🏋🏿♂️|🏋🏻♀️|🏋🏼♀️|🏋🏽♀️|🏋🏾♀️|🏋🏿♀️|🚴🏻♂️|🚴🏼♂️|🚴🏽♂️|🚴🏾♂️|🚴🏿♂️|🚴🏻♀️|🚴🏼♀️|🚴🏽♀️|🚴🏾♀️|🚴🏿♀️|🚵🏻♂️|🚵🏼♂️|🚵🏽♂️|🚵🏾♂️|🚵🏿♂️|🚵🏻♀️|🚵🏼♀️|🚵🏽♀️|🚵🏾♀️|🚵🏿♀️|🤸🏻♂️|🤸🏼♂️|🤸🏽♂️|🤸🏾♂️|🤸🏿♂️|🤸🏻♀️|🤸🏼♀️|🤸🏽♀️|🤸🏾♀️|🤸🏿♀️|🤽🏻♂️|🤽🏼♂️|🤽🏽♂️|🤽🏾♂️|🤽🏿♂️|🤽🏻♀️|🤽🏼♀️|🤽🏽♀️|🤽🏾♀️|🤽🏿♀️|🤾🏻♂️|🤾🏼♂️|🤾🏽♂️|🤾🏾♂️|🤾🏿♂️|🤾🏻♀️|🤾🏼♀️|🤾🏽♀️|🤾🏾♀️|🤾🏿♀️|🤹🏻♂️|🤹🏼♂️|🤹🏽♂️|🤹🏾♂️|🤹🏿♂️|🤹🏻♀️|🤹🏼♀️|🤹🏽♀️|🤹🏾♀️|🤹🏿♀️|🧘🏻♂️|🧘🏼♂️|🧘🏽♂️|🧘🏾♂️|🧘🏿♂️|🧘🏻♀️|🧘🏼♀️|🧘🏽♀️|🧘🏾♀️|🧘🏿♀️|😶🌫️|🕵️♂️|🕵️♀️|🏌️♂️|🏌️♀️|🏋️♂️|🏋️♀️|🏳️🌈|🏳️⚧️|⛹🏻♂️|⛹🏼♂️|⛹🏽♂️|⛹🏾♂️|⛹🏿♂️|⛹🏻♀️|⛹🏼♀️|⛹🏽♀️|⛹🏾♀️|⛹🏿♀️|😮💨|😵💫|❤️🔥|❤️🩹|🧔♂️|🧔♀️|👨🦰|👨🦱|👨🦳|👨🦲|👩🦰|🧑🦰|👩🦱|🧑🦱|👩🦳|🧑🦳|👩🦲|🧑🦲|👱♀️|👱♂️|🙍♂️|🙍♀️|🙎♂️|🙎♀️|🙅♂️|🙅♀️|🙆♂️|🙆♀️|💁♂️|💁♀️|🙋♂️|🙋♀️|🧏♂️|🧏♀️|🙇♂️|🙇♀️|🤦♂️|🤦♀️|🤷♂️|🤷♀️|🧑⚕️|👨⚕️|👩⚕️|🧑🎓|👨🎓|👩🎓|🧑🏫|👨🏫|👩🏫|🧑⚖️|👨⚖️|👩⚖️|🧑🌾|👨🌾|👩🌾|🧑🍳|👨🍳|👩🍳|🧑🔧|👨🔧|👩🔧|🧑🏭|👨🏭|👩🏭|🧑💼|👨💼|👩💼|🧑🔬|👨🔬|👩🔬|🧑💻|👨💻|👩💻|🧑🎤|👨🎤|👩🎤|🧑🎨|👨🎨|👩🎨|🧑✈️|👨✈️|👩✈️|🧑🚀|👨🚀|👩🚀|🧑🚒|👨🚒|👩🚒|👮♂️|👮♀️|💂♂️|💂♀️|👷♂️|👷♀️|👳♂️|👳♀️|🤵♂️|🤵♀️|👰♂️|👰♀️|👩🍼|👨🍼|🧑🍼|🧑🎄|🦸♂️|🦸♀️|🦹♂️|🦹♀️|🧙♂️|🧙♀️|🧚♂️|🧚♀️|🧛♂️|🧛♀️|🧜♂️|🧜♀️|🧝♂️|🧝♀️|🧞♂️|🧞♀️|🧟♂️|🧟♀️|💆♂️|💆♀️|💇♂️|💇♀️|🚶♂️|🚶♀️|🧍♂️|🧍♀️|🧎♂️|🧎♀️|🧑🦯|👨🦯|👩🦯|🧑🦼|👨🦼|👩🦼|🧑🦽|👨🦽|👩🦽|🏃♂️|🏃♀️|👯♂️|👯♀️|🧖♂️|🧖♀️|🧗♂️|🧗♀️|🏄♂️|🏄♀️|🚣♂️|🚣♀️|🏊♂️|🏊♀️|⛹️♂️|⛹️♀️|🚴♂️|🚴♀️|🚵♂️|🚵♀️|🤸♂️|🤸♀️|🤼♂️|🤼♀️|🤽♂️|🤽♀️|🤾♂️|🤾♀️|🤹♂️|🤹♀️|🧘♂️|🧘♀️|👨👦|👨👧|👩👦|👩👧|🐕🦺|🐻❄️|🏴☠️|🐈⬛|🇦🇨|🇦🇩|🇦🇪|🇦🇫|🇦🇬|🇦🇮|🇦🇱|🇦🇲|🇦🇴|🇦🇶|🇦🇷|🇦🇸|🇦🇹|🇦🇺|🇦🇼|🇦🇽|🇦🇿|🇧🇦|🇧🇧|🇧🇩|🇧🇪|🇧🇫|🇧🇬|🇧🇭|🇧🇮|🇧🇯|🇧🇱|🇧🇲|🇧🇳|🇧🇴|🇧🇶|🇧🇷|🇧🇸|🇧🇹|🇧🇻|🇧🇼|🇧🇾|🇧🇿|🇨🇦|🇨🇨|🇨🇩|🇨🇫|🇨🇬|🇨🇭|🇨🇮|🇨🇰|🇨🇱|🇨🇲|🇨🇳|🇨🇴|🇨🇵|🇨🇷|🇨🇺|🇨🇻|🇨🇼|🇨🇽|🇨🇾|🇨🇿|🇩🇪|🇩🇬|🇩🇯|🇩🇰|🇩🇲|🇩🇴|🇩🇿|🇪🇦|🇪🇨|🇪🇪|🇪🇬|🇪🇭|🇪🇷|🇪🇸|🇪🇹|🇪🇺|🇫🇮|🇫🇯|🇫🇰|🇫🇲|🇫🇴|🇫🇷|🇬🇦|🇬🇧|🇬🇩|🇬🇪|🇬🇫|🇬🇬|🇬🇭|🇬🇮|🇬🇱|🇬🇲|🇬🇳|🇬🇵|🇬🇶|🇬🇷|🇬🇸|🇬🇹|🇬🇺|🇬🇼|🇬🇾|🇭🇰|🇭🇲|🇭🇳|🇭🇷|🇭🇹|🇭🇺|🇮🇨|🇮🇩|🇮🇪|🇮🇱|🇮🇲|🇮🇳|🇮🇴|🇮🇶|🇮🇷|🇮🇸|🇮🇹|🇯🇪|🇯🇲|🇯🇴|🇯🇵|🇰🇪|🇰🇬|🇰🇭|🇰🇮|🇰🇲|🇰🇳|🇰🇵|🇰🇷|🇰🇼|🇰🇾|🇰🇿|🇱🇦|🇱🇧|🇱🇨|🇱🇮|🇱🇰|🇱🇷|🇱🇸|🇱🇹|🇱🇺|🇱🇻|🇱🇾|🇲🇦|🇲🇨|🇲🇩|🇲🇪|🇲🇫|🇲🇬|🇲🇭|🇲🇰|🇲🇱|🇲🇲|🇲🇳|🇲🇴|🇲🇵|🇲🇶|🇲🇷|🇲🇸|🇲🇹|🇲🇺|🇲🇻|🇲🇼|🇲🇽|🇲🇾|🇲🇿|🇳🇦|🇳🇨|🇳🇪|🇳🇫|🇳🇬|🇳🇮|🇳🇱|🇳🇴|🇳🇵|🇳🇷|🇳🇺|🇳🇿|🇴🇲|🇵🇦|🇵🇪|🇵🇫|🇵🇬|🇵🇭|🇵🇰|🇵🇱|🇵🇲|🇵🇳|🇵🇷|🇵🇸|🇵🇹|🇵🇼|🇵🇾|🇶🇦|🇷🇪|🇷🇴|🇷🇸|🇷🇺|🇷🇼|🇸🇦|🇸🇧|🇸🇨|🇸🇩|🇸🇪|🇸🇬|🇸🇭|🇸🇮|🇸🇯|🇸🇰|🇸🇱|🇸🇲|🇸🇳|🇸🇴|🇸🇷|🇸🇸|🇸🇹|🇸🇻|🇸🇽|🇸🇾|🇸🇿|🇹🇦|🇹🇨|🇹🇩|🇹🇫|🇹🇬|🇹🇭|🇹🇯|🇹🇰|🇹🇱|🇹🇲|🇹🇳|🇹🇴|🇹🇷|🇹🇹|🇹🇻|🇹🇼|🇹🇿|🇺🇦|🇺🇬|🇺🇲|🇺🇳|🇺🇸|🇺🇾|🇺🇿|🇻🇦|🇻🇨|🇻🇪|🇻🇬|🇻🇮|🇻🇳|🇻🇺|🇼🇫|🇼🇸|🇽🇰|🇾🇪|🇾🇹|🇿🇦|🇿🇲|🇿🇼|👋🏻|👋🏼|👋🏽|👋🏾|👋🏿|🤚🏻|🤚🏼|🤚🏽|🤚🏾|🤚🏿|🖐🏻|🖐🏼|🖐🏽|🖐🏾|🖐🏿|🖖🏻|🖖🏼|🖖🏽|🖖🏾|🖖🏿|👌🏻|👌🏼|👌🏽|👌🏾|👌🏿|🤌🏻|🤌🏼|🤌🏽|🤌🏾|🤌🏿|🤏🏻|🤏🏼|🤏🏽|🤏🏾|🤏🏿|🤞🏻|🤞🏼|🤞🏽|🤞🏾|🤞🏿|🤟🏻|🤟🏼|🤟🏽|🤟🏾|🤟🏿|🤘🏻|🤘🏼|🤘🏽|🤘🏾|🤘🏿|🤙🏻|🤙🏼|🤙🏽|🤙🏾|🤙🏿|👈🏻|👈🏼|👈🏽|👈🏾|👈🏿|👉🏻|👉🏼|👉🏽|👉🏾|👉🏿|👆🏻|👆🏼|👆🏽|👆🏾|👆🏿|🖕🏻|🖕🏼|🖕🏽|🖕🏾|🖕🏿|👇🏻|👇🏼|👇🏽|👇🏾|👇🏿|👍🏻|👍🏼|👍🏽|👍🏾|👍🏿|👎🏻|👎🏼|👎🏽|👎🏾|👎🏿|👊🏻|👊🏼|👊🏽|👊🏾|👊🏿|🤛🏻|🤛🏼|🤛🏽|🤛🏾|🤛🏿|🤜🏻|🤜🏼|🤜🏽|🤜🏾|🤜🏿|👏🏻|👏🏼|👏🏽|👏🏾|👏🏿|🙌🏻|🙌🏼|🙌🏽|🙌🏾|🙌🏿|👐🏻|👐🏼|👐🏽|👐🏾|👐🏿|🤲🏻|🤲🏼|🤲🏽|🤲🏾|🤲🏿|🙏🏻|🙏🏼|🙏🏽|🙏🏾|🙏🏿|💅🏻|💅🏼|💅🏽|💅🏾|💅🏿|🤳🏻|🤳🏼|🤳🏽|🤳🏾|🤳🏿|💪🏻|💪🏼|💪🏽|💪🏾|💪🏿|🦵🏻|🦵🏼|🦵🏽|🦵🏾|🦵🏿|🦶🏻|🦶🏼|🦶🏽|🦶🏾|🦶🏿|👂🏻|👂🏼|👂🏽|👂🏾|👂🏿|🦻🏻|🦻🏼|🦻🏽|🦻🏾|🦻🏿|👃🏻|👃🏼|👃🏽|👃🏾|👃🏿|👶🏻|👶🏼|👶🏽|👶🏾|👶🏿|🧒🏻|🧒🏼|🧒🏽|🧒🏾|🧒🏿|👦🏻|👦🏼|👦🏽|👦🏾|👦🏿|👧🏻|👧🏼|👧🏽|👧🏾|👧🏿|🧑🏻|🧑🏼|🧑🏽|🧑🏾|🧑🏿|👱🏻|👱🏼|👱🏽|👱🏾|👱🏿|👨🏻|👨🏼|👨🏽|👨🏾|👨🏿|🧔🏻|🧔🏼|🧔🏽|🧔🏾|🧔🏿|👩🏻|👩🏼|👩🏽|👩🏾|👩🏿|🧓🏻|🧓🏼|🧓🏽|🧓🏾|🧓🏿|👴🏻|👴🏼|👴🏽|👴🏾|👴🏿|👵🏻|👵🏼|👵🏽|👵🏾|👵🏿|🙍🏻|🙍🏼|🙍🏽|🙍🏾|🙍🏿|🙎🏻|🙎🏼|🙎🏽|🙎🏾|🙎🏿|🙅🏻|🙅🏼|🙅🏽|🙅🏾|🙅🏿|🙆🏻|🙆🏼|🙆🏽|🙆🏾|🙆🏿|💁🏻|💁🏼|💁🏽|💁🏾|💁🏿|🙋🏻|🙋🏼|🙋🏽|🙋🏾|🙋🏿|🧏🏻|🧏🏼|🧏🏽|🧏🏾|🧏🏿|🙇🏻|🙇🏼|🙇🏽|🙇🏾|🙇🏿|🤦🏻|🤦🏼|🤦🏽|🤦🏾|🤦🏿|🤷🏻|🤷🏼|🤷🏽|🤷🏾|🤷🏿|👮🏻|👮🏼|👮🏽|👮🏾|👮🏿|🕵🏻|🕵🏼|🕵🏽|🕵🏾|🕵🏿|💂🏻|💂🏼|💂🏽|💂🏾|💂🏿|🥷🏻|🥷🏼|🥷🏽|🥷🏾|🥷🏿|👷🏻|👷🏼|👷🏽|👷🏾|👷🏿|🤴🏻|🤴🏼|🤴🏽|🤴🏾|🤴🏿|👸🏻|👸🏼|👸🏽|👸🏾|👸🏿|👳🏻|👳🏼|👳🏽|👳🏾|👳🏿|👲🏻|👲🏼|👲🏽|👲🏾|👲🏿|🧕🏻|🧕🏼|🧕🏽|🧕🏾|🧕🏿|🤵🏻|🤵🏼|🤵🏽|🤵🏾|🤵🏿|👰🏻|👰🏼|👰🏽|👰🏾|👰🏿|🤰🏻|🤰🏼|🤰🏽|🤰🏾|🤰🏿|🤱🏻|🤱🏼|🤱🏽|🤱🏾|🤱🏿|👼🏻|👼🏼|👼🏽|👼🏾|👼🏿|🎅🏻|🎅🏼|🎅🏽|🎅🏾|🎅🏿|🤶🏻|🤶🏼|🤶🏽|🤶🏾|🤶🏿|🦸🏻|🦸🏼|🦸🏽|🦸🏾|🦸🏿|🦹🏻|🦹🏼|🦹🏽|🦹🏾|🦹🏿|🧙🏻|🧙🏼|🧙🏽|🧙🏾|🧙🏿|🧚🏻|🧚🏼|🧚🏽|🧚🏾|🧚🏿|🧛🏻|🧛🏼|🧛🏽|🧛🏾|🧛🏿|🧜🏻|🧜🏼|🧜🏽|🧜🏾|🧜🏿|🧝🏻|🧝🏼|🧝🏽|🧝🏾|🧝🏿|💆🏻|💆🏼|💆🏽|💆🏾|💆🏿|💇🏻|💇🏼|💇🏽|💇🏾|💇🏿|🚶🏻|🚶🏼|🚶🏽|🚶🏾|🚶🏿|🧍🏻|🧍🏼|🧍🏽|🧍🏾|🧍🏿|🧎🏻|🧎🏼|🧎🏽|🧎🏾|🧎🏿|🏃🏻|🏃🏼|🏃🏽|🏃🏾|🏃🏿|💃🏻|💃🏼|💃🏽|💃🏾|💃🏿|🕺🏻|🕺🏼|🕺🏽|🕺🏾|🕺🏿|🕴🏻|🕴🏼|🕴🏽|🕴🏾|🕴🏿|🧖🏻|🧖🏼|🧖🏽|🧖🏾|🧖🏿|🧗🏻|🧗🏼|🧗🏽|🧗🏾|🧗🏿|🏇🏻|🏇🏼|🏇🏽|🏇🏾|🏇🏿|🏂🏻|🏂🏼|🏂🏽|🏂🏾|🏂🏿|🏌🏻|🏌🏼|🏌🏽|🏌🏾|🏌🏿|🏄🏻|🏄🏼|🏄🏽|🏄🏾|🏄🏿|🚣🏻|🚣🏼|🚣🏽|🚣🏾|🚣🏿|🏊🏻|🏊🏼|🏊🏽|🏊🏾|🏊🏿|🏋🏻|🏋🏼|🏋🏽|🏋🏾|🏋🏿|🚴🏻|🚴🏼|🚴🏽|🚴🏾|🚴🏿|🚵🏻|🚵🏼|🚵🏽|🚵🏾|🚵🏿|🤸🏻|🤸🏼|🤸🏽|🤸🏾|🤸🏿|🤽🏻|🤽🏼|🤽🏽|🤽🏾|🤽🏿|🤾🏻|🤾🏼|🤾🏽|🤾🏾|🤾🏿|🤹🏻|🤹🏼|🤹🏽|🤹🏾|🤹🏿|🧘🏻|🧘🏼|🧘🏽|🧘🏾|🧘🏿|🛀🏻|🛀🏼|🛀🏽|🛀🏾|🛀🏿|🛌🏻|🛌🏼|🛌🏽|🛌🏾|🛌🏿|👭🏻|👭🏼|👭🏽|👭🏾|👭🏿|👫🏻|👫🏼|👫🏽|👫🏾|👫🏿|👬🏻|👬🏼|👬🏽|👬🏾|👬🏿|💏🏻|💏🏼|💏🏽|💏🏾|💏🏿|💑🏻|💑🏼|💑🏽|💑🏾|💑🏿|#️⃣|0️⃣|1️⃣|2️⃣|3️⃣|4️⃣|5️⃣|6️⃣|7️⃣|8️⃣|9️⃣|✋🏻|✋🏼|✋🏽|✋🏾|✋🏿|✌🏻|✌🏼|✌🏽|✌🏾|✌🏿|☝🏻|☝🏼|☝🏽|☝🏾|☝🏿|✊🏻|✊🏼|✊🏽|✊🏾|✊🏿|✍🏻|✍🏼|✍🏽|✍🏾|✍🏿|⛹🏻|⛹🏼|⛹🏽|⛹🏾|⛹🏿|😀|😃|😄|😁|😆|😅|🤣|😂|🙂|🙃|😉|😊|😇|🥰|😍|🤩|😘|😗|😚|😙|🥲|😋|😛|😜|🤪|😝|🤑|🤗|🤭|🤫|🤔|🤐|🤨|😐|😑|😶|😏|😒|🙄|😬|🤥|😌|😔|😪|🤤|😴|😷|🤒|🤕|🤢|🤮|🤧|🥵|🥶|🥴|😵|🤯|🤠|🥳|🥸|😎|🤓|🧐|😕|😟|🙁|😮|😯|😲|😳|🥺|😦|😧|😨|😰|😥|😢|😭|😱|😖|😣|😞|😓|😩|😫|🥱|😤|😡|😠|🤬|😈|👿|💀|💩|🤡|👹|👺|👻|👽|👾|🤖|😺|😸|😹|😻|😼|😽|🙀|😿|😾|🙈|🙉|🙊|💋|💌|💘|💝|💖|💗|💓|💞|💕|💟|💔|🧡|💛|💚|💙|💜|🤎|🖤|🤍|💯|💢|💥|💫|💦|💨|🕳|💣|💬|🗨|🗯|💭|💤|👋|🤚|🖐|🖖|👌|🤌|🤏|🤞|🤟|🤘|🤙|👈|👉|👆|🖕|👇|👍|👎|👊|🤛|🤜|👏|🙌|👐|🤲|🤝|🙏|💅|🤳|💪|🦾|🦿|🦵|🦶|👂|🦻|👃|🧠|🫀|🫁|🦷|🦴|👀|👁|👅|👄|👶|🧒|👦|👧|🧑|👱|👨|🧔|👩|🧓|👴|👵|🙍|🙎|🙅|🙆|💁|🙋|🧏|🙇|🤦|🤷|👮|🕵|💂|🥷|👷|🤴|👸|👳|👲|🧕|🤵|👰|🤰|🤱|👼|🎅|🤶|🦸|🦹|🧙|🧚|🧛|🧜|🧝|🧞|🧟|💆|💇|🚶|🧍|🧎|🏃|💃|🕺|🕴|👯|🧖|🧗|🤺|🏇|🏂|🏌|🏄|🚣|🏊|🏋|🚴|🚵|🤸|🤼|🤽|🤾|🤹|🧘|🛀|🛌|👭|👫|👬|💏|💑|👪|🗣|👤|👥|🫂|👣|🦰|🦱|🦳|🦲|🐵|🐒|🦍|🦧|🐶|🐕|🦮|🐩|🐺|🦊|🦝|🐱|🐈|🦁|🐯|🐅|🐆|🐴|🐎|🦄|🦓|🦌|🦬|🐮|🐂|🐃|🐄|🐷|🐖|🐗|🐽|🐏|🐑|🐐|🐪|🐫|🦙|🦒|🐘|🦣|🦏|🦛|🐭|🐁|🐀|🐹|🐰|🐇|🐿|🦫|🦔|🦇|🐻|🐨|🐼|🦥|🦦|🦨|🦘|🦡|🐾|🦃|🐔|🐓|🐣|🐤|🐥|🐦|🐧|🕊|🦅|🦆|🦢|🦉|🦤|🪶|🦩|🦚|🦜|🐸|🐊|🐢|🦎|🐍|🐲|🐉|🦕|🦖|🐳|🐋|🐬|🦭|🐟|🐠|🐡|🦈|🐙|🐚|🐌|🦋|🐛|🐜|🐝|🪲|🐞|🦗|🪳|🕷|🕸|🦂|🦟|🪰|🪱|🦠|💐|🌸|💮|🏵|🌹|🥀|🌺|🌻|🌼|🌷|🌱|🪴|🌲|🌳|🌴|🌵|🌾|🌿|🍀|🍁|🍂|🍃|🍇|🍈|🍉|🍊|🍋|🍌|🍍|🥭|🍎|🍏|🍐|🍑|🍒|🍓|🫐|🥝|🍅|🫒|🥥|🥑|🍆|🥔|🥕|🌽|🌶|🫑|🥒|🥬|🥦|🧄|🧅|🍄|🥜|🌰|🍞|🥐|🥖|🫓|🥨|🥯|🥞|🧇|🧀|🍖|🍗|🥩|🥓|🍔|🍟|🍕|🌭|🥪|🌮|🌯|🫔|🥙|🧆|🥚|🍳|🥘|🍲|🫕|🥣|🥗|🍿|🧈|🧂|🥫|🍱|🍘|🍙|🍚|🍛|🍜|🍝|🍠|🍢|🍣|🍤|🍥|🥮|🍡|🥟|🥠|🥡|🦀|🦞|🦐|🦑|🦪|🍦|🍧|🍨|🍩|🍪|🎂|🍰|🧁|🥧|🍫|🍬|🍭|🍮|🍯|🍼|🥛|🫖|🍵|🍶|🍾|🍷|🍸|🍹|🍺|🍻|🥂|🥃|🥤|🧋|🧃|🧉|🧊|🥢|🍽|🍴|🥄|🔪|🏺|🌍|🌎|🌏|🌐|🗺|🗾|🧭|🏔|🌋|🗻|🏕|🏖|🏜|🏝|🏞|🏟|🏛|🏗|🧱|🪨|🪵|🛖|🏘|🏚|🏠|🏡|🏢|🏣|🏤|🏥|🏦|🏨|🏩|🏪|🏫|🏬|🏭|🏯|🏰|💒|🗼|🗽|🕌|🛕|🕍|🕋|🌁|🌃|🏙|🌄|🌅|🌆|🌇|🌉|🎠|🎡|🎢|💈|🎪|🚂|🚃|🚄|🚅|🚆|🚇|🚈|🚉|🚊|🚝|🚞|🚋|🚌|🚍|🚎|🚐|🚑|🚒|🚓|🚔|🚕|🚖|🚗|🚘|🚙|🛻|🚚|🚛|🚜|🏎|🏍|🛵|🦽|🦼|🛺|🚲|🛴|🛹|🛼|🚏|🛣|🛤|🛢|🚨|🚥|🚦|🛑|🚧|🛶|🚤|🛳|🛥|🚢|🛩|🛫|🛬|🪂|💺|🚁|🚟|🚠|🚡|🛰|🚀|🛸|🛎|🧳|🕰|🕛|🕧|🕐|🕜|🕑|🕝|🕒|🕞|🕓|🕟|🕔|🕠|🕕|🕡|🕖|🕢|🕗|🕣|🕘|🕤|🕙|🕥|🕚|🕦|🌑|🌒|🌓|🌔|🌕|🌖|🌗|🌘|🌙|🌚|🌛|🌜|🌡|🌝|🌞|🪐|🌟|🌠|🌌|🌤|🌥|🌦|🌧|🌨|🌩|🌪|🌫|🌬|🌀|🌈|🌂|🔥|💧|🌊|🎃|🎄|🎆|🎇|🧨|🎈|🎉|🎊|🎋|🎍|🎎|🎏|🎐|🎑|🧧|🎀|🎁|🎗|🎟|🎫|🎖|🏆|🏅|🥇|🥈|🥉|🥎|🏀|🏐|🏈|🏉|🎾|🥏|🎳|🏏|🏑|🏒|🥍|🏓|🏸|🥊|🥋|🥅|🎣|🤿|🎽|🎿|🛷|🥌|🎯|🪀|🪁|🎱|🔮|🪄|🧿|🎮|🕹|🎰|🎲|🧩|🧸|🪅|🪆|🃏|🀄|🎴|🎭|🖼|🎨|🧵|🪡|🧶|🪢|👓|🕶|🥽|🥼|🦺|👔|👕|👖|🧣|🧤|🧥|🧦|👗|👘|🥻|🩱|🩲|🩳|👙|👚|👛|👜|👝|🛍|🎒|🩴|👞|👟|🥾|🥿|👠|👡|🩰|👢|👑|👒|🎩|🎓|🧢|🪖|📿|💄|💍|💎|🔇|🔈|🔉|🔊|📢|📣|📯|🔔|🔕|🎼|🎵|🎶|🎙|🎚|🎛|🎤|🎧|📻|🎷|🪗|🎸|🎹|🎺|🎻|🪕|🥁|🪘|📱|📲|📞|📟|📠|🔋|🔌|💻|🖥|🖨|🖱|🖲|💽|💾|💿|📀|🧮|🎥|🎞|📽|🎬|📺|📷|📸|📹|📼|🔍|🔎|🕯|💡|🔦|🏮|🪔|📔|📕|📖|📗|📘|📙|📚|📓|📒|📃|📜|📄|📰|🗞|📑|🔖|🏷|💰|🪙|💴|💵|💶|💷|💸|💳|🧾|💹|📧|📨|📩|📤|📥|📦|📫|📪|📬|📭|📮|🗳|🖋|🖊|🖌|🖍|📝|💼|📁|📂|🗂|📅|📆|🗒|🗓|📇|📈|📉|📊|📋|📌|📍|📎|🖇|📏|📐|🗃|🗄|🗑|🔒|🔓|🔏|🔐|🔑|🗝|🔨|🪓|🛠|🗡|🔫|🪃|🏹|🛡|🪚|🔧|🪛|🔩|🗜|🦯|🔗|🪝|🧰|🧲|🪜|🧪|🧫|🧬|🔬|🔭|📡|💉|🩸|💊|🩹|🩺|🚪|🛗|🪞|🪟|🛏|🛋|🪑|🚽|🪠|🚿|🛁|🪤|🪒|🧴|🧷|🧹|🧺|🧻|🪣|🧼|🪥|🧽|🧯|🛒|🚬|🪦|🗿|🪧|🏧|🚮|🚰|🚹|🚺|🚻|🚼|🚾|🛂|🛃|🛄|🛅|🚸|🚫|🚳|🚭|🚯|🚱|🚷|📵|🔞|🔃|🔄|🔙|🔚|🔛|🔜|🔝|🛐|🕉|🕎|🔯|🔀|🔁|🔂|🔼|🔽|🎦|🔅|🔆|📶|📳|📴|💱|💲|🔱|📛|🔰|🔟|🔠|🔡|🔢|🔣|🔤|🅰|🆎|🅱|🆑|🆒|🆓|🆔|🆕|🆖|🅾|🆗|🅿|🆘|🆙|🆚|🈁|🈂|🈷|🈶|🈯|🉐|🈹|🈚|🈲|🉑|🈸|🈴|🈳|🈺|🈵|🔴|🟠|🟡|🟢|🔵|🟣|🟤|🟥|🟧|🟨|🟩|🟦|🟪|🟫|🔶|🔷|🔸|🔹|🔺|🔻|💠|🔘|🔳|🔲|🏁|🚩|🎌|🏴|🏳|🏻|🏼|🏽|🏾|🏿|☺|☹|☠|❣|❤|✋|✌|☝|✊|✍|⛷|⛹|☘|☕|⛰|⛪|⛩|⛲|⛺|♨|⛽|⚓|⛵|⛴|✈|⌛|⏳|⌚|⏰|⏱|⏲|☀|⭐|☁|⛅|⛈|☂|☔|⛱|⚡|❄|☃|⛄|☄|✨|⚽|⚾|⛳|⛸|♠|♥|♦|♣|♟|⛑|☎|⌨|✉|✏|✒|✂|⛏|⚒|⚔|⚙|⚖|⛓|⚗|⚰|⚱|♿|⚠|⛔|☢|☣|⬆|↗|➡|↘|⬇|↙|⬅|↖|↕|↔|↩|↪|⤴|⤵|⚛|✡|☸|☯|✝|☦|☪|☮|♈|♉|♊|♋|♌|♍|♎|♏|♐|♑|♒|♓|⛎|▶|⏩|⏭|⏯|◀|⏪|⏮|⏫|⏬|⏸|⏹|⏺|⏏|♀|♂|⚧|✖|➕|➖|➗|♾|‼|⁉|❓|❔|❕|❗|〰|⚕|♻|⚜|⭕|✅|☑|✔|❌|❎|➰|➿|〽|✳|✴|❇|©|®|™|ℹ|Ⓜ|㊗|㊙|⚫|⚪|⬛|⬜|◼|◻|◾|◽|▪|▫)`
/*compile the pattern string into a regex*/
let emoRegex = new RegExp(emojiPattern, "g");
/*count of emojis*/
let emoCount = [..."👶🏻👦🏻👧🏻👨🏻👩🏻👱🏻♀️👱🏻👴🏻👵🏻👲🏻👳🏻♀️👳🏻👮🏻♀️👮🏻👷🏻♀️👷🏻💂🏻♀️💂🏻🕵🏻♀️👩🏻⚕️👨🏻⚕️👩🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾".matchAll(emoRegex)].length
console.log(emoCount) //37
/*modifying the pattern to count other characters too*/
let generalCounter = new RegExp(emojiPattern+"|.", "g") //emoji or regular character
let allCount = [..."$%^ other stuff equalling 28👶👦🏻👧🏻👨🏻👩🏻👱🏻♀️👱🏻👴🏻👵🏻👲🏻👳🏻♀️👳🏻👮🏻♀️👮🏻👷🏻♀️👷🏻💂🏻♀️💂🏻🕵🏻♀️👩🏻⚕️👨🏻⚕️👩🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾👨🏻🌾".matchAll(generalCounter)].length
console.log(allCount) //28+37 = 65
As you can see from the below example, this is to do with unicode encoding,
There's some great resources such as the one I took this example from.
https://blog.jonnew.com/posts/poo-dot-length-equals-two
console.log("👩❤️💋👩".length === 11);
For anyone interested, I had a similar problem where I wanted to count the length of an emoji at the end of a string.
This is the solution I came up with:
var emoji = new RegExp('(\\p{Extended_Pictographic})((\u200D\\p{Extended_Pictographic})*)$', 'u');
var testStrings = ['👨👩👧', '😂', '🌲'];
for(var string = 0; string < testStrings.length; string++){
var match = testStrings[string].match(emoji);
var chars = match == null ? 0 : match[0].length;
console.log(testStrings[string] + ': ' + chars);
}
Explanation: \\p{Extended_Pictographic} matches an emoji like 😂, consisting of two characters. Emojis like 👨👩👧 consists of 4 emojis (👨, 👩, 👧,👦) combined by a zero width joiner (\u200D).
The regex matches any emoji at the end ($). If there is a match the length is counted. I am sure it could be adopted for your use-case by matching all emojis in a given string and then subtracting the surplus. It's not a complete implementation for your particular question but I hope this gets you on the right track.
use lodash toArray method
console.log(_.toArray("👨👩👧").length); // 1
console.log(_.toArray("👨👩👧🧍♂️👩👧👧").length); // 3
Check here for Codesandbox
I suggest using the runes package to accomplish correct multi-byte string conversions cause else you will get more issues if using reducers and more to reverse strings for example.
Take a look at this great small package: runes
I need to insert an Omega (Ω) onto my html page. I am using its HTML escaped code to do that, so I can write Ω and get Ω. That's all fine and well when I put it into a HTML element; however, when I try to put it into my JS, e.g. var Omega = Ω, it parses that code as JS and the whole thing doesn't work. Anyone know how to go about this?
I'm guessing that you actually want Omega to be a string containing an uppercase omega? In that case, you can write:
var Omega = '\u03A9';
(Because Ω is the Unicode character with codepoint U+03A9; that is, 03A9 is 937, except written as four hexadecimal digits.)
Edited to add (in 2022): There now exists an alternative form that better supports codepoints above U+FFFF:
let Omega = '\u{03A9}';
let desertIslandEmoji = '\u{1F3DD}';
Judging from https://caniuse.com/mdn-javascript_builtins_string_unicode_code_point_escapes, most or all browsers added support for it in 2015, so it should be reasonably safe to use.
Although #ruakh gave a good answer, I will add some alternatives for completeness:
You could in fact use even var Omega = 'Ω' in JavaScript, but only if your JavaScript code is:
inside an event attribute, as in onclick="var Omega = 'Ω';
alert(Omega)" or
in a script element inside an XHTML (or XHTML + XML) document
served with an XML content type.
In these cases, the code will be first (before getting passed to the JavaScript interpreter) be parsed by an HTML parser so that character references like Ω are recognized. The restrictions make this an impractical approach in most cases.
You can also enter the Ω character as such, as in var Omega = 'Ω', but then the character encoding must allow that, the encoding must be properly declared, and you need software that let you enter such characters. This is a clean solution and quite feasible if you use UTF-8 encoding for everything and are prepared to deal with the issues created by it. Source code will be readable, and reading it, you immediately see the character itself, instead of code notations. On the other hand, it may cause surprises if other people start working with your code.
Using the \u notation, as in var Omega = '\u03A9', works independently of character encoding, and it is in practice almost universal. It can however be as such used only up to U+FFFF, i.e. up to \uffff, but most characters that most people ever heard of fall into that area. (If you need “higher” characters, you need to use either surrogate pairs or one of the two approaches above.)
You can also construct a character using the String.fromCharCode() method, passing as a parameter the Unicode number, in decimal as in var Omega = String.fromCharCode(937) or in hexadecimal as in var Omega = String.fromCharCode(0x3A9). This works up to U+FFFF. This approach can be used even when you have the Unicode number in a variable.
One option is to put the character literally in your script, e.g.:
const omega = 'Ω';
This requires that you let the browser know the correct source encoding, see Unicode in JavaScript
However, if you can't or don't want to do this (e.g. because the character is too exotic and can't be expected to be available in the code editor font), the safest option may be to use new-style string escape or String.fromCodePoint:
const omega = '\u{3a9}';
// or:
const omega = String.fromCodePoint(0x3a9);
This is not restricted to UTF-16 but works for all unicode code points. In comparison, the other approaches mentioned here have the following downsides:
HTML escapes (const omega = 'Ω';): only work when rendered unescaped in an HTML element
old style string escapes (const omega = '\u03A9';): restricted to UTF-16
String.fromCharCode: restricted to UTF-16
The answer is correct, but you don't need to declare a variable.
A string can contain your character:
"This string contains omega, that looks like this: \u03A9"
Unfortunately still those codes in ASCII are needed for displaying UTF-8, but I am still waiting (since too many years...) the day when UTF-8 will be same as ASCII was, and ASCII will be just a remembrance of the past.
I found this question when trying to implement a font-awesome style icon system in html. I have an API that provides me with a hex string and I need to convert it to unicode to match with the font-family.
Say I have the string const code = 'f004'; from my API. I can't do simple string concatenation (const unicode = '\u' + code;) since the system needs to recognize that it's unicode and this will in fact cause a syntax error if you try.
#coldfix mentioned using String.fromCodePoint but it takes a number as an argument, not a string.
To finally cross the finish line, just add parseInt and pass 16 (since hex is base 16) to it's second parameter. You'll finally get a unicode string from a simple hex string.
This is what I did:
const code = 'f004';
const toUnicode = code => String.fromCodePoint(parseInt(code, 16));
toUnicode(code);
// => '\uf004'
Try using Function(), like this:
var code = "2710"
var char = Function("return '\\u"+code+"';")()
It works well, just do not add any 's or "s or spaces.
In the example, char is "✐".
I am trying to write a function to calculate how likely two strings are to mean the same thing. In order to do this I am converting to lower case and removing special characters from the strings before I compare them. Currently I am removing the strings '.com' and 'the' using String.replace(substring, '') and special characters using String.replace(regex, '')
str = str.toLowerCase()
.replace('.com', '')
.replace('the', '')
.replace(/[&\/\\#,+()$~%.'":*?<>{}]/g, '');
Is there a better regex that I can use to remove the common patterns like '.com' and 'the' as well as the special characters? Or some other way to make this more efficient?
As my dataset grows I may find other common meaningless patterns that need to be removed before trying to match strings and would like to avoid the performance hit of chaining more replace functions.
Examples:
Fish & Chips? => fish chips
stackoverflow.com => stackoverflow
The Lord of the Rings => lord of rings
You can connect the replace calls to a single one with a rexexp like this:
str = str.toLowerCase().replace(/\.com|the|[&\/\\#,+()$~%.'":*?<>{}]/g, '');
The different strings to remove are inside parentheses () and separated by pipes |
This makes it easy enough to add more string to the regexp.
If you are storing the words to remove in an array, you can generate the regex using the RegExp constructor, e.g.:
var words = ["\\.com", "the"];
var rex = new RegExp(words.join("|") + "|[&\\/\\\\#,+()$~%.'\":*?<>{}]", "g");
Then reuse rex for each string:
str = str.toLowerCase().replace(rex, "");
Note the additional escaping required because instead of a regular expression literal, we're using a string, so the backslashes (in the words array and in the final bit) need to be escaped, as does the " (because I used " for the string quotes).
The problem with this question is that im sure you have a very concrete idea in your mind of what you want to do, but the solution you have arrived at (removing un-informative letters before making a is-identical comparison) may not be the best for the comparison you want to do.
I think perhaps a better idea would be to use a different method comparison and a different datastructure than a string. A very simple example would be to condense your strings to sets with set('string') and then compare set similarity/difference. Another method might be to create a Directed Acyclic Graph, or sub-string Trei. The main point is that it's probably ok to reduce the information from the original string and store/compare that - however don't underestimate the value of storing the original string, as it will help you down the road if you want to change the way you compare.
Finally, if your strings are really really really long, you might want to use a perceptual hash - which is like an MD5 hash except similar strings have similar hashes. However, you will most likely have to roll your own for short strings, and define what you think is important data, and what is superfluous.
I need to match interconnected Arabic characters to do expansion like this:
بسم الله الرحمن الرحيم
becomes
بـسـم الـلـه الـرحـمـن الـرحـيـم
is there a way to do that using regular expressions?
How about something like this:
"بسم الله الرحمن الرحيم".replace(/(ب|ت|ث|ج|ح|خ|س|ش|ص|ض|ط|ظ|ع|غ|ف|ق|ك|ل|م|ن|ه|ي)(?=\S)/g, "$1ـ");
returns:
"بـسـم الـلـه الـرحـمـن الـرحـيـم"
Clarification:
We're matching letters that can be interconnected with the proceeding character by doing an OR group between all those characters, then we make sure it's not followed by a white space (not an end of word). then we replace the first matched group (the letter) by itself ($1) followed by an expansion character.
I had a project once in which I had to choose the correct unicode codes to render depending on the position of the letters; so that they appear connected (or disconnected) as appropriate, because I was using a system non-compliant with Unicode.
The unicode values for the disconnected Meem (م) is different than the one that is connected. BUT:
Unfortunately for your case, and most fortunately for many other cases, it is part of the unicode specification that displaying letters be separated from their actual unicode value. This is why you might have the unicode for a disconnected Meem, but it displayed as connected! The specification includes that comparing the connected Meem to a disconnected one always yields the correct value semantically which is true for equivalence. This makes things a lot easier!
What I ended up doing is to create a static data structure (use hard coded dictionaries or arrays) or XML or whatever. This data structure would tell us when each Arabic letter is connected or not (to both after and before).
For example:
//list of chars that can connect before and after
var canConnectBeforeAfter = new List<char>() { 'ع', 'ت', 'ب', 'ي' /*and so on*/ };
//list of chars that can connect only to character before them (of that character can connect to the one after it! watch out for وو)
var cannotConnectAfter = new List<char>() { 'ر', 'و' };
var cannotConnect = new List<char>() { 'ء' });
You will need to add the right characters for the right lists. I hope you don't have to deal with Harakat!!!!
سلام, let me know if you need clarification