connection = Server::get(IDBConnection::class); $this->rootFolder = $this->createMock(IRootFolder::class); $sql = $this->connection->getDatabasePlatform()->getTruncateTableSQL('`*PREFIX*comments`'); $this->connection->prepare($sql)->execute(); $sql = $this->connection->getDatabasePlatform()->getTruncateTableSQL('`*PREFIX*reactions`'); $this->connection->prepare($sql)->execute(); } protected function addDatabaseEntry($parentId, $topmostParentId, $creationDT = null, $latestChildDT = null, $objectId = null, $expireDate = null) { $creationDT ??= new \DateTime(); $latestChildDT ??= new \DateTime('yesterday'); $objectId ??= 'file64'; $qb = $this->connection->getQueryBuilder(); $qb ->insert('comments') ->values([ 'parent_id' => $qb->createNamedParameter($parentId), 'topmost_parent_id' => $qb->createNamedParameter($topmostParentId), 'children_count' => $qb->createNamedParameter(2), 'actor_type' => $qb->createNamedParameter('users'), 'actor_id' => $qb->createNamedParameter('alice'), 'message' => $qb->createNamedParameter('nice one'), 'verb' => $qb->createNamedParameter('comment'), 'creation_timestamp' => $qb->createNamedParameter($creationDT, IQueryBuilder::PARAM_DATETIME_MUTABLE), 'latest_child_timestamp' => $qb->createNamedParameter($latestChildDT, IQueryBuilder::PARAM_DATETIME_MUTABLE), 'object_type' => $qb->createNamedParameter('files'), 'object_id' => $qb->createNamedParameter($objectId), 'expire_date' => $qb->createNamedParameter($expireDate, IQueryBuilder::PARAM_DATETIME_MUTABLE), 'reference_id' => $qb->createNamedParameter('referenceId'), 'meta_data' => $qb->createNamedParameter(json_encode(['last_edit_actor_id' => 'admin'])), ]) ->executeStatement(); return $qb->getLastInsertId(); } protected function getManager() { return new Manager( $this->connection, $this->createMock(LoggerInterface::class), $this->createMock(IConfig::class), $this->createMock(ITimeFactory::class), new EmojiHelper($this->connection), $this->createMock(IInitialStateService::class), $this->rootFolder, $this->createMock(IEventDispatcher::class), ); } public function testGetCommentNotFound(): void { $this->expectException(NotFoundException::class); $manager = $this->getManager(); $manager->get('22'); } public function testGetCommentNotFoundInvalidInput(): void { $this->expectException(\InvalidArgumentException::class); $manager = $this->getManager(); $manager->get('unexisting22'); } public function testGetComment(): void { $manager = $this->getManager(); $creationDT = new \DateTime('yesterday'); $latestChildDT = new \DateTime(); $qb = Server::get(IDBConnection::class)->getQueryBuilder(); $qb ->insert('comments') ->values([ 'parent_id' => $qb->createNamedParameter('2'), 'topmost_parent_id' => $qb->createNamedParameter('1'), 'children_count' => $qb->createNamedParameter(2), 'actor_type' => $qb->createNamedParameter('users'), 'actor_id' => $qb->createNamedParameter('alice'), 'message' => $qb->createNamedParameter('nice one'), 'verb' => $qb->createNamedParameter('comment'), 'creation_timestamp' => $qb->createNamedParameter($creationDT, 'datetime'), 'latest_child_timestamp' => $qb->createNamedParameter($latestChildDT, 'datetime'), 'object_type' => $qb->createNamedParameter('files'), 'object_id' => $qb->createNamedParameter('file64'), 'reference_id' => $qb->createNamedParameter('referenceId'), 'meta_data' => $qb->createNamedParameter(json_encode(['last_edit_actor_id' => 'admin'])), ]) ->executeStatement(); $id = (string)$qb->getLastInsertId(); $comment = $manager->get($id); $this->assertInstanceOf(IComment::class, $comment); $this->assertSame($id, $comment->getId()); $this->assertSame('2', $comment->getParentId()); $this->assertSame('1', $comment->getTopmostParentId()); $this->assertSame(2, $comment->getChildrenCount()); $this->assertSame('users', $comment->getActorType()); $this->assertSame('alice', $comment->getActorId()); $this->assertSame('nice one', $comment->getMessage()); $this->assertSame('comment', $comment->getVerb()); $this->assertSame('files', $comment->getObjectType()); $this->assertSame('file64', $comment->getObjectId()); $this->assertEquals($creationDT->getTimestamp(), $comment->getCreationDateTime()->getTimestamp()); $this->assertEquals($latestChildDT->getTimestamp(), $comment->getLatestChildDateTime()->getTimestamp()); $this->assertEquals('referenceId', $comment->getReferenceId()); $this->assertEquals(['last_edit_actor_id' => 'admin'], $comment->getMetaData()); } public function testGetTreeNotFound(): void { $this->expectException(NotFoundException::class); $manager = $this->getManager(); $manager->getTree('22'); } public function testGetTreeNotFoundInvalidIpnut(): void { $this->expectException(\InvalidArgumentException::class); $manager = $this->getManager(); $manager->getTree('unexisting22'); } public function testGetTree(): void { $headId = $this->addDatabaseEntry(0, 0); $this->addDatabaseEntry($headId, $headId, new \DateTime('-3 hours')); $this->addDatabaseEntry($headId, $headId, new \DateTime('-2 hours')); $id = $this->addDatabaseEntry($headId, $headId, new \DateTime('-1 hour')); $manager = $this->getManager(); $tree = $manager->getTree($headId); // Verifying the root comment $this->assertArrayHasKey('comment', $tree); $this->assertInstanceOf(IComment::class, $tree['comment']); $this->assertSame((string)$headId, $tree['comment']->getId()); $this->assertArrayHasKey('replies', $tree); $this->assertCount(3, $tree['replies']); // one level deep foreach ($tree['replies'] as $reply) { $this->assertInstanceOf(IComment::class, $reply['comment']); $this->assertSame((string)$id, $reply['comment']->getId()); $this->assertCount(0, $reply['replies']); $id--; } } public function testGetTreeNoReplies(): void { $id = $this->addDatabaseEntry(0, 0); $manager = $this->getManager(); $tree = $manager->getTree($id); // Verifying the root comment $this->assertArrayHasKey('comment', $tree); $this->assertInstanceOf(IComment::class, $tree['comment']); $this->assertSame((string)$id, $tree['comment']->getId()); $this->assertArrayHasKey('replies', $tree); $this->assertCount(0, $tree['replies']); } public function testGetTreeWithLimitAndOffset(): void { $headId = $this->addDatabaseEntry(0, 0); $this->addDatabaseEntry($headId, $headId, new \DateTime('-3 hours')); $this->addDatabaseEntry($headId, $headId, new \DateTime('-2 hours')); $this->addDatabaseEntry($headId, $headId, new \DateTime('-1 hour')); $idToVerify = $this->addDatabaseEntry($headId, $headId, new \DateTime()); $manager = $this->getManager(); for ($offset = 0; $offset < 3; $offset += 2) { $tree = $manager->getTree((string)$headId, 2, $offset); // Verifying the root comment $this->assertArrayHasKey('comment', $tree); $this->assertInstanceOf(IComment::class, $tree['comment']); $this->assertSame((string)$headId, $tree['comment']->getId()); $this->assertArrayHasKey('replies', $tree); $this->assertCount(2, $tree['replies']); // one level deep foreach ($tree['replies'] as $reply) { $this->assertInstanceOf(IComment::class, $reply['comment']); $this->assertSame((string)$idToVerify, $reply['comment']->getId()); $this->assertCount(0, $reply['replies']); $idToVerify--; } } } public function testGetForObject(): void { $this->addDatabaseEntry(0, 0); $manager = $this->getManager(); $comments = $manager->getForObject('files', 'file64'); $this->assertIsArray($comments); $this->assertCount(1, $comments); $this->assertInstanceOf(IComment::class, $comments[0]); $this->assertSame('nice one', $comments[0]->getMessage()); } public function testGetForObjectWithLimitAndOffset(): void { $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); $this->addDatabaseEntry(0, 0, new \DateTime('-5 hours')); $this->addDatabaseEntry(1, 1, new \DateTime('-4 hours')); $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); $this->addDatabaseEntry(2, 2, new \DateTime('-1 hours')); $idToVerify = $this->addDatabaseEntry(3, 1, new \DateTime()); $manager = $this->getManager(); $offset = 0; do { $comments = $manager->getForObject('files', 'file64', 3, $offset); $this->assertIsArray($comments); foreach ($comments as $key => $comment) { $this->assertInstanceOf(IComment::class, $comment); $this->assertSame('nice one', $comment->getMessage()); $this->assertSame((string)$idToVerify, $comment->getId(), 'ID wrong for comment ' . $key . ' on offset: ' . $offset); $idToVerify--; } $offset += 3; } while (count($comments) > 0); } public function testGetForObjectWithDateTimeConstraint(): void { $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); $this->addDatabaseEntry(0, 0, new \DateTime('-5 hours')); $id1 = $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); $id2 = $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); $manager = $this->getManager(); $comments = $manager->getForObject('files', 'file64', 0, 0, new \DateTime('-4 hours')); $this->assertCount(2, $comments); $this->assertSame((string)$id2, $comments[0]->getId()); $this->assertSame((string)$id1, $comments[1]->getId()); } public function testGetForObjectWithLimitAndOffsetAndDateTimeConstraint(): void { $this->addDatabaseEntry(0, 0, new \DateTime('-7 hours')); $this->addDatabaseEntry(0, 0, new \DateTime('-6 hours')); $this->addDatabaseEntry(1, 1, new \DateTime('-5 hours')); $this->addDatabaseEntry(0, 0, new \DateTime('-3 hours')); $this->addDatabaseEntry(2, 2, new \DateTime('-2 hours')); $this->addDatabaseEntry(2, 2, new \DateTime('-1 hours')); $idToVerify = $this->addDatabaseEntry(3, 1, new \DateTime()); $manager = $this->getManager(); $offset = 0; do { $comments = $manager->getForObject('files', 'file64', 3, $offset, new \DateTime('-4 hours')); $this->assertIsArray($comments); foreach ($comments as $comment) { $this->assertInstanceOf(IComment::class, $comment); $this->assertSame('nice one', $comment->getMessage()); $this->assertSame((string)$idToVerify, $comment->getId()); $this->assertGreaterThanOrEqual(4, $comment->getId()); $idToVerify--; } $offset += 3; } while (count($comments) > 0); } public function testGetNumberOfCommentsForObject(): void { for ($i = 1; $i < 5; $i++) { $this->addDatabaseEntry(0, 0); } $manager = $this->getManager(); $amount = $manager->getNumberOfCommentsForObject('untype', '00'); $this->assertSame(0, $amount); $amount = $manager->getNumberOfCommentsForObject('files', 'file64'); $this->assertSame(4, $amount); } public function testGetNumberOfUnreadCommentsForFolder(): void { $folder = $this->createMock(Folder::class); $fileIds = range(1111, 1114); $children = array_map(function (int $id) { $file = $this->createMock(Folder::class); $file->method('getId') ->willReturn($id); return $file; }, $fileIds); $folder->method('getId')->willReturn(1000); $folder->method('getDirectoryListing')->willReturn($children); $this->rootFolder->method('getFirstNodeById') ->with($folder->getId()) ->willReturn($folder); // 2 comment for 1111 with 1 before read marker // 2 comments for 1112 with no read marker // 1 comment for 1113 before read marker // 1 comment for 1114 with no read marker $this->addDatabaseEntry(0, 0, null, null, $fileIds[1]); for ($i = 0; $i < 4; $i++) { $this->addDatabaseEntry(0, 0, null, null, $fileIds[$i]); } $this->addDatabaseEntry(0, 0, (new \DateTime())->modify('-2 days'), null, $fileIds[0]); /** @var IUser|\PHPUnit\Framework\MockObject\MockObject $user */ $user = $this->createMock(IUser::class); $user->expects($this->any()) ->method('getUID') ->willReturn('comment_test'); $manager = $this->getManager(); $manager->setReadMark('files', (string)$fileIds[0], (new \DateTime())->modify('-1 days'), $user); $manager->setReadMark('files', (string)$fileIds[2], (new \DateTime()), $user); $amount = $manager->getNumberOfUnreadCommentsForFolder($folder->getId(), $user); $this->assertEquals([ $fileIds[0] => 1, $fileIds[1] => 2, $fileIds[3] => 1, ], $amount); } #[\PHPUnit\Framework\Attributes\DataProvider('dataGetForObjectSince')] public function testGetForObjectSince(?int $lastKnown, string $order, int $limit, int $resultFrom, int $resultTo): void { $ids = []; $ids[] = $this->addDatabaseEntry(0, 0); $ids[] = $this->addDatabaseEntry(0, 0); $ids[] = $this->addDatabaseEntry(0, 0); $ids[] = $this->addDatabaseEntry(0, 0); $ids[] = $this->addDatabaseEntry(0, 0); $manager = $this->getManager(); $comments = $manager->getForObjectSince('files', 'file64', ($lastKnown === null ? 0 : $ids[$lastKnown]), $order, $limit); $expected = array_slice($ids, $resultFrom, $resultTo - $resultFrom + 1); if ($order === 'desc') { $expected = array_reverse($expected); } $this->assertSame($expected, array_map(static fn (IComment $c): int => (int)$c->getId(), $comments)); } public static function dataGetForObjectSince(): array { return [ [null, 'asc', 20, 0, 4], [null, 'asc', 2, 0, 1], [null, 'desc', 20, 0, 4], [null, 'desc', 2, 3, 4], [1, 'asc', 20, 2, 4], [1, 'asc', 2, 2, 3], [3, 'desc', 20, 0, 2], [3, 'desc', 2, 1, 2], ]; } public static function invalidCreateArgsProvider(): array { return [ ['', 'aId-1', 'oType-1', 'oId-1'], ['aType-1', '', 'oType-1', 'oId-1'], ['aType-1', 'aId-1', '', 'oId-1'], ['aType-1', 'aId-1', 'oType-1', ''], [1, 'aId-1', 'oType-1', 'oId-1'], ['aType-1', 1, 'oType-1', 'oId-1'], ['aType-1', 'aId-1', 1, 'oId-1'], ['aType-1', 'aId-1', 'oType-1', 1], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('invalidCreateArgsProvider')] public function testCreateCommentInvalidArguments(string|int $aType, string|int $aId, string|int $oType, string|int $oId): void { $this->expectException(\InvalidArgumentException::class); $manager = $this->getManager(); $manager->create($aType, $aId, $oType, $oId); } public function testCreateComment(): void { $actorType = 'bot'; $actorId = 'bob'; $objectType = 'weather'; $objectId = 'bielefeld'; $comment = $this->getManager()->create($actorType, $actorId, $objectType, $objectId); $this->assertInstanceOf(IComment::class, $comment); $this->assertSame($actorType, $comment->getActorType()); $this->assertSame($actorId, $comment->getActorId()); $this->assertSame($objectType, $comment->getObjectType()); $this->assertSame($objectId, $comment->getObjectId()); } public function testDelete(): void { $this->expectException(NotFoundException::class); $manager = $this->getManager(); $done = $manager->delete('404'); $this->assertFalse($done); $done = $manager->delete('%'); $this->assertFalse($done); $done = $manager->delete(''); $this->assertFalse($done); $id = (string)$this->addDatabaseEntry(0, 0); $comment = $manager->get($id); $this->assertInstanceOf(IComment::class, $comment); $done = $manager->delete($id); $this->assertTrue($done); $manager->get($id); } #[\PHPUnit\Framework\Attributes\DataProvider('providerTestSave')] public function testSave(string $message, string $actorId, string $verb, ?string $parentId, ?string $id = ''): IComment { $manager = $this->getManager(); $comment = new Comment(); $comment ->setId($id) ->setActor('users', $actorId) ->setObject('files', 'file64') ->setMessage($message) ->setVerb($verb); if ($parentId) { $comment->setParentId($parentId); } $saveSuccessful = $manager->save($comment); $this->assertTrue($saveSuccessful, 'Comment saving was not successful'); $this->assertNotEquals('', $comment->getId(), 'Comment ID should not be empty'); $this->assertNotEquals('0', $comment->getId(), 'Comment ID should not be string \'0\''); $this->assertNotNull($comment->getCreationDateTime(), 'Comment creation date should not be null'); $loadedComment = $manager->get($comment->getId()); $this->assertSame($comment->getMessage(), $loadedComment->getMessage(), 'Comment message should match'); $this->assertEquals($comment->getCreationDateTime()->getTimestamp(), $loadedComment->getCreationDateTime()->getTimestamp(), 'Comment creation date should match'); return $comment; } public static function providerTestSave(): array { return [ ['very beautiful, I am impressed!', 'alice', 'comment', null], ]; } public function testSaveUpdate(): void { $manager = $this->getManager(); $comment = new Comment(); $comment ->setActor('users', 'alice') ->setObject('files', 'file64') ->setMessage('very beautiful, I am impressed!') ->setVerb('comment') ->setExpireDate(new \DateTime('+2 hours')); $manager->save($comment); $loadedComment = $manager->get($comment->getId()); // Compare current object with database values $this->assertSame($comment->getMessage(), $loadedComment->getMessage()); $this->assertSame( $comment->getExpireDate()->format('Y-m-d H:i:s'), $loadedComment->getExpireDate()->format('Y-m-d H:i:s') ); // Preserve the original comment to compare after update $original = clone $comment; // Update values $comment->setMessage('very beautiful, I am really so much impressed!') ->setExpireDate(new \DateTime('+1 hours')); $manager->save($comment); $loadedComment = $manager->get($comment->getId()); // Compare current object with database values $this->assertSame($comment->getMessage(), $loadedComment->getMessage()); $this->assertSame( $comment->getExpireDate()->format('Y-m-d H:i:s'), $loadedComment->getExpireDate()->format('Y-m-d H:i:s') ); // Compare original object with database values $this->assertNotSame($original->getMessage(), $loadedComment->getMessage()); $this->assertNotSame( $original->getExpireDate()->format('Y-m-d H:i:s'), $loadedComment->getExpireDate()->format('Y-m-d H:i:s') ); } public function testSaveUpdateException(): void { $manager = $this->getManager(); $comment = new Comment(); $comment ->setActor('users', 'alice') ->setObject('files', 'file64') ->setMessage('very beautiful, I am impressed!') ->setVerb('comment'); $manager->save($comment); $manager->delete($comment->getId()); $comment->setMessage('very beautiful, I am really so much impressed!'); $this->expectException(NotFoundException::class); $manager->save($comment); } public function testSaveIncomplete(): void { $manager = $this->getManager(); $comment = new Comment(); $comment->setMessage('from no one to nothing'); $this->expectException(\UnexpectedValueException::class); $manager->save($comment); } public function testSaveAsChild(): void { $id = (string)$this->addDatabaseEntry(0, 0); $manager = $this->getManager(); for ($i = 0; $i < 3; $i++) { $comment = new Comment(); $comment ->setActor('users', 'alice') ->setObject('files', 'file64') ->setParentId($id) ->setMessage('full ack') ->setVerb('comment') // setting the creation time avoids using sleep() while making sure to test with different timestamps ->setCreationDateTime(new \DateTime('+' . $i . ' minutes')); $manager->save($comment); $this->assertSame($id, $comment->getTopmostParentId()); $parentComment = $manager->get($id); $this->assertSame($i + 1, $parentComment->getChildrenCount()); $this->assertEquals($comment->getCreationDateTime()->getTimestamp(), $parentComment->getLatestChildDateTime()->getTimestamp()); } } public static function invalidActorArgsProvider():
---
title: Layout Formatting
order: 13
layout: page
---

[[layout.settings]]
= Layout Formatting

While the formatting of layouts is mainly done with style sheets, just as with
other components, style sheets are not ideal or even possible to use in some
situations. For example, CSS does not allow defining the spacing of table cells,
which is done with the [parameter]#cellspacing# attribute in HTML.

Moreover, as many layout sizes are calculated dynamically in the Client-Side
Engine of Vaadin, some CSS settings can fail altogether.

[[layout.settings.size]]
== Layout Size

The size of a layout component can be specified with the
[methodname]#setWidth()# and [methodname]#setHeight()# methods defined in the
[classname]#Sizeable# interface, just like for any component. It can also be
undefined, in which case the layout shrinks to fit the component(s) inside it.
<<dummy/../../../framework/components/components-features#components.features.sizeable,"Sizing
Components">> gives details on the interface.

[[figure.layout.settings.size.undefined]]
.[classname]#HorizontalLayout# with Undefined vs Defined size
image::img/layout_size_undefined_vs_defined.png[]

Many layout components take 100% width by default, while they have the height
undefined.

The sizes of components inside a layout can also be defined as a percentage of
the space available in the layout, for example with
[methodname]#setWidth("100%");# or with the (most commonly used method)
[methodname]#setFullSize()# that sets 100% size in both directions. If you use a
percentage in a [classname]#HorizontalLayout#, [classname]#VerticalLayout#, or
[classname]#GridLayout#, you will also have to set the component as
__expanding__, as noted below.


[WARNING]
====
__A layout that contains components with percentual size must have a defined
size__!

If a layout has undefined size and a contained component has, say, 100% size,
the component will try to fill the space given by the layout, while the layout
will shrink to fit the space taken by the component, which is a paradox. This
requirement holds for height and width separately. The debug mode allows
detecting such invalid cases; see
<<dummy/../../../framework/advanced/advanced-debug#advanced.debug.hierarchy,"Inspecting
Component Hierarchy">>.

====



For example:


[source, java]
----
// This takes 100% width but has undefined height.
VerticalLayout layout = new VerticalLayout();

// A button that takes all the space available in the layout.
Button button = new Button("100%x100% button");
button.setSizeFull();
layout.addComponent(button);

// We must set the layout to a defined height vertically, in
// this case 100% of its parent layout, which also must
// not have undefined size.
layout.setHeight("100%");
----

If you have a layout with undefined height, such as [classname]#VerticalLayout#,
in a [classname]#UI#, [classname]#Window#, or [classname]#Panel#, and put enough
content in it so that it extends outside the bottom of the view area, scrollbars
will appear. If you want your application to use all the browser view, nothing
more or less, you should use [methodname]#setFullSize()# for the root layout.


[source, java]
----
// Create the UI content
VerticalLayout content = new VerticalLayout();

// Use entire view area
content.setSizeFull();

setContent(content);
----


[[layout.settings.size.expanding]]
== Expanding Components

If you set a [classname]#HorizontalLayout# to a defined size horizontally or a
[classname]#VerticalLayout# vertically, and there is space left over from the
contained components, the extra space is distributed equally between the
component cells. The components are aligned within these cells, according to
their alignment setting, top left by default, as in the example below.

Often, you don't want such empty space, but want one or more components to take
all the leftover space. You need to set such a component to 100% size and use
[methodname]#setExpandRatio()#. If there is just one such expanding component in
the layout, the ratio parameter is irrelevant.

If you set multiple components as expanding, the expand ratio dictates how large
proportion of the available space (overall or excess depending on whether the
components are sized as a percentage or not) each component takes. In the
example below, the buttons have 1:2:3 ratio for the expansion.

[classname]#GridLayout# has corresponding method for both of its directions,
[methodname]#setRowExpandRatio()# and [methodname]#setColumnExpandRatio()#.

Expansion is dealt in detail in the documentation of the layout components that
support it. See
<<dummy/../../../framework/layout/layout-orderedlayout#layout.orderedlayout,"VerticalLayout
and HorizontalLayout">> and
<<dummy/../../../framework/layout/layout-gridlayout#layout.gridlayout,"GridLayout">>
for details on components with relative sizes.


[[layout.settings.alignment]]
== Layout Cell Alignment

((("Alignment", id="term.alignment", range="startofrange")))


((("[methodname]#setComponentAlignment()#", id="term.setcomponentalignment", range="startofrange")))


When a component in a layout cell has size (width or height) smaller than the
size of the cell, it will by default be aligned in the top-left corner of the
cell. You can set the alignment with the [methodname]#setComponentAlignment()#
method. The method takes as its parameters the component contained in the cell
to be formatted, and the horizontal and vertical alignment. The component must
have been added to the layout before setting the alignment.

<<figure.layout.settings.alignment>> illustrates the alignment of components
within a [classname]#GridLayout#.

[[figure.layout.settings.alignment]]
.Cell Alignments
image::img/layout_alignment.png[]

Note that __a component with 100% relative size can not be aligned__, as it will
take the entire width or height of the cell, in which case alignment is
meaningless. This should especially be noted with the [classname]#Label#
component, which has 100% default width, and the text alignment __within__ the
component is separate, defined by the CSS [literal]#++text-align++# property.

The easiest way to set alignments is to use the constants defined in the
[classname]#Alignment# class. Let us look how the buttons in the top row of the
above [classname]#GridLayout# are aligned with constants:


[source, java]
----
// Create a grid layout
GridLayout grid = new GridLayout(3, 3);

grid.setWidth(400, Sizeable.UNITS_PIXELS);
grid.setHeight(200, Sizeable.UNITS_PIXELS);

Button topleft = new Button("Top Left");
grid.addComponent(topleft, 0, 0);
grid.setComponentAlignment(topleft, Alignment.TOP_LEFT);

Button topcenter = new Button("Top Center");
grid.addComponent(topcenter, 1, 0);
grid.setComponentAlignment(topcenter, Alignment.TOP_CENTER);

Button topright = new Button("Top Right");
grid.addComponent(topright, 2, 0);
grid.setComponentAlignment(topright, Alignment.TOP_RIGHT);
...
----

The following table lists all the [classname]#Alignment# constants by their
respective locations:

.Alignment Constants

|===============
|[parameter]#TOP_LEFT#|[parameter]#TOP_CENTER#|[parameter]#TOP_RIGHT#
|[parameter]#MIDDLE_LEFT#|[parameter]#MIDDLE_CENTER#|[parameter]#MIDDLE_RIGHT#
|[parameter]#BOTTOM_LEFT#|[parameter]#BOTTOM_CENTER#|[parameter]#BOTTOM_RIGHT#

|===============



Another way to specify the alignments is to create an [classname]#Alignment#
object and specify the horizontal and vertical alignment with separate
constants. You can specify either of the directions, in which case the other
alignment direction is not modified, or both with a bitmask operation between
the two directions.


[source, java]
----
Button middleleft = new Button("Middle Left");
grid.addComponent(middleleft, 0, 1);
grid.setComponentAlignment(middleleft,
          new Alignment(Bits.ALIGNMENT_VERTICAL_CENTER | 
                        Bits.ALIGNMENT_LEFT));

Button middlecenter = new Button("Middle Center");
grid.addComponent(middlecenter, 1, 1);
grid.setComponentAlignment(middlecenter,
          new Alignment(Bits.ALIGNMENT_VERTICAL_CENTER |
                        Bits.ALIGNMENT_HORIZONTAL_CENTER));

Button middleright = new Button("Middle Right");
grid.addComponent(middleright, 2, 1);
grid.setComponentAlignment(middleright,
          new Alignment(Bits.ALIGNMENT_VERTICAL_CENTER |
                        Bits.ALIGNMENT_RIGHT));
----

Obviously, you may combine only one vertical bitmask with one horizontal
bitmask, though you may leave either one out. The following table lists the
available alignment bitmask constants:

.Alignment Bitmasks

|===============
|Horizontal|[parameter]#Bits.ALIGNMENT_LEFT#
|[parameter]#Bits.ALIGNMENT_HORIZONTAL_CENTER#
|[parameter]#Bits.ALIGNMENT_RIGHT#
|Vertical|[parameter]#Bits.ALIGNMENT_TOP#
|[parameter]#Bits.ALIGNMENT_VERTICAL_CENTER#
|[parameter]#Bits.ALIGNMENT_BOTTOM#

|===============



You can determine the current alignment of a component with
[methodname]#getComponentAlignment()#, which returns an [classname]#Alignment#
object. The class provides a number of getter methods for decoding the
alignment, which you can also get as a bitmask value.

[[layout.settings.alignment.size]]
=== Size of Aligned Components

You can only align a component that is smaller than its containing cell in the
direction of alignment. If a component has 100% width, as many components have
by default, horizontal alignment does not have any effect. For example,
[classname]#Label# is 100% wide by default and can not therefore be horizontally
aligned as such. The problem can be hard to notice, as the text inside a
[classname]#Label# is left-aligned.

You usually need to set either a fixed size, undefined size, or less than a 100%
relative size for the component to be aligned - a size that is smaller than the
containing layout has.

For example, assuming that a [classname]#Label# has short content that is less
wide than the containing [classname]#VerticalLayout#, you could center it as
follows:


[source, java]
----
VerticalLayout layout = new VerticalLayout(); // 100% default width
Label label = new Label("Hello"); // 100% default width
label.setSizeUndefined();
layout.addComponent(label);
layout.setComponentAlignment(label, Alignment.MIDDLE_CENTER);
----

If you set the size as undefined and the component itself contains components,
make sure that the contained components also have either undefined or fixed
size. For example, if you set the size of a [classname]#Form# as undefined, its
containing layout [classname]#FormLayout# has 100% default width, which you also
need to set as undefined. But then, any components inside the
[classname]#FormLayout# must have either undefined or fixed size.


(((range="endofrange", startref="term.alignment")))
(((range="endofrange", startref="term.setcomponentalignment")))

[[layout.settings.spacing]]
== Layout Cell Spacing

The [classname]#VerticalLayout#, [classname]#HorizontalLayout#, and
[classname]#GridLayout# layouts offer a [methodname]#setSpacing()# method to
enable spacing between the cells of the layout.

For example:


[source, java]
----
VerticalLayout layout = new VerticalLayout();
layout.setSpacing(true);
layout.addComponent(new Button("Component 1"));
layout.addComponent(new Button("Component 2"));
layout.addComponent(new Button("Component 3"));
----

The effect of spacing in [classname]#VerticalLayout# and
[classname]#HorizontalLayout# is illustrated in <<figure.layout.spacing>>.

[[figure.layout.spacing]]
.Layout Spacings
image::img/layout_spacing.png[]

The exact amount of spacing is defined in CSS. If the default is not suitable,
you can customize it in a custom theme.

In the Valo theme, you can specify the spacing with the
$v-layout-spacing-vertical and $v-layout-spacing-horizontal parameters, as
described in
<<dummy/../../../framework/themes/themes-valo#themes.valo.variables,"Common
Settings">>. The spacing defaults to the $v-unit-size measure.

When adjusting spacing in other themes, you should note that it is implemented
in a bit different ways in different layouts. In the ordered layouts, it is done
with spacer elements, while in the [classname]#GridLayout# it has special
handling. Please see the sections on the individual components for more details.


[[layout.settings.margins]]
== Layout Margins

Most layout components do not have any margin around them by default. The
ordered layouts, as well as [classname]#GridLayout#, support enabling a margin
with [methodname]#setMargin()#. This enables CSS classes for each margin in the
HTML element of the layout component.

In the Valo theme, the margin sizes default to $v-unit-size. You can customize
them with $v-layout-margin-top, right, bottom, and left. See
<<dummy/../../../framework/themes/themes-valo#themes.valo.variables,"Common
Settings">> for a description of the parameters.

To customize the default margins in other themes, you can define each margin
with the [literal]#++padding++# property in CSS. You may want to have a custom
CSS class for the layout component to enable specific customization of the
margins, as is done in the following with the [literal]#++mymargins++# class:

[subs="normal"]
----

.**mymargins**.v-margin-left   {padding-left:   **10**px;}
.**mymargins**.v-margin-right  {padding-right:  **20**px;}
.**mymargins**.v-margin-top    {padding-top:    **40**px;}
.**mymargins**.v-margin-bottom {padding-bottom: **80**px;}
----
You can enable only specific margins by passing a [classname]#MarginInfo# to the
[methodname]#setMargin()#. The margins are specified in clockwise order for top,
right, bottom, and left margin. The following would enable the left and right
margins:


[source, java]
----
layout.setMargin(new MarginInfo(false, true, false, true));
----

The resulting margins are shown in <<figure.layout.margin>> below. The two ways
produce identical margins.

[[figure.layout.margin]]
.Layout Margins
image::img/layout_margin.png[]
n', 'message#alice'], ['๐Ÿซข', 'alice', 'reaction', 'message#alice'], ['๐Ÿคญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฅ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ถ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ถโ€๐ŸŒซ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜‘', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซ ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™„', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ฏ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ฎ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฅฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ด', 'alice', 'reaction', 'message#alice'], ['๐Ÿคค', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ช', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ต', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ตโ€๐Ÿ’ซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซฅ', 'alice', 'reaction', 'message#alice'], ['๐Ÿค', 'alice', 'reaction', 'message#alice'], ['๐Ÿฅด', 'alice', 'reaction', 'message#alice'], ['๐Ÿคข', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฎ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ท', 'alice', 'reaction', 'message#alice'], ['๐Ÿค’', 'alice', 'reaction', 'message#alice'], ['๐Ÿค•', 'alice', 'reaction', 'message#alice'], ['๐Ÿค‘', 'alice', 'reaction', 'message#alice'], ['๐Ÿค ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ˆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฟ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘น', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘บ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคก', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’ฉ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’€', 'alice', 'reaction', 'message#alice'], ['โ˜ ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘พ', 'alice', 'reaction', 'message#alice'], ['๐Ÿค–', 'alice', 'reaction', 'message#alice'], ['๐ŸŽƒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜บ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜น', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™€', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜ฟ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ˜พ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ถ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿง’', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿฆฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿฆฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿฆฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿฆฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฑโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฑโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿฆณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿฆณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿฆณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿฆฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿฆฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง”โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง”', 'alice', 'reaction', 'message#alice'], ['๐Ÿง”โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ต', 'alice', 'reaction', 'message#alice'], ['๐Ÿง“', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ด', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ณโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ณโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง•', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฎโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฎ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฎโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ทโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ท', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ทโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‚โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‚', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‚โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ต๏ธโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ต๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ต๏ธโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€โš•๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€โš•๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€โš•๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐ŸŒพ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐ŸŒพ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐ŸŒพ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐ŸŽ“', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐ŸŽ“', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐ŸŽ“', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐ŸŽค', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐ŸŽค', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐ŸŽค', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ’ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿ’ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ’ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ’ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿ’ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ’ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ”ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿ”ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ”ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ”ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿ”ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ”ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐ŸŽจ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐ŸŽจ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐ŸŽจ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿš’', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿš’', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿš’', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€โœˆ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€โœˆ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€โœˆ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿš€', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿš€', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿš€', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€โš–๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€โš–๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€โš–๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฐโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฐโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคตโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคต', 'alice', 'reaction', 'message#alice'], ['๐Ÿคตโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซ…', 'alice', 'reaction', 'message#alice'], ['๐Ÿคด', 'alice', 'reaction', 'message#alice'], ['๐Ÿฅท', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆธโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆธโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆนโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆน', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆนโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคถ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐ŸŽ„', 'alice', 'reaction', 'message#alice'], ['๐ŸŽ…', 'alice', 'reaction', 'message#alice'], ['๐Ÿง™โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง™', 'alice', 'reaction', 'message#alice'], ['๐Ÿง™โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง', 'alice', 'reaction', 'message#alice'], ['๐Ÿงโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง›โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง›', 'alice', 'reaction', 'message#alice'], ['๐Ÿง›โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐ŸงŸโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐ŸงŸ', 'alice', 'reaction', 'message#alice'], ['๐ŸงŸโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงžโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงž', 'alice', 'reaction', 'message#alice'], ['๐Ÿงžโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงœโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงœ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงœโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงšโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงš', 'alice', 'reaction', 'message#alice'], ['๐Ÿงšโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐ŸงŒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซ„', 'alice', 'reaction', 'message#alice'], ['๐Ÿซƒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‡โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‡', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‡โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™…โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™…', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™…โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™†โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™†', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™†โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‹โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‹', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‹โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง', 'alice', 'reaction', 'message#alice'], ['๐Ÿงโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฆโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฆโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคทโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคท', 'alice', 'reaction', 'message#alice'], ['๐Ÿคทโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™Žโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™Ž', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™Žโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‡โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‡', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‡โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’†โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’†', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’†โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง–โ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง–', 'alice', 'reaction', 'message#alice'], ['๐Ÿง–โ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’…', 'alice', 'reaction', 'message#alice'], ['๐Ÿคณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’ƒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•บ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฏโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฏ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฏโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ด', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿฆฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿฆฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿฆผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿฆผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿฆผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿšถโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿšถ', 'alice', 'reaction', 'message#alice'], ['๐Ÿšถโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฏ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿฆฏ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿฆฏ', 'alice', 'reaction', 'message#alice'], ['๐ŸงŽโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐ŸงŽ', 'alice', 'reaction', 'message#alice'], ['๐ŸงŽโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿƒโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿƒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿƒโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง', 'alice', 'reaction', 'message#alice'], ['๐Ÿงโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‘', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ช', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ—ฃ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ค', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฅ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซ‚', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘‹๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคš๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ–๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['โœ‹๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ––๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘Œ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐ŸคŒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿค๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['โœŒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคž๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซฐ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐ŸคŸ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿค˜๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿค™๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซต๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซฑ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซฒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซณ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซด๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ˆ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘‰๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘†๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ–•๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘‡๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['โ˜๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘Ž๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['โœŠ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘Š๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿค›๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคœ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซถ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™Œ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['โœ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’…๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคณ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’ช๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆต๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆถ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘‚๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆป๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ƒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ถ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ง๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง’๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฆ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฑ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฐ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฑ๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฑ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฑ๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฒ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง”๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง”๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง”๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ต๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง“๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ด๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ณ๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ณ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ณ๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง•๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฎ๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฎ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฎ๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ท๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ท๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ท๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‚๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‚๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‚๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ต๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ต๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ต๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€โš•๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€โš•๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€โš•๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŒพ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŒพ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŒพ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿณ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽ“', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽ“', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŽ“', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽค', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽค', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŽค', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿซ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿญ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ’ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ’ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ”ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ง', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ”ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ฌ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽจ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽจ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŽจ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš’', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿš’', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿš’', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€โœˆ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€โœˆ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€โœˆ๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš€', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿš€', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿš€', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€โš–๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€โš–๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€โš–๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฐ๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฐ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฐ๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคต๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคต๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคต๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ธ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซ…๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคด๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฅท๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆธ๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆธ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆธ๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆน๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆน๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿฆน๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคถ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽ„', 'alice', 'reaction', 'message#alice'], ['๐ŸŽ…๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง™๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง™๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง™๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง›๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง›๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง›๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงœ๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงœ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงœ๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงš๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงš๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿงš๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ผ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฐ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซ„๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿซƒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฑ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿผ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‡๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‡๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‡๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™…๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™…๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™…๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™†๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™†๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™†๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‹๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‹๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™‹๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฆ๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฆ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคฆ๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคท๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคท๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿคท๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™Ž๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™Ž๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™Ž๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ™๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‡๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‡๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’‡๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’†๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’†๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’†๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง–๐Ÿฝโ€โ™€๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง–๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง–๐Ÿฝโ€โ™‚๏ธ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ’ƒ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•บ๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ•ด๐Ÿฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ', 'alice', 'reaction', 'message#alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝ', 'alice', 'reaction', 'message#alice'], ], [ ['๐Ÿ˜€', 'alice'], ['๐Ÿ˜ƒ', 'alice'], ['๐Ÿ˜„', 'alice'], ['๐Ÿ˜', 'alice'], ['๐Ÿ˜†', 'alice'], ['๐Ÿ˜…', 'alice'], ['๐Ÿ˜‚', 'alice'], ['๐Ÿคฃ', 'alice'], ['๐Ÿฅฒ', 'alice'], ['๐Ÿฅน', 'alice'], ['โ˜บ๏ธ', 'alice'], ['๐Ÿ˜Š', 'alice'], ['๐Ÿ˜‡', 'alice'], ['๐Ÿ™‚', 'alice'], ['๐Ÿ™ƒ', 'alice'], ['๐Ÿ˜‰', 'alice'], ['๐Ÿ˜Œ', 'alice'], ['๐Ÿ˜', 'alice'], ['๐Ÿฅฐ', 'alice'], ['๐Ÿ˜˜', 'alice'], ['๐Ÿ˜—', 'alice'], ['๐Ÿ˜™', 'alice'], ['๐Ÿ˜š', 'alice'], ['๐Ÿ˜‹', 'alice'], ['๐Ÿ˜›', 'alice'], ['๐Ÿ˜', 'alice'], ['๐Ÿ˜œ', 'alice'], ['๐Ÿคช', 'alice'], ['๐Ÿคจ', 'alice'], ['๐Ÿง', 'alice'], ['๐Ÿค“', 'alice'], ['๐Ÿ˜Ž', 'alice'], ['๐Ÿฅธ', 'alice'], ['๐Ÿคฉ', 'alice'], ['๐Ÿฅณ', 'alice'], ['๐Ÿ˜', 'alice'], ['๐Ÿ˜’', 'alice'], ['๐Ÿ˜ž', 'alice'], ['๐Ÿ˜”', 'alice'], ['๐Ÿ˜Ÿ', 'alice'], ['๐Ÿ˜•', 'alice'], ['๐Ÿ™', 'alice'], ['โ˜น๏ธ', 'alice'], ['๐Ÿ˜ฃ', 'alice'], ['๐Ÿ˜–', 'alice'], ['๐Ÿ˜ซ', 'alice'], ['๐Ÿ˜ฉ', 'alice'], ['๐Ÿฅบ', 'alice'], ['๐Ÿ˜ข', 'alice'], ['๐Ÿ˜ญ', 'alice'], ['๐Ÿ˜ฎโ€๐Ÿ’จ', 'alice'], ['๐Ÿ˜ค', 'alice'], ['๐Ÿ˜ ', 'alice'], ['๐Ÿ˜ก', 'alice'], ['๐Ÿคฌ', 'alice'], ['๐Ÿคฏ', 'alice'], ['๐Ÿ˜ณ', 'alice'], ['๐Ÿฅต', 'alice'], ['๐Ÿฅถ', 'alice'], ['๐Ÿ˜ฑ', 'alice'], ['๐Ÿ˜จ', 'alice'], ['๐Ÿ˜ฐ', 'alice'], ['๐Ÿ˜ฅ', 'alice'], ['๐Ÿ˜“', 'alice'], ['๐Ÿซฃ', 'alice'], ['๐Ÿค—', 'alice'], ['๐Ÿซก', 'alice'], ['๐Ÿค”', 'alice'], ['๐Ÿซข', 'alice'], ['๐Ÿคญ', 'alice'], ['๐Ÿคซ', 'alice'], ['๐Ÿคฅ', 'alice'], ['๐Ÿ˜ถ', 'alice'], ['๐Ÿ˜ถโ€๐ŸŒซ๏ธ', 'alice'], ['๐Ÿ˜', 'alice'], ['๐Ÿ˜‘', 'alice'], ['๐Ÿ˜ฌ', 'alice'], ['๐Ÿซ ', 'alice'], ['๐Ÿ™„', 'alice'], ['๐Ÿ˜ฏ', 'alice'], ['๐Ÿ˜ฆ', 'alice'], ['๐Ÿ˜ง', 'alice'], ['๐Ÿ˜ฎ', 'alice'], ['๐Ÿ˜ฒ', 'alice'], ['๐Ÿฅฑ', 'alice'], ['๐Ÿ˜ด', 'alice'], ['๐Ÿคค', 'alice'], ['๐Ÿ˜ช', 'alice'], ['๐Ÿ˜ต', 'alice'], ['๐Ÿ˜ตโ€๐Ÿ’ซ', 'alice'], ['๐Ÿซฅ', 'alice'], ['๐Ÿค', 'alice'], ['๐Ÿฅด', 'alice'], ['๐Ÿคข', 'alice'], ['๐Ÿคฎ', 'alice'], ['๐Ÿคง', 'alice'], ['๐Ÿ˜ท', 'alice'], ['๐Ÿค’', 'alice'], ['๐Ÿค•', 'alice'], ['๐Ÿค‘', 'alice'], ['๐Ÿค ', 'alice'], ['๐Ÿ˜ˆ', 'alice'], ['๐Ÿ‘ฟ', 'alice'], ['๐Ÿ‘น', 'alice'], ['๐Ÿ‘บ', 'alice'], ['๐Ÿคก', 'alice'], ['๐Ÿ’ฉ', 'alice'], ['๐Ÿ‘ป', 'alice'], ['๐Ÿ’€', 'alice'], ['โ˜ ๏ธ', 'alice'], ['๐Ÿ‘ฝ', 'alice'], ['๐Ÿ‘พ', 'alice'], ['๐Ÿค–', 'alice'], ['๐ŸŽƒ', 'alice'], ['๐Ÿ˜บ', 'alice'], ['๐Ÿ˜ธ', 'alice'], ['๐Ÿ˜น', 'alice'], ['๐Ÿ˜ป', 'alice'], ['๐Ÿ˜ผ', 'alice'], ['๐Ÿ˜ฝ', 'alice'], ['๐Ÿ™€', 'alice'], ['๐Ÿ˜ฟ', 'alice'], ['๐Ÿ˜พ', 'alice'], ['๐Ÿ‘ถ', 'alice'], ['๐Ÿ‘ง', 'alice'], ['๐Ÿง’', 'alice'], ['๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘ฉ', 'alice'], ['๐Ÿง‘', 'alice'], ['๐Ÿ‘จ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฑ', 'alice'], ['๐Ÿง‘โ€๐Ÿฆฑ', 'alice'], ['๐Ÿ‘จโ€๐Ÿฆฑ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฐ', 'alice'], ['๐Ÿง‘โ€๐Ÿฆฐ', 'alice'], ['๐Ÿ‘จโ€๐Ÿฆฐ', 'alice'], ['๐Ÿ‘ฑโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ฑ', 'alice'], ['๐Ÿ‘ฑโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿฆณ', 'alice'], ['๐Ÿง‘โ€๐Ÿฆณ', 'alice'], ['๐Ÿ‘จโ€๐Ÿฆณ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฒ', 'alice'], ['๐Ÿง‘โ€๐Ÿฆฒ', 'alice'], ['๐Ÿ‘จโ€๐Ÿฆฒ', 'alice'], ['๐Ÿง”โ€โ™€๏ธ', 'alice'], ['๐Ÿง”', 'alice'], ['๐Ÿง”โ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ต', 'alice'], ['๐Ÿง“', 'alice'], ['๐Ÿ‘ด', 'alice'], ['๐Ÿ‘ฒ', 'alice'], ['๐Ÿ‘ณโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ณ', 'alice'], ['๐Ÿ‘ณโ€โ™‚๏ธ', 'alice'], ['๐Ÿง•', 'alice'], ['๐Ÿ‘ฎโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ฎ', 'alice'], ['๐Ÿ‘ฎโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ทโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ท', 'alice'], ['๐Ÿ‘ทโ€โ™‚๏ธ', 'alice'], ['๐Ÿ’‚โ€โ™€๏ธ', 'alice'], ['๐Ÿ’‚', 'alice'], ['๐Ÿ’‚โ€โ™‚๏ธ', 'alice'], ['๐Ÿ•ต๏ธโ€โ™€๏ธ', 'alice'], ['๐Ÿ•ต๏ธ', 'alice'], ['๐Ÿ•ต๏ธโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ฉโ€โš•๏ธ', 'alice'], ['๐Ÿง‘โ€โš•๏ธ', 'alice'], ['๐Ÿ‘จโ€โš•๏ธ', 'alice'], ['๐Ÿ‘ฉโ€๐ŸŒพ', 'alice'], ['๐Ÿง‘โ€๐ŸŒพ', 'alice'], ['๐Ÿ‘จโ€๐ŸŒพ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿณ', 'alice'], ['๐Ÿง‘โ€๐Ÿณ', 'alice'], ['๐Ÿ‘จโ€๐Ÿณ', 'alice'], ['๐Ÿ‘ฉโ€๐ŸŽ“', 'alice'], ['๐Ÿง‘โ€๐ŸŽ“', 'alice'], ['๐Ÿ‘จโ€๐ŸŽ“', 'alice'], ['๐Ÿ‘ฉโ€๐ŸŽค', 'alice'], ['๐Ÿง‘โ€๐ŸŽค', 'alice'], ['๐Ÿ‘จโ€๐ŸŽค', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿซ', 'alice'], ['๐Ÿง‘โ€๐Ÿซ', 'alice'], ['๐Ÿ‘จโ€๐Ÿซ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿญ', 'alice'], ['๐Ÿง‘โ€๐Ÿญ', 'alice'], ['๐Ÿ‘จโ€๐Ÿญ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ’ป', 'alice'], ['๐Ÿง‘โ€๐Ÿ’ป', 'alice'], ['๐Ÿ‘จโ€๐Ÿ’ป', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ’ผ', 'alice'], ['๐Ÿง‘โ€๐Ÿ’ผ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ’ผ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ”ง', 'alice'], ['๐Ÿง‘โ€๐Ÿ”ง', 'alice'], ['๐Ÿ‘จโ€๐Ÿ”ง', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ”ฌ', 'alice'], ['๐Ÿง‘โ€๐Ÿ”ฌ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ”ฌ', 'alice'], ['๐Ÿ‘ฉโ€๐ŸŽจ', 'alice'], ['๐Ÿง‘โ€๐ŸŽจ', 'alice'], ['๐Ÿ‘จโ€๐ŸŽจ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿš’', 'alice'], ['๐Ÿง‘โ€๐Ÿš’', 'alice'], ['๐Ÿ‘จโ€๐Ÿš’', 'alice'], ['๐Ÿ‘ฉโ€โœˆ๏ธ', 'alice'], ['๐Ÿง‘โ€โœˆ๏ธ', 'alice'], ['๐Ÿ‘จโ€โœˆ๏ธ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿš€', 'alice'], ['๐Ÿง‘โ€๐Ÿš€', 'alice'], ['๐Ÿ‘จโ€๐Ÿš€', 'alice'], ['๐Ÿ‘ฉโ€โš–๏ธ', 'alice'], ['๐Ÿง‘โ€โš–๏ธ', 'alice'], ['๐Ÿ‘จโ€โš–๏ธ', 'alice'], ['๐Ÿ‘ฐโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ฐ', 'alice'], ['๐Ÿ‘ฐโ€โ™‚๏ธ', 'alice'], ['๐Ÿคตโ€โ™€๏ธ', 'alice'], ['๐Ÿคต', 'alice'], ['๐Ÿคตโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ธ', 'alice'], ['๐Ÿซ…', 'alice'], ['๐Ÿคด', 'alice'], ['๐Ÿฅท', 'alice'], ['๐Ÿฆธโ€โ™€๏ธ', 'alice'], ['๐Ÿฆธ', 'alice'], ['๐Ÿฆธโ€โ™‚๏ธ', 'alice'], ['๐Ÿฆนโ€โ™€๏ธ', 'alice'], ['๐Ÿฆน', 'alice'], ['๐Ÿฆนโ€โ™‚๏ธ', 'alice'], ['๐Ÿคถ', 'alice'], ['๐Ÿง‘โ€๐ŸŽ„', 'alice'], ['๐ŸŽ…', 'alice'], ['๐Ÿง™โ€โ™€๏ธ', 'alice'], ['๐Ÿง™', 'alice'], ['๐Ÿง™โ€โ™‚๏ธ', 'alice'], ['๐Ÿงโ€โ™€๏ธ', 'alice'], ['๐Ÿง', 'alice'], ['๐Ÿงโ€โ™‚๏ธ', 'alice'], ['๐Ÿง›โ€โ™€๏ธ', 'alice'], ['๐Ÿง›', 'alice'], ['๐Ÿง›โ€โ™‚๏ธ', 'alice'], ['๐ŸงŸโ€โ™€๏ธ', 'alice'], ['๐ŸงŸ', 'alice'], ['๐ŸงŸโ€โ™‚๏ธ', 'alice'], ['๐Ÿงžโ€โ™€๏ธ', 'alice'], ['๐Ÿงž', 'alice'], ['๐Ÿงžโ€โ™‚๏ธ', 'alice'], ['๐Ÿงœโ€โ™€๏ธ', 'alice'], ['๐Ÿงœ', 'alice'], ['๐Ÿงœโ€โ™‚๏ธ', 'alice'], ['๐Ÿงšโ€โ™€๏ธ', 'alice'], ['๐Ÿงš', 'alice'], ['๐Ÿงšโ€โ™‚๏ธ', 'alice'], ['๐ŸงŒ', 'alice'], ['๐Ÿ‘ผ', 'alice'], ['๐Ÿคฐ', 'alice'], ['๐Ÿซ„', 'alice'], ['๐Ÿซƒ', 'alice'], ['๐Ÿคฑ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿผ', 'alice'], ['๐Ÿง‘โ€๐Ÿผ', 'alice'], ['๐Ÿ‘จโ€๐Ÿผ', 'alice'], ['๐Ÿ™‡โ€โ™€๏ธ', 'alice'], ['๐Ÿ™‡', 'alice'], ['๐Ÿ™‡โ€โ™‚๏ธ', 'alice'], ['๐Ÿ’โ€โ™€๏ธ', 'alice'], ['๐Ÿ’', 'alice'], ['๐Ÿ’โ€โ™‚๏ธ', 'alice'], ['๐Ÿ™…โ€โ™€๏ธ', 'alice'], ['๐Ÿ™…', 'alice'], ['๐Ÿ™…โ€โ™‚๏ธ', 'alice'], ['๐Ÿ™†โ€โ™€๏ธ', 'alice'], ['๐Ÿ™†', 'alice'], ['๐Ÿ™†โ€โ™‚๏ธ', 'alice'], ['๐Ÿ™‹โ€โ™€๏ธ', 'alice'], ['๐Ÿ™‹', 'alice'], ['๐Ÿ™‹โ€โ™‚๏ธ', 'alice'], ['๐Ÿงโ€โ™€๏ธ', 'alice'], ['๐Ÿง', 'alice'], ['๐Ÿงโ€โ™‚๏ธ', 'alice'], ['๐Ÿคฆโ€โ™€๏ธ', 'alice'], ['๐Ÿคฆ', 'alice'], ['๐Ÿคฆโ€โ™‚๏ธ', 'alice'], ['๐Ÿคทโ€โ™€๏ธ', 'alice'], ['๐Ÿคท', 'alice'], ['๐Ÿคทโ€โ™‚๏ธ', 'alice'], ['๐Ÿ™Žโ€โ™€๏ธ', 'alice'], ['๐Ÿ™Ž', 'alice'], ['๐Ÿ™Žโ€โ™‚๏ธ', 'alice'], ['๐Ÿ™โ€โ™€๏ธ', 'alice'], ['๐Ÿ™', 'alice'], ['๐Ÿ™โ€โ™‚๏ธ', 'alice'], ['๐Ÿ’‡โ€โ™€๏ธ', 'alice'], ['๐Ÿ’‡', 'alice'], ['๐Ÿ’‡โ€โ™‚๏ธ', 'alice'], ['๐Ÿ’†โ€โ™€๏ธ', 'alice'], ['๐Ÿ’†', 'alice'], ['๐Ÿ’†โ€โ™‚๏ธ', 'alice'], ['๐Ÿง–โ€โ™€๏ธ', 'alice'], ['๐Ÿง–', 'alice'], ['๐Ÿง–โ€โ™‚๏ธ', 'alice'], ['๐Ÿ’…', 'alice'], ['๐Ÿคณ', 'alice'], ['๐Ÿ’ƒ', 'alice'], ['๐Ÿ•บ', 'alice'], ['๐Ÿ‘ฏโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ฏ', 'alice'], ['๐Ÿ‘ฏโ€โ™‚๏ธ', 'alice'], ['๐Ÿ•ด', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฝ', 'alice'], ['๐Ÿง‘โ€๐Ÿฆฝ', 'alice'], ['๐Ÿ‘จโ€๐Ÿฆฝ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿฆผ', 'alice'], ['๐Ÿง‘โ€๐Ÿฆผ', 'alice'], ['๐Ÿ‘จโ€๐Ÿฆผ', 'alice'], ['๐Ÿšถโ€โ™€๏ธ', 'alice'], ['๐Ÿšถ', 'alice'], ['๐Ÿšถโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿฆฏ', 'alice'], ['๐Ÿง‘โ€๐Ÿฆฏ', 'alice'], ['๐Ÿ‘จโ€๐Ÿฆฏ', 'alice'], ['๐ŸงŽโ€โ™€๏ธ', 'alice'], ['๐ŸงŽ', 'alice'], ['๐ŸงŽโ€โ™‚๏ธ', 'alice'], ['๐Ÿƒโ€โ™€๏ธ', 'alice'], ['๐Ÿƒ', 'alice'], ['๐Ÿƒโ€โ™‚๏ธ', 'alice'], ['๐Ÿงโ€โ™€๏ธ', 'alice'], ['๐Ÿง', 'alice'], ['๐Ÿงโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ญ', 'alice'], ['๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘', 'alice'], ['๐Ÿ‘ฌ', 'alice'], ['๐Ÿ‘ซ', 'alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘ฉ', 'alice'], ['๐Ÿ’‘', 'alice'], ['๐Ÿ‘จโ€โค๏ธโ€๐Ÿ‘จ', 'alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ‘จ', 'alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘ฉ', 'alice'], ['๐Ÿ’', 'alice'], ['๐Ÿ‘จโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ', 'alice'], ['๐Ÿ‘ฉโ€โค๏ธโ€๐Ÿ’‹โ€๐Ÿ‘จ', 'alice'], ['๐Ÿ‘ช', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ', 'alice'], ['๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง', 'alice'], ['๐Ÿ—ฃ', 'alice'], ['๐Ÿ‘ค', 'alice'], ['๐Ÿ‘ฅ', 'alice'], ['๐Ÿซ‚', 'alice'], ['๐Ÿ‘‹๐Ÿฝ', 'alice'], ['๐Ÿคš๐Ÿฝ', 'alice'], ['๐Ÿ–๐Ÿฝ', 'alice'], ['โœ‹๐Ÿฝ', 'alice'], ['๐Ÿ––๐Ÿฝ', 'alice'], ['๐Ÿ‘Œ๐Ÿฝ', 'alice'], ['๐ŸคŒ๐Ÿฝ', 'alice'], ['๐Ÿค๐Ÿฝ', 'alice'], ['โœŒ๐Ÿฝ', 'alice'], ['๐Ÿคž๐Ÿฝ', 'alice'], ['๐Ÿซฐ๐Ÿฝ', 'alice'], ['๐ŸคŸ๐Ÿฝ', 'alice'], ['๐Ÿค˜๐Ÿฝ', 'alice'], ['๐Ÿค™๐Ÿฝ', 'alice'], ['๐Ÿซต๐Ÿฝ', 'alice'], ['๐Ÿซฑ๐Ÿฝ', 'alice'], ['๐Ÿซฒ๐Ÿฝ', 'alice'], ['๐Ÿซณ๐Ÿฝ', 'alice'], ['๐Ÿซด๐Ÿฝ', 'alice'], ['๐Ÿ‘ˆ๐Ÿฝ', 'alice'], ['๐Ÿ‘‰๐Ÿฝ', 'alice'], ['๐Ÿ‘†๐Ÿฝ', 'alice'], ['๐Ÿ–•๐Ÿฝ', 'alice'], ['๐Ÿ‘‡๐Ÿฝ', 'alice'], ['โ˜๐Ÿฝ', 'alice'], ['๐Ÿ‘๐Ÿฝ', 'alice'], ['๐Ÿ‘Ž๐Ÿฝ', 'alice'], ['โœŠ๐Ÿฝ', 'alice'], ['๐Ÿ‘Š๐Ÿฝ', 'alice'], ['๐Ÿค›๐Ÿฝ', 'alice'], ['๐Ÿคœ๐Ÿฝ', 'alice'], ['๐Ÿ‘๐Ÿฝ', 'alice'], ['๐Ÿซถ๐Ÿฝ', 'alice'], ['๐Ÿ™Œ๐Ÿฝ', 'alice'], ['๐Ÿ‘๐Ÿฝ', 'alice'], ['๐Ÿคฒ๐Ÿฝ', 'alice'], ['๐Ÿ™๐Ÿฝ', 'alice'], ['โœ๐Ÿฝ', 'alice'], ['๐Ÿ’…๐Ÿฝ', 'alice'], ['๐Ÿคณ๐Ÿฝ', 'alice'], ['๐Ÿ’ช๐Ÿฝ', 'alice'], ['๐Ÿฆต๐Ÿฝ', 'alice'], ['๐Ÿฆถ๐Ÿฝ', 'alice'], ['๐Ÿ‘‚๐Ÿฝ', 'alice'], ['๐Ÿฆป๐Ÿฝ', 'alice'], ['๐Ÿ‘ƒ๐Ÿฝ', 'alice'], ['๐Ÿ‘ถ๐Ÿฝ', 'alice'], ['๐Ÿ‘ง๐Ÿฝ', 'alice'], ['๐Ÿง’๐Ÿฝ', 'alice'], ['๐Ÿ‘ฆ๐Ÿฝ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝ', 'alice'], ['๐Ÿง‘๐Ÿฝ', 'alice'], ['๐Ÿ‘จ๐Ÿฝ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฑ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฑ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฑ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฐ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฐ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฐ', 'alice'], ['๐Ÿ‘ฑ๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ฑ๐Ÿฝ', 'alice'], ['๐Ÿ‘ฑ๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆณ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆณ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆณ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฒ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฒ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฒ', 'alice'], ['๐Ÿง”๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿง”๐Ÿฝ', 'alice'], ['๐Ÿง”๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ต๐Ÿฝ', 'alice'], ['๐Ÿง“๐Ÿฝ', 'alice'], ['๐Ÿ‘ด๐Ÿฝ', 'alice'], ['๐Ÿ‘ฒ๐Ÿฝ', 'alice'], ['๐Ÿ‘ณ๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ณ๐Ÿฝ', 'alice'], ['๐Ÿ‘ณ๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿง•๐Ÿฝ', 'alice'], ['๐Ÿ‘ฎ๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ฎ๐Ÿฝ', 'alice'], ['๐Ÿ‘ฎ๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ท๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ท๐Ÿฝ', 'alice'], ['๐Ÿ‘ท๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ’‚๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ’‚๐Ÿฝ', 'alice'], ['๐Ÿ’‚๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ•ต๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ•ต๐Ÿฝ', 'alice'], ['๐Ÿ•ต๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€โš•๏ธ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€โš•๏ธ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€โš•๏ธ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŒพ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŒพ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŒพ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿณ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿณ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿณ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽ“', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽ“', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŽ“', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽค', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽค', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŽค', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿซ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿซ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿซ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿญ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿญ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ’ป', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ผ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ’ผ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ผ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ง', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ”ง', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ง', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ฌ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿ”ฌ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ฌ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽจ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽจ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐ŸŽจ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš’', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿš’', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿš’', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€โœˆ๏ธ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€โœˆ๏ธ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€โœˆ๏ธ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš€', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿš€', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿš€', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€โš–๏ธ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€โš–๏ธ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€โš–๏ธ', 'alice'], ['๐Ÿ‘ฐ๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ‘ฐ๐Ÿฝ', 'alice'], ['๐Ÿ‘ฐ๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿคต๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿคต๐Ÿฝ', 'alice'], ['๐Ÿคต๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ธ๐Ÿฝ', 'alice'], ['๐Ÿซ…๐Ÿฝ', 'alice'], ['๐Ÿคด๐Ÿฝ', 'alice'], ['๐Ÿฅท๐Ÿฝ', 'alice'], ['๐Ÿฆธ๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿฆธ๐Ÿฝ', 'alice'], ['๐Ÿฆธ๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿฆน๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿฆน๐Ÿฝ', 'alice'], ['๐Ÿฆน๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿคถ๐Ÿฝ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐ŸŽ„', 'alice'], ['๐ŸŽ…๐Ÿฝ', 'alice'], ['๐Ÿง™๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿง™๐Ÿฝ', 'alice'], ['๐Ÿง™๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿง๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿง๐Ÿฝ', 'alice'], ['๐Ÿง๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿง›๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿง›๐Ÿฝ', 'alice'], ['๐Ÿง›๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿงœ๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿงœ๐Ÿฝ', 'alice'], ['๐Ÿงœ๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿงš๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿงš๐Ÿฝ', 'alice'], ['๐Ÿงš๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ‘ผ๐Ÿฝ', 'alice'], ['๐Ÿคฐ๐Ÿฝ', 'alice'], ['๐Ÿซ„๐Ÿฝ', 'alice'], ['๐Ÿซƒ๐Ÿฝ', 'alice'], ['๐Ÿคฑ๐Ÿฝ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿผ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿผ', 'alice'], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿผ', 'alice'], ['๐Ÿ™‡๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ™‡๐Ÿฝ', 'alice'], ['๐Ÿ™‡๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ’๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ’๐Ÿฝ', 'alice'], ['๐Ÿ’๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ™…๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ™…๐Ÿฝ', 'alice'], ['๐Ÿ™…๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ™†๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ™†๐Ÿฝ', 'alice'], ['๐Ÿ™†๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ™‹๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ™‹๐Ÿฝ', 'alice'], ['๐Ÿ™‹๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿง๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿง๐Ÿฝ', 'alice'], ['๐Ÿง๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿคฆ๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿคฆ๐Ÿฝ', 'alice'], ['๐Ÿคฆ๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿคท๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿคท๐Ÿฝ', 'alice'], ['๐Ÿคท๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ™Ž๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ™Ž๐Ÿฝ', 'alice'], ['๐Ÿ™Ž๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ™๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ™๐Ÿฝ', 'alice'], ['๐Ÿ™๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ’‡๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ’‡๐Ÿฝ', 'alice'], ['๐Ÿ’‡๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ’†๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿ’†๐Ÿฝ', 'alice'], ['๐Ÿ’†๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿง–๐Ÿฝโ€โ™€๏ธ', 'alice'], ['๐Ÿง–๐Ÿฝ', 'alice'], ['๐Ÿง–๐Ÿฝโ€โ™‚๏ธ', 'alice'], ['๐Ÿ’ƒ๐Ÿฝ', 'alice'], ['๐Ÿ•บ๐Ÿฝ', 'alice'], ['๐Ÿ•ด๐Ÿฝ', 'alice'], ['๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ', 'alice'], ['๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝ', 'alice'], ], ], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('providerTestRetrieveAllReactionsWithSpecificReaction')] public function testRetrieveAllReactionsWithSpecificReaction(array $comments, string $reaction, array $expected): void { $this->skipIfNotSupport4ByteUTF(); $manager = $this->getManager(); $processedComments = $this->proccessComments($comments); $comment = reset($processedComments); $all = $manager->retrieveAllReactionsWithSpecificReaction((int)$comment->getId(), $reaction); $actual = array_map(static function (IComment $row): array { return [ $row->getActorId(), $row->getMessage(), ]; }, $all); $this->assertEqualsCanonicalizing($expected, $actual); } public static function providerTestRetrieveAllReactionsWithSpecificReaction(): array { return [ [ [ ['message', 'alice', 'comment', null], ], '๐Ÿ‘Ž', [], ], [ [ ['message', 'alice', 'comment', null], ['๐Ÿ‘', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘', 'frank', 'reaction', 'message#alice'], ], '๐Ÿ‘', [ ['๐Ÿ‘', 'alice'], ['๐Ÿ‘', 'frank'], ], ], [ [ ['message', 'alice', 'comment', null], ['๐Ÿ‘', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘Ž', 'alice', 'reaction', 'message#alice'], ['๐Ÿ‘', 'frank', 'reaction', 'message#alice'], ], '๐Ÿ‘Ž', [ ['๐Ÿ‘Ž', 'alice'], ], ], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('providerTestGetReactionComment')] public function testGetReactionComment(array $comments, array $expected, bool $notFound): void { $this->skipIfNotSupport4ByteUTF(); $manager = $this->getManager(); $processedComments = $this->proccessComments($comments); $keys = ['message', 'actorId', 'verb', 'parent']; $expected = array_combine($keys, $expected); if ($notFound) { $this->expectException(NotFoundException::class); } $comment = $processedComments[$expected['message'] . '#' . $expected['actorId']]; $actual = $manager->getReactionComment((int)$comment->getParentId(), $comment->getActorType(), $comment->getActorId(), $comment->getMessage()); if (!$notFound) { $this->assertEquals($expected['message'], $actual->getMessage()); $this->assertEquals($expected['actorId'], $actual->getActorId()); $this->assertEquals($expected['verb'], $actual->getVerb()); $this->assertEquals($processedComments[$expected['parent']]->getId(), $actual->getParentId()); } } public static function providerTestGetReactionComment(): array { return [ [ [ ['message', 'Matthew', 'comment', null], ['๐Ÿ‘', 'Matthew', 'reaction', 'message#Matthew'], ['๐Ÿ‘', 'Mark', 'reaction', 'message#Matthew'], ['๐Ÿ‘', 'Luke', 'reaction', 'message#Matthew'], ['๐Ÿ‘', 'John', 'reaction', 'message#Matthew'], ], ['๐Ÿ‘', 'Matthew', 'reaction', 'message#Matthew'], false, ], [ [ ['message', 'Matthew', 'comment', null], ['๐Ÿ‘', 'Matthew', 'reaction', 'message#Matthew'], ['๐Ÿ‘', 'Mark', 'reaction', 'message#Matthew'], ['๐Ÿ‘', 'Luke', 'reaction', 'message#Matthew'], ['๐Ÿ‘', 'John', 'reaction', 'message#Matthew'], ], ['๐Ÿ‘', 'Mark', 'reaction', 'message#Matthew'], false, ], [ [ ['message', 'Matthew', 'comment', null], ['๐Ÿ‘Ž', 'Matthew', 'reaction', 'message#Matthew'], ], ['๐Ÿ‘Ž', 'Matthew', 'reaction', 'message#Matthew'], false, ], [ [ ['message', 'Matthew', 'comment', null], ['๐Ÿ‘Ž', 'Matthew', 'reaction', 'message#Matthew'], ['๐Ÿ‘Ž', 'Matthew', 'reaction_deleted', 'message#Matthew'], ], ['๐Ÿ‘Ž', 'Matthew', 'reaction', 'message#Matthew'], true, ], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('providerTestReactionMessageSize')] public function testReactionMessageSize(string $reactionString, bool $valid): void { $this->skipIfNotSupport4ByteUTF(); if (!$valid) { $this->expectException(\UnexpectedValueException::class); } $manager = $this->getManager(); $comment = new Comment(); $comment->setMessage($reactionString) ->setVerb('reaction') ->setActor('users', 'alice') ->setObject('files', 'file64'); $status = $manager->save($comment); $this->assertTrue($status); } public static function providerTestReactionMessageSize(): array { return [ ['a', false], ['1', false], ['๐Ÿ‘', true], ['๐Ÿ‘๐Ÿ‘', false], ['๐Ÿ‘๐Ÿฝ', true], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป', true], ['๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป๐Ÿ‘', false], ]; } #[\PHPUnit\Framework\Attributes\DataProvider('providerTestReactionsSummarizeOrdered')] public function testReactionsSummarizeOrdered(array $comments, array $expected, bool $isFullMatch): void { $this->skipIfNotSupport4ByteUTF(); $manager = $this->getManager(); $processedComments = $this->proccessComments($comments); $comment = end($processedComments); $actual = $manager->get($comment->getParentId()); if ($isFullMatch) { $this->assertSame($expected, $actual->getReactions()); } else { $subResult = array_slice($actual->getReactions(), 0, count($expected)); $this->assertSame($expected, $subResult); } } public static function providerTestReactionsSummarizeOrdered(): array { return [ [ [ ['message', 'alice', 'comment', null], ['๐Ÿ‘', 'alice', 'reaction', 'message#alice'], ], ['๐Ÿ‘' => 1], true, ], [ [ ['message', 'alice', 'comment', null], ['๐Ÿ‘Ž', 'John', 'reaction', 'message#alice'], ['๐Ÿ’ผ', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ“‹', 'Luke', 'reaction', 'message#alice'], ['๐Ÿš€', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ–ค', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ˜œ', 'Luke', 'reaction', 'message#alice'], ['๐ŸŒ–', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ’–', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ“ฅ', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ‰', 'Luke', 'reaction', 'message#alice'], ['โ˜•', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ„', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ•', 'Luke', 'reaction', 'message#alice'], ['๐Ÿˆ', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ›‚', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ•ธ', 'Luke', 'reaction', 'message#alice'], ['๐Ÿฐ', 'Luke', 'reaction', 'message#alice'], ['โš™๏ธ', 'Luke', 'reaction', 'message#alice'], ['๐Ÿšจ', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ‘ฅ', 'Luke', 'reaction', 'message#alice'], ['๐Ÿ‘', 'Paul', 'reaction', 'message#alice'], ['๐Ÿ‘', 'Peter', 'reaction', 'message#alice'], ['๐Ÿ’œ', 'Matthew', 'reaction', 'message#alice'], ['๐Ÿ’œ', 'Mark', 'reaction', 'message#alice'], ['๐Ÿ’œ', 'Luke', 'reaction', 'message#alice'], ], [ '๐Ÿ’œ' => 3, '๐Ÿ‘' => 2, ], false, ], ]; } }